/* Schedule Review — design system.
   Tokens, typography and components taken from the design handoff.

   Two rules carry most of the look:
     1. IBM Plex Mono for EVERY number, ID, date and status chip; IBM Plex Sans
        for prose. The split is load-bearing — it is what makes the columns align
        and the values scannable. Never set a numeric value in the sans face.
     2. No shadows in the app chrome, 1px `line` borders everywhere, and exactly
        one arrival transition. Elevation exists only on the export popover, the
        publish modal, and the active mode-switch segment. */

/* Accessibility note on the greys.
   The handoff's `ink-4` (#8A96A2) measured 3.02:1 on white and 2.84:1 on the
   table-header fill — below the 4.5:1 WCAG 2.2 AA floor for normal text, and it
   carries all the meta, kicker and note text at 9.5–10.5px. Section 508 adopts
   WCAG AA and this tool is government-facing, so the greys below are darkened to
   the minimum that clears the threshold, along the same hue. `ink-5` keeps its
   original lightness because what it colours — disabled controls and decorative
   glyphs — is explicitly exempt from the contrast requirement; the two jobs it
   was doing that are NOT exempt (placeholder text, control boundaries) moved to
   their own tokens. Verified ratios are in the comments. */
:root {
  /* F6: the colour of a value the AI proposed and no person has confirmed,
     on the document's paper. The instrument's copy is in theme.css. */
  --ai: #1B4FD8; --ai-tint: #E8EEFB; --ai-line: #C9D6F5;
  /* ink — UI-refresh palette (design handoff, warm paper) */
  --ink: #14181D;                /* 17.4:1 on white */
  --ink-2: #3D434B;              /*  9.4:1 — body-2 */
  --ink-3: #5F6067;              /*  5.9:1 — muted */
  --ink-4: #6C6D74;              /*  4.9:1 — mono labels */
  --ink-5: #B3ADA2;              /* decorative + disabled only — exempt */
  --ink-placeholder: #6C6D74;    /* placeholder is real text */
  --control-line: #8A8880;       /*  3.0:1 min — WCAG 1.4.11 non-text contrast */
  --dash: #6C6D74;               /* "no data" carries meaning */
  --faint: #8A8880;              /* 3.4:1 — large mono footers only */
  /* lines & surfaces — warm rules on paper */
  --line: #DED9D0;
  --line-2: #EDE9E2;
  --line-3: #F2EFEA;
  --paper: #FBFAF8;              /* page background; cards stay white */
  --surface: #FFFFFF;
  --surface-2: #F6F4F0;
  --surface-3: #F7F5F1;
  --surface-4: #F9F7F3;
  --input-line: #D8D3CA;
  /* accent — primary actions are ink-black; selection is warm */
  --accent: #14181D;
  --accent-hover: #2E3238;
  --accent-tint: #EFEBE3;
  --accent-tint-line: #D8D3CA;
  --accent-ink: #14181D;
  --link: #1B4FD8;
  --focus: #1B4FD8;
  /* the handoff's editorial accents */
  --brand-accent: #B4531A;       /* burnt orange: active nav, TASK MODE */
  --kicker-fg: #8A6A3C;          /* mono eyebrow labels on paper */
  /* Primavera P6 standard colours (N21).
     Her exact values: "Those are the colors that P6 uses all the time and it's
     standardized." They are used the way P6 uses them — as BAR FILLS and CELL
     HIGHLIGHTS, with dark text on top.

     They are deliberately not used for coloured text. Measured against white,
     green 0,255,0 is 1.37:1 and yellow 255,255,0 is 1.07:1; as text those are
     invisible, and a gain rendered in P6 green would be unreadable to
     everyone, not only to readers with low vision. Text keeps the accessible
     status colours below, which carry the same meanings at legible contrast.
     Against these fills, near-black text measures 13:1 and 17:1. */
  --p6-red:    rgb(235, 0, 0);
  --p6-blue:   rgb(0, 0, 255);
  --p6-green:  rgb(0, 255, 0);
  --p6-yellow: rgb(255, 255, 0);
  /* Ink to place on any P6 fill. */
  --p6-on-fill: #12161B;

  /* status — severity fg + dot pairs from the handoff */
  --danger: #9A2C23;
  --danger-dot: #C2372D;
  --danger-tint: #FBF1EF;
  --danger-tint-2: #FDF8F7;
  --danger-line: #F0D9D5;
  --danger-line-2: #E4C9C4;
  --warn: #7A5410;
  --warn-dot: #B4781A;
  --warn-tint: #FDF6E9;
  --warn-line: #EFE1C2;
  --warn-ink: #4A3A14;
  --warn-ink-2: #6B5B33;
  --warn-ink-3: #5B3E10;
  --ok: #1B5E42;
  --ok-dot: #1E7A54;
  --ok-tint: #EFF6F1;
  --ok-line: #CFE4D6;
  --neutral: #4A5563;
  --neutral-dot: #98A2B3;
  /* sidebar */
  --sidebar-bg: #14181D;
  --sidebar-bg-2: #23272C;
  --sidebar-line: #262A2F;
  --sidebar-line-2: #33373C;
  --sidebar-text: #E9E7E2;
  --sidebar-text-2: #BAB8B1;
  --sidebar-text-3: #918F88;   /* on the project card */
  --sidebar-label: #918F88;
  --sidebar-dot: #5A5C60;
  --sidebar-dot-on: #fff;

  --sans: "IBM Plex Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  --mono: "IBM Plex Mono", ui-monospace, "SF Mono", Menlo, monospace;
}

* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; height: 100%; }
body {
  font-family: var(--sans);
  color: var(--ink);
  background: var(--paper);
  font-size: 12.5px;
  -webkit-font-smoothing: antialiased;
}
[hidden] { display: none !important; }
h1, h2, h3 { margin: 0; font-weight: 600; }
button { font-family: inherit; cursor: pointer; }
.mono, .num { font-family: var(--mono); font-variant-numeric: tabular-nums; }

/* The one animation. Do not add others. */
/* The arrival transition lives in core/shell.js now, not here. As a class it
   could not restart -- #screen already carried it after the first navigation,
   so re-assigning the same string animated nothing and every click was an
   instant hard cut. Script can always start an animation; a class cannot. */

/* Focus rings were not in the design; added deliberately — this is a
   government-facing tool and keyboard access is a real requirement. */
:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; border-radius: 2px; }

/* F6: the AI colour rule. A value the AI proposed and no person has yet
   confirmed carries `.ai-val`: the AI colour, and a small "AI" mark on
   hover. Confirmed or edited, the class goes and the value is ink. */
.ai-val { color: var(--ai); position: relative; }
select.ai-val, input.ai-val, button.ai-val { color: var(--ai); border-color: var(--ai-line); }
.ai-val::after {
  content: "AI"; position: absolute; top: -.75em; right: -1.4em; font-family: var(--mono, monospace);
  font-size: 8.5px; font-weight: 600; letter-spacing: .06em; color: var(--ai); background: var(--ai-tint);
  border: 1px solid var(--ai-line); border-radius: 3px; padding: 0 3px; opacity: 0; pointer-events: none;
  transition: opacity 120ms ease;
}
.ai-val:hover::after { opacity: 1; }
p.ai-val::after, div.ai-val::after, label.ai-val::after { right: 0; top: -.2em; }
select.ai-val::after, button.ai-val::after, input.ai-val::after { display: none; }
.ai-placeholder::placeholder { color: var(--ai); opacity: .85; }
.ai-legend { font-size: 11px; color: var(--ink-3); }
.ai-legend::before { content: ""; display: inline-block; width: 9px; height: 9px; border-radius: 2px; background: var(--ai); margin-right: 7px; vertical-align: -1px; }

/* ============================== shell ============================== */
.app { display: flex; height: 100vh; overflow: hidden; }

.sidebar {
  width: 232px; flex: none; background: var(--sidebar-bg);
  display: flex; flex-direction: column; overflow-y: auto;
}
.sb-org {
  height: 54px; flex: none; display: flex; align-items: center; gap: 9px;
  padding: 0 12px; border-bottom: 1px solid var(--sidebar-line);
}
.sb-mark {
  width: 26px; height: 26px; flex: none; border-radius: 6px; background: var(--brand-accent);
  color: #fff; font-family: var(--mono); font-weight: 600; font-size: 11px;
  display: grid; place-items: center;
}
.sb-org-name { font-weight: 600; font-size: 12px; color: #fff; line-height: 1.2; }
.sb-org-kicker {
  font-family: var(--mono); font-size: 9.5px; letter-spacing: .04em;
  color: var(--sidebar-label); text-transform: uppercase;
}
.sb-group { padding: 12px 10px 4px; }
.sb-kicker {
  font-weight: 500; font-size: 9.5px; letter-spacing: .11em; text-transform: uppercase;
  color: var(--sidebar-label); padding: 0 10px 7px;
}
.sb-item {
  display: flex; align-items: center; gap: 9px; width: 100%;
  padding: 8px 11px; border: 0; background: none; border-radius: 7px;
  color: var(--sidebar-text-2); font-size: 13px; line-height: 1.2; text-align: left;
}
.sb-item .dot { width: 5px; height: 5px; flex: none; background: var(--sidebar-dot); }
.sb-item .sb-count {
  margin-left: auto; font-family: var(--mono); font-size: 10px; color: var(--sidebar-text-3);
}
.sb-item:hover { background: rgba(255,255,255,.07); color: #fff; }
.sb-item.on { background: var(--brand-accent); color: #fff; font-weight: 600; }
.sb-item[aria-current="page"] { cursor: default; }
.sb-item.on .dot { background: var(--sidebar-dot-on); }
.sb-item.on .sb-count { color: #fff; }
.sb-item .pill {
  margin-left: auto; background: var(--brand-accent); color: #fff; border-radius: 4px;
  font-family: var(--mono); font-size: 9.5px; padding: 1px 5px;
}
.sb-item.on .pill { background: rgba(255,255,255,.22); }
.sb-footer {
  margin-top: auto; padding: 12px; border-top: 1px solid var(--sidebar-line);
}
.sb-footer .k {
  font-weight: 500; font-size: 9.5px; letter-spacing: .11em; text-transform: uppercase;
  color: var(--sidebar-label); margin-bottom: 4px;
}
.sb-footer .v { font-family: var(--mono); font-size: 11px; color: var(--sidebar-text); }
/* which build you are looking at */
.sb-build {
  margin-top: 8px; font-family: var(--mono); font-size: 9.5px;
  color: var(--sidebar-text-3); letter-spacing: .02em;
}
/* the server is serving older engine code than the files on disk */
.stalebar {
  flex: none; display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap;
  padding: 9px 20px; background: var(--danger-tint); border-bottom: 2px solid var(--danger);
  color: var(--danger); font-size: 11.5px; line-height: 1.5;
}
.stalebar .k { font-family: var(--mono); font-weight: 600; font-size: 9.5px; letter-spacing: .08em; flex: none; }
.stalebar .f { font-family: var(--mono); font-size: 10px; color: var(--warn-ink-3); }

.main { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.topbar {
  height: 54px; flex: none; display: flex; align-items: center; gap: 12px;
  padding: 0 20px; background: var(--surface); border-bottom: 1px solid var(--line);
}
.crumbs { display: flex; align-items: center; gap: 9px; font-size: 12px; min-width: 0; }
.crumb {
  border: 0; background: none; padding: 0; font-size: 12px; color: var(--ink-3);
  max-width: 280px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.crumb:hover { color: var(--accent); }
.crumb.now { font-weight: 500; color: var(--ink); cursor: default; }
/* Presentational, but an auditor with a colour picker will still flag it —
   ink-4 passes and stays lighter than the ink-3 crumb labels, so the visual
   hierarchy is unchanged. */
.crumb-sep { color: var(--ink-4); }
.topbar-right { margin-left: auto; display: flex; align-items: center; gap: 12px; }
.topbar-div { width: 1px; height: 24px; background: var(--line); }
.usermenu {
  display: flex; align-items: center; gap: 8px; padding: 4px 8px 4px 4px;
  border: 1px solid transparent; border-radius: 3px; background: none;
}
.usermenu:hover { border-color: var(--line); background: var(--surface-2); }
.avatar {
  width: 24px; height: 24px; border-radius: 2px; background: var(--line-2);
  border: 1px solid var(--line); font-family: var(--mono); font-weight: 600;
  font-size: 10px; display: grid; place-items: center; color: var(--ink-2);
}
.user-name { font-weight: 500; font-size: 11px; line-height: 1.2; }
.user-role {
  font-family: var(--mono); font-size: 9px; letter-spacing: .04em;
  color: var(--ink-4); text-transform: uppercase;
}

.pane { flex: 1; overflow-y: auto; padding: 0 20px 64px; }
.pageblock { flex: none; padding: 18px 20px 14px; }
.pagehead { display: flex; align-items: flex-start; gap: 16px; }
h1 { font-size: 19px; letter-spacing: -.011em; line-height: 1.2; }
.subline { margin: 5px 0 0; font-size: 12px; color: var(--ink-3); }
.pagehead-right { margin-left: auto; display: flex; align-items: center; gap: 8px; }
.code-chip {
  font-family: var(--mono); font-size: 10.5px; color: var(--ink-3);
  background: var(--surface-2); border: 1px solid var(--line);
  border-radius: 2px; padding: 2px 6px; vertical-align: 3px; margin-left: 8px;
}

/* ============================== buttons ============================== */
.btn {
  height: 31px; padding: 0 12px; border-radius: 7px; border: 1px solid var(--input-line);
  background: var(--surface); color: #2E3238; font-size: 12.5px; font-weight: 500;
  display: inline-flex; align-items: center; gap: 6px; white-space: nowrap;
}
/* Work in flight: a ring in the button, not three dots after the verb. The
   themed section restates this for `.t2 .btn`; this is the same ring for a
   button outside a themed box -- the sheet's head, the topbar. */
.btn.busy { pointer-events: none; }
.btn.busy::before {
  content: ""; width: 12px; height: 12px; border-radius: 50%; flex: none;
  border: 2px solid currentColor; border-right-color: transparent; opacity: .8;
  animation: spin .6s linear infinite;
}
@media (prefers-reduced-motion: reduce) { .btn.busy::before { animation: busy-pulse 1.2s ease-in-out infinite; } }
@keyframes busy-pulse { 50% { opacity: .3; } }
.btn:hover { border-color: var(--ink-5); background: var(--surface); }
.btn.primary { background: var(--accent); border-color: var(--accent); color: #fff; font-weight: 600; }
.btn.primary:hover { background: var(--accent-hover); border-color: var(--accent-hover); }
.btn.sm { height: 24px; padding: 0 9px; font-size: 11px; }
.btn.md { height: 27px; padding: 0 10px; font-size: 11px; }
.btn:disabled, .btn.off {
  background: var(--line-2); border-color: var(--line-2); color: var(--ink-5);
  cursor: not-allowed;
}
.btn.danger-h:hover { color: var(--danger); border-color: var(--danger-line-2); background: var(--danger-tint-2); }
.btn.ghost { border-color: transparent; }
.btn.ghost:hover { border-color: var(--line); }

.search {
  height: 30px; display: flex; align-items: center; border: 1px solid var(--line);
  border-radius: 3px; overflow: hidden; background: var(--surface);
}
.search .k {
  font-family: var(--mono); font-size: 11px; color: var(--ink-4); padding: 0 9px;
  border-right: 1px solid var(--line-2); height: 100%; display: flex; align-items: center;
}
.search input { border: 0; outline: 0; padding: 0 10px; font: inherit; font-size: 11.5px; width: 190px; }
.search input::placeholder { color: var(--ink-placeholder); }

/* ============================== cards & tables ============================== */
/* No overflow clipping here: the sticky table headers inside cards stick to
   the pane's scrollport, and any non-visible overflow on an ancestor would
   quietly turn them off. The head rounds its own corners instead. */
.card { border: 1px solid var(--line); border-radius: 10px; background: var(--surface); }
.card + .card { margin-top: 14px; }
.card-head {
  display: flex; align-items: center; gap: 10px; padding: 10px 14px;
  background: var(--surface-3); border-bottom: 1px solid var(--line);
  border-radius: 9px 9px 0 0;
}
.card-title { font-weight: 600; font-size: 12.5px; line-height: 1.3; }
.card-note { margin-left: auto; font-size: 10.5px; color: var(--ink-4); }
.card-body { padding: 12px 14px 18px; }

table.grid { width: 100%; border-collapse: collapse; }
table.grid thead th {
  background: var(--surface-2); border-bottom: 1px solid var(--line);
  font-weight: 600; font-size: 9.5px; letter-spacing: .1em; text-transform: uppercase;
  color: var(--ink-3); padding: 9px 10px; text-align: left; white-space: nowrap;
  /* Hold the labels while the rows scroll. A 49-update schedule series runs
     several screens deep, and past the first column every cell is a bare
     number — finish slip, CP slip, exec change — which is unreadable once the
     header has scrolled off. In collapse mode the border belongs to the table
     rather than the cell, so it does not travel with a stuck th; the inset
     shadow redraws the same 1px rule in place. */
  position: sticky; top: 0; z-index: 2;
  box-shadow: inset 0 -1px 0 var(--line);
}
table.grid tbody td {
  border-bottom: 1px solid var(--line-2); padding: 9px 10px;
  font-size: 12px; color: var(--ink-2); vertical-align: top;
  /* An activity description is whatever the scheduler typed, and a long one
     with no spaces (a path, an ID string) has no break opportunity — the cell
     grew until it pushed the table out of its card and off the screen. Break
     inside the word rather than let one row destroy the layout; `anywhere`
     only takes effect when there is no better break. */
  overflow-wrap: anywhere;
}
table.grid tbody tr:last-child td { border-bottom: 0; }
table.grid .r { text-align: right; }
table.grid td.num, table.grid th.num { text-align: right; font-family: var(--mono); font-size: 11.5px; }
tr.click { cursor: pointer; }
tr.click:hover td { background: var(--surface-2); }
tr.sel td { background: var(--accent-tint); }
tr.muted td { background: var(--surface-3); color: var(--ink-4); cursor: default; }
.dash { color: var(--dash); }

.legend { display: flex; gap: 16px; align-items: center; margin-top: 10px; font-size: 10.5px; color: var(--ink-4); }
.legend .sw { width: 8px; height: 8px; display: inline-block; margin-right: 5px; }
.legend .right { margin-left: auto; }

/* score / progress bars */
.bar { display: inline-flex; align-items: center; gap: 7px; justify-content: flex-end; }
.bar .track { width: 26px; height: 4px; background: var(--line-2); position: relative; }
.bar.wide .track { width: 40px; }
.bar .fill { position: absolute; inset: 0 auto 0 0; background: var(--accent); }
.bar .v { font-family: var(--mono); font-weight: 500; font-size: 12px; }
.q-ok { color: var(--ok); } .q-warn { color: var(--warn); } .q-bad { color: var(--danger); }
/* Slip status: gain green, no movement black, slip red (N04).
   "Holds" is near-black, not grey — grey reads as absent data next to a
   column where a missing value is already an em-dash.

   The table-scoped selectors are not redundant. `table.grid tbody td` carries
   one class and three type selectors, so it outranks a bare `.f-bad` on the
   type count and paints every one of these cells --ink-2 instead. The colours
   were in the stylesheet and had never once rendered inside a table, which is
   most of where they appear. */
.f-ok { color: var(--ok); } .f-flat { color: var(--ink); } .f-bad { color: var(--danger); }
table.grid tbody td.f-ok   { color: var(--ok); }
table.grid tbody td.f-flat { color: var(--ink); }
table.grid tbody td.f-bad  { color: var(--danger); }

/* chips */
.chip {
  display: inline-block; font-family: var(--mono); font-weight: 600; font-size: 9.5px;
  line-height: 1.6; letter-spacing: .06em; border-radius: 4px; padding: 1px 6px;
  /* A chip is one word. In a squeezed table cell "DRAFT" wrapped to one letter
     per line and read as a vertical column of characters. */
  white-space: nowrap;
}
/* the controls beside a chip must not be squeezed into it either */
.btn.sm { white-space: nowrap; }
.chip.hi { background: var(--danger-tint); color: var(--danger); }
.chip.med { background: var(--warn-tint); color: var(--warn); }
.chip.low { background: var(--line-2); color: #3A4754; }
/* Restated at (0,2,0) rather than relying on `.chip` alone. The success-message
   block used to be called `.ok` and, being declared later at equal specificity,
   won border, radius, padding and font-size here -- which shipped the one GOOD
   state as a bordered panel twice the height of every chip beside it: "on track"
   on the portfolio, PUBLISHED on schedules, RESOLVED on findings, MATCHED on
   costs, "complete" on the critical path. That block is `.msg-ok` now, so this
   is belt and braces; it stays because `ok` is a state word many components
   want, and the next one to want it should not have to find this out. */
.chip.ok {
  background: var(--ok-tint); color: var(--ok);
  border: 0; border-radius: 4px; padding: 1px 6px; font-size: 9.5px; margin: 0;
}
.chip.draft { background: var(--warn-tint); color: var(--warn); }
.chip.none { background: var(--line-2); color: var(--ink-4); }
.chip.ms { font-size: 8.5px; background: var(--line-2); color: var(--ink-3); }
/* Path state on an activity ID (N14). Smaller than a status chip: it annotates
   the ID it sits beside rather than competing with it. */
.chip.cp { font-size: 8.5px; letter-spacing: .04em; margin-left: 4px; }

/* ============================== tabs & switches ============================== */
.tabrow {
  height: 36px; flex: none; display: flex; align-items: stretch; gap: 18px;
  padding: 0 20px; background: var(--surface); border-bottom: 1px solid var(--line);
}
.tab {
  border: 0; background: none; padding: 0 1px; font-size: 12.5px; color: var(--ink-3);
  border-bottom: 2px solid transparent; margin-bottom: -1px;
  display: inline-flex; align-items: center; gap: 6px;
}
.tab:hover { color: var(--ink); }
.tab.on { font-weight: 600; color: var(--ink); border-bottom-color: var(--accent); }
.tab .n { font-family: var(--mono); font-size: 11px; color: var(--ink-3); }
.tab .n.hi { background: var(--danger-tint); color: var(--danger); border-radius: 2px; padding: 1px 5px; font-weight: 600; }
.tab .n.warn { color: var(--warn); }
.tabrow .right { margin-left: auto; display: flex; align-items: center; }

.switch { display: inline-flex; background: var(--line-2); border-radius: 4px; padding: 2px; gap: 2px; }
.switch button {
  height: 26px; padding: 0 12px; border: 0; background: none; border-radius: 3px;
  font-size: 11.5px; color: var(--ink-3); display: inline-flex; align-items: center; gap: 6px;
}
.switch button.on { background: var(--surface); color: var(--ink); font-weight: 600; box-shadow: 0 1px 2px rgba(18,22,27,.14); }
.switch .pill { background: var(--danger-tint); color: var(--danger); font-family: var(--mono); font-size: 9.5px; border-radius: 2px; padding: 1px 5px; font-weight: 600; }

.seg { display: inline-flex; border: 1px solid var(--line); border-radius: 3px; overflow: hidden; }
.seg button {
  height: 27px; padding: 0 11px; border: 0; background: var(--surface);
  font-size: 11px; color: var(--ink-3); border-right: 1px solid var(--line);
}
.seg button:last-child { border-right: 0; }
.seg button.on { background: var(--accent); color: #fff; font-weight: 600; }

.toggle { display: inline-flex; align-items: center; gap: 8px; font-size: 11.5px; color: var(--ink-2); cursor: pointer; }
.toggle .track { width: 26px; height: 15px; border-radius: 8px; background: #C9CFD6; position: relative; transition: none; }
.toggle input { display: none; }
.toggle .knob { position: absolute; top: 2px; left: 2px; width: 11px; height: 11px; border-radius: 50%; background: #fff; }
.toggle input:checked + .track { background: var(--accent); }
.toggle input:checked + .track .knob { left: 13px; }

.cbx {
  width: 15px; height: 15px; border-radius: 2px; border: 1.5px solid var(--control-line);
  background: var(--surface); display: inline-grid; place-items: center; flex: none;
  color: transparent; font-size: 9px; font-weight: 700;
}
.cbx.on { background: var(--accent); border-color: var(--accent); color: #fff; }
.cbx.lg { width: 16px; height: 16px; }

/* ============================== screen: schedules ============================== */
.selbar {
  display: flex; align-items: center; gap: 12px; padding: 9px 12px;
  border: 1px solid var(--line); border-bottom: 0; border-radius: 3px 3px 0 0;
  background: var(--surface-2);
}
.selbar.armed { background: var(--accent-tint); border-color: var(--accent-tint-line); }
.selbar .k {
  font-family: var(--mono); font-weight: 600; font-size: 9.5px; letter-spacing: .1em;
  text-transform: uppercase; color: var(--ink-4);
}
.selbar.armed .k { color: var(--accent); }
.selbar .msg { font-size: 12px; color: var(--ink-3); }
.selbar.armed .msg { color: var(--accent-ink); }
.selbar .right { margin-left: auto; display: flex; gap: 8px; }
.selbar + table.grid { border: 1px solid var(--line); border-top: 0; }
.sub-note { font-family: var(--mono); font-size: 9.5px; letter-spacing: .04em; color: var(--warn); }
.sched-name { font-weight: 600; font-size: 12.5px; color: var(--ink); }
.sched-meta { font-family: var(--mono); font-size: 10.5px; color: var(--ink-4); margin-top: 2px; }
.note-panel {
  margin-top: 14px; background: var(--surface-2); border: 1px solid var(--line);
  border-radius: 3px; padding: 11px 13px; display: flex; gap: 12px;
}
.note-panel .k {
  font-family: var(--mono); font-weight: 600; font-size: 9.5px; letter-spacing: .1em;
  text-transform: uppercase; color: var(--ink-4); flex: none;
}
.note-panel p { margin: 0; font-size: 11.5px; line-height: 1.7; color: var(--ink-3); }

/* ========================= data screens: list surface ==================   A list screen is one object: a toolbar that narrows the set, a grid that shows
   it, and a bar that acts on what is ticked. Before this the grid was the whole
   screen — 49 rows with no way to search, filter or sort them, and every row
   action drawn at full strength on every row, so the eye had no quiet ground to
   read the numbers against.

   Opt-in by class. `table.grid` is shared by a dozen screens; `.grid.data` is
   the denser, sortable variant, so a screen joins this as it is reworked rather
   than all of them changing at once. */

/* ---- the frame: toolbar, grid and footer read as one card ---- */
/* `clip`, never `hidden`. Both keep the table's square corners inside the card's
   radius, but `hidden` also makes this box a scroll container — and a sticky
   <th> binds to its nearest scroll container, so the column labels would scroll
   away with the rows. `clip` is not one. The two values look interchangeable,
   which is exactly why this is spelled out. */
.dlist {
  border: 1px solid var(--line); border-radius: 8px;
  background: var(--surface); overflow: clip;
}
/* Below this the fixed columns would eat the name column rather than the table
   admitting it has run out of room. It scrolls instead, under the drawn
   indicator, and every column keeps the width it needs to be read. */
.dlist table.grid.data { min-width: 820px; }

/* `overflow-x: auto` makes a box a scroll container on BOTH axes — CSS turns a
   `visible` on the other axis into `auto` — so the wrap, not the pane, was what
   the sticky <th> bound to. It has no height of its own, so the header had
   nowhere to stick and the column labels scrolled away with the rows: 49
   updates of unlabelled numbers, which is the exact failure the sticky header
   exists to prevent.
   Above this width the 820px table always fits the pane, so the wrap does not
   need to scroll and `clip` takes it out of the way — the header then binds to
   the pane and holds. Narrower than this, horizontal scroll is the more
   valuable of the two and comes back. */
@media (min-width: 1120px) {
  .dlist > .tablewrap { overflow-x: clip; }
}

.dtoolbar {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 8px 10px; background: var(--surface-3);
  border-bottom: 1px solid var(--line); border-radius: 7px 7px 0 0;
}
.dtoolbar .spacer { margin-left: auto; }
.dtoolbar .count {
  font-family: var(--mono); font-size: 10.5px; color: var(--ink-4); white-space: nowrap;
}

/* Search. The magnifier is drawn in the box rather than set as a placeholder
   word, so the field reads as a control at a glance and the placeholder can say
   what is actually searched. */
.dsearch {
  display: flex; align-items: center; gap: 7px; height: 28px; padding: 0 9px;
  border: 1px solid var(--input-line); border-radius: 6px; background: var(--surface);
  min-width: 230px;
}
.dsearch:focus-within { border-color: var(--focus); box-shadow: 0 0 0 2px rgba(27,79,216,.14); }
.dsearch svg { width: 12px; height: 12px; flex: none; color: var(--ink-4); }
.dsearch input { border: 0; outline: 0; padding: 0; font: inherit; font-size: 12px; width: 100%; background: none; }
.dsearch input::placeholder { color: var(--ink-placeholder); }
.dsearch .clr {
  border: 0; background: none; color: var(--ink-4); font-size: 14px; line-height: 1;
  padding: 0 1px; flex: none;
}
.dsearch .clr:hover { color: var(--ink); }

/* Filter pills. A segmented control rather than a <select>: three states that
   each carry a count are worth the width, and the count is the thing that tells
   you whether the filter is worth applying. */
.dfilter { display: inline-flex; background: var(--line-2); border-radius: 6px; padding: 2px; gap: 2px; }
.dfilter button {
  height: 24px; padding: 0 10px; border: 0; background: none; border-radius: 4px;
  font-size: 11.5px; color: var(--ink-3); display: inline-flex; align-items: center; gap: 6px;
}
.dfilter button:hover { color: var(--ink); }
.dfilter button.on { background: var(--surface); color: var(--ink); font-weight: 600; box-shadow: 0 1px 2px rgba(18,22,27,.14); }
.dfilter button .n { font-family: var(--mono); font-size: 10px; color: var(--ink-4); }
.dfilter button.on .n { color: var(--ink-3); }

/* ---- the grid ---- */
/* Fixed, not auto. Under auto layout a `width` is only a hint, and the browser
   settles every column on its content: the value cells here are an em-dash or
   four mono characters, so each numeric column collapsed to its own header's
   longest WORD and `DCMA pass rate` broke into three lines, setting the height
   of the header row. Fixed layout honours the widths below exactly and gives
   the remainder to the one column with no width — the schedule name. */
table.grid.data { table-layout: fixed; }
/* The header is pinned on the <thead>, not on its cells.
   `table.grid thead th` has carried `position: sticky; top: 0` for a long time
   and it has never once held: a table in `border-collapse: collapse` gives its
   cells no box of their own to stick with, so the declaration was inert and the
   column labels scrolled away with the rows — 49 updates of unlabelled numbers,
   the exact thing it was written to prevent. The row group does have a box. */
table.grid.data thead { position: sticky; top: 0; z-index: 3; }
table.grid.data thead th {
  font-size: 10px; letter-spacing: .04em; padding: 7px 8px;
  background: var(--surface-2); color: var(--ink-3);
  /* Two-word labels wrap rather than set the column's minimum width. `Held
     plan` on one line is 93px of header for a column whose values are four
     characters wide, and eleven columns priced that way overflowed a 1120px
     window into a horizontal scroll the data never needed. */
  white-space: normal; line-height: 1.25; vertical-align: bottom;
}
table.grid.data thead th.sortable {
  cursor: pointer; user-select: none;
  /* The marker is lifted out of the text flow and its space reserved as
     padding. Inline, it was 13px of the label's own line box: `DCMA pass rate`
     in a 100px column then had 63px to wrap into and broke into three lines,
     which set the height of the whole header row. */
  position: relative; padding-right: 18px;
}
table.grid.data thead th.sortable:hover { background: var(--line-3); color: var(--ink); }
table.grid.data thead th.sorted { color: var(--ink); }
/* Reserved whether or not this column is the sorted one, so turning sorting on
   and off does not shift every label sideways. */
.sortmark { position: absolute; right: 6px; bottom: 8px; font-size: 8px; color: var(--accent); }

table.grid.data tbody td { padding: 8px 10px; vertical-align: middle; }
/* Zebra under the hairlines. Ten columns of bare numbers is a long way for the
   eye to travel; the banding is barely visible on its own and is what keeps a
   row together across that distance. */
table.grid.data tbody tr:nth-child(even) td { background: var(--surface-4); }
table.grid.data tbody tr:hover td { background: var(--surface-2); }
table.grid.data tbody tr.sel td,
table.grid.data tbody tr.sel:hover td { background: var(--accent-tint); }
table.grid.data tbody tr.sel td:first-child { box-shadow: inset 2px 0 0 var(--accent); }
table.grid.data tbody td.tight { padding-top: 6px; padding-bottom: 6px; }

/* The name cell: one strong line, one quiet line, nothing else. */
.d-name { font-weight: 600; font-size: 12.5px; color: var(--ink); display: flex; align-items: center; gap: 6px; }
.d-name .link { cursor: pointer; }
.d-name .link:hover { text-decoration: underline; text-underline-offset: 2px; }
/* One line, always. Wrapping it made the row two or three units tall depending
   on how long the description happened to be, so the list had no rhythm and a
   verbose row pushed the next one out of view. A secondary line is allowed to
   run out of room; it is not allowed to change the height of the row. */
.d-sub {
  font-size: 11px; color: var(--ink-4); margin-top: 2px;
  display: flex; align-items: center; gap: 6px;
  white-space: nowrap; overflow: hidden;
}
.d-sub > span { overflow: hidden; text-overflow: ellipsis; }
.d-sub .sep, .d-sub .d-tag { flex: none; }
.d-sub .sep { color: var(--ink-5); }
/* A fact about the row, stated at the weight of a fact. These used to be warn
   orange at the same size as the value they annotate, so "SHARED DATE" read as
   loudly as the date itself on every row that carried one. */
.d-tag {
  font-family: var(--mono); font-size: 9px; letter-spacing: .05em; text-transform: uppercase;
  color: var(--ink-4); background: var(--line-3); border: 1px solid var(--line-2);
  border-radius: 3px; padding: 0 4px; white-space: nowrap;
}
.d-tag.warn { color: var(--warn); background: var(--warn-tint); border-color: var(--warn-line); }
.d-tag.accent { color: var(--brand-accent); background: var(--accent-tint); border-color: var(--accent-tint-line); }

/* ---- status lozenge ---- */
.lozenge {
  display: inline-flex; align-items: center; gap: 5px; font-family: var(--mono);
  font-weight: 600; font-size: 9.5px; letter-spacing: .06em; text-transform: uppercase;
  border: 1px solid transparent; border-radius: 3px; padding: 2px 7px; white-space: nowrap;
}
.lozenge::before { content: ""; width: 5px; height: 5px; border-radius: 50%; background: currentColor; flex: none; }
.lozenge.pub { background: var(--ok-tint); color: var(--ok); border-color: var(--ok-line); }
/* Draft is neutral, not a warning. Every schedule starts as one — painting all
   49 of them in warn yellow made the column shout a fact that is simply the
   default state of the object. */
.lozenge.draft { background: var(--surface-2); color: var(--ink-3); border-color: var(--line); }

/* ---- row actions ---- */
.rowact { display: flex; align-items: center; gap: 4px; justify-content: flex-end; }
.iconbtn {
  width: 26px; height: 26px; border-radius: 6px; border: 1px solid transparent;
  background: none; color: var(--ink-3); display: inline-grid; place-items: center; flex: none;
}
.iconbtn svg { width: 14px; height: 14px; }
.iconbtn:hover { background: var(--surface); border-color: var(--line); color: var(--ink); }
.iconbtn[aria-expanded="true"] { background: var(--surface); border-color: var(--control-line); color: var(--ink); }
/* Quiet until the row is under the pointer or holds focus — but never removed
   from the accessibility tree, and never `visibility:hidden`, so a keyboard
   walks onto it and it appears. */
.rowact .on-hover { opacity: 0; transition: opacity .08s linear; }
tr:hover .rowact .on-hover,
.rowact .on-hover:focus-visible,
.rowact:focus-within .on-hover { opacity: 1; }
@media (hover: none) { .rowact .on-hover { opacity: 1; } }

.rowmenu {
  position: fixed; z-index: 50; width: 226px; background: var(--surface);
  border: 1px solid var(--line); border-radius: 7px; padding: 4px;
  box-shadow: 0 10px 30px -10px rgba(18,22,27,.34);
}
.rowmenu button {
  display: block; width: 100%; text-align: left; border: 0; background: none;
  border-radius: 5px; padding: 7px 9px; font: inherit; font-size: 12px; color: var(--ink-2);
}
.rowmenu button:hover { background: var(--surface-2); color: var(--ink); }
.rowmenu button .n { display: block; font-size: 10.5px; color: var(--ink-4); margin-top: 1px; }
.rowmenu button:hover .n { color: var(--ink-3); }
.rowmenu button.danger { color: var(--danger); }
.rowmenu button.danger:hover { background: var(--danger-tint-2); }
.rowmenu .rule { height: 1px; background: var(--line-2); margin: 4px 2px; }
.rowmenu .head {
  font-family: var(--mono); font-size: 9px; letter-spacing: .1em; text-transform: uppercase;
  color: var(--ink-4); padding: 6px 9px 4px;
}

/* ---- the selection bar ----
   Positioned against the SCREEN, not against the scrolled content: the slot is
   a sibling of the pane with no height of its own, and the bar floats on the
   bottom edge of it. So it holds the same place whether the list is three rows
   or three hundred, and it never takes a strip of the page away from the rows
   when nothing is selected. The pane's own 64px tail is what keeps the last
   row from sitting under it. */
.t2.scr { position: relative; }
.t2 .selectbar-slot {
  position: absolute; left: 0; right: 0; bottom: 16px; z-index: 14;
  display: flex; justify-content: center; pointer-events: none;
}
.t2 .selectbar { pointer-events: auto; margin: 0; }
/* The pair, as slots. Each names its own data date, because the arrow between
   them is data-date order and not the order they were ticked. */
/* The pair takes the room between the count and the buttons, and each slot
   takes half of it. A slot's LABEL is the part that gives way -- it shrinks
   to an ellipsis -- and its DATE never does: the date is the fact the arrow
   rests on. `auto auto` tracks with nowrap text could not shrink at all, so a
   long schedule name pushed its date clean out of the slot's box. */
.t2 .selectbar > .sb-pair { flex: 1 1 auto; }
.t2 .sb-pair { display: flex; align-items: stretch; gap: 8px; min-width: 0; }
.t2 .sb-slot {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; grid-template-rows: auto auto;
  align-items: baseline; gap: 0 8px; padding: 4px 11px; border-radius: var(--radius-md);
  background: var(--inverse-wash); min-width: 0; flex: 1 1 0; overflow: hidden;
}
.t2 .sb-slot .r {
  grid-column: 1 / -1; font-size: var(--type-caption-size); line-height: 14px;
  color: var(--inverse-muted); letter-spacing: .02em;
}
.t2 .sb-slot .l {
  font-size: var(--type-body-size); font-weight: var(--weight-strong); color: var(--inverse-text);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0;
}
.t2 .sb-slot .d { font-size: var(--type-caption-size); color: var(--inverse-text-3); font-variant-numeric: tabular-nums; white-space: nowrap; }
/* the slot still to fill: an outline, so the bar shows what it is waiting for */
.t2 .sb-slot.empty {
  background: none; box-shadow: inset 0 0 0 1px var(--inverse-wash-2); place-items: center;
  border-radius: var(--radius-md);
}
.t2 .sb-slot.empty .l { color: var(--inverse-muted); font-weight: var(--weight-regular); }
.t2 .sb-arr { display: grid; place-items: center; color: var(--inverse-muted); flex: none; }
.t2 .sb-arr svg { width: 15px; height: 15px; }
.t2 .selectbar .sb-x { color: var(--inverse-text-3); width: 30px; height: 30px; }
.t2 .selectbar .sb-x:hover { background: var(--inverse-wash-2); color: var(--inverse-text); border-color: transparent; }
.t2 .selectbar .sb-x svg { width: 14px; height: 14px; }

/* ---- the selection bar (base) ----
   Present only when something is ticked, and it holds the bottom of the pane so
   a selection made at row 3 is still actionable at row 40. Ink, because it is
   the one thing on the screen that is about to do something. */
/* The slot, not the bar, is the sticky element. A sticky box is confined to its
   parent's content box, so putting it on `.selectbar` pinned the bar inside a
   wrapper exactly its own height — which is to say, not at all. The slot is the
   last child of the pane and spans it, so the bar rides the bottom of the
   scrollport for the whole length of the list. */
.selectbar-slot { position: sticky; bottom: 12px; z-index: 14; }
.selectbar {
  margin: 12px 0 0;
  display: flex; align-items: center; gap: 12px; padding: 9px 10px 9px 14px;
  background: var(--sidebar-bg); color: var(--sidebar-text); border-radius: 8px;
  box-shadow: 0 12px 30px -12px rgba(18,22,27,.6);
}
.selectbar .n {
  font-family: var(--mono); font-weight: 600; font-size: 11px; letter-spacing: .04em;
  background: rgba(255,255,255,.12); border-radius: 4px; padding: 3px 7px; flex: none;
}
.selectbar .msg { font-size: 12px; color: var(--sidebar-text-2); min-width: 0; }
.selectbar .msg b { color: #fff; font-weight: 600; }
.selectbar .right { margin-left: auto; display: flex; align-items: center; gap: 8px; flex: none; }
.selectbar .btn {
  background: transparent; border-color: var(--sidebar-line-2); color: var(--sidebar-text-2);
}
.selectbar .btn:hover { border-color: var(--sidebar-text-3); color: #fff; background: rgba(255,255,255,.06); }
.selectbar .btn.primary { background: #fff; border-color: #fff; color: var(--ink); }
.selectbar .btn.primary:hover { background: var(--sidebar-text); border-color: var(--sidebar-text); color: var(--ink); }
.selectbar .btn:disabled { background: rgba(255,255,255,.08); border-color: transparent; color: var(--sidebar-dot); }

/* Nothing matched the filter. Says which control is hiding the rows, and offers
   to undo it — an empty grid with no explanation reads as data loss. */
.dempty { padding: 44px 20px; text-align: center; }
.dempty .t { font-size: 13px; font-weight: 600; color: var(--ink); }
.dempty .s { font-size: 12px; color: var(--ink-3); margin-top: 4px; }
.dempty .btn { margin-top: 12px; }

/* ============================== screen: report ============================== */
.reporthead { flex: none; padding: 16px 20px 12px; }
.rh-row1 { display: flex; align-items: center; gap: 14px; }
.rh-row1 .right { margin-left: auto; display: flex; gap: 8px; position: relative; }
.pairstrip {
  margin-top: 12px; min-height: 36px; display: flex; align-items: center; gap: 10px;
  border: 1px solid var(--line); border-radius: 3px; background: var(--surface-3);
  padding: 6px 12px;
}
.pairstrip .a { font-weight: 500; color: var(--ink-3); }
.pairstrip .b { font-weight: 600; color: var(--ink); }
.pairstrip .d { font-family: var(--mono); font-size: 10.5px; color: var(--ink-3); }
.pairstrip .arrow { color: var(--ink-5); }
.pairstrip .right { margin-left: auto; display: flex; gap: 8px; align-items: center; }
.badge {
  display: inline-flex; align-items: center; gap: 6px; border-radius: 3px;
  padding: 4px 9px; background: var(--surface-2); border: 1px solid var(--line);
}
.badge .l { font-size: 10px; letter-spacing: .06em; text-transform: uppercase; color: var(--ink-4); }
.badge .v { font-family: var(--mono); font-weight: 600; font-size: 13px; }
.badge.warn { background: var(--warn-tint); border-color: var(--warn-line); }
.badge.warn .l { color: var(--warn); }

.report-wrap { max-width: 1010px; }

/* overview */
.kpi-card { display: grid; grid-template-columns: 308px 1fr; border: 1px solid var(--line); border-radius: 3px; overflow: hidden; }
.slip { background: var(--warn-tint); padding: 14px 16px; }
.kicker { font-family: var(--mono); font-weight: 600; font-size: 9.5px; letter-spacing: .13em; text-transform: uppercase; color: var(--ink-4); }
.slip .kicker { color: var(--warn-ink-2); }
.slip .big { font-family: var(--mono); font-weight: 600; font-size: 34px; letter-spacing: -.03em; line-height: 1; margin: 8px 0 6px; color: var(--warn-ink-3); }
.slip .big .u { font-size: 14px; font-weight: 500; margin-left: 5px; }
.slip .dates { display: flex; align-items: center; gap: 8px; font-family: var(--mono); font-size: 11.5px; }
.slip .was { text-decoration: line-through; color: #7A6A45; }
.slip .now { background: var(--surface); border: 1px solid var(--warn-line); border-radius: 3px; padding: 2px 7px; }
.slip .ms { margin-top: 9px; font-size: 11px; color: var(--warn-ink); }
.kpis { display: grid; grid-template-columns: repeat(4, 1fr); }
.kpi { padding: 14px 14px; border-left: 1px solid var(--line-2); }
.kpi:first-child { border-left: 0; }
.kpi-head { display: flex; align-items: baseline; gap: 8px; }
.kpi-head .fix { margin-left: auto; font-size: 10px; font-weight: 600; color: var(--accent); border: 0; background: none; padding: 0; }
.kpi .n { font-family: var(--mono); font-weight: 600; font-size: 26px; line-height: 1; letter-spacing: -.02em; margin: 8px 0 6px; }
.kpi .n .sub { font-size: 15px; color: var(--ink-4); }
.kpi .note { font-size: 10.5px; color: var(--ink-4); line-height: 1.5; }
.sevchips { display: flex; gap: 4px; margin-bottom: 6px; flex-wrap: nowrap; white-space: nowrap; }

.ai-chip { background: var(--warn-tint); color: var(--warn); }
.narr { padding: 14px 16px; max-width: 790px; }
.narr p { margin: 0 0 12px; font-size: 13px; line-height: 1.75; color: var(--ink); }
/* F6: the draft the AI wrote and nobody confirmed keeps the AI colour here,
   where `.narr p` would otherwise outrank `.ai-val`. */
.narr p.ai-val { color: var(--ai); }
.narr p:last-child { margin-bottom: 0; }
.narr[contenteditable="true"]:focus { background: #FCFDFE; outline: none; }

.cpgrid { display: grid; grid-template-columns: 1fr 1fr; gap: 0; }
.cpcol { border-right: 1px solid var(--line); }
.cpcol:last-child { border-right: 0; }
.cphead {
  padding: 8px 12px; background: var(--surface-2); border-bottom: 1px solid var(--line);
  font-family: var(--mono); font-weight: 600; font-size: 9.5px; letter-spacing: .08em;
  text-transform: uppercase; color: var(--ink-3);
}
.cpcol.b .cphead { background: var(--accent-tint); color: var(--accent); }
.cprow { display: grid; grid-template-columns: 74px 1fr auto; gap: 10px; padding: 7px 12px; border-bottom: 1px solid var(--line-3); font-size: 12px; }
.cprow:last-child { border-bottom: 0; }
.cprow .id { font-family: var(--mono); font-size: 11.5px; color: var(--ink-2); }
.cprow .fin { font-family: var(--mono); font-size: 11.5px; color: var(--ink-3); }
/* column header — the date column had none, so nothing said which date it was */
.cprow.cpcolhead {
  background: var(--surface-2); border-bottom: 1px solid var(--line);
  font-size: 9.5px; letter-spacing: .08em; text-transform: uppercase;
  font-weight: 600; color: var(--ink-4);
}
.cprow.cpcolhead .id, .cprow.cpcolhead .fin { font-family: var(--sans); font-size: 9.5px; color: var(--ink-4); }
/* a date borrowed from the other schedule, because the activity is not in this one */
.cprow .fin.borrowed { color: var(--ink-5); font-style: italic; }
.cprow.gone { background: var(--danger-tint-2); }
.cprow.gone .id { color: var(--danger); }
.cprow.gone .nm { color: #7A2222; }
.cprow.joined { background: var(--accent-tint); }
.cprow.fin-ms { font-weight: 600; border-top: 1px solid var(--line); }
.cpnone { padding: 9px 12px; background: var(--surface-3); font-size: 11.5px; color: var(--ink-4); }

/* changes */
.filterbar {
  display: flex; align-items: center; gap: 14px; padding: 9px 12px;
  border: 1px solid var(--line); border-radius: 3px; background: var(--surface-3);
  margin-bottom: 14px; flex-wrap: wrap;
}
.filterbar .k { font-weight: 600; font-size: 9.5px; letter-spacing: .1em; text-transform: uppercase; color: var(--ink-4); }
.filterbar .live { font-size: 11px; color: var(--ink-4); }
.secrow {
  display: grid; grid-template-columns: 1fr 34px 1fr 18px; gap: 12px; align-items: center;
  min-height: 36px; padding: 6px 14px; border-bottom: 1px solid var(--line-2);
  background: none; border-left: 0; border-right: 0; border-top: 0; width: 100%; text-align: left;
}
.secrow:last-of-type { border-bottom: 0; }
.secrow:hover:not(.empty) { background: var(--surface-2); }
.secrow .t { font-size: 12px; font-weight: 500; color: var(--ink); }
.secrow .c { font-family: var(--mono); font-size: 11.5px; text-align: right; color: var(--accent); }
.secrow .s { font-family: var(--mono); font-size: 11px; color: var(--ink-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.secrow .caret { color: var(--ink-5); font-size: 9px; text-align: right; }
.secrow.empty { background: var(--surface-3); cursor: default; }
.secrow.empty .t { color: var(--ink-4); font-weight: 400; }
.secrow.empty .c { color: var(--ink-4); }
.secrow.empty .s { color: var(--ink-4); }
.secbody { border-bottom: 1px solid var(--line-2); padding: 0 14px 12px; }
table.nested { width: 100%; border-collapse: collapse; border: 1px solid var(--line-2); }
table.nested th {
  background: var(--surface-2); font-weight: 500; font-size: 9px; letter-spacing: .08em;
  text-transform: uppercase; color: var(--ink-4); padding: 6px 8px; text-align: left;
  border-bottom: 1px solid var(--line-2);
}
table.nested td { padding: 6px 8px; font-size: 11.5px; border-bottom: 1px solid var(--line-3); color: var(--ink-2);
  overflow-wrap: anywhere; }   /* see table.grid tbody td */
table.nested tr:last-child td { border-bottom: 0; }
table.nested td.id { font-family: var(--mono); color: var(--ink-2); }
table.nested td.id.added { color: var(--ok); }
table.nested td.id.removed { color: var(--danger); text-decoration: line-through; }
table.nested td.num { font-family: var(--mono); text-align: right; }
table.nested td.delta.bad { color: var(--danger); }
table.nested td.delta.good { color: var(--ok); }

/* findings */
.findrow {
  display: grid; grid-template-columns: 30px 62px 1fr auto auto; gap: 10px; align-items: center;
  min-height: 36px; padding: 6px 14px; border-bottom: 1px solid var(--line-2);
  background: none; border-left: 0; border-right: 0; border-top: 0; width: 100%; text-align: left;
}
.findrow:hover { background: var(--surface-2); }
.findrow .n { font-family: var(--mono); font-size: 11px; color: var(--ink-4); }
.findrow .t { font-size: 12px; font-weight: 500; color: var(--ink); }
.findrow.done { background: #FCFDFC; }
.findrow.done .t { color: var(--ink-4); text-decoration: line-through; }
.findrow .traces { display: flex; gap: 4px; flex-wrap: wrap; justify-content: flex-end; }
.acode {
  font-family: var(--mono); font-size: 10px; color: var(--accent);
  background: var(--surface-2); border: 1px solid var(--line-2); border-radius: 2px; padding: 1px 5px;
}
.findrow .spec { font-family: var(--mono); font-size: 10px; color: var(--ink-4); }
.findbody { padding: 0 14px 14px 67px; border-bottom: 1px solid var(--line-2); }
.findbody p { margin: 0 0 12px; font-size: 12.5px; line-height: 1.7; color: var(--ink-2); }
.whyfix { display: grid; grid-template-columns: 1fr 1fr; gap: 11px; }
.wf { border-radius: 10px; padding: 11px 13px; }
.wf.why { background: var(--warn-tint); border: 1px solid var(--warn-line); }
.wf.fix { background: var(--ok-tint); border: 1px solid var(--ok-line); }
.wf .k { font-family: var(--mono); font-weight: 600; font-size: 9.5px; letter-spacing: .12em; text-transform: uppercase; color: var(--warn); margin-bottom: 6px; }
.wf.fix .k { color: var(--ok); }
.wf p { margin: 0; font-size: 12.5px; line-height: 1.5; color: var(--ink-2); }
.wf.fix p { color: var(--ink-2); }

/* health */
tr.review td { background: #FEFCF7; }
.floatchart { display: flex; align-items: flex-end; gap: 22px; height: 190px; padding: 16px 14px 0; }
.fbar { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: flex-end; height: 100%; }
.fbar .v { font-family: var(--mono); font-size: 11px; color: var(--ink-2); margin-bottom: 5px; }
.fbar .b { width: 100%; background: var(--accent); min-height: 2px; }
.fbar .l { font-size: 9.5px; color: var(--ink-4); margin-top: 7px; text-align: center; }
/* the band's rule, always under its title (N23) — the title alone misleads */
.fbar .l.sub { font-size: 8.5px; color: var(--ink-5); margin-top: 2px; }

/* ============================== task mode ============================== */
.taskwrap { flex: 1; display: flex; min-height: 0; }
.queue { width: 392px; flex: none; border-right: 1px solid var(--line); display: flex; flex-direction: column; overflow: hidden; }
.queue-head { padding: 14px 16px 10px; border-bottom: 1px solid var(--line-2); }
.queue-head h2 { font-size: 14px; }
.queue-sub { font-family: var(--mono); font-size: 10.5px; color: var(--ink-4); margin-top: 3px; }
.ring-row { display: flex; align-items: center; gap: 10px; margin-top: 12px; }
.ring { width: 38px; height: 38px; border-radius: 50%; display: grid; place-items: center; flex: none; }
.ring .core { width: 29px; height: 29px; border-radius: 50%; background: var(--surface); display: grid; place-items: center; font-family: var(--mono); font-weight: 600; font-size: 11px; }
.ring-label { font-size: 11px; color: var(--ink-3); line-height: 1.35; }
.queue-list { flex: 1; overflow-y: auto; }
.qrow { display: grid; grid-template-columns: 22px 1fr; gap: 10px; padding: 11px 16px; border-bottom: 1px solid var(--line-2); border-left: 2px solid transparent; cursor: pointer; }
.qrow:hover { background: var(--surface-2); }
.qrow.on { background: var(--accent-tint); border-left-color: var(--accent); }
.qrow .meta { display: flex; align-items: center; gap: 7px; margin-bottom: 5px; }
.qrow .t { font-weight: 600; font-size: 12.5px; color: var(--ink); line-height: 1.35; }
.qrow.done .t { color: var(--ink-4); text-decoration: line-through; }
.qrow .traces { display: flex; gap: 4px; flex-wrap: wrap; margin-top: 6px; }
.detail { flex: 1; overflow-y: auto; padding: 22px 26px 70px; }
.detail-inner { max-width: 820px; }
.detail-top { display: flex; align-items: center; gap: 9px; margin-bottom: 12px; }
.detail-top .of { margin-left: auto; font-family: var(--mono); font-size: 10.5px; letter-spacing: .06em; color: var(--ink-4); }
.detail h2 { font-size: 24px; letter-spacing: -.016em; line-height: 1.25; }
.detail .body { font-size: 14px; line-height: 1.7; color: var(--ink-2); margin: 12px 0 18px; }
.traces-panel { margin-top: 14px; border: 1px solid var(--line); border-radius: 3px; padding: 12px 14px; }
.tracecards { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; }
.tracecard { display: flex; align-items: center; gap: 9px; border: 1px solid var(--line); border-radius: 3px; padding: 7px 10px; }
.tracecard:hover { border-color: var(--accent); }
.tracecard .id { font-family: var(--mono); font-size: 11.5px; color: var(--accent); }
.tracecard .nm { font-size: 12px; }
.tracecard .mt { font-family: var(--mono); font-size: 10px; color: var(--ink-4); }
.actions { display: flex; align-items: center; gap: 8px; margin-top: 20px; }
.actions .right { margin-left: auto; }
.allclear { background: var(--ok-tint); border: 1px solid #CBE3D5; border-radius: 3px; padding: 12px 14px; color: var(--ok); font-size: 12.5px; }
.empty-state { padding: 40px 20px; text-align: center; color: var(--ink-4); font-size: 12.5px; }
.empty-state h3 { font-size: 14px; color: var(--ink-2); margin-bottom: 8px; }

/* ============================== popover & modal ============================== */
.popover {
  position: absolute; top: 36px; right: 0; z-index: 40; width: 290px;
  background: var(--surface); border: 1px solid var(--line); border-radius: 3px;
  box-shadow: 0 8px 24px -8px rgba(18,22,27,.28);
  /* The section list once went from five rows to thirteen and ran off the
     bottom of the window, taking the template row and the last two sections
     with it — controls present, reachable by keyboard, and invisible. Both
     lists have since moved to the composer and this is a short menu again, but
     the cap stays: it costs nothing and it is what stopped that happening. */
  max-height: calc(100vh - 56px); overflow-y: auto; overscroll-behavior: contain;
}
/* The popover's read-only note on what the document rows will carry. It
   replaced a section list and a template picker that duplicated the composer's,
   so it must not look like either: a statement, and one way out to the place
   the choice is actually made. */
.popover .pf-sum { font-size: 11.5px; color: var(--ink-2); line-height: 1.5; }
.popover .pf-note {
  font-size: 11px; color: var(--ink-4); line-height: 1.45; margin-top: 3px;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden;
}
.popover .pf-change {
  margin-top: 7px; padding: 0; border: 0; background: none; cursor: pointer;
  font: inherit; font-size: 11.5px; color: var(--accent);
}
.popover .pf-change:hover { text-decoration: underline; }
/* The group heading inside the export popover */
.popover .ph2 {
  font-weight: 600; font-size: 9px; letter-spacing: .06em; text-transform: uppercase;
  color: var(--ink-4); padding: 2px 0 4px;
}
.popover .ph {
  padding: 8px 12px; background: var(--surface-2); border-bottom: 1px solid var(--line);
  font-weight: 600; font-size: 9.5px; letter-spacing: .1em; text-transform: uppercase; color: var(--ink-4);
}
/* Under a section shown alone: the group heading that starts the whole-
   document rows, and a note that stands in for rows a section cannot have. */
.popover .ph2.sep { padding: 9px 12px 4px; border-top: 1px solid var(--line); background: var(--surface-3); }
.popover .pf-note.wide { display: block; -webkit-line-clamp: none; padding: 9px 12px; margin: 0; border-bottom: 1px solid var(--line-2); }
.popover .pr { display: block; width: 100%; text-align: left; border: 0; background: none; padding: 10px 12px; border-bottom: 1px solid var(--line-2); }
.popover .pr:hover { background: var(--surface-2); }
.popover .pr:disabled { cursor: default; }
.popover .pr:disabled:hover { background: none; }
.popover .pr:disabled .l { color: var(--ink-4); }
.popover .pr .l { font-weight: 500; font-size: 12px; color: var(--ink); }
.popover .pr .n { font-size: 10.5px; color: var(--ink-4); margin-top: 2px; }
.popover .pf { padding: 9px 12px; }

.scrim {
  position: fixed; inset: 0; background: rgba(20,24,29,.32); z-index: 60;
  display: grid; place-items: center; padding: 20px;
  /* The column, pinned to the scrim rather than to what is in it. Left implicit
     it sized to the modal's own 600px, so the modal's `max-width: 100%` was
     100% of a track the modal had just defined -- it clamped nothing, and on a
     390px viewport 230px of the dialog sat off the right edge. */
  grid-template-columns: minmax(0, 1fr);
  backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px);
}
.modal {
  width: 600px; max-width: 100%; max-height: 100%; overflow-y: auto;
  background: var(--surface); border-radius: 14px; box-shadow: 0 24px 64px rgba(20,24,29,.32);
}
.modal-head { display: flex; align-items: flex-start; gap: 12px; padding: 16px 18px 12px; }
.modal-head h2 { font-size: 15px; }
.modal-head .sub { font-size: 11.5px; color: var(--ink-3); margin-top: 3px; }
.modal-x { margin-left: auto; width: 26px; height: 26px; border: 0; background: none; color: var(--ink-4); font-size: 16px; border-radius: 3px; }
.modal-x:hover { background: var(--surface-2); color: var(--ink); }
.modal-body { padding: 0 18px 16px; }

/* A modal with enough in it to outgrow a laptop screen. The body scrolls and
   the head and foot stay put, so the primary action is always visible -- it
   carries the validation message in its disabled state, and a publisher should
   not have to scroll to find out why they cannot publish yet. */
.modal.tall { display: flex; flex-direction: column; max-height: min(100%, 760px); }
.modal.tall .modal-head, .modal.tall .modal-foot { flex: 0 0 auto; }
.modal.tall .modal-body { flex: 1 1 auto; overflow-y: auto; min-height: 0; }
.modal-foot {
  display: flex; align-items: center; gap: 10px; padding: 12px 18px;
  background: var(--surface-3); border-top: 1px solid var(--line);
}
.modal-foot .right { margin-left: auto; display: flex; gap: 8px; }
.msect { margin-bottom: 16px; }

/* Publish modal — the credential fields under an access mode that uses one.
   Inset and ruled on the left so they read as belonging to the option above
   them, rather than as a second, independent question. */
/* Theme picker thumbnails — a miniature page drawn in CSS beside each option.
   Suggestive, not a screenshot: the density of the rules and the face of the
   cover glyph are what distinguish the three, and that much CSS can say
   honestly. aria-hidden in the markup; the words beside it carry the meaning. */
/* The miniature's slot is the width of the WIDEST miniature, not of the
   portrait ones: `register` draws a landscape sheet, and a 46px column silently
   ran it under its own label. Each thumb is centred in the slot, so every card's
   text still starts on the same line however its page is shaped. */
.radio-card.theme-card { grid-template-columns: 16px 60px 1fr; }
.radio-card.theme-card .tthumb { justify-self: center; }
.tthumb {
  width: 46px; height: 60px; display: block; position: relative; overflow: hidden;
  background: var(--surface); border: 1px solid var(--line); border-radius: 2px;
  box-shadow: 0 1px 2px rgba(18, 22, 27, .06);
}
.radio-card.on .tthumb { border-color: var(--accent-tint-line); }
.tthumb::before, .tthumb::after { content: ""; position: absolute; }
/* submittal: a heavy cover rule over dense body text */
.tthumb-submittal::before { left: 6px; right: 6px; top: 7px; height: 2px; background: var(--ink); }
.tthumb-submittal::after {
  left: 6px; right: 6px; top: 13px; bottom: 6px;
  background: repeating-linear-gradient(to bottom, var(--ink-5) 0 1px, transparent 1px 4px);
}
/* brief: a hairline head and fewer, airier lines */
.tthumb-brief::before { left: 6px; right: 16px; top: 8px; height: 3px; background: var(--ink-3); }
.tthumb-brief::after {
  left: 6px; right: 6px; top: 18px; bottom: 8px;
  background: repeating-linear-gradient(to bottom, var(--ink-5) 0 2px, transparent 2px 8px);
}
/* executive: a serif cover glyph over the title-page double rule */
.tthumb-executive::before {
  content: "Aa"; left: 0; right: 0; top: 6px; text-align: center;
  font-family: "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, serif;
  font-size: 15px; line-height: 1; color: var(--ink);
}
.tthumb-executive::after {
  left: 8px; right: 8px; top: 28px; height: 5px;
  border-top: 2px solid var(--ink); border-bottom: 1px solid var(--ink);
}
/* register: a landscape sheet ruled into columns */
.tthumb-register { width: 60px; height: 46px; }
.tthumb-register::before {
  left: 5px; right: 5px; top: 6px; height: 2px; background: var(--ink);
}
.tthumb-register::after {
  left: 5px; right: 5px; top: 12px; bottom: 5px;
  background:
    repeating-linear-gradient(to right, var(--ink-5) 0 1px, transparent 1px 12px),
    repeating-linear-gradient(to bottom, var(--ink-5) 0 1px, transparent 1px 5px);
}
/* markup: body text with an empty margin down the right for notes */
.tthumb-markup::before {
  left: 6px; right: 24px; top: 7px; height: 2px; background: var(--ink-3);
}
.tthumb-markup::after {
  left: 6px; right: 24px; top: 14px; bottom: 6px;
  background: repeating-linear-gradient(to bottom, var(--ink-5) 0 1px, transparent 1px 6px);
  border-right: 1px dashed var(--ink-5);
  box-shadow: 14px 0 0 -13px var(--ink-5);
}
/* compact: the same page, more lines on it */
.tthumb-compact::before {
  left: 5px; right: 5px; top: 5px; height: 1px; background: var(--ink);
}
.tthumb-compact::after {
  left: 5px; right: 5px; top: 9px; bottom: 4px;
  background: repeating-linear-gradient(to bottom, var(--ink-5) 0 1px, transparent 1px 2.5px);
}

/* The publish step's read-only summary of what it is about to freeze. A
   definition list rather than a form: nothing here is editable, and it should
   not look as though a click might change it. The one control is the way back
   to the composer. */
.pubsum { display: grid; grid-template-columns: max-content 1fr; gap: 5px 14px; margin: 0; }
.pubsum dt {
  font-size: 10px; letter-spacing: .07em; text-transform: uppercase;
  color: var(--ink-4); align-self: baseline;
}
.pubsum dd { margin: 0; font-size: 12.5px; color: var(--ink-2); }
.msect > .btn.sm { margin-top: 10px; }

/* #11 · personal report links. A row per reader: who, what happened, and the
   two controls that matter -- give me the link, and take it back. */
.recips { margin-top: 4px; }
.recip {
  display: flex; align-items: center; gap: 12px;
  padding: 9px 0; border-bottom: 1px solid var(--line-2);
}
.recip:last-child { border-bottom: 0; }
/* A withdrawn reader stays on the list -- who was sent a report and when it
   was taken back is part of the record -- but reads as past tense. */
.recip.off .recip-who { color: var(--ink-4); }
.recip.off .recip-name { text-decoration: line-through; }
.recip-who { flex: 1; min-width: 0; }
.recip-name { font-size: 12.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Fixed rather than min-width: three rows whose status column starts in three
   different places reads as three unrelated facts, and the column exists to be
   scanned down. */
.recip-state { flex: 0 0 120px; text-align: right; }
.recip-state .sched-meta { margin-top: 3px; }
.recip-acts { display: flex; gap: 6px; flex-shrink: 0; }
.recip-add { display: flex; gap: 6px; margin-top: 12px; }
.recip-add .credinput { flex: 1; min-width: 0; }
@media (max-width: 560px) {
  .recip { flex-wrap: wrap; }
  .recip-state { flex: 1 0 auto; text-align: left; }
  .recip-add { flex-wrap: wrap; }
}

.credbox {
  margin: 4px 0 14px; padding: 2px 0 12px 13px;
  border-left: 2px solid var(--accent-tint-line);
}
.credrow { display: flex; gap: 8px; align-items: center; }
.credrow .credinput { flex: 1; }
.credinput {
  font: inherit; font-size: 12.5px; width: 100%;
  padding: 7px 10px; border: 1px solid var(--control-line);
  border-radius: 3px; background: var(--surface); color: var(--ink);
}
textarea.credinput { resize: vertical; min-height: 58px; font-family: var(--mono); font-size: 11.5px; }
.credinput:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; border-color: var(--accent); }
.credbox .hint, .msect .hint { font-size: 11px; color: var(--ink-4); margin-top: 6px; line-height: 1.5; }
.msect > .kicker { margin-bottom: 8px; }
.radio-card { display: grid; grid-template-columns: 16px 1fr; gap: 11px; padding: 11px 13px; border: 1px solid var(--line); border-radius: 3px; margin-bottom: 8px; cursor: pointer; align-items: start; }
.radio-card.on { background: var(--accent-tint); border-color: var(--accent); }
.radio { width: 14px; height: 14px; border-radius: 50%; border: 1px solid var(--control-line); display: grid; place-items: center; margin-top: 1px; }
.radio-card.on .radio { border-color: var(--accent); }
.radio .core { width: 7px; height: 7px; border-radius: 50%; background: transparent; }
.radio-card.on .radio .core { background: var(--accent); }
.radio-card .l { font-weight: 500; font-size: 12px; display: block; }
.radio-card .n { display: block; font-size: 10.5px; color: var(--ink-4); margin-top: 2px; line-height: 1.5; }
.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.cbrow { display: flex; align-items: center; gap: 9px; font-size: 12px; cursor: pointer; padding: 6px 0; }
/* A section row in the export composer: the name takes the width, the two
   move buttons sit at the end and stay the same size whether or not they are
   available, so the list does not shuffle as it is reordered. */
.cbrow.secrow { gap: 8px; padding: 4px 0; }
.movebtn {
  width: 20px; height: 20px; flex: none; padding: 0; line-height: 1;
  border: 1px solid var(--line); border-radius: 3px; background: var(--surface);
  color: var(--ink-3); font-size: 11px; cursor: pointer;
}
.movebtn:hover:not(:disabled) { border-color: var(--control-line); color: var(--ink); }
.movebtn:disabled { opacity: .35; cursor: default; }
.field { margin-bottom: 12px; }
.field label { display: block; font-weight: 500; font-size: 11.5px; margin-bottom: 5px; }
.field input, .field select, .field textarea {
  width: 100%; height: 32px; border: 1px solid var(--input-line); border-radius: 8px;
  padding: 0 10px; font: inherit; font-size: 12.5px; background: var(--surface);
}
/* One focus language, everywhere a text control is themed. This was
   `:focus` plus a border-colour change: weaker than the 3px accent ring the
   file control and the step rail already used, on the majority of the app's
   controls, and triggered by the mouse as well as the keyboard. Text controls
   match `:focus-visible` on click too, so nothing is lost by asking for it. */
.field input:focus-visible, .field select:focus-visible, .field textarea:focus-visible {
  outline: none; border-color: var(--brand-accent);
  box-shadow: 0 0 0 3px rgba(180, 83, 26, .12);
}
.field textarea { height: auto; padding: 8px 10px; resize: vertical; font-size: 12px; line-height: 1.6; }
.field .hint { font-size: 10.5px; color: var(--ink-4); margin-top: 4px; }
.err {
  color: var(--danger); background: var(--danger-tint); border: 1px solid var(--danger-line);
  border-radius: 3px; padding: 8px 10px; font-size: 11.5px; margin: 10px 0;
}
/* The same shape as .err in the affirmative — "a link is on its way" needs the
   same weight on the page as "that did not work", or a form that succeeded
   quietly reads as a form that did nothing.

   Named `msg-ok`, not `ok`. As `.ok` it collided with every component that uses
   `ok` as a STATE modifier — `chip ok`, and the switcher's health dot — because
   both selectors were (0,1,0) and this one is declared later, so it won padding,
   border and font-size. That shipped "on track" as a bordered panel across eight
   screens and, before this rename, blew the switcher's 7px dot up to 27px. One
   element carries this class; a state word and a component name are now
   different things. */
.msg-ok {
  color: var(--ok); background: var(--ok-tint); border: 1px solid var(--ok);
  border-radius: 3px; padding: 8px 10px; font-size: 11.5px; margin: 10px 0;
}

/* ============================== unlock ============================== */
/* --- browser surfaces -------------------------------------------------------
   The parts nobody draws still carry the design. Selection, the caret, the
   focus ring and the numerals ship with browser defaults that belong to no
   design system, and leaving them is the clearest tell that a page was
   assembled rather than built. Themed once, globally, from the same palette. */
::selection { background: rgba(180, 83, 26, .16); color: var(--ink); }
input, textarea, select { caret-color: var(--brand-accent); }
/* Every figure in this product is a measurement that gets compared down a
   column, so the numerals line up everywhere by default, not per table. */
input[type="number"], .mono, .num, table.grid td, table.grid th {
  font-variant-numeric: tabular-nums;
}

/* --- the sign-in surface ---------------------------------------------------
   Page one of the document this tool issues, set in the same hand as every
   page after it: paper, one ink rule, and type doing the structural work. The
   card is gone on purpose. A 380px panel floating in the middle of a 1440px
   screen is the arrangement every product ships, and it said nothing about
   this one. What signals the craft here is precision -- optical centring, a
   real focus system, themed selection and caret, tabular figures -- not
   ornament, and none of it is decoration that could be removed without the
   page getting worse. */
/* Two materials meeting, full bleed, no page margin: the sidebar's ink on the
   left, the report's paper on the right. The split is roughly 70/30, with the
   form column held at 420px minimum so the card never has to shrink -- at 1440
   that lands at 68/32 and at 1920 at 68/32 again, the column capped by its own
   content rather than by the percentage. */
.unlock {
  min-height: 100vh;
  display: grid;
  grid-template-columns: 1fr minmax(440px, 33%);
  background: var(--paper);
}
/* A9: locked, not signed out. The sign-in surface lies over the page rather
   than replacing it, so what the person was doing is visibly still there --
   dimmed, inert, and exactly where they left it. */
body.locked #app { filter: blur(2px) saturate(.7); pointer-events: none; user-select: none; }
body.locked .unlock {
  position: fixed; inset: 0; z-index: 900; min-height: 100vh;
  background: color-mix(in srgb, var(--paper) 86%, transparent);
  backdrop-filter: blur(1px);
}
.unlock-col {
  display: grid; place-items: center;
  /* Optically centred: a column reads centred when it sits slightly above
     true centre, because the eye weights the space beneath it more. 40/112
     puts it 36px high on a 1440x900 screen -- the 40/72 it started at measured
     16px, which is a lift you can only find with a ruler. */
  padding: 40px 28px 112px;
}
.unlock-card { width: 100%; max-width: 420px; }

/* --- the ink panel ---------------------------------------------------------
   Head, drawing, foot. No link and no control lives here: everything actionable
   is in the paper column, so nothing on this side can take focus away from the
   form or give a keyboard user somewhere pointless to land.

   The two halves share one structural gesture in opposite inks. The paper side
   closes its masthead with a 2px rule in --ink; this side closes its head with
   a 2px rule in the sidebar's own text colour, and both sides stand their foot
   on a 1px hairline. Same weights, inverted material. */
/* Exactly one viewport tall, and sticky so a long form on the paper side scrolls
   past it instead of stretching it. A sign-in page that scrolls to show its own
   decoration has put the decoration ahead of the sign-in. */
.unlock-panel {
  display: flex; flex-direction: column;
  gap: 34px; min-width: 0; overflow: hidden;
  height: 100vh; position: sticky; top: 0;
  padding: 48px clamp(36px, 3.6vw, 56px);
  background: var(--sidebar-bg); color: var(--sidebar-text);
}
/* One measure for all three blocks, so the head rule, the drawing and the foot
   rule share an edge at every width instead of the rules outrunning the art on
   a wide monitor. */
.up-head, .up-art, .up-foot { max-width: 820px; }
.up-head { border-bottom: 2px solid var(--sidebar-text); padding-bottom: 24px; }
.up-line {
  margin: 0; max-width: 26ch;
  font-size: 30px; font-weight: 500; line-height: 1.34; letter-spacing: -.025em;
  color: var(--sidebar-text); text-wrap: balance;
}
/* The drawing takes whatever height the head and foot leave and letterboxes
   itself into it, anchored to the panel's left edge. Sized off its own width it
   ran 505px tall and pushed the whole page past the viewport. */
.up-art {
  flex: 1 1 auto; min-height: 0;
  display: flex; flex-direction: column; justify-content: center; gap: 18px;
  min-width: 0;
}
.up-plot { flex: 0 1 auto; min-height: 0; display: block; width: 100%; height: 100%; }
.up-cap {
  margin: 0; font-size: 12px; line-height: 1.5; color: var(--sidebar-label);
}
.up-foot {
  border-top: 1px solid var(--sidebar-line-2); padding-top: 22px;
  display: flex; flex-direction: column; gap: 12px;
}
.up-claim {
  margin: 0; max-width: 52ch;
  font-size: 13px; line-height: 1.65; color: var(--sidebar-text-2);
  text-wrap: pretty;
}
.up-stamp {
  margin: 0; font-family: var(--mono); font-size: 12px;
  color: var(--sidebar-label);
}

/* WHO gets the panel is a question about the device, not the window.

   It used to leave below 1280 wide OR 800 tall, to keep the specimen's labels
   at 12px or more. The height half caught nearly every laptop: a 1440x900
   screen loses about 120px to tabs and the address bar, so the surface this
   page was designed as only ever appeared on a desktop monitor.

   Now: every laptop keeps it, down to small ones and short windows, and
   readability is held by the layout tiers below rather than by leaving. The
   drawing was narrowed (viewBox 700 -> 610) so its labels come out larger at
   the same width. Tablets and phones lose it -- by pointer as well as width,
   because an iPad in landscape is 1366 wide and width alone cannot tell it
   from a laptop. */

/* Narrower laptop windows: the form column gives 40px back and the gutters
   tighten, which is exactly the width the drawing needs to keep its labels. */
@media (max-width: 1279px) {
  .unlock { grid-template-columns: minmax(0, 1fr) 400px; }
  .unlock-panel { padding-left: 28px; padding-right: 28px; }
  .unlock-col { padding-left: 24px; padding-right: 24px; }
}
/* Short laptop screens: the head and the gaps give height back to the
   drawing, which takes whatever the head and foot leave. */
@media (max-height: 820px) {
  .unlock-panel { padding-top: 32px; padding-bottom: 32px; gap: 22px; }
  .up-head { padding-bottom: 14px; }
  .up-line { font-size: 22px; line-height: 1.3; max-width: 34ch; }
  .up-art { gap: 12px; }
  .up-foot { padding-top: 14px; gap: 8px; }
  .up-claim { max-width: 72ch; }
  .unlock-col { padding-top: 32px; padding-bottom: 48px; }
}
/* The shortest laptop windows. The headline already makes the claim the foot
   repeats, so the foot is what goes; the caption stays, because "not client
   data" is the one sentence the drawing cannot do without. */
@media (max-height: 680px) {
  .up-foot { display: none; }
}
/* Tablets and phones -- a coarse primary pointer, or narrower than a laptop --
   and a window too short to be a laptop screen at all. The paper column takes
   the whole page, which is the layout this surface already shipped. */
@media (max-width: 1023px), (hover: none) and (pointer: coarse), (max-height: 579px) {
  .unlock { grid-template-columns: 1fr; }
  .unlock-panel { display: none; }
  .unlock-col { padding: 40px 24px 112px; }
}
/* The masthead stacks -- device, then title, then descriptor -- rather than
   sitting the mark beside the title. Inline, the mark pushed the title and the
   subtitle 41px in from the edge every label, field and button on the page
   starts at, and a half-indent reads as a mistake, not a hierarchy. One left
   edge from the mark to the last line of the foot is the whole claim. */
.unlock-brand {
  display: block;
  /* The page's single structural gesture: the 2px ink rule this product's
     report sets under every section head, at full column width, closing the
     masthead. It is what makes this page one of the document rather than a
     sign-in screen wearing the document's colours. */
  border-bottom: 2px solid var(--ink);
  padding-bottom: 15px; margin-bottom: 20px;
}
.unlock-brand .sb-mark {
  width: 30px; height: 30px; border-radius: 7px; font-size: 12px;
  margin-bottom: 13px;
}
.unlock h1 {
  font-size: 30px; font-weight: 600; letter-spacing: -.03em; line-height: 1.1;
  text-wrap: balance;
}
.unlock .sub { font-size: 13.5px; color: var(--ink-3); margin-top: 4px; line-height: 1.45; }
.pin-inputs { display: flex; gap: 10px; justify-content: center; margin: 20px 0 16px; }
.pin-digit {
  width: 58px; height: 68px; text-align: center; font-family: var(--mono);
  font-size: 26px; font-weight: 600; color: var(--ink);
  border: 1px solid var(--line); border-radius: 3px; background: var(--surface);
}
.pin-digit:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px rgba(27,79,138,.12); }

/* alignment guard */
/* A callout carried a 3px coloured stripe down its left edge. This world marks
   severity with a tint and a hairline in the same family -- the way .verify-bar
   already does -- and a thick coloured rule is the one device it never uses
   anywhere else. The colour now runs the whole border, so the object reads as
   one thing rather than a neutral box wearing a badge. */
.align-notice { border: 1px solid var(--line); border-radius: 3px; padding: 12px 14px; margin-bottom: 14px; }
.align-notice.high { border-color: var(--danger-line); background: var(--danger-tint-2); }
/* `warn` as well as `warning`: trends.js has always passed the short name, and
   the rule it aimed at did not exist, so those callouts rendered neutral. */
.align-notice.warning, .align-notice.warn { border-color: var(--warn-line); background: #FFFDF8; }
.align-notice.info { border-color: var(--accent-tint-line); background: var(--surface-3); }
.align-notice .t { font-weight: 600; font-size: 12.5px; margin-bottom: 5px; }
.align-notice .m { font-size: 12px; line-height: 1.65; color: var(--ink-2); }
.align-ev { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 12px; margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--line-2); }
.align-ev .k { font-size: 9.5px; letter-spacing: .06em; text-transform: uppercase; color: var(--ink-4); }
.align-ev .v { font-family: var(--mono); font-weight: 600; font-size: 12px; }
.align-ev .n { font-family: var(--mono); font-size: 10.5px; color: var(--ink-4); }
.unverified { font-family: var(--mono); font-size: 9.5px; font-weight: 600; letter-spacing: .06em; color: var(--danger); background: var(--danger-tint); border: 1px solid var(--danger-line); border-radius: 2px; padding: 2px 6px; margin-left: 10px; vertical-align: 3px; }

.muted { color: var(--ink-4); font-size: 12px; padding: 10px 0; }
.spinner { width: 16px; height: 16px; border: 2px solid var(--line); border-top-color: var(--accent); border-radius: 50%; animation: spin .7s linear infinite; }
@keyframes spin { to { transform: rotate(360deg); } }
.loading { display: flex; align-items: center; gap: 10px; padding: 30px 0; color: var(--ink-4); font-size: 12.5px; }

/* The contract-completion card is gone: its overrun, dates, completion
   activity, float basis and the engine's own sentence are a Measures row and
   its detail panel now. Removing its `.ccd` block also ends a collision that
   was never intended — the Gantt's contract-completion rule carries the same
   class (`pg-rule ccd`) and was picking up the card's border, padding and
   background. The two `.pg-rule.ccd` rules below are the real ones. */

/* the assessment strip — present only when the conclusion actually moved */
.assess {
  display: flex; gap: 13px; align-items: flex-start; margin-bottom: 14px;
  padding: 11px 14px; border: 1px solid var(--line); border-left: 3px solid var(--accent);
  border-radius: 3px; background: var(--accent-tint);
}
.assess .lbl {
  flex: none; font-weight: 600; font-size: 9.5px; letter-spacing: .1em;
  text-transform: uppercase; color: var(--accent-ink); padding-top: 2px; white-space: nowrap;
}
.assess p { margin: 0; font-size: 12px; line-height: 1.6; color: var(--ink-2); }

/* ---------------- drivers — "why", from payload.priorities (C1) ----------------
   Three cards, equal width, one column below 1000px. Three is a hard cap: the
   ranking holds twelve entries and showing them all would restate the findings
   list, which is one tab away and better at that job. */
.drivers {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; margin-bottom: 14px;
}
.driver { padding: 13px 15px; display: flex; flex-direction: column; gap: 6px; }
.driver-meta { display: flex; align-items: center; gap: 7px; }
.driver-rank {
  font-family: var(--mono); font-size: 9.5px; font-weight: 600; letter-spacing: .06em;
  color: var(--ink-4);
}
.driver h3 { font-size: 12.5px; font-weight: 600; line-height: 1.35; color: var(--ink); }
.driver p { margin: 0; font-size: 11.5px; line-height: 1.6; color: var(--ink-3); }
@media (max-width: 1000px) { .drivers { grid-template-columns: 1fr; } }

/* ------- critical-path change reasoning (C2) — cause, under effect -------
   Sits inside the critical-path card, below the two before/after columns, so a
   reader meets the explanation immediately after the thing it explains. Marked
   as AI-written: it is prose about computed facts, and which is which has to be
   legible without being loud. */
.cpwhy { border-top: 1px solid var(--line-2); padding: 12px 14px 14px; background: var(--surface-3); }
.cpwhy-head { display: flex; align-items: center; gap: 9px; margin-bottom: 8px; }
.cpwhy p { margin: 0; font-size: 12.5px; line-height: 1.7; color: var(--ink-2); max-width: 82ch; }
.cpwhy-drivers { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-top: 11px; }
.cpwhy-drivers .k {
  font-weight: 600; font-size: 9.5px; letter-spacing: .1em; text-transform: uppercase;
  color: var(--ink-4); margin-right: 2px;
}
.cpwhy-unverified {
  margin-top: 9px; font-size: 11px; line-height: 1.6; color: var(--warn-ink-3);
  background: var(--warn-tint); border: 1px solid var(--warn-line);
  border-radius: 3px; padding: 7px 10px;
}

/* ------- material vs benign description changes (C3) -------
   A renamed activity is either the same work reworded or a different feature of
   work wearing the same id. The engine classifies which; these cards say so. */
.matgrid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 11px; padding: 12px 14px 16px; }
.matcard { border: 1px solid var(--line); border-radius: 3px; padding: 11px 13px; background: var(--surface-3); }
.matcard.material { border-left: 3px solid var(--warn); background: var(--warn-tint); }
.mat-head { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.mat-flag {
  font-family: var(--mono); font-weight: 600; font-size: 9px; letter-spacing: .08em;
  border-radius: 2px; padding: 2px 6px; background: var(--line-2); color: var(--ink-3);
}
.matcard.material .mat-flag { background: var(--warn); color: var(--surface); }
.mat-desc { font-size: 11.5px; line-height: 1.6; color: var(--ink); }
.mat-desc .arw { color: var(--ink-5); margin: 0 5px; }
.mat-work { margin-top: 6px; font-size: 11px; color: var(--ink-3); font-family: var(--mono); }
.mat-reason { margin: 7px 0 0; font-size: 11.5px; line-height: 1.6; color: var(--ink-2); }
.mat-unverified {
  margin-top: 7px; font-size: 10.5px; line-height: 1.55; color: var(--warn-ink-3);
  background: var(--surface); border: 1px solid var(--warn-line);
  border-radius: 2px; padding: 6px 8px;
}
@media (max-width: 1000px) { .matgrid { grid-template-columns: 1fr; } }

/* ---------------- change vs condition charts (C4) ----------------
   Two single-series charts, never one chart with two meanings. Each carries one
   colour for its whole series — colour here says "which chart", not "which
   category", so a bar is never coloured by its rank.

   Palette note: --accent and --warn were checked with the palette validator
   against a white surface. CVD separation dE 20.0 (protan) / 18.9 (tritan) and
   normal-vision dE 23.5 both clear their thresholds, and both clear 3:1 contrast.
   The validator's lightness band flags --accent, which is a cross-series harmony
   rule for one categorical set; these are two independent single-series charts,
   and --accent is the product's established accent token. */
.chartcard + .chartcard { margin-top: 12px; }
.ch-head { display: flex; align-items: flex-start; gap: 14px; padding: 12px 14px 0; }
.ch-head .t { font-weight: 600; font-size: 12.5px; line-height: 1.3; }
.ch-head .sub { margin-top: 3px; font-size: 10.5px; line-height: 1.55; color: var(--ink-4); max-width: 62ch; }
.ch-head .tbtn {
  margin-left: auto; flex: none; height: 24px; padding: 0 9px; font-size: 11px;
  border: 1px solid var(--line); border-radius: 3px; background: var(--surface);
  color: var(--ink-2);
}
.ch-head .tbtn:hover { border-color: var(--control-line); }
.ch-body { padding: 10px 14px 14px; }
.hbar-row { display: grid; grid-template-columns: 148px 1fr 46px; align-items: center; gap: 10px; height: 26px; }
.hbar-lbl { font-size: 11.5px; color: var(--ink-2); text-align: right;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.hbar-track { position: relative; height: 100%; display: flex; align-items: center; }
.hbar-track::before {
  content: ""; position: absolute; left: 0; right: 0; top: 50%;
  border-top: 1px solid var(--line-2);
}
.hbar-fill {
  position: relative; height: 14px; border-radius: 0 4px 4px 0; min-width: 1px;
  background: var(--accent);
}
.conditions .hbar-fill { background: var(--warn); }
.hbar-fill.zero { background: var(--line); width: 2px !important; border-radius: 0; }
.hbar-val { font-family: var(--mono); font-size: 11.5px; font-weight: 600; color: var(--ink); }
.hbar-val.dim { color: var(--ink-4); font-weight: 400; }
.ch-foot { padding: 0 14px 12px; font-size: 10.5px; line-height: 1.55; color: var(--ink-4); }
.ch-filternote {
  margin: 8px 14px 12px; padding: 7px 10px; border-radius: 3px;
  background: var(--warn-tint); border: 1px solid var(--warn-line);
  font-size: 10.5px; line-height: 1.55; color: var(--warn-ink-3);
}
.chartgrid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 14px; }
.chartgrid .chartcard + .chartcard { margin-top: 0; }
@media (max-width: 1000px) { .chartgrid { grid-template-columns: 1fr; } }

/* ---------------- evidence panel (D2) ----------------
   Slides over; never navigates. A reviewer who loses their place to see why a
   number says what it says will stop asking, which defeats the point. */
.ev-scrim {
  position: fixed; inset: 0; background: rgba(18, 22, 27, .28); z-index: 90;
}
/* F3: the activity panel. The evidence drawer's frame, with the facts under
   the code, a tab row, and a four-column table whose changed rows carry a
   left stripe and whose unchanged rows are muted. */
.actp-host .ev-scrim { z-index: 95; }
.ev.actp { width: 640px; z-index: 100; }
.ev.actp .ev-h .val .unit { display: block; margin: 4px 0 0; font-size: 13px; color: var(--ink-2); }
.actp-facts { display: flex; flex-wrap: wrap; gap: 6px 16px; margin-top: 10px; }
.actp-fact { display: inline-flex; align-items: baseline; gap: 5px; font-size: 11.5px; }
.actp-fact .k { color: var(--ink-4); }
.actp-fact .v { font-family: var(--mono); color: var(--ink); }
.actp-fact.hi .v { color: var(--danger); font-weight: 600; }
.actp-fact.warn .v { color: var(--warn); }
.actp-nav { display: flex; align-items: center; gap: 6px; margin-top: 10px; }
.actp-nav .n { font-size: 11px; color: var(--ink-4); margin-left: 4px; }
.actp-tabs { display: flex; flex-wrap: wrap; gap: 2px; border-bottom: 1px solid var(--line); margin: 0 0 12px; }
.actp-tabs .tab {
  border: 0; background: none; font: inherit; font-size: 12px; padding: 6px 9px; color: var(--ink-3); cursor: pointer;
  border-bottom: 2px solid transparent; margin-bottom: -1px; display: inline-flex; align-items: center; gap: 5px;
}
.actp-tabs .tab:hover { color: var(--ink); }
.actp-tabs .tab.on { color: var(--ink); font-weight: 600; border-bottom-color: var(--ink); }
.actp-tabs .tab .cnt { font-family: var(--mono); font-size: 10px; color: var(--danger); }
.ev .actp-table { margin-bottom: 18px; }
.ev .actp-table th.v { font-family: var(--mono); text-transform: none; letter-spacing: 0; }
.ev .actp-table td { padding: 5px 8px; border-bottom: 1px solid var(--line-2); vertical-align: top; }
.ev .actp-table td.f { color: var(--ink-2); }
.ev .actp-table td.v { font-size: 11px; }
.ev .actp-table td.d { font-family: var(--mono); font-size: 10.5px; white-space: nowrap; text-align: right; }
.ev .actp-table td.d.on { color: var(--danger); font-weight: 600; }
.ev .actp-table td.d.off { color: var(--ink-5); }
.ev .actp-table tr.same td { color: var(--ink-4); }
.ev .actp-table tr.same td.v { color: var(--ink-4); }
.ev .actp-table tr.chg td.f { box-shadow: inset 3px 0 0 var(--danger); padding-left: 10px; }
.ev .actp-table tr.grp td { font-weight: 600; font-size: 10px; letter-spacing: .08em; text-transform: uppercase; color: var(--ink-4); padding-top: 12px; border-bottom: 0; }
.ev .actp-table td .n { font-size: 11px; color: var(--ink-3); }
.ev .actp-table td .chip.cp { margin-left: 6px; }
.actp-finding { cursor: pointer; background: none; font: inherit; }
.actp-finding .rb { font-family: var(--mono); font-size: 10px; padding: 1px 6px; border-radius: 3px; border: 1px solid var(--line); color: var(--ink-3); }
.actp-foot { display: flex; align-items: center; gap: 10px; margin-top: 18px; padding-top: 12px; border-top: 1px solid var(--line); }
.actp-foot .n { font-size: 10.5px; color: var(--ink-4); }
.ev {
  position: fixed; top: 0; right: 0; bottom: 0; width: 560px; max-width: 94vw;
  background: var(--surface); border-left: 1px solid var(--line);
  z-index: 100; display: flex; flex-direction: column;
  animation: evslide .18s cubic-bezier(.4, 0, .2, 1);
}
@keyframes evslide { from { transform: translateX(18px); opacity: .4; } to { transform: none; opacity: 1; } }
.ev-h { padding: 16px 20px 14px; border-bottom: 1px solid var(--line); position: relative; }
.ev-h .lbl { font-size: 11.5px; color: var(--ink-4); padding-right: 30px; }
.ev-h .val {
  font-family: var(--mono); font-weight: 600; font-size: 27px; line-height: 1.1;
  letter-spacing: -.02em; margin-top: 4px;
}
.ev-h .unit { font-family: var(--sans); font-size: 12px; font-weight: 400; color: var(--ink-3); margin-left: 7px; }
.ev-x {
  position: absolute; top: 12px; right: 14px; border: 0; background: none;
  color: var(--ink-4); font-size: 17px; line-height: 1; padding: 5px 7px; border-radius: 3px;
}
.ev-x:hover { background: var(--surface-2); color: var(--ink); }
.ev-b { padding: 16px 20px; overflow-y: auto; flex: 1; }
.ev-meta { display: grid; grid-template-columns: 88px 1fr; gap: 9px 14px; font-size: 11.5px; margin-bottom: 18px; }
.ev-meta dt { color: var(--ink-4); }
.ev-meta dd { margin: 0; color: var(--ink-2); line-height: 1.6; }
.ev-meta dd.mono { font-family: var(--mono); font-size: 10.5px; }
.ev-rows-h { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; }
.ev-rows-h .k {
  font-weight: 600; font-size: 9.5px; letter-spacing: .1em; text-transform: uppercase;
  color: var(--ink-4);
}
.ev-rows-h .btn { margin-left: auto; }
.ev-note {
  margin-bottom: 10px; padding: 8px 10px; border-radius: 3px;
  background: var(--warn-tint); border: 1px solid var(--warn-line);
  font-size: 10.5px; line-height: 1.55; color: var(--warn-ink-3);
}
.ev table { width: 100%; border-collapse: collapse; font-size: 11.5px; }
.ev th {
  text-align: left; font-weight: 500; font-size: 10px; letter-spacing: .04em;
  text-transform: uppercase; color: var(--ink-4); padding: 5px 8px;
  border-bottom: 1px solid var(--line); position: sticky; top: 0; background: var(--surface);
}
.ev th button { border: 0; background: none; padding: 0; font: inherit; color: inherit;
  letter-spacing: inherit; text-transform: inherit; }
.ev th button:hover { color: var(--ink); }
.ev td { padding: 5px 8px; border-bottom: 1px solid var(--line-2); color: var(--ink-2); }
.ev td.id { font-family: var(--mono); color: var(--ink); }
.ev td.num { text-align: right; font-family: var(--mono); }
.ev-f {
  padding: 10px 20px; border-top: 1px solid var(--line);
  font-size: 10.5px; color: var(--ink-4); display: flex; justify-content: space-between; gap: 12px;
}
.ev-f .src { font-family: var(--mono); }

/* Activity inspector: the shared slate theme, with a fixed header and tabs
   around one scrolling comparison. Values and change flags remain server-led. */
.actp-host { font: var(--type-body); color: var(--ink); }
.actp-host .ev-scrim { background: color-mix(in srgb, var(--ink) 28%, transparent); }
.actp-host .ev.actp {
  width: min(760px, calc(100vw - 24px)); max-width: none; height: 100dvh;
  background: var(--surface); border-left-color: var(--line); box-shadow: var(--shadow-4);
  overflow: hidden; outline: none; animation: actp-enter var(--t-med) var(--ease) both;
}
@keyframes actp-enter { from { transform: translateX(24px); } to { transform: translateX(0); } }
.actp-host .actp .ev-h { padding: 14px 24px 18px; border: 0; flex: none; }
.actp-host .actp-topline { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 14px; }
.actp-host .actp-eyebrow { font: var(--type-caption); color: var(--ink-4); white-space: nowrap; }
.actp-host .actp-tools, .actp-host .actp-step { display: flex; align-items: center; gap: 6px; }
.actp-host .actp-step { padding-right: 12px; margin-right: 6px; border-right: 1px solid var(--line-2); }
.actp-host .actp-step .n { margin-right: 6px; font: var(--type-caption); font-variant-numeric: tabular-nums; color: var(--ink-4); white-space: nowrap; }
.actp-host .actp .ev-x {
  position: static; display: grid; place-items: center; width: 30px; height: 30px;
  padding: 0; border: 0; border-radius: var(--radius-sm); font: var(--type-heading);
  background: transparent; color: var(--ink-4); flex: none;
}
.actp-host .actp .ev-x:hover { background: var(--surface-2); color: var(--ink); }
.actp-host .actp .ev-h .lbl {
  font: var(--type-caption); color: var(--ink-4); padding: 0; margin-bottom: 8px;
  overflow: hidden; white-space: nowrap; text-overflow: ellipsis;
}
.actp-host .actp .ev-h .val { margin: 0; font: var(--type-body); letter-spacing: 0; }
.actp-host .actp-code { display: block; font: var(--type-caption); font-family: var(--mono); color: var(--ink-3); margin-bottom: 5px; overflow-wrap: anywhere; }
.actp-host .actp .ev-h .val .unit {
  margin: 0; font: var(--type-title); letter-spacing: var(--type-title-tracking); color: var(--ink);
  overflow-wrap: anywhere;
}
.actp-host .actp-facts { display: grid; grid-template-columns: .9fr 1.25fr .85fr 1.25fr; gap: 12px 20px; margin-top: 16px; }
.actp-host .actp-fact { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.actp-host .actp-fact .k { font: var(--type-caption); color: var(--ink-4); }
.actp-host .actp-fact .v { font: var(--type-body); font-weight: var(--weight-medium); font-variant-numeric: tabular-nums; color: var(--ink-2); overflow-wrap: anywhere; }
.actp-host .actp-fact.hi .v { color: var(--danger); }
.actp-host .actp-fact.warn { grid-column: 1 / -1; flex-direction: row; gap: 8px; }
.actp-host .actp-fact.warn .v { color: var(--warn); }
.actp-host .actp-tabs {
  flex: none; flex-wrap: nowrap; gap: 2px; margin: 0; padding: 0 20px;
  border-top: 1px solid var(--line-2); border-bottom: 1px solid var(--line);
  overflow-x: auto; background: var(--surface); scrollbar-width: thin;
}
.actp-host .actp-tabs .tab {
  flex: none; min-height: 42px; margin: 0; padding: 9px 8px;
  font: var(--type-caption); color: var(--ink-4); white-space: nowrap;
  border-bottom: 2px solid transparent; transition: color var(--t-fast) var(--ease), background var(--t-fast) var(--ease);
}
.actp-host .actp-tabs .tab:hover { color: var(--ink); background: var(--surface-4); }
.actp-host .actp-tabs .tab.on { color: var(--accent); border-bottom-color: var(--accent); font-weight: var(--weight-strong); }
.actp-host .actp-tabs .tab .cnt {
  display: inline-grid; place-items: center; min-width: 18px; padding: 1px 4px;
  border-radius: var(--radius-sm); background: var(--surface-2); color: var(--ink-3);
  font: var(--type-caption); font-variant-numeric: tabular-nums;
}
.actp-host .actp-tabs .tab.on .cnt { background: var(--accent-tint); color: var(--accent); }
.actp-host .actp .ev-b { min-height: 0; padding: 0 24px 20px; overflow: auto; overscroll-behavior: contain; scrollbar-width: thin; scrollbar-color: var(--input-line) transparent; }
.actp-host .actp-table { margin: 0 0 20px; width: 100%; table-layout: fixed; border-collapse: separate; border-spacing: 0; }
.actp-host .actp-fields th:first-child { width: 24%; }
.actp-host .actp-fields th:nth-child(2), .actp-host .actp-fields th:nth-child(3) { width: 27%; }
.actp-host .actp-fields th:last-child { width: 22%; text-align: right; }
.actp-host .actp-table th, .actp-host .actp-table th.v {
  position: sticky; top: 0; z-index: 1; padding: 12px 10px; background: var(--surface);
  border-bottom: 1px solid var(--line); font: var(--type-caption); font-weight: var(--weight-strong);
  color: var(--ink-2); text-transform: none; letter-spacing: 0; vertical-align: bottom; overflow-wrap: anywhere;
}
.actp-host .actp-file-kind { display: block; font: var(--type-caption); color: var(--ink-4); margin-bottom: 3px; }
.actp-host .actp-column-label { display: block; }
.actp-host .actp-table td, .actp-host .actp-table td.v, .actp-host .actp-table td.d {
  padding: 9px 10px; border-bottom: 1px solid var(--line-2); font: var(--type-body);
  font-variant-numeric: tabular-nums; vertical-align: top; overflow-wrap: anywhere; white-space: normal;
}
.actp-host .actp-table td.f { color: var(--ink-2); }
.actp-host .actp-table td.v { color: var(--ink-3); }
.actp-host .actp-table td.current { color: var(--ink); font-weight: var(--weight-medium); }
.actp-host .actp-table td.d { text-align: right; }
.actp-host .actp-table td.d.off, .actp-host .actp-table tr.same td, .actp-host .actp-table tr.same td.v { color: var(--ink-4); }
.actp-host .actp-table tr.chg td { background: var(--surface-4); }
.actp-host .actp-table tr.chg td.f { box-shadow: inset 2px 0 0 var(--accent); padding-left: 10px; }
.actp-host .actp-table tr.chg td.current { background: var(--accent-wash); }
.actp-host .actp-table .actp-delta { display: inline-block; }
.actp-host .actp-table td.d.on .actp-delta {
  padding: 1px 6px; border-radius: var(--radius-sm); background: var(--danger-tint-2);
  color: var(--danger); font: var(--type-caption); font-weight: var(--weight-strong); white-space: nowrap;
}
.actp-host .actp-table tr.grp td {
  padding: 16px 10px 8px; border: 0; background: var(--surface); color: var(--ink-3);
  font: var(--type-caption); font-weight: var(--weight-strong); text-transform: none; letter-spacing: 0;
}
.actp-host .actp-table tbody tr:not(.grp):hover td { background: var(--surface-2); }
.actp-host .actp-table td .n { display: block; font: var(--type-body); color: var(--ink-3); margin-top: 4px; }
.actp-host .actp-rels .actp-table th:first-child { width: 50%; }
.actp-host .actp-rels .actp-table th:nth-child(2) { width: 25%; }
.actp-host .actp-rels .actp-table th:last-child { width: 25%; text-align: right; }
.actp-host .actp .ev-rows-h { margin: 20px 0 10px; }
.actp-host .actp .ev-rows-h .k { font: var(--type-caption); font-weight: var(--weight-strong); color: var(--ink-3); text-transform: none; letter-spacing: 0; }
.actp-host .actp .secnote { font: var(--type-caption); color: var(--ink-4); padding: 0 0 8px; background: none; border: 0; }
.actp-host .actp .tracecard { gap: 8px; padding: 10px 12px; border-color: var(--line-2); border-radius: var(--radius-sm); font: var(--type-body); }
.actp-host .actp .tracecard .nm { font: var(--type-body); color: var(--ink-2); }
.actp-host .actp .tracecard .mt { font: var(--type-caption); color: var(--ink-4); }
.actp-host .actp .btn { min-height: 30px; height: auto; font: var(--type-caption); padding: 5px 10px; border-radius: var(--radius-sm); }
.actp-host .actp .actp-step .btn { box-shadow: none; background: var(--surface); }
.actp-host .actp-foot { flex: none; flex-wrap: wrap; justify-content: space-between; gap: 8px 16px; margin: 0; padding: 12px 24px; background: var(--surface); border-top: 1px solid var(--line); }
.actp-host .actp-nav { margin: 0; flex-wrap: wrap; gap: 8px; }
.actp-host .actp-nav .actp-why { color: var(--accent); background: var(--accent-tint); border-color: var(--accent-tint-line); box-shadow: none; }
.actp-host .actp-foot .n { width: 100%; font: var(--type-caption); color: var(--ink-4); }
.actp-host .actp button:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
@media (max-width: 600px) {
  .actp-host .ev.actp { width: 100vw; border-left: 0; }
  .actp-host .actp .ev-h { padding: 10px 16px 14px; }
  .actp-host .actp-topline { gap: 6px; margin-bottom: 12px; }
  .actp-host .actp-step { padding-right: 6px; margin-right: 0; gap: 4px; }
  .actp-host .actp .actp-step .btn { padding: 4px 6px; }
  .actp-host .actp-step .n { margin-right: 2px; }
  .actp-host .actp-facts { grid-template-columns: 1fr 1fr; gap: 10px 16px; margin-top: 12px; }
  .actp-host .actp-tabs { padding: 0 10px; }
  .actp-host .actp .ev-b { padding: 0 10px 16px; }
  .actp-host .actp-table th, .actp-host .actp-table th.v, .actp-host .actp-table td,
  .actp-host .actp-table td.v, .actp-host .actp-table td.d { padding: 9px 6px; font: var(--type-caption); }
  .actp-host .actp-file-kind { font-size: var(--mark-size); }
  .actp-host .actp-fields th:first-child { width: 25%; }
  .actp-host .actp-fields th:nth-child(2), .actp-host .actp-fields th:nth-child(3) { width: 26%; }
  .actp-host .actp-fields th:last-child { width: 23%; }
  .actp-host .actp-table td.d.on .actp-delta { padding: 1px 3px; white-space: normal; }
  .actp-host .actp-foot { padding: 10px 16px; gap: 8px; }
}
@media (prefers-reduced-motion: reduce) {
  .actp-host .ev.actp { animation: none; }
}

/* the affordance (D3) — a number you can open */
.numlink {
  border: 0; background: none; padding: 2px 1px; font: inherit; color: inherit;
  border-bottom: 1px dashed var(--control-line); cursor: pointer;
  min-height: 24px; line-height: inherit;
}
.numlink:hover { border-bottom-style: solid; border-bottom-color: var(--accent); color: var(--accent); }
.numlink:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* section kind + disclosed basis (BUG 3 / BUG 8) */
.kindtag {
  margin-left: 8px; font-family: var(--mono); font-size: 9px; letter-spacing: .06em;
  text-transform: uppercase; color: var(--warn); background: var(--warn-tint);
  border-radius: 2px; padding: 1px 5px;
}
.kindtag.view { color: var(--ink-4); background: var(--line-2); }
.basis { font-size: 10.5px; color: var(--ink-4); margin-top: 2px; }
.rollup-src { font-size: 10px; color: var(--ink-4); margin-top: 2px; font-family: var(--mono); }
.cbrow.disabled { opacity: .55; cursor: not-allowed; }
/* schedule provenance — what the file says about itself */
.provenance { display: grid; grid-template-columns: 150px 1fr; gap: 7px 16px; font-size: 11.5px; margin: 0; }
.provenance dt { color: var(--ink-4); }
.provenance dd { margin: 0; color: var(--ink-2); }
.provenance dd.mono { font-family: var(--mono); font-size: 11px; color: var(--ink); }
.prov-rule { grid-column: 1 / -1; border-top: 1px solid var(--line-2); margin: 4px 0; }
/* what the report does not know, stated before any of its numbers */
.completeness {
  flex: none; display: flex; align-items: baseline; gap: 18px; flex-wrap: wrap;
  padding: 8px 20px; background: var(--surface-2); border-bottom: 1px solid var(--line);
  font-size: 11px; line-height: 1.5;
}
.completeness.warn { background: var(--warn-tint); border-bottom-color: var(--warn-line); }
.completeness .cf { display: inline-flex; align-items: baseline; gap: 6px; }
.completeness .k {
  font-size: 9px; letter-spacing: .08em; text-transform: uppercase; color: var(--ink-4);
}
.completeness .v { font-family: var(--mono); font-size: 11px; color: var(--ink-2); }
.completeness .cf.bad .v { color: var(--danger); font-weight: 600; }
.completeness .cf.note { flex: 1 1 100%; color: var(--warn-ink-3); font-family: var(--sans); }
.sub-note.gap { color: var(--ink-4); }
/* the section note — what this section counts, and how it differs from its neighbours */
.secnote {
  font-size: 10.5px; line-height: 1.6; color: var(--ink-3); margin-bottom: 10px;
  padding: 8px 10px; background: var(--surface-2); border-left: 2px solid var(--line);
  border-radius: 0 2px 2px 0; max-width: 96ch;
}
/* a section note that qualifies its own number (N-round QA: retype halves) */
.secnote.warnnote { color: var(--warn); }
/* Python's own account of the slip, above the model's prose */
.cpwhy-computed {
  font-size: 12px; line-height: 1.65; color: var(--ink); margin-bottom: 10px;
  padding: 9px 11px; background: var(--surface); border: 1px solid var(--line);
  border-left: 3px solid var(--accent); border-radius: 0 2px 2px 0; max-width: 82ch;
}
.cpwhy-legend { margin-top: 9px; font-size: 10.5px; line-height: 1.55; color: var(--ink-4); max-width: 82ch; }
/* budget movement: the subtraction the report never showed */
.costrow { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
.costcell { border: 1px solid var(--line); border-radius: 3px; padding: 11px 13px; background: var(--surface-3); }
.costcell .v { font-family: var(--mono); font-weight: 600; font-size: 19px; letter-spacing: -.02em; margin: 6px 0 3px; }
.costcell .n { font-size: 10.5px; color: var(--ink-4); }
.costcell.net { border-left: 3px solid var(--warn); background: var(--warn-tint); }
.costcell.net.flat { border-left-color: var(--ok); background: var(--ok-tint); }
.costcell.net.flat .v { color: var(--ok); }
.costpairs { margin-top: 14px; border-top: 1px solid var(--line-2); padding-top: 11px; }
.costpair { display: flex; align-items: center; gap: 8px; margin-top: 6px; font-size: 11.5px; }
.costpair .amt { font-family: var(--mono); font-size: 11px; font-weight: 600; }
.costpair .amt.up { color: var(--ok); }
.costpair .amt.dn { color: var(--danger); }
.costpair .arw { color: var(--ink-5); }
/* what a grouped finding's count actually counts */
.findsub { display: block; font-weight: 400; font-size: 10.5px; color: var(--ink-4); margin-top: 2px; }
.tracecard.done { opacity: .5; text-decoration: line-through; }
/* a DCMA status that is not the plain value-vs-threshold result, and a pass that
   is only a consequence of another metric's failure */
.dcma-override, .dcma-note {
  font-size: 10.5px; line-height: 1.55; margin-top: 5px; padding: 6px 8px;
  border-radius: 2px; max-width: 62ch;
}
.dcma-override { color: var(--warn-ink-3); background: var(--warn-tint); border: 1px solid var(--warn-line); }
.dcma-note { color: var(--ink-3); background: var(--surface-2); border: 1px solid var(--line); }
.overridden {
  display: block; margin-top: 4px; font-size: 9px; letter-spacing: .06em;
  text-transform: uppercase; color: var(--ink-4);
}
/* the DCMA checks this comparison does not compute */
.uncomputed { margin-top: 8px; display: grid; gap: 7px; }
.uncomputed-row { display: grid; grid-template-columns: 26px 1fr; gap: 10px; align-items: start; }
.uncomputed-row .n {
  font-family: var(--mono); font-size: 11px; font-weight: 600; color: var(--ink-4);
  text-align: right; padding-top: 1px;
}
.uncomputed-row .m { font-size: 11.5px; font-weight: 500; color: var(--ink-2); }
.uncomputed-row .why { font-size: 10.5px; line-height: 1.55; color: var(--ink-4); margin-top: 2px; max-width: 72ch; }
.chart-note { font-size: 11.5px; line-height: 1.6; color: var(--ink-2); }

/* --- an activity code you can ask a question of ------------------------- *
 * Every activity ID in the report answers "where else is this counted?".
 * The affordance has to be quiet: these sit inside dense tables and chip rows
 * where a button that looks like a button would swamp the data. Underline on
 * hover and focus only, and the code keeps whatever type its context gives it. */
button.codelink {
  font: inherit; color: inherit; background: none; border: 0; padding: 0;
  margin: 0; cursor: pointer; text-align: inherit;
}
button.codelink:hover { text-decoration: underline; }
button.codelink:focus-visible {
  outline: 2px solid var(--accent); outline-offset: 1px; border-radius: 2px;
}
button.acode.codelink {
  font-family: var(--mono); font-size: 10px; color: var(--accent);
  background: var(--surface-2); border: 1px solid var(--line-2);
  border-radius: 2px; padding: 1px 5px;
}
button.id.codelink { font-family: var(--mono); font-size: 11.5px; color: var(--accent); }
button.codeplain.codelink { font: inherit; color: inherit; }

/* --- narrative footer: when it was written, and what can be done to it --- */
.narr-foot {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  padding: 10px 14px; border-top: 1px solid var(--line-2); background: var(--surface-3);
}
.narr-acts { display: flex; gap: 6px; margin-left: auto; }

/* --- narrative "by section" bullets (N09) --------------------------------
 * The bullet is a button because it does something on click: it opens the
 * rows underneath it, in place. "Open section" is the separate jump, kept
 * separate because a jump costs the reader their place in the narrative and
 * the two are not interchangeable. */
.narr-secs { border-top: 1px solid var(--line-2); background: var(--surface-3); padding: 4px 0 6px; }
.narr-secs-h {
  font-size: 10px; font-weight: 600; letter-spacing: .07em; text-transform: uppercase;
  color: var(--ink-4); padding: 6px 14px 4px;
}
.narr-sec {
  display: flex; align-items: flex-start; gap: 8px;
  padding: 4px 14px; border-top: 1px solid var(--line);
}
.narr-sec:first-of-type { border-top: 0; }
.narr-sec input[type="checkbox"] { margin-top: 3px; flex: none; }
.narr-sec-t {
  flex: 1; text-align: left; background: none; border: 0; padding: 1px 0;
  font: inherit; font-size: 12px; line-height: 1.5; color: var(--ink-2); cursor: pointer;
}
.narr-sec-t:hover:not(:disabled) { color: var(--ink); text-decoration: underline; }
.narr-sec-t:disabled { cursor: default; color: var(--ink-4); }
.narr-sec-t .n {
  font-family: var(--mono); font-size: 10px; color: var(--ink-4);
  border: 1px solid var(--line-2); border-radius: 2px; padding: 0 4px; margin-left: 6px;
  white-space: nowrap;
}
.narr-sec-jump { flex: none; }
.narr-sec.dropped .narr-sec-t { text-decoration: line-through; color: var(--ink-5); }
.narr-sec-rows { padding: 0 14px 8px 36px; overflow-x: auto; }
.narr-sec-rows .grid { font-size: 11px; }

/* --- critical path as one aligned diff ---------------------------------- *
 * Was two columns of unequal length, unaligned after the first difference,
 * with the change carried by colour alone. */
.cpbar {
  display: flex; align-items: center; gap: 14px;
  padding: 10px 14px; border-bottom: 1px solid var(--line-2); background: var(--surface-3);
}
table.cpdiff td.cpmark {
  font-family: var(--mono); font-weight: 700; text-align: center; color: var(--ink-4);
}
table.cpdiff tr.gone td { color: var(--ink-3); }
table.cpdiff tr.gone td.cpmark { color: var(--danger); }
table.cpdiff tr.gone td.id { text-decoration: line-through; }
table.cpdiff tr.joined td.cpmark { color: var(--accent); }
table.cpdiff td.num.tf { font-family: var(--mono); }
table.cpdiff td.num.tf.neg { color: var(--danger); }
table.cpdiff td.num.tf.zero { color: var(--warn); }
.chip.drv {
  margin-left: 6px; font-family: var(--mono); font-size: 9px; letter-spacing: .04em;
  color: var(--accent); background: var(--accent-tint); border: 1px solid var(--accent-tint-line);
}

/* Total float wherever it appears, one shape. */
.tracecard .mt.tf.neg, .mt.tf.neg { color: var(--danger); }
.tracecard .mt.tf.zero, .mt.tf.zero { color: var(--warn); }
.tracecard .mt { margin-left: auto; }

/* The import confirmation screen carries a per-file table; it needs the room. */
.modal.wide { max-width: 980px; width: calc(100vw - 64px); }
.modal.wide .modal-body { max-height: 70vh; overflow-y: auto; }

/* The decision log on a schedule: when, who, what. */
.auditrow { display: flex; gap: 12px; padding: 8px 0; border-top: 1px solid var(--line-2); }
.auditrow .when { font-family: var(--mono); font-size: 10.5px; color: var(--ink-4); min-width: 108px; }

/* A reason travels with a review decision; the history of one sits under it. */
.reasonbox { margin: 14px 0 4px; }
.reasonbox input { width: 100%; }
.histbox:not(:empty) { margin: 12px 0 4px; padding-top: 4px; }

/* Which way a DCMA metric moved since the last update. */
.dcma-dir { font-size: 10px; margin-left: 4px; }
.dcma-dir.improved { color: var(--ok); }
.dcma-dir.worsened { color: var(--danger); }

/* Disposition: whether a finding becomes a comment the government issues. */
.dispbox { margin: 16px 0 4px; padding: 12px 13px; border: 1px solid var(--line);
           border-radius: 3px; background: var(--surface-3); }
.dispbtns { display: flex; gap: 6px; margin: 8px 0; }
.dispbtns .btn.on { color: var(--accent); border-color: var(--accent);
                    background: var(--accent-tint); }
.dispbox textarea { width: 100%; }

/* The comment list: the reviewer's own deliverable. */
.cmtitem { padding: 13px 14px; border-bottom: 1px solid var(--line-2); }
.cmthead { display: flex; align-items: center; gap: 9px; margin-bottom: 7px; }
.cmthead .ref { font-family: var(--mono); font-size: 12px; font-weight: 700; color: var(--accent); }
.cmthead .t { font-size: 12.5px; font-weight: 500; }
.cmthead .spec { margin-left: auto; font-family: var(--mono); font-size: 10px; color: var(--ink-4); }
.cmtitem p { margin: 0 0 8px; font-size: 12.5px; line-height: 1.65; color: var(--ink-2); }
.cmtnote { border-left: 2px solid var(--accent); padding-left: 10px; margin: 8px 0; }
.cmtnote .k { font-size: 10px; letter-spacing: .06em; text-transform: uppercase; color: var(--ink-4); margin-bottom: 3px; }

/* A control the role may not use is not shown as a disabled button; where the
   shape has to stay (the queue checkbox) it reads as a state, not an offer. */
.cbx.readonly { cursor: default; opacity: .45; }
.respbox { margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--line-2); }
.respbox textarea { width: 100%; }

/* Delete, per project row. Always visible: it was hover-only, which means a
   control nobody can find and nobody can reach by keyboard scan. Quiet in
   weight, not hidden — the confirmation is what makes it safe, not obscurity. */
.rowdel {
  font-size: 11px; line-height: 1; color: var(--ink-4);
  background: none; border: 1px solid var(--line-2); padding: 4px 8px;
  border-radius: 3px; cursor: pointer; transition: color .12s, border-color .12s;
}
.rowdel:hover {
  color: var(--danger); border-color: var(--danger); background: var(--danger-tint);
}
.rowdel:focus-visible { outline: 2px solid var(--danger); outline-offset: 1px; }

/* The project's own destructive section, at the bottom of its settings. */
.card.danger-card { border-color: #E7C9C9; }
.card.danger-card .card-title { color: var(--danger); }

/* The storage picker: a folder can hold fifty updates, so it scrolls and carries
   a select-all header that stays put. */
.picklist { max-height: 300px; overflow-y: auto; margin-top: 8px;
            border: 1px solid var(--line-2); border-radius: 3px; }
.picklist-head {
  position: sticky; top: 0; z-index: 1;
  display: flex; align-items: center; gap: 12px;
  padding: 8px 10px; background: var(--surface-3);
  border-bottom: 1px solid var(--line-2);
}
.picklist-head .live { margin-left: auto; }
.picklist .cbrow { padding: 7px 10px; }
.picklist .cbrow.disabled { opacity: .5; }

/* --- sign in / create organization --------------------------------------- */
/* 5px inside the group, 18px between groups. At 6/14 a hint sat almost as far
   from its own field as from the next label and belonged to neither. */
.unlock-card .field { margin-bottom: 18px; }
.unlock-card .field label {
  display: block; font-size: 12px; font-weight: 500; color: var(--ink-2);
  margin-bottom: 6px; letter-spacing: -.005em;
}
.unlock-card input {
  width: 100%; height: 40px; padding: 0 12px; font-size: 13.5px;
  background: var(--surface);
  /* --input-line is 1.49:1 on white; --control-line is the file's own
     WCAG 1.4.11 token at 3.55:1, and a boundary you cannot see is not a
     boundary. Scoped to this surface so the app shell is untouched. */
  border: 1px solid var(--control-line); border-radius: 8px;
  color: var(--ink); transition: border-color .12s ease, box-shadow .12s ease;
}
.unlock-card input::placeholder { color: var(--ink-placeholder); }
.unlock-card input:hover { border-color: var(--ink-2); }
/* The focus ring is the brand's, not the browser's blue: on warm paper a
   #1B4FD8 halo is the one element that announces it was never looked at. */
.unlock-card input:focus,
.unlock-card input:focus-visible {
  outline: none; border-color: var(--brand-accent);
  box-shadow: 0 0 0 3px rgba(180, 83, 26, .16);
}
/* 12px, not 11.5: these hints carry a real requirement ("At least 8
   characters."), and functional text on this surface sits at or above the
   12px floor. */
.unlock-card .field .hint { font-size: 12px; color: var(--ink-4); margin-top: 5px; }

/* The mode switch sits under the ink rule and marks the live side with a 1px
   underline, not a second 2px one. Two ink marks of the same weight compete,
   and the earlier arrangement spent the report's section rule on a tab
   indicator; 2px section over 1px live-mode is a hierarchy that reads at a
   glance and still gives a tab the affordance it needs. No container hairline
   either -- the rule above already closed the masthead. */
.auth-seg {
  display: flex; width: 100%; gap: 20px; margin: 0 0 24px;
  border: 0; border-radius: 0; background: none; overflow: visible;
}
.auth-seg button {
  flex: none; justify-content: flex-start; padding: 0 0 5px;
  background: none; border: 0; border-bottom: 1px solid transparent;
  border-radius: 0;
  font-size: 13.5px; font-weight: 500; color: var(--ink-4);
  transition: color .12s ease, border-color .12s ease;
}
.auth-seg button:hover {
  background: none; color: var(--ink-2); border-bottom-color: var(--line);
}
.auth-seg button.on {
  background: none; color: var(--ink); font-weight: 600;
  border-bottom-color: var(--ink);
}
.auth-seg button:focus-visible {
  outline: 2px solid var(--brand-accent); outline-offset: 3px; border-radius: 3px;
}

.unlock-card .btn.primary { height: 40px; font-size: 13.5px; border-radius: 8px; }
.unlock-card .btn.primary:disabled { background: var(--ink-5); border-color: var(--ink-5); }
/* This page has no card, no fill and no shadow anywhere, so its error cannot
   arrive as a tinted rounded panel -- that was the single object on the surface
   contradicting the world. It arrives the way a document flags an exception:
   in words, on the same left edge, in the ink reserved for it. --danger is
   7.3:1 on paper, so nothing is lost by dropping the tint. */
.unlock-card .err, .unlock-card .msg-ok {
  background: none; border: 0; border-radius: 0; padding: 0;
  margin: 0 0 16px; font-size: 12.5px; font-weight: 500; line-height: 1.5;
}
.auth-or {
  display: flex; align-items: center; gap: 12px;
  margin: 22px 0 14px; color: var(--ink-4); font-size: 12px;
}
.auth-or::before, .auth-or::after {
  content: ""; flex: 1; height: 1px; background: var(--line);
}
/* Same WCAG 1.4.11 correction as the fields above it, and it matters more here:
   this control's white fill is ~1.03:1 against the paper, so its border is its
   only boundary. Inherited from .btn it was --input-line at 1.49:1, which left
   the weaker of the column's two boundaries on the click target. .btn:hover
   goes to --ink-5, LIGHTER than the resting value, so hover moves with it. */
.unlock-card .google-btn {
  width: 100%; height: 40px; justify-content: center; gap: 9px;
  text-decoration: none; font-weight: 500; border-radius: 8px;
  border-color: var(--control-line);
}
.unlock-card .google-btn:hover { border-color: var(--ink-2); }

/* The account menu hangs off the top bar, so that corner has to be a
   positioning context — otherwise the popover anchors to the page. */
.topbar-right { position: relative; }
.popover.usermenu-pop { width: 268px; }
.popover.usermenu-pop .pf { border-bottom: 1px solid var(--line-2); }

/* "Forgot your password?" / "Back to sign in" — the quiet way off a form.
   Left, with everything else: a centred line under a left-aligned column is
   the one place the page stopped being precise. */
.auth-alt { margin: 14px 0 0; text-align: left; font-size: 12.5px; }
/* ink-2/500, above the free-tool exit below it: "Forgot your password?" is the
   second-most-used control on a sign-in page and was reading as the quietest
   thing in the column. */
.auth-alt a {
  color: var(--ink-2); font-weight: 500; text-decoration: none;
  border-bottom: 1px solid var(--line); padding-bottom: 1px;
  transition: color .12s ease, border-color .12s ease;
}
.auth-alt a:hover { color: var(--ink); border-bottom-color: var(--ink); }
.auth-alt a:focus-visible {
  outline: 2px solid var(--brand-accent); outline-offset: 3px; border-radius: 2px;
}

/* Unconfirmed-address strip. Warn, not danger: nothing is broken and nothing is
   blocked, so it must not wear the same colour as a stale-analysis error. */
.verify-bar {
  flex: none; display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 8px 20px; background: var(--warn-tint); border-bottom: 1px solid var(--warn-line);
  color: var(--warn-ink); font-size: 11.5px; line-height: 1.5;
}
.verify-bar span { flex: 1; min-width: 200px; }
.btn.small { height: 24px; padding: 0 9px; font-size: 11px; }
.btn.ghost { background: none; border-color: transparent; color: var(--ink-3); }
.btn.ghost:hover { border-color: var(--line); background: var(--surface); }

/* A way out of the sign-in page for someone who has no account yet. */
.auth-free {
  margin: 24px 0 0; padding-top: 16px; border-top: 1px solid var(--line);
  font-size: 12px; line-height: 1.6; color: var(--ink-4); text-align: left;
  text-wrap: pretty;
}
.auth-free a {
  color: var(--ink-2); font-weight: 500;
  border-bottom: 1px solid var(--line); padding-bottom: 1px;
  transition: color .12s ease, border-color .12s ease;
}
.auth-free a:hover { color: var(--ink); border-bottom-color: var(--ink); }

/* What a schedule deletion takes with it, listed before it happens. */
.del-scope { margin: 0; padding-left: 18px; }
.del-scope li { margin: 0 0 7px; font-size: 12.5px; line-height: 1.5; color: var(--ink-2); }
.del-scope li:last-child { margin-bottom: 0; color: var(--ink-3); }
.del-scope b { color: var(--ink); }

/* --------------------------------------------------------- P6 fills (N21) */
/* Bar and cell fills in Primavera's standard palette. Applied as backgrounds,
   never as text colour — see the note beside the tokens. */
.p6-fill-red    { background: var(--p6-red);    color: #fff; }
.p6-fill-blue   { background: var(--p6-blue);   color: #fff; }
.p6-fill-green  { background: var(--p6-green);  color: var(--p6-on-fill); }
.p6-fill-yellow { background: var(--p6-yellow); color: var(--p6-on-fill); }

/* Cell highlights for the change tables (N13). Same palette, softened only by
   the text sitting on top rather than by diluting the hue — she asked for the
   P6 values, not for an interpretation of them. */
/* the legend naming what the fills mean (N13) -- a colour scheme without a
 * legend is a private code */
.hl-legend { display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
             padding: 8px 12px; border: 1px solid var(--line-2); border-radius: 3px;
             background: var(--surface-3); margin-bottom: 10px; font-size: 11px; }
.hl-legend .k { font-size: 9px; font-weight: 600; letter-spacing: .06em;
                text-transform: uppercase; color: var(--ink-4); }
.hl-item { display: inline-flex; align-items: center; gap: 6px; color: var(--ink-2); }
.hl-item .sw { width: 14px; height: 11px; border: 1px solid var(--line-2);
               border-radius: 2px; display: inline-block; }
td.hl-new, .sw.hl-new           { background: var(--p6-yellow); color: var(--p6-on-fill); }
td.hl-durchg, .sw.hl-durchg     { background: var(--p6-green);  color: var(--p6-on-fill); }
td.hl-cp-both, .sw.hl-cp-both   { background: var(--p6-red);    color: #fff; }
td.hl-cp-was, .sw.hl-cp-was     { background: var(--p6-green);  color: var(--p6-on-fill); }
td.hl-cp-new, .sw.hl-cp-new     { background: var(--p6-blue);   color: #fff; }
/* the activity-id BUTTON inside a filled cell must not keep its link colour --
 * accent blue on her red fill is unreadable */
td.hl-cp-both .codelink, td.hl-cp-new .codelink { color: #fff; }
td.hl-cp-was .codelink, td.hl-new .codelink, td.hl-durchg .codelink { color: var(--p6-on-fill); }

/* A float band opened to the activities in it (N19). */
.fbar.on .b { outline: 2px solid var(--accent); outline-offset: 1px; }
.fbar-detail { margin-top: 12px; border-top: 1px solid var(--line); padding-top: 10px; }
.fbar-detail-h {
  font-size: 11px; font-weight: 600; text-transform: uppercase;
  letter-spacing: .06em; color: var(--ink-3); margin-bottom: 7px;
}
.fbar-detail table.grid td { font-size: 12px; padding: 4px 8px; }

/* ------------------------------------------------ assessments (N40/N42/N36) */
.assess-group { border-top: 1px solid var(--line-2); }
.assess-group:first-of-type { border-top: 0; }
.assess-head {
  display: flex; align-items: center; gap: 10px; width: 100%;
  padding: 11px 14px; border: 0; background: none; text-align: left; cursor: pointer;
}
.assess-head:hover { background: var(--surface-2); }
.assess-head.on { background: var(--surface-2); }
.assess-head .t { font-weight: 600; font-size: 13px; }
.assess-head .n { margin-left: auto; font-size: 11.5px; color: var(--ink-4); }
.assess-head .caret { color: var(--ink-4); font-size: 11px; }
.assess-body { padding: 0 14px 14px; }
.assess-body .chart-note { margin-bottom: 9px; }
.assess-body table.grid td { font-size: 12px; vertical-align: top; }
.assess-body .sub-note { font-size: 10.5px; color: var(--ink-4); margin-top: 2px; line-height: 1.4; }

/* ------------------------------------------------- category roll-up (N50) */
.catrow {
  display: flex; align-items: center; gap: 9px; width: 100%;
  padding: 10px 14px; border: 0; border-bottom: 1px solid var(--line-2);
  background: var(--surface-3); text-align: left; cursor: pointer;
  font-size: 10.5px; text-transform: uppercase; letter-spacing: .08em;
  color: var(--ink-3); font-weight: 600;
}
.catrow:hover { background: var(--line-3); color: var(--ink); }
.catrow .caret { color: var(--ink-4); font-size: 10px; letter-spacing: 0; }
.catrow .n {
  margin-left: auto; text-transform: none; letter-spacing: 0;
  font-weight: 400; font-size: 11px; color: var(--ink-4);
}
.catrow.closed { border-bottom-color: var(--line); }

/* ------------------------------- unchanged runs in the path list (N30) */
tr.cprun td { padding: 0 !important; background: var(--surface-2); }
.cprun-btn {
  display: flex; align-items: center; gap: 9px; width: 100%;
  padding: 7px 14px; border: 0; background: none; cursor: pointer;
  font-size: 11.5px; color: var(--ink-3); text-align: left;
}
.cprun-btn:hover { background: var(--line-3); color: var(--ink); }
.cprun-btn .caret { color: var(--ink-4); font-size: 10px; }
.cprun-btn .r { margin-left: auto; font-family: var(--mono); font-size: 10.5px; color: var(--ink-4); }

/* --- the P6-style critical-path Gantt (N20) ------------------------------ *
 * Bar colours are her P6 defaults (N21 pins the exact values); they are FILLS
 * here, never text colours -- yellow on white measures 1.07:1 as text. */
.pgantt { position: relative; border: 1px solid var(--line-2); border-radius: 3px;
          background: var(--surface); overflow: hidden; }
.pg-rules { position: absolute; inset: 0; pointer-events: none; }
.pg-rule { position: absolute; top: 0; bottom: 0; width: 0;
           border-left: 1.5px dashed var(--ink-3); }
.pg-rule.ccd { border-left-color: var(--danger); border-left-style: solid; }
.pg-rule .lab { position: absolute; top: 2px; left: 3px; font-family: var(--mono);
                font-size: 8.5px; color: var(--ink-3); background: var(--surface);
                padding: 0 3px; white-space: nowrap; }
.pg-rule.ccd .lab { color: var(--danger); }
.pg-wbs { display: flex; align-items: baseline; gap: 8px; padding: 5px 10px;
          background: var(--surface-2); border-top: 1px solid var(--line-2);
          font-size: 11px; font-weight: 600; cursor: pointer; position: relative; z-index: 1; }
.pg-wbs:first-child { border-top: 0; }
.pg-wbs:hover { background: var(--line-3); }
.pg-wbs .caret { color: var(--ink-4); font-size: 9px; }
.pg-wbs .n { font-family: var(--mono); font-size: 9.5px; font-weight: 400; color: var(--ink-4); }
.pg-row { display: grid; grid-template-columns: 110px 1fr; align-items: center;
          min-height: 22px; border-top: 1px solid var(--line); }
.pg-row .lab { padding: 2px 8px; font-size: 10px; overflow: hidden; white-space: nowrap; }
.pg-row .lane { position: relative; height: 22px; }
.pg-bar { position: absolute; top: 7px; height: 8px; border-radius: 1px;
          border: 1px solid rgba(0,0,0,.25); }
.pg-actual, .sw.pg-actual       { background: var(--p6-blue); }
.pg-remaining, .sw.pg-remaining { background: var(--p6-green); }
.pg-late, .sw.pg-late           { background: var(--p6-yellow); }
.pg-summary { background: var(--ink-3); top: 8px; height: 6px; }
.pg-dia { position: absolute; top: 1px; font-size: 12px; line-height: 20px;
          transform: translateX(-50%); color: var(--ink); }
.pg-dia.late { color: var(--p6-yellow); text-shadow: 0 0 1px var(--ink-3); }
.hl-legend .pg-dia { position: static; transform: none; line-height: 1; }
.pg-endlab { position: absolute; top: 3px; font-size: 8.5px; color: var(--ink-3);
             white-space: nowrap; max-width: 40%; overflow: hidden;
             text-overflow: ellipsis; line-height: 16px; }

/* --- contractor-narrative cross-check (N10) ------------------------------ */
.cnr { border: 1px solid var(--line-2); border-left-width: 3px; border-radius: 3px;
       padding: 8px 11px; margin-bottom: 7px; }
.cnr.addressed { border-left-color: var(--ok); }
.cnr.unaddressed { border-left-color: var(--danger); background: var(--surface-3); }
.cnr.narrative_only { border-left-color: var(--line-2); }
.cnr .t { display: flex; align-items: baseline; gap: 8px; font-size: 11.5px; font-weight: 600; }
.cnr .t .n { font-family: var(--mono); font-size: 10px; font-weight: 400; color: var(--ink-4); }
.cnr .t .chip { margin-left: auto; }
.cnr .d { font-size: 11.5px; line-height: 1.5; color: var(--ink-2); margin-top: 3px; }
.cnr-h { font-size: 10px; font-weight: 600; letter-spacing: .06em; text-transform: uppercase;
         color: var(--ink-4); margin: 12px 0 6px; }

/* an import row that is importable but worth reading first (encoding damage) */
.err.warn-soft { color: var(--warn); }

/* --- Costs tab (feature 1a) ---------------------------------------------- */
.cost-headline { font-size: 12.5px; line-height: 1.55; margin-bottom: 6px; }
.cost-figures { display: flex; gap: 26px; flex-wrap: wrap; margin-bottom: 10px; }
.cost-fig .k { font-size: 9px; font-weight: 600; letter-spacing: .07em;
               text-transform: uppercase; color: var(--ink-4); }
.cost-fig .v { font-family: var(--mono); font-size: 16px; margin-top: 3px; color: var(--ink); }
.cost-fig .v.bad { color: var(--danger); }
.cost-sub { font-size: 10px; font-weight: 600; letter-spacing: .06em;
            text-transform: uppercase; color: var(--ink-4); margin: 12px 0 5px; }
.cost-rule { border: 1px solid var(--line-2); border-left-width: 3px; border-radius: 3px;
             padding: 8px 11px; margin-bottom: 7px; }
.cost-rule .t { display: flex; align-items: baseline; gap: 8px; font-size: 11.5px;
                font-weight: 600; }
.cost-rule .t .chip { margin-left: auto; }
.cost-rule .d { font-size: 11.5px; line-height: 1.5; color: var(--ink-2); margin-top: 3px; }
.cost-billing { display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
                padding: 9px 11px; background: var(--surface-3);
                border: 1px solid var(--line-2); border-radius: 3px; margin-bottom: 10px; }
.cost-billing label { font-size: 11px; color: var(--ink-3); }
.cost-billing input { width: 170px; }
.cost-billing .chart-note { flex-basis: 100%; margin: 0; }

/* --- methodology page (app level) ---------------------------------------- */
.meth-ver { font-family: var(--mono); font-size: 11px; color: var(--ink-4);
            align-self: center; }
.meth-p { font-size: 12.5px; line-height: 1.65; color: var(--ink-2);
          margin: 0 0 9px; max-width: 92ch; }
.meth-p:last-child { margin-bottom: 0; }

/* ===============================================================   UI REFRESH (design handoff) — the report as a scrollable document, and
   project settings as a six-row summary list with modal editors.
   Reskin only: everything below styles what app.js already computes.
   ====================================================================== */

/* ---- the report document ---- */
.doc-outer { display: flex; justify-content: center; }
.doc { width: 100%; max-width: 880px; padding: 30px 0 80px; }
.doc-kicker {
  font-family: var(--mono); font-size: 10px; letter-spacing: .2em;
  text-transform: uppercase; color: var(--kicker-fg);
}
.doc h1.doc-verdict {
  margin: 16px 0 0; font-size: 34px; font-weight: 600; line-height: 1.18;
  letter-spacing: -.03em; max-width: 26ch; text-wrap: pretty;
}
.doc .doc-lede {
  margin: 18px 0 0; font-size: 16.5px; line-height: 1.6; color: var(--ink-2);
  max-width: 62ch; text-wrap: pretty;
}
.doc .doc-lede strong { font-weight: 600; color: var(--ink); }
/* the head of a single-section view: which section, and the two ways on */
.doc .doc-focus { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; margin: 14px 0 0; }
.doc .doc-focus .k { font-family: var(--mono); font-size: 11px; color: var(--kicker-fg); letter-spacing: .04em; }
.doc .doc-focus h1.t { margin: 0; font-size: 26px; font-weight: 600; line-height: 1.2; letter-spacing: -.02em; }
.doc .doc-focus .acts { margin-left: auto; display: flex; gap: 8px; align-self: center; }

/* metadata definition grid under the lede */
.doc-meta {
  margin: 26px 0 0; padding-top: 18px; border-top: 1px solid var(--line);
  display: grid; grid-template-columns: repeat(auto-fit, minmax(188px, 1fr));
  gap: 15px 26px;
}
.doc-meta dt {
  font-family: var(--mono); font-size: 9.5px; letter-spacing: .13em;
  text-transform: uppercase; color: var(--ink-4);
}
.doc-meta dd { margin: 5px 0 0; font-family: var(--mono); font-size: 12.5px; color: var(--ink); }
.doc-meta dd.bad { color: var(--danger); }
.doc-meta dd.meta-note { margin: 3px 0 0; font-family: var(--sans); font-size: 11.5px; color: var(--ink-4); line-height: 1.4; }
/* F1: the pair as a sentence, its earlier side a control that opens the
   series. The document's own hand -- mono for the two names, a hairline under
   the one that can change -- rather than a themed select on the paper. */
.doc-compare-with dd { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px; }
.doc-compare-with .cw-b { font-weight: 600; }
.doc-compare-with .cw-pick {
  font: inherit; color: var(--ink); background: none; border: 0; padding: 0 2px; cursor: pointer;
  border-bottom: 1px solid var(--control-line); font-weight: 600;
}
.doc-compare-with .cw-pick:hover { border-bottom-color: var(--ink); }
.doc-compare-with .cw-pick .chev { margin-left: 4px; font-size: 10px; color: var(--ink-4); }
.doc-compare-with .cw-pick[aria-expanded="true"] .chev { display: inline-block; transform: rotate(180deg); }
/* F2: the scope switch over sections 06 and 07, and the chip that names a
   custom path. The document's own segmented control, in its own hand. */
.scope-switch { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin: 0 0 16px; }
.scope-switch .seg { display: inline-flex; border: 1px solid var(--control-line); border-radius: 6px; overflow: hidden; background: var(--surface, #fff); }
.scope-switch .seg button {
  font: inherit; font-size: 12.5px; padding: 5px 11px; border: 0; background: none; color: var(--ink-2); cursor: pointer;
  display: inline-flex; align-items: center; gap: 6px;
}
.scope-switch .seg button + button { border-left: 1px solid var(--line); }
.scope-switch .seg button:hover { background: var(--surface-2); color: var(--ink); }
.scope-switch .seg button.on { background: var(--ink); color: var(--paper, #fff); }
.scope-switch .seg button .cnt { font-family: var(--mono); font-size: 10.5px; opacity: .8; }
.scope-chip {
  display: inline-flex; align-items: center; gap: 5px; padding: 3px 6px 3px 9px; border-radius: 999px;
  border: 1px solid var(--accent-tint-line); background: var(--accent-tint); color: var(--ink); font-size: 12px;
}
.scope-chip .k { color: var(--ink-4); }
.scope-chip b { font-family: var(--mono); font-size: 11.5px; }
.scope-chip .n, .scope-chip .d { color: var(--ink-3); }
.scope-chip .x { border: 0; background: none; color: var(--ink-4); cursor: pointer; font-size: 12px; padding: 0 3px; border-radius: 999px; }
.scope-chip .x:hover { color: var(--danger); background: var(--surface); }
/* F4: the exception chips. Multi-select pills with their count; the master
   toggle applies every one. An empty chip stays, greyed, so the reader can
   see the exception was looked for. */
.exc-bar { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 12px; margin: 0 0 14px; }
.exc-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.exc-chip {
  display: inline-flex; align-items: center; gap: 6px; padding: 3px 9px; border-radius: 999px;
  border: 1px solid var(--line); background: var(--surface, #fff); color: var(--ink-2); font: inherit; font-size: 11.5px; cursor: pointer;
}
.exc-chip:hover { border-color: var(--control-line); color: var(--ink); }
.exc-chip.on { background: var(--ink); border-color: var(--ink); color: var(--paper, #fff); }
.exc-chip .n { font-family: var(--mono); font-size: 10.5px; color: var(--ink-4); }
.exc-chip.on .n { color: inherit; opacity: .8; }
.exc-chip.empty { color: var(--ink-5); }
.exc-chip.empty .n { color: var(--ink-5); }
.exc-master { font-size: 11.5px; }
.exc-clear { border: 0; background: none; font: inherit; font-size: 11.5px; color: var(--ink-3); text-decoration: underline; cursor: pointer; }

/* at-a-glance numbers band */
.glance {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(146px, 1fr));
  margin-top: 30px; border-top: 2px solid var(--ink);
}
.gcell {
  padding: 16px 18px 18px 0; border-bottom: 1px solid var(--line);
}
.gcell:hover { background: var(--surface-2); }
/* the label is the jump control; the value below it opens the evidence */
.glance button.gl {
  display: block; border: 0; background: transparent; padding: 0; text-align: left;
  font-family: var(--mono); font-size: 9.5px; letter-spacing: .13em;
  text-transform: uppercase; color: var(--ink-4); cursor: pointer;
}
.glance button.gl:hover { color: var(--ink); }
.glance .gv {
  display: block; font-family: var(--mono); font-size: 26px; font-weight: 500;
  letter-spacing: -.02em; margin-top: 9px; font-variant-numeric: tabular-nums;
}
/* an evidence-bearing figure keeps the product's one affordance, at this size */
.glance .gv .numlink { font: inherit; color: inherit; padding: 0; }
.glance .gn { display: block; font-size: 12px; color: var(--ink-3); margin-top: 7px; line-height: 1.45; text-wrap: pretty; }

/* numbered sections */
.doc-sec { margin-top: 46px; }
.doc-sec-head {
  display: flex; align-items: baseline; gap: 12px; padding-bottom: 12px;
  border-bottom: 2px solid var(--ink);
}
.doc-sec-head .no { font-family: var(--mono); font-size: 11px; color: var(--kicker-fg); }
.doc-sec-head h2 { margin: 0; font-size: 19px; font-weight: 600; letter-spacing: -.018em; }
.doc-sec-head .spacer { flex: 1; }
.doc-sec-head .count { font-family: var(--mono); font-size: 11px; color: var(--ink-4); white-space: nowrap; }
.doc-sec-head .workbtn {
  height: 27px; padding: 0 11px; border: 1px solid var(--input-line); background: var(--surface);
  border-radius: 999px; font-family: inherit; font-size: 12px; font-weight: 600;
  color: #2E3238; cursor: pointer; white-space: nowrap;
}
.doc-sec-head .workbtn:hover { border-color: var(--ink); color: var(--ink); }
.doc-sec-note {
  margin: 14px 0 0; font-size: 13.5px; line-height: 1.55; color: var(--ink-2);
  max-width: 68ch; text-wrap: pretty;
}
.doc-sec-body { margin-top: 14px; }
.doc-sec-body > .card { margin-top: 12px; }
.doc-sec-body > .card:first-child { margin-top: 0; }
.doc-empty { padding: 28px 0 32px; border-bottom: 1px solid var(--line); }
.doc-empty .t { font-size: 14.5px; font-weight: 600; }
.doc-empty .x { font-size: 13.5px; color: var(--ink-2); margin-top: 6px; max-width: 58ch; line-height: 1.55; }
.doc-more {
  margin-top: 12px; height: 30px; padding: 0 12px; border: 1px solid var(--input-line);
  background: var(--surface); border-radius: 999px; font-family: inherit; font-size: 12px;
  font-weight: 500; color: var(--ink-2); cursor: pointer;
}
.doc-more:hover { border-color: var(--faint); color: var(--ink); }

/* the measures table — the design's document table */
.doc table.doctab { width: 100%; border-collapse: collapse; font-variant-numeric: tabular-nums; }
.doc table.doctab th {
  text-align: left; padding: 10px 14px 10px 0; border-bottom: 1px solid var(--line);
  font-family: var(--mono); font-size: 9.5px; font-weight: 600; letter-spacing: .11em;
  text-transform: uppercase; color: var(--ink-4); white-space: nowrap;
}
.doc table.doctab th.r { text-align: right; }
.doc table.doctab td {
  padding: 12px 14px 12px 0; border-bottom: 1px solid var(--line-2);
  font-size: 13.5px; vertical-align: top;
}
.doc table.doctab td.r { text-align: right; }
.doc table.doctab tr.click:hover td { background: var(--surface-2); }
.doc table.doctab td .sub { display: block; font-size: 12px; color: var(--ink-3); margin-top: 5px; line-height: 1.5; }

/* severity/status pills on the document: a dot, never a filled chip */
.pd {
  display: inline-flex; align-items: center; gap: 5px; font-family: var(--mono);
  font-size: 10px; font-weight: 600; letter-spacing: .08em; white-space: nowrap;
  color: var(--neutral);
}
.pd::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--neutral-dot); }
.pd.hi { color: var(--danger); } .pd.hi::before { background: var(--danger-dot); }
.pd.med { color: var(--warn); } .pd.med::before { background: var(--warn-dot); }
.pd.ok { color: var(--ok); } .pd.ok::before { background: var(--ok-dot); }
.pd.na::before { background: var(--ink-5); }

/* document footer + signature block */
.doc-foot {
  margin-top: 46px; padding-top: 16px; border-top: 2px solid var(--ink);
  display: flex; gap: 16px; flex-wrap: wrap;
  font-family: var(--mono); font-size: 10.5px; letter-spacing: .04em;
  text-transform: uppercase; color: var(--ink-4);
}
.doc-foot .spacer { flex: 1; }
.doc-sign { margin-top: 34px; padding-top: 20px; border-top: 1px solid var(--line); display: flex; gap: 40px; flex-wrap: wrap; }
.doc-sign > div { flex: 1 1 220px; }
.doc-sign .rule { height: 34px; border-bottom: 1px solid var(--ink); }
.doc-sign .lab {
  font-family: var(--mono); font-size: 9.5px; letter-spacing: .13em;
  text-transform: uppercase; color: var(--ink-4); margin-top: 7px;
}

/* the report's header actions, beside the crumbs in the topbar */
.ctx-extras { position: relative; display: inline-flex; align-items: center; gap: 8px; }
.ctx-extras:empty { display: none; }
.btn.primary { border-radius: 7px; }

/* ---- scroll minimap ---- */
.minimap { position: fixed; top: 128px; right: 0; z-index: 55; padding: 18px 10px 18px 22px; }
.minimap .ticks { display: flex; flex-direction: column; align-items: flex-end; gap: 11px; }
.minimap .tick { display: block; height: 4px; border-radius: 2px; width: 20px; background: #A9A59C; transition: width .16s, background .16s; }
.minimap .tick.on { width: 34px; background: var(--ink); }
.minimap .panel {
  width: 248px; background: var(--sidebar-bg); border-radius: 12px;
  box-shadow: 0 14px 36px rgba(20,24,29,.32); padding: 8px; color: var(--sidebar-text);
}
.minimap .panel button {
  display: flex; align-items: center; gap: 11px; width: 100%; min-height: 36px;
  padding: 0 10px; border: 0; border-radius: 8px; background: transparent;
  font-family: inherit; font-size: 13px; color: var(--sidebar-text-2);
  cursor: pointer; text-align: left;
}
.minimap .panel button:hover { background: rgba(255,255,255,.09); color: #fff; }
.minimap .panel button.on { background: rgba(255,255,255,.12); color: #fff; font-weight: 600; }
.minimap .panel .mtick { display: block; width: 16px; height: 3px; border-radius: 2px; background: var(--sidebar-dot); flex: 0 0 16px; }
.minimap .panel button.on .mtick { background: #fff; }
.minimap .panel .mlab { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.minimap .panel .mcount { font-family: var(--mono); font-size: 10px; color: var(--sidebar-text-3); }
.minimap .panel button.on .mcount { color: rgba(255,255,255,.7); }

/* ---- overlays: task mode + drawers ---- */
/* ---- the comparison's sheet (core/shell.js openCompareModal) ----
   The report opens over the Schedules screen in a sheet that fills the
   window, rather than as a screen of its own. Its head carries the pair and
   the report's three actions; its body is the paint host renderCompare
   fills exactly as it filled #screen. Below the composer, the publish dialog
   (.scrim, 60), the chooser (60) and the review workspace (70), all of which
   open on top of it; above the topbar and the list beneath.
   Not in the theme-2 section: the comparison is the one screen not on the
   theme, and this is its frame. */
.cmp-host { position: fixed; inset: 0; z-index: 45; }
/* F0: the report, the review queue and the comment list are rail entries,
   so the rail stays reachable while a sheet is up -- the sheet takes the
   main column, not the window. It starts where the rail ends (244px open,
   64px folded) and, on the strip layout, below the strip. Setup's sheet
   keeps the window: the app is inert beneath it by design. */
@media (min-width: 820px) {
  .app.shell2 ~ .cmp-host:not(.kind-setup),
  .app.shell2 ~ .cmp-host:not(.kind-setup) .ov-scrim { left: 244px; }
  .app.shell2.rail-min ~ .cmp-host:not(.kind-setup),
  .app.shell2.rail-min ~ .cmp-host:not(.kind-setup) .ov-scrim { left: 64px; }
}
@media not all and (min-width: 820px) {
  .app.shell2 ~ .cmp-host:not(.kind-setup),
  .app.shell2 ~ .cmp-host:not(.kind-setup) .ov-scrim { top: 47px; }
}
.cmp-scrim { position: absolute; inset: 0; background: rgba(20,24,29,.42); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); }
.cmp-modal {
  position: absolute; inset: 14px; display: flex; flex-direction: column; overflow: hidden;
  background: var(--paper); border-radius: 14px;
  box-shadow: 0 0 0 1px rgba(27,36,48,.12), 0 32px 80px -20px rgba(20,24,29,.55);
}
.cmp-head {
  flex: none; display: flex; align-items: center; gap: 12px; min-height: 56px;
  padding: 0 14px 0 22px; background: var(--surface); border-bottom: 1px solid var(--line);
}
.cmp-title { display: flex; align-items: baseline; gap: 12px; min-width: 0; flex-wrap: wrap; }
.cmp-title .k { font-family: var(--mono); font-size: 10px; letter-spacing: .18em; text-transform: uppercase; color: var(--kicker-fg); white-space: nowrap; }
.cmp-title .pair { display: flex; align-items: baseline; gap: 8px; font-size: 14px; color: var(--ink-2); min-width: 0; }
.cmp-title .pair b { font-weight: 600; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 32ch; }
.cmp-title .pair .arr { color: var(--ink-4); }
.cmp-title .pair .sub { font-size: 12.5px; color: var(--ink-4); white-space: nowrap; }
/* Trends in the sheet: the head names the screen, so the page's own
   heading block (h1 + subline) is not drawn a second time beneath it. */
.cmp-host.kind-trends .cmp-body .pageblock, .cmp-host.kind-reports .cmp-body .pageblock { display: none; }
.cmp-extras { margin-left: auto; position: relative; display: flex; align-items: center; gap: 8px; flex: none; }
.cmp-x {
  flex: none; width: 32px; height: 32px; border: 0; background: none; border-radius: 6px;
  color: var(--ink-4); font-size: 15px; cursor: pointer;
}
.cmp-x:hover { background: var(--surface-2); color: var(--ink); }
.cmp-body { flex: 1; min-height: 0; display: flex; flex-direction: column; position: relative; }
/* The minimap is pinned to the sheet's edge, not the window's. */
.cmp-body .minimap { position: absolute; top: 64px; }
@media (max-width: 720px) { .cmp-modal { inset: 0; border-radius: 0; } .cmp-title .k { display: none; } }
@media (prefers-reduced-motion: no-preference) {
  @keyframes cmp-sheet-in { from { opacity: .6; transform: translateY(12px) scale(.985); } to { opacity: 1; transform: none; } }
  @keyframes cmp-scrim-in { from { opacity: 0; } to { opacity: 1; } }
  .cmp-scrim { animation: cmp-scrim-in 160ms ease-out; }
  .cmp-modal { animation: cmp-sheet-in 240ms cubic-bezier(.2, .8, .2, 1); }
  .cmp-host.out { transition: opacity 130ms ease-out; opacity: 0; pointer-events: none; }
  .cmp-host.out .cmp-modal { transition: transform 130ms ease-out; transform: translateY(8px) scale(.99); }
}
@media (prefers-reduced-motion: reduce) { .cmp-host.out { display: none; } }

.ov-scrim { position: fixed; inset: 0; z-index: 70; background: rgba(20,24,29,.34); }
.ov-panel {
  position: fixed; top: 0; bottom: 0; right: 0; z-index: 71;
  width: min(940px, 96vw); background: var(--surface);
  box-shadow: -18px 0 44px rgba(20,24,29,.26); display: flex; overflow: hidden;
}
.ov-panel .taskwrap { flex: 1; min-height: 0; }
.ov-panel .queue { width: 316px; background: var(--surface-3); border-right: 1px solid var(--line); }
.ov-kicker {
  font-family: var(--mono); font-size: 10px; letter-spacing: .13em;
  text-transform: uppercase; color: var(--kicker-fg);
}
.ov-x {
  width: 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center;
  border: 0; background: transparent; border-radius: 7px; color: var(--ink-3);
  font-size: 15px; cursor: pointer;
}
.ov-x:hover { background: var(--line-3); color: var(--ink); }

/* task-mode queue restyle (design: TASK MODE header, ring, filter pills) */
.queue-head .ov-kicker { display: block; margin-bottom: 4px; }
.qfilters { display: flex; gap: 4px; margin-top: 12px; flex-wrap: wrap; }
.qfilters button {
  height: 26px; padding: 0 9px; border: 1px solid var(--input-line); border-radius: 999px;
  background: var(--surface); font-family: inherit; font-size: 11.5px; font-weight: 600;
  color: var(--ink-2); cursor: pointer;
}
.qfilters button.on { background: var(--ink); border-color: var(--ink); color: #fff; }
.ring { background: conic-gradient(var(--brand-accent) 0deg, #E2DED6 0deg); }
.ring .core { background: var(--surface-3); }
.qrow { border-left: 0; }
.qrow.on { background: var(--accent-tint); }

/* ---- settings: the six-row summary list ---- */
.settings-doc { width: 100%; max-width: 760px; }
.settings-list { margin-top: 30px; border-top: 2px solid var(--ink); }
.srow {
  display: flex; align-items: center; gap: 16px; width: 100%;
  padding: 17px 4px 17px 0; border: 0; border-bottom: 1px solid var(--line);
  background: transparent; cursor: pointer; text-align: left; font-family: inherit;
}
.srow:hover { background: var(--surface-2); }
.srow .sdot { width: 8px; height: 8px; flex: 0 0 8px; border-radius: 50%; margin-left: 2px; }
.srow .sdot.set { background: var(--ok-dot); }
.srow .sdot.attn { background: var(--warn-dot); }
.srow .sdot.danger { background: var(--danger-dot); }
.srow .stitle { flex: 0 0 208px; min-width: 0; }
.srow .stitle .t { display: block; font-size: 14px; font-weight: 600; letter-spacing: -.01em; color: var(--ink); }
.srow .stitle .t.danger { color: var(--danger); }
.srow .stitle .k {
  display: block; font-family: var(--mono); font-size: 9.5px; letter-spacing: .1em;
  text-transform: uppercase; color: var(--faint); margin-top: 4px;
}
.srow .svalue { flex: 1; min-width: 0; }
.srow .svalue .v { display: block; font-size: 13px; color: var(--ink); line-height: 1.45; }
.srow .svalue .w { display: block; font-size: 12px; color: var(--warn); margin-top: 3px; line-height: 1.45; }
.srow .chev { flex: 0 0 14px; color: var(--ink-5); }
.settings-foot { font-family: var(--mono); font-size: 10.5px; color: var(--faint); margin-top: 16px; }

/* settings modal: centered, blurred backdrop, footer save bar */
.smodal-scrim {
  position: fixed; inset: 0; z-index: 70; background: rgba(20,24,29,.32);
  backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px);
}
.smodal {
  position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 71;
  width: min(640px, 94vw); max-height: min(84vh, 780px); background: var(--surface);
  border-radius: 14px; box-shadow: 0 24px 64px rgba(20,24,29,.32);
  display: flex; flex-direction: column; overflow: hidden;
}
.smodal-head { display: flex; align-items: center; gap: 10px; padding: 15px 22px; border-bottom: 1px solid var(--line-2); }
.smodal-head .tt { flex: 1; }
.smodal-head h2 { margin: 4px 0 0; font-size: 17px; font-weight: 600; letter-spacing: -.015em; }
.smodal-body { flex: 1; overflow-y: auto; padding: 20px 22px; }
.smodal-body .field label {
  font-family: var(--mono); font-weight: 600; font-size: 9.5px; letter-spacing: .13em;
  text-transform: uppercase; color: var(--ink-4);
}
.smodal-foot { display: flex; gap: 10px; align-items: center; padding: 13px 22px 16px; border-top: 1px solid var(--line-2); }
.smodal-foot .hint { flex: 1; font-size: 11.5px; color: var(--faint); line-height: 1.45; margin: 0; }
.smodal-foot input { flex: 1; height: 34px; padding: 0 11px; border: 1px solid var(--input-line); border-radius: 8px; font: inherit; font-size: 12.5px; }
.smodal-foot input.miss { border-color: var(--danger-dot); }

/* confirm-before-rerun dialog — stacks above the settings modal */
.confirm-scrim {
  position: fixed; inset: 0; z-index: 80; background: rgba(20,24,29,.36);
  backdrop-filter: blur(3px); -webkit-backdrop-filter: blur(3px);
}
.confirm-box {
  position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 81;
  width: min(420px, 90vw); background: var(--surface); border-radius: 12px;
  box-shadow: 0 24px 64px rgba(20,24,29,.36); padding: 20px 22px;
}
.confirm-box h3 { margin: 8px 0 0; font-size: 15.5px; font-weight: 600; letter-spacing: -.012em; }
.confirm-box p { margin: 9px 0 0; font-size: 13px; color: var(--ink-2); line-height: 1.55; text-wrap: pretty; }
.confirm-acts { display: flex; gap: 8px; justify-content: flex-end; margin-top: 18px; }

/* On the report document, severity/status chips render as the design's dot
   pills — a 6px dot + mono label, no filled background. Chips elsewhere
   (schedules table, portfolio) keep their filled form. Special annotation
   chips (.cp, .drv, .ms, .ai-chip) are exempt. */
.doc .chip.hi, .doc .chip.med, .doc .chip.low, .doc .chip.ok,
.doc .chip.none, .doc .chip.draft {
  background: transparent; padding: 0; border-radius: 0;
  font-size: 10px; letter-spacing: .08em;
  display: inline-flex; align-items: center; gap: 5px;
}
.doc .chip.hi::before, .doc .chip.med::before, .doc .chip.low::before,
.doc .chip.ok::before, .doc .chip.none::before, .doc .chip.draft::before {
  content: ""; width: 6px; height: 6px; border-radius: 50%; flex: none;
}
.doc .chip.hi::before { background: var(--danger-dot); }
.doc .chip.med::before, .doc .chip.draft::before { background: var(--warn-dot); }
.doc .chip.low::before { background: var(--neutral-dot); }
.doc .chip.low { color: var(--neutral); }
.doc .chip.ok::before { background: var(--ok-dot); }
.doc .chip.none::before { background: var(--ink-5); }

/* an unmeasured headline figure: stated, not styled as a result */
.glance .gv.gv-muted { font-size: 15px; color: var(--ink-4); letter-spacing: 0; }

/* the measures table's detail panel: the evidence panel's chrome, with the
   design's kicker above the label */
.ev-h .ov-kicker { margin-bottom: 6px; padding-right: 30px; }

/* ---- the findings list on the document ---- */
.doc table.findtab td { vertical-align: top; }
.doc table.findtab td.findno { color: var(--faint); font-size: 12px; padding-top: 14px; }
.findtitle { font-size: 14.5px; font-weight: 600; line-height: 1.35; color: var(--ink); }
.doc table.findtab .findsub {
  display: block; font-size: 12px; color: var(--ink-3); margin-top: 5px; line-height: 1.5;
}
.findmeta { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-top: 7px; }
.findmore { font-family: var(--mono); font-size: 10px; color: var(--faint); }
/* a rule every one of whose findings has been cleared: still listed, visibly done */
.doc table.findtab tr.cleared .findtitle { color: var(--ink-3); }
.doc table.findtab tr.cleared td { background: var(--surface-3); }
/* the filter bar sits inside the document, not in a card */
.doc .filterbar { margin: 0 0 14px; border-radius: 10px; }
/* which rules profile version judged this list (2a-3) */
.findrules {
  font-family: var(--mono); font-size: 10.5px; letter-spacing: .04em;
  color: var(--faint); margin: 0 0 12px;
}

/* E0-05-3: the numbers a reviewer chose, on the face of the line that names the
   rulebook. Mono because each one is a MEASURED limit the findings were judged
   against, and quieter than the rulebook itself, which is still the heading. */
.findrules .fr-set { color: var(--ink-2); font-weight: 500; }

/* ---- rulebook badges: which rulebooks cite a finding ----
   Quiet by design. They sit in a row that already carries a severity pill and
   activity codes, so they read as references rather than as a second status.
   HEALTH CHECK is deliberately the plainest of the three: it marks a finding
   the specification never asked for, and must not look like a citation. */
.rb {
  font-family: var(--mono); font-size: 9.5px; font-weight: 600;
  letter-spacing: .06em; white-space: nowrap; border-radius: 4px;
  padding: 1px 6px; border: 1px solid var(--line);
  background: var(--surface-2); color: var(--ink-3);
}
button.rb { cursor: pointer; }
button.rb:hover { border-color: var(--ink); color: var(--ink); }
.rb-dcma { color: var(--accent-ink); border-color: var(--accent-tint-line); background: var(--accent-tint); }
.rb-spec { color: var(--kicker-fg); border-color: var(--warn-line); background: var(--warn-tint); }
.rb-health { color: var(--ink-3); border-color: var(--line); background: var(--surface-2); }
/* V-11: a clause number the standard section supplied, not this job's uploaded
   specification. The dashed edge is the whole difference between a citation a
   contractor can look up and one they cannot -- drawn, because the two rendered
   identically and the tooltip alone is not a difference anybody sees. */
.rb-unverified { border-style: dashed; }
/* the workspace's rulebook row, under the severity pills */
.rbfilters { margin-top: 6px; }
/* the detail pane's "cited by" line */
.rb-basis { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; margin-top: 14px; }
.rb-basis .k {
  font-family: var(--mono); font-weight: 600; font-size: 9.5px; letter-spacing: .1em;
  text-transform: uppercase; color: var(--ink-4);
}
.rb-basis .cw { font-size: 11.5px; color: var(--ink-3); }

/* ---- the panel behind a chart bar ----
   Same two-pane shape as the review workspace, because it is the same job:
   pick a thing on the left, work it on the right. */
.ov-panel.diffpanel { width: min(1040px, 97vw); }
.diffrail { width: 268px; }
.diffcat {
  display: block; width: 100%; text-align: left; border: 0; background: none;
  padding: 10px 16px; border-bottom: 1px solid var(--line-2); cursor: pointer;
}
.diffcat:hover { background: var(--surface-2); }
.diffcat.on { background: var(--accent-tint); }
.diffcat .t { display: block; font-size: 12.5px; font-weight: 600; color: var(--ink); }
.diffcat.zero .t { font-weight: 500; color: var(--ink-3); }
.diffcat .n {
  display: block; font-family: var(--mono); font-size: 10.5px; color: var(--ink-4); margin-top: 3px;
}
.diffrail-sep {
  padding: 12px 16px 6px; font-family: var(--mono); font-size: 9px;
  letter-spacing: .12em; text-transform: uppercase; color: var(--faint);
  border-bottom: 1px solid var(--line-2);
}
.diffdetail { padding: 16px 20px 60px; }
.diffdetail .detail-top { align-items: baseline; }
.diffdetail .detail-top h2 { font-size: 17px; }
.diffdetail .filterbar { margin-bottom: 12px; }
.diffdetail .secrow { padding-left: 0; padding-right: 0; }
.diffdetail .secbody { padding-left: 0; padding-right: 0; }
.diff-none { padding: 22px 0; color: var(--ink-3); font-size: 12.5px; }
/* a bar is a control */
button.hbar-row { width: 100%; border: 0; background: none; padding: 0; font: inherit;
                  text-align: left; cursor: pointer; }
button.hbar-row:hover .hbar-lbl { color: var(--ink); text-decoration: underline; }
button.hbar-row:hover .hbar-fill { filter: brightness(.92); }

/* ---- slip waterfall: where the period's days came from ----
   Every colour is an existing token: a component that pushed the finish later
   wears --danger, one that pulled it back wears --ok, and the opening and
   closing totals wear --accent, which is this theme's neutral ink. No new hue,
   radius, font or shadow. */
.wf-card .card-head .ov-kicker { margin-bottom: 3px; }
/* The plot gets the document's full column and the three summary cards sit
   under it. The reference puts them beside the chart, but it has 2000px to
   spend; this document column is 880, and beside the chart they left the plot
   580px for ten columns — which reads as a squeezed, vertical chart rather
   than the landscape sequence it is. Same parts, arranged for this width. */
.wf-body { display: block; }
.wf-warn { grid-column: 1 / -1; margin-bottom: 0; }
.wf-main { min-width: 0; }
.wf-plot { position: relative; padding: 22px 0 0; overflow-x: auto; }
.wf-grid { position: absolute; inset: 22px 0 auto 0; height: 168px; pointer-events: none; }
.wf-gridline { position: absolute; left: 34px; right: 0; border-top: 1px solid var(--line-2); }
.wf-gridlabel {
  position: absolute; left: -34px; top: -7px; width: 28px; text-align: right;
  font-family: var(--mono); font-size: 9.5px; color: var(--ink-4);
}
/* Ten columns — seven causes plus opening, unattributed and closing — have to
   fit the document's 880px column without a scrollbar. Past that (a future
   cause category) the plot scrolls rather than squeezing them illegibly. */
.wf-cols { display: flex; gap: 6px; padding-left: 34px; min-width: 470px; }
.wf-col { flex: 1 1 0; min-width: 42px; }
.wf-rail { position: relative; }
.wf-bar {
  position: absolute; left: 12%; right: 12%; border: 0; padding: 0;
  border-radius: 2px; background: var(--ink-5);
}
button.wf-bar { cursor: pointer; }
button.wf-bar:hover { filter: brightness(.92); }
button.wf-bar.on { outline: 2px solid var(--ink); outline-offset: 1px; }
.wf-bar.up { background: var(--danger-dot); }
.wf-bar.down { background: var(--ok-dot); }
.wf-bar.fixed { background: var(--accent); }
.wf-bar.residual { background: var(--ink-5); }
.wf-bar.flat { background: var(--line); }
/* F7: the cause colours, one class per engine cause (compare/causes.js). */
.cause-swatch { display: inline-block; width: 8px; height: 8px; border-radius: 2px; margin-right: 4px; vertical-align: 0; background: var(--cause-residual); }
.cause-data-date-push { background: var(--cause-data-date-push); }
.cause-unfinished-work { background: var(--cause-unfinished-work); }
.cause-actual-dates { background: var(--cause-actual-dates); }
.cause-remaining-duration-change { background: var(--cause-remaining-duration-change); }
.cause-original-duration-change { background: var(--cause-original-duration-change); }
.cause-logic-change { background: var(--cause-logic-change); }
.cause-constraint-change { background: var(--cause-constraint-change); }
.cause-calendar-change { background: var(--cause-calendar-change); }
.cause-mixed { background: var(--cause-mixed); }
.cause-residual { background: var(--cause-residual); }
.cause-none { background: var(--cause-residual); }
.wf-val {
  position: absolute; left: 0; right: 0; text-align: center;
  font-family: var(--mono); font-size: 11px; font-weight: 600; color: var(--ink);
}
.wf-val.up { color: var(--danger); }
.wf-val.down { color: var(--ok); }
.wf-conn {
  position: absolute; left: 88%; right: -10px;
  border-top: 1px dashed var(--ink-5);
}
.wf-lab {
  margin-top: 9px; font-size: 10.5px; line-height: 1.3; color: var(--ink-2);
  text-align: center; overflow-wrap: anywhere;
}
.wf-group {
  font-family: var(--mono); font-size: 9px; letter-spacing: .08em;
  text-transform: uppercase; color: var(--faint); text-align: center; margin-top: 2px;
}
.wf-sum { margin-top: 16px; display: flex; align-items: baseline; gap: 8px; font-size: 12.5px; }
.wf-tick { color: var(--ok); font-weight: 600; }
.wf-residual { margin-top: 6px; font-size: 11.5px; line-height: 1.6; color: var(--warn); max-width: 78ch; }
/* the two halves of the slip, and what did not classify */
.wf-side { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-top: 16px; }
.wf-group-card { border: 1px solid var(--line); border-radius: 10px; padding: 11px 13px; }
.wf-group-card.attention { border-color: var(--warn-line); background: var(--warn-tint); }
.wf-group-card .k {
  font-family: var(--mono); font-size: 9.5px; font-weight: 600; letter-spacing: .1em;
  text-transform: uppercase; color: var(--ink-4);
}
.wf-group-card .v {
  font-family: var(--mono); font-size: 21px; font-weight: 600; letter-spacing: -.02em;
  margin: 5px 0 4px; color: var(--ink);
}
.wf-group-card .v.up { color: var(--danger); }
.wf-group-card .v.down { color: var(--ok); }
.wf-group-card .n { font-size: 11.5px; line-height: 1.5; color: var(--ink-3); }
/* the activities behind a selected bar */
.wf-detail { border-top: 1px solid var(--line-2); }
.wf-detail-head { display: flex; align-items: center; gap: 9px; margin-bottom: 9px; }
.wf-detail-head .k { font-size: 12.5px; font-weight: 600; }
/* Narrow: keep every column rather than scrolling the total out of view, and
   let the three summary cards stack. */
@media (max-width: 900px) {
  .wf-cols { min-width: 400px; gap: 4px; }
  .wf-col { min-width: 34px; }
  .wf-lab { font-size: 10px; }
  .wf-group { font-size: 8px; }
  .wf-side { grid-template-columns: 1fr; }
}

/* ---- 05 critical path: the chain ----
   Every colour is an existing token. The lag hatch and the unexplained-gap
   outline are the warning and error dots drawn as a pattern and a dashed
   stroke rather than as new hues. */
.cp-strip { display: grid; grid-template-columns: repeat(5, 1fr); overflow: hidden; }
.cp-sc { padding: 11px 13px; border-right: 1px solid var(--line-2); }
.cp-sc:last-child { border-right: 0; }
.cp-sv {
  font-family: var(--mono); font-size: 17px; font-weight: 500;
  margin: 6px 0 3px; letter-spacing: -.01em; color: var(--ink);
}
.cp-sv.ok { color: var(--ok); }
.cp-sv.bad { color: var(--danger); }
.cp-sd { font-size: 11px; color: var(--ink-3); line-height: 1.4; }
.cp-basis {
  margin: 12px 0 14px; padding-left: 12px; border-left: 2px solid var(--line);
  font-size: 12.5px; line-height: 1.6; color: var(--ink-3); max-width: 88ch;
}
.cp-basis b { color: var(--ink); font-weight: 600; }
.cp-figure .cp-fig { padding: 10px 14px 4px; overflow-x: auto; }
.cp-fig svg { display: block; }
.cp-block { cursor: pointer; }
.cp-block:focus-visible, .cp-pinmark:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.cp-gap, .cp-pinmark { cursor: help; }
.cp-legend {
  display: flex; gap: 15px; flex-wrap: wrap; align-items: center;
  margin: 0 14px; padding: 9px 0 11px; border-top: 1px solid var(--line-2);
  font-family: var(--mono); font-size: 10px; color: var(--ink-4);
}
.cp-legend span { display: flex; gap: 6px; align-items: center; }
.cp-key { width: 16px; height: 9px; border-radius: 2px; display: inline-block; }
.cp-closes { margin-left: auto; color: var(--ink); font-size: 11px; }
.cp-closes b { color: var(--ok); }
.cp-drill, .cp-flags { margin-top: 12px; }
.cp-pin {
  display: inline-flex; align-items: center; justify-content: center;
  width: 16px; height: 16px; border-radius: 50%; color: #fff;
  font-family: var(--mono); font-size: 9px; font-weight: 600;
  background: var(--neutral-dot);
}
.cp-pin.high { background: var(--danger-dot); }
.cp-pin.medium { background: var(--warn-dot); }
/* the section's own hover card: the report has no tooltip component, and an
   SVG rect cannot carry four lines in a title attribute */
.cp-tip {
  position: fixed; z-index: 130; pointer-events: none; opacity: 0;
  transition: opacity .1s; background: var(--sidebar-bg); color: var(--sidebar-text);
  border-radius: 8px; padding: 8px 11px; font-family: var(--mono); font-size: 11px;
  line-height: 1.55; max-width: 260px; box-shadow: 0 24px 64px rgba(20,24,29,.32);
}
.cp-tip.on { opacity: 1; }
.cp-tip b { color: #fff; font-weight: 600; }
@media (max-width: 900px) { .cp-strip { grid-template-columns: repeat(2, 1fr); } }
@media (prefers-reduced-motion: reduce) { .cp-tip { transition: none; } }

/* E1-01 — the out-of-date mark on rollup screens. Small, and it earns its
   colour: these numbers are not wrong, they answer a question that has since
   been re-asked. */
.stale-dot {
  display: inline-block;
  margin-left: 6px;
  color: var(--warn, #9C5606);
  font-size: 15px;
  line-height: 1;
  cursor: help;
  vertical-align: middle;
}
.stale-note {
  font-family: var(--mono, monospace);
  font-size: 11px;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--warn, #9C5606);
}

/* E1-03 — decisions whose finding no longer exists. Quiet: nothing here is
   wrong, it is work that has been set aside and was previously invisible. */
.orphan-box {
  border: 1px solid var(--rule, #E6E2DA);
  border-left: 3px solid var(--warn, #9C5606);
  background: var(--card, #fff);
  padding: 12px 14px;
  margin: 0 0 18px;
}
.orphan-head { display: flex; align-items: baseline; gap: 10px; }
.orphan-why {
  margin-top: 5px;
  font-size: 13px;
  line-height: 1.5;
  color: var(--soft, #6E7883);
  max-width: 70ch;
}
.orphan-row {
  display: flex; gap: 10px; align-items: baseline;
  margin-top: 7px; font-size: 12.5px;
}
.orphan-row .k { min-width: 190px; color: var(--ink, #14181D); }
.orphan-row .v {
  font-family: var(--mono, monospace);
  font-size: 11.5px;
  color: var(--soft, #6E7883);
  overflow-wrap: anywhere;
}
.orphan-box .btn { margin-top: 11px; }

/* E6-01 — how many updates this finding has survived. Quiet by default and
   warmer once it has been asked three times, because at that point the fact
   the contractor has not addressed it IS the finding. */
.chip.rec {
  background: var(--card, #fff);
  border-color: var(--rule-2, #D8D2C6);
  color: var(--soft, #6E7883);
  cursor: help;
}
.chip.rec.hot {
  color: var(--kicker, #8A6A3C);
  border-color: var(--kicker, #8A6A3C);
}

/* E1-04 — a review held because the file pair moved. Warmer than the orphan
   block: nothing is lost, but a comment number already issued to a contractor
   is being withheld, and that needs answering rather than noting. */
.orphan-box.retarget { border-left-color: var(--hot, #A6402C); }
.orphan-box.retarget .stale-note { color: var(--hot, #A6402C); }

/* ---- UI-01 Intake: three states that never look alike ------------------- */
/* One box for every mark, so a column of them lines up with itself -- which a
   run of Unicode glyphs never did, being sized by the text ramp rather than by
   the mark's own geometry. */
.ic { display: inline-grid; place-items: center; width: 10px; height: 10px; flex: none; }
.ic svg { width: 10px; height: 10px; display: block; }
/* Geometry only. The columns are declared once, with the redesign, at the foot
   of this file -- they used to be declared here as well, and the two rules 560
   lines apart is how a live one and a dead one sat in the same stylesheet
   without either being obviously wrong. */
.ik-head { display: grid; gap: 10px; }
.ik-value { overflow-wrap: anywhere; }
/* The narrow-viewport rule that used to live here is now with the rest of the
   redesign, at the foot of this file. It had stopped working: the block down
   there restates `.ik-head`'s columns unconditionally, at the same specificity
   and later in the cascade, so this one lost every match it won. Measured at a
   1000px viewport with the override in place: the check title -- the row's
   primary reading element -- was allotted 28px and set one character per line.
   Two same-named rules on either side of 500 lines is how that hid. */
.ik-title { font-weight: 600; }
.ik-state { font-family: var(--mono); font-size: 9.5px; letter-spacing: .1em; font-weight: 600; }
.ik-value { text-align: right; font-size: 12px; }
.ik-sub { margin: 4px 0 0 20px; font-size: 12px; color: var(--ink-3); }
/* The only place in the app that used --link, which is #1B4FD8 -- a browser
   blue on warm paper, and the same tell as an unthemed focus ring. Links here
   are set the way every other link in this world is: ink, on a hairline that
   strengthens under the cursor. */
.sheet-link {
  color: var(--ink-2); text-decoration: none; font-weight: 500;
  border-bottom: 1px solid var(--line); padding-bottom: 1px;
  transition: color .12s ease, border-color .12s ease;
}
.sheet-link:hover { color: var(--ink); border-bottom-color: var(--ink); }
.sheet-link:focus-visible { outline: 2px solid var(--brand-accent); outline-offset: 2px; border-radius: 2px; }
.ik-pass .ic, .ik-pass .ik-state { color: var(--ok); }
.ik-raise .ic, .ik-raise .ik-state { color: var(--warn-dot); }
.ik-raise { background: var(--warn-tint); }
.ik-np .ic, .ik-np .ik-state { color: var(--ink-4); }
.ik-np .ik-value { color: var(--ink-4); font-style: italic; }
.pill.ik-pass { color: var(--ok); border-color: var(--ok-line); }
.pill.ik-raise { color: var(--warn); border-color: var(--warn-line); background: var(--warn-tint); }
.pill.ik-np { color: var(--ink-4); }
/* The mark track and gap are the check row's, to the pixel. They were 18px/8px
   against the row's 10px/10px, which put the packet's titles at x+26 and the
   checks' at x+20. Beside each other in two columns nobody reads that; stacked
   one under the other, as they are on any window under ~1000px, it is two lists
   of marked rows that do not share a left edge. */
.ik-file { display: grid; grid-template-columns: 10px 1fr; gap: 10px; padding: 6px 0; border-top: 1px solid var(--line-2); }
/* The first item sat under the card head's own rule with a rule of its own:
   two hairlines, one gap. The head rule is the only rule above the first item. */
.ik-file:first-child { border-top: 0; }
.ik-file.present .ic { color: var(--ok); }
.ik-file.absent .ic { color: var(--ink-4); }
.ik-file.absent .ik-title { color: var(--ink-4); }
.skel, .ik-skel { height: 14px; margin: 12px 0; border-radius: 3px; background: linear-gradient(90deg, var(--surface-2), var(--surface-3), var(--surface-2)); background-size: 200% 100%; animation: ik-shimmer 1.2s linear infinite; }
@keyframes ik-shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }
@media (prefers-reduced-motion: reduce) { .skel, .ik-skel { animation: none; } }

/* ---- UI-02 Setup rail --------------------------------------------------- */
/* The old Setup rail and panel lived here: six bordered buttons, each a
   rounded box with a 1px border and a Unicode ring for a mark, and the open
   step inside a `.card`. Both are gone -- the replacement is at the foot of
   this file, on the shared sheet components Intake also uses. */

/* One authored entrance, on the surface that has exactly one thing to say.
   It starts from a VISIBLE default and settles -- nothing here is parked at
   opacity 0 waiting on a script, so the page is correct with JS broken, with
   motion reduced, and in a screenshot taken before it finishes. */
@media (prefers-reduced-motion: no-preference) {
  .unlock-card { animation: auth-settle .5s cubic-bezier(.16, 1, .3, 1) both; }
  @keyframes auth-settle {
    from { opacity: .55; transform: translateY(7px); }
    to   { opacity: 1;   transform: none; }
  }
}

/* ============================ portfolio dashboard ==================   The workspace's one at-a-glance screen. Every selector here is .pf-scoped:
   the pane, the card and the grid table are shared by every other screen and
   are deliberately left alone.

   Two things drove the layout. The stat cards were sized by their own content,
   so four boxes of four different widths sat stranded in the left half of a
   page whose table used the full width. And the pane has no measure at all, so
   on a wide monitor a seven-column table ran from bezel to bezel. Both are
   fixed by giving the page one measure that the band and the table share. */
.pf {
  max-width: 1240px; margin: 0 auto;
  /* One left edge for the whole page. The table's first column is the row
     disclosure, so the edge is that column's width — the heading, the stat
     band and every project's code all start on it. */
  --pf-g: 26px;
}
.pf .pagehead { padding: 0 var(--pf-g) 0 var(--pf-g); }

/* One object, four equal cells divided by hairlines — not four cards. Equal
   columns are the point: these are four readings of the same portfolio, and
   sizing each box to its own label made them look like four unrelated things. */
.pf-stats {
  display: grid; grid-template-columns: repeat(4, 1fr);
  border: 1px solid var(--line); border-radius: 10px;
  background: var(--surface); overflow: clip; margin-bottom: 14px;
}
.pf-stat { padding: 15px 20px 14px var(--pf-g); border-left: 1px solid var(--line); min-width: 0; }
.pf-stat + .pf-stat { padding-left: 20px; }
.pf-stat:first-child { border-left: 0; }
.pf-stat .n {
  font-family: var(--mono); font-size: 30px; font-weight: 600;
  line-height: 1; letter-spacing: -.02em; font-variant-numeric: tabular-nums;
}
.pf-stat .kicker { display: block; margin-top: 8px; }
/* The count that is nothing to worry about stays ink; the two that are stay in
   their own semantic colour, so the band is scannable without reading a word. */
.pf-stat.bad .n  { color: var(--danger); }
.pf-stat.warn .n { color: var(--warn); }

/* Both screens' identity treatments in one cell: the code leads, as it did on
   Projects, and the name reads under it, as it did on the dashboard. */
.pf-code {
  font-family: var(--mono); font-weight: 600; font-size: 12px; color: var(--accent);
  line-height: 1.4;
}
.pf-code.off { color: var(--ink-4); }
.pf-name { font-size: 12.5px; color: var(--ink-2); margin-top: 2px; line-height: 1.35; }
.pf-name.off { color: #6B7684; }
.pf-clause { font-family: var(--mono); font-size: 10.5px; color: var(--ink-4); }
.pf-clause::before { content: " · "; }
.pf-meta {
  font-family: var(--mono); font-size: 10.5px; color: var(--ink-4);
  margin-top: 3px; letter-spacing: .01em;
}
.pf-row td { padding-top: 11px; padding-bottom: 11px; vertical-align: middle; }
/* Findings arrived as "41 (7 H)". Same two numbers, but the high-severity count
   now reads as the thing it is rather than as a parenthetical. */
.pf-fh { font-family: var(--mono); font-size: 10.5px; color: var(--ink-4); }
.pf-fh.on { color: var(--danger); font-weight: 600; }
/* A separator, because "6" and "0 H" set side by side read as "60 H". */
.pf-fh::before { content: "·"; margin: 0 5px; color: var(--ink-5); font-weight: 400; }

/* The disclosure column IS the left gutter: no padding of its own, exactly the
   page's edge wide, so the identity cell after it starts on that edge and the
   chevron sits in the gutter rather than pushing the row in. */
.pf .card table.grid th.pf-x,
.pf .card table.grid td.pf-x { width: var(--pf-g); padding: 0; }
.pf .card table.grid tr > *:nth-child(2) { padding-left: 0; }
.pf .card table.grid th:last-child,
.pf .card table.grid td:last-child { padding-right: 20px; }

/* The state definitions the health words come from. Four equal columns on the
   table's own edges: the chip, then its sentence under it, so a definition is
   read as a definition instead of as a caption squeezed beside a pill. */
.pf-legend {
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px;
  margin-top: 16px; padding-top: 15px; border-top: 1px solid var(--line);
}
.pf-legend-item .chip { margin-bottom: 6px; }
.pf-legend-item p {
  margin: 0; font-size: 11.5px; line-height: 1.55; color: var(--ink-4);
  text-wrap: pretty;
}
@media (max-width: 1080px) {
  .pf-stats, .pf-legend { grid-template-columns: repeat(2, 1fr); }
  .pf-stat:nth-child(3) { border-left: 0; }
  .pf-stat:nth-child(-n+2) { border-bottom: 1px solid var(--line); }
}

/* --- the row disclosure and the delivery figures behind it ------------------
   Sixteen columns do not fit on any screen worth designing for, so the row
   carries the health read and opens for the delivery read. A button, not a
   click on the row: the row already means "open this project", and one gesture
   cannot mean two things. */
.pf-exp {
  display: grid; place-items: center; width: var(--pf-g); height: 30px;
  background: none; border: 0; padding: 0; cursor: pointer;
  color: var(--ink-5); transition: color .12s ease;
}
.pf-exp svg { width: 10px; height: 10px; transition: transform .16s ease; }
.pf-exp:hover { color: var(--ink-2); }
.pf-exp:focus-visible { outline: 2px solid var(--brand-accent); outline-offset: -2px; border-radius: 3px; }
.pf-row.open .pf-exp { color: var(--ink-2); }
.pf-row.open .pf-exp svg { transform: rotate(90deg); }
@media (prefers-reduced-motion: reduce) { .pf-exp svg { transition: none; } }

.pf-detail > td {
  background: var(--surface-3); border-bottom: 1px solid var(--line);
  padding: 14px var(--pf-g) 16px;
}
.pf-dgrid {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 14px 24px;
}
.pf-dk {
  font-family: var(--mono); font-weight: 600; font-size: 9.5px; letter-spacing: .1em;
  text-transform: uppercase; color: var(--ink-4);
}
/* A label carrying the sentence that defines it. It was a <th title> before the
   merge; losing the cursor would lose the only definition these measures have. */
.pf-dk.has-t { cursor: help; border-bottom: 1px dotted var(--line); display: inline-block; }
.pf-dv {
  margin-top: 5px; font-size: 12.5px; color: var(--ink);
  font-variant-numeric: tabular-nums;
}
.pf-dv .bar { justify-content: flex-start; }
/* Which schedule the figures came from. It existed only inside the UNPUBLISHED
   chip's tooltip, so a published row could never see it at all. */
.pf-basis {
  margin-top: 14px; padding-top: 11px; border-top: 1px solid var(--line);
  font-size: 11.5px; color: var(--ink-4);
}
.pf-bandleg { margin-top: 16px; padding-top: 15px; border-top: 1px solid var(--line); align-items: flex-start; }
@media (max-width: 1080px) { .pf-dgrid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* `table.grid tbody td` sets vertical-align:top at (0,1,2) and beat the (0,1,1)
   rule that tried to centre these; a two-line identity cell left every chip and
   figure floating at the top of its row. */
table.grid.pf-table tbody td { vertical-align: middle; }
table.grid.pf-table tbody .pf-detail > td { vertical-align: top; }
/* "Delete" broke to "Dele / te" once the column carried the page's right padding. */
.rowdel { white-space: nowrap; }

/* ============================ project switcher =====================   Sits between the organization header and the nav, where the thing you are
   inside belongs. The control is the sidebar's own material; the popover it
   opens is paper, because the list it shows is the page's content and not part
   of the rail. */
.sb-switch { position: relative; padding: 10px; }
.sb-sw {
  width: 100%; display: flex; align-items: center; gap: 9px; text-align: left;
  padding: 7px 9px; border-radius: 7px; cursor: pointer;
  background: var(--sidebar-bg-2); border: 1px solid var(--sidebar-line-2);
  color: var(--sidebar-text); transition: border-color .12s ease, background .12s ease;
}
.sb-sw:hover { border-color: #4A4E54; }
.sb-sw:focus-visible { outline: 2px solid var(--brand-accent); outline-offset: 1px; }
.sb-sw-av {
  flex: none; width: 24px; height: 24px; border-radius: 6px; display: grid;
  place-items: center; font-family: var(--mono); font-weight: 600; font-size: 11px;
  background: #33373C; color: var(--sidebar-text-2); letter-spacing: .02em;
}
.sb-sw-t { min-width: 0; flex: 1; display: block; }
.sb-sw-n {
  display: block; font-size: 12px; font-weight: 600; color: var(--sidebar-text);
  line-height: 1.25; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.sb-sw-s {
  display: block; font-size: 10.5px; color: var(--sidebar-label); line-height: 1.3;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.sb-sw-c { flex: none; width: 10px; height: 10px; color: var(--sidebar-label); }
.sb-sw[aria-expanded="true"] .sb-sw-c { transform: rotate(180deg); }

/* Fixed, not absolute. .sidebar scrolls (overflow-y: auto), so a positioned
   child of it is clipped at the rail's bounds and scrolls away with it — with
   enough projects, or on a short screen, the list was cut off by its own
   container. Fixed takes it out of that box; the coordinates come from the
   button on open.

   The shadow is tighter than the house popover's 8/24. That one lifts paper off
   paper and needs the spread; this one lands on the sidebar's ink, where the
   value contrast already does the separating and a wide soft halo only reads as
   generic elevation. Different ground, different lift. */
.sb-sw-pop {
  position: fixed; z-index: 60;
  background: var(--surface); border: 1px solid var(--line); border-radius: 8px;
  box-shadow: 0 4px 12px -4px rgba(18, 22, 27, .34);
  padding: 8px; display: flex; flex-direction: column;
}
.sb-sw-q { flex: none; padding: 2px 2px 8px; }
.sb-sw-q input {
  width: 100%; height: 30px; padding: 0 9px; font-size: 12px; color: var(--ink);
  background: var(--surface); border: 1px solid var(--control-line); border-radius: 6px;
}
.sb-sw-q input:focus {
  outline: none; border-color: var(--brand-accent);
  box-shadow: 0 0 0 3px rgba(180, 83, 26, .12);
}
.sb-sw-list { overflow-y: auto; min-height: 0; }
.sb-sw-row {
  width: 100%; display: flex; align-items: center; gap: 9px; text-align: left;
  padding: 6px 7px; border: 0; border-radius: 6px; background: none; cursor: pointer;
}
.sb-sw-row:hover { background: var(--surface-2); }
.sb-sw-row.on { background: var(--accent-tint); }
.sb-sw-row:focus-visible { outline: 2px solid var(--brand-accent); outline-offset: -2px; }
.sb-sw-av.sm { background: var(--line-2); color: var(--ink-2); }
.sb-sw-rt { min-width: 0; flex: 1; }
.sb-sw-rn {
  display: block; font-size: 12.5px; font-weight: 500; color: var(--ink);
  line-height: 1.3; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.sb-sw-rc {
  display: block; font-family: var(--mono); font-size: 11px; color: var(--ink-4);
  line-height: 1.35;
}
.sb-sw-dot { flex: none; width: 7px; height: 7px; border-radius: 50%; }
.sb-sw-dot.hi { background: var(--danger-dot); }
.sb-sw-dot.med { background: var(--warn-dot, var(--warn)); }
.sb-sw-dot.ok { background: var(--ok); }
.sb-sw-dot.none { background: var(--ink-5); }
.sb-sw-empty { margin: 4px 7px 8px; font-size: 11.5px; color: var(--ink-4); }
.sb-sw-foot {
  flex: none; margin-top: 6px; padding-top: 7px; border-top: 1px solid var(--line-2);
  display: flex; flex-direction: column; align-items: flex-start; gap: 2px;
}
.sb-sw-act {
  width: 100%; text-align: left; background: none; border: 0; cursor: pointer;
  padding: 6px 7px; border-radius: 6px; font-size: 12px; color: var(--ink-2);
}
.sb-sw-act:hover { background: var(--surface-2); color: var(--ink); }
.sb-sw-act.new { color: var(--brand-accent); font-weight: 600; }
.sb-sw-act:focus-visible { outline: 2px solid var(--brand-accent); outline-offset: -2px; }

/* --- the journey's state on the rail ---------------------------------------
   The dot each item already had, now carrying where the project is. Advisory
   only: a waiting item keeps its click and its title says what it waits on,
   because a stage waits on a fact -- a file, a second data date -- and refusing
   the screen would neither create that fact nor explain it.
   Scoped with :not(.on) so the active item keeps its white dot. */
.sb-item:not(.on) .dot.j-done { background: var(--ok); }
/* The one stage the journey proposes next. Exactly one item carries it. */
.sb-item:not(.on) .dot.j-next { background: var(--brand-accent); }
/* Workable, but not the suggestion: the rail's ordinary state. */
.sb-item:not(.on) .dot.j-ready { background: var(--sidebar-dot); }
.sb-item:not(.on) .dot.j-optional { background: var(--sidebar-dot); }
.sb-item:not(.on) .dot.j-waiting {
  background: none; box-shadow: inset 0 0 0 1px var(--sidebar-dot);
}
.sb-item.j-waiting:not(.on) { color: var(--sidebar-text-3); }

/* --- one measure for the working screens ------------------------------------
   The pane has none, so a screen runs from bezel to bezel on a wide monitor.
   Compare already sets its own; this is the same width for the screens that
   had never been given one. */
.measure { max-width: 1240px; margin: 0 auto; }

/* --- the next-step strip ----------------------------------------------------
   Where this project is and what to do next, on every one of its screens.
   Sibling to .verify-bar in structure -- a hairline-footed band under the top
   bar -- but neutral rather than warning: this is orientation, not an alert.
   One sentence, one control, nothing else. It is painted from the journey the
   project payload carries, so a screen cannot disagree with it. */
.next-strip {
  flex: none; display: flex; align-items: center; gap: 12px;
  padding: 8px 20px; background: var(--surface-3);
  border-bottom: 1px solid var(--line); font-size: 12.5px; color: var(--ink-2);
  line-height: 1.45;
}
.next-strip .ns-dot {
  width: 7px; height: 7px; flex: none; border-radius: 2px;
  background: var(--brand-accent);
}
.next-strip .ns-txt { flex: 1; min-width: 0; }
.next-strip .ns-go {
  flex: none; height: 26px; padding: 0 11px; border-radius: 6px; cursor: pointer;
  font-size: 12px; font-weight: 600; color: #fff;
  background: var(--accent); border: 1px solid var(--accent);
  transition: background .12s ease, border-color .12s ease;
}
.next-strip .ns-go:hover { background: var(--accent-hover); border-color: var(--accent-hover); }
.next-strip .ns-go:focus-visible { outline: 2px solid var(--brand-accent); outline-offset: 2px; }

/* --- wide tables scroll in their own container ------------------------------
   DESIGN.md: a wide structure scrolls inside its own container; the page never
   scrolls sideways. The Schedules table had no such container, so at 1180 its
   STATE column and row actions were simply off-canvas and dates broke at the
   hyphen. The wrapper scrolls; the dates hold their line. */
.tablewrap {
  overflow-x: auto; position: relative;
  /* Thin and in the control line where a platform draws a scrollbar at all.
     Not relied on: macOS overlay scrollbars hide at rest, and once
     scrollbar-width is set Chromium ignores ::-webkit-scrollbar entirely --
     so the visible-at-rest affordance is the drawn indicator below. */
  scrollbar-width: thin; scrollbar-color: var(--control-line) transparent;
}
/* The clipped edge is a rule, not a shadow. A 1px hairline down the inside of
   the right edge says "continues" in the one device this world uses for
   structure, and unlike the gradient it replaces it does not dissolve the row
   rules 28px short of their frame. */
.tablewrap.is-overflowing { box-shadow: inset -1px 0 0 var(--line); }
/* The drawn indicator: a hairline track under the table and a thumb in the
   control line, positioned by schedules.js from scrollLeft. Present at rest,
   on every platform, only while the table actually overflows. */
.tw-bar { position: relative; height: 2px; margin: 6px 12px 8px; background: var(--line-2); display: none; }
.tablewrap.is-overflowing + .tw-bar { display: block; }
.tw-thumb { position: absolute; top: 0; height: 2px; background: var(--control-line); border-radius: 1px; }
/* Inside a scrolling table nothing set in mono breaks: a date, an ID, a count.
   The data-date cell is a .mono div in a plain td -- neither .num nor .date --
   which is why the first rule here matched nothing and "31-Jul-" / "26" still
   wrapped at 1180. The container scrolls; the value holds its line. */
.tablewrap table.grid td.num, .tablewrap .mono { white-space: nowrap; }
/* The account-menu caret, drawn. It was a Unicode ▼ at 8px -- whatever glyph
   the reader's font supplied, sized by the text ramp. Same box as every other
   mark in the app. */
.usermenu .ic { color: var(--ink-4); }

/* ============================ new project =========================   One door into a project: you arrive with files, not with a form. The modal
   is therefore almost entirely one target, and the only thing it says back is
   a count -- what was found INSIDE the files belongs to the setup step that
   owns it, not to a preview here.

   Everything below is .np-scoped. `.scrim`, `.modal`, `.modal-head`,
   `.modal-body` and `.modal-foot` are shared by every other overlay in the
   app and are left exactly as they are. */
.modal.np { width: 560px; }
.modal.np .modal-head { padding: 20px 22px 14px; }
.modal.np .modal-head h2 { font-size: 17px; letter-spacing: -.01em; }
.modal.np .modal-head .sub { font-size: 12px; line-height: 1.5; max-width: 42ch; }
.modal.np .modal-body { padding: 0 22px 18px; }

/* The target. A dashed edge, because the boundary is an invitation and not a
   container -- and one that does not move: the border width, the padding and
   the radius are identical in every state, so nothing reflows when a drag
   enters. Only colour changes. */
.np-zone {
  border: 1.5px dashed var(--line);
  border-radius: 12px;
  background: var(--paper);
  padding: 34px 20px;
  text-align: center;
  cursor: default;
  transition: border-color .16s ease, background-color .16s ease, box-shadow .16s ease;
}
.np-zone-in { display: grid; gap: 5px; place-items: center; }
.np-d1 { font-size: 14.5px; font-weight: 600; color: var(--ink); letter-spacing: -.005em; }
.np-d2 { font-family: var(--mono); font-size: 10.5px; letter-spacing: .04em; text-transform: uppercase; color: var(--ink-4); }
.np-d3 { margin-top: 9px; display: flex; align-items: center; gap: 7px; flex-wrap: wrap; justify-content: center; }

/* Hover is a hint that the whole panel is live, not just the three links. */
.np-zone:hover { border-color: var(--ink-5); background: var(--surface-2); }

/* Drag. The one moment in this screen worth colour: the burnt orange that
   already means "active" everywhere else in the app. */
.np-zone.on {
  border-color: var(--brand-accent);
  border-style: solid;
  background: #FBF6F4;                            /* the accent at 5% over white, resolved */
  box-shadow: 0 0 0 3px rgba(180, 83, 26, .12);
}
.np-zone.on .np-d1 { color: var(--brand-accent); }

/* Reading. The target stops being a target, and says so by going quiet --
   no spinner: the count line underneath is already narrating. */
.np-zone.busy { opacity: .6; pointer-events: none; border-style: dotted; }

/* Three plain-text choices, not three buttons. Buttons here would compete with
   Continue, which is the only real action in the footer. */
.np-link {
  border: 0; background: none; padding: 0;
  font: inherit; font-size: 12px; font-weight: 500;
  color: var(--ink-2); cursor: pointer;
  border-bottom: 1px solid var(--line);
  transition: color .14s ease, border-color .14s ease;
}
.np-link:hover { color: var(--brand-accent); border-bottom-color: var(--brand-accent); }
.np-link:focus-visible { outline: 2px solid var(--brand-accent); outline-offset: 3px; border-radius: 2px; }
.np-sep { color: var(--ink-5); font-size: 11px; user-select: none; }

/* The count. Mono, because it is a reading of the files and not prose about
   them; and it arrives rather than appears, so the modal does not jump. */
.np-count {
  margin-top: 14px;
  font-family: var(--mono); font-size: 11.5px; line-height: 1.55;
  color: var(--ink-3);
  padding-left: 11px;
  border-left: 2px solid var(--line);
}
.modal.np .err { margin-top: 12px; }

@media (prefers-reduced-motion: no-preference) {
  /* Same entrance as the unlock card, and for the same reason: it starts from
     a VISIBLE default and settles. Nothing is parked at opacity 0 waiting on a
     script, so the modal is correct in a screenshot taken mid-animation. */
  .modal.np { animation: auth-settle .34s cubic-bezier(.16, 1, .3, 1) both; }
  .np-count { animation: np-count-in .28s cubic-bezier(.16, 1, .3, 1) both; }
  @keyframes np-count-in {
    from { opacity: .4; transform: translateY(-3px); }
    to   { opacity: 1;  transform: none; }
  }
}

@media (max-width: 640px) {
  .modal.np { width: 100%; }
  .np-zone { padding: 26px 14px; }
  .np-d3 { gap: 5px; }
}

/* ============================ intake, redesigned ===================   The cover sheet of the review: what arrived, on what date, and what could not
   be checked, before a number is read. It was a stack of cards with a tinted
   callout on top; it is set as the document now, in the same hand as the
   sign-in and the report itself. */

/* Narrower than the portfolio's 1240: this page is read, not scanned across. */
.sheet-meas { max-width: 1080px; }

/* The verdict, as the report's own section head.

   It was `.align-notice` -- a tinted callout with a 3px coloured stripe down its
   left edge, the one device this world refuses outright. And the verdict is not
   an aside on this page; it is the sentence the page exists to say. Severity is
   carried by the words and the marks, which were already doing it. */
.sheet-verdict {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 24px;
  align-items: start;
  padding-bottom: 16px; margin-bottom: 4px;
  border-bottom: 2px solid var(--ink);
}
.sheet-words {
  font-size: 26px; font-weight: 600; letter-spacing: -.025em; line-height: 1.22;
  text-wrap: balance;
}
.sheet-verdict.bad .sheet-words { color: var(--danger); }
.sheet-line {
  margin-top: 9px; font-size: 13px; line-height: 1.65; color: var(--ink-2);
  max-width: 70ch; text-wrap: pretty;
}
/* Four readings, in the mono this product prints every measured value in. */
.sheet-counts {
  grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: 20px; margin-top: 15px;
}
.sheet-count {
  display: inline-flex; align-items: center; gap: 7px;
  font-family: var(--mono); font-size: 11.5px; letter-spacing: .02em;
}
/* The readings' own modifiers. They were `ik-pass` / `ik-raise` / `ik-np`,
   which is the prefix that lies this promotion exists to stop: `.sheet-count`
   is shared, so Setup was rendering an Intake-prefixed class to say "confirmed".
   The row states in `.ik-row` keep theirs -- those really are Intake's. */
.sheet-count.ok .ic { color: var(--ok); }
.sheet-count.raise .ic { color: var(--warn-dot); }
.sheet-count.mute, .sheet-count.mute .ic { color: var(--ink-4); }
/* The action, beside the verdict. "Is this reviewable" and "what do I do about
   it" are one thought; this control was at the foot of a side panel. */
.sheet-act { display: flex; flex-direction: column; align-items: flex-end; gap: 7px; }
.sheet-act .hint { max-width: 32ch; text-align: right; }

/* `.hint` is the caption class this screen has always used -- under each packet
   item, under the action, under the receipt fields -- and NOTHING IN THE
   STYLESHEET EVER MATCHED IT. Every rule for it is scoped to somewhere else
   (`.field .hint`, `.smodal-foot .hint`, `.credbox .hint`), so here it inherited
   12.5px in full ink: the same size and the same colour as the `.ik-title`
   directly above it. Measured: title 12.5px rgb(20,24,29), caption 12.5px
   rgb(20,24,29). On an absent packet item it read as an inversion, the title
   greyed to --ink-4 and its own caption left darker than it.

   Scoped to this screen rather than given the bare `.hint` the app never had:
   a global rule would newly restyle every unmatched `.hint` in twelve screens
   nobody has looked at, which is a different change than this one. */
/* `.sheet-block .field .hint` is named explicitly so this wins on SPECIFICITY
   rather than on source order: `.field .hint` sets 10.5px at the same weight of
   selector, and a caption inside a block resolving correctly only because this
   rule happens to come later is the fragility this build spent two rounds
   removing from the container queries. */
.sheet-block .hint, .sheet-act .hint,
.sheet-block .field .hint { font-size: 11.5px; line-height: 1.5; color: var(--ink-4); }
.ik-file .hint { margin-top: 2px; }
.sheet-body > .hint { margin-top: 8px; }

/* Blocks on rules, not cards. A card inside a card was the shape this page had. */
.sheet-block { min-width: 0; }
.sheet-head {
  display: flex; align-items: baseline; gap: 14px; flex-wrap: wrap;
  padding-bottom: 8px; margin: 26px 0 0; border-bottom: 1px solid var(--ink);
}
.sheet-block > .sheet-head:first-child { margin-top: 20px; }
.sheet-t { font-size: 13px; font-weight: 600; letter-spacing: -.005em; }
.sheet-n { font-size: 11.5px; color: var(--ink-4); margin-left: auto; text-wrap: pretty; }
.sheet-body { padding: 12px 0 0; }

.sheet-two { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 11px; }
.sheet-two label { display: block; font-size: 11.5px; font-weight: 500; color: var(--ink-2); margin-bottom: 5px; }
.sheet-two input {
  width: 100%; height: 32px; padding: 0 9px; font-size: 12.5px; color: var(--ink);
  background: var(--surface); border: 1px solid var(--control-line); border-radius: 6px;
}
.sheet-two input:focus {
  outline: none; border-color: var(--brand-accent);
  box-shadow: 0 0 0 3px rgba(180, 83, 26, .12);
}

/* The month's schedule, in the create modal's own language -- the same dashed
   edge, the same burnt orange on drag, the same refusal to move under the
   cursor: border width, padding and radius are identical in every state. */
.ik-drop {
  border: 1.5px dashed var(--line); border-radius: 10px; background: var(--paper);
  padding: 16px 12px; display: grid; gap: 7px; place-items: center; text-align: center;
  transition: border-color .16s ease, background-color .16s ease;
}
.ik-drop:hover { border-color: var(--ink-5); background: var(--surface-2); }
.ik-drop.on { border-color: var(--brand-accent); border-style: solid; background: #FBF6F4; }
.ik-drop.busy { opacity: .6; pointer-events: none; border-style: dotted; }
.ik-drop-t { font-size: 12.5px; font-weight: 600; color: var(--ink); }

/* The eight rows, on hairlines rather than inside a card. The raise tint bleeds
   into the block's own gutter so the text still starts on the page's left edge. */
.ik-row { padding: 11px 12px; margin: 0 -12px; border-top: 1px solid var(--line-2); }
.ik-row:first-child { border-top: 0; }
/* The row's four columns, declared once. The value column is a FIXED width
   rather than `minmax(120px, auto)`: sized to its content it re-widthed on
   every row and the state word landed at a different x in each of the eight --
   a column of marks lining up beside labels that did not. A long value wraps
   inside its column instead of pushing it. */
.ik-head { grid-template-columns: 10px minmax(0, 1fr) 104px 240px; align-items: baseline; }

/* ---- how this page gives way when it is not given the room ---------------
   Keyed on the WIDTH OF THE COLUMN, not the width of the window. The two are
   not the same here and the difference is the whole bug: the shell's rail is a
   fixed 232px that never collapses, so at a 375px viewport this page is asked
   to set itself in 103px while `@media (max-width: …)` still reads 375 and
   picks a layout for a width the page does not have. Container queries ask the
   only question that has ever mattered to these rows -- how wide am I -- and
   answer it the same way whether the room was taken by the viewport, by the
   rail, or by something added later. */
.sheet-meas { container-type: inline-size; container-name: sheet; }

/* The two columns, as a class rather than a cssText string in the render
   function. It was inline -- `minmax(0,1fr) 300px` set on the element -- which
   no query of any kind can reach, so the page had exactly one layout at every
   width. Measured at a 1000px viewport: the 300px rail and the row's 354px of
   fixed track left 28px for the check title, which set one character per line. */
.ik-console {
  display: grid; grid-template-columns: minmax(0, 1fr); gap: 16px;
  align-items: start;
}
/* Every ruled block on this page is its own query container, so a check row
   answers to the width of the block it is in rather than to the page's. The
   declaration named the direct children of the grid; the blocks sit inside a
   column wrapper now, and a container that stops being an ancestor takes its
   two step-downs with it silently -- the title then wrapped one word per line
   while the 104px state and 240px value tracks held their full width. */
/* The checks are BANDS of one board now, not blocks of a column, so the band
   is the unit a check row answers to. Declared on the band and on the cards
   that are still cards -- the rail's, and the decision under the console. */
.ik-band,
.ik-screen > .sheet-block,
.ik-rail > .sheet-block { container-type: inline-size; container-name: sheetblock; }

/* The rail cannot sit beside the checks below this: 300px of rail plus the gap
   leaves the checks under 360px, where the title wraps whatever the row does.
   It goes under them, in the order it already had -- receipt, this month's
   file, the packet. */
@container sheet (max-width: 700px) {
  .ik-console { grid-template-columns: minmax(0, 1fr); gap: 4px; }
  /* Full width is right for the drop zone. It is not right for two date-sized
     fields, which would set 600px wide and read as a different control. */
  .sheet-two { grid-template-columns: repeat(2, minmax(0, 190px)); justify-content: start; }
}

/* The verdict and its action are one thought, so they hold one line for as long
   as one line holds both. */
@container sheet (max-width: 560px) {
  .sheet-verdict { grid-template-columns: minmax(0, 1fr); gap: 14px; }
  .sheet-act { align-items: flex-start; }
  .sheet-act .hint { text-align: left; }
  .sheet-words { font-size: 22px; }
  /* Stacked, the grid runs in source order and wedges the action between the
     verdict and its own readings, so the masthead stops being one unit at the
     width where the reader has least context. The readings close the verdict;
     the action follows them. */
  .sheet-verdict > *:first-child { order: 1; }
  .sheet-counts { order: 2; margin-top: 13px; }
  .sheet-act { order: 3; margin-top: 15px; }
}

/* Below this the row cannot hold four columns and still give the title the
   ~260px it needs to set on one or two lines. Derived from the row, not rounded
   to a device: 10 + 10 + 260 + 10 + 104 + 10 + 240 = 644. */
@container sheetblock (max-width: 643px) {
  /* The value leaves the header line and sets under the title, still in mono,
     still the measured reading -- the way the issued report sets a value that
     will not fit beside its label. The title keeps the whole first line.

     The state track stays FIXED, never `auto`. Sized to its own text it is 27px
     on a PASS row and 79px on a NOT PROVIDED one, so the eight state words
     start at three different x positions and the column stops being a column.
     Measured with `auto` in place: 637 / 631 / 584. */
  .ik-head { grid-template-columns: 10px minmax(0, 1fr) 104px; }
  .ik-value { grid-column: 2 / -1; text-align: left; margin-top: 3px; }
}

/* And here even that is more than the column has. The mark keeps the title
   company; the state word and the value stack under it. This is the shape the
   page takes inside the 103px the shell leaves it on a phone -- cramped, but
   set, rather than a title column computed to zero. */
@container sheetblock (max-width: 313px) {
  .ik-head { grid-template-columns: 10px minmax(0, 1fr); }
  .ik-state { grid-column: 2 / -1; margin-top: 4px; }
  .ik-value { grid-column: 2 / -1; margin-top: 2px; }
  .ik-sub { margin-left: 20px; }
}

/* The empty project, and the file the drop zone refuses ------------------- */
.ik-empty {
  padding: 18px 0 4px; font-size: 13px; line-height: 1.6;
  color: var(--ink-2); max-width: 62ch; text-wrap: pretty;
}
/* Progress and refusal shared one `.hint`, so "those are not .xer files"
   arrived at 11.5px in the lightest ink on the page -- the treatment of a
   caption, for the one sentence on the block that says something went wrong. */
.sheet-refuse {
  margin-top: 8px; font-size: 12.5px; font-weight: 500; line-height: 1.5;
  color: var(--danger);
}
.sheet-body > .btn { margin-top: 8px; }

/* The date control. It is the one element on this page that belongs to no
   design system: the platform's own picker, sitting beside a themed transmittal
   field in the page's most document-like block. Replacing it outright means
   building a date picker, which is a different piece of work; what is in scope
   is stopping it reading as a foreign object -- the digits set in the mono this
   product prints every measured value in, and the platform glyph toned off its
   default blue-grey onto the page's ink. */
.sheet-two input[type="date"] { font-family: var(--mono); font-size: 12px; letter-spacing: .01em; }
.sheet-two input[type="date"]::-webkit-calendar-picker-indicator {
  opacity: .4; cursor: pointer; transition: opacity .16s ease;
}
.sheet-two input[type="date"]::-webkit-calendar-picker-indicator:hover { opacity: .85; }
@media (prefers-reduced-motion: reduce) {
  .sheet-two input[type="date"]::-webkit-calendar-picker-indicator { transition: none; }
}

/* ---- the shell's rail, on a narrow window --------------------------------
   `width: 232px; flex: none` with no rule anywhere that narrowed it. On a
   375px phone that is 62% of the screen and the content column is 103px --
   every screen, not only this one, and the reason the intake capture at that
   width was unshippable however well the page set itself in the room it had.

   It becomes the strip it already is in miniature: the org mark, the project
   switcher, and the same nav items in the same order, scrolling sideways in
   their own container. No new control, no menu to open, no JavaScript --
   nothing above 820px changes by a pixel. The group labels and the footer's
   reference block are what a strip cannot carry; both are stated elsewhere in
   the product, and neither is a way to get anywhere. */
@media (max-width: 819px) {
  .app { flex-direction: column; }
  .sidebar {
    width: auto; flex: none; flex-direction: row; align-items: center; gap: 4px;
    padding: 0; overflow-x: auto; overflow-y: hidden;
    border-bottom: 1px solid var(--sidebar-line-2);
    scrollbar-width: thin;
  }
  /* The mark and the switcher hold the left edge while the nav scrolls behind
     them. Without this the strip scrolls the project's identity off screen to
     bring the active item into view, and on a phone -- where the breadcrumb is
     hidden too -- nothing on the page would say which project it is. */
  .sb-org {
    height: 46px; margin-right: 0;
    border-bottom: 0; border-right: 1px solid var(--sidebar-line);
    position: sticky; left: 0; z-index: 2; background: var(--sidebar-bg);
    /* The strip carries no horizontal padding of its own at this width: a
       padded scroll container leaves a gutter the sticky block cannot cover,
       and nav labels scrolled through it -- a stray letter at x=0, beside the
       mark. The two sticky blocks own their own insets instead. */
    padding: 0 10px 0 8px;
  }
  .sb-org-kicker { display: none; }
  .sb-switch {
    flex: none; padding: 6px 0;
    /* Flush against the mark's block, at rest AND once stuck. The strip's own
       4px flex gap sat between the two painted backgrounds, and a sticky
       element pins its MARGIN box, so the gap could not be closed by margin
       alone -- it stayed a transparent seam a scrolling glyph shows through
       for the first 4px of travel. The negative margin cancels the gap so the
       natural position is already 52; `left` then holds it there. Both numbers
       are the mark block's measured right edge: padding 8 + mark 26 + padding
       8 + rule 1 + ... = 52. */
    position: sticky; left: 52px; margin-left: -4px;
    /* Above the topbar (5), not just above its siblings in the strip. Sticky
       makes this element a STACKING CONTEXT, so the switcher's panel is sealed
       inside it and its own z-index counts for nothing outside: at 2 the panel
       opened underneath the topbar, which ate the top 55px of it -- the whole
       search field, invisible, while the rows below it showed fine. */
    z-index: 20; background: var(--sidebar-bg);
  }
  .sb-sw { width: 190px; }
  .sb-group { display: flex; align-items: center; gap: 3px; padding: 0; flex: none; }
  .sb-kicker { display: none; }
  .sb-item { width: auto; flex: none; padding: 7px 10px; white-space: nowrap; }
  /* The last item needs the gutter the container gave up. */
  .sb-group:last-of-type { padding-right: 8px; }
  .sb-item .sb-count, .sb-item .pill { margin-left: 4px; }
  .sb-footer { display: none; }
  .main { min-height: 0; }
}

/* Narrower still: a phone. Two things were taking the strip's whole width
   before a single nav item appeared -- the organization's name, which on a long
   one is 180px, and a breadcrumb repeating what the switcher and the page's own
   h1 already say. The mark keeps the organization's identity; the switcher
   keeps the project's; and the nav starts on screen instead of behind a
   sideways scroll with nothing to say it is there. */
@media (max-width: 599px) {
  .sb-org-name { display: none; }
  .sb-org { padding-right: 8px; }
  .sb-sw { width: 148px; }
  .crumbs { display: none; }
  /* With the crumbs gone the topbar was 54px of nothing with the account chip
     pinned right -- and it kept the hairline that used to separate the two, a
     divider with nothing on its left. Both are chrome the phone cannot afford:
     stacked under the 56px strip it was ~110px before the page began, on the
     one viewport this whole rule exists to give room to. */
  .topbar { height: 42px; padding: 0 12px; }
  .topbar-div { display: none; }
}

/* ================= intake: the cover sheet, by who has to act ======   Nine check rows used to arrive in one list in three states, and two of those
   states looked alike while meaning opposite things -- a grey row is either
   "they never sent it" or "we never configured it", and those take opposite
   responses. They are ruled blocks now, ordered so the owner of the work
   changes exactly once, and everything that passed is a count that opens.

   The components are the ones this world already records: the page verdict,
   the ruled block, the check row, the drop zone. What is added here is only
   what Intake genuinely needed and did not have -- a row for a document that
   did not arrive, a row for a setting nobody made, and the series as a list of
   places. No card, no tint that a state has not earned, no numbered section. */

.ik-bands, .ik-rail { min-width: 0; }
.ik-rail > .sheet-block + .sheet-block { margin-top: 26px; }

/* A row that raised keeps the check row it always was: the wash bleeds into
   the block's gutter so the text still starts on the page's left edge. */
.ik-row.ik-raise { background: var(--warn-tint); margin: 0 -12px; }
.ik-row.ik-raise .ik-title { color: var(--ink); }
.ik-row.ik-raise .ik-state { color: var(--warn); }
.ik-row.ik-raise .ik-value { color: var(--warn); }
.ik-row.ik-raise .ic { color: var(--warn-dot); }

/* A document that did not arrive, and a check nobody configured. Two facts
   that read alike in one list and do not belong in one: the first is the
   contractor's to send, the second is the reviewer's to set. Both are rows on
   the block's own hairline, not boxes -- the difference is said in the block
   each sits in and in the word on its right. */
.ik-miss, .ik-gap {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 3px 12px;
  align-items: baseline; padding: 11px 0; border-top: 1px solid var(--line-2);
}
.ik-miss:first-child, .ik-gap:first-child { border-top: 0; }
.ik-miss .t, .ik-gap .t { grid-column: 1; font-size: 12.5px; font-weight: 500; overflow-wrap: anywhere; }
.ik-miss .s, .ik-gap .s { grid-column: 2; font-size: 11.5px; color: var(--ink-4); text-align: right; }
.ik-miss .d, .ik-gap .d {
  grid-column: 1 / -1; font-size: 12px; line-height: 1.55; color: var(--ink-3); max-width: 74ch;
}

/* What passed, or what arrived. Evidence behind a count, never rows of equal
   weight with the things that need doing. */
.ik-fold { margin-top: 12px; }
.ik-fold summary {
  cursor: pointer; font-size: 12px; color: var(--ink-3); list-style: none;
  padding: 7px 0; border-top: 1px solid var(--line-2);
}
.ik-fold summary::-webkit-details-marker { display: none; }
.ik-fold summary::before { content: "\25B8\00a0"; color: var(--ink-5); }
.ik-fold[open] summary::before { content: "\25BE\00a0"; }
.ik-fold summary:hover { color: var(--ink); }
.ik-fold summary:focus-visible { outline: 2px solid var(--brand-accent); outline-offset: -2px; border-radius: 3px; }
.ik-plist { padding-bottom: 4px; }
.ik-prow {
  display: grid; grid-template-columns: 10px minmax(0, 1fr) auto; gap: 10px;
  align-items: baseline; padding: 7px 0; font-size: 12px; color: var(--ink-2);
}
.ik-prow .ic { color: var(--ok); position: relative; top: 1px; }
.ik-prow .t { min-width: 0; overflow-wrap: anywhere; }
.ik-prow .v { font-family: var(--mono); font-size: 11.5px; color: var(--ink-4); text-align: right; }
.ik-none { font-size: 12.5px; line-height: 1.6; color: var(--ink-3); max-width: 72ch; }
.ik-none + .ik-gap, .ik-none + .ik-miss { margin-top: 12px; }

/* The series, set the way this world sets a list of places: rows on hairlines,
   no box and no fill in any state. Where-you-are is ink and weight. */
.ik-file-row {
  display: grid; grid-template-columns: 10px minmax(0, 1fr) auto; gap: 10px;
  align-items: baseline; width: 100%; text-align: left;
  padding: 9px 10px; margin: 0 -10px; border: 0; border-top: 1px solid var(--line-2);
  background: none; font: inherit; color: var(--ink-3); cursor: pointer;
  transition: color .16s ease;
}
.ik-file-row:first-of-type { border-top: 0; }
.ik-file-row:hover { color: var(--ink); }
.ik-file-row:hover .ic { color: var(--ink-2); }
.ik-file-row .nm { font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ik-file-row .dt { font-size: 11.5px; color: var(--ink-4); }
.ik-file-row.on { color: var(--ink); }
.ik-file-row.on .nm { font-weight: 500; }
.ik-file-row.on .ic { color: var(--ok); }
.ik-file-row:focus-visible { outline: 2px solid var(--brand-accent); outline-offset: -2px; border-radius: 3px; }

/* The month's file is the first block of the rail and a drop zone at rest: on
   the project's front door the commonest act of the month is receiving a
   schedule, and it was a small button at the foot of the page. */
.ik-rail .ik-drop { padding: 22px 14px; }

@container sheet (max-width: 700px) {
  .ik-rail > .sheet-block + .sheet-block { margin-top: 22px; }
}

/* ---- the six, as a ribbon ---- */
.su-ribbon { display: flex; flex-wrap: wrap; gap: 2px; padding: 12px 34px 0; }
.su-tab {
  display: flex; align-items: center; gap: 9px; flex: 0 1 194px; min-width: 0;
  padding: 9px 12px 12px; margin-bottom: -1px;
  border: 0; border-bottom: 2px solid transparent; background: transparent;
  font: inherit; color: var(--ink-3); cursor: pointer; text-align: left;
  transition: color .18s ease, border-color .2s ease;
}
.su-tab:hover { color: var(--ink); }
.su-tab.on { color: var(--ink); border-bottom-color: var(--brand-accent); }
.su-tab:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; border-radius: 3px; }
.su-glyph {
  width: 21px; height: 21px; flex: none; border-radius: 50%;
  display: grid; place-items: center;
  background: var(--surface-2); color: var(--ink-3);
  font-family: var(--mono); font-size: 10.5px;
  transition: background-color .2s ease, color .2s ease;
}
.su-tab.on .su-glyph { background: var(--brand-accent); color: #fff; }
.su-tab.done .su-glyph { background: var(--ok-tint); color: var(--ok); }
.su-tab.done .su-glyph .ic { color: var(--ok); }
.su-tab.blocked .su-glyph { color: var(--ink-5); }
.su-tab .su-t {
  font-size: 13px; font-weight: 500;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.su-tab .su-sub {
  margin-top: 1px; font-size: 11.5px; color: var(--ink-4);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.su-tab .su-sub.ok { color: var(--ok); }

/* ---- scrolling body ---- */
.su-body { flex: 1 1 auto; display: flex; justify-content: center; padding: 34px; }
/* OUTER: persists across steps, never replaced, owns the width transition.
   Replacing this node would kill the transition and the column would jump
   between 660 and 880 instead of gliding.

   Anchored to the measure's left edge, not centred in it. Centred, its left
   edge moved 110px inward and outward as the width changed -- the content
   swinging left, right, left across the six steps. The right edge extends and
   the left one stays put, which is how a document widens a column. */
.su-col {
  width: 100%; min-width: 0; max-width: 660px; margin-right: auto;
  transition: max-width .3s cubic-bezier(.22, .9, .2, 1);
}
.su-col.w660 { max-width: 660px; }
.su-col.w880 { max-width: 880px; }
.su-col.w900 { max-width: 900px; }

/* The step's own heading, its state, and the sentence under it. */
.su-lead { margin-bottom: 26px; }
.su-h { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
.su-h h1 { margin: 0; font-size: 27px; font-weight: 600; letter-spacing: -.022em; text-wrap: balance; }
.su-blurb {
  margin: 8px 0 0; font-size: 14.5px; line-height: 1.55;
  color: var(--ink-3); max-width: 70ch; text-wrap: pretty;
}

/* ---- sticky footer ---- */
.su-foot {
  position: sticky; bottom: 0; z-index: 25;
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  padding: 14px 34px;
  background: color-mix(in srgb, var(--paper) 94%, transparent);
  backdrop-filter: blur(10px); border-top: 1px solid var(--line);
}
.su-foot .sp { flex: 1 1 auto; }

/* ---- underline fields ----
   On a step whose job is confirming what the files already said, a box invites
   typing where a line invites reading. Same control, same focus ring the rest
   of the app uses; only the frame is gone. */
.setup-screen input.st-under {
  width: 100%; max-width: 440px; padding: 0 0 8px;
  border: 0; border-bottom: 2px solid var(--input-line); border-radius: 0;
  background: transparent; font-size: 21px; font-weight: 500; letter-spacing: -.015em;
  transition: border-color .16s ease;
}
/* The handoff drew this at 180px for a short number. This product's own
   identifier field takes 300 characters (walk-log #1) and a real contract
   number clipped at 180; it is sized to the value it holds. */
.setup-screen input.st-under.narrow { max-width: 24ch; }
.setup-screen input.st-under:focus,
.setup-screen input.st-under:focus-visible {
  outline: 0; border-bottom-color: var(--brand-accent); box-shadow: none;
}

/* A control is sized by its KIND, never by the column it lands in: step 2 and
   step 4 widen to 880px and a text field has no business being 880px wide. */
.setup-screen .field > input:not(.st-under):not(.st-file) { max-width: 460px; }
.st-lstand { display: flex; align-items: flex-end; gap: 16px; flex-wrap: wrap; }
.st-lstand .sp { flex: 1 1 auto; }

/* Setup's own toast carries an Undo, because three of its actions are
   reversible. The shared toast is untouched. */
/* The shared toast declares its own look inline, from script; this one is a
   class, because a declaration no query can reach is the defect this screen
   spent a stage removing. */
.su-toast {
  display: inline-flex; align-items: center; gap: 12px;
  max-width: 100%; padding: 6px 14px; border-radius: 999px;
  pointer-events: auto; box-shadow: 0 10px 28px rgba(20, 24, 29, .14);
  color: var(--ok); background: var(--ok-tint); border-color: var(--ok-line);
}
.su-undo {
  border: 0; background: none; padding: 0; font: inherit; font-size: 12.5px;
  color: inherit; text-decoration: underline; cursor: pointer;
}

/* The shape that arrives, in the same task as the click. */
.su-skel .su-tab .skel { width: 74%; height: 21px; }
.su-skel .su-col .skel { width: 72%; }
.su-skel .su-col .skel:nth-child(2) { width: 88%; }
.su-skel .su-col .skel:nth-child(3) { width: 60%; }
.su-skel .su-col .skel:nth-child(4) { width: 80%; }

@media (prefers-reduced-motion: reduce) {
  .su-col, .su-tab, .su-glyph { transition: none; }
}
/* Native checkboxes, in step 6 and in step 4's value pickers: on the page that
   decides what the issued review prints, six of them arrived in the platform's
   blue. Themed, not replaced. */
.su-check input[type="checkbox"], .sheet-body input[type="checkbox"] {
  accent-color: var(--ink); width: 13px; height: 13px;
}
.st-ev .st-fact,
.st-ev .st-none { background: var(--surface); padding: 12px 14px; }
.st-none { font-size: 12px; line-height: 1.6; color: var(--ink-3); max-width: 62ch; padding: 4px 0; }
.sheet-counts { overflow: hidden; }
.np-label { width: 100%; height: 28px; padding: 0 8px; font: inherit; font-size: 12px; border: 1px solid var(--input-line); border-radius: 4px; }

/* Intake saying its answers are the pinned ones. Every other surface that
   shows a stored number already says so; this screen showed nothing. */
.sheet-line.stale-line {
  display: flex; align-items: baseline; gap: 7px;
  margin-top: 9px; color: var(--warn); max-width: 74ch;
}
/* The prose is ONE flex item that wraps inside itself. Without this the mark
   takes its share of the row and the sentence is squeezed into whatever is
   left; `min-width: 0` lets it use the measure instead of its shrink-to-fit
   minimum. */
.sheet-line.stale-line .stale-words { flex: 1 1 auto; min-width: 0; }
/* The panel answers against the selections, which may not be what is stored. */
.sheet-n.f-warn { color: var(--warn); }

/* ---- the last of the platform's chrome ---------------------------------
   Four selects on this screen rendered as native controls -- native chevron,
   native metrics, native box -- beside inputs the page themes carefully, and
   one of them is the control step 4 exists for. The same call the checkboxes
   and the file control already took here: themed, not replaced. The chevron is
   drawn at the icon system's own weight (1.4 on a 10x10 field), not borrowed
   from a glyph. */
.sheet-body select {
  appearance: none; -webkit-appearance: none;
  width: 100%; height: 32px; padding: 0 30px 0 10px;
  font: inherit; font-size: 12.5px; color: var(--ink); cursor: pointer;
  background-color: var(--surface); border: 1px solid var(--input-line); border-radius: 8px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'%3E%3Cpath d='M2.6 4 L5 6.6 L7.4 4' fill='none' stroke='%235F6067' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 9px center; background-size: 10px 10px;
  transition: border-color .14s ease;
}
.sheet-body select:hover { border-color: var(--ink-5); }
.sheet-body select:focus-visible {
  outline: none; border-color: var(--brand-accent);
  box-shadow: 0 0 0 3px rgba(180, 83, 26, .12);
}
@media (prefers-reduced-motion: reduce) { .sheet-body select { transition: none; } }
/* A control's width is a property of the control, not of the column it happens
   to sit in. Scoped to the whole step interior rather than to the full-measure
   blocks: with the cap on `.st-block` alone, step 3's upload was 460px directly
   beneath a full-width template select in the same step, and the step's two
   states -- margin present, margin collapsed -- disagreed about how wide a
   control is. `.sheet-body .field` reaches Setup and nothing else: Intake
   shares the `sheet-` vocabulary but builds no fields, and the sign-in page's
   fields are outside this block. */
.sheet-body .field > input, .sheet-body .field > select, .sheet-body .field > .st-pick {
  max-width: 460px;
}
/* The textarea takes the same measure, not a wider one. A 600px cap looked
   like generosity and was a second rule: the claim column is narrower than
   that while the margin is present, so the box filled its column in one state
   and hit its cap in the other, and step 3 disagreed with itself. 460px at
   12px is about 76 characters, which is the measure this system already sets
   prose to. */
.sheet-body .field > textarea { max-width: 460px; }
/* And the caption belongs to the control, not to the page. Left at the full
   1150px it ran ~150 characters a line and passed under the fold rule, so the
   block read as a wide paragraph with a small control tucked into it. Same
   76ch the step's own sentence takes. */
.sheet-body .field .hint { max-width: 76ch; }

/* One caption tier on this surface, 11.5px, the same one `.su-blurb`,
   `.su-note` and `.st-unver` take. The ledger first shipped its refusal
   sentences at 11px and its column words at 10.5px -- sizes on no tier, and
   the 11px ones carry requirement text: WHY a limit is refused, and what runs
   instead. A value earns its place by being legible, not by being small enough
   that a rule stops noticing it. */
/* ---- step 3: the binding ledger ----------------------------------------
   Which rule is bound to which paragraph of this contract, and what that
   paragraph says. The browser always had this -- `spec.citations` carries the
   paragraph, the sentence and the document for every bound rule -- and the
   screen was rendering its cardinality ("6 checks cited") and discarding the
   rest, so nowhere in the product could a reviewer learn which rule cited
   which clause. */
.st-lstand {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 20px;
  padding-bottom: 12px; margin-bottom: 2px;
}
/* `inline-flex` eats the space the text carries between the numeral and its
   word, so the gap is drawn rather than typed. */
.st-lcount { display: inline-flex; align-items: baseline; gap: 5px; color: var(--ink-4); }
.st-lcount .n { font-size: 15px; font-weight: 500; color: var(--ink-2); letter-spacing: -.01em; }
.st-lcount .w { font-size: 11.5px; }
.st-lcount.ok .n { color: var(--ok); }
.st-lcount.raise .n { color: var(--warn); }

.st-ledger { margin-top: 2px; }
/* One word for the one column that cannot name itself. Not a table head: the
   rule and the paragraph say what they are, and step 3 drawing a header row
   would make it the only one of the six that does. Dropped entirely, with the
   column, when no paragraph in the ledger states a number. */
.st-lhead {
  display: grid; grid-template-columns: 10px minmax(0, 1fr) 108px 74px; gap: 14px;
  padding: 0 12px 6px; margin: 0 -12px;
  font-size: 11.5px; color: var(--ink-4);
}
.st-lhead > span { grid-column: 4; text-align: right; }
/* One block per BINDING: the paragraph, the rules it binds, the limit it
   states, and its sentence once. The same spine grammar as step 2's series and
   step 5's record -- no table, no header row. */
.st-bind {
  padding: 11px 12px; margin: 0 -12px; border-top: 1px solid var(--line-2);
  transition: background-color .14s ease;
}
.st-bind:first-of-type { border-top: 0; }
.st-bind:hover { background: var(--surface-2); }
.st-bind:focus-visible { outline: 2px solid var(--brand-accent); outline-offset: -2px; border-radius: 3px; }
.st-bind .h {
  display: grid; grid-template-columns: 10px minmax(0, 1fr) 108px 74px; gap: 3px 14px;
  align-items: baseline;
}
.st-ledger.nolimit .st-bind .h { grid-template-columns: 10px minmax(0, 1fr) 108px; }
.st-bind .nms { min-width: 0; }
.st-bind .nm { font-size: 12.5px; font-weight: 500; }
.st-bind .nm + .nm { margin-top: 2px; }
/* Left-aligned on a fixed track, so the ¶ glyph is the column's own standing
   label and the numbers align on their first level rather than their last.
   Right-aligned, "¶ 1.6.4" and "¶ 1.10.1.5.6" started at different x and the
   mark that names the column wandered down the page. */
.st-bind .pa { font-size: 11.5px; color: var(--ink-2); white-space: nowrap; }
.st-bind .th { font-size: 11.5px; color: var(--ink); font-weight: 500; text-align: right; }
/* The column's word travels with the value, and shows only where the header
   above cannot follow it. */
.st-bind .th .w { display: none; }
.st-bind .th.none { color: var(--ink-5); font-weight: 400; }
/* The sentence that binds them, as the document has it -- heading and all,
   because this screen prints the string a finding will cite. Sans, not mono:
   this is prose, and mono in this world means a measured value. The heading
   takes the label tier so the quotation opens at the sentence. */
.st-bind .q {
  margin: 5px 0 0 24px; font-size: 11.5px; line-height: 1.55; color: var(--ink-3);
  max-width: 84ch; text-wrap: pretty;
}
.st-bind .q .hd { font-weight: 600; color: var(--ink-4); margin-right: 6px; }
.st-bind .cf, .st-bind .nap, .st-bind .src { margin: 5px 0 0 24px; max-width: 84ch; }
.st-bind .cf, .st-bind .nap { font-size: 11.5px; line-height: 1.5; color: var(--warn); }
/* Two words, on a mixed ledger only: which of the two sections binds this row. */
.st-bind .src { font-size: 11.5px; color: var(--ink-4); }
/* Bound to the standard section rather than to this contract: the block sits
   back, because none of it has been verified against the document that governs
   this job. */
.st-bind.template .nm, .st-bind.template .pa { color: var(--ink-3); }
.st-bind.template .ic { color: var(--ink-5); }
.st-bind.contract .ic { color: var(--ok); }
/* A limit stated in more than one paragraph. Tint and a hairline, which is how
   this system says severity -- never a coloured bar down the side. */
.st-bind.raised { background: var(--warn-tint); }
.st-bind.raised:hover { background: var(--warn-tint); }
.st-bind.raised .ic { color: var(--warn-dot); }
/* And the sentence itself, once, under the ledger. */
.st-unver {
  margin-top: 14px; font-size: 11.5px; line-height: 1.55; color: var(--ink-4);
  max-width: 80ch; text-wrap: pretty;
}
@media (prefers-reduced-motion: reduce) { .st-bind { transition: none; } }

/* A limit the section was searched for and does not state in a usable form.
   It has no paragraph, so it belongs to no row above -- and it is the most
   specific thing this screen can say, so it is not dropped. */
.st-loose { margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--line-3); }
.st-loose .gh {
  font-size: 11.5px; font-weight: 600; color: var(--ink-3);
  margin-bottom: 6px; padding-bottom: 4px; border-bottom: 1px solid var(--line-3);
}
.st-loose .l {
  display: grid; grid-template-columns: 10px minmax(0, 1fr) auto; gap: 3px 12px;
  align-items: baseline; padding: 6px 0; max-width: 640px;
}
.st-loose .l .ic { color: var(--ink-5); }
.st-loose .nm { font-size: 12px; color: var(--ink-2); }
.st-loose .v { font-size: 11.5px; color: var(--ink); }
.st-loose .why { grid-column: 2 / -1; font-size: 11.5px; line-height: 1.5; color: var(--ink-4); max-width: 80ch; }
/* A number the document states and the engine will not use. Struck, not
   hidden: the section said it, and the reviewer has to know it said it. */
.st-bind .th.off { color: var(--ink-4); }
.st-bind .th.off .v, .st-loose .v.off { text-decoration: line-through; }

/* What cites no clause: counted, and openable. 45 rows that all say the same
   thing bury the six that do not. */
.st-unbound { margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--line-3); }
.st-unbound .h { display: grid; grid-template-columns: 10px minmax(0, 1fr) auto; gap: 12px; align-items: baseline; }
.st-unbound .t { font-size: 11.5px; line-height: 1.55; color: var(--ink-4); max-width: 80ch; }
.st-unbound .t .n { font-size: 12.5px; font-weight: 500; color: var(--ink-2); }
/* Held to a measure. Across the full 1150px the rule and its DCMA reference sat
   at opposite ends of the row and the eye could not connect them; a reference
   that cannot be read against its rule is not a reference. */
.st-unlist:not(:empty) { margin: 12px 0 0 22px; max-width: 640px; }
.st-unlist .gh {
  font-size: 11.5px; font-weight: 600; color: var(--ink-3);
  margin: 12px 0 4px; padding-bottom: 4px; border-bottom: 1px solid var(--line-3);
}
.st-unlist .gh:first-child { margin-top: 0; }
.st-unlist .u {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 12px;
  align-items: baseline; padding: 4px 0; font-size: 12px;
}
.st-unlist .u .nm { color: var(--ink-2); }
.st-unlist .u .d { font-size: 11.5px; color: var(--ink-4); }

/* ---- step 3: the summary line and the binding panel ----------------------
   The two questions are the step; this one line states what they produced
   and opens the ledger beneath it. A button set as a rule, not a card: the
   fold's own device, so opening the detail does not read as a second page. */
.st-sumrow { margin-top: 22px; }
.st-sumline {
  display: flex; gap: 14px; align-items: baseline; width: 100%; text-align: left;
  padding: 10px 0; margin: 0; border: 0; border-top: 1px solid var(--line-3);
  border-bottom: 1px solid var(--line-3); background: none; font: inherit;
  color: var(--ink-2); cursor: pointer;
}
.st-sumline .t { flex: 1 1 auto; font-size: 12.5px; line-height: 1.5; }
.st-sumline .h { font-size: 11.5px; color: var(--ink-4); white-space: nowrap; }
.st-sumline:hover .h, .st-sumline:focus-visible .h { color: var(--ink); }
.st-sumline:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
.st-preview { margin-top: 6px; }
.st-bindpanel { margin-top: 12px; }

/* ---- how Setup gives way, all of it, after the rules it overrides --------
   Keyed on the column, not the window, for the reason recorded on Intake. */

/* The rail cannot sit beside the step below this: 232 + 20 leaves the panel
   under 380px, where a paired field row breaks. So it stacks -- and the STEP
   goes first, the rail under it. Stacked in source order the six pushed the
   open step to ~675px of an 844px phone, so the page a reader opened to answer
   a step began with a table of contents and every field of it sat below the
   fold. Measured after: the step head at ~447px, its first field above.

   The rail stays a COLUMN there rather than becoming a scrolling strip. That
   was the first shape, and looking at it settled it: six full step names read
   down the page in the room a phone has to spare, where a sideways strip would
   hide four of them behind a scroll to save vertical space nothing wanted. */
@container sheet (max-width: 640px) {
  .su-top-r1, .su-ribbon { padding-left: 16px; padding-right: 16px; }
  .su-body { padding: 22px 16px; }
  .su-foot { padding: 12px 16px; }
  .su-h h1 { font-size: 22px; }
  /* At 375px a 194px tab is one per row, and six rows of sticky header is
     ~250px before the page begins -- the same defect this screen fixed once
     before, where the step a reader opened the page to answer sat below the
     fold under a table of contents. The ribbon becomes ONE scrolling row
     there: every step is still reachable, and the content gets the page. */
  .su-ribbon {
    flex-wrap: nowrap; overflow-x: auto; overscroll-behavior-x: contain;
    scrollbar-width: none;
  }
  .su-ribbon::-webkit-scrollbar { display: none; }
  .su-tab { flex: 0 0 auto; max-width: 62vw; }
}

/* A rule, its paragraph and its limit stop fitting on one line: the paragraph
   and the limit drop under the name they belong to, still in that order. */
@container sheet (max-width: 520px) {
  .st-bind .h, .st-ledger.nolimit .st-bind .h { grid-template-columns: 10px minmax(0, 1fr); }
  .st-bind .pa, .st-bind .th { grid-column: 2 / -1; text-align: left; }
  .st-lhead { display: none; }
  /* The column label goes with the column, and an em-dash with nothing to
     align under it reads as a stray mark rather than as "no limit stated".
     The absence is still said -- by the paragraph having no number beside it. */
  .st-bind .th.none { display: none; }
  /* And a value with no column left to head it says its own word. */
  .st-bind .th .w { display: inline; font-family: var(--sans); font-weight: 400; color: var(--ink-4); }
  .st-unbound .h { grid-template-columns: 10px minmax(0, 1fr); }
  .st-unbound .h .btn { grid-column: 2 / -1; justify-self: start; margin-top: 8px; }
}

/* --- the export composer (Module A) --------------------------------------- *
 * Controls on the left, the document on the right at the size it prints. The
 * document is an iframe on purpose: `report.css` and `print.css` style the same
 * `.doc-*` class names the comparison screen uses, so loading them into the app
 * would restyle the page behind the composer. A frame gives the real
 * stylesheets, in full, with nothing to isolate by hand. */
/* `.scrim` is a centring grid, which shrink-wraps its child — right for a
   600px dialog, wrong for a working surface that wants the window. */
.compose-scrim { place-items: stretch; padding: 22px; }
.composer {
  display: flex; flex-direction: column;
  width: 100%; max-width: 1500px; height: 100%; margin: 0 auto;
  background: var(--surface); border: 1px solid var(--line); border-radius: 4px;
  box-shadow: 0 24px 64px -24px rgba(18, 22, 27, .4); overflow: hidden;
}
.composer-head {
  display: flex; align-items: center; gap: 14px; padding: 14px 18px;
  border-bottom: 1px solid var(--line);
}
.composer-head h2 { margin: 2px 0 0; font-size: 17px; }
.composer-pages {
  margin-left: auto; font-family: var(--mono); font-size: 10.5px;
  letter-spacing: .08em; text-transform: uppercase; color: var(--ink-4);
  border: 1px solid var(--line); border-radius: 999px; padding: 3px 10px;
}
.composer-split { flex: 1; min-height: 0; display: flex; }
.composer-rail {
  width: 320px; flex: none; overflow-y: auto; padding: 4px 16px 18px;
  border-right: 1px solid var(--line); background: var(--surface-2);
}
.composer-group { padding: 14px 0 4px; border-bottom: 1px solid var(--line-2); }
.composer-group:last-child { border-bottom: 0; }
.composer-group .kicker { margin-bottom: 8px; }
.composer-group .hint { font-size: 11px; line-height: 1.5; margin-top: 8px; }
.composer-stage {
  flex: 1; min-width: 0; overflow: auto; background: var(--surface-3);
  padding: 20px; display: flex; justify-content: center; align-items: flex-start;
}
.composer-frame {
  width: 100%; height: 100%; min-height: 600px; border: 0;
  background: var(--surface); box-shadow: 0 2px 10px -4px rgba(18, 22, 27, .3);
}
.composer-foot {
  display: flex; align-items: center; gap: 16px; padding: 12px 18px;
  border-top: 1px solid var(--line); background: var(--surface-2);
}
.composer-foot .hint { font-size: 11px; max-width: 52ch; }
.composer-foot .right { margin-left: auto; display: flex; gap: 8px; }
/* A comment row: the issued reference keeps its own column so the titles line
   up whether a comment has been given a number yet or not. */
.cmt-ref { font-size: 11px; color: var(--ink-4); min-width: 24px; flex: none; }
.cmt-name {
  flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap;
}
.cmt-depth { font-size: 10px; color: var(--ink-4); flex: none; }
/* #20: a masthead row in the composer -- the field's name, then what the
   project holds for it, clipped like a comment's title. A blank one says so
   in the caption tone rather than sitting as an empty cell. */
.mast-val {
  flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  text-align: right; font-size: 11px; color: var(--ink-3);
}
.mast-val.blank { color: var(--ink-4); font-style: normal; }
.movebtn.depthbtn { width: auto; padding: 0 6px; }

/* ---- History (E0-10) ------------------------------------------------------
   A log is read down a column of times, so the time is the only thing set in
   mono and the only thing aligned: it is the measured value on the row. The
   date is a heading over the day's actions rather than a repeated field, and
   the actor sits at the end because "what happened" is what the eye is
   scanning for and "who" is what it stops on. */
.hi-filters { display: flex; gap: 12px; flex-wrap: wrap; align-items: end; margin-bottom: 4px; }
/* `.field select` is width:100%, which in a flex row stretches to the whole
   bar. The menus are named vocabularies, not free text, so they are sized to
   read rather than to fill. */
.hi-filters .field { width: 220px; margin: 0; }
.hi-filters .btn { margin-bottom: 1px; }

.hi-day {
  font-family: var(--mono); font-size: 10.5px; font-weight: 600; letter-spacing: .1em;
  text-transform: uppercase; color: var(--ink-4);
  margin: 18px 0 2px; padding-bottom: 5px; border-bottom: 1px solid var(--line);
}
.hi-day:first-child { margin-top: 2px; }

.hi-row {
  display: grid; grid-template-columns: 58px minmax(0, 1fr) auto;
  gap: 14px; align-items: baseline;
  padding: 9px 0; border-top: 1px solid var(--line-2);
}
.hi-row:first-of-type { border-top: 0; }
.hi-when { font-family: var(--mono); font-size: 11px; color: var(--ink-4); font-variant-numeric: tabular-nums; }
.hi-label { font-size: 13px; }
.hi-detail { font-size: 11.5px; color: var(--ink-3); margin-top: 2px; }
.hi-who { text-align: right; font-size: 11.5px; color: var(--ink-3); }
.hi-role {
  font-family: var(--mono); font-size: 9.5px; letter-spacing: .1em;
  text-transform: uppercase; color: var(--ink-4); margin-top: 1px;
}

.hi-paging { display: flex; align-items: center; gap: 12px; margin-top: 16px; }
.hi-range { font-family: var(--mono); font-size: 11px; color: var(--ink-4); }

/* The actor column is the first thing worth giving up: on a narrow column the
   time and the action carry the row, and the name wraps under it rather than
   squeezing the label into two words per line. */
@container sheet (max-width: 520px) {
  .hi-row { grid-template-columns: 52px minmax(0, 1fr); }
  .hi-who { grid-column: 2 / -1; text-align: left; margin-top: 3px; }
  .hi-role { display: inline; margin-left: 6px; }
}

/* ---- step 3: unsure bindings and the reviewer's picker (walk-log #12) ----
   An unsure row is the model saying "a paragraph mentions this and I could
   not confirm it". The candidates are offered as the row's own actions; the
   picker beside them reaches any paragraph. Nothing here blocks. */
.st-unsure { margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--line-3); }
.st-unsure-row { display: grid; grid-template-columns: 10px minmax(0, 1fr); gap: 12px; align-items: baseline;
  padding: 10px 0; border-top: 1px solid var(--line); }
.st-unsure-row:first-of-type { border-top: 0; }
.st-unsure-row .nm { font-size: 12.5px; font-weight: 500; color: var(--ink); }
.st-unsure-row .why { font-size: 11.5px; color: var(--ink-4); margin-top: 2px; max-width: 80ch; }
.st-unsure-row .cands { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin-top: 8px; }
.st-bindsel { font: inherit; font-size: 11.5px; padding: 3px 6px; margin-left: 10px; max-width: 34ch;
  border: 1px solid var(--line-3); border-radius: 4px; background: var(--paper); color: var(--ink-2); }
.st-bind .q .pol { color: var(--ink-4); font-style: italic; }
.st-bind .q .by { font-size: 11px; color: var(--ink-4); }
.st-readline .su-blurb { flex: 1 1 40ch; margin: 0; }

/* ================================ theme 2 ==============================   The redesigned screens. THIS SECTION HOLDS LAYOUT AND COMPONENTS ONLY.

   Every font size, weight, family, colour, radius, shadow and timing it uses is
   a token defined in `theme.css` — the one file to edit when the look needs to
   change. A rule here that states a literal font size, weight, hex colour or
   radius is a bug: `tests/test_theme_tokens.py` fails on it. (A few literals
   are structural rather than stylistic — `font-size: 0` to hide a label in the
   folded rail, `50%` for a circle, a 2px bar — and are allowed by name there.)

   Scope, and how a screen joins: see the head of `theme.css`.

   Nothing in this section computes, formats or reorders a value. It is paint. */
/* A screen wrap, as opposed to a strip of chrome: it owns the ground colour. */
.t2.scr {
  background:
    linear-gradient(180deg, var(--page-wash) 0, transparent 200px),
    var(--paper);
}

/* ---- sidebar ----
   Flat and light, in the idiom of the Stripe and Vercel dashboards: the rail is
   the same family of grey as the page, separated from it by one hairline, and
   everything on it is type, a 16px outline icon, and at most a grey pill. No
   gradient, no glow, no dark mass — a dark or decorated rail was tried twice
   and both times it was the loudest object on a screen whose job is a table.
   What it keeps from those attempts is function: it folds to icons, and the
   project's stages still read as a path. */
@media (min-width: 820px) {
  .app.shell2 > .sidebar.t2 {
    width: 244px; border-right: 1px solid var(--sidebar-line);
    transition: width 200ms var(--ease); scrollbar-width: none;
  }
  .app.shell2 > .sidebar.t2::-webkit-scrollbar { display: none; }
}
.t2 .sb-org { height: 52px; padding: 0 10px 0 14px; border-bottom: 0; gap: 10px; position: relative; }
.t2 .sb-mark {
  width: 24px; height: 24px; border-radius: var(--radius-sm); color: var(--on-accent); background: var(--ink);
  font-family: var(--sans); font-weight: var(--weight-strong); font-size: var(--mark-size); letter-spacing: .02em;
  transition: opacity var(--t-fast) var(--ease);
}
.t2 .sb-org-name { font-size: var(--type-body-size); font-weight: var(--weight-strong); color: var(--sidebar-text); letter-spacing: var(--type-heading-tracking); }
.t2 .sb-org-kicker { display: none; }
.t2 .sb-collapse {
  margin-left: auto; flex: none; width: 28px; height: 28px; border-radius: var(--radius-sm); border: 0; background: none;
  color: var(--sidebar-text-3); display: grid; place-items: center;
  transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease), opacity var(--t-fast) var(--ease);
}
.t2 .sb-collapse svg { width: 16px; height: 16px; }
.t2 .sb-collapse:hover { background: var(--hover-wash); color: var(--ink); }
.t2 .sb-collapse:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }

/* The switcher is the one raised object on the rail: a white control on the
   grey, because it is the one thing here that opens rather than navigates. */
.t2 .sb-switch { padding: 2px 10px 10px; }
.t2 .sb-sw {
  border-radius: var(--radius-md); padding: 6px 8px; gap: 9px; background: var(--surface);
  border-color: var(--sidebar-line-2); box-shadow: 0 1px 2px var(--hover-wash);
  transition: border-color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease);
}
.t2 .sb-sw:hover { border-color: var(--control-line); }
.t2 .sb-sw:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.t2 .sb-sw[aria-expanded="true"] { border-color: var(--focus); box-shadow: var(--ring); }
.t2 .sb-sw-av {
  width: 24px; height: 24px; border-radius: var(--radius-sm); font-family: var(--sans); font-size: var(--mark-size); font-weight: var(--weight-strong);
  background: var(--accent-tint); color: var(--accent); box-shadow: inset 0 0 0 1px var(--accent-tint-line);
}
.t2 .sb-sw-av.sm { background: var(--line-3); color: var(--ink-2); box-shadow: none; }
.t2 .sb-sw-n { font-size: var(--type-body-size); font-weight: var(--weight-strong); color: var(--sidebar-text); }
.t2 .sb-sw-s { font-size: var(--type-caption-size); color: var(--sidebar-text-3); }
.t2 .sb-sw-c { color: var(--sidebar-text-3); }

.t2 .sb-group { padding: 8px 10px 4px; }
.t2 .sb-group + .sb-group { margin-top: 4px; }
.t2 .sb-kicker {
  font-family: var(--sans); font-weight: var(--weight-medium); font-size: var(--type-caption-size); letter-spacing: 0; text-transform: none;
  color: var(--sidebar-label); padding: 0 8px 6px; white-space: nowrap; overflow: hidden;
}
.t2 .sb-item {
  position: relative; gap: 10px; border-radius: var(--radius-sm); padding: 0 8px; height: 32px;
  font-size: var(--type-body-size); font-weight: var(--weight-medium); color: var(--sidebar-text-2); white-space: nowrap;
  transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.t2 .sb-item + .sb-item { margin-top: 1px; }
.t2 .sb-item:hover { background: var(--hover-wash); color: var(--ink); }
.t2 .sb-item.on { background: var(--active-wash); color: var(--ink); font-weight: var(--weight-strong); box-shadow: none; }
.t2 .sb-item:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
.t2 .sb-item.j-waiting:not(.on) { color: var(--sidebar-text-3); }

/* The dot is an icon now, and still the dot: it is drawn as a MASK over the
   dot's own background, so the journey rules that colour it — green when a
   stage is done, copper on the one stage proposed next — tint the icon with no
   change to them, to the markup, or to the script that sets them. */
.t2 .sb-item .dot {
  width: 16px; height: 16px; border-radius: 0; background: var(--sidebar-dot); position: relative; z-index: 1;
  -webkit-mask: var(--ic) center / 16px 16px no-repeat; mask: var(--ic) center / 16px 16px no-repeat;
  transition: background var(--t-fast) var(--ease);
}
.t2 .sb-item:hover .dot, .t2 .sb-item.on .dot { background: var(--ink); }
.t2 .sb-item:not(.on) .dot.j-waiting { background: var(--sidebar-text-3); box-shadow: none; }
.t2 .sb-item:not(.on) .dot.j-done, .t2 .sb-item:not(.on):hover .dot.j-done { background: var(--ok-dot); }
.t2 .sb-item:not(.on) .dot.j-next, .t2 .sb-item:not(.on):hover .dot.j-next { background: var(--brand-accent); }

.t2 .sb-item .sb-count {
  font-family: var(--sans); font-size: var(--type-caption-size); font-weight: var(--weight-medium); font-variant-numeric: tabular-nums;
  color: var(--sidebar-text-3); background: none; padding: 0;
}
.t2 .sb-item .sb-count:empty { display: none; }
.t2 .sb-item.on .sb-count { color: var(--sidebar-text); }
/* Setup's "n of 6" carries a ring drawn from the same two numbers (`--p`, set
   beside the text). The count says how far; the ring lets it be read without
   being read. */
.t2 #sb-setup-count { display: inline-flex; align-items: center; gap: 6px; }
.t2 #sb-setup-count:not(:empty)::before {
  content: ""; width: 12px; height: 12px; border-radius: 50%; flex: none;
  background: conic-gradient(var(--accent) calc(var(--p, 0) * 360deg), var(--line) 0);
  -webkit-mask: radial-gradient(circle, transparent 3.4px, #000 3.9px); mask: radial-gradient(circle, transparent 3.4px, #000 3.9px);
}
.t2 .sb-item .pill {
  font-family: var(--sans); font-size: var(--type-caption-size); font-weight: var(--weight-strong); border-radius: var(--radius-pill); padding: 0 7px; line-height: 18px;
  background: var(--ink); color: var(--on-accent);
}
.t2 .sb-item.on .pill { background: var(--rail-mark); color: var(--sidebar-bg); }

.t2 .sb-footer { border-top: 1px solid var(--sidebar-line); padding: 12px 18px 14px; }
.t2 .sb-footer .k { font-family: var(--sans); font-size: var(--type-caption-size); font-weight: var(--weight-medium); letter-spacing: 0; text-transform: none; color: var(--sidebar-label); margin-bottom: 2px; }
.t2 .sb-footer .v { font-family: var(--sans); font-size: var(--type-body-size); font-weight: var(--weight-medium); color: var(--ink-2); }
.t2 .sb-build { font-family: var(--sans); font-size: var(--type-caption-size); color: var(--ink-5); letter-spacing: 0; margin-top: 8px; }

/* The collapsed rail keeps a 64px footprint. Hover temporarily reveals the
   full navigation over the content, without changing the page width. */
@media (min-width: 820px) {
  .app.shell2.rail-min { padding-left: 64px; box-sizing: border-box; position: relative; }
  .app.shell2.rail-min > .sidebar.t2 { position: absolute; inset: 0 auto 0 0; width: 64px; z-index: 110; overflow-x: hidden; transition: width 220ms var(--ease), box-shadow 220ms var(--ease); }
  .app.shell2.rail-min.rail-peek > .sidebar.t2 {
    width: 244px;
    box-shadow: 8px 0 24px rgba(15,23,42,.18);
  }
  .rail-min:not(.rail-peek) > .sidebar.t2 .sb-org { padding: 0; justify-content: center; }
  .rail-min:not(.rail-peek) > .sidebar.t2 .sb-org > div:not(.sb-mark) { display: none; }
  /* The mark holds the corner; the control takes its place under the pointer. */
  .rail-min:not(.rail-peek) > .sidebar.t2 .sb-collapse { position: absolute; inset: 16px; margin: 0; opacity: 0; background: var(--rail-on); color: var(--sidebar-text); }
  .rail-min:not(.rail-peek) > .sidebar.t2 .sb-org:hover .sb-collapse, .rail-min:not(.rail-peek) > .sidebar.t2 .sb-collapse:focus-visible { opacity: 1; }
  .rail-min:not(.rail-peek) > .sidebar.t2 .sb-org:hover .sb-mark { opacity: 0; }
  .rail-min:not(.rail-peek) > .sidebar.t2 .sb-collapse svg { transform: scaleX(-1); }
  .rail-min:not(.rail-peek) > .sidebar.t2 .sb-switch { padding: 4px 12px 10px; }
  .rail-min:not(.rail-peek) > .sidebar.t2 .sb-sw { padding: 6px; justify-content: center; }
  .rail-min:not(.rail-peek) > .sidebar.t2 .sb-sw-t, .rail-min:not(.rail-peek) > .sidebar.t2 .sb-sw-c { display: none; }
  /* Keep navigation rows at the same height during a hover reveal. */
  .rail-min:not(.rail-peek) > .sidebar.t2 .sb-kicker { color: transparent; white-space: nowrap; overflow: hidden; }
  .rail-min:not(.rail-peek) > .sidebar.t2 .sb-item { font-size: 0; gap: 0; padding: 0; justify-content: center; overflow: hidden; }
  .rail-min:not(.rail-peek) > .sidebar.t2 .sb-item.on::before { left: -12px; }
  /* The count rides the icon's shoulder. It has to sit INSIDE the item's box,
     which clips — and at 64px that box is barely wider than the glyph, so the
     chip necessarily lands ON the drawing. Two things make that legible rather
     than a collision, and both were missing:

       * it is anchored to the item's own top-right corner, not to `left: 18px`,
         which was a number picked against one icon and landed mid-glyph on the
         rest, and which walked further across the drawing as the count grew;
       * it is OPAQUE and carries a ring in the rail's ink. Translucent, the
         folder's outline ran straight through the digit — the "2" read as part
         of the icon rather than a count on it. The ring is what turns a chip
         drawn over artwork into a chip resting on it. */
  .rail-min:not(.rail-peek) > .sidebar.t2 .sb-item .sb-count, .rail-min:not(.rail-peek) > .sidebar.t2 .sb-item .pill {
    position: absolute; top: 2px; right: 2px; left: auto; margin: 0;
    min-width: 9px; padding: 0 3px; line-height: 13px; text-align: center;
    font-size: var(--mark-size); background: var(--rail-chip); color: var(--sidebar-text);
    border-radius: var(--radius-pill); box-shadow: 0 0 0 2px var(--sidebar-bg);
  }
  .rail-min:not(.rail-peek) > .sidebar.t2 .sb-item .sb-count:empty { display: none; }
  /* Setup's counter is not a count. It is "0 of 6" — 34px of text, which on a
     64px rail is not a badge on the icon, it is a lid over it. This rule used
     to hide the RING and keep the words, which is exactly the wrong half: the
     ring was built for this ("the count says how far; the ring lets it be read
     without being read") and is the only one of the two that fits. Folded, the
     words go and the ring stays, on a disc of the rail's ink so it reads as
     sitting on the glyph. The words are not lost — the folded rail's tooltip
     carries them. */
  .rail-min:not(.rail-peek) > .sidebar.t2 #sb-setup-count {
    top: 2px; right: 2px; left: auto; padding: 2px; min-width: 0; gap: 0;
    font-size: 0; line-height: 0; background: var(--sidebar-bg);
    border-radius: 50%; box-shadow: none;
  }
  .rail-min:not(.rail-peek) > .sidebar.t2 #sb-setup-count:not(:empty)::before { display: block; width: 11px; height: 11px; }
  .rail-min:not(.rail-peek) > .sidebar.t2 .sb-footer { visibility: hidden; }
}

/* ---- the spine's own look ----
   Grouped by hairline rather than by a word, because at 64px there is no room
   for the word and the rule says the same thing. */
.t2 .sb-org { height: 56px; padding: 0 0 0 19px; gap: 12px; }
.t2 .sb-mark { background: var(--rail-mark); color: var(--sidebar-bg); }
.t2 .sb-switch { padding: 4px 12px 10px 15px; }
.t2 .sb-sw { background: var(--rail-hover); border-color: transparent; box-shadow: none; padding: 6px; gap: 10px; }
.t2 .sb-sw:hover { background: var(--rail-on); border-color: transparent; }
/* Open, the button is the lit head of the panel below it -- not a focused form
   control, which is what the page-palette ring made of it. */
.t2 .sb-sw[aria-expanded="true"] { background: var(--rail-on); border-color: transparent; box-shadow: none; }
.t2 .sb-sw-c { transition: transform var(--t-med) var(--ease), color var(--t-fast) var(--ease); }
.t2 .sb-sw[aria-expanded="true"] .sb-sw-c { color: var(--sidebar-text); }
.t2 .sb-sw-av { background: var(--rail-badge); color: var(--sidebar-text); box-shadow: none; flex: none; }
.t2 .sb-group { padding: 6px 12px 2px; }
.t2 .sb-group + .sb-group { margin-top: 6px; padding-top: 10px; border-top: 1px solid var(--sidebar-line); }
.t2 .sb-kicker { color: var(--sidebar-label); padding: 0 8px 5px; }
.t2 .sb-item {
  position: relative; height: 38px; padding: 0 9px; gap: 13px; border-radius: var(--radius-md);
  color: var(--sidebar-text-2); white-space: nowrap;
}
.t2 .sb-item:hover { background: var(--rail-hover); color: var(--sidebar-text); }
.t2 .sb-item.on { background: var(--rail-on); color: var(--sidebar-text); font-weight: var(--weight-strong); }
/* the one bright thing on the spine */
.t2 .sb-item.on::before {
  content: ""; position: absolute; left: -12px; top: 9px; bottom: 9px; width: 3px;
  border-radius: 0 var(--radius-pill) var(--radius-pill) 0; background: var(--rail-mark);
}
.t2 .sb-item .dot { width: 20px; height: 20px; -webkit-mask-size: 20px 20px; mask-size: 20px 20px; background: var(--sidebar-dot); }
.t2 .sb-item:hover .dot, .t2 .sb-item.on .dot { background: var(--sidebar-dot-on); }
.t2 .sb-item .sb-count { color: var(--sidebar-text-3); }
.t2 .sb-item .pill { background: var(--rail-mark); color: var(--sidebar-bg); }
.t2 .sb-collapse { color: var(--sidebar-text-3); }
.t2 .sb-collapse:hover { background: var(--rail-hover); color: var(--sidebar-text); }
.t2 .sb-footer { border-top-color: var(--sidebar-line); }
.t2 .sb-footer .k { color: var(--sidebar-label); }
.t2 .sb-footer .v { color: var(--sidebar-text-2); }
.t2 .sb-build { color: var(--sidebar-text-3); }
.t2 #sb-setup-count:not(:empty)::before { background: conic-gradient(var(--rail-mark) calc(var(--p, 0) * 360deg), var(--rail-badge) 0); }
@media (prefers-reduced-motion: reduce) {
  .app.shell2:not(.rail-pin) > .sidebar.t2 { transition: none; }
}

/* The tooltip that names a folded icon. It mounts on <body>, so it carries the
   theme scope itself. */
.rail-tip {
  position: fixed; z-index: 140; pointer-events: none; white-space: nowrap;
  background: var(--inverse-solid); color: var(--on-accent);
  font-family: var(--sans); font-size: var(--type-caption-size); font-weight: var(--weight-medium);
  padding: 5px 9px; border-radius: var(--radius-sm); box-shadow: var(--shadow-tip);
  transform: translateY(-50%);
}
@media (prefers-reduced-motion: no-preference) {
  @keyframes t2-tip { from { opacity: .4; transform: translate(-4px, -50%); } to { opacity: 1; transform: translate(0, -50%); } }
  .rail-tip { animation: t2-tip 120ms var(--ease); }
}

/* ---- the rail's groups, and the update they are about (F0) ----
   The heading of a group is its control: it folds the group and stays folded
   per browser. Folded, the lit item alone stays, so where-you-are survives
   the fold. On the 64px spine the heading is a rule and every item shows.
   Everything here is the rail's own palette; nothing is a new colour. */
.t2 .sb-kicker {
  display: flex; align-items: center; gap: 6px; width: 100%; border: 0; background: none;
  font: inherit; font-size: var(--type-caption-size); font-weight: var(--weight-medium);
  color: var(--sidebar-label); text-align: left; cursor: pointer; border-radius: var(--radius-sm);
  transition: color var(--t-fast) var(--ease);
}
.t2 .sb-kicker:hover { color: var(--sidebar-text-2); }
.t2 div.sb-kicker, .t2 div.sb-kicker:hover { cursor: default; color: var(--sidebar-label); }
.t2 .sb-kicker:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
.t2 .sb-kicker .sb-fold {
  width: 10px; height: 10px; flex: none; margin-left: auto; color: var(--sidebar-text-3);
  transition: transform var(--t-med) var(--ease);
}
.t2 .sb-kicker[aria-expanded="false"] .sb-fold { transform: rotate(-90deg); }
.t2 .sb-group.folded > .sb-item { display: none; }
@media (min-width: 820px) {
  .rail-min:not(.rail-peek) > .sidebar.t2 .sb-kicker .sb-fold { visibility: hidden; }
}
/* An entry the project cannot answer yet: greyed, not disabled -- it keeps
   its click so it can say why. */
.t2 .sb-item.off { color: var(--sidebar-text-3); }
.t2 .sb-item.off .dot { background: var(--sidebar-text-3); }
/* The current update, at the top of the month's entries: the one control on
   the rail after the switcher, in the same cut-in style. */
.t2 .sb-update { padding: 2px 12px 4px 15px; }
.t2 .sb-upd {
  display: flex; align-items: center; gap: 10px; width: 100%; padding: 6px; border: 0;
  border-radius: var(--radius-md); background: var(--rail-hover); color: var(--sidebar-text-2);
  font: inherit; text-align: left; cursor: pointer;
  transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.t2 .sb-upd:hover, .t2 .sb-upd[aria-expanded="true"] { background: var(--rail-on); color: var(--sidebar-text); }
.t2 .sb-upd:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.t2 .sb-upd-ic { flex: none; width: 24px; height: 24px; display: grid; place-items: center; border-radius: var(--radius-sm); background: var(--rail-badge); color: var(--sidebar-text); }
.t2 .sb-upd-ic svg { width: 15px; height: 15px; }
.t2 .sb-upd-t { min-width: 0; flex: 1; display: flex; flex-direction: column; }
.t2 .sb-upd-k { font-size: var(--mark-size); font-weight: var(--weight-medium); letter-spacing: .04em; text-transform: uppercase; color: var(--sidebar-label); }
.t2 .sb-upd-n { font-size: var(--type-body-size); font-weight: var(--weight-strong); color: var(--sidebar-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.t2 .sb-upd-d { font-size: var(--type-caption-size); color: var(--sidebar-text-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.t2 .sb-upd-d:empty { display: none; }
.t2 .sb-upd-c { flex: none; width: 10px; height: 10px; color: var(--sidebar-text-3); transition: transform var(--t-med) var(--ease); }
.t2 .sb-upd[aria-expanded="true"] .sb-upd-c { transform: rotate(180deg); }
@media (min-width: 820px) {
  .rail-min:not(.rail-peek) > .sidebar.t2 .sb-update { padding: 4px 12px 6px; }
  .rail-min:not(.rail-peek) > .sidebar.t2 .sb-upd { padding: 6px; justify-content: center; }
  .rail-min:not(.rail-peek) > .sidebar.t2 .sb-upd-t, .rail-min:not(.rail-peek) > .sidebar.t2 .sb-upd-c { display: none; }
}
@media (max-width: 819px) {
  .sb-update { flex: none; padding: 0 4px; }
  .sb-upd { display: flex; align-items: center; gap: 8px; border: 0; background: none; color: var(--sidebar-text-2); font: inherit; white-space: nowrap; }
  .sb-upd-k, .sb-upd-d { display: none; }
  .sb-kicker .sb-fold { display: none; }
}

/* ---- the target picker (F2): a search box over the file's activities ----
   Mounts on <body> with the theme scope, like the tooltip; floats from the
   Custom path button above the document and the sheet. */
.scope-pick-host { position: fixed; z-index: 140; width: 372px; }
.scope-pick {
  background: var(--surface); border-radius: var(--radius-lg); box-shadow: var(--shadow-3);
  padding: 8px; display: flex; flex-direction: column; gap: 6px;
}
.scope-pick input {
  width: 100%; height: 32px; padding: 0 10px; border: 1px solid var(--input-line); border-radius: var(--radius-sm);
  font: inherit; color: var(--ink); background: var(--surface);
}
.scope-pick input:focus { outline: none; border-color: var(--focus); box-shadow: var(--ring); }
.scope-list { max-height: 260px; overflow-y: auto; display: flex; flex-direction: column; gap: 1px; }
.scope-list .row {
  display: flex; align-items: center; gap: 8px; width: 100%; padding: 5px 8px; border: 0; background: none;
  border-radius: var(--radius-sm); text-align: left; font: inherit; color: var(--ink-2); cursor: pointer;
}
.scope-list .row:hover, .scope-list .row:focus-visible { background: var(--line-3); color: var(--ink); outline: none; }
.scope-list .row b { font-family: var(--mono); font-size: var(--type-caption-size); font-weight: var(--weight-medium); color: var(--ink); flex: none; }
.scope-list .row .n { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.scope-list .row .chip { font-size: var(--mark-size); font-weight: var(--weight-strong); padding: 1px 6px; border-radius: var(--radius-pill); background: var(--line-3); color: var(--ink-4); flex: none; }
.scope-list .row .chip.cp { background: var(--danger-tint); color: var(--danger); }
.scope-hint { font-size: var(--type-caption-size); color: var(--ink-4); padding: 2px 8px 0; }

/* ---- the project switcher's menu ----
   It belongs to the RAIL, so it is drawn in the rail's palette and it opens
   INSIDE it: the panel is a static child under the button, and the list pushes
   the nav down as it grows rather than floating over the page.

   It used to be `position: fixed` on the page's paper -- a card that appeared
   over the work, detached from the control that summoned it and lit from a
   different world. The switcher is chrome. Chrome that behaves like a dialog
   makes the reader place it twice: once to find it, once to work out that it
   is still the sidebar talking.

   `overflow: hidden` is load-bearing. The open and shut are a HEIGHT animation
   driven from switcher.js, and the clip is what turns that into an unroll
   instead of a squash. */
.t2 .sb-sw-pop {
  /* `block`, not the base rule's flex column. Under a height animation a flex
     column does not get clipped -- it COMPRESSES, because the list inside it
     scrolls and will give up its height. The panel squashed shut and the rows
     slid up inside it instead of the panel rolling down over them. Block flow
     leaves the children at their natural size for `overflow: hidden` to cut. */
  display: block;
  position: static; z-index: auto; margin: 6px 0 0; padding: 0; overflow: hidden;
  background: var(--rail-panel); border: 1px solid var(--sidebar-line-2);
  border-radius: var(--radius-md); box-shadow: none;
}
.t2 .sb-sw-q { position: relative; padding: 8px 8px 6px; }
.t2 .sb-sw-qi {
  position: absolute; left: 18px; top: 50%; transform: translateY(-50%);
  width: 14px; height: 14px; color: var(--sidebar-text-3); pointer-events: none;
}
/* The field is cut INTO the spine rather than laid on it: on ink, a white box
   is a hole punched in the chrome, and it drags the eye off the list. */
.t2 .sb-sw-q input {
  height: 32px; padding: 0 10px 0 30px; font-size: var(--type-body-size); color: var(--sidebar-text);
  background: var(--rail-field); border: 1px solid var(--sidebar-line-2); border-radius: var(--radius-sm);
  transition: border-color var(--t-fast) var(--ease), background var(--t-fast) var(--ease);
}
.t2 .sb-sw-q input:hover { border-color: var(--sidebar-text-3); }
.t2 .sb-sw-q input:focus { outline: 0; border-color: var(--rail-mark); background: var(--rail-hover); }
.t2 .sb-sw-q input::placeholder { color: var(--sidebar-text-3); }
.t2 .sb-sw-list { padding: 0 6px 6px; max-height: 264px; overflow-y: auto; scrollbar-width: thin; }
.t2 .sb-sw-row {
  display: flex; align-items: center; gap: 9px; width: 100%; padding: 6px 7px;
  border-radius: var(--radius-sm); background: none; border: 0; text-align: left;
  transition: background var(--t-fast) var(--ease);
}
.t2 .sb-sw-row:hover, .t2 .sb-sw-row.cursor { background: var(--rail-hover); }
.t2 .sb-sw-row.on { background: var(--rail-on); }
.t2 .sb-sw-row .sb-sw-av.sm {
  width: 26px; height: 26px; flex: none; border-radius: var(--radius-sm);
  background: var(--rail-badge); color: var(--sidebar-text); box-shadow: none;
  font-size: var(--mark-size); font-weight: var(--weight-strong);
}
/* The project you are in gets the rail's one bright value -- the same mark the
   nav uses for "you are here", so the two agree. */
.t2 .sb-sw-row.on .sb-sw-av.sm { background: var(--rail-mark); color: var(--sidebar-bg); }
.t2 .sb-sw-rt { min-width: 0; flex: 1; display: block; }
.t2 .sb-sw-rn { display: block; font-size: var(--type-body-size); font-weight: var(--weight-medium); color: var(--sidebar-text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.t2 .sb-sw-row.on .sb-sw-rn, .t2 .sb-sw-row:hover .sb-sw-rn { color: var(--sidebar-text); }
.t2 .sb-sw-rc { display: block; font-size: var(--type-caption-size); color: var(--sidebar-text-3); font-variant-numeric: tabular-nums; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.t2 .sb-sw-dot { width: 6px; height: 6px; border-radius: 50%; flex: none; }
.t2 .sb-sw-dot.hi { background: var(--danger-dot); box-shadow: 0 0 0 3px var(--rail-dot-ring); }
.t2 .sb-sw-dot.med { background: var(--warn-dot); box-shadow: 0 0 0 3px var(--rail-dot-ring); }
.t2 .sb-sw-dot.ok { background: var(--ok-dot); box-shadow: 0 0 0 3px var(--rail-dot-ring); }
.t2 .sb-sw-dot.none { background: var(--sidebar-text-3); }
/* waiting for the payloads: the shape of the answer, not a spinner over nothing */
.t2 .sb-sw-row.skel { pointer-events: none; }
.t2 .sb-sw-av.sk, .t2 .sk-line {
  background: linear-gradient(90deg, var(--rail-skel) 25%, var(--rail-skel-hi) 37%, var(--rail-skel) 63%);
  background-size: 400% 100%; animation: t2-shimmer 1.4s ease infinite; border-radius: var(--radius-xs);
}
.t2 .sk-line { display: block; height: 8px; margin: 3px 0; }
.t2 .sk-line.sm { height: 7px; }
@media (prefers-reduced-motion: reduce) { .t2 .sb-sw-av.sk, .t2 .sk-line { animation: none; } }
.t2 .sb-sw-empty { margin: 0; padding: 12px 14px 14px; font-size: var(--type-caption-size); color: var(--sidebar-text-3); text-align: center; }
.t2 .sb-sw-foot { padding: 5px; border-top: 1px solid var(--sidebar-line); background: var(--sidebar-bg); display: grid; gap: 1px; }
.t2 .sb-sw-act {
  display: flex; align-items: center; gap: 9px; width: 100%; padding: 6px 7px; border: 0;
  border-radius: var(--radius-sm); background: none; text-align: left;
  font-size: var(--type-caption-size); font-weight: var(--weight-medium); color: var(--sidebar-text-2);
  transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.t2 .sb-sw-act svg { width: 14px; height: 14px; flex: none; color: var(--sidebar-text-3); }
.t2 .sb-sw-act:hover { background: var(--rail-hover); color: var(--sidebar-text); }
.t2 .sb-sw-act:hover svg { color: var(--sidebar-text); }
.t2 .sb-sw-act.new { color: var(--sidebar-text); }
.t2 .sb-sw-act.new svg { color: var(--sidebar-text); }
.t2 .sb-sw-act:focus-visible { outline: 2px solid var(--rail-mark); outline-offset: -2px; }

/* ---- the rail as a strip (below 820px) ----
   The base stylesheet lays the rail across the top at this width. The theme
   supplies its colours there and nothing structural: no fixed width, no
   collapse control. */
@media (max-width: 819px) {
  .sidebar.t2 { border-bottom-color: var(--sidebar-line); }
  .t2 .sb-collapse { display: none; }
  .t2 .sb-org { height: 46px; padding: 0 10px 0 8px; border-right: 1px solid var(--sidebar-line); }
  .t2 .sb-switch { padding: 6px 0; }
  .t2 .sb-group, .t2 .sb-group + .sb-group { padding: 0; margin-top: 0; }
  .t2 .sb-item { height: auto; padding: 7px 10px; }
  .t2 .sb-item + .sb-item { margin-top: 0; }
  /* The one width where the menu CANNOT open in place: the rail is a 56px
     strip across the top, and there is no column under the button to unroll
     into. It anchors below the strip instead -- still the rail's palette, so
     it still reads as the rail speaking, and switcher.js places it and plays
     the rise rather than the unroll. */
  .t2 .sb-sw-pop {
    position: fixed; z-index: 60; margin: 0;
    box-shadow: var(--shadow-3); transform-origin: top center;
  }
  .t2 .sb-sw-list { max-height: none; }
}
.t2 [data-nav] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><circle cx='8' cy='8' r='2'/></svg>"); }
.t2 [data-nav="projects"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M1.8 4.3c0-.6.4-1 1-1h3l1.4 1.6h6c.6 0 1 .4 1 1v6.3c0 .6-.4 1-1 1H2.8c-.6 0-1-.4-1-1z'/></svg>"); }
.t2 [data-nav="methodology"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M3 2.4h8.6a1 1 0 0 1 1 1v10.2H4.3A1.3 1.3 0 0 1 3 12.3z'/><path d='M3 12.3A1.3 1.3 0 0 1 4.3 11h8.3'/></svg>"); }
.t2 [data-nav="schedules"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><rect x='2' y='3' width='12' height='11' rx='1.6'/><path d='M2 6.6h12M5.3 1.8v2.4M10.7 1.8v2.4'/></svg>"); }
.t2 [data-nav="setup"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M2 4.5h5.8M11.4 4.5H14M2 11.5h2.6M8.2 11.5H14'/><circle cx='9.6' cy='4.5' r='1.7'/><circle cx='6.4' cy='11.5' r='1.7'/></svg>"); }
.t2 [data-nav="intake"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M2 9.4l2-6h8l2 6v3.1a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1z'/><path d='M2 9.4h3.4l1 1.8h3.2l1-1.8H14'/></svg>"); }
.t2 [data-nav="compare"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M5 13.4V2.6M2.5 5.1L5 2.6l2.5 2.5M11 2.6v10.8M8.5 10.9l2.5 2.5 2.5-2.5'/></svg>"); }
.t2 [data-nav="reports"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M3.8 1.8h5.6l3 3v9.4H3.8z'/><path d='M9.2 1.8v3.2h3.2M6 8.4h4M6 11h4'/></svg>"); }
.t2 [data-nav="trends"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M2 12l4-4.4 3 2.4 5-6'/><path d='M10.4 4H14v3.6'/></svg>"); }
.t2 [data-nav="register"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M5.6 4H14M5.6 8H14M5.6 12H14M2.2 4h.6M2.2 8h.6M2.2 12h.6'/></svg>"); }
.t2 [data-nav="digest"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><rect x='1.8' y='3.2' width='12.4' height='9.6' rx='1.4'/><path d='M2.3 4.6L8 8.9l5.7-4.3'/></svg>"); }
.t2 [data-nav="history"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><circle cx='8' cy='8' r='6.1'/><path d='M8 4.6V8l2.3 1.5'/></svg>"); }
.t2 [data-nav="settings"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-linejoin='round'><circle cx='8' cy='8' r='2.1' stroke-width='1.5'/><circle cx='8' cy='8' r='4.6' stroke-width='1.5'/><circle cx='8' cy='8' r='6' stroke-width='1.9' stroke-dasharray='2.1 2.61'/></svg>"); }
.t2 [data-nav="queue"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M2.5 4.5h11M2.5 8h7M2.5 11.5h5'/><path d='M10.2 11.4l1.6 1.6 2.6-3'/></svg>"); }
.t2 [data-nav="comments"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M2.4 3.4h11.2v7.2H6.2L3.4 13V10.6H2.4z'/><path d='M5 6.2h6M5 8.4h4'/></svg>"); }
.t2 [data-nav="compose"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M9.4 2.8l3.8 3.8-7.2 7.2H2.2v-3.8z'/><path d='M8 4.2l3.8 3.8'/></svg>"); }
.t2 [data-nav="tia"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M2 4h5M2 8h9M2 12h6'/><path d='M12.2 3.2v9.6M9.8 10.4l2.4 2.4 2.4-2.4'/></svg>"); }
.t2 [data-nav="baseline"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M2 12.6h12'/><path d='M3 12.6V8.2M6.4 12.6V5.6M9.8 12.6V7.2M13.2 12.6V3.8'/></svg>"); }
.t2 [data-nav="chat"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M2.4 8.2c0-2.8 2.9-5 6.6-5s6.6 2.2 6.6 5-3 5-6.6 5c-.8 0-1.6-.1-2.3-.3L3.4 14.6l.9-2.4c-1.2-.9-1.9-2.2-1.9-4Z'/></svg>"); }
.t2 [data-nav="members"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><circle cx='6' cy='5.4' r='2.4'/><path d='M1.8 13.4c0-2.4 1.9-4 4.2-4s4.2 1.6 4.2 4'/><circle cx='11.4' cy='6' r='1.8'/><path d='M11.6 9.4c1.6.2 2.8 1.6 2.8 3.4'/></svg>"); }
.t2 [data-nav="home"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M2.2 7.6L8 2.6l5.8 5'/><path d='M3.8 6.6v6.8h8.4V6.6'/><path d='M6.6 13.4V9.6h2.8v3.8'/></svg>"); }
.t2 [data-nav="why"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M2 3h4M2 6.5h9M2 10h6M2 13.5h3'/><path d='M12.5 3.2a1.6 1.6 0 1 1 1.1 2.8c-.5.2-.8.5-.8 1v.4'/><circle cx='12.8' cy='9.6' r='.3'/></svg>"); }
.t2 [data-nav="versions"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><rect x='2' y='3' width='12' height='10' rx='1.5'/><path d='M2 6.5h12M6 6.5v6.5M10 6.5v6.5'/></svg>"); }
.t2 [data-nav="health"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M2 8.5h3l1.5-4 2.5 7 1.5-3H14'/></svg>"); }
.t2 [data-nav="progress"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M2 13c3 0 4-8 6-8s3 8 6 8'/><path d='M2 13h12'/></svg>"); }
.t2 [data-nav="timeline"] { --ic: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M2 4.2h6M5 8h7M3.4 11.8h5'/><path d='M13.2 2.4v11.2'/></svg>"); }

/* ---- top bar ---- */
.topbar.t2 { height: 52px; padding: 0 24px; gap: 14px; border-bottom-color: var(--line); position: relative; z-index: 5; box-shadow: 0 1px 3px var(--hover-wash); }
.t2 .crumbs { gap: 6px; font-size: var(--type-body-size); }
.t2 .crumb {
  font-size: var(--type-body-size); color: var(--ink-4); border-radius: var(--radius-sm); padding: 3px 6px; margin: 0 -2px;
  transition: color var(--t-fast) var(--ease), background var(--t-fast) var(--ease);
}
.t2 .crumb:not(.now):hover { color: var(--ink); background: var(--line-3); }
.t2 .crumb.now { font-weight: var(--weight-medium); color: var(--ink); }
.t2 .crumb-sep { color: var(--ink-5); font-size: var(--type-caption-size); }
.t2 .topbar-div { background: var(--line-2); height: 20px; }
.t2 .usermenu {
  gap: 9px; padding: 4px 8px 4px 4px; border-radius: var(--radius-md);
  transition: background var(--t-fast) var(--ease);
}
.t2 .usermenu:hover { background: var(--line-3); border-color: transparent; }
.t2 .avatar {
  width: 26px; height: 26px; border-radius: 50%; border: 0; color: var(--accent);
  background: var(--accent-tint); box-shadow: inset 0 0 0 1px var(--accent-tint-line);
  font-family: var(--sans); font-weight: var(--weight-strong); font-size: var(--type-caption-size);
}
.t2 .user-name { font-size: var(--type-body-size); font-weight: var(--weight-medium); color: var(--ink); }
.t2 .user-role { font-family: var(--sans); font-size: var(--type-caption-size); letter-spacing: 0; text-transform: capitalize; color: var(--ink-4); }
.t2 .usermenu .ic { color: var(--ink-4); }

/* ---- next-step strip ----
   One quiet line. It used to carry a filled black button an inch above the
   screen's own filled black button, so every project screen opened on two
   primaries and the eye had no single place to go. The strip's control is a
   text action now; the screen keeps the only primary. The dot is the brand
   colour because this is the one "do this next" signal in the product — the
   same colour the rail puts on the stage it is proposing. */
.next-strip.t2 {
  padding: 8px 24px; gap: 10px; font-size: var(--type-body-size); color: var(--ink-2);
  background: var(--strip-bg); border-bottom: 1px solid var(--line);
}
.next-strip.t2 .ns-dot {
  width: 6px; height: 6px; border-radius: 50%; background: var(--brand-accent);
  box-shadow: 0 0 0 3px var(--brand-accent-halo);
}
.next-strip.t2 .ns-go {
  height: 26px; padding: 0 8px; border-radius: var(--radius-sm); font-size: var(--type-body-size); font-weight: var(--weight-medium);
  color: var(--ink); background: transparent; border: 1px solid transparent;
  display: inline-flex; align-items: center; gap: 6px;
  transition: background var(--t-fast) var(--ease);
}
.next-strip.t2 .ns-go::after { content: "→"; color: var(--ink-4); transition: transform var(--t-med) var(--ease), color var(--t-fast) var(--ease); }
.next-strip.t2 .ns-go:hover { background: var(--accent-wash); border-color: transparent; }
.next-strip.t2 .ns-go:hover::after { transform: translateX(3px); color: var(--ink); }
.next-strip.t2 .ns-go:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }

/* ---- page header ---- */
.t2 .pageblock { padding: 24px 24px 16px; }
.t2 .pane { padding: 0 24px 64px; }
.t2 .pagehead { align-items: center; }
.t2 h1 { font-size: var(--type-title-size); font-weight: var(--weight-strong); letter-spacing: var(--type-title-tracking); color: var(--ink); display: flex; align-items: center; gap: 10px; }
.t2 .code-chip {
  font-family: var(--sans); font-size: var(--type-caption-size); font-weight: var(--weight-medium); letter-spacing: 0;
  font-variant-numeric: tabular-nums; color: var(--ink-3); background: var(--surface);
  border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 2px 7px; margin: 0; vertical-align: 0;
}
.t2 .subline { margin-top: 5px; font-size: var(--type-body-size); line-height: var(--leading-relaxed); color: var(--ink-4); }

/* ---- buttons ---- */
.t2 .btn {
  height: 32px; padding: 0 12px; border-radius: var(--radius-sm); font-size: var(--type-body-size); font-weight: var(--weight-medium);
  color: var(--ink-2); border-color: var(--input-line);
  background: var(--control-bg);
  box-shadow: var(--shadow-1);
  transition: background var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease),
              color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease),
              transform 80ms var(--ease);
}
.t2 .btn svg { width: 14px; height: 14px; flex: none; color: var(--ink-4); transition: color var(--t-fast) var(--ease); }
.t2 .btn:hover { background: var(--control-bg-hover); border-color: var(--control-line); color: var(--ink); }
.t2 .btn:hover svg { color: var(--ink); }
.t2 .btn:active:not(:disabled) { transform: scale(.98); box-shadow: none; }
.t2 .btn:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.t2 .btn.primary {
  background: var(--primary-bg); border-color: var(--primary-line); color: var(--on-accent); font-weight: var(--weight-medium);
  box-shadow: var(--primary-shadow);
}
.t2 .btn.primary svg, .t2 .btn.primary:hover svg { color: var(--on-accent-2); }
.t2 .btn.primary:hover { background: var(--primary-bg-hover); border-color: var(--primary-line-hover); color: var(--on-accent); }
.t2 .btn.sm { height: 26px; padding: 0 10px; font-size: var(--type-caption-size); border-radius: var(--radius-sm); }
.t2 .btn.md { height: 28px; padding: 0 12px; font-size: var(--type-body-size); border-radius: var(--radius-sm); }
.t2 .btn:disabled, .t2 .btn.off { background: var(--line-3); background-image: none; border-color: var(--line-2); color: var(--ink-5); box-shadow: none; }
.t2 .btn.danger-h:hover { color: var(--danger); border-color: var(--danger-line-2); background: var(--danger-tint-2); }
.t2 .btn.ghost { box-shadow: none; }
/* Work in flight: a ring in the button, not three dots after the verb. */
.t2 .btn.busy { pointer-events: none; }
.t2 .btn.busy::before {
  content: ""; width: 12px; height: 12px; border-radius: 50%; flex: none;
  border: 2px solid currentColor; border-right-color: transparent; opacity: .8;
  animation: spin .6s linear infinite;
}

/* ---- the list surface ---- */
.t2 .dlist { border-radius: var(--radius-lg); box-shadow: var(--shadow-2); border-color: var(--line); }
.t2 .dtoolbar { padding: 10px 12px; gap: 8px; background: var(--surface); border-bottom-color: var(--line-2); border-radius: var(--radius-md) var(--radius-md) 0 0; }
.t2 .dtoolbar .count { font-family: var(--sans); font-size: var(--type-body-size); font-variant-numeric: tabular-nums; color: var(--ink-4); padding-right: 4px; }
.t2 .dsearch {
  height: 32px; min-width: 280px; padding: 0 10px; gap: 8px; border-radius: var(--radius-sm);
  transition: border-color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease);
}
.t2 .dsearch:hover { border-color: var(--control-line); }
.t2 .dsearch:focus-within { border-color: var(--focus); box-shadow: var(--ring); }
.t2 .dsearch svg { width: 14px; height: 14px; color: var(--ink-4); }
.t2 .dsearch input { font-size: var(--type-body-size); color: var(--ink); }
.t2 .dfilter { background: var(--line-3); border-radius: var(--radius-md); padding: 2px; gap: 1px; box-shadow: inset 0 0 0 1px var(--line-2); }
.t2 .dfilter button {
  height: 28px; padding: 0 11px; border-radius: var(--radius-sm); font-size: var(--type-body-size); font-weight: var(--weight-medium); color: var(--ink-3);
  transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease);
}
.t2 .dfilter button:hover:not(.on) { color: var(--ink); }
.t2 .dfilter button.on { color: var(--ink); font-weight: var(--weight-medium); background: var(--surface); box-shadow: 0 0 0 1px var(--line), var(--shadow-1); }
.t2 .dfilter button .n { font-family: var(--sans); font-size: var(--type-caption-size); font-weight: var(--weight-regular); font-variant-numeric: tabular-nums; color: var(--ink-4); }
.t2 .dfilter button.on .n { color: var(--ink-4); }

/* Sans figures with tabular numerals. Monospace was doing one job here — keeping
   digits in columns — and `tabular-nums` does that job in the text face, so the
   dates and the slips read as part of the row rather than as terminal output. */
.t2 table.grid.data .mono,
.t2 table.grid.data td.num, .t2 table.grid.data th.num,
.t2 table.grid.data .bar .v {
  font-family: var(--sans); font-variant-numeric: tabular-nums;
}
.t2 table.grid.data thead th {
  font-family: var(--sans); font-size: var(--type-caption-size); font-weight: var(--weight-medium); letter-spacing: 0; text-transform: none;
  color: var(--ink-3); background: var(--head-bg); padding: 8px 10px; line-height: var(--leading-snug);
  border-bottom: 0; box-shadow: inset 0 -1px 0 var(--line);
  transition: color var(--t-fast) var(--ease), background var(--t-fast) var(--ease);
}
.t2 table.grid.data thead th.sortable { padding-right: 20px; }
.t2 table.grid.data thead th.sortable:hover { background: var(--line-3); color: var(--ink); }
.t2 table.grid.data thead th.sorted { color: var(--ink); }
.t2 .sortmark { right: 7px; bottom: 10px; font-size: 7.5px; color: var(--ink-3); }
.t2 table.grid.data tbody td {
  padding: 8px 10px; font-size: var(--type-body-size); color: var(--ink-2); border-bottom-color: var(--line-2);
  transition: background var(--t-fast) var(--ease);
}
.t2 table.grid.data td.num { font-size: var(--type-body-size); }
/* A row is labels on lines, not running text: the snug leading keeps the list's
   density now that the body style's own leading (for sentences) is inherited. */
.t2 table.grid.data tbody td, .t2 table.grid.data thead th { line-height: var(--leading-snug); }
/* No banding. The hairline and a hover that spans the row do the tracking; the
   stripes were a second pattern laid over the first. */
.t2 table.grid.data tbody tr:nth-child(even) td { background: transparent; }
.t2 table.grid.data tbody tr:hover td { background: var(--surface-3); }
.t2 table.grid.data tbody tr.sel td,
.t2 table.grid.data tbody tr.sel:hover td { background: var(--accent-tint); }
.t2 table.grid.data tbody tr.sel td:first-child { box-shadow: inset 3px 0 0 var(--accent); }
.t2 table.grid.data tbody td.tight { padding-top: 6px; padding-bottom: 6px; }
.t2 table.grid.data tbody td.f-bad { color: var(--danger); }
.t2 table.grid.data tbody td.f-ok { color: var(--ok); }
/* 782px of fixed columns plus a name column that can still be read. Below this
   the list scrolls sideways under its drawn indicator; at and above 1260 the
   table always fits, the wrap stops being a scroll container, and the header
   pins to the pane (see the sticky note on `.dlist > .tablewrap`). */
.t2 .dlist table.grid.data { min-width: 980px; }
@media (max-width: 1259px) { .t2 .dlist > .tablewrap { overflow-x: auto; } }
/* The name may run out of room; it may not break between characters. */
.t2 .d-name { font-size: var(--type-body-size); font-weight: var(--weight-strong); letter-spacing: var(--type-body-tracking); white-space: nowrap; min-width: 0; }
.t2 .d-name .link { overflow: hidden; text-overflow: ellipsis; text-decoration: underline transparent; text-underline-offset: 3px; transition: text-decoration-color var(--t-fast) var(--ease); }
.t2 .d-name .link:hover { text-decoration-color: var(--ink-5); }
.t2 .d-sub { font-size: var(--type-caption-size); margin-top: 2px; color: var(--ink-4); }
.t2 .d-sub .sep { color: var(--ink-5); }
/* Facts about a row, at the weight of a fact: sentence case, hairline pill. */
.t2 .d-tag {
  font-family: var(--sans); font-size: var(--type-caption-size); font-weight: var(--weight-medium); letter-spacing: 0; text-transform: none;
  font-variant-numeric: tabular-nums; line-height: 16px;
  border: 1px solid var(--line); border-radius: var(--radius-xs); padding: 0 5px; background: var(--surface); color: var(--ink-3);
}
.t2 .d-tag.warn { background: var(--warn-tint); border-color: var(--warn-line); color: var(--warn); }
.t2 .d-tag.accent { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }
/* A schedule the engine read in translation -- "from MS Project", "from Asta".
   Neutral on purpose: it is a fact about the evidence, not a warning. What the
   translation could not carry is on the tag's title and on the intake page. */
.t2 .d-tag.src { background: var(--surface-3); border-color: var(--line-2); color: var(--ink-3); cursor: help; }
/* On the intake board, a translator's note is a row like the others: the kind,
   the count, the sentence -- and the count is a reading, so it is set in mono. */
.t2 .ik-board .ik-cnote .t { color: var(--ink-2); }
/* Status: a dot and a word in a hairline pill. The dot is the colour; the word
   stays ink, so a column of forty "Draft" is grey texture and the one
   "Published" among them is found by its green dot, not by a shouted block. */
.t2 .lozenge {
  font-family: var(--sans); font-size: var(--type-caption-size); font-weight: var(--weight-medium); letter-spacing: 0; text-transform: none;
  gap: 6px; border: 1px solid var(--line); border-radius: var(--radius-pill); padding: 1px 9px 1px 7px;
  background: var(--surface); color: var(--ink-2); line-height: 18px;
}
.t2 .lozenge::before { display: block; width: 6px; height: 6px; }
.t2 .lozenge.draft { background: var(--surface); color: var(--ink-3); border-color: var(--line); }
.t2 .lozenge.draft::before { background: var(--ink-5); }
.t2 .lozenge.pub { background: var(--surface); color: var(--ink); border-color: var(--line); }
.t2 .lozenge.pub::before { background: var(--ok-dot); box-shadow: 0 0 0 2px var(--ok-tint); }
/* Returned: sent back from Intake, out of the series, still on record. The warn
   dot rather than danger -- a return is a decision about a delivery, not a
   fault the file carries. */
.t2 .lozenge.ret { background: var(--surface); color: var(--warn); border-color: var(--warn-line); }
.t2 .lozenge.ret::before { background: var(--warn-dot); box-shadow: 0 0 0 2px var(--warn-tint); }
.t2 .bar .track { height: 4px; border-radius: 2px; overflow: hidden; background: var(--line-2); }
.t2 .bar .v { font-size: var(--type-body-size); }

.t2 .cbx {
  width: 16px; height: 16px; border-radius: var(--radius-xs); font-size: var(--mark-size); border-width: 1px; border-color: var(--control-line);
  box-shadow: var(--shadow-1);
  transition: background var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease),
              box-shadow var(--t-fast) var(--ease);
}
.t2 td:hover > .cbx:not(.on) { border-color: var(--focus); box-shadow: var(--ring); }
.t2 .cbx.on { background: var(--primary-bg); border-color: var(--primary-line); }
.t2 .cbx:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.t2 .iconbtn { border-radius: var(--radius-sm); width: 28px; height: 28px; transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease); }
.t2 .iconbtn:hover { background: var(--line-3); border-color: transparent; color: var(--ink); }
.t2 .iconbtn[aria-expanded="true"] { background: var(--line-2); border-color: transparent; color: var(--ink); }
.t2 .rowact .on-hover { transition: opacity var(--t-fast) var(--ease); }

.t2 .note-panel {
  margin-top: 16px; border: 1px solid var(--line-2); border-radius: var(--radius-lg); padding: 12px 14px; gap: 12px;
  background: var(--glass); border-color: var(--line); align-items: flex-start;
}
.t2 .note-panel .k { font-family: var(--sans); font-size: var(--type-caption-size); font-weight: var(--weight-strong); letter-spacing: 0; text-transform: none; color: var(--ink-2); padding-top: 1px; }
.t2 .note-panel p { font-size: var(--type-body-size); line-height: var(--leading-relaxed); color: var(--ink-3); max-width: 110ch; }
.t2 .dempty { padding: 56px 20px; }
.t2 .dempty .t { font-size: var(--type-heading-size); }
.t2 .dempty .s { font-size: var(--type-body-size); color: var(--ink-4); }

/* Its own colours, stated here. The bar used to borrow the SIDEBAR's text tokens
   because both were ink-on-dark; the rail is light now, and borrowing them put
   dark text on this dark bar. */
.t2 .selectbar {
  color: var(--on-accent);
  background: var(--inverse-bg); border-radius: var(--radius-xl); padding: 8px 8px 8px 14px; box-shadow: var(--shadow-4);
  /* Never wider than the pane it floats over, whatever the labels are. */
  width: min(760px, 100% - 32px); max-width: 760px; margin-left: auto; margin-right: auto;
}

/* ---- waiting for a comparison ----
   The screen a reader sees between clicking Compare and the report. It is
   painted BEFORE the server is asked, so the click is answered at once, and
   it names the pair and the phase: computing (a fresh pair, up to two seconds
   on a thousand activities) or loading (the report's own payload). Centred in
   the pane rather than a line of text at the top-left, because for those two
   seconds it is the whole screen. */
/* `.t2.cmp-wait`, compound: the pane carries both classes on ONE element,
   and a descendant selector never matches the element it starts from. The
   ring below got its style and the pane did not, and the loader sat at the
   top-left of a block. */
.t2.cmp-wait, .t2 .cmp-wait { flex: 1; display: flex; align-items: center; justify-content: center; padding: 40px 24px; overflow: hidden; }
.t2 .cmp-wait-box { display: grid; justify-items: center; gap: 10px; text-align: center; max-width: 440px; }
.t2 .cmp-ring {
  width: 44px; height: 44px; border-radius: 50%; margin-bottom: 8px; position: relative;
  border: 3px solid var(--line-3);
}
.t2 .cmp-ring span {
  position: absolute; inset: -3px; border-radius: 50%; border: 3px solid transparent;
  border-top-color: var(--accent); animation: spin .8s linear infinite;
}
.t2 .cmp-wait-pair { display: flex; align-items: center; gap: 8px; font-size: var(--type-body-size); color: var(--ink-2); font-variant-numeric: tabular-nums; }
.t2 .cmp-wait-pair b { font-weight: var(--weight-strong); color: var(--ink); }
.t2 .cmp-wait-pair .arr { color: var(--ink-4); }
.t2 .cmp-wait-phase { font-size: var(--type-heading-size); font-weight: var(--weight-strong); color: var(--ink); letter-spacing: var(--type-heading-tracking); }
.t2 .cmp-wait-sub { font-size: var(--type-caption-size); color: var(--ink-4); line-height: var(--leading-relaxed); }
@media (prefers-reduced-motion: reduce) {
  .t2 .cmp-ring span { animation: cmp-pulse 1.2s ease-in-out infinite; }
  @keyframes cmp-pulse { 50% { opacity: .35; } }
}
/* When it could not be loaded: the sentence, and the two ways on. Never a
   spinner that stays -- a wait with no end is the defect this replaces. */
.cmp-wait.failed .cmp-ring { border-color: var(--danger-line); }
.cmp-wait.failed .cmp-ring span { animation: none; border-top-color: var(--danger); transform: rotate(45deg); }
.cmp-wait.failed .cmp-wait-phase { color: var(--danger); }
.t2 .cmp-wait-acts { display: flex; gap: 8px; margin-top: 6px; }
.t2 .selectbar .n { font-family: var(--sans); font-size: var(--type-caption-size); font-weight: var(--weight-medium); font-variant-numeric: tabular-nums; border-radius: var(--radius-sm); padding: 3px 8px; background: var(--inverse-wash-2); letter-spacing: 0; }
.t2 .selectbar .msg { font-size: var(--type-body-size); color: var(--inverse-text-3); }
.t2 .selectbar .btn { background: transparent; background-image: none; border-color: transparent; color: var(--inverse-text-2); box-shadow: none; height: 30px; }
.t2 .selectbar .btn:hover { background: var(--inverse-wash); background-image: none; border-color: transparent; color: var(--on-accent); }
.t2 .selectbar .btn.primary { background: var(--on-accent); background-image: none; border-color: var(--on-accent); color: var(--ink); font-weight: var(--weight-strong); }
.t2 .selectbar .btn.primary:hover { background: var(--inverse-control-hover); border-color: var(--inverse-control-hover); color: var(--ink); }
.t2 .selectbar .btn:disabled { background: var(--inverse-wash-3); border-color: transparent; color: var(--inverse-muted); }

/* ---- the projects list (`.pj`) ----
   Same surface as Schedules — toolbar, grid, hairlines — plus the two things a
   portfolio needs: a band that says where to look, and a row that opens in
   place for its delivery figures.

   The band replaced four flat counters. They were the right four numbers and
   they answered nothing: "1 slipping" out of how many, slipping by how far,
   and getting better or worse? A portfolio screen exists to RANK, and a rank
   is a shape. So the composition is a ring, the trajectory is a line, and the
   ranking is the table underneath — one object each, in that order. */

/* the tones. One definition, used by the ring, the legend, the chart and the
   sparklines, so a colour can never mean `slipping` in one and `at risk` in
   the next. */
.t2 .t-hi   { --tone: var(--danger-dot); --tone-wash: var(--danger-tint); }
.t2 .t-med  { --tone: var(--warn-dot);   --tone-wash: var(--warn-tint); }
.t2 .t-ok   { --tone: var(--ok-dot);     --tone-wash: var(--ok-tint); }
.t2 .t-none { --tone: var(--ink-5);      --tone-wash: var(--line-3); }
.t2 .t-all  { --tone: var(--ink-3);      --tone-wash: var(--line-3); }

.t2 .pf-band {
  display: grid; grid-template-columns: 188px minmax(0, 1fr) minmax(0, 260px);
  align-items: stretch; margin-bottom: 14px; background: var(--surface);
  border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow-1);
  overflow: hidden;
}

/* ---- the ring ---- */
.t2 .pf-ringcell {
  position: relative; display: grid; place-items: center; padding: 18px 10px;
  border-right: 1px solid var(--line-2); background: var(--surface-3);
}
.t2 .pf-ring { width: 128px; height: 128px; display: block; overflow: visible; }
.t2 .pf-ring-track { fill: none; stroke: var(--line-3); }
.t2 .pf-ring-seg {
  fill: none; stroke: var(--tone, var(--ink-5)); stroke-linecap: butt; cursor: pointer;
  transition: opacity var(--t-med) var(--ease), stroke-width var(--t-fast) var(--ease);
}
.t2 .pf-ring-seg:hover { stroke-width: 16; }
.t2 .pf-ring-seg:focus-visible { outline: 2px solid var(--focus); outline-offset: 3px; }
.t2 .pf-ring-seg.dim { opacity: .26; }
.t2 .pf-ring-seg.tone-hi { --tone: var(--danger-dot); }
.t2 .pf-ring-seg.tone-med { --tone: var(--warn-dot); }
.t2 .pf-ring-seg.tone-ok { --tone: var(--ok-dot); }
.t2 .pf-ring-seg.tone-none { --tone: var(--ink-5); }
/* The centre is the answer, so it is the only display-sized figure on the band.
   Sized to the RING, not to the cell it sits in: `inset: 0` centred the caption
   on the whole cell, which is 188px beside the legend and the full page width
   once the band stacks — so "project needs attention" set itself wider than the
   hole and struck through the stroke on both sides. 128 − 2×18 = 92, inside the
   102px hole at every width. */
.t2 .pf-ringmid {
  position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);
  width: 128px; height: 128px; display: grid; place-content: center;
  text-align: center; pointer-events: none; padding: 0 18px;
}
.t2 .pf-ringmid b {
  display: block; font-size: var(--type-display-size); line-height: 1;
  font-weight: var(--weight-strong); letter-spacing: var(--type-display-tracking);
  color: var(--ink); font-variant-numeric: tabular-nums;
}
.t2 .pf-ringmid b.bad { color: var(--danger); }
.t2 .pf-ringmid span {
  display: block; margin-top: 5px; font-size: var(--type-caption-size);
  line-height: var(--leading-tight); color: var(--ink-4);
}

/* ---- the legend, which is also the filter ---- */
.t2 .pf-keys { display: flex; flex-direction: column; justify-content: center; gap: 2px; padding: 14px 16px; min-width: 0; }
.t2 .pf-key {
  display: grid; grid-template-columns: 9px 112px minmax(40px, 1fr) auto;
  align-items: center; gap: 10px; width: 100%; padding: 6px 8px; border: 0;
  border-radius: var(--radius-sm); background: none; text-align: left; cursor: pointer;
  transition: background var(--t-fast) var(--ease);
}
.t2 .pf-key:hover { background: var(--hover-wash); }
.t2 .pf-key.on { background: var(--surface-2); }
.t2 .pf-key:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
.t2 .pf-key .sw { width: 9px; height: 9px; border-radius: 50%; background: var(--tone); }
.t2 .pf-key .l { font-size: var(--type-body-size); font-weight: var(--weight-medium); color: var(--ink-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.t2 .pf-key.on .l { color: var(--ink); }
.t2 .pf-key .tr { height: 6px; border-radius: var(--radius-pill); background: var(--line-3); overflow: hidden; }
.t2 .pf-key .tr i { display: block; height: 100%; border-radius: var(--radius-pill); background: var(--tone); transition: width var(--t-med) var(--ease); }
.t2 .pf-key b { font-size: var(--type-body-size); font-weight: var(--weight-strong); color: var(--ink); font-variant-numeric: tabular-nums; min-width: 18px; text-align: right; }

/* ---- what the contract says ---- */
.t2 .pf-exposure {
  display: flex; flex-direction: column; justify-content: center; gap: 13px;
  padding: 14px 18px; border-left: 1px solid var(--line-2); background: var(--surface-3); min-width: 0;
}
.t2 .pf-fact .k { font-size: var(--type-caption-size); color: var(--ink-4); }
.t2 .pf-fact .v {
  margin-top: 1px; font-size: var(--type-title-size); line-height: var(--leading-tight);
  font-weight: var(--weight-strong); color: var(--ink); font-variant-numeric: tabular-nums;
}
.t2 .pf-fact .v .bad { color: var(--danger); }
.t2 .pf-fact .v .f-bad { color: var(--danger); }
.t2 .pf-fact .v .f-ok { color: var(--ok); }
/* Wraps rather than clips. These lines say which project a figure belongs to
   and what it is measured against — "030000000 · since its first upda…" is the
   half that answers neither. */
.t2 .pf-fact .s { font-size: var(--type-caption-size); line-height: var(--leading-tight); color: var(--ink-4); }

@media (max-width: 1080px) {
  .t2 .pf-band { grid-template-columns: 170px minmax(0, 1fr); }
  .t2 .pf-exposure {
    grid-column: 1 / -1; border-left: 0; border-top: 1px solid var(--line-2);
    flex-direction: row; gap: 0;
  }
  .t2 .pf-fact { flex: 1; min-width: 0; padding-right: 14px; }
  .t2 .pf-fact + .pf-fact { padding-left: 14px; border-left: 1px solid var(--line-2); }
}
@media (max-width: 720px) {
  .t2 .pf-band { grid-template-columns: minmax(0, 1fr); }
  .t2 .pf-ringcell { border-right: 0; border-bottom: 1px solid var(--line-2); }
  .t2 .pf-exposure { flex-direction: column; gap: 13px; }
  .t2 .pf-fact + .pf-fact { padding-left: 0; border-left: 0; }
}

/* ---- the drift panel ---- */
.t2 .dpanel {
  margin-bottom: 14px; background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--radius-lg); box-shadow: var(--shadow-1); overflow: hidden;
}
.t2 .dpanel-head {
  display: flex; align-items: flex-start; justify-content: space-between; gap: 16px;
  padding: 14px 18px 10px; flex-wrap: wrap;
}
.t2 .dpanel-head h2 {
  margin: 0; font-size: var(--type-heading-size); line-height: var(--type-heading-leading);
  font-weight: var(--weight-strong); color: var(--ink);
}
.t2 .dpanel-head .subline { margin: 3px 0 0; font-size: var(--type-caption-size); color: var(--ink-4); }
.t2 .dpanel-keys { display: flex; flex-wrap: wrap; gap: 4px 14px; padding-top: 2px; }
.t2 .dpanel-key { display: inline-flex; align-items: center; gap: 6px; font-size: var(--type-caption-size); color: var(--ink-3); font-variant-numeric: tabular-nums; }
.t2 .dpanel-key i { width: 14px; height: 2px; border-radius: var(--radius-pill); background: var(--tone); }
.t2 .dpanel-plot { padding: 0 8px; }
/* No `width: 100%`. The SVG is drawn at this box's measured width, so it is
   already the right size and stretching it would scale the type with it. */
.t2 .dchart { display: block; max-width: 100%; }
.t2 .dpanel-note { margin: 0; padding: 6px 18px 14px; font-size: var(--type-caption-size); color: var(--ink-4); }

.t2 .dchart-grid { stroke: var(--line-2); stroke-width: 1; }
/* Zero is the contract-relative datum, not just another gridline. */
.t2 .dchart-grid.zero { stroke: var(--ink-5); stroke-width: 1; }
/* No `text-anchor` here. It is set as a presentation ATTRIBUTE per tick, and a
   CSS declaration beats a presentation attribute — the end label went back to
   centred, overhung the viewBox and lost its year: "23-Feb-". */
.t2 .dchart-tick { fill: var(--ink-4); font-family: var(--sans); font-size: var(--type-caption-size); font-variant-numeric: tabular-nums; }
.t2 .dseries { --tone: var(--ink-4); }
.t2 .dseries.tone-hi { --tone: var(--danger-dot); --tone-wash: var(--danger-tint); }
.t2 .dseries.tone-med { --tone: var(--warn-dot); --tone-wash: var(--warn-tint); }
.t2 .dseries.tone-ok { --tone: var(--ok-dot); --tone-wash: var(--ok-tint); }
.t2 .dseries.tone-none { --tone: var(--ink-5); --tone-wash: var(--line-3); }
.t2 .dseries-line { fill: none; stroke: var(--tone); stroke-width: 1.8; stroke-linejoin: round; stroke-linecap: round; }
.t2 .dseries-area { fill: var(--tone-wash, var(--line-3)); stroke: none; }
.t2 .dseries-dot { fill: var(--tone); stroke: var(--surface); stroke-width: 2; }

/* ---- the row's sparkline ---- */
.t2 .pj-trend { vertical-align: middle; }
.t2 .pj-sparkwrap { display: block; line-height: 0; }
.t2 .spark { display: block; overflow: visible; --tone: var(--ink-4); --tone-wash: var(--line-3); }
.t2 .spark.t-hi { --tone: var(--danger-dot); --tone-wash: var(--danger-tint); }
.t2 .spark.t-med { --tone: var(--warn-dot); --tone-wash: var(--warn-tint); }
.t2 .spark.t-ok { --tone: var(--ok-dot); --tone-wash: var(--ok-tint); }
.t2 .spark.t-none { --tone: var(--ink-5); --tone-wash: var(--line-3); }
.t2 .spark-line { fill: none; stroke: var(--tone); stroke-width: 1.3; stroke-linejoin: round; stroke-linecap: round; }
.t2 .spark-area { fill: var(--tone-wash); stroke: none; }
.t2 .spark-zero { stroke: var(--line-2); stroke-width: 1; }
.t2 .spark-dot { fill: var(--tone); }
.t2 .pj-nospark { font-size: var(--type-caption-size); color: var(--ink-5); }

/* 1040, not 940: the Trend column was added to a width that had no slack in it,
   and the squeeze came out of the one elastic column — the project's own code
   clipped to "0." beside an intact "unpublished" chip. */
.t2 .dlist table.grid.pj-table { min-width: 1040px; }
.t2 table.grid.pj-table thead th { white-space: normal; }
.t2 table.grid.pj-table tbody tr.pf-row { cursor: pointer; }
.t2 table.grid.pj-table tbody tr.pf-row.open td { background: var(--surface-3); border-bottom-color: transparent; }
.t2 table.grid.pj-table tbody tr.pf-row.muted td { color: var(--ink-4); }
.t2 .pj-code.off .link { color: var(--ink-3); }
/* The name wins the line; the governing clause takes what is left. */
.t2 .d-sub > .pj-pname { color: var(--ink-3); flex: 0 0 auto; max-width: 100%; }
.t2 .d-tag.danger { background: var(--danger-tint); border-color: var(--danger-line); color: var(--danger); margin-right: 8px; }
.t2 .iconbtn.danger:hover { background: var(--danger-tint); color: var(--danger); }

/* Health, in the status idiom: a dot carries the colour, the word stays ink. */
.t2 .lozenge.h-hi::before { background: var(--danger-dot); box-shadow: 0 0 0 2px var(--danger-tint); }
.t2 .lozenge.h-med::before { background: var(--warn-dot); box-shadow: 0 0 0 2px var(--warn-tint); }
.t2 .lozenge.h-ok::before { background: var(--ok-dot); box-shadow: 0 0 0 2px var(--ok-tint); }
.t2 .lozenge.h-none { color: var(--ink-4); }
.t2 .lozenge.h-none::before { background: var(--ink-5); }

.t2 .pf-exp {
  width: 24px; height: 24px; border-radius: var(--radius-sm); display: inline-grid; place-items: center; color: var(--ink-4);
  transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.t2 .pf-exp:hover { background: var(--line-2); color: var(--ink); }
.t2 .pf-exp svg { transition: transform var(--t-med) var(--ease); }
.t2 .pf-exp:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; border-radius: var(--radius-sm); }
.t2 table.grid.pj-table tbody tr.pf-detail > td,
.t2 table.grid.pj-table tbody tr.pf-detail:hover > td { background: var(--surface-3); padding: 2px 16px 16px 50px; }
.t2 .pf-dgrid {
  display: grid; grid-template-columns: repeat(8, minmax(0, 1fr)); gap: 0; margin: 0; padding: 0;
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow-1);
}
.t2 .pf-d { padding: 11px 14px 12px; min-width: 0; border: 0; }
.t2 .pf-d + .pf-d { border-left: 1px solid var(--line-2); }
.t2 .pf-dk { font-family: var(--sans); font-size: var(--type-caption-size); font-weight: var(--weight-regular); letter-spacing: 0; text-transform: none; color: var(--ink-4); }
.t2 .pf-dk.has-t { border-bottom: 1px dotted var(--ink-5); }
.t2 .pf-dv { margin-top: 4px; font-family: var(--sans); font-size: var(--type-heading-size); font-weight: var(--weight-strong); color: var(--ink); font-variant-numeric: tabular-nums; white-space: nowrap; }
.t2 .pf-dv .bar .v { font-family: var(--sans); font-size: var(--type-heading-size); font-weight: var(--weight-strong); }
.t2 .pf-dv .f-bad { color: var(--danger); } .t2 .pf-dv .f-ok { color: var(--ok); }
.t2 .pf-basis { margin-top: 10px; font-family: var(--sans); font-size: var(--type-body-size); color: var(--ink-4); padding: 0; border: 0; }
@media (max-width: 1180px) {
  .t2 .pf-dgrid { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .t2 .pf-d:nth-child(5) { border-left: 0; }
  .t2 .pf-d:nth-child(n+5) { border-top: 1px solid var(--line-2); }
}
@media (prefers-reduced-motion: no-preference) {
  .t2 tr.pf-detail:not([hidden]) .pf-dgrid { animation: t2-rise 200ms var(--ease); }
}

/* Reference, under the table: what the four health words mean, and what the
   DCMA bar's three colours mean. */
.t2 .pf-legend {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0; margin-top: 16px; padding: 0;
  border: 1px solid var(--line-2); border-radius: var(--radius-lg); background: var(--glass);
}
.t2 .pf-legend-item { padding: 12px 14px; min-width: 0; }
.t2 .pf-legend-item + .pf-legend-item { border-left: 1px solid var(--line-2); }
.t2 .pf-legend-item .lozenge { margin-bottom: 7px; }
.t2 .pf-legend-item p { margin: 0; font-size: var(--type-body-size); line-height: var(--leading-relaxed); color: var(--ink-3); font-family: var(--sans); }
.t2 .legend.pf-bandleg {
  margin-top: 12px; padding: 0 2px; border-top: 0; font-size: var(--type-body-size); color: var(--ink-3); gap: 18px; flex-wrap: wrap; align-items: flex-start;
}
.t2 .legend.pf-bandleg .sw { width: 8px; height: 8px; border-radius: 50%; margin-right: 6px; }
.t2 .legend.pf-bandleg .right { flex: 1 1 420px; margin-left: 0; color: var(--ink-4); line-height: var(--leading-relaxed); }
@media (max-width: 900px) {
  .t2 .pf-legend { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .t2 .pf-legend-item:nth-child(3) { border-left: 0; }
  .t2 .pf-legend-item:nth-child(n+3) { border-top: 1px solid var(--line-2); }
}
.t2 .pj-empty-ic {
  width: 44px; height: 44px; margin: 0 auto 14px; border-radius: var(--radius-xl); display: grid; place-items: center;
  background: var(--accent-tint); color: var(--accent); box-shadow: inset 0 0 0 1px var(--accent-tint-line);
}
.t2 .pj-empty-ic svg { width: 20px; height: 20px; }
.t2 .pj-empty .btn { margin-top: 16px; }
.t2 .skel-stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; margin-bottom: 16px; }
.t2 .skel-stats > div { height: 79px; border: 1px solid var(--line); border-radius: var(--radius-lg); background: var(--surface); padding: 15px 16px; display: grid; gap: 12px; align-content: start; }

/* ---- legacy type, on the theme ----
   Screens written before theme.css set measured values in monospace and sized
   text by hand. Inside a themed screen the generic helpers take the text face
   with tabular numerals, which keeps digits in columns without the terminal
   look; the per-screen blocks below map each screen's own rules onto the five
   styles. Generated from the legacy rules (size -> nearest style, mono -> sans,
   weights and corners -> tokens), then adjusted by eye. */
.t2 .mono, .t2 .num, .t2 .kicker { font-family: var(--sans); font-variant-numeric: tabular-nums; }
.t2 .kicker { font-size: var(--type-caption-size); font-weight: var(--weight-strong); letter-spacing: 0; text-transform: none; color: var(--ink-3); }
.t2 .hint { font-size: var(--type-caption-size); line-height: var(--leading-relaxed); color: var(--ink-4); }
.t2 .err { border-radius: var(--radius-md); font-size: var(--type-body-size); }

/* ---- shared primitives, on the theme ----
   Cards, plain tables, chips, fields, notices: the pieces every screen that
   predates the list surface is built from. Themed once here, so a screen built
   from them joins by carrying `t2` and looks like the rest of the product. */
.t2 .search { border-radius: var(--radius-xs); }
.t2 .search .k { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); }
.t2 .search input { font-size: var(--type-caption-size); }
.t2 .card { border-radius: var(--radius-lg); }
.t2 .card-title { font-size: var(--type-body-size); font-weight: var(--weight-strong); }
.t2 .card-note { font-size: var(--type-caption-size); }
.t2 table.grid thead th { font-size: var(--type-caption-size); font-weight: var(--weight-strong); letter-spacing: 0; text-transform: none; }
.t2 table.grid tbody td { font-size: var(--type-body-size); }
.t2 table.grid td.num, .t2 table.grid th.num { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-body-size); }
.t2 .legend { font-size: var(--type-caption-size); }
.t2 .chip { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); font-weight: var(--weight-strong); letter-spacing: 0; border-radius: var(--radius-xs); }
.t2 .chip.ok { font-size: var(--type-caption-size); border-radius: var(--radius-xs); }
.t2 .chip.ms { font-size: var(--type-caption-size); }
.t2 .chip.cp { font-size: var(--type-caption-size); letter-spacing: 0; }
.t2 .toggle { font-size: var(--type-caption-size); }
.t2 .toggle .track { border-radius: var(--radius-md); }
.t2 .sched-name { font-size: var(--type-body-size); font-weight: var(--weight-strong); }
.t2 .sched-meta { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); }
.t2 .popover { border-radius: var(--radius-xs); }
.t2 .popover .pf-sum { font-size: var(--type-caption-size); }
.t2 .popover .pf-note { font-size: var(--type-caption-size); }
.t2 .popover .pf-change { font-size: var(--type-caption-size); }
.t2 .popover .ph2 { font-size: var(--type-caption-size); font-weight: var(--weight-strong); letter-spacing: 0; text-transform: none; }
.t2 .popover .ph { font-size: var(--type-caption-size); font-weight: var(--weight-strong); letter-spacing: 0; text-transform: none; }
.t2 .popover .pr .l { font-size: var(--type-caption-size); font-weight: var(--weight-medium); }
.t2 .popover .pr .n { font-size: var(--type-caption-size); }
.t2 .credinput { font-size: var(--type-body-size); border-radius: var(--radius-xs); }
.t2 .credbox .hint, .t2 .msect .hint { font-size: var(--type-caption-size); }
.t2 .field label { font-size: var(--type-caption-size); font-weight: var(--weight-medium); }
.t2 .field input, .t2 .field select, .t2 .field textarea { font-size: var(--type-body-size); border-radius: var(--radius-md); }
.t2 .field textarea { font-size: var(--type-caption-size); }
.t2 .field .hint { font-size: var(--type-caption-size); }
.t2 .align-notice { border-radius: var(--radius-xs); }
.t2 .align-notice .t { font-size: var(--type-body-size); font-weight: var(--weight-strong); }
.t2 .align-notice .m { font-size: var(--type-caption-size); }
.t2 .muted { font-size: var(--type-caption-size); }
.t2 .loading { font-size: var(--type-body-size); }
.t2 .chip.drv { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); letter-spacing: 0; }
.t2 .auditrow .when { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); }
.t2 .rowdel { font-size: var(--type-caption-size); border-radius: var(--radius-xs); }
.t2 .meth-ver { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); }
.t2 .meth-p { font-size: var(--type-body-size); }
.t2 .hi-day { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); font-weight: var(--weight-strong); letter-spacing: 0; text-transform: none; }
.t2 .hi-when { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); }
.t2 .hi-label { font-size: var(--type-body-size); }
.t2 .hi-detail { font-size: var(--type-caption-size); }
.t2 .hi-who { font-size: var(--type-caption-size); }
.t2 .hi-role { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); letter-spacing: 0; text-transform: none; }
.t2 .hi-range { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); }
.t2 .card { background: var(--surface); border: 1px solid var(--line); box-shadow: var(--shadow-1); }
.t2 .card + .card { margin-top: 16px; }
.t2 .card-head { padding: 12px 16px; border-bottom: 1px solid var(--line-2); background: transparent; }
.t2 .card-title { color: var(--ink); letter-spacing: var(--type-body-tracking); }
.t2 .card-note { color: var(--ink-4); }
.t2 .card-body { padding: 14px 16px 16px; color: var(--ink-2); }
.t2 .card.danger-card { border-color: var(--danger-line-2); }
.t2 table.grid thead { position: sticky; top: 0; z-index: 3; }
.t2 table.grid thead th {
  font-family: var(--sans); font-weight: var(--weight-medium); color: var(--ink-3); background: var(--head-bg);
  border-bottom: 0; box-shadow: inset 0 -1px 0 var(--line); padding: 9px 12px; line-height: var(--leading-snug);
}
.t2 table.grid tbody td { padding: 10px 12px; color: var(--ink-2); border-bottom-color: var(--line-2); line-height: var(--leading-snug); transition: background var(--t-fast) var(--ease); }
.t2 table.grid tbody tr:hover td { background: var(--surface-3); }
.t2 table.grid tbody tr.click { cursor: pointer; }
.t2 .chip { padding: 1px 7px; line-height: 18px; text-transform: none; }
.t2 .chip.hi { background: var(--danger-tint); color: var(--danger); }
.t2 .chip.med, .t2 .chip.draft { background: var(--warn-tint); color: var(--warn); }
.t2 .chip.ok { background: var(--ok-tint); color: var(--ok); }
.t2 .chip.low, .t2 .chip.none, .t2 .chip.ms { background: var(--line-3); color: var(--ink-3); }
.t2 .chip.rec { background: var(--surface); color: var(--ink-3); box-shadow: inset 0 0 0 1px var(--line); }
.t2 .chip.rec.hot { color: var(--brand-accent); box-shadow: inset 0 0 0 1px var(--brand-accent); }
.t2 .sched-name { color: var(--ink); }
.t2 .sched-meta { color: var(--ink-4); }
.t2 .muted { color: var(--ink-4); line-height: var(--leading-relaxed); }
.t2 .legend { color: var(--ink-4); }
.t2 .legend .sw { border-radius: 50%; }
.t2 .align-notice { border: 1px solid var(--line); border-radius: var(--radius-md); background: var(--surface); box-shadow: var(--shadow-1); }
.t2 .align-notice.warning { background: var(--warn-tint); border-color: var(--warn-line); }
.t2 .align-notice .m { color: var(--ink-3); line-height: var(--leading-relaxed); }
.t2 .search { border-color: var(--input-line); border-radius: var(--radius-sm); box-shadow: var(--shadow-1); height: 32px; transition: border-color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease); }
.t2 .search:focus-within { border-color: var(--focus); box-shadow: var(--ring); }
.t2 .search .k { letter-spacing: 0; color: var(--ink-4); background: var(--surface-3); border-right-color: var(--line-2); text-transform: capitalize; }
.t2 .search input { font-size: var(--type-body-size); color: var(--ink); }
.t2 .field label { color: var(--ink-3); }
.t2 .field input, .t2 .field select, .t2 .field textarea, .t2 .credinput {
  border-radius: var(--radius-sm); border-color: var(--input-line); color: var(--ink); box-shadow: var(--shadow-1);
  transition: border-color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease);
}
.t2 .field input:hover, .t2 .field select:hover, .t2 .field textarea:hover, .t2 .credinput:hover { border-color: var(--control-line); }
.t2 .field input:focus-visible, .t2 .field select:focus-visible, .t2 .field textarea:focus-visible, .t2 .credinput:focus-visible {
  outline: 0; border-color: var(--focus); box-shadow: var(--ring);
}
/* The invite code, once it has opened the door. It stays on the form -- the
   signup sends it again -- but reads as settled: no shadow, a tinted field, and
   a tick where the caret was. The hint under it changes from an instruction to
   a statement. */
.t2 #f-invite.passed input { background: var(--ok-tint); border-color: var(--ok-line); color: var(--ink-2); box-shadow: none; }
.t2 #f-invite.passed input:hover { border-color: var(--ok-line); }
.t2 #f-invite.passed label::after { content: " — accepted"; font-weight: var(--weight-regular); color: var(--ok); }
.t2 #f-invite.passed .hint { color: var(--ink-4); }
.t2 .toggle .track { border-radius: var(--radius-pill); background: var(--ink-5); transition: background var(--t-med) var(--ease); }
.t2 .toggle input:checked + .track { background: var(--accent); }
.t2 .toggle .knob { background: var(--on-accent); transition: left var(--t-med) var(--ease); }
.t2 .popover { border-radius: var(--radius-lg); border: 0; box-shadow: var(--shadow-3); }
.t2 .rowdel { border-radius: var(--radius-sm); transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease); }
.t2 .auditrow .when, .t2 .hi-when, .t2 .hi-range, .t2 .meth-ver { color: var(--ink-4); }
/* A date or a figure is one token: it may not break at its own hyphen. */
.t2 table.grid td.num, .t2 table.grid td .mono, .t2 table.grid td.mono { white-space: nowrap; }
/* Native selects on a themed screen, as controls rather than browser chrome. */
.t2.scr select, .t2 .regbar select {
  height: 32px; padding: 0 28px 0 10px; font: inherit; font-size: var(--type-body-size); color: var(--ink);
  background-color: var(--surface); border: 1px solid var(--input-line); border-radius: var(--radius-sm);
  box-shadow: var(--shadow-1); cursor: pointer;
  transition: border-color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease);
}
.t2.scr select:hover { border-color: var(--control-line); }
.t2.scr select:focus-visible { outline: 0; border-color: var(--focus); box-shadow: var(--ring); }
.t2 .regbar { gap: 10px; color: var(--ink-3); font-size: var(--type-caption-size); }

/* ---- the sheet (Intake; Setup shares the vocabulary) ----
   Blocks were ruled off on bare paper. On a tinted page that reads as
   unfinished, so each block is a card: same head, same rows, same container
   queries — the rule under the head becomes the card's own hairline. */
.t2 .ik-title { font-weight: var(--weight-strong); }
.t2 .ik-state { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); font-weight: var(--weight-strong); letter-spacing: 0; }
.t2 .ik-value { font-size: var(--type-caption-size); }
.t2 .ik-sub { font-size: var(--type-caption-size); }
.t2 .sheet-link { font-weight: var(--weight-medium); }
.t2 .ik-skel { border-radius: var(--radius-xs); }
.t2 .sheet-words { font-size: var(--type-display-size); font-weight: var(--weight-strong); }
.t2 .sheet-line { font-size: var(--type-body-size); }
.t2 .sheet-count { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); letter-spacing: 0; }
.t2 .sheet-block .hint, .t2 .sheet-act .hint, .t2 .sheet-block .field .hint { font-size: var(--type-caption-size); }
.t2 .sheet-t { font-size: var(--type-body-size); font-weight: var(--weight-strong); }
.t2 .sheet-n { font-size: var(--type-caption-size); }
.t2 .sheet-two label { font-size: var(--type-caption-size); font-weight: var(--weight-medium); }
.t2 .sheet-two input { font-size: var(--type-body-size); border-radius: var(--radius-sm); }
.t2 .ik-drop { border-radius: var(--radius-lg); }
.t2 .ik-drop-t { font-size: var(--type-body-size); font-weight: var(--weight-strong); }
.t2 .ik-empty { font-size: var(--type-body-size); }
.t2 .sheet-refuse { font-size: var(--type-body-size); font-weight: var(--weight-medium); }
.t2 .sheet-two input[type="date"] { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); letter-spacing: 0; }
.t2 .ik-miss .t, .t2 .ik-gap .t { font-size: var(--type-body-size); font-weight: var(--weight-medium); }
.t2 .ik-miss .s, .t2 .ik-gap .s { font-size: var(--type-caption-size); }
.t2 .ik-miss .d, .t2 .ik-gap .d { font-size: var(--type-caption-size); }
.t2 .ik-fold summary { font-size: var(--type-caption-size); }
.t2 .ik-fold summary:focus-visible { border-radius: var(--radius-xs); }
.t2 .ik-prow { font-size: var(--type-caption-size); }
.t2 .ik-prow .v { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); }
.t2 .ik-none { font-size: var(--type-body-size); }
.t2 .ik-file-row .nm { font-size: var(--type-caption-size); }
.t2 .ik-file-row .dt { font-size: var(--type-caption-size); }
.t2 .ik-file-row.on .nm { font-weight: var(--weight-medium); }
.t2 .ik-file-row:focus-visible { border-radius: var(--radius-xs); }
.t2 .sheet-body select { font-size: var(--type-body-size); border-radius: var(--radius-md); }
.t2 .sheet-meas { max-width: 1120px; }
.t2 .sheet-verdict {
  padding: 20px 22px; margin: 0 0 16px; border: 1px solid var(--line); border-bottom: 1px solid var(--line);
  border-radius: var(--radius-lg); background: var(--surface); box-shadow: var(--shadow-2); gap: 20px;
}
.t2 .sheet-words { line-height: var(--type-display-leading); letter-spacing: var(--type-display-tracking); color: var(--ink); }
.t2 .sheet-verdict.bad .sheet-words { color: var(--danger); }
.t2 .sheet-line { margin-top: 8px; line-height: var(--leading-relaxed); color: var(--ink-3); }
.t2 .sheet-counts { gap: 8px; margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--line-2); }
.t2 .sheet-count {
  gap: 6px; padding: 2px 10px 2px 8px; border: 1px solid var(--line); border-radius: var(--radius-pill);
  background: var(--surface); color: var(--ink-2); font-weight: var(--weight-medium); line-height: 20px;
}
.t2 .sheet-count.mute { color: var(--ink-4); }
.t2 .sheet-block {
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg);
  box-shadow: var(--shadow-1); padding: 0 16px 14px;
}
.t2 .sheet-head, .t2 .sheet-block > .sheet-head:first-child {
  margin: 0 -16px; padding: 12px 16px 11px; border-bottom: 1px solid var(--line-2); align-items: center;
}
.t2 .sheet-t { letter-spacing: var(--type-body-tracking); color: var(--ink); }
.t2 .sheet-n { color: var(--ink-4); }
.t2 .ik-rail > .sheet-block + .sheet-block,
.t2 .ik-screen > .sheet-block + .sheet-block { margin-top: 16px; }

/* ---- Intake: the console ----
   The screen was four bordered cards down a 1120px column with a rail beside
   it, which on a wide monitor left a third of the glass empty on either side
   and spent the width it did keep on prose that wrapped anyway.

   The checks are all the same shape — a name, a state, a measured value and
   what to do about it — so they are one board of bands, not four cards, and
   the board takes the width. Its value is alignment: the states and the values
   land on the same two columns the whole way down, so a reader compares them
   by eye instead of reading four cards one at a time.

   The rail keeps its cards, because the things in it are not checks. They are
   the submittal itself: the file, its receipt, the series it belongs to. */
/* The columns themselves are the base rule's, and stay there: restating
   `grid-template-columns` under `.t2` would out-specify the container query
   that stacks them on a narrow page, and the rail would never come down. */
.t2 .ik-screen { max-width: none; }
.t2 .ik-board {
  min-width: 0; background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--radius-lg); box-shadow: var(--shadow-1); overflow: hidden;
}
.t2 .ik-bhead {
  display: flex; align-items: baseline; gap: 10px; padding: 12px 18px 11px;
  border-bottom: 1px solid var(--line-2); background: var(--surface-3);
}
.t2 .ik-rail { min-width: 0; display: grid; gap: 14px; }
.t2 .ik-rail > .sheet-block { margin: 0; }

/* A band's heading is a rule with a name on it, not another card's lid: the
   four borders were four announcements that the reader had crossed into
   something new, when all they had done was move down the same list. */
.t2 .ik-band + .ik-band { border-top: 1px solid var(--line-2); }
.t2 .ik-bandhead {
  display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap;
  padding: 13px 18px 9px;
}
.t2 .ik-bandt {
  font-size: var(--type-body-size); font-weight: var(--weight-strong); color: var(--ink);
  letter-spacing: var(--type-body-tracking);
}
/* Who acts on what is in this band — the band's whole reason for being one. */
.t2 .ik-bandn { font-size: var(--type-caption-size); color: var(--ink-4); }
.t2 .ik-bandbody { padding: 0 18px 14px; }

/* The rows, on one set of columns. `ik-row` carries its own head/sub pair and
   keeps them; the two flat kinds line up: name, then the measured word, then
   what it means. The description is capped at its own measure so the prose
   stays readable however wide the monitor is — filling the width is the
   layout's job, not the sentence's. */
.t2 .ik-board .ik-row, .t2 .ik-board .ik-row.ik-raise { margin: 0 -18px; padding: 11px 18px; }
.t2 .ik-board .ik-miss, .t2 .ik-board .ik-gap {
  display: grid; grid-template-columns: minmax(150px, 15rem) minmax(96px, auto) minmax(0, 1fr);
  align-items: baseline; gap: 6px 16px; margin: 0 -18px; padding: 9px 18px;
  transition: background var(--t-fast) var(--ease);
}
.t2 .ik-board .ik-miss:hover, .t2 .ik-board .ik-gap:hover { background: var(--surface-3); }
.t2 .ik-board .ik-miss + .ik-miss, .t2 .ik-board .ik-gap + .ik-gap { border-top: 1px solid var(--line-3); }
.t2 .ik-board .ik-miss .s, .t2 .ik-board .ik-gap .s { color: var(--ink-4); text-align: left; }
/* The base rule drops the description onto its own row (`grid-column: 1 / -1`),
   which is right in a 340px card and wrong on a board 1000px wide: the line it
   was wrapping out of is now long enough to hold it. Put it back in the third
   column — and give it its own measure, because filling the width is the
   layout's job, not the sentence's. */
.t2 .ik-board .ik-miss .d, .t2 .ik-board .ik-gap .d {
  grid-column: 3; max-width: 68ch; color: var(--ink-3);
}
.t2 .ik-board .ik-sub { max-width: 84ch; }

/* The return dialog on Intake. The raised rows are the thing to look at, so
   they carry the page's own raise vocabulary -- the triangle, the warn tint,
   the value in mono -- and the missing documents the open ring and grey. */
.t2 .modal.ik-return { width: 640px; border-radius: var(--radius-xl); max-height: min(100%, 820px); }
.t2 .ik-return .modal-head { padding: 20px 22px 16px; border-bottom: 1px solid var(--line-2); }
.t2 .ik-rt-eyebrow { font: var(--type-caption); color: var(--warn); text-transform: uppercase; letter-spacing: .06em; }
.t2 .ik-return .modal-head h2 { font: var(--type-title); letter-spacing: var(--type-title-tracking); color: var(--ink); margin-top: 4px; }
.t2 .ik-return .modal-head .sub { font: var(--type-caption); color: var(--ink-3); margin-top: 6px; }
.t2 .ik-return .modal-body { display: flex; flex-direction: column; gap: 18px; padding: 18px 22px 20px; }
.t2 .ik-rt-sum { display: flex; flex-wrap: wrap; gap: 8px; }
.t2 .ik-rt-sec { display: grid; gap: 8px; }
.t2 .ik-rt-h { margin: 0; font: var(--type-caption); color: var(--ink-3); text-transform: uppercase; letter-spacing: .06em; }
.t2 .ik-issue {
  display: grid; gap: 6px; padding: 12px 14px 12px 12px;
  background: var(--warn-tint); border: 1px solid var(--warn-line); border-left: 3px solid var(--warn-dot);
  border-radius: var(--radius-md);
}
.t2 .ik-issue-top { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
.t2 .ik-issue-top .ic { color: var(--warn-dot); }
.t2 .ik-issue-title { flex: 1 1 auto; min-width: 0; font: var(--type-body); font-weight: var(--weight-strong); color: var(--ink); }
.t2 .ik-issue-val {
  flex: none; white-space: nowrap;
  font-family: var(--mono); font-size: var(--type-caption-size); color: var(--warn);
  background: var(--surface); border: 1px solid var(--warn-line); border-radius: var(--radius-pill); padding: 1px 9px;
}
.t2 .ik-issue-valline { padding-left: 18px; font-family: var(--mono); font-size: var(--type-caption-size); color: var(--warn); overflow-wrap: anywhere; }
.t2 .ik-issue-fix { padding-left: 18px; font: var(--type-body); color: var(--ink-2); }
.t2 .ik-issue-chips { display: flex; flex-wrap: wrap; gap: 6px; padding-left: 18px; }
.t2 .ik-issue-chip {
  font: var(--type-caption); color: var(--ink-2); background: var(--surface);
  border: 1px solid var(--warn-line); border-radius: var(--radius-sm); padding: 2px 8px;
}
.t2 .ik-docrow {
  display: grid; grid-template-columns: 10px minmax(0, 1fr) auto; gap: 3px 10px; align-items: baseline;
  padding: 10px 14px 10px 12px; background: var(--surface-3); border: 1px solid var(--line-2); border-radius: var(--radius-md);
}
.t2 .ik-docrow .ic { color: var(--ink-4); }
.t2 .ik-docrow .t { font: var(--type-body); font-weight: var(--weight-medium); color: var(--ink); min-width: 0; overflow-wrap: anywhere; }
.t2 .ik-docrow .tag {
  justify-self: end; white-space: nowrap; font: var(--type-caption); color: var(--ink-3);
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-pill); padding: 1px 9px;
}
.t2 .ik-docrow .d { grid-column: 2 / -1; font: var(--type-caption); color: var(--ink-3); }
.t2 .ik-rt-none { margin: 0; font: var(--type-body); color: var(--ink-3); }
.t2 .ik-rt-reason-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.t2 .ik-rt-reason label { font: var(--type-caption); font-weight: var(--weight-medium); color: var(--ink-2); }
.t2 .ik-rt-linkbtn {
  border: 0; background: none; padding: 0; cursor: pointer;
  font: var(--type-caption); color: var(--link); text-decoration: underline; text-underline-offset: 2px;
}
.t2 .ik-rt-linkbtn:hover { color: var(--focus); }
.t2 .ik-rt-reason textarea {
  display: block; width: 100%; margin-top: 6px; padding: 10px 12px; resize: vertical;
  font: var(--type-body); color: var(--ink); background: var(--surface);
  border: 1px solid var(--input-line); border-radius: var(--radius-md);
  transition: border-color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease);
}
.t2 .ik-rt-reason textarea:focus-visible { outline: none; border-color: var(--focus); box-shadow: var(--ring); }
.t2 .ik-rt-share { display: flex; flex-wrap: wrap; gap: 8px; }
.t2 .ik-rt-share .btn { display: inline-flex; align-items: center; gap: 7px; }
.t2 .ik-rt-share .btn svg { width: 14px; height: 14px; flex: none; }
.t2 .ik-rt-share .btn.done { color: var(--ok); border-color: var(--ok-line); background: var(--ok-tint); }
.t2 .ik-rt-confirm {
  display: flex; align-items: flex-start; gap: 10px; padding: 12px 14px; cursor: pointer;
  background: var(--surface-3); border: 1px solid var(--line); border-radius: var(--radius-md);
  transition: background var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease);
}
.t2 .ik-rt-confirm.on { background: var(--ok-tint); border-color: var(--ok-line); }
.t2 .ik-rt-confirm input { margin-top: 3px; flex: none; width: 15px; height: 15px; accent-color: var(--accent); }
.t2 .ik-rt-confirm .l { display: block; font: var(--type-body); font-weight: var(--weight-medium); color: var(--ink); }
.t2 .ik-rt-confirm .n { display: block; font: var(--type-caption); color: var(--ink-3); margin-top: 2px; }
.t2 .ik-rt-foot { font: var(--type-caption); color: var(--ink-4); }

/* A row answers to the BAND it is in, not to the window. The rail is a fixed
   336px that no viewport query knows about, so the window and this board part
   company by that much plus the sidebar — which is the whole reason this page
   was built on container queries. The band is the container (`sheetblock`),
   and below the width where three columns are worth having, the description
   goes back under its row. */
@container sheetblock (max-width: 780px) {
  .t2 .ik-board .ik-miss, .t2 .ik-board .ik-gap { grid-template-columns: minmax(0, 1fr) auto; }
  .t2 .ik-board .ik-miss .s, .t2 .ik-board .ik-gap .s { text-align: right; }
  .t2 .ik-board .ik-miss .d, .t2 .ik-board .ik-gap .d { grid-column: 1 / -1; }
}
.t2 .ik-row, .t2 .ik-row.ik-raise { margin: 0 -16px; padding: 12px 16px; transition: background var(--t-fast) var(--ease); }
.t2 .ik-row:not(.ik-raise):hover { background: var(--surface-3); }
.t2 .ik-state { border-radius: var(--radius-pill); }
.t2 .sheet-link { color: var(--accent); border-bottom-color: var(--accent-tint-line); transition: border-color var(--t-fast) var(--ease); }
.t2 .sheet-link:hover { border-bottom-color: var(--accent); }
.t2 .sheet-link:focus-visible, .t2 .ik-fold summary:focus-visible, .t2 .ik-file-row:focus-visible { outline: 2px solid var(--focus); }
.t2 .sheet-two input, .t2 .sheet-body select {
  border-color: var(--input-line); box-shadow: var(--shadow-1); color: var(--ink);
  transition: border-color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease);
}
.t2 .sheet-two input:hover, .t2 .sheet-body select:hover { border-color: var(--control-line); }
.t2 .sheet-two input:focus, .t2 .sheet-body select:focus-visible {
  outline: 0; border-color: var(--focus); box-shadow: var(--ring);
}
.t2 .sheet-two input[type="date"] { font-size: var(--type-body-size); }
.t2 .ik-drop { border-color: var(--input-line); background: var(--surface-3); transition: border-color var(--t-fast) var(--ease), background var(--t-fast) var(--ease); }
.t2 .ik-drop:hover { border-color: var(--control-line); background: var(--surface-2); }
.t2 .ik-drop.on { border-color: var(--focus); background: var(--accent-tint); }
/* The series list, bounded. Every file in the project is a row here, so at 43
   files the side column ran ~1,600px while the column it sits beside ended at
   ~1,000 -- the page scrolled on for a screen and a half of nothing but dates.
   The list keeps to the height of a screenful and scrolls inside its own block;
   the file this page is about is brought to the middle of it on arrival.
   The rows run edge to edge of the card, so the list's own padding is dropped
   and each row carries the card's gutter instead -- they used to overhang the
   card's right border by their negative margin. */
.t2 .ik-series .sheet-body {
  margin: 0 -16px; padding: 4px 0; max-height: min(420px, 52vh); overflow-y: auto; overscroll-behavior: contain;
  scrollbar-width: thin; scrollbar-color: var(--ink-5) transparent; position: relative;
}
.t2 .ik-series { padding-bottom: 0; }
/* Beside the main column, the two columns END TOGETHER. A fixed cap only traded
   one mismatch for another: first the side ran 600px past the main column, then
   (capped) it stopped 70px short of it. So the height is not a number at all.
   The side column is stretched to the row -- which is as tall as the main
   column -- and the series list takes whatever is left after the two blocks
   above it, scrolling inside that. `flex-basis: 0` is what makes it a taker of
   space rather than a claimant: the list's 43 rows do not get a say in how tall
   the row is. The floor keeps it usable if the main column is ever very short.
   Only in the two-column layout; stacked under the main column on a narrow
   page there is no neighbour to match, and the cap above applies. */
@container sheet (min-width: 701px) {
  .t2 .ik-console { align-items: stretch; }
  .t2 .ik-rail { display: flex; flex-direction: column; gap: 14px; }
  .t2 .ik-rail > .sheet-block { flex: none; margin: 0; }
  .t2 .ik-rail > .ik-series { flex: 1 1 0; min-height: 260px; display: flex; flex-direction: column; }
  .t2 .ik-series .sheet-body { flex: 1 1 0; min-height: 0; max-height: none; }
}
.t2 .ik-series .ik-file-row { margin: 0; width: 100%; padding: 9px 16px; border-radius: 0; transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease); }
.t2 .ik-series .ik-file-row:hover { background: var(--surface-3); }
.t2 .ik-series .ik-file-row.on { background: var(--accent-tint); box-shadow: inset 2px 0 0 var(--accent); }
.t2 .ik-series .ik-file-row.on .nm { font-weight: var(--weight-strong); color: var(--ink); }
.t2 .ik-series .ik-file-row .nm, .t2 .ik-series .ik-file-row .dt { font-size: var(--type-body-size); }
.t2 .ik-series .ik-file-row .dt { color: var(--ink-4); }
.t2 .ik-file-row { border-radius: var(--radius-sm); transition: background var(--t-fast) var(--ease); }
.t2 .ik-skel { background: linear-gradient(90deg, var(--line-3) 25%, var(--skel-hi) 37%, var(--line-3) 63%); background-size: 400% 100%; animation: t2-shimmer 1.4s ease infinite; }

/* ---- Setup, Settings, Baseline, Time impact ----
   Generated from each screen's own rules (see "legacy type, on the theme"),
   then the literal colours mapped by hand. Setup's warm tint pair was derived
   from the old brand accent; here it is the theme's own selection tint. */
.t2 .chart-note { font-size: var(--type-caption-size); }
.t2 .ov-kicker { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); letter-spacing: 0; text-transform: none; }
.t2 .ov-x { font-size: var(--type-heading-size); border-radius: var(--radius-sm); }
.t2 .settings-foot { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); }
.t2 .smodal { border-radius: var(--radius-xl); }
.t2 .smodal-head h2 { font-size: var(--type-title-size); font-weight: var(--weight-strong); }
.t2 .smodal-body .field label { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); font-weight: var(--weight-strong); letter-spacing: 0; text-transform: none; }
.t2 .smodal-foot .hint { font-size: var(--type-caption-size); }
.t2 .smodal-foot input { font-size: var(--type-body-size); border-radius: var(--radius-md); }
/* ---- the New project drop zone ----
   A surface a file is put down on, not a dashed box with a caption in
   capitals. The formats are chips in the applications' own extensions -- a
   planner reads ".mpp" faster than "Microsoft Project" -- and the two ways
   of choosing are buttons, because they are the thing most people click. */
.t2 .np-zone {
  border-radius: var(--radius-xl); border: 1px dashed var(--line); background: var(--surface-3);
  padding: 30px 20px 26px;
  transition: border-color var(--t-fast) var(--ease), background var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease);
}
.t2 .np-zone:hover { border-color: var(--control-line); background: var(--surface-2); }
.t2 .np-zone-in { gap: 6px; }
.t2 .np-ic {
  width: 40px; height: 40px; border-radius: 50%; display: grid; place-items: center; margin-bottom: 6px;
  background: var(--surface); border: 1px solid var(--line-2); color: var(--ink-3); box-shadow: var(--shadow-1);
}
.t2 .np-ic svg { width: 20px; height: 20px; }
.t2 .np-zone.on .np-ic { color: var(--accent); border-color: var(--accent); }
.t2 .np-d1 { font-size: var(--type-heading-size); font-weight: var(--weight-strong); }
.t2 .np-d2 { font-family: var(--sans); font-size: var(--type-caption-size); letter-spacing: 0; text-transform: none; color: var(--ink-4); }
.t2 .np-fmts { display: flex; gap: 6px; justify-content: center; flex-wrap: wrap; margin-top: 2px; }
.t2 .np-fmt {
  font-size: var(--type-caption-size); font-weight: var(--weight-medium); font-variant-numeric: tabular-nums;
  padding: 2px 9px; border-radius: var(--radius-pill); background: var(--surface); border: 1px solid var(--line-2);
  color: var(--ink-2); cursor: help;
}
/* The packet line under the schedule chips (Add schedule): the files that
   come along, read as what they are -- a quieter row than the schedules'. */
.t2 .np-packet { margin-top: 10px; display: flex; flex-wrap: wrap; justify-content: center; align-items: center; gap: 4px 6px; }
.t2 .np-packet-chips { display: inline-flex; gap: 6px; white-space: nowrap; }
.t2 .np-fmt.quiet { color: var(--ink-4); background: transparent; border-style: dashed; cursor: default; }
.t2 .np-d3 { margin-top: 16px; gap: 8px; }
.t2 .np-link { font-size: var(--type-caption-size); font-weight: var(--weight-medium); }
.t2 .np-link.btn.sm { height: 32px; padding: 0 14px; border-radius: var(--radius-sm); text-decoration: none; border-bottom-width: 1px; }
/* The third choice is a way out, not a third button: it stays a quiet link
   so the two that pick files read as the actions. */
.t2 .np-quiet { background: none; border: 0; padding: 0 4px; color: var(--ink-4); text-decoration: underline; text-underline-offset: 3px; text-decoration-color: var(--line); }
.t2 .np-quiet:hover { color: var(--ink-2); text-decoration-color: var(--ink-4); }
.t2 .np-count { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); }
.t2 .su-tab:focus-visible { border-radius: var(--radius-xs); }
.t2 .su-glyph { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); }
.t2 .su-tab .su-t { font-size: var(--type-body-size); font-weight: var(--weight-medium); }
.t2 .su-tab .su-sub { font-size: var(--type-caption-size); }
.t2 .su-h h1 { font-size: var(--type-display-size); font-weight: var(--weight-strong); }
.t2 .su-blurb { font-size: var(--type-heading-size); }
.t2 .setup-screen input.st-under { font-size: var(--type-title-size); font-weight: var(--weight-medium); }
.t2 .su-toast { border-radius: var(--radius-pill); }
.t2 .su-undo { font-size: var(--type-body-size); }
.t2 .st-none { font-size: var(--type-caption-size); }
.t2 .st-lcount .n { font-size: var(--type-heading-size); font-weight: var(--weight-medium); }
.t2 .st-lcount .w { font-size: var(--type-caption-size); }
.t2 .st-lhead { font-size: var(--type-caption-size); }
.t2 .st-bind:focus-visible { border-radius: var(--radius-xs); }
.t2 .st-bind .nm { font-size: var(--type-body-size); font-weight: var(--weight-medium); }
.t2 .st-bind .pa { font-size: var(--type-caption-size); }
.t2 .st-bind .th { font-size: var(--type-caption-size); font-weight: var(--weight-medium); }
.t2 .st-bind .th.none { font-weight: var(--weight-regular); }
.t2 .st-bind .q { font-size: var(--type-caption-size); }
.t2 .st-bind .q .hd { font-weight: var(--weight-strong); }
.t2 .st-bind .cf, .t2 .st-bind .nap { font-size: var(--type-caption-size); }
.t2 .st-bind .src { font-size: var(--type-caption-size); }
.t2 .st-unver { font-size: var(--type-caption-size); }
.t2 .st-loose .gh { font-size: var(--type-caption-size); font-weight: var(--weight-strong); }
.t2 .st-loose .nm { font-size: var(--type-caption-size); }
.t2 .st-loose .v { font-size: var(--type-caption-size); }
.t2 .st-loose .why { font-size: var(--type-caption-size); }
.t2 .st-unbound .t { font-size: var(--type-caption-size); }
.t2 .st-unbound .t .n { font-size: var(--type-body-size); font-weight: var(--weight-medium); }
.t2 .st-unlist .gh { font-size: var(--type-caption-size); font-weight: var(--weight-strong); }
.t2 .st-unlist .u { font-size: var(--type-caption-size); }
.t2 .st-unlist .u .d { font-size: var(--type-caption-size); }
.t2 .st-sumline .t { font-size: var(--type-body-size); }
.t2 .st-sumline .h { font-size: var(--type-caption-size); }
.t2 .st-unsure-row .nm { font-size: var(--type-body-size); font-weight: var(--weight-medium); }
.t2 .st-unsure-row .why { font-size: var(--type-caption-size); }
.t2 .st-bindsel { font-size: var(--type-caption-size); border-radius: var(--radius-xs); }
.t2 .st-bind .q .by { font-size: var(--type-caption-size); }
/* A caption takes a measure, not the block. The legacy cap is 76ch, and `ch` is
   the width of THIS face's zero: Inter's tabular zero at the caption size is
   wider than Plex's was, so the same 76 ran to 91% of the block. 66 restores
   the measure (~520px of a 660px block). */
.t2 .sheet-body .field .hint { max-width: 66ch; }
.t2 .su-tab.on { border-bottom-color: var(--accent); }
.t2 .su-tab.on .su-glyph { background: var(--accent); color: var(--on-accent); }
.t2 .st-pick:focus-within, .t2 .np-zone.on { border-color: var(--focus); box-shadow: var(--ring); }
.t2 .np-zone.on { background: var(--accent-tint); }
.t2 .ov-scrim, .t2 .smodal-scrim { background: var(--scrim); }
.t2 .ov-panel, .t2 .smodal { box-shadow: var(--shadow-4); }
.t2 .su-toast { box-shadow: var(--shadow-3); }
/* Placement is the screen's own: tabs at their authored width, from the left.
   The only change is that they shrink to stay on one row rather than dropping
   the sixth step onto a line by itself. */
.t2 .su-ribbon { padding: 10px 28px 0; gap: 4px; flex-wrap: nowrap; }
.t2 .su-tab { border-radius: var(--radius-sm) var(--radius-sm) 0 0; transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease); }
.t2 .su-tab:hover:not(.on) { background: var(--surface-3); }
.t2 .su-tab .su-t { letter-spacing: var(--type-body-tracking); }
.t2 .su-tab .su-sub { color: var(--ink-4); }
.t2 .su-glyph { font-family: var(--sans); font-variant-numeric: tabular-nums; font-weight: var(--weight-strong); transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease); }
/* Current AND confirmed: the check is drawn in the ok green, which vanishes on
   the filled dot. On the fill it takes the fill's own ink. */
.t2 .su-tab.on .su-glyph, .t2 .su-tab.on.done .su-glyph { background: var(--accent); color: var(--on-accent); }
.t2 .su-tab.on.done .su-glyph .ic { color: var(--on-accent); }
.t2 .su-foot {
  padding: 12px 28px; background: var(--surface); backdrop-filter: none; -webkit-backdrop-filter: none;
  border-top: 1px solid var(--line-2);
}

.t2 .su-body { padding: 36px 28px 56px; }
.t2 .su-lead { margin-bottom: 28px; padding-bottom: 24px; border-bottom: 1px solid var(--line-2); }
.t2 .su-h { align-items: center; gap: 10px; }
.t2 .su-h h1 { display: block; font-size: var(--type-title-size); letter-spacing: var(--type-title-tracking); line-height: var(--type-title-leading); }
.t2 .su-blurb { font-size: var(--type-body-size); line-height: var(--leading-relaxed); color: var(--ink-3); margin-top: 6px; }
.t2 .setup-screen .st-block > .su-blurb, .t2 .setup-screen .st-group > .su-blurb { margin: -4px 0 16px; }
.t2 .setup-screen input.st-under,
.t2 .setup-screen .field > input:not([type="checkbox"]):not([type="file"]),
.t2 .setup-screen .field > select, .t2 .setup-screen .field > textarea,
.t2 .setup-screen .st-type select, .t2 .setup-screen .su-modgrid input {
  height: 36px; padding: 0 12px; font-family: var(--sans); font-size: var(--type-body-size); font-weight: var(--weight-regular);
  letter-spacing: var(--type-body-tracking); color: var(--ink);
  background: var(--surface); border: 1px solid var(--input-line); border-radius: var(--radius-sm); box-shadow: var(--shadow-1);
  transition: border-color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease);
}
.t2 .setup-screen input.st-under { height: 40px; font-size: var(--type-heading-size); font-weight: var(--weight-medium); }
.t2 .setup-screen input.st-under:hover, .t2 .setup-screen .field > input:hover,
.t2 .setup-screen .field > select:hover, .t2 .setup-screen .field > textarea:hover { border-color: var(--control-line); }
.t2 .setup-screen input.st-under:focus, .t2 .setup-screen input.st-under:focus-visible,
.t2 .setup-screen .field > input:focus-visible, .t2 .setup-screen .field > select:focus-visible,
.t2 .setup-screen .field > textarea:focus-visible, .t2 .setup-screen .st-type select:focus-visible {
  outline: 0; border-color: var(--focus); box-shadow: var(--ring);
}
.t2 .st-ev .st-fact, .t2 .st-ev .st-none { background: none; padding: 0; box-shadow: none; }

/* lists, open on the page: hairlines between rows, none around them */
.t2 .st-lstand { margin-bottom: 14px; align-items: center; }
.t2 .st-lcount .n { font-size: var(--type-heading-size); font-weight: var(--weight-strong); color: var(--ink); }
.t2 .su-check input[type="checkbox"], .t2 .sheet-body input[type="checkbox"] { accent-color: var(--accent); }

/* ---- Setup: how the data is presented ----
   APPEARANCE ONLY, like everything above: nothing here moves a component. With
   the boxes gone the page still has to look composed, and that comes from
   giving each kind of thing ONE clear treatment:

   * a confirmed step is a CHECK, not a dot -- the markup draws a 7px disc, which
     read as a bullet rather than as "done";
   * a fact is a label over a value on its own hairline, so three columns of
     them read as rows of a record instead of as loose text;
   * a value that needs attention is a tinted tag, the same one the rest of the
     product uses -- not a line of brown text the same size as its neighbours;
   * where a value came FROM is a quiet pill beside the field, with a file mark;
   * a value quoted out of a file is set as a quoted value: a code chip. */

/* the step ribbon: numbers for what is ahead, a check for what is done */
.t2 .su-tab.done .su-glyph .ic svg { display: none; }
.t2 .su-tab.done .su-glyph .ic {
  display: block; width: 12px; height: 12px; background: currentColor;
  -webkit-mask: var(--ic-check) center / 12px 12px no-repeat; mask: var(--ic-check) center / 12px 12px no-repeat;
}
.t2 .su-glyph { --ic-check: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><path d='M2.6 6.3l2.3 2.3 4.5-5'/></svg>"); }
.t2 .su-tab .su-glyph { width: 22px; height: 22px; background: var(--surface); color: var(--ink-4); box-shadow: inset 0 0 0 1px var(--line); }
.t2 .su-tab.done .su-glyph { background: var(--ok-dot); color: var(--on-accent); box-shadow: none; }
.t2 .su-tab.done .su-glyph .ic { color: var(--on-accent); }
.t2 .su-tab.on .su-glyph, .t2 .su-tab.on.done .su-glyph { background: var(--accent); color: var(--on-accent); box-shadow: 0 0 0 3px var(--accent-tint); }
.t2 .su-tab .su-t { color: var(--ink-2); }
.t2 .su-tab.on .su-t { color: var(--ink); font-weight: var(--weight-strong); }
.t2 .su-tab .su-sub.ok { color: var(--ok); }

/* the step's question */
.t2 .su-h h1 { font-size: var(--type-display-size); letter-spacing: var(--type-display-tracking); line-height: var(--type-title-leading); }
.t2 .su-blurb { max-width: 62ch; }
.t2 .setup-screen input.st-under,
.t2 .setup-screen .field > input:not([type="checkbox"]):not([type="file"]),
.t2 .setup-screen .field > select { height: 40px; font-size: var(--type-heading-size); font-weight: var(--weight-regular); }
.t2 .setup-screen input.st-under { font-weight: var(--weight-medium); }
.t2 .st-ev .st-fact, .t2 .st-ev .st-none { padding: 13px 0 15px; border-top: 1px solid var(--line-2); }
.t2 .st-lcount .w, .t2 .st-lstand { color: var(--ink-4); }

/* Setup, narrow. The legacy stylesheet gives this screen a narrow layout keyed on
   the COLUMN's width (the rail does not collapse, so the window's width is not
   the page's). The themed rules above out-rank that query on specificity, so it
   is restated here for them -- after every themed base rule it has to beat,
   which is the ordering `test_intake_layout` exists to hold. */
@container sheet (max-width: 640px) {
  .t2 .su-top-r1, .t2 .su-ribbon { padding-left: 16px; padding-right: 16px; }
  .t2 .su-body { padding: 24px 16px 40px; }
  .t2 .su-foot { padding: 12px 16px; }
  .t2 .su-ribbon { flex-wrap: nowrap; }
  .t2 .su-tab { flex: 0 0 auto; }
}

/* ---- Settings: the list of places a comparison reads from, as one card ---- */
.t2 .cbrow { font-size: var(--type-caption-size); }
.t2 .basis { font-size: var(--type-caption-size); }
.t2 .chart-note { font-size: var(--type-caption-size); }
.t2 .doc-kicker { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); letter-spacing: 0; text-transform: none; }
.t2 .qfilters button { font-size: var(--type-caption-size); font-weight: var(--weight-strong); border-radius: var(--radius-pill); }
.t2 .srow .stitle .t { font-size: var(--type-heading-size); font-weight: var(--weight-strong); }
.t2 .srow .stitle .k { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); letter-spacing: 0; text-transform: none; }
.t2 .srow .svalue .v { font-size: var(--type-body-size); }
.t2 .srow .svalue .w { font-size: var(--type-caption-size); }
.t2 .settings-foot { font-family: var(--sans); font-variant-numeric: tabular-nums; font-size: var(--type-caption-size); }
.t2 .confirm-box { border-radius: var(--radius-xl); }
.t2 .confirm-box h3 { font-size: var(--type-heading-size); font-weight: var(--weight-strong); }
.t2 .confirm-box p { font-size: var(--type-body-size); }
.t2 .settings-doc { max-width: 820px; }
.t2 .settings-doc h1 { display: block; font-size: var(--type-title-size); letter-spacing: var(--type-title-tracking); line-height: var(--type-title-leading); }
.t2 .settings-doc .lede, .t2 .settings-doc > p { font-size: var(--type-body-size); color: var(--ink-3); line-height: var(--leading-relaxed); }
.t2 .doc-kicker { color: var(--ink-4); }
.t2 .settings-list {
  margin-top: 22px; border: 1px solid var(--line); border-top: 1px solid var(--line); border-radius: var(--radius-lg);
  background: var(--surface); box-shadow: var(--shadow-2); overflow: clip;
}
.t2 .srow { padding: 15px 18px; border-color: var(--line-2); transition: background var(--t-fast) var(--ease); }
.t2 .srow:first-child { border-top: 0; }
.t2 .srow:hover { background: var(--surface-3); }
.t2 .srow .stitle .t { letter-spacing: var(--type-heading-tracking); }
.t2 .srow .stitle .k { color: var(--ink-4); margin-top: 2px; }
.t2 .srow .svalue .v { color: var(--ink-2); line-height: var(--leading-relaxed); }
.t2 .srow .chev { color: var(--ink-5); transition: transform var(--t-med) var(--ease), color var(--t-fast) var(--ease); }
.t2 .srow:hover .chev { transform: translateX(3px); color: var(--ink-2); }
.t2 .srow .sdot.set { box-shadow: 0 0 0 3px var(--ok-tint); }
.t2 .srow .sdot.attn { box-shadow: 0 0 0 3px var(--warn-tint); }
.t2 .srow .sdot.danger { box-shadow: 0 0 0 3px var(--danger-tint); }
.t2 .qfilters button.on { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }
/* The scope-carrier for overlays that mount on <body>: no box of its own. */
.ov-host { display: contents; }
.t2 .ov-kicker { font-family: var(--sans); font-size: var(--type-caption-size); font-weight: var(--weight-medium); letter-spacing: 0; text-transform: none; color: var(--ink-4); }
.t2 .smodal { border-radius: var(--radius-xl); }
.t2 .smodal-head { border-bottom-color: var(--line-2); }
.t2 .smodal-head h2 { font-size: var(--type-heading-size); letter-spacing: var(--type-heading-tracking); }
.t2 .smodal-foot { background: var(--surface-3); border-top-color: var(--line-2); border-radius: 0 0 var(--radius-xl) var(--radius-xl); }
.t2 .smodal .field label, .t2 .ov-panel .field label {
  font-family: var(--sans); font-size: var(--type-caption-size); font-weight: var(--weight-medium);
  letter-spacing: 0; text-transform: none; color: var(--ink-3);
}
.t2 .smodal select, .t2 .smodal input, .t2 .smodal textarea { font-family: var(--sans); }
.t2 .ov-x { border-radius: var(--radius-sm); transition: background var(--t-fast) var(--ease); }
.t2 .ov-x:hover { background: var(--line-3); }
@media (prefers-reduced-motion: no-preference) {
  .t2 .smodal-scrim, .t2 .confirm-scrim { animation: t2-fade 160ms ease-out; }
  /* Opacity only: these dialogs are centred WITH a transform, and an entrance
     that animates `transform` would un-centre them for its duration. */
  @keyframes t2-soft { from { opacity: .6; } to { opacity: 1; } }
  .t2 .smodal, .t2 .confirm-box { animation: t2-soft 200ms ease-out; }
}
.t2 .confirm-scrim { background: var(--scrim); }
.t2 .confirm-box { box-shadow: var(--shadow-4); }

/* ---- sign-in: the form column ---- */
.t2 .unlock-brand .sb-mark { font-size: var(--type-caption-size); border-radius: var(--radius-sm); }
.t2 .unlock-card h1 { font-size: var(--type-display-size); font-weight: var(--weight-strong); }
.t2 .unlock-card .sub { font-size: var(--type-body-size); }
.t2 .unlock-card .field label { font-size: var(--type-caption-size); font-weight: var(--weight-medium); }
.t2 .unlock-card input { font-size: var(--type-body-size); border-radius: var(--radius-md); }
.t2 .unlock-card .field .hint { font-size: var(--type-caption-size); }
.t2 .auth-seg button { font-size: var(--type-body-size); font-weight: var(--weight-medium); }
.t2 .auth-seg button.on { font-weight: var(--weight-strong); }
.t2 .auth-seg button:focus-visible { border-radius: var(--radius-xs); }
.t2 .unlock-card .btn.primary { font-size: var(--type-body-size); border-radius: var(--radius-md); }
.t2 .unlock-card .err, .t2 .unlock-card .msg-ok { font-size: var(--type-body-size); font-weight: var(--weight-medium); }
.t2 .auth-or { font-size: var(--type-caption-size); }
.t2 .unlock-card .google-btn { font-weight: var(--weight-medium); border-radius: var(--radius-md); }
.t2 .auth-alt { font-size: var(--type-body-size); }
.t2 .auth-alt a { font-weight: var(--weight-medium); }
.t2 .auth-free { font-size: var(--type-caption-size); }
.t2 .auth-free a { font-weight: var(--weight-medium); }
.t2.unlock-col { background: var(--paper); }
.t2 .unlock-card h1 { letter-spacing: var(--type-display-tracking); line-height: var(--type-display-leading); color: var(--ink); }
.t2 .unlock-card .sub { color: var(--ink-4); }
.t2 .unlock-brand .sb-mark { background: var(--ink); color: var(--on-accent); font-family: var(--sans); }
.t2 .unlock-card input {
  border-color: var(--input-line); color: var(--ink); box-shadow: var(--shadow-1); border-radius: var(--radius-sm);
  transition: border-color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease);
}
.t2 .unlock-card input:hover { border-color: var(--control-line); }
.t2 .unlock-card input:focus, .t2 .unlock-card input:focus-visible { outline: 0; border-color: var(--focus); box-shadow: var(--ring); }
.t2 .unlock-card .btn.primary { height: 40px; border-radius: var(--radius-sm); }
.t2 .unlock-card .google-btn { border-radius: var(--radius-sm); }
.t2 .auth-seg button { color: var(--ink-4); transition: color var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease); }
.t2 .auth-seg button.on { color: var(--ink); border-bottom-color: var(--accent); }
.t2 .auth-alt a, .t2 .auth-free a { color: var(--accent); }

/* ---- figures in a table (`.doc-table`) ----
   It was a bare <table>: no class the stylesheet knew, so twelve columns of
   money ran together left-aligned at the browser's defaults. Figures are set
   the way a ledger sets them -- right-aligned on tabular numerals so the
   decimal points stack -- under a head that stays put, beside a first column
   that stays put, because the table is wider than most windows. */
.t2 .pva-wrap { overflow: auto; max-height: 560px; margin: 0 -16px; border-top: 1px solid var(--line-2); border-bottom: 1px solid var(--line-2); }
.t2 .doc-table { width: 100%; border-collapse: separate; border-spacing: 0; font-size: var(--type-body-size); }
.t2 .doc-table th, .t2 .doc-table td { padding: 8px 14px; text-align: left; white-space: nowrap; border-bottom: 1px solid var(--line-2); }
.t2 .doc-table td { color: var(--ink-2); font-family: var(--sans); font-variant-numeric: tabular-nums; line-height: var(--leading-snug); transition: background var(--t-fast) var(--ease); }
.t2 .doc-table th.num, .t2 .doc-table td.num { text-align: right; }
/* E6-04b. What the latest update said about a register subject is a sentence,
   not a value: it wraps, and it is capped so it cannot push the row wider than
   the card. The colour marks the three reasons that are NOT a fix. */
.t2 .doc-table td.reg-now { white-space: normal; max-width: 34ch; }
.t2 .reg-unmeasured { color: var(--warn); }
.t2 .doc-table thead th {
  position: sticky; top: 0; z-index: 2; background: var(--head-bg); color: var(--ink-3);
  font-size: var(--type-caption-size); font-weight: var(--weight-medium); border-bottom: 1px solid var(--line);
}
.t2 .doc-table tbody tr:hover td { background: var(--surface-3); }
.t2 .doc-table tbody tr:last-child td { border-bottom: 0; }
/* the two-level head: group labels over the columns they cover */
.t2 .doc-table.pva thead tr.grp th { top: 0; height: 30px; padding-top: 0; padding-bottom: 0; border-bottom: 0; text-align: center; color: var(--ink-2); font-weight: var(--weight-strong); }
.t2 .doc-table.pva thead tr.grp th.g { box-shadow: inset 0 -1px 0 var(--line), inset 1px 0 0 var(--line); }
.t2 .doc-table.pva thead tr:not(.grp) th { top: 30px; }
/* a rule where each group of five begins, so the eye knows which "Actual" it is on */
.t2 .doc-table.pva .g0 { box-shadow: inset 1px 0 0 var(--line); }
.t2 .doc-table.pva thead tr:not(.grp) th.g0 { box-shadow: inset 1px 0 0 var(--line); }
/* the update's name holds the left edge while the figures scroll under the head */
.t2 .doc-table.pva th:first-child, .t2 .doc-table.pva td:first-child { position: sticky; left: 0; z-index: 1; padding-left: 16px; }
.t2 .doc-table.pva td:first-child { background: var(--surface); font-weight: var(--weight-strong); color: var(--ink); }
.t2 .doc-table.pva tbody tr:hover td:first-child { background: var(--surface-3); }
.t2 .doc-table.pva thead th:first-child { z-index: 3; }
.t2 .doc-table.pva td:nth-child(2) { color: var(--ink-3); }
.t2 .pva-wrap + div { margin-top: 14px; color: var(--ink-2); line-height: var(--leading-relaxed); }

/* ---- Trends: notices, the KPI strip, a card's closing note ---- */
/* A notice that carries an action sets it beside its sentence, not under it. */
.t2 .align-notice { padding: 14px 16px; }
.t2 .align-notice:has(> .btn) { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
.t2 .align-notice .t { color: var(--ink); }
.t2 .align-notice .m { margin-top: 4px; max-width: 96ch; }
.t2 .align-notice + .align-notice, .t2 .align-notice + .card, .t2 .card + .align-notice { margin-top: 16px; }
/* dates that carry two files: the date, the files, what is published -- as rows */
.t2 .shared-list { margin-top: 12px; border-top: 1px solid var(--line-2); }
.t2 .shared-row {
  display: grid; grid-template-columns: 96px minmax(0, 1fr) auto; align-items: center; gap: 16px;
  padding: 9px 0; border-bottom: 1px solid var(--line-2);
}
.t2 .shared-row:last-child { border-bottom: 0; padding-bottom: 0; }
.t2 .shared-row .d { font-weight: var(--weight-strong); color: var(--ink); font-variant-numeric: tabular-nums; white-space: nowrap; }
.t2 .shared-row .files { display: flex; flex-wrap: wrap; gap: 6px; min-width: 0; }
.t2 .shared-row .st { font-size: var(--type-caption-size); color: var(--ink-4); white-space: nowrap; }
.t2 .shared-row .st.ok { color: var(--ok); font-weight: var(--weight-medium); }
.t2 .d-tag.ok { background: var(--ok-tint); border-color: var(--ok-line); color: var(--ok); }
/* headline figures in the strip */
.t2 .kpi-v { margin-top: 3px; font-size: var(--type-title-size); font-weight: var(--weight-strong); letter-spacing: var(--type-title-tracking); color: var(--ink); white-space: nowrap; }
.t2 .kpi-v.f-bad { color: var(--danger); } .t2 .kpi-v.f-ok { color: var(--ok); }
.t2 .kpi-big {
  padding: 16px 16px 14px; font-size: var(--type-display-size); font-weight: var(--weight-strong);
  letter-spacing: var(--type-display-tracking); line-height: var(--type-display-leading); font-variant-numeric: tabular-nums;
}
.t2 .kpi-big.f-bad { color: var(--danger); } .t2 .kpi-big.f-ok { color: var(--ok); }
/* A note appended straight into a card, after its table, had no padding of its
   own: it ran from the card's left border to its right and sat on the bottom
   edge. It is the card's footer, and is set as one. */
.t2 .card > .hint {
  margin: 0; padding: 12px 16px 14px; border-top: 1px solid var(--line-2); background: var(--surface-3);
  border-radius: 0 0 var(--radius-lg) var(--radius-lg); max-width: none;
}
.t2 .card > .hint:not(:last-child) { border-radius: 0; }
/* a table that is a card's whole body lines its edge columns up with the head */
.t2 .card > table.grid th:first-child, .t2 .card > table.grid td:first-child,
.t2 .card > .tablewrap > table.grid th:first-child, .t2 .card > .tablewrap > table.grid td:first-child { padding-left: 16px; }
.t2 .card > table.grid th:last-child, .t2 .card > table.grid td:last-child,
.t2 .card > .tablewrap > table.grid th:last-child, .t2 .card > .tablewrap > table.grid td:last-child { padding-right: 16px; }
.t2 .card > table.grid td:last-child .btn { float: right; }
.t2 .card > table.grid tbody td { vertical-align: middle; }

/* ---- where a chart sits in its card ----
   The server draws every chart at 880 units wide and caps the <svg> at 880px
   inline, so on a wide window it hugged the left of its card with the right
   half of the card empty. The drawing is not touched -- the same SVG goes into
   the report and the evidence pack -- it is only sized and placed here.

   Centred, and allowed to grow with the card, but not without limit: an SVG
   scales its type with its width, and at the full width of a 1600px card the
   11-unit axis labels would set at 20px. 1180px is where they reach ~15px.
   `!important` because the cap being lifted is an inline style. */
.t2 .card-body > svg[role="img"] {
  width: 100%; max-width: 1180px !important; height: auto; margin-left: auto; margin-right: auto;
}
.t2 .card-body > svg[role="img"] + .hint, .t2 .card-body > svg[role="img"] ~ .hint { max-width: 1180px; margin-left: auto; margin-right: auto; }

/* ---- the chart read-out ---- */
.chart-guide { stroke: var(--ink-4); stroke-width: 1; stroke-dasharray: 3 3; }
.chart-ring { fill: var(--surface); stroke-width: 2.5; }
.chart-tip {
  position: fixed; z-index: 150; pointer-events: none; min-width: 210px; max-width: 340px; padding: 10px 12px;
  background: var(--surface); border-radius: var(--radius-md); box-shadow: var(--shadow-3);
  font-size: var(--type-caption-size); color: var(--ink-2);
}
.chart-tip .blk + .blk { margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--line-2); }
.chart-tip .hd { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; margin-bottom: 7px; }
.chart-tip .hd .t { font-size: var(--type-body-size); font-weight: var(--weight-strong); color: var(--ink); }
.chart-tip .hd .s { color: var(--ink-4); font-variant-numeric: tabular-nums; white-space: nowrap; }
.chart-tip .row { display: grid; grid-template-columns: 8px minmax(0, 1fr) auto; align-items: center; gap: 8px; padding: 2px 0; }
.chart-tip .row .sw { width: 8px; height: 8px; border-radius: 50%; }
.chart-tip .row .n { color: var(--ink-3); }
.chart-tip .row .v { font-weight: var(--weight-strong); color: var(--ink); font-variant-numeric: tabular-nums; white-space: nowrap; }
.chart-tip .row .v.bad { color: var(--danger); }
.chart-tip .row .v.ok { color: var(--ok); }

/* ---- overlays: menus, dialogs ---- */
.t2 .rowmenu, .rowmenu.t2 { border-radius: var(--radius-lg); border: 0; padding: 5px; box-shadow: var(--shadow-3); width: 236px; }
.t2 .rowmenu button, .rowmenu.t2 button { font-size: var(--type-body-size); font-weight: var(--weight-medium); border-radius: var(--radius-sm); padding: 7px 9px; color: var(--ink); transition: background 80ms linear; }
.t2 .rowmenu button:hover, .rowmenu.t2 button:hover { background: var(--line-3); }
.t2 .rowmenu button .n, .rowmenu.t2 button .n { font-size: var(--type-caption-size); font-weight: var(--weight-regular); color: var(--ink-4); }
.t2 .rowmenu .head, .rowmenu.t2 .head { font-family: var(--sans); font-size: var(--type-caption-size); font-weight: var(--weight-medium); letter-spacing: 0; text-transform: none; color: var(--ink-4); padding: 6px 9px 3px; }
.rowmenu.t2 button.danger { color: var(--danger); }
.rowmenu.t2 button.danger:hover { background: var(--danger-tint); }

/* ---- the chooser (core/chooser.js) ----
   Where Compare and Trends can land: the whole document first, then its
   sections by name. Anchored to the button that opened it -- it rises from
   the selection bar at the bottom of the pane and drops from the Trends
   button in the head -- and it is a table of contents, so a section reads as
   its number, its title and the one line it says about itself. */
.chooser.t2 {
  position: fixed; z-index: 60; width: 292px; padding: 5px;
  background: var(--surface); border-radius: var(--radius-lg); box-shadow: var(--shadow-3);
  overflow-y: auto; overscroll-behavior: contain; box-sizing: border-box;
}
.chooser.t2 .head { font-size: var(--type-caption-size); font-weight: var(--weight-medium); color: var(--ink-4); padding: 7px 9px 3px; }
.chooser.t2 .rule { height: 1px; background: var(--line-2); margin: 3px 4px; }
.chooser.t2 .item {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; column-gap: 8px;
  width: 100%; text-align: left; border: 0; background: none; border-radius: var(--radius-sm);
  padding: 5px 9px; font: inherit; color: var(--ink); cursor: pointer;
  transition: background 80ms linear;
}
.chooser.t2 .item.numbered { grid-template-columns: auto minmax(0, 1fr) auto; }
.chooser.t2 .item:hover, .chooser.t2 .item:focus-visible { background: var(--line-3); outline: 0; }
.chooser.t2 .item:focus-visible { box-shadow: inset 0 0 0 2px var(--focus); }
.chooser.t2 .item .no {
  font-family: var(--mono); font-size: var(--type-caption-size); color: var(--ink-4);
  font-variant-numeric: tabular-nums; min-width: 18px;
}
.chooser.t2 .item .t { font-size: var(--type-body-size); font-weight: var(--weight-medium); line-height: var(--leading-snug); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.chooser.t2 .item .note { font-size: var(--type-caption-size); font-weight: var(--weight-regular); color: var(--ink-5); white-space: nowrap; }
/* The whole document: the first line, and the one the reader most often wants. */
.chooser.t2 .item.primary { background: var(--accent-tint); margin-bottom: 2px; }
.chooser.t2 .item.primary:hover, .chooser.t2 .item.primary:focus-visible { background: var(--accent-tint-line); }
.chooser.t2 .item.primary .t { color: var(--accent-ink); font-weight: var(--weight-strong); }
/* A card the page cannot draw for this project yet: kept in the list, so
   the reader learns what exists, and greyed with the reason beside it. */
.chooser.t2 .item:disabled { cursor: default; color: var(--ink-5); background: none; }
.chooser.t2 .item:disabled .t, .chooser.t2 .item:disabled .no { color: var(--ink-5); }
/* The chevron on a button that opens one. */
.t2 .btn .chev { width: 12px; height: 12px; margin-left: -2px; opacity: .8; transition: transform var(--t-fast) var(--ease); }
.t2 .btn[aria-expanded="true"] .chev { transform: rotate(180deg); }
.t2 .selectbar .btn .chev { margin-left: 0; color: currentColor; opacity: .7; }
/* The head's Compare button while one schedule is ticked: how far along. */
.t2 .btn .cnt { font-size: var(--type-caption-size); font-weight: var(--weight-medium); color: var(--ink-4); background: var(--line-3); border-radius: var(--radius-pill); padding: 1px 7px; margin-left: 2px; font-variant-numeric: tabular-nums; }
.t2 .btn.off { cursor: default; }
.t2 .btn.off .chev { opacity: .5; }
/* The head of a single-section view of Trends: which card this is, and the
   two ways on -- the whole page, or another card. */
.t2 .tr-focus { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 14px; }
.t2 .tr-focus .k { font-size: var(--type-caption-size); font-weight: var(--weight-medium); color: var(--ink-4); }
.t2 .tr-focus .t { margin: 0; font-size: var(--type-heading-size); font-weight: var(--weight-strong); color: var(--ink); letter-spacing: var(--type-heading-tracking); }
.t2 .tr-focus .acts { margin-left: auto; display: flex; gap: 8px; }

.t2 .scrim { background: var(--scrim); backdrop-filter: blur(3px); -webkit-backdrop-filter: blur(3px); }
.t2 .modal { border-radius: var(--radius-xl); box-shadow: var(--shadow-4); }
.t2 .modal-head { padding: 20px 22px 12px; }
.t2 .modal-head h2 { font-size: var(--type-heading-size); font-weight: var(--weight-strong); letter-spacing: var(--type-heading-tracking); display: block; }
.t2 .modal-head .sub { font-size: var(--type-body-size); margin-top: 3px; color: var(--ink-4); }
.t2 .modal-body { padding: 0 22px 18px; font-size: var(--type-body-size); }
.t2 .modal-foot { padding: 12px 22px; background: var(--surface-3); border-top-color: var(--line-2); justify-content: flex-end; border-radius: 0 0 var(--radius-xl) var(--radius-xl); }
.t2 .modal-x { border-radius: var(--radius-sm); width: 28px; height: 28px; font-size: var(--type-title-size); transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease); }
.t2 .modal-x:hover { background: var(--line-3); }
/* Inside a dialog: a definition list that reads as a record, and form controls
   that look like the rest of the product's. The receipt fields were bare
   <input>s — browser default chrome in the middle of a designed surface. */
.t2 .modal .provenance { grid-template-columns: 160px 1fr; gap: 8px 16px; font-size: var(--type-body-size); }
.t2 .modal .provenance dt { color: var(--ink-4); }
.t2 .modal .provenance dd { color: var(--ink); }
.t2 .modal .provenance dd.mono { font-family: var(--sans); font-size: var(--type-body-size); font-weight: var(--weight-medium); font-variant-numeric: tabular-nums; }
.t2 .modal .prov-rule { margin: 6px 0; }
.t2 .modal-body > .hint, .t2 .modal .msect .hint { margin-top: 12px; font-size: var(--type-caption-size); line-height: var(--leading-relaxed); color: var(--ink-4); }
.t2 .modal .msect { margin: 20px 0 0; padding-top: 16px; border-top: 1px solid var(--line-2); }
.t2 .modal .kicker { font-family: var(--sans); font-size: var(--type-body-size); font-weight: var(--weight-strong); letter-spacing: 0; text-transform: none; color: var(--ink); margin-bottom: 10px; }
.t2 .modal .msect label { display: block; font-size: var(--type-caption-size); font-weight: var(--weight-medium); color: var(--ink-3); margin-bottom: 5px; }
.t2 .modal .msect input, .t2 .modal-body select {
  width: 100%; height: 32px; padding: 0 10px; font: inherit; font-size: var(--type-body-size); color: var(--ink);
  background: var(--surface); border: 1px solid var(--input-line); border-radius: var(--radius-sm); box-shadow: var(--shadow-1);
  transition: border-color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease);
}
.t2 .modal .msect input:hover, .t2 .modal-body select:hover { border-color: var(--control-line); }
.t2 .modal .msect input:focus, .t2 .modal-body select:focus { outline: 0; border-color: var(--focus); box-shadow: var(--ring); }
.t2 .modal .msect .btn.sm { height: 32px; padding: 0 14px; font-size: var(--type-body-size); border-radius: var(--radius-sm); }
.t2 .modal .muted { font-size: var(--type-body-size); line-height: var(--leading-relaxed); padding: 0; }
.t2 .modal .del-scope { font-size: var(--type-body-size); line-height: var(--leading-relaxed); color: var(--ink-2); }
/* ---- the schedule record (`.sdx`) ----
   What a file IS, laid out as a record rather than as one list of twenty rows.
   The old dialog gave `Calendars: 7` and `Content hash` the same weight in the
   same column, so nothing in it could be found without reading all of it. Here
   the four figures that describe the file lead, and the rest is grouped by
   whose fact it is: the file's, P6's, or this project's. */
.t2 .modal.sdx .modal-head { align-items: center; gap: 12px; padding: 18px 20px 16px; border-bottom: 1px solid var(--line-2); background: var(--sheet-head-bg); border-radius: var(--radius-xl) var(--radius-xl) 0 0; }
.t2 .sdx-ic {
  width: 36px; height: 36px; flex: none; border-radius: var(--radius-md); display: grid; place-items: center;
  background: var(--accent-tint); color: var(--accent); box-shadow: inset 0 0 0 1px var(--accent-tint-line);
}
.t2 .sdx-ic svg { width: 17px; height: 17px; }
.t2 .sdx-ht { min-width: 0; flex: 1; }
.t2 .sdx-ht h2 { font-size: var(--type-heading-size); font-weight: var(--weight-strong); letter-spacing: var(--type-heading-tracking); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.t2 .sdx-meta { display: flex; align-items: center; gap: 8px; margin-top: 5px; min-width: 0; }
.t2 .sdx-meta .lozenge { line-height: 16px; font-size: var(--type-caption-size); }
.t2 .sdx-sub { font-size: var(--type-body-size); color: var(--ink-4); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.t2 .modal.sdx .modal-x { display: grid; place-items: center; align-self: flex-start; color: var(--ink-4); }
.t2 .modal.sdx .modal-x svg { width: 14px; height: 14px; }
.t2 .modal.sdx { max-height: min(100%, 880px); }
.t2 .modal.sdx .modal-body { padding: 18px 20px 22px; scrollbar-width: thin; scrollbar-color: var(--ink-5) transparent; }
.t2 .sdx-note + .sdx-group { margin-top: 22px; }

.t2 .sdx-stats {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
  border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow-1);
  background: var(--tile-bg);
}
.t2 .sdx-stat { padding: 12px 14px 13px; min-width: 0; }
.t2 .sdx-stat + .sdx-stat { border-left: 1px solid var(--line-2); }
.t2 .sdx-stat .k { font-size: var(--type-caption-size); color: var(--ink-4); }
.t2 .sdx-stat .v {
  margin-top: 4px; font-size: var(--type-display-size); font-weight: var(--weight-strong); letter-spacing: var(--type-display-tracking); color: var(--ink);
  font-variant-numeric: tabular-nums; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.t2 .sdx-stat .v.none { color: var(--ink-5); font-weight: var(--weight-medium); }

.t2 .sdx-group { margin-top: 22px; }
.t2 .sdx-group h3 {
  margin: 0 0 10px; font-size: var(--type-body-size); font-weight: var(--weight-strong); color: var(--ink); letter-spacing: var(--type-body-tracking);
  display: flex; align-items: center; gap: 10px;
}
.t2 .sdx-group h3::after { content: ""; flex: 1; height: 1px; background: var(--line-2); }
.t2 .sdx-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px 24px; }
.t2 .sdx-f { min-width: 0; }
.t2 .sdx-f.wide { grid-column: 1 / -1; }
.t2 .sdx-f .k { font-size: var(--type-caption-size); color: var(--ink-4); }
.t2 .sdx-f .v {
  margin-top: 3px; font-size: var(--type-body-size); font-weight: var(--weight-medium); color: var(--ink); line-height: var(--leading-relaxed);
  font-variant-numeric: tabular-nums; overflow-wrap: anywhere;
  display: flex; align-items: center; flex-wrap: wrap; gap: 8px;
}
.t2 .sdx-f .v.none { color: var(--ink-5); font-weight: var(--weight-regular); }
.t2 .sdx-f .v.code { font-family: var(--mono); font-size: var(--type-body-size); font-weight: var(--weight-medium); letter-spacing: var(--type-heading-tracking); }
.t2 .sdx-copy {
  font-family: var(--sans); font-size: var(--type-caption-size); font-weight: var(--weight-medium); color: var(--ink-3); letter-spacing: 0;
  height: 22px; padding: 0 8px; border: 1px solid var(--line); border-radius: var(--radius-sm); background: var(--surface);
  transition: background var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.t2 .sdx-copy:hover { background: var(--surface-3); border-color: var(--control-line); color: var(--ink); }
.t2 .sdx-copy.ok { color: var(--ok); border-color: var(--ok-line); background: var(--ok-tint); }
.t2 .sdx-copy:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }

.t2 .sdx-note {
  margin-top: 16px; display: flex; gap: 9px; align-items: flex-start; padding: 10px 12px;
  background: var(--surface-3); border: 1px solid var(--line-2); border-radius: var(--radius-md);
  font-size: var(--type-body-size); line-height: var(--leading-relaxed); color: var(--ink-3);
}
.t2 .sdx-note svg { width: 15px; height: 15px; flex: none; margin-top: 2px; color: var(--ink-4); }
.t2 .sdx-help { margin-top: 9px; font-size: var(--type-body-size); line-height: var(--leading-relaxed); color: var(--ink-4); }

.t2 .sdx-form { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) auto; gap: 12px; align-items: end; }
.t2 .sdx-field label { display: block; font-size: var(--type-caption-size); color: var(--ink-4); margin-bottom: 5px; }
.t2 .sdx-field input {
  width: 100%; height: 34px; padding: 0 10px; font: inherit; font-size: var(--type-body-size); color: var(--ink);
  background: var(--surface); border: 1px solid var(--input-line); border-radius: var(--radius-sm); box-shadow: var(--shadow-1);
  font-variant-numeric: tabular-nums;
  transition: border-color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease);
}
.t2 .sdx-field input::placeholder { color: var(--ink-5); }
.t2 .sdx-field input:hover { border-color: var(--control-line); }
.t2 .sdx-field input:focus { outline: 0; border-color: var(--focus); box-shadow: var(--ring); }
.t2 .sdx-form .btn { height: 34px; padding: 0 16px; }

/* The decision log as a timeline: a rail, a node per event, newest as given. */
.t2 .sdx-tl { list-style: none; margin: 0; padding: 0; }
.t2 .sdx-tl li { position: relative; display: flex; gap: 12px; align-items: baseline; padding: 0 0 14px 20px; }
.t2 .sdx-tl li:last-child { padding-bottom: 0; }
.t2 .sdx-tl li::before {
  content: ""; position: absolute; left: 0; top: 6px; width: 7px; height: 7px; border-radius: 50%;
  background: var(--surface); box-shadow: 0 0 0 1.5px var(--ink-4);
}
.t2 .sdx-tl li::after { content: ""; position: absolute; left: 3px; top: 17px; bottom: -3px; width: 1px; background: var(--line); }
.t2 .sdx-tl li:last-child::after { display: none; }
.t2 .sdx-tl .c { flex: 1; min-width: 0; }
.t2 .sdx-tl .t { font-size: var(--type-body-size); font-weight: var(--weight-medium); color: var(--ink); }
.t2 .sdx-tl .m { margin-top: 2px; font-size: var(--type-body-size); color: var(--ink-4); overflow-wrap: anywhere; }
.t2 .sdx-tl .when { flex: none; font-size: var(--type-caption-size); color: var(--ink-4); font-variant-numeric: tabular-nums; white-space: nowrap; }
.t2 .modal.sdx .loading.sm { padding: 4px 0; }
.t2 .modal.sdx .modal-foot { padding: 12px 20px; flex-wrap: wrap; }
.t2 .modal.sdx .modal-foot .btn { max-width: 100%; height: auto; min-height: 32px; white-space: normal; }
@media (max-width: 560px) {
  .t2 .sdx-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .t2 .sdx-stat:nth-child(3) { border-left: 0; }
  .t2 .sdx-stat:nth-child(n+3) { border-top: 1px solid var(--line-2); }
  .t2 .sdx-grid, .t2 .sdx-form { grid-template-columns: minmax(0, 1fr); }
}
/* A short wait, said with a ring and a plain sentence. */
.loading.sm { padding: 14px 0; gap: 10px; font-size: var(--type-body-size); }
.t2 .spinner { width: 15px; height: 15px; border-width: 2px; border-color: var(--line); border-top-color: var(--ink-2); }

/* ---- skeleton: the shape of what is coming ----
   The generic frame was six grey bars of random width, which announces "a page"
   and nothing about which one. This one is the list: a toolbar, a header rule
   and rows in the same rhythm as the real ones, so the content lands INTO its
   own outline instead of replacing a different picture. */
.t2 .skel {
  background: linear-gradient(90deg, var(--line-3) 25%, var(--skel-hi) 37%, var(--line-3) 63%);
  background-size: 400% 100%; border-radius: var(--radius-xs); animation: t2-shimmer 1.4s ease infinite;
}
@keyframes t2-shimmer { from { background-position: 100% 0; } to { background-position: 0 0; } }
.skel-list .skel { margin: 0; }
.skel-bar { display: flex; align-items: center; gap: 8px; padding: 10px 12px; border-bottom: 1px solid var(--line-2); }
.skel-head { display: flex; align-items: center; gap: 24px; padding: 11px 14px; background: var(--surface-3); box-shadow: inset 0 -1px 0 var(--line); }
.skel-row { display: flex; align-items: center; gap: 24px; padding: 0 14px; height: 51px; border-bottom: 1px solid var(--line-2); }
.skel-row:last-child { border-bottom: 0; }
.skel-row .grow, .skel-head .grow { flex: 1; min-width: 0; }
.skel-row .two { display: grid; gap: 7px; }

/* ---- motion ----
   Small, fast and only where something actually arrived or left. Everything is
   opt-out: a reader who asked the system for less motion gets none of it. */
@media (prefers-reduced-motion: no-preference) {
  /* Every keyframe here starts from a state the reader can already see. That is
     this codebase's standing rule for the pane transition, for two reasons that
     both apply: a fade up from transparent is a flash rather than a settle, and
     an entrance that starts at zero leaves the content INVISIBLE for as long as
     the browser is not producing frames — a throttled tab, a stalled
     compositor — which turns a decoration into an outage. The scrim is the one
     exception: it is a backdrop, and there is nothing on it to read. */
  @keyframes t2-rise { from { opacity: .35; transform: translateY(5px); } to { opacity: 1; transform: none; } }
  @keyframes t2-pop { from { opacity: .5; transform: translateY(-4px) scale(.97); } to { opacity: 1; transform: none; } }
  @keyframes t2-fade { from { opacity: 0; } to { opacity: 1; } }
  @keyframes t2-modal { from { opacity: .6; transform: translateY(10px) scale(.985); } to { opacity: 1; transform: none; } }
  @keyframes t2-up { from { opacity: .4; transform: translateY(14px); } to { opacity: 1; transform: none; } }
  @keyframes t2-tick { 0% { transform: scale(.6); } 60% { transform: scale(1.12); } 100% { transform: scale(1); } }

  /* Rows settle in once, on arrival — never on a sort, a filter or a tick,
     where the reader is watching the rows and a cascade would be a delay. */
  .t2 tbody.arrive > tr { animation: t2-rise 260ms var(--ease) backwards; animation-delay: calc(min(var(--i, 0), 14) * 22ms); }
  .rowmenu { transform-origin: top right; animation: t2-pop 130ms var(--ease); }
  /* The chooser drops from a button in the head and rises from the selection
     bar; its lines settle in one after another, top down when it drops and
     bottom up when it rises, so the list reads as growing out of the button. */
  @keyframes t2-chooser-down { from { opacity: .5; transform: translateY(-6px) scale(.98); } to { opacity: 1; transform: none; } }
  @keyframes t2-chooser-up { from { opacity: .5; transform: translateY(6px) scale(.98); } to { opacity: 1; transform: none; } }
  @keyframes t2-chooser-line { from { opacity: .35; transform: translateY(3px); } to { opacity: 1; transform: none; } }
  .chooser.t2 { transform-origin: top right; animation: t2-chooser-down 160ms var(--ease); }
  .chooser.t2.up { transform-origin: bottom right; animation-name: t2-chooser-up; }
  .chooser.t2 .item { animation: t2-chooser-line 200ms var(--ease) backwards; animation-delay: calc(30ms + var(--i, 0) * 12ms); }
  .chooser.t2.up .item { animation-delay: calc(30ms + (11 - min(var(--i, 0), 11)) * 11ms); }
  .t2 .scrim { animation: t2-fade 160ms ease-out; }
  .t2 .scrim > .modal { animation: t2-modal 220ms var(--ease); }
  .t2 .selectbar.in { animation: t2-up 240ms var(--ease); }
  .t2 .cbx.on.just { animation: t2-tick 200ms var(--ease); }
}
@media (prefers-reduced-motion: reduce) {
  .t2 *, .t2 *::before, .t2 *::after { transition: none !important; }
  .t2 .skel { animation: none; }
}

/* ------------------------------------------------- the assistant (chat) ----
   A panel beside the screens, under the masthead, and the launcher that opens
   it. Spec: docs/features/ai-chat.md.

   `.workarea` is the row the screen and the panel share. It sits below the
   topbar, the next-step strip and the verify bar, so the breadcrumb and the
   account run the full width of the window -- over the panel as well as over
   the screen. The panel's width is taken FROM the page: the screen reflows
   into what is left, which is the point. A reviewer asking about a number
   keeps the number.

   It docks, so it carries a 1px rule and a fill one step off paper and NOT a
   shadow: shadow in this system is for what floats above the page, and this
   sits in it (Elevation & Depth). */
.workarea { flex: 1; min-height: 0; display: flex; }
.workarea > #screen { flex: 1; min-width: 0; display: flex; flex-direction: column; }

/* `display: flex` beats the `hidden` attribute's `display: none`, so a closed
   panel has to be told to stay closed. Without this the panel is open from the
   first paint and the launcher toggles nothing. */
.aichat[hidden] { display: none; }
.aichat {
  flex: none; min-width: 0; height: 100%;
  display: flex; flex-direction: column;
  position: relative;
  background: var(--surface-3);
  border-left: 1px solid var(--line);
}
/* Opening and closing, as width. The panel is a flex sibling of the screen, so
   its width IS what the screen gives up: growing it from zero brings the panel
   in from the edge and narrows the screen to meet it, in one move. A transform
   would have slid the panel in over a screen that had already jumped to its
   new size. `overflow: hidden` keeps the contents from spilling out of a panel
   that is still only a few pixels wide.
   The class is added for the length of the move and taken off after, so a drag
   on the handle is never fighting a transition. */
.aichat.anim { transition: width 300ms cubic-bezier(.4, 0, .2, 1); overflow: hidden; }
.aichat.anim > * { min-width: 320px; }

/* The drag handle: the panel's own left edge, widened to something a pointer
   can catch, reaching over the rule rather than sitting beside it. */
.ai-grip {
  position: absolute; left: -3px; top: 0; bottom: 0; width: 7px;
  cursor: col-resize; z-index: 2; background: transparent;
  transition: background 120ms var(--ease);
}
.ai-grip:hover, .ai-grip:focus-visible { background: var(--accent-tint); outline: none; }
.ai-grip:focus-visible { box-shadow: inset 1px 0 0 var(--accent), inset -1px 0 0 var(--accent); }
/* While dragging, the pointer owns the gesture: nothing selects under it and
   nothing on the page claims the cursor. */
body.chat-resizing { cursor: col-resize; user-select: none; }
body.chat-resizing .aichat, body.chat-resizing .aichat * { transition: none !important; }

/* ---- head ---- */
.ai-head {
  height: 46px; flex: none; display: flex; align-items: center; gap: 8px;
  padding: 0 10px 0 18px; border-bottom: 1px solid var(--line-2);
  background: var(--surface-3);
}
.ai-title { font: var(--type-caption); font-weight: var(--weight-strong); color: var(--ink); }
.ai-ghost {
  margin-left: auto; border: 0; background: none; padding: 4px 7px;
  font: var(--type-caption); color: var(--ink-3); border-radius: var(--radius-xs); cursor: pointer;
  transition: background 120ms var(--ease), color 120ms var(--ease);
}
.ai-ghost:hover { background: var(--surface-2); color: var(--ink); }
.ai-ghost[hidden] + .ai-x { margin-left: auto; }
.ai-x {
  width: 28px; height: 28px; flex: none; display: grid; place-items: center;
  border: 0; background: none; color: var(--ink-3); border-radius: var(--radius-sm); cursor: pointer;
  transition: background 120ms var(--ease), color 120ms var(--ease);
}
.ai-x:hover { background: var(--surface-2); color: var(--ink); }
.ai-x svg { width: 15px; height: 15px; }

/* ---- the log ---- */
.ai-log { flex: 1; min-height: 0; overflow-y: auto; padding: 18px 18px 6px; scroll-behavior: smooth; }

/* Empty state: what can be asked here, and what it cannot answer. The second
   line is not a disclaimer -- it is the difference between this panel and the
   one every other product ships. */
.ai-empty { padding: 6px 0 2px; }
.ai-lede { margin: 0 0 6px; font: var(--type-heading); color: var(--ink); }
.ai-sub { margin: 0 0 16px; font: var(--type-caption); color: var(--ink-3); max-width: 46ch; }
.ai-sugg-list { display: flex; flex-direction: column; gap: 7px; align-items: flex-start; }
.ai-sugg {
  text-align: left; font: var(--type-caption); color: var(--ink-2);
  background: var(--surface); border: 1px solid var(--line-2); border-radius: var(--radius-md);
  padding: 9px 12px; cursor: pointer; max-width: 100%;
  transition: border-color 140ms var(--ease), color 140ms var(--ease), transform 140ms var(--ease);
}
.ai-sugg:hover { border-color: var(--ink-5); color: var(--ink); transform: translateX(2px); }

/* ---- a turn ----
   The reviewer's question is a tinted block against the right edge; the
   answer is plain text across the column, because the answer is the document
   and a bubble would make it a chat log. */
.ai-turn { margin-bottom: 18px; }
.ai-turn.you { display: flex; justify-content: flex-end; }
.ai-said {
  max-width: 85%; padding: 9px 13px;
  background: var(--accent-tint); border: 1px solid var(--accent-tint-line);
  border-radius: var(--radius-lg) var(--radius-lg) var(--radius-xs) var(--radius-lg);
  font: var(--type-body); color: var(--ink);
}
.ai-body { font: var(--type-body); color: var(--ink-2); }
.ai-said p, .ai-body p { margin: 0 0 9px; }
.ai-said p:last-child, .ai-body p:last-child { margin-bottom: 0; }
/* While the model is still writing, the last paragraph carries a caret. It is
   the cursor of the thing typing, and it stops when the reply is complete. */
.ai-turn.streaming .ai-body p:last-child::after {
  content: ""; display: inline-block; width: 2px; height: 1em;
  margin-left: 2px; vertical-align: -2px; background: var(--ink-4);
  animation: ai-caret 1s steps(2, start) infinite;
}
@keyframes ai-caret { 0%, 50% { opacity: 1; } 50.01%, 100% { opacity: 0; } }

/* A refusal that came from the server is still an answer, and reads as one --
   marked by a rule in the margin rather than by alarm. */
.ai-turn.err .ai-body {
  border-left: 2px solid var(--line); padding-left: 11px; color: var(--ink-3);
}

/* ---- the wait ----
   A label that shimmers, the elapsed time, and the shape of the answer that is
   coming. It reports rather than decorates: a reviewer who has waited eleven
   seconds should be able to see that it has been eleven. */
.ai-wait { display: flex; align-items: center; gap: 10px; }
.ai-lbl {
  font: var(--type-caption); font-weight: var(--weight-medium);
  background: linear-gradient(90deg, var(--ink-3) 35%, var(--ink) 50%, var(--ink-3) 65%);
  background-size: 200% 100%;
  -webkit-background-clip: text; background-clip: text; color: transparent;
  animation: ai-shimmer 1.4s linear infinite;
}
@keyframes ai-shimmer { from { background-position: 100% 0; } to { background-position: -100% 0; } }
.ai-el { font-family: var(--mono); font-size: var(--type-caption-size); color: var(--ink-4); font-variant-numeric: tabular-nums; }

/* The shape of the answer that is coming: three ruled lines that shimmer in
   the reading direction. It holds the space the reply will take, so the panel
   does not jump when the first words land, and it says "prose, shortly" in a
   way a spinner cannot. */
.ai-skel { margin-top: 12px; display: flex; flex-direction: column; gap: 9px; }
.ai-skel span {
  display: block; height: 9px; border-radius: 2px;
  background: linear-gradient(90deg, var(--surface-2) 0%, var(--line-3) 22%,
                              var(--surface) 42%, var(--line-3) 62%, var(--surface-2) 100%);
  background-size: 260% 100%;
  animation: ai-sweep 1.6s linear infinite;
}
@keyframes ai-sweep { from { background-position: 130% 0; } to { background-position: -130% 0; } }

/* ---- the composer ----
   One field with the send inside it, rather than a box and a button side by
   side: the whole shape is the control, and it is the only thing on this
   surface that takes a focus ring. */
.ai-compose { flex: none; padding: 10px 18px 14px; background: var(--surface-3); }
.ai-box {
  display: flex; align-items: flex-end; gap: 6px; padding: 6px 6px 6px 12px;
  background: var(--surface); border: 1px solid var(--input-line);
  border-radius: var(--radius-lg);
  transition: border-color 140ms var(--ease), box-shadow 140ms var(--ease);
}
.ai-box:focus-within { border-color: var(--focus); box-shadow: var(--ring); }
.ai-box textarea {
  flex: 1; min-width: 0; resize: none; border: 0; outline: 0; background: none;
  min-height: 26px; max-height: 168px; padding: 4px 0;
  font: var(--type-body); color: var(--ink);
}
.ai-box textarea::placeholder { color: var(--ink-placeholder); }
.ai-send {
  width: 30px; height: 30px; flex: none; display: grid; place-items: center;
  border: 0; border-radius: var(--radius-md);
  background: var(--accent); color: var(--on-accent); cursor: pointer;
  transition: opacity 140ms var(--ease), transform 140ms var(--ease);
}
.ai-send:hover { transform: translateY(-1px); }
.ai-send:disabled { opacity: .45; cursor: default; transform: none; }
.ai-send svg { width: 15px; height: 15px; }
.ai-foot { margin: 8px 2px 0; font: var(--type-caption); color: var(--ink-4); }

/* ---- the launcher ----
   Bottom-right of every authenticated screen. A control, not a mascot: no
   pulse, no bubble, and none of the one accent this theme holds back for the
   mark, the focus ring and the single next-step indicator.

   Nothing hides it on the sign-in surface because nothing has to: it is a
   child of #app, which is `hidden` until the reviewer is in. The published
   report and the print stylesheet never load this file at all. */
.aichat-open {
  position: fixed; right: 18px; bottom: 18px; z-index: 40;
  width: 40px; height: 40px; display: grid; place-items: center;
  border: 1px solid var(--line); border-radius: 50%;
  background: var(--surface); color: var(--ink-2); cursor: pointer;
  /* It floats above the page, so here the shadow is correct. */
  box-shadow: var(--shadow-2);
  transition: color 140ms var(--ease), border-color 140ms var(--ease), transform 140ms var(--ease);
}
.aichat-open:hover { color: var(--ink); border-color: var(--ink-5); transform: translateY(-1px); }
.aichat-open svg { width: 18px; height: 18px; }
/* While the panel is open the launcher stands down: it is fixed to the same
   corner the composer occupies, and a floating circle over the send button is
   a button nobody can press. The header's close is how an open panel closes. */
.app.chat-open .aichat-open { display: none; }
/* And on the assistant's own screen, where it would open a panel holding the
   conversation already filling the page behind it. */
.app.chat-page .aichat-open { display: none; }

/* Below the width where a split would leave two columns neither of which can
   be read, the panel takes the window instead of sharing it. The app already
   declines to run below a laptop; this is the same judgement one step down. */
@media (max-width: 1100px) {
  .aichat { position: fixed; inset: 0 0 0 auto; width: min(100%, 520px); z-index: 60; }
  /* Now it IS over the page, so now it earns the drawer's shadow. */
  .app.chat-open .aichat { box-shadow: var(--shadow-3); }
  /* Nothing to drag when the panel is not sharing the width. */
  .ai-grip { display: none; }
  /* Here it IS over the page, so here a slide is the true picture of the move.
     Width transitions do not apply to a panel that is not taking width. */
  .aichat.anim { transition: none; }
}

/* ---- motion ----
   The panel arrives from its own edge and the turns settle in after it. Every
   entrance starts from a VISIBLE state per the theme's motion rule, so a
   dropped animation frame leaves content on the screen rather than off it. */
@media (prefers-reduced-motion: no-preference) {
  @keyframes ai-slide { from { transform: translateX(24px); opacity: .4; } to { transform: none; opacity: 1; } }
  @keyframes ai-rise { from { transform: translateY(6px); opacity: .5; } to { transform: none; opacity: 1; } }
  /* The panel itself moves by width (above). What rides in with it is its
     contents, so the head, the log and the composer are not stretched across
     a panel that is still opening. */
  .aichat.anim .ai-head, .aichat.anim .ai-log, .aichat.anim .ai-compose {
    animation: ai-slide 300ms cubic-bezier(.4, 0, .2, 1);
  }
  .ai-turn { animation: ai-rise 220ms cubic-bezier(.16, 1, .3, 1); }
  .ai-sugg { animation: ai-rise 260ms cubic-bezier(.16, 1, .3, 1) backwards; animation-delay: calc(40ms + var(--i, 0) * 45ms); }
}
@media (prefers-reduced-motion: reduce) {
  /* The shimmer stops and the bars hold still; the timer keeps counting,
     because the elapsed figure is information and the animation is not. */
  .ai-lbl { animation: none; }
  .ai-skel span { animation: none; background: var(--surface-2); }
  /* `:root` because these skeletons are declared further down the sheet. */
  :root .ai-histskel > div, :root .ai-tablewrap.arriving .r i,
  :root .ai-tablewrap.arriving .h .ph, :root .ai-chart-skel span,
  :root .ai-arrive { animation: none; }
  /* The caret stops blinking; the text still streams in, because the words
     arriving IS the information. */
  .ai-turn.streaming .ai-body p:last-child::after { animation: none; }
  .ai-lbl { color: var(--ink-3); }
}

/* ---- the assistant with the screen to itself (screens/chat.js) ----
   The same conversation as the panel, drawn wider. What changes is the
   measure: the reading column is bounded, because a 1,400px line of prose is
   not a line anyone reads twice, and the composer sits with the column rather
   than across the window -- a text field the width of a desk is one nobody can
   aim at. Spec: docs/features/ai-chat.md, feature 3.

   The COLUMN scrolls, not the page: the composer is pinned to the bottom of
   the screen the way it is pinned to the bottom of the panel. It scrolled away
   with the transcript before this, so a long answer left the reviewer
   scrolling back down to ask the next question. */
.chatpane { display: flex; justify-content: center; padding: 0 20px; overflow: hidden; }
/* The transcript scrolls from edge to edge of the screen, not only inside its
   column: a wheel turned over the margin either side of the conversation did
   nothing, which reads as a page that has stopped responding. So the pane has
   no side padding, the column fills it, and the COLUMN'S WIDTH is made by the
   transcript's own padding -- the content sits in the same 920px as the
   header while the whole width is the scroll surface.

   Two measures, not one. Prose keeps its 760px line; a table or a chart is a
   figure, and a figure squeezed to a line of prose wrapped a nine-word activity
   name onto three lines beside a date column with room to spare. The column is
   the figure's width, and paragraphs hold to the reading measure inside it. */
.chatscr .chatpane { padding: 0; }
.chatcol {
  flex: 1; min-width: 0; width: 100%; height: 100%;
  display: flex; flex-direction: column; min-height: 0;
}
.chatscr .ai-body > p, .chatscr .ai-body > .ai-list { max-width: 760px; }
/* The transcript scrolls away under a soft edge rather than a hard one: a
   table cut flat against the subline read as part of the header. */
.chatlog {
  flex: 1; min-height: 0; overflow-y: auto;
  /* max-width: 920px, drawn as padding so the margins scroll too. */
  padding: 16px max(24px, calc((100% - 920px) / 2)) 6px;
  -webkit-mask-image: linear-gradient(to bottom, transparent 0, #000 16px);
  mask-image: linear-gradient(to bottom, transparent 0, #000 16px);
}
/* The header shares the column's axis. It sat at the page's left edge over a
   centred column, and Clear stopped wherever the subline happened to end. */
.chatscr .pageblock .pagehead { max-width: 920px; margin: 0 auto; }
.chatscr #chatpg-clear { margin-left: auto; flex: none; }
.chatscr .chat-proj { color: var(--ink-2); font-weight: var(--weight-strong); }
.chatscr .chat-proj:not(:empty)::after {
  content: "\00a0\00b7\00a0"; color: var(--ink-3); font-weight: var(--weight-regular, normal);
}
.chatcompose {
  flex: none; width: min(920px, 100% - 48px); margin: 0 auto;
  padding: 10px 0 18px; background: transparent;
}
/* The page's own empty state has room to breathe that the panel's does not. */
.chatscr .ai-empty { padding-top: 18px; }
.chatscr .ai-lede { margin-bottom: 14px; }

/* No scrollbar on a transcript. The reader's position is already stated by the
   words; a bar down the side of a column of prose is furniture, and on the
   full-page surface it drew a second vertical line beside the screen's own.
   Scrolling itself is untouched -- wheel, trackpad, keys and the scroll
   anchoring all work exactly as before. */
.ai-log { scrollbar-width: none; -ms-overflow-style: none; }
.ai-log::-webkit-scrollbar { width: 0; height: 0; }

/* ---- what the model writes ----
   Markdown, rendered (core/chat-core.js builds these as nodes; the model's
   words are always text). The list is the shape an answer about fourteen
   checks actually has, so it is styled like one rather than squeezed into
   paragraphs. */
/* 26px, not 20: at 20 the marker for item 10 hung off the left edge and read
   as "L0." -- an answer about fourteen checks is exactly where that shows. */
.ai-body .ai-list { margin: 0 0 9px; padding-left: 26px; }
.ai-body .ai-list li { margin: 0 0 5px; }
.ai-body .ai-list li:last-child { margin-bottom: 0; }
.ai-body .ai-h { font-weight: var(--weight-strong); color: var(--ink); margin: 12px 0 5px; }
.ai-body .ai-h:first-child { margin-top: 0; }
.ai-body strong { font-weight: var(--weight-strong); color: var(--ink); }
.ai-body em { font-style: italic; }
.ai-body code {
  font-family: var(--mono); font-size: var(--type-caption-size);
  background: var(--surface-2); border: 1px solid var(--line-3);
  border-radius: 2px; padding: 0 4px;
}

/* The file this conversation is about, above the project name. It is a control
   as well as a label -- every schedule has its own chat, and this is how a
   reviewer moves between them -- so it carries the same quiet chevron the
   switcher and the row menus use, and nothing louder. */
.chat-file {
  display: inline-flex; align-items: center; gap: 6px; margin-bottom: 3px;
  padding: 2px 6px 2px 7px; border: 1px solid var(--line-2); border-radius: var(--radius-pill);
  background: var(--surface); cursor: pointer; max-width: 100%;
  font-family: var(--mono); font-size: var(--type-caption-size); color: var(--ink-3);
  transition: border-color 140ms var(--ease), color 140ms var(--ease);
}
.chat-file:hover:not(:disabled) { border-color: var(--ink-5); color: var(--ink); }
.chat-file:disabled { cursor: default; opacity: .7; }
.chat-file .f { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.chat-file .ic { display: grid; place-items: center; flex: none; }
.chat-file .ic svg { width: 10px; height: 10px; }

/* ---- what a reply can contain ----
   Rows as a table, a handful of counts as a chart, and the lookups the
   assistant made on its way to the answer. Spec: docs/features/ai-chat.md,
   feature 5. */

/* The chart is a shape for a handful of counts, not a visualisation layer:
   horizontal bars, no axes, and every bar carries its own value as text -- a
   reader who cannot see the drawing still has the number. */
.ai-chart {
  margin: 4px 0 12px; display: flex; flex-direction: column; gap: 4px;
  padding: 12px 14px 10px; background: var(--surface);
  border: 1px solid var(--line-2); border-radius: var(--radius-md);
}
.ai-chart figcaption {
  font: var(--type-caption); font-weight: var(--weight-strong); color: var(--ink-2);
  margin-bottom: 6px;
}
.ai-chart figcaption.more { margin: 2px 0 0; color: var(--ink-4); }
.ai-chart .bars .bar { display: grid; grid-template-columns: minmax(70px, 34%) 1fr auto; gap: 9px; align-items: center; }
.ai-chart .bars .k {
  font: var(--type-caption); color: var(--ink-3);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ai-chart .bars .t { display: block; height: 9px; background: var(--surface-2); border-radius: 2px; }
.ai-chart .bars .v { display: block; height: 9px; background: var(--accent); border-radius: 2px; }
/* Below zero reads as below zero, without a second colour in the palette. */
.ai-chart .bars .v.neg { background: var(--sev-high, var(--ink-3)); }
.ai-chart .bars .n {
  font-family: var(--mono); font-size: var(--type-caption-size);
  color: var(--ink-2); font-variant-numeric: tabular-nums;
}

.ai-pre {
  margin: 0 0 10px; padding: 9px 11px; overflow-x: auto;
  background: var(--surface-2); border: 1px solid var(--line-3); border-radius: var(--radius-xs);
  font-family: var(--mono); font-size: var(--type-caption-size); color: var(--ink-2);
}
.ai-note { font: var(--type-caption); color: var(--ink-4); }

/* The lookups, while they run. Each line is what is being read, not a
   percentage of something the panel cannot know. */
.ai-steps { margin-top: 9px; display: flex; flex-direction: column; gap: 5px; }
.ai-steps .s { display: flex; align-items: center; gap: 8px; font: var(--type-caption); color: var(--ink-3); }
.ai-steps .d { width: 4px; height: 4px; border-radius: 50%; background: var(--ink-5); flex: none; }
.ai-steps .s:last-child .d { background: var(--accent); }

/* ---- while a reply, a table or a stored thread is still arriving ----
   Three skeletons, one idea: show the SHAPE of what is coming rather than an
   empty space that fills in a second later. An empty chat is a statement --
   "nothing was ever asked here" -- and for a schedule with a history it is the
   wrong one. Spec: docs/features/ai-chat.md, feature 7. */
@keyframes ai-skelsweep { from { background-position: 130% 0; } to { background-position: -130% 0; } }
.ai-histskel { display: flex; flex-direction: column; gap: 12px; padding: 4px 0; }
.ai-histskel > div, .ai-tablewrap.arriving .r i, .ai-tablewrap.arriving .h .ph,
.ai-chart-skel span {
  display: block; height: 10px; border-radius: 2px;
  background: linear-gradient(90deg, var(--surface-2) 0%, var(--line-3) 22%,
                              var(--surface) 42%, var(--line-3) 62%, var(--surface-2) 100%);
  background-size: 260% 100%;
  animation: ai-skelsweep 1.6s linear infinite;
}
/* The reviewer's questions sit right, as their turns do. */
.ai-histskel > div.you { margin-left: auto; height: 26px; border-radius: var(--radius-lg); }

/* A table mid-arrival: the table's own frame, head and rules, with the rows
   shimmering until they are whole. It reflowed on every token before this --
   a table changing width under a reader is harder to read than one that
   arrives whole -- and then it was a thin bar that the finished table jumped
   out of. Same border, same head, same row height: the figures land INTO it.
   Not `.skel`: that class is the app's own one-line placeholder, and it
   pressed this whole frame into a 14px strip. */
.ai-tablewrap.arriving { display: flex; flex-direction: column; overflow: hidden; }
.ai-tablewrap.arriving .h, .ai-tablewrap.arriving .r { display: flex; gap: 14px; padding: 0 14px; }
.ai-tablewrap.arriving .h {
  align-items: center; min-height: 34px; border-bottom: 2px solid var(--ink);
  background: var(--surface-4, var(--surface));
  font: var(--type-caption); font-weight: var(--weight-strong); color: var(--ink);
}
.ai-tablewrap.arriving .h span { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ai-tablewrap.arriving .h .ph { height: 8px; }
.ai-tablewrap.arriving .r { align-items: center; height: 34px; border-bottom: 1px solid var(--line-3); }
.ai-tablewrap.arriving .r:last-child { border-bottom: 0; }
/* The cell takes the column's width; the bar inside it is the text's. */
.ai-tablewrap.arriving .r span { flex: 1; min-width: 0; }
.ai-tablewrap.arriving .r i { height: 9px; }

.ai-chart-skel {
  display: flex; flex-direction: column; gap: 9px; margin: 4px 0 12px; padding: 14px;
  border: 1px solid var(--line-2); border-radius: var(--radius-md); background: var(--surface);
}
.ai-chart-skel span { height: 12px; }

/* What replaces a skeleton settles into its frame rather than snapping in. */
@keyframes ai-arrive { from { opacity: .35; } to { opacity: 1; } }
.ai-arrive { animation: ai-arrive 240ms var(--ease, ease-out); }

/* ---- the table, once it is whole ----
   It is the answer, not a note beside it: a ruled block on its own surface,
   with the head held above a 2px ink rule -- the one structural gesture this
   system has -- and figures in the monospaced face. */
.ai-tablewrap {
  margin: 4px 0 12px; overflow-x: auto;
  background: var(--surface); border: 1px solid var(--line-2);
  border-radius: var(--radius-md);
}
.ai-table { width: 100%; border-collapse: collapse; font: var(--type-caption); }
.ai-table th {
  text-align: left; font-weight: var(--weight-strong); color: var(--ink);
  padding: 9px 14px 8px; border-bottom: 2px solid var(--ink);
  background: var(--surface-4, var(--surface)); vertical-align: bottom;
}
.ai-table td {
  padding: 8px 14px; border-bottom: 1px solid var(--line-3); color: var(--ink-2);
  vertical-align: top;
}
.ai-table tbody tr:last-child td { border-bottom: 0; }
.ai-table tbody tr:hover td { background: var(--surface-3); }
.ai-table td.num, .ai-table td.code {
  font-family: var(--mono); font-variant-numeric: tabular-nums;
  white-space: nowrap; color: var(--ink);
}
/* A heading wraps before a name does: "Forecast Finish Date" over two lines
   costs nothing; "Rough-in Underslab Plumbing" over three is what the reader
   came to read. Text columns get a floor so a figure column cannot take it. */
.ai-table td:not(.num):not(.code) { min-width: 16ch; }

/* Under a table: its row count and its rows as a file. Sticky to the left so
   a wide table scrolled sideways still shows it. */
.ai-tablebar {
  position: sticky; left: 0; display: flex; align-items: center; gap: 12px;
  padding: 6px 14px; border-top: 1px solid var(--line-3); background: var(--surface-2);
  font: var(--type-caption); color: var(--ink-4);
}
.ai-tablebar .n { font-variant-numeric: tabular-nums; }
.ai-more {
  padding: 0; border: 0; background: none; cursor: pointer;
  font: var(--type-caption); color: var(--ink-2); text-decoration: underline;
  text-underline-offset: 2px; text-decoration-color: var(--line);
}
.ai-more:hover { color: var(--ink); }
.ai-export {
  margin-left: auto; padding: 3px 9px; cursor: pointer; text-decoration: none;
  font: var(--type-caption); font-weight: var(--weight-strong); color: var(--ink-2);
  background: var(--surface); border: 1px solid var(--line-2); border-radius: var(--radius-xs);
  transition: border-color 140ms var(--ease), color 140ms var(--ease);
}
.ai-export:hover { border-color: var(--ink-5); color: var(--ink); }
.ai-chartbar { display: flex; justify-content: flex-end; gap: 8px; margin-top: 6px; }
.ai-chartbar .ai-export { margin-left: 0; }
/* The two exports sit together at the right; only the first is pushed. */
.ai-export + .ai-export { margin-left: 0; }
/* The whole list: the one export that reaches past what the model was shown. */
.ai-lookups { display: flex; flex-direction: column; gap: 6px; margin: 2px 0 12px; }
.ai-lookups:empty { display: none; }
.ai-lookup {
  display: flex; align-items: center; gap: 12px; padding: 8px 10px 8px 14px;
  background: var(--surface); border: 1px solid var(--line-2); border-radius: var(--radius-md);
  font: var(--type-caption); color: var(--ink-3);
}
.ai-lookup strong { color: var(--ink); font-weight: var(--weight-strong); }
.ai-export.primary { background: var(--ink); border-color: var(--ink); color: var(--surface); }
.ai-export.primary:hover { color: var(--surface); opacity: .9; }

/* The library draws into `.hc`; until it does, the ruled bars are the chart.
   `position: relative` is what a responsive canvas measures itself against --
   without it the chart grows on every resize. */
.ai-chart .hc { min-height: 0; }
/* A responsive canvas measures itself against a positioned box; without one it
   grows a little on every resize until the panel is all chart. */
.ai-chart .cv { position: relative; width: 100%; }
.ai-chart .cv canvas { display: block; }
.ai-chart .bars { display: flex; flex-direction: column; gap: 4px; }

/* ============================== screen: people =======================   One roster: members and pending invitations are rows of the same shape,
   on the list surface every other screen uses. Grid rows, not a table, so
   the reach cell can wrap without breaking the row. The dialogs are
   appended to the body, outside `.t2`, so their rules are unscoped. */
/* Wider than the pane, the roster scrolls sideways inside its surface rather
   than spilling past the edge or clipping its buttons. */
.t2 .pp-list { overflow-x: auto; }
.t2 .pp-bar {
  display: flex; align-items: center; gap: 12px; padding: 10px 14px;
  border-bottom: 1px solid var(--line-2); background: var(--surface-4);
  border-radius: var(--radius-lg) var(--radius-lg) 0 0;
}
.t2 .pp-q {
  flex: 1; max-width: 320px; height: 30px; padding: 0 10px; font: inherit; font-size: var(--type-body-size);
  color: var(--ink); background: var(--surface); border: 1px solid var(--input-line); border-radius: var(--radius-sm);
}
.t2 .pp-count { margin-left: auto; font-size: var(--type-caption-size); color: var(--ink-4); white-space: nowrap; }
.t2 .pp-sect {
  padding: 8px 16px 6px; font-size: var(--type-caption-size); font-weight: var(--weight-medium);
  letter-spacing: .04em; text-transform: uppercase; color: var(--ink-4);
  background: var(--surface-3); border-bottom: 1px solid var(--line-2);
}
.t2 .pp-row {
  display: grid; grid-template-columns: minmax(200px, 1.4fr) 140px minmax(180px, 1.6fr) auto auto;
  gap: 14px; align-items: center; padding: 12px 16px; border-bottom: 1px solid var(--line-2);
  min-width: 760px; transition: background var(--t-fast) var(--ease);
}
.t2 .pp-row:hover { background: var(--surface-3); }
.t2 .pp-row:last-child { border-bottom: 0; }
.t2 .pp-row.pending .pp-name { color: var(--ink-2); }
.t2 .pp-who { display: flex; align-items: center; gap: 10px; min-width: 0; }
.t2 .pp-av {
  flex: none; width: 32px; height: 32px; display: grid; place-items: center;
  font-size: var(--type-caption-size); font-weight: var(--weight-strong); letter-spacing: .03em;
  color: var(--surface); background: var(--accent); border-radius: var(--radius-pill);
}
.t2 .pp-av.pending { color: var(--ink-3); background: var(--surface); border: 1px dashed var(--line); }
.t2 .pp-t { min-width: 0; }
.t2 .pp-name { font-weight: var(--weight-medium); color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.t2 .pp-sub { margin-top: 1px; font-size: var(--type-caption-size); color: var(--ink-4); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.t2 .pp-status {
  display: inline-block; margin-top: 3px; padding: 0 7px;
  font-size: var(--type-caption-size); color: var(--warn);
  background: var(--warn-tint); border: 1px solid var(--warn-line); border-radius: var(--radius-pill);
}
.t2 .pp-select {
  width: 100%; height: 28px; padding: 0 8px; font: inherit; font-size: var(--type-body-size);
  color: var(--ink); background: var(--surface);
  border: 1px solid var(--input-line); border-radius: var(--radius-sm);
}
.t2 .pp-owner, .t2 .pp-rolepill {
  display: inline-flex; align-items: center; padding: 3px 10px;
  font-size: var(--type-caption-size); font-weight: var(--weight-medium);
  border-radius: var(--radius-pill); border: 1px solid var(--line-2); color: var(--ink-2); background: var(--surface);
}
.t2 .pp-owner { color: var(--accent-ink); background: var(--accent-tint); border-color: var(--accent-tint-line); }
.t2 .pp-reach { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; min-width: 0; }
.t2 .pp-reach .code-chip { margin: 0; white-space: nowrap; }
.t2 .pp-reach .code-chip.here { color: var(--accent-ink); background: var(--accent-tint); border-color: var(--accent-tint-line); }
.t2 .pp-more { color: var(--ink-4); }
.t2 .pp-all { font-size: var(--type-body-size); color: var(--ink-3); }
.t2 .pp-none { font-size: var(--type-caption-size); color: var(--ink-4); }
.t2 .pp-link {
  border: 0; background: none; padding: 0 2px; font: inherit; font-size: var(--type-caption-size);
  color: var(--accent-ink); text-decoration: underline; text-underline-offset: 3px; cursor: pointer;
}
.t2 .pp-link:hover { color: var(--ink); }
.t2 .pp-when { display: grid; gap: 1px; white-space: nowrap; }
.t2 .pp-when-l { font-size: var(--type-caption-size); color: var(--ink-4); }
.t2 .pp-when-v { font-size: var(--type-caption-size); color: var(--ink-2); font-variant-numeric: tabular-nums; }
.t2 .pp-actions { display: flex; justify-content: flex-end; align-items: center; gap: 6px; white-space: nowrap; }
.t2 .pp-you { font-size: var(--type-caption-size); color: var(--ink-4); }
.t2 .pp-empty { padding: 28px 16px; text-align: center; font-size: var(--type-body-size); color: var(--ink-4); max-width: 52ch; margin: 0 auto; }
.t2 .pp-note { margin: 12px 4px 0; font-size: var(--type-caption-size); color: var(--ink-4); max-width: 80ch; line-height: var(--leading-relaxed); }
/* The scope toggle in the head: this project, or everyone. */
.t2 .pp-scope { display: inline-flex; padding: 3px; gap: 2px; background: var(--surface-2); border: 1px solid var(--line-2); border-radius: var(--radius-pill); }
.t2 .pp-scope-b {
  padding: 4px 11px; border: 0; border-radius: var(--radius-pill); background: none; font: inherit;
  font-size: var(--type-caption-size); font-weight: var(--weight-medium); color: var(--ink-3); cursor: pointer;
}
.t2 .pp-scope-b.on { background: var(--surface); color: var(--ink); box-shadow: var(--shadow-2); }
@media (max-width: 900px) {
  .t2 .pp-row { grid-template-columns: 1fr 1fr; min-width: 0; }
  .t2 .pp-who { grid-column: 1 / -1; }
  .t2 .pp-reach { grid-column: 1 / -1; }
  .t2 .pp-actions { justify-content: flex-start; }
}
.mem-known { margin-top: 6px; }
.mem-modal { width: min(540px, 92vw); }
.mem-picker {
  display: flex; flex-direction: column; gap: 6px; max-height: 240px; overflow: auto;
  padding: 8px 10px; background: var(--surface-4);
  border: 1px solid var(--line-2); border-radius: var(--radius-md);
}
label.mem-pick, .field label.mem-pick {
  display: flex; align-items: center; gap: 8px; margin: 0; padding: 2px 0;
  font-size: var(--type-body-size); font-weight: inherit; color: var(--ink-2); cursor: pointer;
}
.mem-pick input { flex: none; width: 15px; height: 15px; margin: 0; accent-color: var(--accent); }
.mem-link {
  width: 100%; height: 32px; padding: 0 10px; font: inherit;
  font-family: var(--mono); font-size: var(--type-caption-size); color: var(--ink-2);
  background: var(--surface-4); border: 1px solid var(--input-line); border-radius: var(--radius-md);
}
/* The invitation page, on the sign-in panel: what the link opens onto. */
.unlock .auth-invite-lede { margin: 0 0 14px; font: var(--type-body); color: var(--ink-2); }

/* The switch-workspace panel: one row per workspace, the current one marked.
   Appended to the body, outside `.t2`, so unscoped. */
.ws-list { display: flex; flex-direction: column; gap: 8px; margin-top: 4px; }
.ws-row {
  display: flex; align-items: center; gap: 12px; width: 100%; text-align: left;
  padding: 12px 14px; font: inherit; color: var(--ink);
  background: var(--surface); border: 1px solid var(--line-2); border-radius: var(--radius-lg);
  cursor: pointer;
  transition: border-color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease);
}
.ws-row:hover:not(:disabled) { border-color: var(--accent-tint-line); box-shadow: var(--shadow-2); }
.ws-row:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.ws-row.on, .ws-row:disabled { cursor: default; }
.ws-row.on { border-color: var(--accent); background: var(--accent-tint); }
.ws-badge {
  flex: none; width: 36px; height: 36px; display: grid; place-items: center;
  font-size: var(--type-caption-size); font-weight: var(--weight-strong); letter-spacing: .04em;
  color: var(--surface); background: var(--accent); border-radius: var(--radius-md);
}
.ws-t { flex: 1; min-width: 0; }
.ws-name { font-weight: var(--weight-medium); color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ws-role { margin-top: 2px; font-size: var(--type-caption-size); color: var(--ink-4); }
.ws-mark {
  flex: none; display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px;
  font-size: var(--type-caption-size); color: var(--ink-3); white-space: nowrap;
  border: 1px solid var(--line-2); border-radius: var(--radius-pill); background: var(--surface);
}
.ws-mark svg { width: 13px; height: 13px; }
.ws-row.on .ws-mark { color: var(--accent-ink); border-color: var(--accent-tint-line); font-weight: var(--weight-medium); }
.ws-row:hover:not(:disabled) .ws-mark { color: var(--accent-ink); border-color: var(--accent-tint-line); }
/* The action row every account and member dialog ends with: buttons spaced,
   right-aligned, with `.spread` pushing one to the far left. */
.modal-actions { display: flex; align-items: center; justify-content: flex-end; gap: 10px; margin-top: 18px; }
.modal-actions .spread { margin-right: auto; }
/* The reach chooser in the invite and assign dialogs: two plain options. */
.mem-reach-opts { display: flex; flex-direction: column; gap: 8px; margin-bottom: 10px; }
/* Element-qualified: inside a `.field` the generic label rule would otherwise
   stack these as blocks and shrink their text. */
label.mem-reach-opt, .field label.mem-reach-opt {
  display: flex; align-items: flex-start; gap: 10px; margin: 0; padding: 10px 12px; cursor: pointer;
  font-size: inherit; font-weight: inherit;
  background: var(--surface); border: 1px solid var(--line-2); border-radius: var(--radius-md);
}
.mem-reach-opt:hover { border-color: var(--line); background: var(--surface-3); }
.mem-reach-opt.on { border-color: var(--accent); background: var(--accent-tint); }
.mem-reach-opt.off { opacity: .55; cursor: not-allowed; }
.mem-reach-opt input { flex: none; width: 16px; height: 16px; margin: 2px 0 0; accent-color: var(--accent); }
.mem-reach-opt .t { font-weight: var(--weight-medium); color: var(--ink); }
.mem-reach-opt .d { margin-top: 2px; font-size: var(--type-caption-size); color: var(--ink-4); }
.mem-widen { margin: -4px 0 12px; font-size: var(--type-caption-size); color: var(--ink-4); }
.mem-widen a { color: var(--accent-ink); text-decoration: underline; text-underline-offset: 3px; }

/* The rail's kicker is hidden on the themed rail, except in someone else's
   workspace: then it says so, with the role and the reach, under the name. */
.t2 .sb-org-kicker.invited {
  display: inline-flex; align-items: center; gap: 5px; margin-top: 3px; max-width: 100%;
  padding: 1px 8px; font-size: var(--type-caption-size); line-height: var(--leading-snug);
  letter-spacing: 0; text-transform: none; font-weight: var(--weight-medium);
  color: var(--sidebar-text); background: var(--rail-hover); border: 1px solid var(--sidebar-line);
  border-radius: var(--radius-pill); white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.t2 .sb-org-kicker.invited::before {
  content: ""; width: 6px; height: 6px; flex: none; border-radius: var(--radius-pill);
  background: var(--warn-dot);
}

/* ---- the switcher in someone else's workspace: whose it is, at the top ---- */
.t2 .sb-sw-guest {
  display: flex; align-items: center; gap: 9px; margin: 2px 2px 8px; padding: 8px 9px;
  background: var(--rail-hover); border: 1px solid var(--sidebar-line); border-radius: var(--radius-md);
}
.t2 .sb-sw-gt { min-width: 0; flex: 1; display: grid; }
.t2 .sb-sw-gn { font-size: var(--type-caption-size); font-weight: var(--weight-medium); color: var(--sidebar-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.t2 .sb-sw-gs { font-size: var(--type-caption-size); color: var(--sidebar-text-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.t2 .sb-sw-gsw {
  flex: none; width: 28px; height: 28px; display: grid; place-items: center;
  border: 1px solid var(--sidebar-line); border-radius: var(--radius-pill);
  background: none; color: var(--sidebar-text); cursor: pointer;
  transition: background var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease);
}
.t2 .sb-sw-gsw svg { width: 14px; height: 14px; }
.t2 .sb-sw-gsw:hover { background: var(--sidebar-text); color: var(--sidebar-bg); border-color: var(--sidebar-text); }

/* ---- the bell: invitations waiting ---- */
.notif {
  position: relative; display: grid; place-items: center; width: 34px; height: 34px;
  border: 1px solid transparent; border-radius: var(--radius-pill); background: none; color: var(--ink-3); cursor: pointer;
  transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.notif svg { width: 18px; height: 18px; }
.notif:hover, .notif[aria-expanded="true"] { background: var(--surface-2); color: var(--ink); }
.notif.has { color: var(--ink); }
.notif-badge {
  position: absolute; top: 3px; right: 3px; min-width: 16px; height: 16px; padding: 0 4px;
  display: grid; place-items: center; font-size: var(--type-caption-size); font-weight: var(--weight-strong);
  line-height: 1; color: var(--surface); background: var(--danger-dot); border-radius: var(--radius-pill);
  border: 2px solid var(--surface);
}
.popover.notif-pop { width: 380px; padding-bottom: 4px; }
.notif-pop .nv-empty { padding: 12px; font-size: var(--type-caption-size); color: var(--ink-4); line-height: var(--leading-relaxed); }
.nv-card { display: flex; gap: 12px; padding: 12px; border-bottom: 1px solid var(--line-2); }
.nv-card:last-child { border-bottom: 0; }
.nv-av {
  flex: none; width: 36px; height: 36px; display: grid; place-items: center;
  font-size: var(--type-caption-size); font-weight: var(--weight-strong); letter-spacing: .03em;
  color: var(--surface); background: var(--accent); border-radius: var(--radius-md);
}
.nv-b { min-width: 0; flex: 1; display: grid; gap: 6px; }
.nv-t { font-size: var(--type-body-size); color: var(--ink); line-height: var(--leading-snug); }
.nv-t strong { font-weight: var(--weight-strong); }
.nv-sub { font-size: var(--type-caption-size); color: var(--ink-4); }
.nv-reach { display: flex; flex-wrap: wrap; gap: 6px; }
.nv-reach .code-chip { margin: 0; white-space: nowrap; }
.nv-all { font-size: var(--type-caption-size); color: var(--ink-3); }
.nv-actions { display: flex; gap: 8px; margin-top: 2px; }

/* ---- the strip under the top bar: the newest invitation, one Accept ---- */
.invite-strip {
  display: flex; align-items: center; gap: 12px; padding: 8px 20px;
  background: var(--accent-tint); border-bottom: 1px solid var(--accent-tint-line); color: var(--ink);
  font-size: var(--type-body-size);
}
.invite-strip[hidden] { display: none; }
.is-av {
  flex: none; width: 26px; height: 26px; display: grid; place-items: center;
  font-size: var(--type-caption-size); font-weight: var(--weight-strong); letter-spacing: .03em;
  color: var(--surface); background: var(--accent); border-radius: var(--radius-sm);
}
.is-txt { min-width: 0; flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.is-txt strong { font-weight: var(--weight-strong); }
.is-go {
  flex: none; padding: 6px 12px; border: 0; border-radius: var(--radius-sm); font: inherit; font-size: var(--type-caption-size);
  font-weight: var(--weight-medium); color: var(--surface); background: var(--accent); cursor: pointer;
}
.is-go:hover { background: var(--accent-hover); }
.is-later {
  flex: none; padding: 6px 10px; border: 0; background: none; font: inherit; font-size: var(--type-caption-size);
  color: var(--ink-3); cursor: pointer; text-decoration: underline; text-underline-offset: 3px;
}
.is-later:hover { color: var(--ink); }

/* Identity: source and edit state belong below their own input. */
.t2 .identity-provenance { position: static; display: flex; flex-direction: column; align-items: flex-start; gap: 4px; margin-top: 8px; overflow-wrap: anywhere; }
.t2 .identity-provenance span { max-width: 100%; white-space: normal; }
.t2 .identity-edited, .t2 .identity-error { color: var(--warn); }
.t2 .identity-use-file { margin-top: 8px; }

/* Setup is a bounded modal over the schedule list. */
.cmp-host.kind-setup .cmp-modal { inset: 24px; max-width: 1120px; margin: 0 auto; }
.cmp-host.kind-setup .cmp-body { overflow: hidden; }
.setup-close-dialog { max-width: 440px; width: calc(100% - 40px); border: 1px solid var(--line); border-radius: var(--radius-xl); padding: 24px; color: var(--ink); background: var(--surface); }
.setup-close-dialog::backdrop { background: var(--setup-scrim); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); }
.setup-close-dialog { box-shadow: 0 24px 80px var(--setup-shadow-color); }
.setup-close-dialog h2 { margin: 0 0 12px; font: var(--type-title); letter-spacing: var(--type-title-tracking); }
.setup-close-dialog p { line-height: 1.5; }
.setup-close-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; margin-top: 20px; }
@media (max-width: 720px) { .cmp-host.kind-setup .cmp-modal { inset: 8px; } }

/* ---- F15: the project home ----
   Four question tiles in a grid, the series and the last three actions
   below. A tile is a card; its question is the caption style, its answer the
   heading style, its basis the tooltip. A tile whose source is not available
   carries `.nc` and its answer is the F6 sentence in the muted ink. */
.t2 .home-tiles { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
@media (min-width: 1100px) { .t2 .home-tiles { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (max-width: 640px) { .t2 .home-tiles { grid-template-columns: minmax(0, 1fr); } }
.t2 .home-tile {
  display: flex; flex-direction: column; gap: 8px; min-width: 0; padding: 16px;
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow-1);
}
.t2 .home-q { font: var(--type-caption); letter-spacing: var(--type-caption-tracking); color: var(--ink-3); }
.t2 .home-a { font: var(--type-heading); letter-spacing: var(--type-heading-tracking); color: var(--ink); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
.t2 .home-a.ok { color: var(--ok); } .t2 .home-a.warn { color: var(--warn); } .t2 .home-a.bad { color: var(--danger); }
.t2 .home-a.nc { color: var(--ink-4); font-weight: var(--weight-medium); }
.t2 .home-n { font: var(--type-caption); letter-spacing: var(--type-caption-tracking); color: var(--ink-4); font-variant-numeric: tabular-nums; }
.t2 .home-link {
  margin-top: auto; align-self: flex-start; padding: 0; border: 0; background: none; cursor: pointer;
  font: var(--type-caption); font-weight: var(--weight-medium); color: var(--link); text-decoration: underline; text-underline-offset: 3px;
}
.t2 .home-link:hover { color: var(--ink); }
.t2 .home-link:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; border-radius: var(--radius-xs); }
/* the three-way bar: one strip, three fills */
.t2 .home-bar { display: flex; height: 8px; border-radius: var(--radius-pill); overflow: hidden; background: var(--line-3); }
.t2 .home-bar .seg { display: block; min-width: 2px; }
.t2 .home-bar .seg.progress, .t2 .home-legend .lg.progress i { background: var(--accent); }
.t2 .home-bar .seg.replan, .t2 .home-legend .lg.replan i { background: var(--warn-dot); }
.t2 .home-bar .seg.unattributed, .t2 .home-legend .lg.unattributed i { background: var(--neutral-dot); }
.t2 .home-legend { display: flex; flex-wrap: wrap; gap: 4px 12px; font: var(--type-caption); color: var(--ink-4); font-variant-numeric: tabular-nums; }
.t2 .home-legend .lg { display: inline-flex; align-items: center; gap: 6px; }
.t2 .home-legend .lg i { display: inline-block; width: 8px; height: 8px; border-radius: 50%; }
.t2 .home-subjects { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 4px; font: var(--type-caption); color: var(--ink-2); }
.t2 .home-subjects li { display: flex; gap: 6px; align-items: baseline; min-width: 0; }
.t2 .home-subjects .mono { font-family: var(--mono); color: var(--ink); flex: none; }
.t2 .home-subjects .home-since { margin-left: auto; color: var(--ink-4); flex: none; }
/* below the tiles */
.t2 .home-below { display: grid; grid-template-columns: minmax(0, 3fr) minmax(0, 2fr); gap: 16px; margin-top: 16px; }
@media (max-width: 900px) { .t2 .home-below { grid-template-columns: minmax(0, 1fr); } }
.t2 .home-below .card + .card { margin-top: 0; }
.t2 .home-spark { display: block; width: 100%; height: 120px; padding: 12px 16px 0; box-sizing: border-box; }
.t2 .home-spark .fc { stroke: var(--accent); stroke-width: 2px; }
.t2 .home-spark .ccd { stroke: var(--danger-dot); stroke-width: 1px; stroke-dasharray: 4 3; }
.t2 .home-spark .dot { fill: var(--accent); }
.t2 .home-spark-foot { display: flex; flex-wrap: wrap; gap: 6px 14px; align-items: center; padding: 8px 16px 14px; font: var(--type-caption); color: var(--ink-4); font-variant-numeric: tabular-nums; }
.t2 .home-spark-foot .lg::before { content: ""; display: inline-block; width: 14px; height: 2px; margin-right: 6px; vertical-align: middle; background: var(--accent); }
.t2 .home-spark-foot .lg.ccd::before { background: var(--danger-dot); height: 1px; }
.t2 .home-spark-foot .home-link { margin-top: 0; margin-left: auto; }
.t2 .home-history .home-link { margin: 0 16px 14px; }
.t2 .home-hist .hi-row { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 12px; padding: 8px 0; border-top: 1px solid var(--line-2); }
.t2 .home-hist .hi-row:first-child { border-top: 0; padding-top: 0; }

/* ---- F7: why is this late ----
   The find box and its shortcut chips, the head's facts, three tabs, the
   tornado (an SVG whose fills are the cause classes above) with its legend,
   and the chain as cards left to right. */
.t2 .why-find { display: flex; flex-direction: column; gap: 8px; margin-bottom: 16px; }
.t2 .why-pick { align-self: flex-start; }
.t2 .why-shortcuts { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.t2 .why-sc-label { font: var(--type-caption); color: var(--ink-4); margin-right: 4px; }
.t2 .why-sc {
  display: inline-flex; align-items: baseline; gap: 6px; padding: 3px 9px; cursor: pointer;
  border: 1px solid var(--line); border-radius: var(--radius-pill); background: var(--surface);
  font: var(--type-caption); color: var(--ink-2);
}
.t2 .why-sc:hover { border-color: var(--control-line); }
.t2 .why-sc.on { border-color: var(--accent); background: var(--accent-tint); color: var(--accent-ink); }
.t2 .why-sc b { font-family: var(--mono); font-weight: var(--weight-medium); color: var(--ink); }
.t2 .why-sc .n { max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.t2 .why-sc .d { font-variant-numeric: tabular-nums; color: var(--danger); }
.t2 .why-head { margin: 0 0 12px; padding: 14px 16px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow-1); }
.t2 .why-title { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
.t2 .why-code { font: var(--type-heading); font-family: var(--mono); color: var(--ink); }
.t2 .why-name { font: var(--type-body); color: var(--ink-2); }
.t2 .why-facts { display: flex; flex-wrap: wrap; gap: 6px 22px; margin-top: 8px; }
.t2 .why-fact { display: inline-flex; flex-direction: column; gap: 2px; }
.t2 .why-fact .k { font: var(--type-caption); color: var(--ink-4); }
.t2 .why-fact .v { font: var(--type-body); font-weight: var(--weight-medium); color: var(--ink); font-variant-numeric: tabular-nums; }
.t2 .why-fact.bad .v { color: var(--danger); } .t2 .why-fact.ok .v { color: var(--ok); }
.t2 .why-tabs { display: flex; align-items: center; gap: 4px; margin: 0 0 10px; border-bottom: 1px solid var(--line-2); }
.t2 .why-tab { padding: 8px 12px; border: 0; background: none; cursor: pointer; font: var(--type-body); color: var(--ink-3); border-bottom: 2px solid transparent; margin-bottom: -1px; }
.t2 .why-tab:hover { color: var(--ink); }
.t2 .why-tab.on { color: var(--ink); font-weight: var(--weight-strong); border-bottom-color: var(--ink); }
.t2 .why-unit { display: inline-flex; margin-left: 12px; border: 1px solid var(--line); border-radius: var(--radius-sm); overflow: hidden; }
.t2 .why-u { padding: 3px 10px; border: 0; background: var(--surface); cursor: pointer; font: var(--type-caption); color: var(--ink-3); }
.t2 .why-u.on { background: var(--ink); color: var(--on-accent); }
.t2 .why-dl { margin-left: auto; display: flex; gap: 6px; padding-bottom: 6px; }
.t2 .why-card { padding: 14px 16px; }
.t2 .why-empty { font: var(--type-body); color: var(--ink-3); }
.t2 .why-tornado-wrap { display: grid; grid-template-columns: minmax(0, 1fr) 190px; gap: 16px; }
@media (max-width: 760px) { .t2 .why-tornado-wrap { grid-template-columns: minmax(0, 1fr); } }
.t2 .why-plot { min-width: 0; overflow-x: auto; }
.t2 .why-tornado { display: block; width: 100%; }
.t2 .why-tornado .zero { stroke: var(--ink-4); stroke-width: 1px; }
.t2 .why-tornado .lab { font-family: var(--mono); font-size: var(--type-caption-size); fill: var(--ink-2); }
.t2 .why-tornado .num { font-family: var(--sans); font-size: var(--type-caption-size); fill: var(--ink-3); font-variant-numeric: tabular-nums; }
.t2 .why-tornado .bar { fill: var(--cause-residual); }
.t2 .why-tornado .bar.cause-data-date-push { fill: var(--cause-data-date-push); }
.t2 .why-tornado .bar.cause-unfinished-work { fill: var(--cause-unfinished-work); }
.t2 .why-tornado .bar.cause-actual-dates { fill: var(--cause-actual-dates); }
.t2 .why-tornado .bar.cause-remaining-duration-change { fill: var(--cause-remaining-duration-change); }
.t2 .why-tornado .bar.cause-original-duration-change { fill: var(--cause-original-duration-change); }
.t2 .why-tornado .bar.cause-logic-change { fill: var(--cause-logic-change); }
.t2 .why-tornado .bar.cause-constraint-change { fill: var(--cause-constraint-change); }
.t2 .why-tornado .bar.cause-calendar-change { fill: var(--cause-calendar-change); }
.t2 .why-tornado .bar.cause-mixed { fill: var(--cause-mixed); }
.t2 .why-tornado .bar.cause-residual { fill: var(--cause-residual); }
.t2 .why-tornado .why-row.clickable { cursor: pointer; }
.t2 .why-tornado .why-row.clickable:hover .bar, .t2 .why-tornado .why-row.clickable:focus .bar { filter: brightness(.88); }
.t2 .why-tornado .why-row:focus { outline: none; }
.t2 .why-tornado .why-row:focus-visible .bar { stroke: var(--focus); stroke-width: 2px; }
.t2 .why-legend { align-self: start; padding: 4px 0 0 12px; border-left: 1px solid var(--line-2); }
.t2 .why-lg-h { font: var(--type-caption); font-weight: var(--weight-strong); color: var(--ink-4); margin-bottom: 6px; }
.t2 .why-lg { display: flex; align-items: center; gap: 6px; font: var(--type-caption); color: var(--ink-2); padding: 2px 0; }
.t2 .why-sum { margin-top: 12px; font: var(--type-caption); color: var(--ink-3); font-variant-numeric: tabular-nums; }
.t2 .why-warn { color: var(--warn); }
.t2 .why-note { margin-top: 8px; font: var(--type-caption); color: var(--ink-4); }
.t2 .why-chain { display: flex; align-items: flex-start; gap: 8px; overflow-x: auto; padding: 4px 0 8px; }
.t2 .why-arrow { flex: none; align-self: center; color: var(--ink-5); }
.t2 .why-ccard {
  flex: none; width: 200px; padding: 10px 12px; display: flex; flex-direction: column; gap: 4px;
  border: 1px solid var(--line); border-radius: var(--radius-md); background: var(--surface);
}
.t2 .why-ccard.flat { opacity: .72; }
.t2 .why-ccard.target { border-color: var(--ink); }
.t2 .why-ccard .top { display: flex; align-items: center; gap: 6px; }
.t2 .why-ccard b { font-family: var(--mono); font-weight: var(--weight-medium); color: var(--ink); }
.t2 .why-ccard .n { font: var(--type-caption); color: var(--ink-3); overflow-wrap: anywhere; }
.t2 .why-ccard .d { font: var(--type-body); font-weight: var(--weight-medium); color: var(--ink); font-variant-numeric: tabular-nums; }
.t2 .why-ccard .d.bad { color: var(--danger); } .t2 .why-ccard .d.ok { color: var(--ok); }
.t2 .why-more, .t2 .why-look { align-self: flex-start; padding: 0; border: 0; background: none; cursor: pointer; font: var(--type-caption); font-weight: var(--weight-medium); color: var(--link); text-decoration: underline; text-underline-offset: 3px; }
.t2 .why-sentence { display: none; font: var(--type-caption); color: var(--ink-2); line-height: var(--leading-relaxed); }
.t2 .why-ccard.open .why-sentence { display: block; }
.t2 .actp-why { margin-left: auto; }

/* ---- F8: changes across versions ----
   A wide table: the activity column fixed, one column per version with the
   value above and the change beneath, the total at the right. Later is
   red, earlier green; unchanged cells are muted; a version without the
   activity is a blank, not a zero. */
.t2 .vt-card { padding: 14px 16px; }
.t2 .vt-head { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }
.t2 .vt-head .btn { margin-left: auto; }
.t2 .vt-metrics { display: inline-flex; border: 1px solid var(--line); border-radius: var(--radius-sm); overflow: hidden; }
.t2 .vt-m { padding: 5px 12px; border: 0; background: var(--surface); cursor: pointer; font: var(--type-caption); color: var(--ink-3); }
.t2 .vt-m + .vt-m { border-left: 1px solid var(--line); }
.t2 .vt-m.on { background: var(--ink); color: var(--on-accent); }
.t2 .vt-filters { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-bottom: 10px; }
.t2 .vt-filters input[type="search"] { width: 200px; padding: 5px 9px; border: 1px solid var(--input-line); border-radius: var(--radius-sm); font: var(--type-caption); color: var(--ink); background: var(--surface); }
.t2 .vt-filters input[type="search"]:focus-visible { outline: 0; border-color: var(--focus); box-shadow: var(--ring); }
.t2 .vt-default { margin: 0 0 10px; }
.t2 .vt-wrap { overflow-x: auto; }
.t2 table.vt { min-width: 100%; }
.t2 table.vt th { white-space: nowrap; vertical-align: bottom; }
.t2 table.vt th.vt-ver .vl { font: var(--type-caption); font-weight: var(--weight-strong); color: var(--ink); }
.t2 table.vt th.vt-ver .vd { font: var(--type-caption); color: var(--ink-4); font-variant-numeric: tabular-nums; }
.t2 table.vt .vt-act { position: sticky; left: 0; background: var(--surface); min-width: 220px; max-width: 320px; }
.t2 table.vt td.vt-act b { font-family: var(--mono); font-weight: var(--weight-medium); color: var(--ink); margin-right: 6px; }
.t2 table.vt td.vt-act .n { font: var(--type-caption); color: var(--ink-3); }
.t2 table.vt td.vt-act .chip { margin-left: 6px; }
.t2 table.vt td.vt-cell { white-space: nowrap; font-variant-numeric: tabular-nums; }
.t2 table.vt td.vt-cell .v { display: block; font: var(--type-caption); color: var(--ink); }
.t2 table.vt td.vt-cell .d { display: block; font: var(--type-caption); color: var(--ink-4); }
.t2 table.vt td.vt-cell .d.bad { color: var(--danger); font-weight: var(--weight-medium); }
.t2 table.vt td.vt-cell .d.good { color: var(--ok); font-weight: var(--weight-medium); }
.t2 table.vt td.vt-cell.same .v { color: var(--ink-4); }
.t2 table.vt td.vt-cell.absent .v { color: var(--ink-5); font-style: italic; }
.t2 table.vt td.vt-total { text-align: right; font: var(--type-caption); font-weight: var(--weight-strong); font-variant-numeric: tabular-nums; white-space: nowrap; }
.t2 table.vt td.vt-total.bad { color: var(--danger); } .t2 table.vt td.vt-total.good { color: var(--ok); }
.t2 table.vt td.needs-review { background: var(--component-color-fff8f2); }
.t2 table.vt .vt-review { display: block; margin-top: 3px; color: var(--ink-3); font: var(--type-caption); }
.t2 table.vt tr.vt-row { cursor: pointer; }
.t2 table.vt tr.vt-row:hover td { background: var(--surface-3); }
.t2 table.vt tr.vt-row:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
.t2 .vt-foot { display: flex; flex-wrap: wrap; gap: 6px 16px; margin-top: 10px; }
.t2 .vt-note { font: var(--type-caption); color: var(--ink-4); }
.t2 .vt-empty { margin-top: 8px; }
.t2 .vt-host .vt-metrics { margin-bottom: 10px; }

/* ---- F9: milestone lines on Trends ----
   The chart on the left, the table beside it; the two fixed lines have
   their own colours, added lines take the series tokens in order. */
.t2 .tl-card .card-head { flex-wrap: wrap; gap: 8px; }
.t2 .tl-acts { margin-left: auto; display: flex; gap: 6px; }
.t2 .tl-body { display: grid; grid-template-columns: minmax(0, 3fr) minmax(320px, 2fr); gap: 16px; align-items: start; }
@media (max-width: 1000px) { .t2 .tl-body { grid-template-columns: minmax(0, 1fr); } }
.t2 .tl-plot { min-width: 0; }
.t2 .tl-chart { display: block; width: 100%; height: auto; }
.t2 .tl-chart .grid { stroke: var(--line-2); stroke-width: 1px; }
.t2 .tl-chart .tick { stroke: var(--ink-5); stroke-width: 1px; }
.t2 .tl-chart .ylab, .t2 .tl-chart .xlab, .t2 .tl-chart .xdate { font-family: var(--sans); font-size: var(--type-caption-size); fill: var(--ink-4); font-variant-numeric: tabular-nums; }
.t2 .tl-chart .xlab { fill: var(--ink-2); font-weight: var(--weight-medium); }
.t2 .tl-chart .xlab.stale { fill: var(--warn); }
.t2 .tl-chart .ln { stroke-width: 2px; }
.t2 .tl-chart .dot { stroke: var(--surface); stroke-width: 1.5px; }
.t2 .tl-completion .ln, .t2 .tl-swatch.tl-completion { stroke: var(--ink); background: var(--ink); }
.t2 .tl-completion .dot { fill: var(--ink); }
.t2 .tl-ccd .ln { stroke: var(--danger-dot); stroke-dasharray: 5 4; stroke-width: 1.5px; }
.t2 .tl-ccd .dot { fill: var(--danger-dot); }
.t2 .tl-swatch.tl-ccd { background: var(--danger-dot); }
.t2 .tl-s1 .ln { stroke: var(--series-1); } .t2 .tl-s1 .dot, .t2 .tl-swatch.tl-s1 { fill: var(--series-1); background: var(--series-1); }
.t2 .tl-s2 .ln { stroke: var(--series-2); } .t2 .tl-s2 .dot, .t2 .tl-swatch.tl-s2 { fill: var(--series-2); background: var(--series-2); }
.t2 .tl-s3 .ln { stroke: var(--series-3); } .t2 .tl-s3 .dot, .t2 .tl-swatch.tl-s3 { fill: var(--series-3); background: var(--series-3); }
.t2 .tl-s4 .ln { stroke: var(--series-4); } .t2 .tl-s4 .dot, .t2 .tl-swatch.tl-s4 { fill: var(--series-4); background: var(--series-4); }
.t2 .tl-s5 .ln { stroke: var(--series-5); } .t2 .tl-s5 .dot, .t2 .tl-swatch.tl-s5 { fill: var(--series-5); background: var(--series-5); }
.t2 .tl-s6 .ln { stroke: var(--series-6); } .t2 .tl-s6 .dot, .t2 .tl-swatch.tl-s6 { fill: var(--series-6); background: var(--series-6); }
.t2 .tl-s7 .ln { stroke: var(--series-7); } .t2 .tl-s7 .dot, .t2 .tl-swatch.tl-s7 { fill: var(--series-7); background: var(--series-7); }
.t2 .tl-s8 .ln { stroke: var(--series-8); } .t2 .tl-s8 .dot, .t2 .tl-swatch.tl-s8 { fill: var(--series-8); background: var(--series-8); }
.t2 .tl-swatch { display: inline-block; width: 10px; height: 10px; border-radius: 2px; margin-right: 6px; vertical-align: -1px; }
.t2 .tl-table { width: 100%; table-layout: auto; }
.t2 .tl-table td, .t2 .tl-table th { padding-left: 8px; padding-right: 8px; }
.t2 .tl-table td.tl-name { min-width: 0; overflow-wrap: anywhere; }
.t2 .tl-table td.tl-name b { font-weight: var(--weight-medium); color: var(--ink); }
.t2 .tl-table td.tl-name b.mono { font-family: var(--mono); }
.t2 .tl-table td.tl-name .n { display: block; font: var(--type-caption); color: var(--ink-3); }
.t2 .tl-table td.tl-name .n.warn { color: var(--warn); }
.t2 .tl-table tr.hidden-line td { color: var(--ink-5); }
.t2 .tl-table tr.hidden-line .tl-swatch { opacity: .35; }
.t2 .tl-table td.tl-ctl, .t2 .tl-table th.tl-ctl { text-align: right; white-space: nowrap; }
.t2 .tl-eye, .t2 .tl-x { padding: 2px 5px; border: 1px solid var(--line); border-radius: var(--radius-xs); background: var(--surface); cursor: pointer; font: var(--type-caption); color: var(--ink-3); }
.t2 .tl-eye:hover, .t2 .tl-x:hover { border-color: var(--control-line); color: var(--ink); }
.t2 .tl-eye[aria-pressed="true"] { background: var(--ink); color: var(--on-accent); border-color: var(--ink); }
.t2 .tl-x { margin-left: 4px; }
.t2 .tl-fixed { font: var(--type-caption); color: var(--ink-5); }
.t2 .tl-pick .row { display: flex; align-items: center; gap: 8px; }
.t2 .tl-pick .row input { margin: 0; }
.t2 .tl-pick .row.on { background: var(--accent-tint); }
.t2 .tl-pick-foot { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-top: 1px solid var(--line-2); }
.t2 .tl-pick-foot .btn { margin-left: auto; }

/* ---- F10: health ----
   The check list on the left, the activities on the right; the panel has
   its own WBS tree beside the table. States are chips; a check with
   nothing to list is not a button that opens nothing. */
.t2 .hl-grid { display: grid; grid-template-columns: minmax(300px, 2fr) minmax(0, 3fr); gap: 16px; align-items: start; }
@media (max-width: 960px) { .t2 .hl-grid { grid-template-columns: minmax(0, 1fr); } }
.t2 .hl-card { padding: 8px; }
.t2 .hl-left { max-height: calc(100vh - 220px); overflow-y: auto; }
.t2 .hl-group + .hl-group { margin-top: 10px; }
.t2 .hl-gh { display: flex; align-items: baseline; gap: 8px; padding: 6px 8px 4px; }
.t2 .hl-gh .t { font: var(--type-caption); font-weight: var(--weight-strong); color: var(--ink-3); text-transform: uppercase; letter-spacing: .06em; }
.t2 .hl-gh .n { font: var(--type-caption); color: var(--ink-4); margin-left: auto; }
.t2 .hl-row { display: block; width: 100%; text-align: left; padding: 7px 8px; border: 0; border-radius: var(--radius-sm); background: none; cursor: pointer; font: var(--type-body); color: var(--ink); }
.t2 .hl-row:hover { background: var(--hover-wash); }
.t2 .hl-row.on { background: var(--accent-tint); }
.t2 .hl-row:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
.t2 .hl-row .top { display: flex; align-items: center; gap: 8px; }
.t2 .hl-row .num { font-family: var(--mono); color: var(--ink-4); width: 20px; flex: none; }
.t2 .hl-row .title { flex: 1 1 auto; min-width: 0; }
.t2 .hl-row .chip { flex: none; }
.t2 .hl-row .sub { display: flex; flex-wrap: wrap; gap: 4px 12px; margin-top: 2px; padding-left: 0; font: var(--type-caption); color: var(--ink-4); font-variant-numeric: tabular-nums; }
.t2 .hl-row .sub .c { color: var(--ink-2); font-weight: var(--weight-medium); }
.t2 .hl-row .sub .why { color: var(--ink-4); }
.t2 .hl-review-note { margin-top: 6px; font: var(--type-caption); line-height: var(--leading-relaxed); color: var(--ink-2); }
.t2 .hl-finding { padding: 12px 10px; font: var(--type-body); color: var(--ink-2); }
.t2 .hl-finding + .hl-finding { border-top: 1px solid var(--line-2); }
.t2 .hl-finding .title { font-weight: var(--weight-strong); }
.t2 .hl-finding p { margin: 6px 0 0; line-height: var(--leading-relaxed); white-space: pre-line; }
.t2 .hl-empty { padding: 14px 10px; font: var(--type-body); color: var(--ink-3); }
.t2 .hl-ph { padding: 8px 10px 10px; border-bottom: 1px solid var(--line-2); }
.t2 .hl-ph .t { font: var(--type-heading); color: var(--ink); }
.t2 .hl-ph .s { font: var(--type-caption); color: var(--ink-4); margin-top: 2px; }
.t2 .hl-ph .b { font: var(--type-caption); color: var(--ink-3); margin-top: 6px; line-height: var(--leading-relaxed); }
.t2 .hl-pb { display: grid; grid-template-columns: minmax(160px, 220px) minmax(0, 1fr); gap: 12px; padding-top: 8px; }
@media (max-width: 700px) { .t2 .hl-pb { grid-template-columns: minmax(0, 1fr); } }
.t2 .hl-side { border-right: 1px solid var(--line-2); padding-right: 8px; min-width: 0; }
.t2 .hl-sh { font: var(--type-caption); font-weight: var(--weight-strong); color: var(--ink-4); padding: 4px 8px; }
.t2 .hl-tree { list-style: none; margin: 0; padding: 0; }
.t2 .hl-node { display: flex; align-items: center; gap: 6px; width: 100%; text-align: left; padding: 4px 8px 4px calc(8px + var(--depth, 0) * 12px); border: 0; border-radius: var(--radius-xs); background: none; cursor: pointer; font: var(--type-caption); color: var(--ink-2); }
.t2 .hl-node .nm { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.t2 .hl-node .ct { flex: none; font-variant-numeric: tabular-nums; color: var(--ink-4); }
.t2 .hl-node:hover { background: var(--hover-wash); }
.t2 .hl-node.on { background: var(--accent-tint); color: var(--accent-ink); }
.t2 .hl-tw { min-width: 0; overflow-x: auto; }
.t2 .hl-table td.mono { font-family: var(--mono); }
.t2 .hl-table td .hl-wbs { display: block; font: var(--type-caption); color: var(--ink-4); }
.t2 .hl-table td.v { font-weight: var(--weight-medium); color: var(--ink); }
.t2 .hl-table tr.hl-act { cursor: pointer; }
.t2 .hl-table tr.hl-act:hover td { background: var(--surface-3); }
.t2 .hl-table tr.hl-act:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
.t2 .hl-basis { margin-top: 12px; }

/* ---- F11: progress ----
   Header numbers, the WBS tree on the left, two charts on the right. The
   actual line is bold, the forecast thin, the baseline the warm tone. */
.t2 .pg-head { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 12px; margin-bottom: 16px; }
.t2 .pg-num { padding: 12px 14px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow-1); }
.t2 .pg-num .k { font: var(--type-caption); color: var(--ink-4); }
.t2 .pg-num .v { font: var(--type-heading); color: var(--ink); font-variant-numeric: tabular-nums; margin-top: 2px; overflow-wrap: anywhere; }
.t2 .pg-num.bad .v { color: var(--danger); } .t2 .pg-num.ok .v { color: var(--ok); }
.t2 .pg-num .n { font: var(--type-caption); color: var(--ink-4); font-style: italic; margin-top: 2px; }
.t2 .pg-grid { display: grid; grid-template-columns: minmax(220px, 280px) minmax(0, 1fr); gap: 16px; align-items: start; }
@media (max-width: 900px) { .t2 .pg-grid { grid-template-columns: minmax(0, 1fr); } }
.t2 .pg-card { padding: 8px; }
.t2 .pg-side { max-height: calc(100vh - 300px); overflow-y: auto; }
.t2 .pg-sh { font: var(--type-caption); font-weight: var(--weight-strong); color: var(--ink-4); padding: 6px 8px; }
.t2 .pg-tree { list-style: none; margin: 0; padding: 0; }
.t2 .pg-node { display: flex; align-items: center; gap: 6px; width: 100%; text-align: left; padding: 4px 8px 4px calc(8px + var(--depth, 0) * 12px); border: 0; border-radius: var(--radius-xs); background: none; cursor: pointer; font: var(--type-caption); color: var(--ink-2); }
.t2 .pg-node .nm { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.t2 .pg-node .pc { flex: none; font-variant-numeric: tabular-nums; color: var(--ink-3); }
.t2 .pg-node:hover { background: var(--hover-wash); }
.t2 .pg-node.on { background: var(--accent-tint); color: var(--accent-ink); }
.t2 .pg-main .card + .card { margin-top: 16px; }
.t2 .pg-card .card-head .btn { margin-left: auto; }
.t2 .pg-plot { padding: 8px 8px 0; }
.t2 .pg-curve, .t2 .pg-perday { display: block; width: 100%; height: auto; }
.t2 .pg-curve .grid, .t2 .pg-perday .grid { stroke: var(--line-2); stroke-width: 1px; }
.t2 .pg-curve .ylab, .t2 .pg-curve .xlab, .t2 .pg-perday .ylab { font-family: var(--sans); font-size: var(--type-caption-size); fill: var(--ink-4); font-variant-numeric: tabular-nums; }
.t2 .pg-curve .ln.baseline, .t2 .pg-legend .lg.baseline i { stroke: var(--warn-dot); stroke-width: 1.5px; background: var(--warn-dot); }
.t2 .pg-curve .ln.plan, .t2 .pg-legend .lg.plan i { stroke: var(--ink-3); stroke-width: 1.5px; background: var(--ink-3); }
.t2 .pg-curve .ln.forecast, .t2 .pg-legend .lg.forecast i { stroke: var(--ink-4); stroke-width: 1px; stroke-dasharray: 4 3; background: var(--ink-4); }
.t2 .pg-curve .ln.actual, .t2 .pg-legend .lg.actual i { stroke: var(--accent); stroke-width: 3px; background: var(--accent); }
.t2 .pg-curve .dd, .t2 .pg-perday .dd { stroke: var(--danger-dot); stroke-width: 1px; stroke-dasharray: 3 3; }
.t2 .pg-curve .ddlab { font-family: var(--sans); font-size: var(--type-caption-size); fill: var(--danger); }
.t2 .pg-perday .ln.planned, .t2 .pg-legend .lg.planned i { stroke: var(--ink-4); stroke-width: 1.5px; background: var(--ink-4); }
.t2 .pg-perday .ln.actual, .t2 .pg-legend .lg.actual i { stroke: var(--accent); stroke-width: 2px; background: var(--accent); }
.t2 .pg-legend { display: flex; flex-wrap: wrap; gap: 6px 16px; padding: 8px 10px 4px; font: var(--type-caption); color: var(--ink-3); }
.t2 .pg-legend .lg { display: inline-flex; align-items: center; gap: 6px; }
.t2 .pg-legend .lg i { display: inline-block; width: 14px; height: 3px; border-radius: 2px; }
.t2 .pg-legend .lg.none { color: var(--ink-4); font-style: italic; }
.t2 .pg-empty { padding: 14px 10px; font: var(--type-body); color: var(--ink-3); }

/* ---- F12: timeline ----
   Names and columns on the left, the bars in a scrolling canvas on the
   right, rows aligned by one height. Status is the fill; the longest-path
   mark is a red stub at the bar's left; a driving link is an elbow with an
   arrow head. Printing keeps the current view and drops the chrome. */
.t2 .gt-card { padding: 10px; }
.t2 .gt-bar-controls { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 14px; padding: 2px 4px 10px; border-bottom: 1px solid var(--line-2); }
.t2 .gt-seg { display: inline-flex; border: 1px solid var(--line); border-radius: var(--radius-sm); overflow: hidden; }
.t2 .gt-f { padding: 5px 11px; border: 0; background: var(--surface); cursor: pointer; font: var(--type-caption); color: var(--ink-3); }
.t2 .gt-f + .gt-f { border-left: 1px solid var(--line); }
.t2 .gt-f.on { background: var(--ink); color: var(--on-accent); }
.t2 .gt-lines { display: inline-flex; align-items: center; gap: 8px; font: var(--type-caption); color: var(--ink-2); }
.t2 .gt-zoom { padding: 4px 8px; }
.t2 .gt-cols { display: inline-flex; flex-wrap: wrap; gap: 4px 12px; }
.t2 .gt-col { display: inline-flex; align-items: center; gap: 5px; font: var(--type-caption); color: var(--ink-3); }
.t2 .gt-col input { margin: 0; }
.t2 .gt-ex { margin-left: auto; display: flex; gap: 6px; }
.t2 .gt-body { display: grid; grid-template-columns: minmax(280px, 420px) minmax(0, 1fr); align-items: start; }
.t2 .gt-names { border-right: 1px solid var(--line); min-width: 0; }
.t2 .gt-nh, .t2 .gt-row, .t2 .gt-wbs { display: flex; align-items: center; height: 26px; box-sizing: border-box; border-bottom: 1px solid var(--line-3); font: var(--type-caption); }
.t2 .gt-nh { height: 28px; color: var(--ink-4); font-weight: var(--weight-strong); }
.t2 .gt-nh .c, .t2 .gt-row .c { padding: 0 6px; }
.t2 .gt-nh .nm, .t2 .gt-row .nm { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding-left: calc(6px + var(--depth, 0) * 12px); }
.t2 .gt-nh .num, .t2 .gt-row .num { flex: none; width: 58px; text-align: right; font-variant-numeric: tabular-nums; color: var(--ink-3); }
.t2 .gt-row .num.bad { color: var(--danger); } .t2 .gt-row .num.good { color: var(--ok); }
.t2 .gt-row .nm b { font-family: var(--mono); font-weight: var(--weight-medium); color: var(--ink); margin-right: 6px; }
.t2 .gt-row .nm .n { color: var(--ink-2); }
.t2 .gt-row.on { background: var(--accent-tint); }
.t2 .gt-wbs { width: 100%; text-align: left; border: 0; border-bottom: 1px solid var(--line-3); background: var(--surface-3); cursor: pointer; color: var(--ink); font-weight: var(--weight-strong); padding-left: calc(6px + var(--depth, 0) * 12px); gap: 6px; }
.t2 .gt-wbs .tw { color: var(--ink-4); width: 10px; }
.t2 .gt-scroll { overflow-x: auto; min-width: 0; }
.t2 .gt-canvas { display: block; }
.t2 .gt-canvas .gt-grid { stroke: var(--line-3); stroke-width: 1px; }
.t2 .gt-canvas .gt-tick { font-family: var(--sans); font-size: var(--type-caption-size); fill: var(--ink-4); }
.t2 .gt-canvas .gt-wbsband { fill: var(--surface-3); }
.t2 .gt-canvas .gt-bar { cursor: pointer; }
.t2 .gt-canvas .gt-bar .bar { fill: var(--line); }
.t2 .gt-canvas .gt-bar .done { fill: var(--accent); opacity: .85; }
.t2 .gt-canvas .gt-bar.ms .bar { fill: var(--ink); }
.t2 .gt-canvas .gt-bar .crit { fill: var(--danger-dot); }
.t2 .gt-canvas .gt-bar:hover .bar, .t2 .gt-canvas .gt-bar.on .bar { stroke: var(--ink); stroke-width: 1.5px; }
.t2 .gt-canvas .gt-bar:focus { outline: none; }
.t2 .gt-canvas .gt-bar:focus-visible .bar { stroke: var(--focus); stroke-width: 2px; }
.t2 .gt-canvas .gt-link { stroke: var(--danger-dot); stroke-width: 1.2px; }
.t2 .gt-canvas .gt-arrow { fill: var(--danger-dot); }
.t2 .gt-canvas .gt-dd { stroke: var(--danger-dot); stroke-width: 1px; stroke-dasharray: 3 3; }
.t2 .gt-canvas .gt-ddlab { font-family: var(--sans); font-size: var(--type-caption-size); fill: var(--danger); }
.t2 .gt-legend { display: flex; flex-wrap: wrap; gap: 6px 16px; align-items: center; padding: 10px 4px 2px; font: var(--type-caption); color: var(--ink-3); }
.t2 .gt-legend .lg { display: inline-flex; align-items: center; gap: 6px; }
.t2 .gt-legend .lg i { display: inline-block; width: 14px; height: 10px; border-radius: 2px; background: var(--line); }
.t2 .gt-legend .lg.critical i { width: 3px; background: var(--danger-dot); }
.t2 .gt-legend .lg.link i { height: 2px; background: var(--danger-dot); }
.t2 .gt-legend .n { margin-left: auto; color: var(--ink-4); }
.t2 .gt-empty { padding: 14px 10px; font: var(--type-body); color: var(--ink-3); }
@media print {
  /* F12: the PDF is the current view -- this filter, this zoom -- and nothing else on the page */
  body:has(.timeline-screen) .sidebar, body:has(.timeline-screen) .topbar, body:has(.timeline-screen) .gt-bar-controls,
  body:has(.timeline-screen) .chat-launch, body:has(.timeline-screen) .next-strip { display: none !important; }
  body:has(.timeline-screen) .gt-scroll { overflow: visible; }
  body:has(.timeline-screen) .gt-body { grid-template-columns: 320px auto; }
}

/* ---- F13: threads on findings ----
   Messages with author, role and time; a composer whose @ opens a menu of
   project members; a mention chip in the text. Sits under a finding in
   the review queue and in F3's findings list. */
.th-host { margin-top: 12px; border-top: 1px solid var(--line-2); padding-top: 10px; }
.th-head { display: flex; align-items: baseline; gap: 10px; margin-bottom: 6px; }
.th-head .k { font: var(--type-caption); font-weight: var(--weight-strong); color: var(--ink); }
.th-head .n { font: var(--type-caption); color: var(--ink-4); }
.th-list { display: flex; flex-direction: column; gap: 8px; }
.th-empty { font: var(--type-caption); color: var(--ink-3); padding: 4px 0; }
.th-msg { padding: 8px 10px; border: 1px solid var(--line-2); border-radius: var(--radius-md); background: var(--surface); }
.th-msg.contractor { border-left: 3px solid var(--warn-dot); }
.th-mh { display: flex; gap: 8px; align-items: baseline; font: var(--type-caption); margin-bottom: 3px; }
.th-mh b { color: var(--ink); font-weight: var(--weight-strong); }
.th-mh .role { color: var(--ink-4); }
.th-mh .at { margin-left: auto; color: var(--ink-4); font-variant-numeric: tabular-nums; }
.th-body { font: var(--type-body); line-height: var(--leading-relaxed); color: var(--ink-2); white-space: pre-wrap; overflow-wrap: anywhere; }
.th-mention { color: var(--accent); font-weight: var(--weight-strong); }
.th-form { position: relative; margin-top: 8px; }
.th-input { width: 100%; box-sizing: border-box; padding: 7px 9px; border: 1px solid var(--input-line); border-radius: var(--radius-sm); font: var(--type-body); color: var(--ink); resize: vertical; }
.th-input:focus-visible { outline: 0; border-color: var(--focus); box-shadow: var(--ring); }
.th-menu { position: absolute; left: 0; top: 100%; z-index: 30; min-width: 220px; margin-top: -30px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-md); box-shadow: var(--shadow-3); padding: 4px; }
.th-cand { display: flex; gap: 8px; align-items: baseline; width: 100%; text-align: left; padding: 6px 8px; border: 0; background: none; border-radius: var(--radius-sm); cursor: pointer; font: var(--type-caption); color: var(--ink); }
.th-cand b { font-weight: var(--weight-strong); }
.th-cand .r { color: var(--ink-4); }
.th-cand.on, .th-cand:hover { background: var(--accent-tint); }
.th-chips { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; }
.th-chip { display: inline-flex; align-items: center; gap: 4px; padding: 1px 6px; border-radius: var(--radius-pill); background: var(--accent-tint); color: var(--accent-ink); font: var(--type-caption); }
.th-chip .x { border: 0; background: none; cursor: pointer; font: var(--type-caption); color: inherit; padding: 0; }
.th-foot { display: flex; align-items: center; gap: 10px; margin-top: 6px; }
.th-foot .hint { margin: 0; }
.actp-findings { flex-direction: column; align-items: stretch; }
.actp-frow { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.actp-frow .th-host { flex-basis: 100%; }

/* ---- F14: Ask — steps panel, sourced figures, scope line, the switch ---- */
.ai-scope {
  margin: 0 0 10px; padding: 6px 10px; font: var(--type-caption); color: var(--ink-3);
  background: var(--surface-2); border: 1px solid var(--line-3); border-radius: var(--radius-sm);
}
.ai-scope[hidden] { display: none; }
.ai-stepsdone {
  margin: 0 0 10px; border: 1px solid var(--line-2); border-radius: var(--radius-sm);
  background: var(--surface-2); font: var(--type-caption); color: var(--ink-3);
}
.ai-stepsdone > summary {
  display: flex; align-items: center; gap: 8px; padding: 6px 10px; cursor: pointer;
  list-style: none; color: var(--ink-2); font-weight: var(--weight-strong);
}
.ai-stepsdone > summary::-webkit-details-marker { display: none; }
.ai-stepsdone > summary::before {
  content: ""; width: 6px; height: 6px; border-right: 1px solid var(--ink-4); border-bottom: 1px solid var(--ink-4);
  transform: rotate(-45deg); transition: transform 140ms var(--ease); flex: none;
}
.ai-stepsdone[open] > summary::before { transform: rotate(45deg); }
.ai-stepsdone > summary .n { font-family: var(--mono); color: var(--ink-4); font-weight: var(--weight-regular); }
.ai-stepsdone > summary .warn { margin-left: auto; color: var(--sev-high); font-weight: var(--weight-regular); }
.ai-stepsdone .ai-steps { margin: 0; padding: 2px 10px 8px; }
.ai-stepsdone .ai-steps .t { color: var(--ink-4); }
.ai-stepsdone .ai-steps .s.note { color: var(--ink-5); margin-top: 4px; }
.ai-stepsdone .ai-steps .s.note .d, .ai-stepsdone .ai-steps .s.none .d { display: none; }
.ai-stepsdone .ai-steps .s:last-child .d { background: var(--ink-5); }
.ai-src {
  color: var(--ink); text-decoration: underline; text-decoration-color: var(--line);
  text-underline-offset: 2px; cursor: pointer;
}
.ai-src:hover { text-decoration-color: var(--ink); }
.ai-src.code { font-family: var(--mono); }
.ai-nosrc {
  font: var(--type-caption); font-style: italic; color: var(--ink-4);
  border-bottom: 1px dotted var(--ink-5); cursor: help;
}
.st-switch { display: inline-flex; align-items: center; gap: 8px; font: var(--type-body); color: var(--ink-2); cursor: pointer; }
.st-switch input { margin: 0; }
.t2 .actp-ask { margin-left: 6px; }
.tm-ask { margin-left: 8px; }
.st-ask { margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--line-2); }

/* ---- F10b: Health — configure any check ---- */
.t2 .hl-line { display: flex; align-items: flex-start; gap: 4px; }
.t2 .hl-line .hl-row { flex: 1 1 auto; min-width: 0; }
.t2 .hl-gear {
  flex: none; margin-top: 6px; width: 26px; height: 26px; padding: 0; border: 0; border-radius: var(--radius-sm);
  background: none; color: var(--ink-4); font: var(--type-body); cursor: pointer; line-height: 1;
}
.t2 .hl-gear:hover { background: var(--hover-wash); color: var(--ink); }
.t2 .hl-gear:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
.t2 .hl-hidden { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; padding: 6px 8px 8px; font: var(--type-caption); color: var(--ink-4); }
.t2 .hl-hidden .n { color: var(--ink-3); }
.t2 .hl-unhide {
  padding: 1px 8px; border: 1px solid var(--line-2); border-radius: var(--radius-xs); background: var(--surface);
  font: var(--type-caption); color: var(--ink-3); cursor: pointer;
}
.t2 .hl-unhide:hover { color: var(--ink); border-color: var(--ink-5); }
.hl-cfg-host { position: fixed; inset: 0; z-index: 160; display: flex; align-items: center; justify-content: center; background: var(--scrim); }
.hl-cfg {
  width: min(560px, calc(100vw - 32px)); max-height: calc(100vh - 48px); display: flex; flex-direction: column;
  background: var(--surface); border: 1px solid var(--line-2); border-radius: var(--radius-md); box-shadow: var(--shadow-4);
  color: var(--ink);
}
.hl-cfg-h { position: relative; padding: 14px 44px 10px 18px; border-bottom: 1px solid var(--line-2); }
.hl-cfg-h .k { font: var(--type-caption); text-transform: uppercase; letter-spacing: .06em; color: var(--ink-4); }
.hl-cfg-h .t { font: var(--type-title); color: var(--ink); margin-top: 2px; }
.hl-cfg-h .s { font: var(--type-caption); color: var(--ink-4); margin-top: 2px; }
.hl-cfg-x { position: absolute; top: 10px; right: 10px; width: 28px; height: 28px; border: 0; background: none; color: var(--ink-4); cursor: pointer; border-radius: var(--radius-sm); font: var(--type-body); }
.hl-cfg-x:hover { background: var(--hover-wash); color: var(--ink); }
.hl-cfg-b { padding: 8px 18px 12px; overflow: auto; }
.hl-cfg-k { margin-top: 12px; font: var(--type-caption); font-weight: var(--weight-strong); text-transform: uppercase; letter-spacing: .06em; color: var(--ink-3); }
.hl-cfg-row { display: flex; align-items: center; gap: 8px; margin-top: 6px; font: var(--type-body); color: var(--ink-2); cursor: pointer; }
.hl-cfg-row input { margin: 0; }
.hl-cfg-row input:disabled + span { color: var(--ink-4); }
.hl-cfg-method { margin-top: 6px; font: var(--type-body); color: var(--ink-3); }
.hl-cfg-ex { display: grid; grid-template-columns: 1fr 1fr; gap: 2px 14px; }
.hl-cfg-thr { display: flex; align-items: center; gap: 8px; margin-top: 6px; }
.hl-cfg-thr input { width: 110px; padding: 5px 8px; border: 1px solid var(--line-2); border-radius: var(--radius-xs); font: var(--type-body); font-family: var(--mono); color: var(--ink); background: var(--surface); }
.hl-cfg-thr input:focus { outline: none; border-color: var(--focus); box-shadow: var(--ring); }
.hl-cfg-thr .u { font: var(--type-caption); color: var(--ink-4); }
.hl-cfg-reason { width: 100%; margin-top: 6px; padding: 6px 8px; border: 1px solid var(--line-2); border-radius: var(--radius-xs); font: var(--type-body); color: var(--ink); background: var(--surface); resize: vertical; }
.hl-cfg-reason:focus { outline: none; border-color: var(--focus); box-shadow: var(--ring); }
.hl-cfg-b .hint { margin-top: 4px; }
.hl-cfg-f { display: flex; align-items: center; gap: 8px; padding: 10px 18px 14px; border-top: 1px solid var(--line-2); }
.hl-cfg-f .hint { flex: 1 1 auto; min-width: 0; margin: 0; }
.dcma-hidden-note { padding-top: 0; }

/* F5: what a typed label does to a file's place in the series -- under each
   label on the confirm-import screen, and in the Schedules rename dialog. A
   time-impact file is said plainly; a label that moves a file in or out of
   the monthly series is a warning. */
.np-label-note, .rn-note { margin-top: 4px; font: var(--type-caption); color: var(--ink-4); }
.np-label-note.warn, .rn-note.warn { color: var(--warn); }
.rn-input { width: 100%; height: 34px; padding: 0 10px; font: var(--type-body); color: var(--ink);
  background: var(--surface); border: 1px solid var(--input-line); border-radius: var(--radius-sm); }
.rn-input:focus { outline: none; border-color: var(--focus); box-shadow: var(--ring); }
.rn-note.warn { padding: 6px 8px; background: var(--warn-tint); border: 1px solid var(--warn-line); border-radius: var(--radius-sm); }
.rn-hint { margin-top: 8px; font: var(--type-caption); color: var(--ink-4); }

/* F6: a quality cell with no score says why instead of a dash -- the state on
   one line, what it needs on the next, neither wrapping (the column is sized
   for them), so the row keeps its height. */
.q-none { display: inline-flex; flex-direction: column; align-items: flex-end; text-align: right; }
.q-none .q-state, .q-none .q-why { white-space: nowrap; font: var(--type-caption); }
.q-none .q-state { color: var(--ink-3); }
.q-none .q-why { color: var(--ink-4); }
.q-none .q-link { color: var(--ink-3); text-decoration: underline; }

/* Account security only; reuse the application's modal, field and button theme. */
.mfa-modal { width: 480px; }
.mfa-modal .mfa-intro { margin: 0 0 18px; color: var(--ink-2); line-height: 1.6; }
.mfa-modal .mfa-step { font-size: var(--type-body-size); margin: 18px 0 6px; }
.mfa-modal .mfa-hint { font-size: var(--type-caption-size); color: var(--ink-3); line-height: 1.5; margin: 6px 0; }
.mfa-modal .mfa-qr { display: block; width: 220px; max-width: 100%; height: auto; margin: 14px auto; border: 1px solid var(--line); border-radius: var(--radius-sm); }
.mfa-modal .mfa-qr[hidden] { display: none; }
.mfa-modal .mfa-manual { font-size: var(--type-caption-size); margin: 12px 0 18px; }
.mfa-modal .mfa-manual summary { cursor: pointer; color: var(--ink-2); }
.mfa-modal .mfa-key, .mfa-modal .mfa-backup-codes { white-space: pre-wrap; overflow-wrap: anywhere; padding: 12px; border: 1px solid var(--line); border-radius: var(--radius-sm); background: var(--surface-2); font-family: var(--mono); }
.mfa-modal .field input { font-family: var(--mono); font-size: var(--type-title-size); height: 42px; }
.mfa-modal .mfa-recovery { margin-bottom: 12px; }
.mfa-modal .modal-foot { flex-wrap: wrap; justify-content: flex-end; }

/* Account notice belongs to the main column, beneath the masthead. */
.mfa-reminder.t2 {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px 16px;
  flex: 0 0 auto;
  min-width: 0;
  padding: 10px 24px;
  border-bottom: 1px solid var(--line);
  background: var(--surface-2);
  color: var(--ink-2);
  font-size: var(--type-body-size);
  line-height: var(--type-body-leading);
}
.mfa-reminder.t2 > span { flex: 1 1 240px; overflow-wrap: anywhere; }
.mfa-reminder.t2 > .btn { flex: 0 0 auto; }

/* Owner-controlled support access, using the existing modal theme. */
.support-modal { width: 680px; }
.support-modal p, .support-modal li { overflow-wrap: anywhere; }
.support-modal .msect > .btn { margin: 0 8px 8px 0; }

.support-modal .msect p { margin: 8px 0; }
.support-modal .msect h4 { margin-bottom: 8px; }
/* Comparison destinations use the application page, not a sheet. */
.comparison-page-head { padding: 24px 28px 18px; border-bottom: 1px solid var(--line); flex: none; }
.comparison-page-head h1 { font-size: var(--type-display-size); margin: 0 0 6px; }
.comparison-page-head p { margin: 0; overflow-wrap: anywhere; }
.comparison-page .doc { max-width: 1200px; }
.comparison-page .taskwrap { overflow: hidden; }
.comparison-page .queue { width: 340px; background: var(--surface-3); }
.comparison-page-notices:empty { display: none; }
.t2 .sb-sw-row.skel { height: auto; min-height: 42px; margin: 0; background: none; animation: none; cursor: default; }
@media (max-width: 800px) {
  .comparison-page-head { padding: 18px 16px; }
  .comparison-page .taskwrap { flex-direction: column; overflow-y: auto; }
  .comparison-page .queue { width: 100%; min-height: 240px; max-height: 40vh; }
  .comparison-page .detail { flex: none; overflow: visible; padding: 18px 16px; }
}

.comparison-page-title { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 6px; }
.comparison-page-title h1 { margin-bottom: 0; }

/* Use the same app surfaces and typography as Schedules and Intake. */
.t2.comparison-page .comparison-page-head { background: var(--surface); padding: 24px 28px 18px; }
.t2.comparison-page .doc { max-width: none; padding: 0 0 32px; }
.t2.comparison-page .doc-outer { padding: 20px 28px; }
.t2.comparison-page .doc-verdict { font: var(--type-heading); font-weight: var(--weight-strong); margin: 0 0 8px; }
.t2.comparison-page .doc-lede { font: var(--type-body); color: var(--ink-3); max-width: 90ch; }
.t2.comparison-page .doc-sec { margin-top: 24px; }
.t2.comparison-page .doc-sec-head { border-bottom: 1px solid var(--line); padding-bottom: 10px; }
.t2.comparison-page .doc-sec-head .no { display: none; }
.t2.comparison-page .doc-sec-head h2 { font: var(--type-heading); font-weight: var(--weight-strong); }
.t2.comparison-page .doc-meta { font-family: var(--sans); border: 0; margin: 0; padding: 16px; gap: 16px; }
.t2.comparison-page .doc-meta dt { font-family: var(--sans); text-transform: none; letter-spacing: 0; font-size: var(--type-caption-size); }
.t2.comparison-page .doc-meta dd { font-family: var(--sans); }
.t2.comparison-page .comparison-details { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-md); margin: 16px 0; }
.t2.comparison-page .comparison-details summary { padding: 12px 16px; cursor: pointer; font-weight: var(--weight-strong); }
.t2.comparison-page .comparison-details summary:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.t2.comparison-page .taskwrap { margin: 20px 28px 28px; border: 1px solid var(--line); border-radius: var(--radius-lg); background: var(--surface); }
.t2.comparison-page .queue { background: var(--surface); width: 320px; }
.t2.comparison-page .queue-head { padding: 18px 16px; }
.t2.comparison-page .queue-head h2 { font-size: var(--type-heading-size); }
.t2.comparison-page .detail h2 { font-size: var(--type-title-size); }
.t2.comparison-page .detail .body { font: var(--type-body); line-height: 1.6; }
.t2.comparison-page .queue-sub, .t2.comparison-page .ring-label { font-family: var(--sans); }
@media (max-width: 800px) {
  .t2.comparison-page .comparison-page-head { padding: 18px 16px; }
  .t2.comparison-page .doc-outer { padding: 16px; }
  .t2.comparison-page .taskwrap { margin: 16px; }
  .t2.comparison-page .queue { width: 100%; }
}

.t2.comparison-page .minimap { display: none; }
.t2.comparison-page .glance { border: 1px solid var(--line); border-radius: var(--radius-lg); background: var(--surface); padding: 16px; margin-top: 20px; }
.t2.comparison-page .glance .gl { font-family: var(--sans); text-transform: none; letter-spacing: 0; font-size: var(--type-caption-size); }
.t2.comparison-page .glance .gv { font-family: var(--sans); font-size: var(--type-display-size); }
.t2.comparison-page .comparison-details > .card { margin: 0 16px 16px; }

.t2.comparison-page .comparison-page-notices:not(:empty) { padding: 16px 28px 0; }
.t2.comparison-page .traces-panel > summary { cursor: pointer; font-weight: var(--weight-strong); padding: 4px 0; }

.topbar.t2 .crumbs { flex: 1; }
.topbar.t2 .crumb { max-width: 240px; }
@media (max-width: 800px) {
  .topbar.t2 .crumbs { display: flex; }
  .topbar.t2 .crumbs > .crumb, .topbar.t2 .crumbs > .crumb-sep { display: none; }
}

.t2 .projects-overview { margin-top: 28px; }
.t2 .projects-overview > h2 { margin: 0 0 6px; font: var(--type-heading); font-weight: var(--weight-strong); }
.t2 .projects-overview > p { margin: 0 0 16px; }

.t2 .header-update-selector.sb-update { padding: 0; margin: 0 0 0 6px; flex: 0 1 180px; min-width: 100px; }
.t2 .header-update-selector .sb-upd { background: var(--surface); color: var(--ink); border: 1px solid var(--line); border-radius: var(--radius-sm); min-height: 32px; padding: 5px 8px; }
.t2 .header-update-selector .sb-upd:hover { background: var(--surface-3); }
.t2 .header-update-selector .sb-upd-k, .t2 .header-update-selector .sb-upd-d, .t2 .header-update-selector .sb-upd-ic { display: none; }
.t2 .header-update-selector .sb-upd-n, .t2 .header-update-selector .sb-upd-c { color: var(--ink); }
.rail-min .t2 .header-update-selector .sb-upd-t { display: block; }
.rail-min .t2 .header-update-selector .sb-upd-c { display: block; }
@media (max-width: 800px) {
  .t2 .header-update-selector.sb-update { max-width: 110px; min-width: 70px; }
}

.t2 .comparison-page-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin-top: 16px; position: relative; }

/* Review form: shared control styling, readable text and explicit field labels. */
.t2.comparison-page .reasonbox input,
.t2.comparison-page .dispbox textarea {
  box-sizing: border-box; display: block; width: 100%; padding: 11px 13px;
  font: var(--type-body); line-height: 1.6; color: var(--ink);
  background: var(--surface); border: 1px solid var(--control-line, var(--line));
  border-radius: var(--radius-md); transition: border-color .15s, box-shadow .15s;
}
.t2.comparison-page .reasonbox input { min-height: 42px; }
.t2.comparison-page .dispbox textarea { resize: vertical; min-height: 110px; }
.t2.comparison-page .reasonbox input::placeholder,
.t2.comparison-page .dispbox textarea::placeholder { color: var(--ink-4); opacity: 1; }
.t2.comparison-page .reasonbox input:focus,
.t2.comparison-page .dispbox textarea:focus { outline: none; border-color: var(--focus); box-shadow: var(--ring); }
.t2.comparison-page .review-field-label { display: block; font-size: var(--type-body-size); font-weight: var(--weight-strong); color: var(--ink-2); margin-bottom: 7px; }
.t2.comparison-page .dispbox { padding: 20px; border-radius: var(--radius-lg); background: var(--surface); margin-top: 20px; }
.t2.comparison-page .dispbox > .kicker { font: var(--type-heading); font-weight: var(--weight-strong); text-transform: none; letter-spacing: 0; margin-bottom: 12px; }
.t2.comparison-page .dispbtns { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 16px; }
.t2.comparison-page .review-options { display: flex; align-items: center; flex-wrap: wrap; gap: 12px 20px; padding-bottom: 18px; margin-bottom: 18px; border-bottom: 1px solid var(--line); }
.t2.comparison-page .review-approval { display: inline-flex; align-items: center; gap: 9px; font-size: var(--type-body-size); color: var(--ink-2); cursor: pointer; }
.t2.comparison-page .review-approval input { width: 17px; height: 17px; margin: 0; accent-color: var(--accent); }
.t2.comparison-page .review-comment-head { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 8px; margin-bottom: 8px; }
.t2.comparison-page .review-comment-head .review-field-label { margin: 0; }
.t2.comparison-page .respbox { padding-top: 18px; margin-top: 20px; }
.t2.comparison-page .respbox .kicker { font: var(--type-body); font-weight: var(--weight-strong); text-transform: none; letter-spacing: 0; margin-bottom: 8px; }

.t2 .th-images { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 12px; }
.t2 .th-images:empty { display: none; }
.t2 .th-images img { display: block; width: 150px; height: 110px; object-fit: contain; border: 1px solid var(--line); border-radius: var(--radius-md); background: var(--surface-3); }
.t2 .th-image-tile { display: flex; flex-direction: column; gap: 6px; }
.t2 .th-foot { flex-wrap: wrap; gap: 8px; }
.t2 .th-form .th-input { padding: 12px 14px; border-radius: var(--radius-md); min-height: 90px; font: var(--type-body); line-height: 1.6; }

.t2 .th-image-open { padding: 0; border: 0; border-radius: var(--radius-md); background: none; cursor: zoom-in; }
.t2 .th-image-open:focus-visible { outline: 2px solid var(--focus); outline-offset: 3px; }
.th-image-viewer { width: min(1000px, 92vw); max-height: 90vh; padding: 16px; border: 1px solid var(--line); border-radius: var(--radius-xl); background: var(--surface); color: var(--ink); box-shadow: 0 20px 70px var(--viewer-shadow-color); }
.th-image-viewer::backdrop { background: var(--viewer-scrim); }
.th-image-viewer-head { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 12px; overflow-wrap: anywhere; }
.th-image-viewer > img { display: block; width: 100%; max-height: 72vh; object-fit: contain; }

/* Schedule review scope, read from the uploaded WBS tree. */
.wbs-scope-group { border: 1px solid var(--line); border-radius: var(--radius-md); margin-top: 10px; overflow: hidden; }
.wbs-scope-group summary { padding: 12px; cursor: pointer; font-weight: var(--weight-strong); }
.wbs-scope-row { display: flex; align-items: center; gap: 10px; padding: 9px 12px; border-top: 1px solid var(--line-2); }
.wbs-scope-row input { width: 16px; height: 16px; accent-color: var(--accent); }
.wbs-scope-row .hint { margin-left: auto; }

.kind-setup .cmp-title .k { font-size: var(--type-title-size); font-weight: var(--weight-strong); text-transform: none; letter-spacing: -.02em; line-height: 1.3; }

.setup-schedules-empty { min-height: 240px; display: flex; align-items: center; justify-content: center; }
.setup-schedules-empty .btn { min-height: 48px; padding: 12px 28px; font-size: var(--type-heading-size); }
.t2 .activity-codes-form select { min-height: 40px; min-width: 180px; border: 1px solid var(--line); border-radius: var(--radius-md); padding: 8px 12px; background: var(--surface); font: inherit; }
.t2 .activity-codes-form .vgrp { margin-top: 12px; border: 1px solid var(--line); border-radius: var(--radius-md); background: var(--surface); padding: 0 12px; }
.t2 .activity-codes-form .code-values-summary { padding: 12px 0; cursor: pointer; font-weight: var(--weight-medium); }
.t2 .activity-codes-form .vgrp .vh { padding: 8px 0; }
.t2 .activity-codes-form .code-checks-summary { display: block; border: 1px solid var(--line); border-radius: var(--radius-xl); padding: 18px; margin-top: 20px; }
.t2 .activity-codes-form .code-checks-summary .sheet-head { margin: 0 0 12px; flex-wrap: wrap; gap: 8px; }

/* Project home dashboard — supplied six-answer design, scoped to this page. */
.hd-grid{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:16px;padding:24px 28px 36px;align-items:stretch}
.hd-card{min-width:0;background:var(--surface);border:1px solid var(--line);border-radius: var(--radius-md);display:flex;flex-direction:column;color:var(--ink);overflow:hidden;grid-column:span 6}
.hd-upload,.hd-wide{grid-column:1/-1}.hd-needs{grid-column:span 7}.hd-trust{grid-column:span 5}.hd-finish,.hd-pace,.hd-recent{grid-column:span 6}
.hd-head{padding:16px 20px 0;display:flex;align-items:baseline;justify-content:space-between;gap:12px;flex-wrap:wrap}
.hd-head h2{font:var(--type-heading);margin:0;color:var(--ink)}
.t2 .hd-link{border:0;background:transparent;box-shadow:none;padding:0;font-family:inherit;font-size: var(--type-caption-size);font-weight: var(--weight-medium);line-height:1.5;color:var(--ink-2);cursor:pointer;text-align:left}.hd-link:hover{text-decoration:underline}
.hd-body{padding:12px 20px 20px;flex:1;min-width:0}.hd-value{font-size: var(--type-display-size);font-weight: var(--weight-strong);letter-spacing:-.025em;line-height:1.25;margin-bottom:6px}.hd-value.good{color:var(--ok)}.hd-value.warn{color:var(--warn)}
.hd-caption,.hd-empty{font-size: var(--type-body-size);line-height:1.65;color:var(--ink-3);margin:6px 0}.hd-empty{font-size: var(--type-heading-size);padding:4px 0 12px}
.hd-basis{margin-top:auto;padding:10px 20px 12px;border-top:1px solid var(--line-2);color:var(--ink-4);font-size: var(--type-caption-size);line-height:1.6;overflow-wrap:anywhere}
.hd-needs .hd-body{display:flex;flex-direction:column;gap:12px;align-items:stretch}.hd-waiting{flex:none;display:flex;align-items:baseline;gap:8px}.hd-waiting strong{font-size: var(--metric-large-size);font-weight: var(--weight-strong);line-height:1}.hd-waiting span{font-size: var(--type-heading-size);color:var(--ink-2)}.hd-actions{flex:none;min-width:0;border:1px solid var(--line);border-radius: var(--radius-md);overflow:hidden}
.t2 .hd-action{display:grid;grid-template-columns:12px minmax(0,1fr) 62px 14px;align-items:center;gap:10px;width:100%;padding:11px 14px;border:0;border-top:1px solid var(--line-2);border-radius:0;background:var(--surface);box-shadow:none;color:var(--ink);font-size: var(--type-body-size);text-align:left;cursor:pointer}.hd-action:first-child{border-top:0}.t2 .hd-action.gating{background:var(--warn-tint)}.hd-action:hover{filter:brightness(.98)}.hd-mark{color:var(--warn-dot);font-size: var(--mark-size)}.hd-do-first{grid-column:3;justify-self:end;white-space:nowrap;font-size: var(--type-caption-size);background:var(--warn-line);color:var(--warn);border-radius: var(--radius-xs);padding:2px 6px}.hd-arrow{grid-column:4;justify-self:end;color:var(--ink-5)}
.hd-stats{display:flex;gap:24px;flex-wrap:wrap;margin:16px 0}.hd-stat{display:flex;flex-direction:column;gap:3px}.hd-stat strong{font-size: var(--type-heading-size);font-weight: var(--weight-strong)}.hd-stat span{font-size: var(--type-caption-size);color:var(--ink-4)}.hd-age .hd-stat{flex:1;border:1px solid var(--line);border-radius: var(--radius-sm);padding:12px}.hd-age .hd-stat strong{font-size: var(--type-display-size)}
.hd-checks{display:flex;flex-wrap:wrap;gap:5px;margin:18px 0 12px}.hd-check{width:25px;height:25px;display:grid;place-items:center;border:1px dashed var(--ink-5);border-radius: var(--radius-sm);color:var(--ink-4)}.hd-check.pass{background:var(--ok-tint);color:var(--ok);border:1px solid var(--ok-tint)}.hd-check.raise{background:var(--warn-tint);color:var(--warn);border:1px solid var(--warn-line)}
.hd-caution{font-size: var(--type-caption-size);color:var(--warn);line-height:1.6;padding:8px 0;border-top:1px solid var(--line-2)}.hd-chart{margin-top:16px}.hd-chart svg{display:block;width:100%;height:auto;overflow:visible}.hd-legend{display:flex;gap:18px;font-size: var(--type-caption-size);color:var(--ink-4);justify-content:center;margin-top:8px}.hd-legend span:before{content:"";display:inline-block;width:18px;height:2px;background:var(--line);vertical-align:middle;margin-right:6px}
.hd-recent{min-width:0}.hd-event{padding:14px 20px;border-bottom:1px solid var(--line);font-size: var(--type-body-size);line-height:1.6}.hd-event time,.hd-event>span{display:block;font-size: var(--type-caption-size);color:var(--ink-4)}.hd-recent>.hd-empty{padding:16px 20px}.hd-money-row{display:flex;justify-content:space-between;flex-wrap:wrap;gap:5px;margin:16px 0;font-size: var(--type-caption-size)}.hd-money-bar{height:6px;border-radius: var(--radius-xs);background:var(--ink-2);flex-basis:auto}.hd-recomputing{font-size: var(--type-caption-size);color:var(--ink-3);padding:8px 20px 0}.hd-upload{padding:20px}.hd-upload .np-zone{margin:0}
@media(max-width:1000px){.hd-needs,.hd-finish,.hd-trust,.hd-pace,.hd-recent{grid-column:span 6}}
@media(max-width:640px){.hd-grid{grid-template-columns:minmax(0,1fr);padding:16px 12px;gap:12px}.hd-grid>*{grid-column:1}.hd-head{padding:16px 16px 0}.hd-body{padding:12px 16px 18px}.hd-basis{padding:10px 16px}.hd-value{font-size: var(--type-display-size)}.hd-actions{flex-basis:auto}.hd-age{gap:8px}.hd-age .hd-stat{padding:8px}.hd-age .hd-stat span{font-size: var(--type-caption-size)}}

.hd-value.critical{color:var(--danger)}

/* Keep the dashboard inside the app shell’s scrolling pane. */
.t2 .pane.hd-scroll{min-height:0;padding:0;overflow-y:auto}

.hd-loading-status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
.hd-skeleton{padding:20px;gap:16px}
.hd-skeleton .skel{margin:0;flex-shrink:0;border-radius: var(--radius-sm)}
.hd-skeleton .hd-placeholder-title{width:48%;height:16px}
.hd-skeleton .hd-placeholder-value{width:65%;height:32px}
.hd-skeleton .hd-placeholder-text{width:82%;height:14px}
.hd-skeleton .hd-placeholder-content{width:100%;height:130px}
.hd-skeleton .hd-placeholder-basis{width:70%;height:12px;margin-top:auto}
.hd-skeleton.hd-needs .hd-placeholder-content{height:38px}

.review-save-row{display:flex;align-items:center;justify-content:flex-end;gap:12px;margin-top:8px}
.review-save-status{font-size: var(--type-caption-size);color:var(--ink-3)}

.hd-comment-preview{padding:12px 0;border-bottom:1px solid var(--line-2)}
.hd-comment-preview:last-child{border-bottom:0}
.hd-comment-preview>span{display:block}
.hd-comment-excerpt{margin:4px 0;font-size: var(--type-body-size);line-height:1.5;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere}

/* ---- Intake, reworked: one decision, the checks as cards, no empty card ----
   The head holds the verdict, what is in it (a chip per section below, each a
   way to it) and the decision beside the verdict it answers. The checks board
   is as tall as its own content: stretched to the rail, it ended in a block of
   empty card. The rail still fills the row beside a long board. */
.t2 .ik-mast { gap: 16px 24px; }
.t2 .ik-mast .sheet-counts { margin-top: 14px; padding-top: 0; border-top: 0; gap: 8px; }
.t2 .sheet-count.ik-jump { cursor: pointer; font: var(--type-caption); font-weight: var(--weight-medium);
  transition: border-color var(--t-fast) var(--ease), background var(--t-fast) var(--ease); }
.t2 .sheet-count.ik-jump:hover { border-color: var(--control-line); background: var(--surface-3); }
.t2 .sheet-count.ik-jump:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
.t2 .sheet-count.ik-jump.raise { color: var(--warn); border-color: var(--warn-line); background: var(--warn-tint); }
.t2 .ik-actions { display: flex; flex-direction: column; align-items: flex-end; gap: 10px; }
.t2 .ik-decision { display: flex; flex-wrap: wrap; justify-content: flex-end; align-items: center; gap: 8px; }
.t2 .ik-next { display: flex; flex-direction: column; align-items: flex-end; gap: 6px; }
.t2 .ik-next:empty { display: none; }
.t2 .btn.ik-return-btn { color: var(--warn); border-color: var(--warn-line); }
.t2 .btn.ik-return-btn:hover:not(:disabled) { background: var(--warn-tint); border-color: var(--warn-dot); }
.t2 .ik-decided {
  display: inline-flex; align-items: center; gap: 7px; padding: 5px 12px 5px 10px;
  font: var(--type-body); font-weight: var(--weight-medium); color: var(--ok);
  background: var(--ok-tint); border: 1px solid var(--ok-line); border-radius: var(--radius-pill);
}
.t2 .ik-decided .ic { color: var(--ok); }
.t2 .ik-linkbtn {
  border: 0; background: none; padding: 0; cursor: pointer;
  font: var(--type-caption); color: var(--link); text-decoration: underline; text-underline-offset: 2px;
}
.t2 .ik-linkbtn:hover:not(:disabled) { color: var(--focus); }
.t2 .ik-linkbtn:disabled { color: var(--ink-4); cursor: default; }
.t2 .ik-list { display: grid; gap: 8px; }
.t2 .ik-issue-link {
  justify-self: start; margin-left: 18px; font: var(--type-caption); color: var(--ink-3);
  text-decoration: underline; text-decoration-color: var(--line); text-underline-offset: 2px;
}
.t2 .ik-issue-link:hover { color: var(--ink); text-decoration-color: currentColor; }
.t2 .ik-bandfoot { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 16px; margin-top: 10px; }
.t2 .ik-bandfoot .ik-fold { margin-top: 0; flex: 1 1 260px; min-width: 0; }
.t2 .ik-band .ik-list + .ik-bandfoot { margin-top: 12px; }
.t2 .ik-band .ik-none + .ik-list { margin-top: 10px; }
.t2 .ik-docrow.ik-setup .d .sheet-link { margin-left: 2px; }
@container sheet (max-width: 560px) {
  .t2 .ik-actions, .t2 .ik-next { align-items: flex-start; }
  .t2 .ik-decision { justify-content: flex-start; }
}
/* What cannot be checked on this file asks nothing of anyone, so it is a
   plain list, not a stack of cards. */
.t2 .ik-docrow.ik-na { background: none; border: 0; border-radius: 0; padding: 7px 2px; }
.t2 .ik-docrow.ik-na + .ik-docrow.ik-na { border-top: 1px solid var(--line-3); }
.t2 .ik-list:has(> .ik-na) { gap: 0; }

/* ---- Intake: the submittal bar, the drop veil, the checks full width ----
   The file itself -- which one of the series, when it came, the next one --
   is one bar under the verdict, not a column of cards that had to be
   stretched to the height of the checks. The checks take the width, and their
   cards sit side by side where there is room. */
.t2 .ik-bar {
  margin: 0 0 16px; padding: 10px 16px; background: var(--surface);
  border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow-1);
}
.t2 .ik-bar-row { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 24px; }
.t2 .ik-bar-file { display: flex; align-items: center; gap: 8px; min-width: 0; flex-wrap: wrap; }
.t2 .ik-bar-k { font: var(--type-caption); color: var(--ink-4); text-transform: uppercase; letter-spacing: .06em; }
.t2 .ik-bar-step {
  width: 30px; height: 30px; padding: 0; cursor: pointer;
  font: var(--type-body); color: var(--ink-2); background: var(--surface);
  border: 1px solid var(--line); border-radius: var(--radius-sm);
  transition: background var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease);
}
.t2 .ik-bar-step:hover:not(:disabled) { background: var(--surface-3); border-color: var(--control-line); }
.t2 .ik-bar-step:disabled { color: var(--ink-5); cursor: default; }
.t2 .ik-bar-select, .t2 .ik-bar-field input, .t2 .ik-bar-morefields input, .t2 .ik-bar-morefields select {
  height: 30px; padding: 0 8px; font: var(--type-body); color: var(--ink); background: var(--surface);
  border: 1px solid var(--input-line); border-radius: var(--radius-sm);
}
.t2 .ik-bar-select { max-width: 300px; min-width: 0; }
.t2 .ik-bar-select:focus-visible, .t2 .ik-bar-field input:focus, .t2 .ik-bar-morefields input:focus,
.t2 .ik-bar-morefields select:focus-visible { outline: 0; border-color: var(--focus); box-shadow: var(--ring); }
.t2 .ik-bar-one { font: var(--type-body); font-weight: var(--weight-medium); color: var(--ink); }
.t2 .ik-bar-pos { font: var(--type-caption); color: var(--ink-4); white-space: nowrap; }
.t2 .ik-bar-receipt { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 14px; margin-left: auto; }
.t2 .ik-bar-field { display: inline-flex; align-items: center; gap: 8px; }
.t2 .ik-bar-field input:not([type="date"]) { width: 120px; }
.t2 .ik-bar-add { flex: none; margin-left: 6px; }
.t2 .ik-bar-more { margin-top: 10px; padding-top: 8px; border-top: 1px solid var(--line-2); }
.t2 .ik-bar-more summary { font: var(--type-caption); color: var(--ink-3); cursor: pointer; }
.t2 .ik-bar-morefields {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 200px), 1fr));
  gap: 10px 16px; margin-top: 10px;
}
.t2 .ik-bar-morefields label { display: block; margin-bottom: 4px; font: var(--type-caption); color: var(--ink-3); }
.t2 .ik-bar-morefields input, .t2 .ik-bar-morefields select { width: 100%; }
.t2 .ik-bar > .hint, .t2 .ik-bar > .sheet-refuse { margin: 8px 0 0; }
.t2 .ik-bar > .hint:empty { display: none; }
.t2.scr.ik-uploading .ik-bar { opacity: .7; pointer-events: none; }

/* Files over the page: the veil says what dropping will do. It takes no
   pointer events, so the drop lands on the page beneath it. */
.t2 .ik-veil {
  display: none; position: fixed; inset: 0; z-index: 60; pointer-events: none;
  align-items: center; justify-content: center; background: var(--scrim);
}
.t2.scr.on > .ik-veil { display: flex; }
.t2 .ik-veil-card {
  padding: 28px 40px; font: var(--type-title); color: var(--ink); background: var(--surface);
  border: 2px dashed var(--focus); border-radius: var(--radius-lg); box-shadow: var(--shadow-2);
}

/* The checks' cards side by side where there is room; a card's link sits at
   its foot, so cards of one row line up. */
.t2 .ik-list.ik-cards { grid-template-columns: repeat(auto-fill, minmax(min(100%, 440px), 1fr)); }
.t2 .ik-list.ik-docs { grid-template-columns: repeat(auto-fill, minmax(min(100%, 320px), 1fr)); }
.t2 .ik-band .ik-plist { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 380px), 1fr)); column-gap: 40px; }
.t2 .ik-issue { display: flex; flex-direction: column; }
.t2 .ik-issue-link { align-self: flex-start; margin-top: auto; }

/* Intake workspace: a submission header, a decision, and independent evidence
   panels. All appearance tokens remain owned by theme.css. */
.t2.ik-workspace .pagehead { padding-bottom: 0; }
.t2.ik-workspace .pageblock { margin-bottom: 0; padding-bottom: 12px; }
.t2.ik-workspace .ik-bar { padding: 12px 18px; margin-bottom: 16px; box-shadow: none; }
.t2.ik-workspace .ik-bar-file { width: 100%; gap: 8px; }
.t2.ik-workspace .ik-bar-k { text-transform: none; letter-spacing: 0; color: var(--ink-3); }
.t2.ik-workspace .ik-bar-select { flex: 1 1 240px; max-width: 600px; height: 36px; font-weight: var(--weight-medium); }
.t2.ik-workspace .ik-bar-one { flex: 1; overflow-wrap: anywhere; }
.t2.ik-workspace .ik-bar-step { width: 32px; height: 36px; flex: none; }
.t2.ik-workspace .ik-bar-add { margin-left: auto; height: 34px; }
.t2.ik-workspace .ik-bar-pos { margin: 0 8px; }
.t2 .ik-file-facts { display: flex; gap: 16px 32px; flex-wrap: wrap; margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--line-2); }
.t2 .ik-file-fact { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
.t2 .ik-fact-label { font: var(--type-caption); color: var(--ink-4); white-space: nowrap; }
.t2 .ik-fact-value { font: var(--type-caption); color: var(--ink-2); overflow-wrap: anywhere; }
.t2.ik-workspace .ik-mast { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; padding: 14px 18px; margin-bottom: 12px; box-shadow: none; border-left: 3px solid var(--ok); }
.t2.ik-workspace .ik-mast[data-verdict="reviewable_with_exceptions"],
.t2.ik-workspace .ik-mast[data-verdict="not_reviewable"] { border-left-color: var(--warn-dot); }
.t2.ik-workspace .ik-mast.bad { border-left-color: var(--danger); }
.t2 .ik-verdict-copy { flex: 1 1 320px; min-width: 0; }
.t2 .ik-eyebrow { font: var(--type-caption); color: var(--ink-3); margin-bottom: 5px; }
.t2.ik-workspace .sheet-words { font: var(--type-title); letter-spacing: var(--type-title-tracking); }
.t2.ik-workspace .sheet-line { margin-top: 6px; font: var(--type-caption); max-width: 80ch; }
.t2.ik-workspace .ik-actions { flex: 0 1 auto; }
.t2.ik-workspace .ik-decision .btn { min-height: 34px; }
.t2.ik-workspace .ik-next .hint { max-width: 48ch; }
.t2.ik-workspace .ik-summary { margin-bottom: 16px; }
.t2.ik-workspace .ik-summary:empty { display: none; }
.t2.ik-workspace .ik-metrics { display: grid; grid-template-columns: repeat(auto-fit, minmax(145px, 1fr)); gap: 12px; border: 0; padding: 0; margin: 0; overflow: visible; }
.t2.ik-workspace .ik-metrics .sheet-count { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; min-width: 0; padding: 12px 16px; border-radius: var(--radius-lg); background: var(--surface); color: var(--ink); border: 1px solid var(--line); text-align: left; box-shadow: none; }
.t2.ik-workspace .ik-metrics .sheet-count:hover { border-color: var(--control-line); background: var(--surface-3); }
.t2 .ik-metric-label { display: flex; width: 100%; align-items: center; justify-content: space-between; gap: 8px; font: var(--type-caption); color: var(--ink-3); }
.t2 .ik-metric-label::first-letter { text-transform: uppercase; }
.t2 .ik-metric-value { font: var(--type-display); font-variant-numeric: tabular-nums; }
.t2 .ik-metric-hint { font: var(--type-caption); color: var(--ink-4); }
.t2.ik-workspace .ik-metrics .raise .ic, .t2.ik-workspace .ik-metrics .raise .ik-metric-value { color: var(--warn); }
.t2.ik-workspace .ik-metrics .ok .ic, .t2.ik-workspace .ik-metrics .ok .ik-metric-value { color: var(--ok); }
.t2.ik-workspace .ik-console { display: grid; grid-template-columns: minmax(0, 1fr) 310px; gap: 18px; align-items: stretch; }
.t2.ik-workspace .ik-board { box-shadow: none; }
.t2.ik-workspace .ik-bhead { padding: 16px 18px; background: var(--surface); justify-content: space-between; flex-wrap: wrap; gap: 6px 16px; }
.t2.ik-workspace .ik-bhead .sheet-t { font: var(--type-heading); margin-right: auto; }
.t2 .ik-sidebar { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.t2 .ik-sidebar > .ik-band { border: 1px solid var(--line); border-radius: var(--radius-lg); background: var(--surface); overflow: hidden; }
.t2 .ik-sidebar .ik-bandhead { flex-direction: column; align-items: flex-start; gap: 4px; padding: 16px; border-bottom: 1px solid var(--line-2); }
.t2 .ik-sidebar .ik-bandbody { padding: 4px 16px 16px; }
.t2 .ik-sidebar .ik-docs { grid-template-columns: minmax(0, 1fr); gap: 0; }
.t2 .ik-sidebar .ik-docrow { padding: 14px 0; border: 0; border-bottom: 1px solid var(--line-2); background: none; border-radius: 0; }
.t2 .ik-sidebar .ik-docrow .d { font: var(--type-caption); color: var(--ink-3); }
.t2 .ik-sidebar .ik-bandfoot { margin-top: 14px; }
.t2 .ik-sidebar .ik-bandfoot > .btn { width: 100%; }
.t2 .ik-sidebar .ik-plist { display: block; }
.t2 .ik-sidebar .ik-prow { grid-template-columns: 12px minmax(0, 1fr); }
.t2 .ik-sidebar .ik-prow .v { grid-column: 2; text-align: left; overflow-wrap: anywhere; }
.t2.ik-workspace .ik-receipt-card { box-shadow: none; min-width: 0; margin-top: 16px; }
.t2.ik-workspace .ik-bar-receipt { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) auto; align-items: end; margin: 0; gap: 12px; }
.t2.ik-workspace .ik-bar-field { display: grid; grid-template-columns: minmax(0, 1fr); gap: 5px; }
.t2.ik-workspace .ik-bar-field input { width: 100%; min-width: 0; height: 34px; }
.t2.ik-workspace .ik-bar-receipt > .btn { justify-self: end; }
.t2.ik-workspace .ik-receipt-card .hint { margin-top: 10px; }
.t2.ik-workspace .ik-bar-morefields { grid-template-columns: repeat(auto-fit, minmax(min(100%, 210px), 1fr)); }
.t2 .ik-filters { display: flex; gap: 4px; padding: 0 14px; border-bottom: 1px solid var(--line); overflow-x: auto; }
.t2 .ik-filter { display: inline-flex; align-items: center; gap: 6px; flex: none; padding: 12px 8px; background: none; border: 0; border-bottom: 2px solid transparent; color: var(--ink-3); font: var(--type-caption); cursor: pointer; }
.t2 .ik-filter:hover { color: var(--ink); background: var(--surface-3); }
.t2 .ik-filter[aria-pressed="true"] { color: var(--ink); border-bottom-color: var(--accent); }
.t2 .ik-filter-count { padding: 0 5px; background: var(--surface-2); border-radius: var(--radius-sm); color: var(--ink-3); font-variant-numeric: tabular-nums; }
.t2 .ik-filter:focus-visible, .t2 .ik-check-summary:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
.t2.ik-workspace .ik-bandhead { gap: 5px 12px; }
.t2.ik-workspace .ik-board .ik-bandhead { flex-direction: column; align-items: flex-start; padding-top: 16px; }
.t2.ik-workspace .ik-list.ik-cards { display: block; }
.t2 .ik-check-detail { border-bottom: 1px solid var(--line-2); }
.t2 .ik-check-detail:last-child { border-bottom: 0; }
.t2 .ik-check-summary { display: grid; grid-template-columns: 16px minmax(0, 1fr) minmax(80px, 32%) 12px; gap: 10px; align-items: center; padding: 14px 0; cursor: pointer; list-style: none; }
.t2 .ik-check-summary::-webkit-details-marker { display: none; }
.t2 .ik-check-summary::after { content: "›"; color: var(--ink-4); justify-self: end; transition: transform var(--t-fast) var(--ease); }
.t2 .ik-check-detail[open] > .ik-check-summary::after { transform: rotate(90deg); }
.t2 .ik-check-summary > .ic { color: var(--warn-dot); }
.t2 .ik-check-summary:hover .ik-check-name { color: var(--link); }
.t2 .ik-check-name { font: var(--type-body); font-weight: var(--weight-medium); color: var(--ink); overflow-wrap: anywhere; }
.t2 .ik-check-reading { font: var(--type-caption); color: var(--warn); text-align: right; overflow-wrap: anywhere; }
.t2.ik-workspace .ik-check-detail .ik-issue { background: var(--surface-3); border: 1px solid var(--line-2); border-radius: var(--radius-md); padding: 12px 14px; margin: 0 0 14px 26px; gap: 10px; }
.t2.ik-workspace .ik-check-detail .ik-issue-top, .t2.ik-workspace .ik-check-detail .ik-issue-valline { display: none; }
.t2.ik-workspace .ik-check-detail .ik-issue-fix, .t2.ik-workspace .ik-check-detail .ik-issue-chips { padding-left: 0; }
.t2.ik-workspace .ik-check-detail .ik-issue-link { margin-left: 0; }
.t2.ik-workspace .ik-check-detail .ik-issue-chip { border-color: var(--line); padding: 5px 8px; }
.t2.ik-workspace .ik-board .ik-docrow { background: none; border: 0; padding: 10px 0; border-radius: 0; }
.t2.ik-workspace .ik-board .ik-docrow + .ik-docrow { border-top: 1px solid var(--line-2); }
.t2.ik-workspace .ik-board .ik-plist { grid-template-columns: minmax(0, 1fr); }
.t2 .ik-error-note { padding: 18px; font: var(--type-body); color: var(--ink-3); }
/* Equal boundaries without filler: the content-sized body becomes scrollable
   only when its evidence exceeds the shorter neighbour. */
.t2.ik-workspace .ik-balanced > .ik-board,
.t2.ik-workspace .ik-balanced > .ik-sidebar { height: var(--ik-evidence-height); min-height: 0; }
.t2.ik-workspace .ik-board { display: flex; flex-direction: column; }
.t2.ik-workspace .ik-bhead, .t2.ik-workspace .ik-filters,
.t2.ik-workspace .ik-sidebar .ik-bandhead { flex-shrink: 0; }
.t2.ik-workspace .ik-check-scroll, .t2.ik-workspace .ik-document-scroll {
  min-height: 0; overflow: auto; flex: 1 1 auto; scrollbar-gutter: stable;
  scrollbar-width: thin; scrollbar-color: var(--control-line) transparent;
}
.t2.ik-workspace .ik-check-scroll:focus-visible,
.t2.ik-workspace .ik-document-scroll:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
.t2.ik-workspace .ik-sidebar > .ik-band { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
.t2.ik-workspace .ik-no-documents { grid-template-columns: minmax(0, 1fr); }
.t2.ik-workspace .ik-sidebar:empty { display: none; }
@container sheet (max-width: 880px) {
  .t2.ik-workspace .ik-console { grid-template-columns: minmax(0, 1fr); }
  .t2.ik-workspace .ik-balanced > .ik-board,
  .t2.ik-workspace .ik-balanced > .ik-sidebar { height: auto; }
  .t2.ik-workspace .ik-check-scroll, .t2.ik-workspace .ik-document-scroll { overflow: visible; scrollbar-gutter: auto; }
  .t2.ik-workspace .ik-sidebar { display: flex; }
}
@container sheet (max-width: 580px) {
  .t2.ik-workspace .ik-sidebar { grid-template-columns: minmax(0, 1fr); }
  .t2.ik-workspace .ik-bar-receipt { grid-template-columns: minmax(0, 1fr); }
  .t2.ik-workspace .ik-metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .t2.ik-workspace .ik-mast { padding: 16px; }
  .t2.ik-workspace .ik-actions, .t2.ik-workspace .ik-next { align-items: flex-start; }
  .t2.ik-workspace .ik-decision { justify-content: flex-start; }
  .t2.ik-workspace .ik-bar { padding: 14px; }
  .t2.ik-workspace .ik-bar-file > .ik-bar-k { width: 100%; }
  .t2.ik-workspace .ik-bar-select { flex-basis: 100px; width: 0; }
  .t2.ik-workspace .ik-bar-pos { margin-left: 0; }
  .t2.ik-workspace .ik-file-facts { flex-direction: column; gap: 8px; }
  .t2.ik-workspace .ik-check-summary { grid-template-columns: 16px minmax(0, 1fr) 12px; }
  .t2.ik-workspace .ik-check-reading { grid-column: 2; grid-row: 2; text-align: left; }
  .t2.ik-workspace .ik-check-summary::after { grid-column: 3; grid-row: 1; }
  .t2.ik-workspace .ik-check-detail .ik-issue { margin-left: 0; }
  .t2.ik-workspace .ik-filters { flex-wrap: wrap; }
  .t2.ik-workspace .ik-metric-label { min-height: 32px; align-items: flex-start; }
}

.t2.ik-workspace .ik-metrics .sheet-count:disabled { cursor: default; background: var(--surface); border-color: var(--line); }

/* Compact schedule chooser: themed top-layer popover, bounded independently
   of the series length so the underlying Intake remains visible. */
.t2.ik-workspace .ik-series-trigger { display: flex; align-items: center; gap: 10px; text-align: left; max-width: 360px; }
.t2 .ik-series-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; }
.t2 .ik-series-chevron { color: var(--ink-3); transition: transform 160ms ease; }
.t2 .ik-series-trigger[aria-expanded="true"] .ik-series-chevron { transform: rotate(180deg); }
.t2.ik-series-menu { position: fixed; inset: auto; margin: 0; padding: 4px; box-sizing: border-box; overflow-y: auto; overscroll-behavior: contain; background: var(--surface); color: var(--ink); border: 1px solid var(--line); border-radius: var(--radius-md); box-shadow: var(--shadow-3); }
.t2 .ik-series-option { display: grid; grid-template-columns: 16px minmax(0, 1fr) auto; align-items: center; gap: 8px; width: 100%; min-height: 36px; padding: 7px 9px; border: 0; border-radius: var(--radius-sm); background: transparent; color: var(--ink); text-align: left; font: var(--type-body); cursor: pointer; }
.t2 .ik-series-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.t2 .ik-series-date { color: var(--ink-3); font: var(--type-caption); white-space: nowrap; }
.t2 .ik-series-option[aria-selected="true"] { background: var(--accent-tint); font-weight: var(--weight-medium); }
.t2 .ik-series-option:hover, .t2 .ik-series-option:focus-visible { background: var(--surface-3); outline: 2px solid var(--focus); outline-offset: -2px; }
.t2 .ik-series-check { color: var(--accent); }
@media (prefers-reduced-motion: no-preference) {
  .t2.ik-series-menu:popover-open { animation: ik-series-enter 150ms ease-out; }
  @keyframes ik-series-enter { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: translateY(0); } }
}
@media (prefers-reduced-motion: reduce) { .t2 .ik-series-chevron { transition: none; } }

/* Return grounds read as restrained bullets, not warning cards. */
.t2 .ik-rt-list { margin: 0; padding-left: 19px; list-style: disc; font: var(--type-body); color: var(--ink); }
.t2 .ik-rt-list > li { padding-left: 3px; overflow-wrap: anywhere; }
.t2 .ik-rt-list > li + li { margin-top: 12px; }
.t2 .ik-rt-list li::marker { color: var(--ink-3); }
.t2 .ik-rt-item-title { font-weight: var(--weight-medium); }
.t2 .ik-rt-item-value { color: var(--ink-3); font: var(--type-caption); }
.t2 .ik-rt-item-detail { margin: 4px 0 0; color: var(--ink-3); font: var(--type-caption); }
.t2 .ik-rt-particulars { margin: 5px 0 0; padding-left: 17px; list-style: circle; color: var(--ink-3); font: var(--type-caption); }
.t2 .ik-rt-particulars li + li { margin-top: 3px; }

/* Intake has an upload stage and a review stage, with one consistent summary. */
.t2.ik-stage .ik-stage-grid { display: grid; grid-template-columns: minmax(0, 1fr) 380px; gap: 20px; align-items: start; }
.t2.ik-stage .ik-stage-side, .t2.ik-stage .ik-sidebar { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.t2.ik-stage .sheet-block { margin: 0; }
.t2.ik-stage .ik-upload-card .ik-drop { min-height: 184px; display: flex; flex-direction: column; justify-content: center; align-items: center; gap: 12px; }
.t2 .ik-upload-intro { margin: 0 0 16px; color: var(--ink-3); font: var(--type-body); }
.t2 .ik-status-name { margin: 0; font: var(--type-body); font-weight: var(--weight-medium); overflow-wrap: anywhere; }
.t2 .ik-status-date { margin-top: 5px; color: var(--ink-3); font: var(--type-caption); }
.t2 .ik-status-state { margin: 7px 0 6px; font: var(--type-display); letter-spacing: var(--type-display-tracking); color: var(--ink); overflow-wrap: anywhere; }
.t2 .ik-status-chart { display: flex; gap: 16px; align-items: center; padding: 20px 0; }
.t2 .ik-status-ring { position: relative; width: 80px; height: 80px; flex: none; }
.t2 .ik-status-ring-center { position: absolute; inset: 12px; border-radius: 50%; display: flex; flex-direction: column; align-items: center; justify-content: center; }
.t2 .ik-status-ring-center strong { font: var(--type-heading); }
.t2 .ik-status-ring-center span { font: var(--type-caption); color: var(--ink-3); }
.t2 .ik-status-legend { display: grid; gap: 6px; flex: 1; min-width: 0; }
.t2 .ik-status-key { display: grid; grid-template-columns: 7px minmax(0, 1fr) auto; gap: 7px; align-items: center; font: var(--type-caption); color: var(--ink-3); }
.t2 .ik-status-key strong { color: var(--ink); }
.t2 .ik-status-dot { width: 7px; height: 7px; border-radius: 2px; background: var(--line); }
.t2 .ik-status-key[data-kind="raise"] .ik-status-dot { background: var(--warn-dot); }
.t2 .ik-status-key[data-kind="pass"] .ik-status-dot { background: var(--ok-dot); }
.t2 .ik-status-key[data-kind="docs"] { padding-top: 9px; border-top: 1px solid var(--line-2); }
.t2 .ik-status-key[data-kind="docs"] .ik-status-dot { background: var(--ink-4); }
.t2 .ik-status-decision { border-top: 1px solid var(--line-2); margin: 20px -22px -22px; padding: 18px 22px 22px; }
.t2 .ik-status-decision h3 { margin: 0; font: var(--type-body); font-weight: var(--weight-medium); }
.t2.ik-stage .ik-actions { width: 100%; align-items: stretch; min-width: 0; }
.t2.ik-stage .ik-decision { flex-direction: column; align-items: stretch; }
.t2.ik-stage .ik-next { align-items: stretch; }
.t2.ik-stage .ik-check-scroll, .t2.ik-stage .ik-document-scroll { overflow: visible; max-height: none; }
.t2.ik-stage .ik-docs { grid-template-columns: minmax(0, 1fr); }
.t2.ik-stage .ik-receipt-card .ik-bar-receipt { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
.t2.ik-stage .ik-receipt-card .ik-bar-receipt > .btn { grid-column: 1 / -1; }
.t2 .ik-previous-empty-symbol { margin: 0 auto 18px; width: 96px; height: 96px; display: grid; place-items: center; border: 1px solid var(--line-2); border-radius: 50%; background: var(--surface-3); color: var(--ink-4); }
.t2 .ik-previous-empty { max-width: 280px; text-align: center; font: var(--type-body); color: var(--ink-3); margin: 8px auto 0; }
@media (max-width: 1100px) { .t2.ik-stage .ik-stage-grid { grid-template-columns: minmax(0, 1fr) 320px; gap: 14px; } }
@media (max-width: 820px) { .t2.ik-stage .ik-stage-grid { grid-template-columns: minmax(0, 1fr); } .t2.ik-stage .ik-upload-card .ik-drop { min-height: 180px; } }

.t2.ik-stage .ik-screen { max-width: 1380px; margin-inline: auto; }
.t2.ik-stage .ik-status-card { padding: 0; overflow: hidden; box-shadow: var(--shadow-1); }
.t2.ik-stage .ik-status-card > .sheet-body { padding: 22px; }
.t2 .ik-status-eyebrow { font: var(--type-caption); color: var(--ink-3); }
.t2 .ik-status-explanation { margin: 0; font: var(--type-body); color: var(--ink-3); overflow-wrap: anywhere; }
.t2 .ik-status-documents { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; padding: 12px 0; border-top: 1px solid var(--line-2); font: var(--type-caption); color: var(--ink-3); }
.t2 .ik-status-documents strong { color: var(--ink); font-variant-numeric: tabular-nums; }
.t2 .ik-status-documents.has-missing strong { color: var(--warn); }
.t2 .ik-status-file { margin-top: 5px; padding: 12px 14px; background: var(--surface-3); border-radius: var(--radius-sm); }
.t2 .ik-history-details:empty { display: none; }
.t2 .ik-history-group { padding: 12px 0; border-top: 1px solid var(--line-2); }
.t2 .ik-history-heading { margin: 0; font: var(--type-caption); font-weight: var(--weight-medium); color: var(--ink-3); }
.t2 .ik-history-count { margin-left: 7px; color: var(--ink-4); font-variant-numeric: tabular-nums; }
.t2 .ik-history-list { margin: 8px 0 0; padding-left: 17px; font: var(--type-caption); }
.t2 .ik-history-list li { padding-left: 2px; overflow-wrap: anywhere; }
.t2 .ik-history-list li + li { margin-top: 7px; }
.t2 .ik-history-list li::marker { color: var(--ink-4); }
.t2 .ik-history-group[data-kind="raise"] li::marker { color: var(--warn-dot); }
.t2 .ik-history-group[data-kind="pass"] li::marker { color: var(--ok-dot); }
.t2 .ik-history-title { color: var(--ink); }
.t2 .ik-history-value, .t2 .ik-history-note { color: var(--ink-3); }
.t2 .ik-history-note { margin: 3px 0 0; }
.t2 .ik-history-reason { margin: 8px 0 0; font: var(--type-caption); color: var(--ink-3); white-space: pre-wrap; overflow-wrap: anywhere; }
.t2 .ik-status-key strong { font-variant-numeric: tabular-nums; }
.t2 .ik-status-key[data-kind="raise"] strong { color: var(--warn); }
.t2 .ik-status-key[data-kind="pass"] strong { color: var(--ok); }
.t2 .ik-status-decision-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin-bottom: 12px; }
.t2 .ik-status-decision-head > span { font: var(--type-caption); color: var(--ink-4); }
.t2.ik-stage .ik-decision { gap: 9px; }
.t2.ik-stage .ik-decision-action { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; white-space: normal; text-align: left; padding: 12px 14px; height: auto; }
.t2 .ik-decision-title { font: var(--type-body); font-weight: var(--weight-medium); }
.t2 .ik-decision-description { font: var(--type-caption); font-weight: var(--weight-regular); }
.t2.ik-stage .ik-return-btn { color: var(--ink); border-color: var(--control-line); background: var(--surface); box-shadow: none; }
.t2.ik-stage .ik-return-btn .ik-decision-description { color: var(--ink-3); }
.t2.ik-stage .ik-next { padding-top: 5px; }
.t2.ik-stage .ik-next .ik-linkbtn { text-align: center; }
.t2.ik-stage .ik-upload-card > .sheet-body { padding: 18px; }
.t2.ik-stage .ik-upload-card > .sheet-body > div > .sheet-body { padding: 0; }
.t2 .ik-upload-formats { margin: 12px 0 0; text-align: center; color: var(--ink-4); font: var(--type-caption); }
.t2.ik-stage .ik-status-empty .sheet-body { padding: 28px 18px 0; }
@media (max-width: 540px) {
  .t2.ik-stage .ik-status-card > .sheet-body { padding: 18px; }
  .t2 .ik-status-decision { margin-inline: -18px; margin-bottom: -18px; padding: 16px 18px 18px; }
  .t2 .ik-status-chart { gap: 12px; }
  .t2 .ik-status-state { font: var(--type-title); }
}

/* The summary chart sits directly above the decision, as one reading. */
.t2 .ik-status-ring svg { display: block; width: 100%; height: 100%; transform: rotate(-90deg); }
.t2 .ik-status-ring circle { stroke-width: 11px; }
.t2 .ik-ring-track { stroke: var(--surface); }
.t2 .ik-ring-raised { stroke: var(--warn-dot); }
.t2 .ik-ring-unavailable { stroke: var(--line); }
.t2 .ik-ring-passed { stroke: var(--ok-dot); }
.t2 .ik-status-ring-center strong { font: var(--type-heading); letter-spacing: -.025em; }
.t2 .ik-status-key[data-kind="none"] .ik-status-dot { background: transparent; border: 1px solid var(--ink-4); box-sizing: border-box; }
.t2 .ik-status-card .ik-status-chart { gap: 20px; padding: 20px 0 6px; }
.t2 .ik-status-card:has(.ik-status-decision) .ik-status-state { margin-top: 0; }
.t2 .ik-status-card:has(.ik-status-decision) .ik-status-decision { margin-top: 22px; }
@media (max-width: 540px) { .t2 .ik-status-card .ik-status-chart { gap: 14px; } }

/* Intake mounts the same upload composer as Add schedule. */
.t2.ik-stage .ik-upload-card > .sheet-body { padding: 0; }
.t2 .ik-import-content > .modal-body { padding: 10px; display: flex; flex-direction: column; gap: 8px; }
.t2 .ik-import-content .field { margin: 0; }
.t2 .ik-import-content .np-zone { padding: 12px; border-radius: var(--radius-md); }
.t2 .ik-import-content .np-zone-in { grid-template-columns: 30px minmax(0, max-content); justify-content: center; gap: 4px 8px; }
.t2 .ik-import-content .np-zone-in > :not(.np-ic):not(.np-d1) { grid-column: 1 / -1; }
.t2 .ik-import-content .np-ic { width: 30px; height: 30px; margin-bottom: 0; }
.t2 .ik-import-content .np-d1 { font: var(--type-heading); }
.t2 .ik-import-content .np-d2 { max-width: 430px; font: var(--type-body); color: var(--ink-3); }
.t2 .ik-import-content .np-packet { max-width: 100%; margin-top: 4px; padding-top: 0; font: var(--type-caption); }
.t2 .ik-import-content .np-d3 { margin-top: 4px; }
.t2 .ik-import-content .np-d3 .btn { min-height: 32px; padding-inline: 14px; }
.t2 .ik-import-content > .modal-foot { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 10px; padding: 10px 14px; border-top: 1px solid var(--line-2); background: var(--surface-3); border-radius: 0 0 var(--radius-lg) var(--radius-lg); }
.t2 .ik-import-note { font: var(--type-caption); color: var(--ink-3); }
.t2 .ik-import-content .hint:empty { display: none; }
.t2 .ik-import-content .doc-table { table-layout: fixed; width: 100%; }
.t2 .ik-import-content .doc-table th,
.t2 .ik-import-content .doc-table td { white-space: normal; overflow-wrap: anywhere; vertical-align: top; }
.t2 .ik-import-content .doc-table th:first-child { width: 42%; }
.t2 .ik-import-content .doc-table th:nth-child(2) { width: 22%; }
@media (max-width: 540px) {
  .t2 .ik-import-content > .modal-body { padding: 10px; }
  .t2 .ik-import-content .np-zone { padding: 12px 10px; }
  .t2 .ik-import-content > .modal-foot { padding: 12px 14px; }
  .t2 .ik-import-content > .modal-foot .right { margin-left: auto; max-width: 100%; flex-wrap: wrap; justify-content: flex-end; }
}

.t2 .ik-previous-empty-symbol svg { width: 78px; height: 78px; }
.t2 .ik-empty-paper-back { fill: var(--surface-2); stroke: var(--line); }
.t2 .ik-empty-paper, .t2 .ik-empty-clock { fill: var(--surface); }
.t2 .ik-empty-clock { stroke: var(--ink-3); }
.t2 .ik-empty-title { margin: 0; text-align: center; font: var(--type-heading); color: var(--ink); }
.t2 .ik-empty-next { margin: 24px -18px 0; padding: 16px 20px; border-top: 1px solid var(--line-2); background: var(--surface-3); }
.t2 .ik-empty-next p { margin: 0; text-align: center; font: var(--type-caption); color: var(--ink-3); }
.t2.ik-stage .ik-status-empty { overflow: hidden; }

.t2 .ik-accept-modal { width: min(540px, calc(100vw - 32px)); max-height: calc(100dvh - 32px); display: flex; flex-direction: column; }
.t2 .ik-accept-modal > .modal-body { overflow-y: auto; min-height: 0; padding: 20px 22px; }
.t2 .ik-accept-modal > .modal-head, .t2 .ik-accept-modal > .modal-foot { flex-shrink: 0; }
.t2 .ik-accept-modal > .modal-head { align-items: center; padding: 20px 22px; border-bottom: 1px solid var(--line-2); }
.t2 .ik-accept-modal > .modal-head h2 { margin: 0; font: var(--type-title); letter-spacing: var(--type-title-tracking); }
.t2 .ik-accept-modal > .modal-foot { display: flex; justify-content: flex-end; gap: 8px; flex-wrap: wrap; padding: 16px 22px; }
.t2 .ik-accept-modal > .modal-foot .btn { min-height: 36px; }
.t2 .ik-accept-file { display: flex; align-items: center; gap: 12px; margin-bottom: 18px; padding: 14px; border: 1px solid var(--line-2); border-radius: var(--radius-md); background: var(--surface-3); overflow-wrap: anywhere; }
.t2 .ik-accept-file-icon { display: grid; place-items: center; flex: none; width: 36px; height: 40px; color: var(--ink-3); border: 1px solid var(--line-2); border-radius: var(--radius-sm); background: var(--surface); }
.t2 .ik-accept-file-icon svg { width: 22px; height: 22px; }
.t2 .ik-accept-file-info { min-width: 0; }
.t2 .ik-accept-file-info strong { font: var(--type-body); font-weight: var(--weight-medium); }
.t2 .ik-accept-file .hint { margin: 4px 0 0; }
.t2 .ik-accept-modal .ik-bar-receipt { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 14px; margin-top: 18px; }
.t2 .ik-accept-modal .ik-bar-field { display: grid; grid-template-columns: minmax(0, 1fr); gap: 6px; }
.t2 .ik-accept-modal .ik-bar-k { font: var(--type-caption); font-weight: var(--weight-medium); text-transform: none; letter-spacing: normal; color: var(--ink-2); }
.t2 .ik-accept-modal .ik-bar-field input { width: 100%; min-width: 0; min-height: 40px; padding-inline: 10px; box-sizing: border-box; }
.t2 .ik-accept-missing { margin: 16px 0 0; font: var(--type-caption); color: var(--ink-3); }
@media (max-width: 540px) {
  .t2 .ik-accept-modal > .modal-head, .t2 .ik-accept-modal > .modal-body, .t2 .ik-accept-modal > .modal-foot { padding: 16px; }
  .t2 .ik-accept-modal .ik-bar-receipt { grid-template-columns: minmax(0, 1fr); }
  .t2 .ik-accept-modal > .modal-foot .btn { max-width: 100%; white-space: normal; }
}
.project-draft-tag{display:inline-flex;align-items:center;flex-shrink:0;padding:2px 7px;border-radius: var(--radius-sm);font-size: var(--type-caption-size);font-weight: var(--weight-medium);line-height:1.5;background:var(--warn-tint);color:var(--warn)}

.hd-action>span:nth-child(2){min-width:0;overflow-wrap:anywhere}

/* Compact first row leaves the next pair of answers visible on laptops. */
.hd-grid{gap:14px;padding:20px 24px 32px}
.hd-trust .hd-value{font-size: var(--type-display-size)}
.hd-trust .hd-checks{margin:10px 0 8px}
.hd-trust .hd-caution{margin:4px 0;padding:5px 0}
.hd-needs .hd-waiting strong{font-size: var(--metric-medium-size)}
@media(max-width:640px){.hd-grid{padding:16px 12px}.hd-grid>*{grid-column:1}}

/* Keep comparison headers compact so page content owns the viewport. */
.t2.comparison-page .comparison-page-head{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:4px 20px;padding:14px 20px}
.comparison-page .comparison-page-title{margin:0;min-width:0}
.comparison-page .comparison-page-title h1{font-size: var(--type-title-size);line-height:1.3;margin:0}
.comparison-page .comparison-page-head>p{grid-column:1;font-size: var(--type-caption-size);line-height:1.5;margin:0}
.t2.comparison-page .comparison-page-actions{grid-column:2;grid-row:1 / 3;align-self:center;margin:0;gap:6px}
.comparison-page .comparison-page-actions .btn{min-height:32px;padding:6px 10px;font-size: var(--type-caption-size)}
.t2.review-queue-page .taskwrap{margin:12px 20px 16px}
.t2.review-queue-page .queue-head{display:grid;grid-template-columns:auto minmax(0,1fr);gap:8px 12px;padding:12px}
.t2.review-queue-page .queue-head h2{margin:0;font-size: var(--type-body-size);align-self:center}
.review-queue-page .ring-row{margin:0;gap:6px;justify-content:flex-end}
.review-queue-page .ring{width:28px;height:28px}
.review-queue-page .ring .core{width:21px;height:21px;font-size: var(--mark-size)}
.review-queue-page .ring-label{font-size: var(--mark-size)}
.review-queue-page .ring-row>div:last-child:empty{display:none}
.review-queue-page .queue-head>.seg{grid-column:1/-1;margin-top:0!important;display:flex}
.review-queue-page .queue-head>.seg button{flex:1;padding:6px 8px}
.review-queue-page .rbfilters{grid-column:1/-1;margin:0;gap:4px}
.review-queue-page .rbfilters button{font-size: var(--type-caption-size);padding:4px 7px}
.review-queue-page .qrow{padding:9px 12px;gap:8px}
.review-queue-page .qrow .meta{gap:4px;margin-bottom:3px;overflow:hidden}
.review-queue-page .qrow .traces{flex-wrap:nowrap;overflow:hidden;margin-top:4px}
.review-queue-page .qrow .traces>*{flex-shrink:0}
.t2.review-queue-page .detail{padding:16px 20px 40px}
.review-queue-page .detail-top{margin-bottom:8px}
@media(max-width:1000px){
 .t2.comparison-page .comparison-page-head{grid-template-columns:minmax(0,1fr);gap:5px}
 .t2.comparison-page .comparison-page-actions{grid-column:1;grid-row:auto;justify-self:start}
}
@media(max-width:800px){
 .t2.review-queue-page .taskwrap{margin:10px 12px}
 .t2.comparison-page .comparison-page-head{padding:12px}
 .t2.review-queue-page .queue{max-height:36vh}
}

.t2.comparison-page .doc-outer{padding:12px 20px}
.t2.comparison-page .comparison-details{margin:10px 0}
@media(max-width:800px){.t2.comparison-page .doc-outer{padding:10px 12px}}

/* Delay analysis — scoped presentation for discovery, results and history. */
.t2.why-screen {
 --why-blue: var(--component-color-426a9b);
 --why-blue-soft: var(--component-color-edf3fa);
 --why-muted: var(--component-color-6a778b);
 --why-border: var(--component-color-dfe5ec);
 background: var(--component-color-f5f7fa);
}
.t2.why-screen .pageblock, .t2.why-screen .pane { box-sizing: border-box; width: 100%; max-width: 1280px; margin-inline: auto; padding-inline: 30px; min-width: 0; }
.t2.why-screen .pageblock { padding-top: 30px; padding-bottom: 22px; }
.t2.why-screen .pagehead h1 { font-size: var(--component-size-26px); font-weight: var(--component-weight-650); letter-spacing: -.7px; line-height: 1.3; }
.t2.why-screen .subline { margin-top: 6px; font-size: var(--component-size-13px); line-height: 1.6; color: var(--why-muted); max-width: 780px; }
.t2.why-screen button:focus-visible, .t2.why-screen summary:focus-visible { outline: 2px solid var(--why-blue); outline-offset: 3px; }
/* The picker is an actual control, not a separate dashboard card. */
.t2.why-screen .why-find { background: transparent; border: 0; border-radius: 0; padding: 0; margin: 0 0 22px; box-shadow: none; display: block; }
.t2.why-screen .why-controls { display: grid; grid-template-columns: minmax(240px, 1.2fr) minmax(200px, .8fr); gap: 30px; align-items: center; }
.t2.why-screen .why-field, .t2.why-screen .why-context { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.t2.why-screen .why-field-label { font-size: var(--component-size-11px); font-weight: var(--component-weight-600); color: var(--why-muted); }
.t2.why-screen .why-pick { width: 100%; min-height: 44px; border-radius: var(--component-radius-8px); padding: 10px 14px; background: var(--component-color-fff); box-shadow: 0 2px 3px var(--component-color-17263d04); text-align: left; display: flex; justify-content: space-between; gap: 12px; font-size: var(--component-size-14px); }
.t2.why-screen .why-pick::after { content: '⌕'; font-size: var(--component-size-20px); line-height: 16px; color: var(--why-blue); }
.t2.why-screen .why-context { padding-left: 24px; border-left: 1px solid var(--why-border); }
.t2.why-screen .why-context-value { font-size: var(--component-size-13px); color: var(--ink); line-height: 1.55; overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }
/* Discovery: one divided workspace. Real movements supply the graphics. */
.t2.why-screen .why-suggestions { margin-top: 20px; }
.t2.why-screen .why-suggestions > summary { font-size: var(--component-size-12px); color: var(--why-muted); cursor: pointer; width: fit-content; padding: 0 0 12px; }
.t2.why-screen .why-suggestions-body { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.35fr); gap: 0 30px; background: var(--component-color-fff); border: 1px solid var(--why-border); border-radius: var(--component-radius-12px); padding: 24px; min-width: 0; }
.t2.why-screen .why-shortcuts { display: block; min-width: 0; padding: 0; border: 0; }
.t2.why-screen .why-group-heading { display: flex; align-items: center; gap: 9px; margin-bottom: 14px; }
.t2.why-screen .why-sc-label { margin: 0; font-size: var(--component-size-13px); font-weight: var(--component-weight-600); color: var(--ink); letter-spacing: -.1px; }
.t2.why-screen .why-group-count { font-size: var(--component-size-10px); font-weight: var(--component-weight-500); color: var(--why-muted); padding: 2px 5px; background: var(--component-color-f1f4f8); border-radius: var(--component-radius-4px); }
.t2.why-screen .why-group-note { font-size: var(--component-size-12px); line-height: 1.65; color: var(--why-muted); margin: -6px 0 18px; }
.t2.why-screen .why-suggestion-rows { display: flex; flex-direction: column; gap: 6px; }
.t2.why-screen .why-sc { position: relative; width: 100%; display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 5px 12px; align-items: center; text-align: left; padding: 12px; border: 0; border-radius: var(--component-radius-7px); background: transparent; transition: background 150ms, color 150ms; }
.t2.why-screen .why-sc:hover, .t2.why-screen .why-sc.on { background: var(--why-blue-soft); }
.t2.why-screen .why-sc b { grid-column: 1; font-size: var(--component-size-11px); font-weight: var(--component-weight-500); color: var(--why-muted); }
.t2.why-screen .why-sc .n { grid-column: 1; max-width: none; white-space: normal; overflow: visible; font-size: var(--component-size-14px); font-weight: var(--component-weight-500); line-height: 1.5; color: var(--ink); }
.t2.why-screen .why-sc::after { content: '↗'; grid-column: 2; grid-row: 1 / span 2; color: var(--component-color-7d8da2); font-size: var(--component-size-17px); }
.t2.why-screen .why-sc-role { grid-column: 1; font-size: var(--component-size-11px); color: var(--why-muted); }
.t2.why-screen .why-group-critical { grid-column: 1; grid-row: 1; }
.t2.why-screen .why-group-critical .why-sc { padding: 14px 14px 14px 18px; background: var(--component-color-f4f7fb); border-left: 3px solid var(--why-blue); border-radius: 0 var(--component-radius-7px) var(--component-radius-7px) 0; }
.t2.why-screen .why-group-critical .why-sc:hover { background: var(--component-color-e9f0f8); }
.t2.why-screen .why-group-milestones { grid-column: 1; margin-top: 22px; }
.t2.why-screen .why-group-delayed { grid-column: 2; grid-row: 1 / span 3; border-left: 1px solid var(--why-border); padding-left: 30px; }
.t2.why-screen .why-group-delayed .why-sc { grid-template-columns: minmax(0,1fr) 52px; padding: 10px 0 14px; border-radius: 0; border-bottom: 1px solid var(--component-color-eff2f6); }
.t2.why-screen .why-group-delayed .why-sc:hover { background: var(--component-color-f8fafc); }
.t2.why-screen .why-group-delayed .why-sc::after { display: none; }
.t2.why-screen .why-group-delayed .why-sc .d { grid-column: 2; grid-row: 1 / span 2; align-self: center; text-align: right; font-size: var(--component-size-18px); font-weight: var(--component-weight-600); letter-spacing: -.5px; color: var(--component-color-ad652c); }
.t2.why-screen .why-mini-movement { display: block; grid-column: 1 / -1; height: 6px; border-radius: 2px; background: var(--component-color-f1f3f7); margin-top: 5px; overflow: hidden; }
.t2.why-screen .why-mini-movement i { display: block; height: 100%; background: var(--component-color-c4874b); border-radius: 2px; }
.t2.why-screen .why-group-recent { grid-column: 1; align-self: start; border-top: 1px solid var(--why-border); padding-top: 18px; margin-top: 24px; }
.t2.why-screen .why-group-recent .why-group-heading { margin-bottom: 10px; }
.t2.why-screen .why-group-recent .why-suggestion-rows { flex-direction: row; flex-wrap: wrap; gap: 6px; }
.t2.why-screen .why-group-recent .why-sc { width: auto; display: inline-flex; padding: 6px 9px; gap: 10px; background: var(--component-color-f4f6f9); border-radius: var(--component-radius-5px); }
.t2.why-screen .why-group-recent .why-sc:hover { background: var(--component-color-e6eef8); }
.t2.why-screen .why-group-recent .why-sc::after { font-size: var(--component-size-12px); }
.t2.why-screen .why-suggestions-body:not(.has-delayed) { grid-template-columns: minmax(0,1fr); max-width: none; }
.t2.why-screen .why-suggestions-body:not(.has-delayed):has(.why-group-critical):has(.why-group-recent) { grid-template-columns: minmax(0,1fr) minmax(0,1fr); }
.t2.why-screen .why-suggestions-body:not(.has-delayed):has(.why-group-critical) .why-group-recent { grid-column: 2; grid-row: 1 / span 2; border-top: 0; border-left: 1px solid var(--why-border); padding: 0 0 0 30px; margin: 0; }
.t2.why-screen .why-start-hint { border: 0; padding: 0; margin-top: -6px; font-size: var(--component-size-12px); color: var(--why-muted); background: transparent; }
/* Selected activity: date-to-date movement and one dominant result. */
.t2.why-screen .why-head { display: grid; grid-template-columns: minmax(0,1fr) minmax(150px,220px); gap: 20px 32px; padding: 24px 26px 18px; margin: 0; border: 1px solid var(--why-border); border-radius: var(--component-radius-12px) var(--component-radius-12px) 0 0; background: var(--component-color-fff); box-shadow: none; }
.t2.why-screen .why-title { gap: 8px; align-items: center; }
.t2.why-screen .why-code { font: 12px var(--mono); color: var(--why-muted); letter-spacing: .025em; }
.t2.why-screen .why-name { font-size: var(--component-size-21px); line-height: 1.4; letter-spacing: -.4px; font-weight: var(--component-weight-600); margin: 8px 0 20px; color: var(--ink); overflow-wrap: anywhere; }
.t2.why-screen .why-date-route { display: flex; align-items: center; gap: 16px; width: fit-content; max-width: 100%; }
.t2.why-screen .why-date-point { display: flex; flex-direction: column; gap: 7px; min-width: 0; }
.t2.why-screen .k { font-size: var(--component-size-11px); color: var(--why-muted); }
.t2.why-screen .why-date-point .v { font-size: var(--component-size-14px); font-weight: var(--component-weight-500); font-variant-numeric: tabular-nums; }
.t2.why-screen .why-date-connector { flex: 0 0 62px; height: 1px; background: var(--component-color-cad6e5); position: relative; margin-top: 17px; }
.t2.why-screen .why-date-connector::before { content: ''; position: absolute; left: -2px; top: -3px; width: 7px; height: 7px; border-radius: 50%; background: var(--component-color-cad6e5); }
.t2.why-screen .why-date-connector::after { content: ''; position: absolute; right: 0; top: -3px; width: 7px; height: 7px; border-right: 1px solid var(--component-color-8299b7); border-top: 1px solid var(--component-color-8299b7); transform: rotate(45deg); }
.t2.why-screen .why-total { display: flex; flex-direction: column; justify-content: center; gap: 5px; border-left: 1px solid var(--why-border); padding-left: 30px; }
.t2.why-screen .why-total-value { font-size: clamp(24px,3vw,38px); line-height: 1.3; font-weight: var(--component-weight-600); letter-spacing: -1.4px; font-variant-numeric: tabular-nums; }
.t2.why-screen .why-total.has-delay .why-total-value { color: var(--component-color-a45c28); }
.t2.why-screen .why-total.has-gain .why-total-value { color: var(--ok); }
.t2.why-screen .why-total-note { font-size: var(--component-size-12px); color: var(--why-muted); }
.t2.why-screen .why-basis { grid-column: 1 / -1; font-size: var(--component-size-11px); color: var(--why-muted); padding-top: 12px; border-top: 1px solid var(--component-color-edf0f5); }
.t2.why-screen .why-basis summary { cursor: pointer; width: fit-content; }
.t2.why-screen .why-basis p { margin: 10px 0 0; max-width: 820px; line-height: 1.65; }
.t2.why-screen .why-workspace { min-width: 0; background: var(--component-color-fff); border: 1px solid var(--why-border); border-top: 0; border-radius: 0 0 var(--component-radius-12px) var(--component-radius-12px); padding: 0 26px 24px; box-shadow: 0 6px 20px var(--component-color-1f334504); }
.t2.why-screen .why-tabs { display: flex; flex-wrap: wrap; align-items: center; gap: 4px; margin: 0 0 22px; padding-top: 8px; border-bottom: 1px solid var(--why-border); }
.t2.why-screen .why-tab { font-size: var(--component-size-13px); padding: 12px 14px; border: 0; border-bottom: 2px solid transparent; background: none; color: var(--why-muted); margin-bottom: -1px; cursor: pointer; transition: color 150ms, border-color 150ms; }
.t2.why-screen .why-tab.on { color: var(--why-blue); border-bottom-color: var(--why-blue); font-weight: var(--component-weight-600); }
.t2.why-screen .why-tab:hover { color: var(--ink); }
.t2.why-screen .why-unit { margin-left: 14px; border-color: var(--why-border); border-radius: var(--component-radius-5px); }
.t2.why-screen .why-u { padding: 4px 9px; }
.t2.why-screen .why-u.on { background: var(--why-blue-soft); color: var(--why-blue); }
.t2.why-screen .why-dl { margin-left: auto; padding: 5px 0; gap: 6px; }
.t2.why-screen .why-dl .btn { font-size: var(--component-size-11px); box-shadow: none; }
.t2.why-screen .why-tab-content { min-width: 0; animation: why-enter 150ms ease-out; }
.t2.why-screen .why-tab-content > .why-card { padding: 0; border: 0; border-radius: 0; box-shadow: none; }
.t2.why-screen .why-chart-heading { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 16px; }
.t2.why-screen .why-chart-heading h3 { margin: 0 0 4px; font-size: var(--component-size-14px); font-weight: var(--component-weight-600); letter-spacing: -.1px; }
.t2.why-screen .why-chart-heading p { font-size: var(--component-size-12px); color: var(--why-muted); margin: 0; line-height: 1.5; }
.t2.why-screen .why-chart-unit { font-size: var(--component-size-10px); color: var(--why-muted); white-space: nowrap; }
.t2.why-screen .why-chart-options { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: 6px 16px; }
.t2.why-screen .why-zero-toggle { display: inline-flex; align-items: center; gap: 6px; margin: 0; font-size: var(--component-size-11px); font-weight: var(--weight-regular); color: var(--why-muted); cursor: pointer; white-space: nowrap; }
.t2.why-screen .why-zero-toggle input { width: 13px; height: 13px; margin: 0; accent-color: var(--why-blue); cursor: pointer; }
.t2.why-screen .why-tornado-card { position: relative; container-type: inline-size; max-width: 1180px; margin-inline: auto; }
.t2.why-screen .why-tornado-wrap { grid-template-columns: minmax(0,1fr) 174px; gap: 18px; align-items: start; }
.t2.why-screen .why-chart-main { min-width: 0; }
.t2.why-screen .why-chart-direction { display: flex; justify-content: space-between; gap: 12px; font-size: var(--component-size-10px); color: var(--why-muted); padding: 0 0 4px; }
.t2.why-screen .why-direction-gain { color: var(--component-color-33816d); }
.t2.why-screen .why-filter-status { font-size: var(--component-size-10px); line-height: 1.6; color: var(--why-muted); padding-top: 4px; }
.t2.why-screen .why-tornado .why-axis-context { font: 10px var(--sans); fill: var(--why-muted); }
.t2.why-screen .why-tornado .why-axis-tick { font: 10px var(--mono); fill: var(--component-color-7b879a); }
.t2.why-screen .why-tornado .why-negative-zone { fill: var(--component-color-f0f8f5); }
.t2.why-screen .why-tornado .why-row-backdrop { fill: transparent; transition: fill 120ms; }
.t2.why-screen .why-tornado .why-zero-row .why-row-backdrop { fill: var(--component-color-f5f7fa); }
.t2.why-screen .why-tornado .why-row.is-hovered .why-row-backdrop, .t2.why-screen .why-tornado .why-row:focus-visible .why-row-backdrop { fill: var(--component-color-edf2fa); }
.t2.why-screen .why-tornado .why-row.is-hovered .bar { filter: brightness(1.08); }
.t2.why-screen .why-tornado .why-row.is-hovered .num { fill: var(--why-blue); }
.t2.why-screen .why-tornado { min-width: 0; height: auto; }
.t2.why-screen .why-compact-plot { display: none; }
.t2.why-screen .why-compact-row { display: grid; grid-template-columns: minmax(0,1fr) auto; gap: 7px; width: 100%; text-align: left; padding: 10px 0; background: none; border: 0; border-bottom: 1px solid var(--component-color-edf0f5); color: var(--ink); font: inherit; }
.t2.why-screen button.why-compact-row { cursor: pointer; }
.t2.why-screen .why-compact-label { display: flex; flex-direction: column; gap: 3px; font-size: var(--component-size-11px); line-height: 1.4; }
.t2.why-screen .why-compact-label .mono { font-size: var(--component-size-10px); color: var(--why-muted); }
.t2.why-screen .why-compact-value { font-size: var(--component-size-12px); font-weight: var(--component-weight-600); white-space: nowrap; align-self: center; }
.t2.why-screen .why-compact-track { position: relative; grid-column: 1 / -1; height: 9px; background: var(--component-color-f1f4f8); border-radius: 2px; }
.t2.why-screen .why-compact-bar { position: absolute; top: 0; height: 100%; border-radius: var(--component-radius-3px); }
.t2.why-screen .why-compact-cause { grid-column: 1 / -1; font-size: var(--component-size-10px); color: var(--why-muted); }
.t2.why-screen .why-compact-zero { position: absolute; width: 1px; top: -3px; bottom: -3px; background: var(--component-color-91a1b7); }
.t2.why-screen .why-tornado .why-gridline { stroke: var(--component-color-e7edf5); stroke-dasharray: 3 5; }
.t2.why-screen .why-tornado .zero { stroke: var(--component-color-9baec7); stroke-width: 1.2; }
.t2.why-screen .why-tornado .lab { fill: inherit; font: inherit; }
.t2.why-screen .why-tornado .why-bar-name { fill: var(--component-color-58677b); font: 11px var(--sans); }
.t2.why-screen .why-tornado .num { fill: var(--ink); font-size: var(--component-size-10px); font-weight: var(--component-weight-600); }
.t2.why-screen .why-tornado .bar { transition: filter 150ms; }
.t2.why-screen .why-legend { display: flex; flex-direction: column; align-items: stretch; gap: 2px; padding: 0 0 0 14px; border: 0; border-left: 1px solid var(--why-border); }
.t2.why-screen .why-legend-note { font-size: var(--component-size-9px); color: var(--why-muted); line-height: 1.5; margin: 0 0 2px; }
.t2.why-screen .why-cause-all { align-self: flex-start; background: none; border: 1px solid transparent; border-radius: var(--component-radius-4px); color: var(--why-muted); font: inherit; font-size: var(--component-size-10px); cursor: pointer; padding: 3px 7px; margin-left: -7px; }
.t2.why-screen .why-cause-all[aria-pressed="true"] { background: var(--component-color-edf2fa); color: var(--why-blue); font-weight: var(--component-weight-600); }
.t2.why-screen .why-cause-filter { position: relative; display: grid; grid-template-columns: 7px minmax(0,1fr) auto; align-items: center; gap: 2px 7px; width: 100%; background: none; border: 1px solid transparent; border-radius: var(--component-radius-4px); padding: 4px 7px; margin: 0 0 0 -7px; text-align: left; color: var(--ink); font: inherit; cursor: pointer; transition: background 120ms, border-color 120ms; }
.t2.why-screen .why-cause-filter:hover { background: var(--component-color-f4f7fb); }
.t2.why-screen .why-cause-filter[aria-pressed="true"] { border-color: var(--why-cause-color); background: color-mix(in srgb, var(--why-cause-color) 7%, white); }
.t2.why-screen .why-cause-filter .cause-swatch { width: 7px; height: 7px; border-radius: 2px; }
.t2.why-screen .why-lg-count { font-size: var(--component-size-10px); color: var(--why-muted); font-variant-numeric: tabular-nums; }
.t2.why-screen .why-cause-track { grid-column: 2 / -1; height: 2px; background: var(--component-color-edf0f5); border-radius: 2px; overflow: hidden; }
.t2.why-screen .why-cause-track i { display: block; height: 100%; border-radius: var(--component-radius-4px); background: var(--why-cause-color); }
.t2.why-screen .why-chart-tooltip { position: absolute; z-index: 500; width: 330px; max-width: calc(100vw - 24px); box-sizing: border-box; padding: 17px; color: var(--component-color-263349); background: var(--component-color-fff); border: 1px solid var(--component-color-dce4ee); border-radius: var(--component-radius-10px); box-shadow: 0 12px 40px var(--component-color-23395426), 0 2px 6px var(--component-color-23395412); pointer-events: none; }
.t2.why-screen .why-chart-tooltip[hidden] { display: none; }
.t2.why-screen .why-tip-cause { display: flex; align-items: center; gap: 7px; font-size: var(--component-size-10px); color: var(--why-muted); margin-bottom: 12px; }
.t2.why-screen .why-tip-code { font-size: var(--component-size-10px); color: var(--why-muted); margin-bottom: 5px; }
.t2.why-screen .why-tip-name { display: block; font-size: var(--component-size-13px); font-weight: var(--component-weight-600); line-height: 1.5; overflow-wrap: anywhere; }
.t2.why-screen .why-tip-metrics { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; padding: 14px 0; margin-top: 8px; border-block: 1px solid var(--component-color-edf0f5); }
.t2.why-screen .why-tip-metrics div { display: flex; flex-direction: column; gap: 5px; }
.t2.why-screen .why-tip-metrics span { color: var(--why-muted); font-size: var(--component-size-10px); }
.t2.why-screen .why-tip-metrics strong { font-size: var(--component-size-21px); font-weight: var(--component-weight-600); letter-spacing: -.5px; }
.t2.why-screen .why-tip-own, .t2.why-screen .why-tip-dates { color: var(--component-color-59677b); font-size: var(--component-size-11px); line-height: 1.6; margin-top: 10px; }
.t2.why-screen .why-tip-description { color: var(--component-color-59677b); font-size: var(--component-size-11px); line-height: 1.7; margin: 10px 0 0; }
.t2.why-screen .why-tip-hint { font-size: var(--component-size-10px); color: var(--why-blue); padding-top: 12px; }
@container (max-width: 660px) {
 .t2.why-screen .why-tornado-wrap { grid-template-columns: minmax(0,1fr); gap: 12px; }
 .t2.why-screen .why-legend { grid-row: 1; flex-direction: row; flex-wrap: wrap; align-items: center; gap: 4px 10px; padding: 0 0 10px; border-left: 0; border-bottom: 1px solid var(--why-border); }
 .t2.why-screen .why-legend .why-lg-h { margin: 0; }
 .t2.why-screen .why-legend-note { flex-basis: 100%; order: 2; margin: 0; }
 .t2.why-screen .why-cause-filter { width: auto; min-width: 130px; margin: 0; }
 .t2.why-screen .why-cause-all { margin: 0; align-self: center; }
}
.t2.why-screen .why-lg-h { font-size: var(--component-size-11px); margin: 2px 0 0; color: var(--ink); font-weight: var(--component-weight-600); }
.t2.why-screen .why-lg { font-size: var(--component-size-10px); line-height: 1.4; }
.t2.why-screen .why-sum { padding: 12px 14px; margin-top: 18px; border-radius: var(--component-radius-6px); background: var(--component-color-f5f7fa); line-height: 1.65; }
.t2.why-screen .why-note { font-size: var(--component-size-11px); line-height: 1.65; color: var(--why-muted); margin-top: 12px; }
.t2.why-screen .why-tornado-card .why-sum { padding: 6px 10px; margin-top: 8px; font-size: var(--component-size-10px); }
.t2.why-screen .why-tornado-card .why-note { margin-top: 6px; font-size: var(--component-size-10px); }
/* Read-only workflow canvas: the source sequence is preserved across lanes. */
.t2.why-screen .why-chain-card, .t2.why-screen .why-tab-content > .why-chain-card { padding: 0; overflow: hidden; border: 1px solid var(--component-color-dde4ed); border-radius: var(--component-radius-12px); box-shadow: 0 4px 20px var(--component-color-20344e06); }
.t2.why-screen .why-chain-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 17px 20px; background: var(--component-color-fff); border-bottom: 1px solid var(--component-color-e4e9f0); }
.t2.why-screen .why-chain-title h3 { margin: 0; font-size: var(--component-size-14px); font-weight: var(--component-weight-650); letter-spacing: -.15px; }
.t2.why-screen .why-chain-title p { margin: 4px 0 0; color: var(--component-color-77869a); font-size: var(--component-size-11px); }
.t2.why-screen .why-chain-actions { display: flex; align-items: center; gap: 6px; flex-shrink: 0; }
.t2.why-screen .why-canvas-button { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-width: 32px; min-height: 32px; padding: 6px 8px; border: 1px solid transparent; border-radius: var(--component-radius-6px); background: transparent; font: inherit; font-size: var(--component-size-11px); font-weight: var(--component-weight-550); color: var(--component-color-52647b); cursor: pointer; white-space: nowrap; }
.t2.why-screen .why-canvas-button:hover { background: var(--component-color-edf2f8); color: var(--component-color-294f83); }
.t2.why-screen .why-canvas-button:focus-visible { outline: 2px solid var(--component-color-537bc1); outline-offset: 2px; }
.t2.why-screen .why-canvas-button:disabled { opacity: .35; cursor: default; }
.t2.why-screen .why-canvas-button svg, .t2.why-screen .why-node-symbol svg { width: 18px; height: 18px; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; fill: none; flex-shrink: 0; }
.t2.why-screen .why-zoom-controls { display: flex; align-items: center; border: 1px solid var(--component-color-dfe5ee); border-radius: var(--component-radius-7px); padding: 2px; background: var(--component-color-fafbfd); }
.t2.why-screen .why-zoom-value { min-width: 50px; font-variant-numeric: tabular-nums; }
.t2.why-screen .why-chain-surface { position: relative; isolation: isolate; }
.t2.why-screen .why-chain-viewport { position: relative; height: clamp(560px, 70vh, 780px); overflow: hidden; background-color: var(--component-color-f7f9fc); background-image: radial-gradient(circle, var(--component-color-d2dae6) .8px, transparent .8px); background-size: 24px 24px; touch-action: none; overscroll-behavior: contain; cursor: grab; outline-offset: -3px; }
.t2.why-screen .why-chain-viewport.panning, .t2.why-screen .why-chain-viewport.panning * { cursor: grabbing; }
.t2.why-screen .why-chain { display: block; position: absolute; inset: 0 auto auto 0; padding: 0; overflow: visible; transform-origin: 0 0; will-change: transform; scroll-snap-type: none; user-select: none; }
.t2.why-screen .why-chain-edges { position: absolute; inset: 0; overflow: visible; pointer-events: none; }
.t2.why-screen .why-chain-edges > path { fill: none; stroke: var(--component-color-a6b5c8); stroke-width: 1.5; vector-effect: non-scaling-stroke; }
.t2.why-screen .why-ccard { box-sizing: border-box; position: absolute; width: 248px; height: 216px; padding: 14px 16px 10px; display: flex; flex-direction: column; gap: 0; border: 1px solid var(--component-color-d5deea); border-radius: var(--component-radius-10px); background: var(--component-color-fff); box-shadow: 0 3px 5px var(--component-color-24395206), 0 8px 22px var(--component-color-24395206); cursor: pointer; scroll-snap-align: none; }
.t2.why-screen .why-ccard::before { content: ''; position: absolute; inset: 14px auto 14px -1px; width: 3px; border-radius: var(--component-radius-3px); background: var(--node-cause); }
.t2.why-screen .why-ccard.flat { opacity: 1; }
.t2.why-screen .why-ccard:hover { border-color: var(--component-color-95a9c5); box-shadow: 0 5px 20px var(--component-color-29487215); }
.t2.why-screen .why-ccard:focus-visible, .t2.why-screen .why-ccard.open { outline: 2px solid var(--component-color-6689ba); outline-offset: 3px; }
.t2.why-screen .why-ccard.target { border-color: var(--component-color-638aba); background: var(--component-color-f4f8fe); box-shadow: 0 0 0 4px var(--component-color-6188bc12); }
.t2.why-screen .why-ccard.target::before { background: var(--component-color-426a9b); }
.t2.why-screen .why-ccard .top { display: flex; align-items: center; gap: 8px; margin-bottom: 9px; }
.t2.why-screen .why-ccard .top b { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--component-size-11px); }
.t2.why-screen .why-node-symbol { display: grid; place-items: center; width: 28px; height: 28px; flex: none; border: 1px solid color-mix(in srgb, var(--node-cause) 24%, white); background: color-mix(in srgb, var(--node-cause) 9%, white); border-radius: var(--component-radius-7px); color: var(--node-cause); }
.t2.why-screen .why-ccard.target .why-node-symbol { color: var(--component-color-426a9b); background: var(--component-color-e4edf9); border-color: var(--component-color-d1dff1); }
.t2.why-screen .why-step { margin-left: auto; color: var(--component-color-8d9db3); font: 10px var(--mono); }
.t2.why-screen .why-ccard .n { font-size: var(--component-size-13px); line-height: 1.5; min-height: 39px; height: 39px; margin-bottom: 10px; color: var(--component-color-25364e); display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; }
.t2.why-screen .why-ccard .d { font-size: var(--component-size-13px); line-height: 18px; font-weight: var(--component-weight-650); color: var(--component-color-647489); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.t2.why-screen .why-ccard .d.bad { color: var(--component-color-b46429); }
.t2.why-screen .why-ccard .d.ok { color: var(--component-color-17816a); }
.t2.why-screen .why-ccard.target .d { color: var(--component-color-365f95); }
.t2.why-screen .why-node-cause { font-size: var(--component-size-10px); color: var(--component-color-8490a1); line-height: 17px; margin-bottom: auto; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.t2.why-screen .why-node-dates { display: flex; align-items: center; gap: 7px; color: var(--component-color-718099); font-size: var(--component-size-10px); line-height: 16px; padding: 9px 0; border-top: 1px solid var(--component-color-edf0f5); }
.t2.why-screen .why-node-date-arrow { color: var(--component-color-a3b3c9); }
.t2.why-screen .why-node-actions { display: flex; justify-content: space-between; align-items: center; border-top: 1px solid var(--component-color-edf0f5); padding-top: 7px; min-height: 20px; }
.t2.why-screen .why-more, .t2.why-screen .why-look { font-size: var(--component-size-10px); color: var(--component-color-526f97); text-decoration: none; }
.t2.why-screen .why-look { margin-left: auto; }
.t2.why-screen .why-more:hover, .t2.why-screen .why-look:hover { text-decoration: underline; }
.t2.why-screen .why-node-port { position: absolute; top: calc(50% - 4px); width: 8px; height: 8px; border-radius: 50%; border: 1.5px solid var(--component-color-a5b5c9); background: var(--component-color-fff); }
.t2.why-screen .why-node-port.in { left: -5px; }
.t2.why-screen .why-node-port.out { right: -5px; }
/* At overview scale, retain identifiers and movement instead of illegible fine print. */
.t2.why-screen .overview .why-ccard { justify-content: center; }
.t2.why-screen .overview .why-ccard .n, .t2.why-screen .overview .why-node-dates,
.t2.why-screen .overview .why-node-actions, .t2.why-screen .overview .why-node-cause,
.t2.why-screen .overview .why-node-symbol { display: none; }
.t2.why-screen .overview .why-ccard .top { display: block; margin-bottom: 16px; }
.t2.why-screen .overview .why-ccard .top b { display: block; font-size: var(--overview-font); }
.t2.why-screen .overview .why-step { position: absolute; right: 12px; top: 10px; font-size: var(--component-size-20px); }
.t2.why-screen .overview .why-ccard .d { font-size: var(--component-size-24px); line-height: 1.3; white-space: normal; }
.t2.why-screen .why-chain-overlay { position: absolute; inset: 0; pointer-events: none; }
.t2.why-screen .why-chain-minimap { position: absolute; right: 18px; bottom: 18px; width: 148px; padding: 10px; border: 1px solid var(--component-color-dce4ef); border-radius: var(--component-radius-9px); background: var(--component-color-ffffffed); box-shadow: 0 3px 12px var(--component-color-2038530a); pointer-events: auto; }
.t2.why-screen .why-chain-minimap > span { display: block; color: var(--component-color-8090a7); font-size: var(--component-size-8px); letter-spacing: .8px; font-weight: var(--component-weight-600); margin-bottom: 8px; }
.t2.why-screen .why-chain-minimap svg { display: block; width: 100%; height: 80px; cursor: crosshair; touch-action: none; }
.t2.why-screen .why-map-window { fill: var(--component-color-426a9b0f); stroke: var(--component-color-6389bf); stroke-width: 1.5px; vector-effect: non-scaling-stroke; }
.t2.why-screen .why-chain-detail { position: absolute; top: 16px; right: 16px; width: min(340px, calc(100% - 32px)); max-height: calc(100% - 158px); overflow-y: auto; padding: 14px 18px 16px; border: 1px solid var(--component-color-d7e1ef); border-radius: var(--component-radius-10px); background: var(--component-color-fff); box-shadow: 0 8px 32px var(--component-color-2038531a); pointer-events: auto; }
.t2.why-screen .why-chain-detail[hidden] { display: none; }
.t2.why-screen .why-detail-top { display: flex; align-items: center; justify-content: space-between; color: var(--component-color-7b8ca4); font-size: var(--component-size-10px); }
.t2.why-screen .why-chain-detail h4 { font-size: var(--component-size-14px); line-height: 1.5; color: var(--component-color-293c56); margin: 8px 0 12px; overflow-wrap: anywhere; }
.t2.why-screen .why-detail-value { font-size: var(--component-size-13px); font-weight: var(--component-weight-600); margin-bottom: 12px; }
.t2.why-screen .why-chain-detail .why-sentence { display: block; font-size: var(--component-size-12px); line-height: 1.8; color: var(--component-color-5a6b82); margin: 12px 0; }
.t2.why-screen .why-chain-detail > .why-canvas-button { border-color: var(--component-color-dce4ee); width: 100%; margin-top: 8px; }
.t2.why-screen .why-chain-footer { display: flex; justify-content: space-between; gap: 10px; padding: 12px 20px; border-top: 1px solid var(--component-color-e4e9f0); background: var(--component-color-fff); color: var(--component-color-7c8ba0); font-size: var(--component-size-10px); line-height: 1.6; }
.t2.why-screen.why-chain-dialog { max-width: none; max-height: none; width: calc(100vw - 40px); height: calc(100dvh - 40px); padding: 0; border: 0; border-radius: var(--component-radius-14px); background: var(--component-color-fff); overflow: hidden; color: var(--ink); }
.t2.why-screen.why-chain-dialog::backdrop { background: var(--component-color-18283d77); backdrop-filter: blur(4px); }
.t2.why-screen.why-chain-dialog .why-chain-card { height: 100%; display: flex; flex-direction: column; margin: 0; border: 0; }
.t2.why-screen.why-chain-dialog .why-chain-toolbar, .t2.why-screen.why-chain-dialog .why-chain-footer { flex-shrink: 0; }
.t2.why-screen.why-chain-dialog .why-chain-surface { flex: 1; min-height: 0; }
.t2.why-screen.why-chain-dialog .why-chain-viewport { height: 100%; }
@media(max-width: 700px) {
 .t2.why-screen .why-chain-toolbar { flex-wrap: wrap; gap: 12px; padding: 14px; }
 .t2.why-screen .why-chain-actions { width: 100%; justify-content: space-between; gap: 2px; }
 .t2.why-screen .why-chain-viewport { height: 560px; }
 .t2.why-screen .why-chain-footer { flex-direction: column; gap: 3px; padding: 12px 14px; }
 .t2.why-screen .why-chain-minimap { right: 12px; bottom: 12px; width: 116px; }
 .t2.why-screen .why-chain-minimap svg { height: 65px; }
 .t2.why-screen.why-chain-dialog { width: calc(100vw - 12px); height: calc(100dvh - 12px); }
}
/* History table keeps its source activity in view. */
.t2.why-screen .vt-host { min-width: 0; }
.t2.why-screen .vt-metrics { margin-bottom: 16px; }
.t2.why-screen .vt-m { font-size: var(--component-size-11px); padding: 6px 10px; }
.t2.why-screen .vt-wrap { overflow: auto; max-height: 64vh; border: 1px solid var(--why-border); border-radius: var(--component-radius-8px); }
.t2.why-screen .vt-act { min-width: 225px; background: var(--component-color-fff); }
.t2.why-screen .vt thead th { position: sticky; top: 0; z-index: 2; background: var(--component-color-f5f7fa); }
.t2.why-screen .vt thead .vt-act { z-index: 3; }
.t2.why-screen .vt-row:hover td { background: var(--component-color-f1f6fc); }
.t2.why-screen .vt-cell { font-variant-numeric: tabular-nums; }
.t2.why-screen .vt-cell:has(.d.bad) { background: var(--component-color-fff8f2); }
.t2.why-screen .vt-cell:has(.d.good) { background: var(--component-color-f2faf6); }
.t2.why-screen .vt-foot { background: var(--component-color-fff); padding: 12px; font-size: var(--component-size-11px); line-height: 1.6; }
.t2.why-screen .why-empty { font-size: var(--component-size-13px); line-height: 1.6; padding: 22px 26px; box-shadow: none; }
.t2.why-screen .why-comparison-empty { display: flex; align-items: flex-start; gap: 20px; box-sizing: border-box; width: 100%; max-width: 760px; margin: 28px auto; padding: 28px; background: var(--component-color-fff); border: 1px solid var(--why-border); border-radius: var(--component-radius-12px); box-shadow: 0 4px 20px var(--component-color-20344e06); }
.t2.why-screen .why-comparison-empty-icon { display: grid; place-items: center; flex: 0 0 52px; width: 52px; height: 52px; border-radius: var(--component-radius-12px); background: var(--why-blue-soft); color: var(--why-blue); }
.t2.why-screen .why-comparison-empty-icon svg { width: 30px; height: 30px; }
.t2.why-screen .why-comparison-empty-content { min-width: 0; }
.t2.why-screen .why-comparison-empty h2 { margin: 0; color: var(--ink); font-size: var(--component-size-18px); font-weight: var(--component-weight-600); line-height: 1.4; }
.t2.why-screen .why-comparison-empty-intro { margin: 8px 0 0; color: var(--ink-3); }
.t2.why-screen .why-comparison-empty-candidate { margin: 12px 0 0; color: var(--ink-3); overflow-wrap: anywhere; }
.t2.why-screen .why-comparison-empty-actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 20px; }
.t2.why-screen .why-comparison-empty-actions .btn { min-height: 38px; max-width: 100%; white-space: normal; overflow-wrap: anywhere; text-align: left; }
.t2.why-screen .why-comparison-empty-hint { margin: 18px 0 0; padding-top: 16px; border-top: 1px solid var(--why-border); color: var(--why-muted); font-size: var(--component-size-12px); }
@media (max-width: 600px) {
 .t2.why-screen .why-comparison-empty { flex-direction: column; gap: 16px; margin-block: 18px; padding: 20px; }
}
.t2.why-screen .why-head + .why-empty { border: 1px solid var(--why-border); border-top: 0; border-radius: 0 0 var(--component-radius-12px) var(--component-radius-12px); margin: 0; background: var(--component-color-fff); }
.t2.why-screen .why-nodelay { color: var(--ok); }
.t2.why-screen .why-start-hint { padding: 0; }
.t2.why-screen .why-loading { flex: 1; display: grid; place-items: center; min-height: 220px; padding: 24px; color: var(--why-muted); }
.t2.why-screen .why-loading-status { display: flex; flex-direction: column; align-items: center; gap: 12px; text-align: center; font-size: var(--component-size-12px); line-height: 1.5; }
.t2.why-screen > .pane:has(> .why-loading), .t2.why-screen .why-tab-content:has(> .why-loading) { display: flex; flex-direction: column; }
.t2.why-screen .why-spinner { display: block; width: 22px; height: 22px; box-sizing: border-box; border: 2px solid var(--why-border); border-top-color: var(--why-blue); border-radius: 50%; animation: why-spin .7s linear infinite; }
@keyframes why-spin { to { transform: rotate(360deg); } }
@keyframes why-enter { from { opacity: .65; transform: translateY(3px); } to { opacity: 1; transform: none; } }
@media(max-width:760px) {
 .t2.why-screen .pageblock, .t2.why-screen .pane { padding-inline: 16px; }
 .t2.why-screen .pageblock { padding-top: 24px; }
 .t2.why-screen .why-controls { grid-template-columns: 1fr; gap: 14px; }
 .t2.why-screen .why-context { border: 0; padding-left: 0; gap: 5px; }
 .t2.why-screen .why-suggestions-body { display: flex; flex-direction: column; gap: 22px; padding: 18px; }
 .t2.why-screen .why-group-delayed { border: 0; padding: 0; order: -1; }
 .t2.why-screen .why-group-milestones, .t2.why-screen .why-group-recent { margin-top: 0; }
 .t2.why-screen .why-suggestions-body:not(.has-delayed):has(.why-group-critical) .why-group-recent { border-left: 0; border-top: 1px solid var(--why-border); padding: 18px 0 0; }
 .t2.why-screen .why-head { grid-template-columns: 1fr; padding: 20px 18px 14px; gap: 16px; }
 .t2.why-screen .why-total { border-left: 0; border-top: 1px solid var(--why-border); padding: 14px 0 0; }
 .t2.why-screen .why-total-value { font-size: var(--component-size-32px); }
 .t2.why-screen .why-date-connector { flex-basis: 32px; }
 .t2.why-screen .why-date-route { gap: 12px; }
 .t2.why-screen .why-name { font-size: var(--component-size-19px); }
 .t2.why-screen .why-workspace { padding: 0 18px 18px; }
 .t2.why-screen .why-tab { padding: 12px 6px; font-size: var(--component-size-12px); }
 .t2.why-screen .why-unit { margin-left: auto; }
 .t2.why-screen .why-dl { width: 100%; margin: 3px 0 8px; }
 .t2.why-screen .why-chart-heading { align-items: start; }
 .t2.why-screen .why-chart-unit { display: none; }
 .t2.why-screen .why-plot { display: none; }
 .t2.why-screen .why-compact-plot { display: grid; }
 .t2.why-screen .vt-act { min-width: 170px; max-width: 190px; }
}
@media(prefers-reduced-motion:reduce) {
 .t2.why-screen .why-tab-content, .t2.why-screen .why-spinner { animation: none; }
 .t2.why-screen .why-sc, .t2.why-screen .why-tab, .t2.why-screen .why-tornado .bar { transition: none; }
}
.support-modal .support-message-text { white-space: pre-wrap; overflow-wrap: anywhere; }
.support-modal .err:empty { display: none; }
.support-modal .support-message { padding: 12px 0; border-bottom: 1px solid var(--line); }
.support-modal .modal-body > details { margin-top: 24px; }

/* Delay workspace chrome: keep controls visible and give the data the remaining space. */
.t2.scr.why-screen > .pageblock { max-width: none; padding: 16px 24px; border-bottom: 1px solid var(--component-color-e2e7ef); background: var(--component-color-fff); }
.t2.why-screen .why-page-header { align-items: center; justify-content: flex-start; gap: 24px; flex-wrap: wrap; }
.t2.why-screen .why-heading { flex: 0 1 240px; min-width: 190px; }
.t2.why-screen .why-page-header h1 { font-size: var(--component-size-20px); letter-spacing: -.5px; margin: 0; }
.t2.why-screen .why-page-header .subline { font-size: var(--component-size-11px); margin: 5px 0 0; line-height: 1.5; }
.t2.why-screen .why-page-header .why-find { flex: 1; min-width: 480px; max-width: none; margin: 0; }
.t2.why-screen .why-controls { grid-template-columns: minmax(200px,356px) minmax(150px,1fr) auto; gap: 18px; align-items: end; }
.t2.why-screen .why-field, .t2.why-screen .why-context { gap: 5px; }
.t2.why-screen .why-field-label { font-size: var(--component-size-10px); font-weight: var(--component-weight-500); color: var(--component-color-78869b); }
.t2.why-screen .why-pick { min-height: 36px; font-size: var(--component-size-12px); padding: 7px 10px; border-radius: var(--component-radius-6px); box-shadow: none; background: var(--component-color-f9fafc); }
.t2.why-screen .why-context { border-left: 0; padding-left: 0; padding-bottom: 2px; }
.t2.why-screen .why-page-header .why-context { justify-self: end; }
.t2.why-screen .why-context-value { display: flex; align-items: center; min-height: 32px; font-size: var(--component-size-12px); line-height: 1.5; }
.t2.why-screen .why-suggestions-trigger { min-height: 36px; padding: 7px 10px; border: 1px solid var(--component-color-dce3ed); border-radius: var(--component-radius-6px); background: var(--component-color-fff); font: inherit; font-size: var(--component-size-11px); color: var(--component-color-61738d); cursor: pointer; }
.t2.why-screen .why-suggestions-trigger:hover, .t2.why-screen .why-suggestions-trigger[aria-expanded="true"] { background: var(--component-color-eef3fa); border-color: var(--component-color-b8c9df); color: var(--component-color-3f6295); }
.t2.why-screen .why-secondary-popover { position: fixed; inset: auto; margin: 0; box-sizing: border-box; width: 410px; max-width: calc(100vw - 24px); max-height: min(70dvh, 600px); overflow: auto; scrollbar-width: thin; padding: 20px; border: 1px solid var(--component-color-dce4ef); border-radius: var(--component-radius-10px); background: var(--component-color-fff); color: var(--component-color-26354b); box-shadow: 0 12px 40px var(--component-color-1f385426); }
.t2.why-screen .why-secondary-popover > h3 { margin: 0 0 14px; font-size: var(--component-size-14px); letter-spacing: -.2px; }
.t2.why-screen .why-secondary-popover > p { margin: 0; font-size: var(--component-size-12px); line-height: 1.8; }
.t2.why-screen .why-suggestions-popover { width: 700px; }
.t2.why-screen .why-suggestions-heading { display: flex; align-items: center; justify-content: space-between; gap: 14px; margin-bottom: 16px; }
.t2.why-screen .why-suggestions-heading h3 { margin: 0; font-size: var(--component-size-14px); line-height: 1.5; letter-spacing: -.2px; }
.t2.why-screen .why-suggestions-close { display: grid; place-items: center; flex: 0 0 30px; width: 30px; height: 30px; padding: 0; border: 0; border-radius: var(--radius-sm); background: var(--surface-3); color: var(--ink-3); font-size: var(--component-size-22px); cursor: pointer; }
.t2.why-screen .why-suggestions-close:hover { background: var(--accent-tint); color: var(--ink); }
.t2.why-screen .why-suggestions-popover.is-narrow .why-suggestions-body { display: flex; flex-direction: column; gap: 20px; }
.t2.why-screen .why-suggestions-popover.is-narrow .why-shortcuts { margin: 0; padding: 0; border: 0; }
.t2.why-screen .why-suggestions-popover.is-narrow .why-shortcuts + .why-shortcuts { padding-top: 16px; border-top: 1px solid var(--line-2); }
.t2.why-screen .why-suggestions-popover.is-narrow .why-group-delayed { order: 0; }
.t2.why-screen .why-suggestions-popover .why-suggestions-body { padding: 0; border: 0; border-radius: 0; gap: 0 24px; }
.t2.why-screen .why-suggestions-popover .why-sc .n { font-size: var(--component-size-12px); }
.t2.why-screen .why-suggestions-popover .why-group-delayed { padding-left: 22px; }
.t2.why-screen .why-info-button { align-self: center; width: 25px; height: 25px; padding: 0; border: 1px solid var(--component-color-dbe3ee); border-radius: 50%; background: var(--component-color-fff); font: 600 12px var(--sans); color: var(--component-color-788ba7); cursor: pointer; }
.t2.why-screen .why-info-button:hover { color: var(--component-color-426a9b); background: var(--component-color-eef3fa); border-color: var(--component-color-9cb4d3); }
.t2.scr.why-screen > .pane { max-width: none; min-height: 0; padding: 0 24px 16px; scrollbar-width: thin; }
.t2.why-screen .why-head { flex: none; display: grid; grid-template-columns: minmax(180px,1fr) minmax(250px,auto) auto 25px; align-items: center; gap: 20px; padding: 15px 0; border: 0; border-radius: 0; background: transparent; }
.t2.why-screen .why-identity { min-width: 0; }
.t2.why-screen .why-title { gap: 7px; margin: 0 0 4px; }
.t2.why-screen .why-code { font-size: var(--component-size-10px); color: var(--component-color-7f8da1); }
.t2.why-screen .why-name { margin: 0; font-size: var(--component-size-16px); line-height: 1.4; font-weight: var(--component-weight-600); letter-spacing: -.3px; }
.t2.why-screen .why-date-route { gap: 12px; }
.t2.why-screen .why-date-point { gap: 4px; max-width: 180px; }
.t2.why-screen .why-date-point .k { font-size: var(--component-size-10px); line-height: 1.5; }
.t2.why-screen .why-date-point .v { font-size: var(--component-size-12px); }
.t2.why-screen .why-date-connector { flex-basis: 26px; margin-top: 16px; }
.t2.why-screen .why-total { min-width: 125px; border-left: 1px solid var(--component-color-dfe5ef); border-top: 0; padding: 0 0 0 20px; gap: 2px; }
.t2.why-screen .why-total .k { font-size: var(--component-size-10px); }
.t2.why-screen .why-total-value { font-size: var(--component-size-25px); line-height: 1.2; letter-spacing: -.8px; }
.t2.why-screen .why-total-note { font-size: var(--component-size-10px); line-height: 1.4; }
.t2.why-screen .why-workspace { display: flex; flex-direction: column; min-height: 0; padding: 0; border: 1px solid var(--component-color-dce3ed); border-radius: var(--component-radius-10px); background: var(--component-color-fff); box-shadow: 0 2px 8px var(--component-color-20385304); overflow: hidden; }
.t2.why-screen .why-tabs { flex: none; display: flex; flex-wrap: wrap; gap: 8px 12px; min-height: 49px; margin: 0; padding: 7px 12px; border-bottom: 1px solid var(--component-color-e4e9f0); }
.t2.why-screen .why-view-switch { display: flex; gap: 2px; padding: 3px; background: var(--component-color-f0f3f7); border-radius: var(--component-radius-7px); }
.t2.why-screen .why-tab { display: flex; align-items: center; gap: 6px; margin: 0; padding: 6px 10px; border: 1px solid transparent; border-radius: var(--component-radius-5px); font-size: var(--component-size-11px); line-height: 1.5; white-space: nowrap; color: var(--component-color-78869b); }
.t2.why-screen .why-tab svg { width: 15px; height: 15px; stroke: currentColor; stroke-width: 1.4; stroke-linecap: round; stroke-linejoin: round; fill: none; }
.t2.why-screen .why-tab.on { background: var(--component-color-fff); color: var(--component-color-345b8f); border-color: var(--component-color-dfe5ee); box-shadow: 0 1px 3px var(--component-color-1b325a0a); font-weight: var(--component-weight-600); }
.t2.why-screen .why-tab:hover:not(.on) { background: var(--component-color-e6edf5); }
.t2.why-screen .why-unit { margin: 0; }
.t2.why-screen .why-u { font-size: var(--component-size-10px); padding: 4px 7px; }
.t2.why-screen .why-dl { width: auto; margin: 0 0 0 auto; padding: 0; }
.t2.why-screen .why-dl .btn { font-size: var(--component-size-10px); min-height: 28px; padding: 4px 8px; background: var(--component-color-fff); }
.t2.why-screen .why-tab-content { min-height: 0; scrollbar-width: thin; scrollbar-color: var(--component-color-c8d3e2) transparent; }
.t2.why-screen .why-tab-content[data-view="tornado"], .t2.why-screen .why-tab-content[data-view="versions"] { padding: 16px; }
.t2.why-screen .why-chart-heading { margin-bottom: 10px; }
.t2.why-screen .why-chart-heading h3 { font-size: var(--component-size-12px); }
.t2.why-screen .why-chart-heading p { font-size: var(--component-size-11px); }
.t2.why-screen .why-tab-content > .why-chain-card { border: 0; border-radius: 0; box-shadow: none; }
.t2.why-screen .why-chain-toolbar { padding: 10px 16px; }
.t2.why-screen .why-chain-title h3 { font-size: var(--component-size-12px); }
.t2.why-screen .why-chain-title p { font-size: var(--component-size-10px); margin-top: 3px; }
.t2.why-screen .why-chain-footer { padding: 7px 16px; font-size: var(--component-size-9px); }
.t2.why-screen .why-discovery { padding-top: 22px; }
.t2.why-screen .why-discovery > h2 { font-size: var(--component-size-14px); font-weight: var(--component-weight-600); margin: 0 0 14px; }
.t2.why-screen .why-discovery .why-suggestions-body { padding: 20px; }
.t2.why-screen .why-discovery .why-sc .n { font-size: var(--component-size-12px); }
.t2.why-screen .why-discovery .why-group-heading { margin-bottom: 10px; }
.t2.why-screen .why-discovery .why-group-note { font-size: var(--component-size-11px); }
.t2.why-screen .why-start-hint { margin: 14px 0 0; }

/* Fit the editor to the shell, including any visible account/project banners.
   Only data-heavy chart/table regions scroll; the chain itself pans/zooms. */
@media (min-width: 900px) and (min-height: 650px) {
 .t2.scr.why-screen.why-selected > .pane { display: flex; flex-direction: column; overflow: hidden; }
 .t2.why-screen.why-selected .why-workspace { flex: 1; }
 /* Tornado uses its natural height; long results still scroll within the panel. */
 .t2.why-screen.why-selected .why-workspace:has(.why-tab-content[data-view="tornado"]) { flex: 0 1 auto; }
 .t2.why-screen.why-selected .why-tab-content { flex: 1; }
 .t2.why-screen.why-selected .why-tab-content[data-view="chain"] { display: flex; flex-direction: column; overflow: hidden; }
 .t2.why-screen.why-selected .why-tab-content > .why-chain-card { flex: 1; min-height: 0; display: flex; flex-direction: column; }
 .t2.why-screen.why-selected .why-chain-toolbar, .t2.why-screen.why-selected .why-chain-footer { flex: none; }
 .t2.why-screen.why-selected .why-chain-surface { flex: 1; min-height: 0; }
 .t2.why-screen.why-selected .why-chain-viewport { height: 100%; }
 .t2.why-screen.why-selected .why-tab-content[data-view="tornado"] { overflow: auto; }
 .t2.why-screen.why-selected .why-tab-content[data-view="versions"] { display: flex; flex-direction: column; overflow: hidden; }
 .t2.why-screen.why-selected .why-tab-content[data-view="versions"] > .why-card,
 .t2.why-screen.why-selected .vt-host { display: flex; flex: 1; flex-direction: column; min-height: 0; }
 .t2.why-screen.why-selected .vt-metrics { flex: none; margin-bottom: 12px; }
 .t2.why-screen.why-selected .vt-wrap { flex: 1; min-height: 0; max-height: none; scrollbar-width: thin; scrollbar-color: var(--component-color-c8d3e2) transparent; }
}
@media (max-width: 1100px) {
 .t2.why-screen .why-page-header { gap: 12px; }
 .t2.why-screen .why-heading { flex-basis: 100%; }
 .t2.why-screen .why-page-header .subline { display: inline; margin-left: 12px; }
 .t2.why-screen .why-page-header h1 { display: inline; font-size: var(--component-size-18px); }
 .t2.why-screen .why-page-header .why-find { max-width: none; }
 .t2.why-screen .why-head { grid-template-columns: minmax(170px,1fr) minmax(200px,auto) auto 25px; gap: 12px; }
 .t2.why-screen .why-total { min-width: 110px; padding-left: 12px; }
}
@media (max-width: 899px) {
 .t2.scr.why-screen > .pageblock { padding: 14px 16px; }
 .t2.why-screen .why-heading { min-width: 0; }
 .t2.why-screen .why-page-header .subline { display: block; margin: 5px 0 0; }
 .t2.why-screen .why-page-header .why-find { min-width: 0; width: 100%; }
 .t2.why-screen .why-controls { grid-template-columns: minmax(0,1fr) auto; gap: 10px; }
 .t2.why-screen .why-context { grid-row: 2; grid-column: 1 / -1; flex-direction: row; align-items: baseline; gap: 10px; padding: 0; }
 .t2.why-screen .why-page-header .why-context { justify-self: start; }
 .t2.why-screen .why-context-value { min-height: 0; font-size: var(--component-size-11px); }
 .t2.scr.why-screen > .pane { padding: 0 12px 16px; }
 .t2.why-screen .why-head { grid-template-columns: minmax(0,1fr) auto 25px; gap: 10px; padding: 14px 4px; }
 .t2.why-screen .why-identity { grid-column: 1 / 3; }
 .t2.why-screen .why-name { font-size: var(--component-size-14px); }
 .t2.why-screen .why-info-button { grid-column: 3; grid-row: 1; }
 .t2.why-screen .why-date-route { grid-row: 2; grid-column: 1; gap: 10px; }
 .t2.why-screen .why-date-point { max-width: 110px; }
 .t2.why-screen .why-date-point .k { font-size: var(--component-size-9px); }
 .t2.why-screen .why-date-point .v { font-size: var(--component-size-11px); }
 .t2.why-screen .why-date-connector { flex-basis: 15px; }
 .t2.why-screen .why-total { grid-row: 2; grid-column: 2 / 4; min-width: 85px; padding-left: 10px; }
 .t2.why-screen .why-total-value { font-size: var(--component-size-22px); }
 .t2.why-screen .why-total-note { font-size: var(--component-size-9px); max-width: 85px; }
 .t2.why-screen .why-tabs { padding: 8px; gap: 8px; }
 .t2.why-screen .why-view-switch { flex: 1; }
 .t2.why-screen .why-tab { justify-content: center; flex: 1; padding: 6px; font-size: var(--component-size-10px); }
 .t2.why-screen .why-tab svg { width: 13px; height: 13px; }
 .t2.why-screen .why-chain-toolbar { padding: 12px; }
 .t2.why-screen .why-chain-viewport { height: 480px; }
 .t2.why-screen .why-suggestions-popover .why-suggestions-body { gap: 20px; }
 .t2.why-screen .why-suggestions-popover .why-group-delayed { padding-left: 0; }
}

/* Initial delay view: focused search, readable comparison and activity cards. */
.t2.scr.why-screen.why-discover > .pageblock { width: 100%; max-width: 1280px; box-sizing: border-box; margin: 0 auto; padding: 24px 24px 18px; background: transparent; border: 0; }
.t2.why-screen.why-discover .why-page-header { display: block; }
.t2.why-screen.why-discover .why-heading { display: grid; grid-template-columns: 44px minmax(0,1fr); column-gap: 14px; min-width: 0; }
.t2.why-screen.why-discover .why-heading > .why-start-icon { grid-row: 1 / 3; width: 44px; height: 44px; border-radius: 12px; background: var(--accent-tint); color: var(--accent-ink); }
.t2.why-screen.why-discover .why-heading > .why-start-icon svg { width: 24px; height: 24px; }
.t2.why-screen.why-discover .why-page-header h1 { display: block; margin: 0; font-size: 23px; line-height: 1.2; letter-spacing: -.6px; }
.t2.why-screen.why-discover .why-page-header .subline { display: block; margin: 5px 0 0; font-size: 12px; color: var(--ink-4); }
.t2.scr.why-screen.why-discover > .pane { width: 100%; max-width: 1280px; box-sizing: border-box; margin: 0 auto; padding: 0 24px 24px; }
.t2.why-screen .why-find.why-start { padding: 0; margin: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; }
.t2.why-screen .why-start .why-controls { grid-template-columns: minmax(0,1.3fr) minmax(280px,1fr); align-items: center; gap: 24px; padding: 20px; border: 1px solid var(--line); border-radius: 12px; background: var(--surface); box-shadow: var(--shadow-1); }
.t2.why-screen .why-start .why-field { gap: 10px; }
.t2.why-screen .why-start .why-field-label { font-size: 12px; font-weight: var(--weight-strong); color: var(--ink-3); }
.t2.why-screen .why-start .why-pick { min-height: 48px; justify-content: flex-start; gap: 10px; padding: 10px 14px; border-radius: var(--radius-md); border-color: var(--accent-tint-line); background: var(--surface-4); color: var(--ink-3); font-size: 14px; text-align: left; }
.t2.why-screen .why-start .why-pick::after { content: '↗'; margin-left: auto; color: var(--ink-4); font-size: 17px; }
.t2.why-screen .why-start .why-pick:hover, .t2.why-screen .why-start .why-pick[aria-expanded="true"] { border-color: var(--accent); background: var(--surface); }
.t2.why-screen .why-start-icon { display: inline-grid; place-items: center; flex: none; width: 30px; height: 30px; border-radius: var(--radius-md); background: var(--accent-tint); color: var(--accent-ink); }
.t2.why-screen .why-start-icon svg { width: 18px; height: 18px; }
.t2.why-screen .why-start .why-pick .why-start-icon { width: 20px; height: 20px; background: transparent; }
.t2.why-screen .why-start .why-context { display: grid; grid-template-columns: minmax(0,1fr) auto; align-content: center; align-items: center; gap: 8px 12px; padding: 16px 18px; border: 0; border-radius: var(--radius-lg); background: var(--accent-tint); }
.t2.why-screen .why-start .why-context > .why-field-label { color: var(--ink-3); font-size: 11px; }
.t2.why-screen .why-start .why-context-value { grid-column: 1 / -1; grid-row: 2; min-height: 0; font-size: 13px; line-height: 1.6; font-weight: var(--weight-strong); color: var(--accent-ink); }
.t2.why-screen .why-start .why-comparison-status { grid-column: 2; grid-row: 1; justify-content: flex-end; font-size: 11px; }
.t2.why-screen .why-start .why-comparison-status:has(span + span) { grid-column: 1 / -1; grid-row: auto; justify-content: flex-start; }
.t2.why-screen .why-start .why-start-dates { grid-column: 1 / -1; font-size: 11px; color: var(--ink-4); font-variant-numeric: tabular-nums; }
.t2.why-screen .why-start .why-pair-warning { grid-column: 1 / -1; }
.t2.why-screen .why-start .why-start-hint { margin: 0; padding: 0; border: 0; font-size: 11px; color: var(--ink-4); line-height: 1.5; }
.t2.why-screen .why-start .why-discovery { margin: 24px 0 0; padding: 0; border: 0; }
.t2.why-screen .why-start .why-discovery > h2 { margin: 0 0 12px; font-size: 13px; font-weight: var(--weight-strong); color: var(--ink-3); }
.t2.why-screen .why-start-groups { display: grid; grid-template-columns: repeat(var(--why-start-columns, 2),minmax(0,1fr)); gap: 16px; align-items: start; }
.t2.why-screen .why-start .why-shortcuts { grid-column: auto; grid-row: auto; order: 0; padding: 18px; margin: 0; border: 1px solid var(--line-2); border-radius: 12px; background: var(--surface); box-shadow: var(--shadow-1); }
.t2.why-screen .why-start .why-group-heading { gap: 9px; margin: 0 0 10px; }
.t2.why-screen .why-start .why-sc-label { margin: 0; color: var(--ink-2); font-size: 13px; font-weight: var(--weight-strong); }
.t2.why-screen .why-start .why-group-count { margin-left: auto; padding: 3px 7px; border-radius: 6px; background: var(--surface-2); color: var(--ink-4); font-size: 11px; font-variant-numeric: tabular-nums; }
.t2.why-screen .why-start .why-group-delayed .why-start-icon { background: var(--warn-tint); color: var(--warn); }
.t2.why-screen .why-start .why-group-milestones .why-start-icon { background: var(--ok-tint); color: var(--ok); }
.t2.why-screen .why-start .why-group-note { margin: 0 0 14px; font-size: 11px; line-height: 1.5; color: var(--ink-4); }
.t2.why-screen .why-start .why-shortcuts:not(.why-group-recent) .why-suggestion-rows { max-height: 260px; overflow-y: auto; scrollbar-width: thin; scrollbar-color: var(--line) transparent; }
.t2.why-screen .why-start .why-sc { flex-shrink: 0; display: grid; grid-template-columns: minmax(0,1fr) auto; align-items: center; width: 100%; min-height: 60px; gap: 5px 12px; padding: 12px; border: 1px solid transparent; border-radius: var(--radius-md); background: var(--surface-3); text-align: left; }
.t2.why-screen .why-start .why-sc:hover { background: var(--accent-tint); border-color: var(--accent-tint-line); }
.t2.why-screen .why-start .why-sc b { font-size: 10px; color: var(--ink-4); }
.t2.why-screen .why-start .why-sc .n { min-width: 0; max-width: none; font-size: 13px; font-weight: var(--weight-medium); line-height: 1.45; color: var(--ink); overflow-wrap: anywhere; }
.t2.why-screen .why-start .why-sc::after { font-size: 17px; color: var(--accent-ink); }
.t2.why-screen .why-start .why-group-delayed .why-sc { background: var(--surface-4); }
.t2.why-screen .why-start .why-group-delayed .why-sc:hover { background: var(--warn-tint); border-color: var(--warn-line); }
.t2.why-screen .why-start .why-group-delayed .why-sc .d { grid-column: 2; grid-row: 1 / 3; padding: 5px 8px; border-radius: var(--radius-sm); background: var(--warn-tint); color: var(--warn); font-size: 17px; font-weight: var(--weight-strong); letter-spacing: -.3px; }
.t2.why-screen .why-start .why-mini-movement { height: 3px; margin-top: 5px; background: var(--line-3); }
.t2.why-screen .why-start .why-mini-movement i { background: var(--warn-dot); }
.t2.why-screen .why-start .why-group-recent { grid-column: 1 / -1; display: flex; flex-wrap: wrap; align-items: center; gap: 12px 20px; padding: 14px 16px; border: 1px solid var(--line-2); box-shadow: none; background: var(--surface-4); }
.t2.why-screen .why-start .why-group-recent .why-group-heading { margin: 0; gap: 8px; }
.t2.why-screen .why-start .why-group-recent .why-start-icon { width: 24px; height: 24px; background: transparent; color: var(--ink-4); }
.t2.why-screen .why-start .why-group-recent .why-group-count { background: transparent; padding: 0; }
.t2.why-screen .why-start .why-group-recent .why-sc { width: auto; min-height: 32px; padding: 7px 10px; display: inline-flex; gap: 12px; border: 1px solid var(--line); background: var(--surface); }
.t2.why-screen .why-start .why-group-recent .why-sc:hover { border-color: var(--accent-tint-line); background: var(--accent-tint); }
.t2.why-screen .why-start .why-group-recent .why-sc b { font-size: 11px; color: var(--ink-3); }
.t2.why-screen .why-start .why-group-recent .why-sc::after { font-size: 12px; }
@media (max-width: 1100px) {
 .t2.why-screen .why-start-groups[data-columns="3"] { grid-template-columns: repeat(2,minmax(0,1fr)); }
}
@media (max-width: 1000px) {
 .t2.why-screen .why-start .why-controls { grid-template-columns: minmax(0,1fr); gap: 18px; padding: 20px; }
}
@media (max-width: 760px) {
 .t2.why-screen .why-start-groups, .t2.why-screen .why-start-groups[data-columns="3"] { grid-template-columns: minmax(0,1fr); }
}
@media (max-width: 600px) {
 .t2.scr.why-screen.why-discover > .pageblock { padding: 20px 14px 16px; }
 .t2.scr.why-screen.why-discover > .pane { padding-inline: 14px; }
 .t2.why-screen.why-discover .why-heading { grid-template-columns: 36px minmax(0,1fr); gap: 0 10px; }
 .t2.why-screen.why-discover .why-heading > .why-start-icon { width: 36px; height: 36px; border-radius: var(--radius-lg); }
 .t2.why-screen.why-discover .why-page-header h1 { font-size: 20px; }
 .t2.why-screen .why-start .why-controls { padding: 16px; }
 .t2.why-screen .why-start .why-context { padding: 14px; }
 .t2.why-screen .why-start .why-shortcuts { padding: 16px; }
 .t2.why-screen .why-start .why-group-recent { gap: 10px; }
 .t2.why-screen .why-start .why-group-recent .why-group-heading { width: 100%; }
}

/* TIA evidence: full activity names and comparable source values. */
.tia-activities { margin-top: 20px; }
.tia-activities h3 { margin-bottom: 8px; }
.tia-filters { display:flex; flex-wrap:wrap; align-items:center; gap:10px; margin:16px 0; }
.tia-filters input { flex:1; min-width:220px; }
.tia-filters select { max-width:100%; }
.tia-filters span { margin-right:auto; }
.tia-table-scroll { overflow:auto; max-height:640px; border:1px solid var(--line); border-radius:var(--component-radius-10px); }
.tia-evidence-table { min-width:1000px; }
.tia-table-scroll table td { white-space:normal; vertical-align:top; line-height:1.55; padding:14px; }
.tia-table-scroll table th { position:sticky; top:0; background:var(--panel, var(--component-color-fff)); z-index:1; }
.tia-evidence-table td:first-child { min-width:230px; }
.tia-evidence-table td:nth-child(2), .tia-evidence-table td:nth-child(3) { min-width:190px; }
.tia-evidence-table td:last-child { min-width:230px; }
.tia-relations { margin:20px 0; }
.tia-relations > summary { cursor:pointer; font-weight:var(--component-weight-600); padding:12px 0; }

.t2 .tia-table-scroll table td { vertical-align:top; padding:14px; white-space:normal; }
.t2 .tia-evidence-table { table-layout:fixed; width:100%; min-width:1050px; }
.t2 .tia-evidence-table th:first-child { width:22%; }
.t2 .tia-evidence-table th:nth-child(2), .t2 .tia-evidence-table th:nth-child(3) { width:20%; }
.t2 .tia-evidence-table th:nth-child(4) { width:13%; }
.t2 .tia-evidence-table th:last-child { width:25%; }
.tia-evidence-table details { margin-top:8px; }
.tia-evidence-table summary { cursor:pointer; font-weight:var(--component-weight-600); }

/* Keep activity evidence dominant on the TIA results page. */
.t2.tia-page > .pageblock { padding:16px 24px; }
.t2.tia-page .pagehead { align-items:center; gap:16px; }
.t2.tia-page .pagehead h1 { font-size:var(--component-size-22px); margin:0; }
.t2.tia-page .pagehead .subline { margin:4px 0 0; font-size:var(--component-size-12px); }
.t2.tia-page > .pane { padding:12px 24px; gap:12px; }
.tia-page .tia-stats .card-body { padding:12px 16px; }
.tia-page .tia-stats .hint { background:none; padding:0; border:0; margin:0 0 4px; font-size:var(--component-size-12px); }
.tia-page .tia-main .card-head { padding:12px 16px; }
.tia-page .tia-main > .card-body { padding:12px 16px; }
.tia-page .tia-activities { margin-top:6px; }
.tia-page .tia-activities > p { font-size:var(--component-size-12px); margin:6px 0; }
.tia-page .tia-filters { margin:10px 0; }
.tia-page .tia-table-scroll { max-height:65vh; }
.t2.tia-page .tia-table-scroll table td { padding:10px 12px; line-height:1.4; }
.tia-page .tia-explanation { font-size:var(--component-size-12px); color:var(--muted); }
.tia-page .tia-more > summary, .tia-page .tia-calculation > summary { padding:14px 16px; cursor:pointer; font-weight:var(--component-weight-600); }
.tia-page .tia-check { border-top:1px solid var(--line); }
.tia-page .tia-check > summary { cursor:pointer; display:flex; justify-content:space-between; gap:14px; }
.tia-page .tia-check .card-title { font-size:var(--component-size-13px); }
.tia-page .tia-check > .card-body { padding:0 16px 16px; }
@media(max-width:700px){.t2.tia-page > .pageblock,.t2.tia-page > .pane{padding:12px}.tia-page .tia-stats .card-body{gap:8px!important}.tia-page .tia-stats .mono{font-size:var(--component-size-17px)!important}}

.tia-page .pagehead > .btn { margin-left:auto; }
.tia-page .tia-filters input[type="search"] { min-height:38px; padding:8px 12px; border:1px solid var(--line); border-radius:var(--component-radius-8px); background:var(--panel, var(--component-color-fff)); color:inherit; font:inherit; }
.tia-page .tia-filters input[type="search"]:focus-visible { outline:2px solid var(--accent, var(--component-color-304966)); outline-offset:2px; }
.t2.tia-page .tia-evidence-table { min-width:900px; }
.tia-page .tia-evidence-table td { min-width:0; overflow-wrap:anywhere; }

.tia-page .tia-stats > .tia-explanation { padding:10px 16px 12px; border-top:1px solid var(--line); }
.tia-page .tia-stats > .tia-explanation > summary { cursor:pointer; line-height:1.5; }
.tia-page .tia-stats > .tia-explanation > summary:focus-visible { outline:2px solid var(--accent, var(--component-color-304966)); outline-offset:3px; border-radius:var(--component-radius-3px); }
.tia-page .tia-stats > .tia-explanation > ul { margin:10px 0 0; padding-left:20px; line-height:1.5; }
.tia-page .tia-stats > .tia-explanation li + li { margin-top:6px; }

/* Five always-visible review facts, kept within one compact summary card. */
.tia-page .tia-summary-grid { display:grid; grid-template-columns:repeat(5,minmax(0,1fr)); gap:12px; }
.tia-page .tia-summary-item { min-width:0; }
.tia-page .tia-summary-value { font-size:var(--component-size-18px); font-weight:var(--component-weight-600); line-height:1.3; letter-spacing:-.02em; }
.tia-page .tia-summary-detail { font-size:var(--component-size-11px); line-height:1.5; margin-top:5px; overflow-wrap:anywhere; }
.tia-page .tia-summary-notice { border-top:1px solid var(--line); padding:8px 16px; font-size:var(--component-size-12px); line-height:1.5; color:var(--muted); }
@media(max-width:1100px){.tia-page .tia-summary-grid{grid-template-columns:repeat(3,minmax(0,1fr));row-gap:14px}}
@media(max-width:640px){.tia-page .tia-summary-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.tia-page .tia-summary-value{font-size:var(--component-size-16px)}}

/* Delay review: signed movement is independent of the observed edit type. */
.t2.why-screen { --why-movement-earlier: var(--why-movement-earlier-color); --why-movement-later: var(--why-movement-later-color); }
.t2.why-screen .why-review-badge { color: var(--why-review-ink); background: var(--why-review-tint); }
.t2.why-screen .why-info-button.has-review { color: var(--why-review-ink); border-color: var(--why-review-line); background: var(--why-review-wash); }
.t2.why-screen .why-review-list { padding-left: 18px; line-height: 1.6; font-size: var(--component-size-12px); }
.t2.why-screen .why-basis { max-height: min(65vh, 500px); overflow: auto; }
.t2.why-screen .why-total .k { max-width: 220px; overflow-wrap: anywhere; }
.t2.why-screen .why-total-values { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
.t2.why-screen .why-metrics { display: flex; align-items: stretch; gap: 20px; min-width: 0; }
.t2.why-screen .why-metrics .why-total { flex: 1; }
.t2.why-screen .why-metrics .why-comparison { min-width: 205px; }
.t2.why-screen .why-metrics .why-baseline { min-width: 145px; }
@media (max-width: 1100px) {
 .t2.why-screen .why-head.has-baseline { grid-template-columns: minmax(0,1fr) auto 25px; }
 .t2.why-screen .has-baseline .why-identity { grid-column: 1 / 3; }
 .t2.why-screen .has-baseline .why-info-button { grid-column: 3; grid-row: 1; }
 .t2.why-screen .has-baseline .why-date-route { grid-column: 1; grid-row: 2; }
 .t2.why-screen .why-metrics { grid-column: 2 / 4; grid-row: 2; gap: 12px; }
}
@media (max-width: 899px) {
 .t2.why-screen .has-baseline .why-date-route { grid-column: 1 / -1; }
 .t2.why-screen .why-metrics { grid-column: 1 / -1; grid-row: 3; display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); }
 .t2.why-screen .why-metrics .why-total { grid-column: auto; grid-row: auto; min-width: 0; }
 .t2.why-screen .why-metrics .why-total:first-child { border-left: 0; padding-left: 0; }
 .t2.why-screen .why-metrics .why-total-note { max-width: none; }
}

/* Support: persistent ticket list and a focused conversation. */
.support-modal { width: min(1080px, calc(100vw - 40px)); }
.support-modal .modal-head { align-items: center; border-bottom: 1px solid var(--line); padding: 18px 24px; }
.support-modal .modal-head h2 { flex: 1; }
.support-modal .modal-body { padding: 0; }
.ticket-workspace { min-width: 0; color: var(--ink); }
.ticket-workspace p { margin: 0; }
.ticket-toolbar { display: flex; align-items: center; flex-wrap: wrap; gap: 12px; padding: 16px 24px; border-bottom: 1px solid var(--line); }
.ticket-toolbar h3 { flex: 1; font: var(--type-heading); margin: 0; }
.ticket-toolbar > .err:not(:empty) { order: 3; width: 100%; }
.ticket-actions { display: flex; gap: 8px; }
.ticket-layout { display: grid; grid-template-columns: minmax(240px, 30%) minmax(0, 1fr); min-height: 420px; }
.ticket-sidebar { background: var(--surface-2); border-right: 1px solid var(--line); min-width: 0; }
.ticket-filters { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; padding: 16px; }
.ticket-filters input { grid-column: 1 / -1; }
.ticket-filters :is(input, select) { width: 100%; min-width: 0; padding: 8px; border: 1px solid var(--line); border-radius: var(--r-sm, var(--component-radius-4px)); background: var(--surface); color: var(--ink); font: var(--type-caption); }
.ticket-list { display: block; max-height: 440px; overflow-y: auto; padding: 0 8px 12px; }
.ticket-row { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; width: 100%; text-align: left; padding: 14px 12px; margin: 0; background: transparent; color: var(--ink); border: 1px solid transparent; border-bottom-color: var(--line); border-radius: var(--r-sm, var(--component-radius-4px)); cursor: pointer; font: var(--type-body); transition: background 160ms; }
.ticket-row:hover { background: var(--surface); }
.ticket-row[aria-pressed="true"] { background: var(--surface); border-color: var(--line); box-shadow: inset 3px 0 var(--ink); }
.ticket-row strong { font: var(--type-heading); overflow-wrap: anywhere; }
.ticket-project, .ticket-date, .ticket-customer { font: var(--type-caption); color: var(--ink-3); overflow-wrap: anywhere; }
.ticket-date { font-variant-numeric: tabular-nums; }
.ticket-status { display: inline-block; width: fit-content; font: var(--type-caption); color: var(--ink-2); background: var(--surface-2); padding: 3px 7px; border-radius: var(--r-sm, var(--component-radius-4px)); }
.ticket-status--waiting_customer { color: var(--ink); border: 1px solid var(--line); }
.ticket-detail { min-width: 0; padding: 24px; display: flex; flex-direction: column; align-items: stretch; gap: 14px; }
.ticket-detail > h3, .ticket-conversation-head h3 { font: var(--type-title); margin: 4px 0 10px; overflow-wrap: anywhere; }
.ticket-detail > .btn { align-self: flex-start; }
.ticket-detail .muted { font: var(--type-caption); color: var(--ink-3); }
.ticket-detail .field { display: grid; gap: 6px; margin: 0 0 14px; }
.ticket-detail .field label { font: var(--type-caption); color: var(--ink-2); }
.ticket-detail :is(input, textarea, select) { width: 100%; min-width: 0; box-sizing: border-box; font: var(--type-body); color: var(--ink); background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-sm, var(--component-radius-4px)); padding: 10px 12px; }
.ticket-detail textarea { resize: vertical; min-height: 92px; }
.ticket-detail form > .btn { margin-top: 12px; }
.ticket-thread { display: flex; flex-direction: column; gap: 14px; padding: 16px 0; border-block: 1px solid var(--line); }
.ticket-workspace .support-message { padding: 14px 16px; border: 0; background: var(--surface-2); border-radius: var(--r-sm, var(--component-radius-4px)); }
.ticket-workspace .support-message--staff { border-left: 3px solid var(--ink-3); }
.ticket-message-meta { display: flex; justify-content: space-between; align-items: baseline; flex-wrap: wrap; gap: 4px 12px; margin-bottom: 8px; font: var(--type-caption); }
.ticket-message-meta time { color: var(--ink-3); font-variant-numeric: tabular-nums; }
.ticket-workspace .support-message-text { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; font: var(--type-body); }
.ticket-empty { padding: 20px 12px; color: var(--ink-3); font: var(--type-body); }
.ticket-workspace .err:empty { display: none; }
.ticket-workspace :is(button, input, select, textarea):focus-visible { outline: 2px solid var(--ink-3); outline-offset: 3px; }
.support-modal .modal-body > .support-access-panel { margin: 0; border-top: 1px solid var(--line); padding: 16px 24px; }
.support-access-panel summary, .ticket-detail summary { cursor: pointer; font: var(--type-caption); padding: 6px 0; }
.support-access-panel > p { margin: 10px 0; }
.support-access-panel > h3 { margin: 16px 0 8px; }
@media (max-width: 700px) {
  .support-modal { width: calc(100vw - 20px); }
  .ticket-layout { grid-template-columns: 1fr; }
  .ticket-sidebar { border-right: 0; border-bottom: 1px solid var(--line); }
  .ticket-list { max-height: 180px; }
  .ticket-filters { padding: 12px; }
  .ticket-detail { padding: 18px; }
  .ticket-toolbar { padding: 12px 16px; }
}
.support-modal .ticket-thread { max-height: 260px; overflow-y: auto; }
.ticket-detail pre { max-width: 100%; overflow: auto; }
@media (prefers-reduced-motion: reduce) { .ticket-row { transition: none; } }

/* Same-date revision confirmation: file evidence beside a clear choice. */
.revision-dialog { width: min(680px, calc(100vw - 32px)); }
.revision-dialog .modal-body { overflow-y: auto; max-height: 65vh; }
.revision-file {
  display: grid; grid-template-columns: minmax(0, 1fr) 190px;
  gap: 8px 20px; padding: 16px; margin-top: 12px;
  border: 1px solid var(--line); border-radius: var(--radius-component-10); background: var(--surface);
}
.revision-file > strong { overflow-wrap: anywhere; align-self: end; }
.revision-file > .hint { grid-column: 1; margin: 0; overflow-wrap: anywhere; }
.revision-file > .field { grid-column: 2; grid-row: 1 / 3; margin: 0; align-self: center; }
.revision-file select { margin-top: 6px; min-height: 38px; }
@media (max-width: 540px) {
  .revision-file { grid-template-columns: minmax(0, 1fr); }
  .revision-file > .field { grid-column: 1; grid-row: auto; }
}

/* Unsaved project identity uses the setup layout without a database record. */
.new-project-setup .su-body { overflow: auto; flex: 1; padding: 32px; }
.new-project-setup .su-col { width: 100%; margin: 0 auto; }
.new-project-setup .field { display: grid; gap: 8px; margin-bottom: 24px; }
.new-project-setup .su-ribbon { flex: none; overflow-x: auto; }
.new-project-setup .su-tab { min-width: 140px; flex: 1; pointer-events: none; }
.new-project-setup [role="alert"] { color: var(--danger); }
/* Working screens: compact context, readable evidence, secondary detail on demand. */
.workflow-screen > .pageblock { padding: 12px 20px; }
.workflow-screen > .pageblock .pagehead { margin: 0; gap: 12px; align-items: center; }
.workflow-screen > .pageblock h1 { margin: 0; font-size: var(--component-size-22px); line-height: 1.3; }
.workflow-screen > .pageblock .subline { margin: 4px 0 0; font-size: var(--component-size-13px); line-height: 1.45; }
.workflow-screen > .pane { padding-top: 12px; }
.workflow-more { position: relative; }
.workflow-more > summary { cursor: pointer; list-style: none; }
.workflow-more-menu { position: absolute; right: 0; top: calc(100% + 6px); min-width: 175px; display: grid; gap: 6px; padding: 10px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-component-10); box-shadow: 0 8px 24px var(--workflow-menu-shadow-color); z-index: 35; }
.workflow-more-menu .btn { justify-content: flex-start; }
.t2.ik-workspace .ik-metrics { display: flex; flex-wrap: wrap; gap: 6px; }
.t2.ik-workspace .ik-metrics .sheet-count { flex-direction: row; align-items: center; padding: 7px 10px; gap: 6px; border-radius: var(--radius-component-8); }
.t2.ik-workspace .ik-metric-value { font-size: var(--component-size-16px); }
.t2.ik-workspace .ik-summary { margin-bottom: 10px; }
.t2.ik-workspace .ik-mast { padding: 10px 14px; margin-bottom: 8px; gap: 8px 16px; }
.t2.ik-workspace .ik-mast .sheet-words { font-size: var(--component-size-19px); line-height: 1.35; }
.t2.ik-workspace .ik-mast .sheet-line { margin-top: 4px; line-height: 1.45; }
.t2.ik-workspace .ik-mast .ik-eyebrow { display: none; }
.review-guidance { margin: 12px 0; border-block: 1px solid var(--line); padding: 10px 0; }
.review-guidance > summary { cursor: pointer; font-weight: var(--weight-strong); }
.review-guidance .whyfix { margin: 10px 0 0; }
.review-queue-page .traces-panel { margin: 12px 0; }
.review-queue-page .tracecards { max-height: 240px; overflow: auto; overscroll-behavior: contain; }
.review-queue-page .detail-inner > h2 { font-size: var(--component-size-22px); line-height: 1.35; margin: 8px 0; }
.review-queue-page .detail-inner > .body { font-size: var(--component-size-14px); line-height: 1.5; margin: 8px 0; }
.comment-retests { margin: 8px 20px 0; flex: none; }
.comment-retests > summary { cursor: pointer; padding: 10px 14px; font-weight: var(--weight-strong); }
.comment-retest-row { border-top: 1px solid var(--line); padding: 10px 0; }
.comment-retest-row > summary { cursor: pointer; display: flex; justify-content: space-between; flex-wrap: wrap; gap: 6px 12px; }
.comment-retest-row > select, .comment-retest-row > textarea { display: block; width: 100%; margin: 10px 0; min-height: 36px; }
.comment-retest-row > label { display: block; margin: 10px 0; }
.t2.comparison-page .doc-verdict { font-size: var(--component-size-22px); margin: 8px 0; line-height: 1.35; }
.t2.comparison-page .doc-lede { font-size: var(--component-size-14px); line-height: 1.5; margin: 8px 0; }
@media(max-width:720px) {
 .workflow-screen > .pageblock { padding: 12px; }
 .workflow-screen .pagehead-right { flex-wrap: wrap; gap: 6px; }
 .comment-retests { margin-inline: 12px; }
 .kind-setup .cmp-title .k { display: inline; }
}

/* Primary project links stay visible; settings anchors the bottom of the rail. */
@media (min-width: 721px) {
  .t2 .sb-group.sb-project-settings { margin-top: auto; padding-top: 10px; padding-bottom: 10px; }
  .sb-project-settings:not([hidden]) ~ .sb-footer { margin-top: 0; }
}

/* Verified intake decisions on the schedule list. */
.t2 .lozenge.verified { background: var(--ok-tint); color: var(--ok); border-color: var(--ok-line); }
.t2 .lozenge.verified::before { background: var(--ok); }

/* Project Health — grouped tables, activity evidence and a compact project score. */
.health-screen [hidden], .hl-cfg-project [hidden] { display: none !important; }
.t2.hl-workspace-page { background: var(--surface); container: schedule-health / inline-size; }
.topbar.t2 .hl-navbar-title { margin: 0; font: var(--type-heading); font-size: var(--component-size-18px); font-weight: var(--weight-strong); line-height: var(--leading-snug); letter-spacing: var(--type-title-tracking); color: var(--ink); white-space: nowrap; }
.topbar.t2 .hl-navbar-help { display: flex; align-items: center; margin-left: 3px; flex-shrink: 0; }
.topbar.t2 .hl-help-button { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; padding: 0; border: 0; border-radius: 50%; background: var(--accent-tint); color: var(--accent-ink); font: var(--type-body); font-weight: var(--weight-strong); cursor: pointer; }
.topbar.t2 .hl-help-button:hover, .topbar.t2 .hl-help-button[aria-expanded="true"] { background: var(--accent-tint-line); }
.topbar.t2 .hl-help-button:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
.t2 .hl-page-help { position: fixed; inset: auto; margin: 0; width: 320px; max-width: calc(100vw - 24px); box-sizing: border-box; padding: 16px; border: 1px solid var(--line-2); border-radius: var(--radius-sm); background: var(--surface); color: var(--ink-2); box-shadow: var(--shadow-2); font: var(--type-body); line-height: var(--leading-relaxed); white-space: normal; }
.t2 .hl-page-help strong { color: var(--ink); font-weight: var(--weight-strong); }
.t2 .hl-page-help .hl-help-text { display: block; margin: 8px 0 0; }
@media (pointer: coarse) { .topbar.t2 .hl-help-button { width: 32px; height: 32px; } }
.t2.hl-workspace-page > .pane { display: flex; flex-direction: column; min-height: 0; overflow: hidden; padding: 0 24px; }
.t2.hl-workspace-page .hl-project-summary, .t2.hl-workspace-page .hl-workspace-nav { flex: none; }
.t2 .hl-project-summary { margin: 0; }
.t2 .hl-project-context { display: flex; flex-wrap: wrap; gap: 8px 14px; align-items: center; min-height: 48px; padding: 8px 0; font: var(--type-caption); color: var(--ink-4); }
.t2 .hl-workspace-nav { border-bottom: 1px solid var(--line-2); }
.t2 .hl-workspace-tabs { display: inline-flex; flex: none; align-items: center; gap: 2px; padding: 3px; border-radius: var(--radius-sm); background: var(--surface-3); }
.t2 .hl-view-tab { padding: 5px 10px; min-height: 28px; border: 0; border-radius: var(--radius-sm); background: transparent; font: var(--type-caption); font-weight: var(--weight-medium); color: var(--ink-3); cursor: pointer; white-space: nowrap; }
.t2 .hl-view-tab:hover { background: var(--hover-wash); }
.t2 .hl-view-tab.on { background: var(--accent-tint); color: var(--accent-ink); }
.t2 .hl-toolbar-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 8px; margin-left: auto; }
.t2 .hl-nav-score, .t2 .hl-not-computed { display: inline-flex; align-items: center; gap: 7px; min-height: 32px; padding: 6px 10px; border: 0; border-radius: var(--radius-sm); font: var(--type-caption); white-space: nowrap; cursor: pointer; }
.t2 .hl-nav-score { background: var(--accent-tint); color: var(--accent-ink); }
.t2 .hl-nav-score:hover { background: var(--accent-tint-line); }
.t2 .hl-nav-score strong { color: var(--ink); font: var(--type-heading); font-variant-numeric: tabular-nums; }
.t2 .hl-nav-coverage { color: var(--ink-3); margin-left: 3px; padding-left: 10px; border-left: 1px solid var(--accent-tint-line); }
.t2 .hl-not-computed-badge { display: inline-flex; align-items: center; gap: 2px; padding-right: 7px; border-radius: var(--radius-sm); background: var(--warn-tint); color: var(--warn); }
.t2 .hl-not-computed { padding-right: 3px; background: transparent; color: inherit; }
.t2 .hl-not-computed-label { display: inline-flex; align-items: center; gap: 5px; white-space: nowrap; }
.t2 .hl-status-help { display: inline-flex; align-items: center; vertical-align: middle; }
.t2 .hl-status-help-button { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; padding: 0; border: 0; border-radius: 50%; background: var(--surface-3); color: var(--ink-3); font: var(--type-caption); font-weight: var(--weight-medium); cursor: help; }
.t2 .hl-status-help-button:hover, .t2 .hl-status-help-button[aria-expanded="true"] { background: var(--accent-tint); color: var(--accent-ink); }
.t2 .hl-status-help-button:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.t2 .hl-not-computed-badge .hl-status-help-button { background: var(--warn-line); color: var(--warn); }
.t2 .hl-not-computed:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
.t2 .hl-not-computed::before { content: ""; width: 5px; height: 5px; border-radius: 50%; background: var(--warn-dot); }
.t2 .hl-not-computed:hover { background: var(--warn-line); }
.t2 .hl-project-context .hl-configure-action { min-height: 32px; padding-inline: 12px; flex: none; box-shadow: none; background: var(--surface-3); border-color: transparent; color: var(--ink-2); }
.t2 .hl-project-context .hl-configure-action:hover { background: var(--surface-2); border-color: var(--line-2); }
.t2 .hl-coverage-details { position: relative; min-width: 0; }
.t2 .hl-coverage-details > summary { display: flex; align-items: center; gap: 7px; min-height: 32px; padding: 6px 10px; border-radius: var(--radius-sm); list-style: none; white-space: nowrap; cursor: pointer; background: var(--ok-tint); color: var(--ok); }
.t2 .hl-coverage-details > summary::-webkit-details-marker { display: none; }
.t2 .hl-coverage-details > summary::after { content: ""; width: 5px; height: 5px; margin: -3px 0 0 3px; border-right: 1px solid currentColor; border-bottom: 1px solid currentColor; transform: rotate(45deg); }
.t2 .hl-coverage-details[open] > summary::after { transform: rotate(225deg); margin-top: 3px; }
.t2 .hl-coverage-details > summary:hover, .t2 .hl-coverage-details[open] > summary { background: var(--ok-line); }
.t2 .hl-coverage-details.is-preview > summary { background: var(--warn-tint); color: var(--warn); }
.t2 .hl-source-date { border-left: 1px solid var(--ok-line); padding-left: 7px; }
.t2 .is-preview .hl-source-date { border-color: var(--warn-line); }
.t2 .hl-coverage-info { position: absolute; left: 0; top: calc(100% + 8px); width: min(340px, calc(100vw - 32px)); max-height: min(420px, calc(100dvh - 160px)); overflow-y: auto; z-index: 20; background: var(--surface); color: var(--ink-3); border: 1px solid var(--line-2); border-radius: var(--radius-sm); box-shadow: var(--shadow-2); padding: 14px 16px; line-height: var(--leading-relaxed); }
.t2 .hl-coverage-info strong, .t2 .hl-source-name { color: var(--ink-2); overflow-wrap: anywhere; }
.t2 .hl-coverage-info p { margin: 8px 0; }
.t2 .hl-source-counts { display: flex; flex-wrap: wrap; gap: 6px; margin: 10px 0; }
.t2 .hl-source-counts span { padding: 3px 8px; border-radius: var(--radius-sm); background: var(--surface-3); color: var(--ink-3); }
.t2 .hl-project-notice { margin: 6px 0; padding: 6px 10px; background: var(--warn-tint); font: var(--type-caption); color: var(--warn); line-height: var(--leading-relaxed); border-left: 2px solid var(--warn-dot); }
.t2.hl-workspace-page .hl-grid { grid-template-columns: clamp(420px, 38%, 500px) minmax(0, 1fr); gap: 0; align-items: stretch; flex: 1; min-height: 0; height: auto; background: var(--surface); border: 0; border-radius: 0; overflow: hidden; }
.t2.hl-workspace-page .hl-card { padding: 0; margin: 0; border: 0; border-radius: 0; box-shadow: none; min-width: 0; min-height: 0; background: var(--surface); }
.t2.hl-workspace-page .hl-left { max-height: none; overflow: hidden; border-right: 1px solid var(--line-2); }
.t2.hl-workspace-page .hl-right { overflow: auto; overscroll-behavior: contain; }
.t2 .hl-explorer { display: flex; height: 100%; flex-direction: column; }
.t2 .hl-overview-pick { display: flex; justify-content: space-between; gap: 12px; align-items: center; min-height: 36px; padding: 7px 14px; border: 0; border-bottom: 1px solid var(--line-2); background: var(--surface); color: var(--ink-2); font: var(--type-caption); cursor: pointer; }
.t2 .hl-overview-pick[aria-pressed="true"] { background: var(--accent-tint); color: var(--accent-ink); }
.t2 .hl-overview-score { font-variant-numeric: tabular-nums; font-weight: var(--weight-strong); }
.t2 .hl-explorer-controls { padding: 6px 14px; border-bottom: 1px solid var(--line-2); display: grid; gap: 4px; }
.t2 .hl-explorer-heading { display: flex; align-items: center; justify-content: space-between; font: var(--type-caption); color: var(--ink-4); }
.t2 .hl-explorer-heading strong { font-weight: var(--weight-regular); }
.t2 .hl-explorer-heading .hint { margin: 0; }
.t2 .hl-check-filters { display: flex; gap: 6px; align-items: center; }
.hl-search, .hl-select { min-width: 0; box-sizing: border-box; height: 32px; padding: 6px 8px; border: 0; border-bottom: 1px solid var(--line-2); border-radius: 0; background: var(--surface); font: var(--type-caption); color: var(--ink-2); }
.hl-search::placeholder { color: var(--ink-4); }
.hl-search:focus-visible, .hl-select:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
.t2 .hl-check-filters .hl-search { flex: 1; }
.t2 .hl-check-filters .hl-dropdown { width: 156px; flex: none; }
.t2 .hl-dropdown { min-width: 0; }
.t2 .hl-dropdown > .hl-select { display: flex; align-items: center; gap: 8px; width: 100%; padding: 6px 10px; border: 1px solid var(--line-2); border-radius: var(--radius-sm); background: var(--surface); text-align: left; cursor: pointer; }
.t2 .hl-dropdown > .hl-select::after { content: ""; width: 5px; height: 5px; flex: none; margin: -3px 0 0 auto; border-right: 1px solid currentColor; border-bottom: 1px solid currentColor; transform: rotate(45deg); }
.t2 .hl-dropdown > .hl-select:hover { border-color: var(--accent-tint-line); background: var(--surface-3); }
.t2 .hl-dropdown > .hl-select[aria-expanded="true"] { border-color: var(--accent); background: var(--accent-tint); }
.t2 .hl-dropdown > .hl-select[aria-expanded="true"]::after { transform: rotate(225deg); margin-top: 3px; }
.t2 .hl-select-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.t2 .hl-filter-dot { width: 6px; height: 6px; border-radius: 50%; flex: none; background: var(--neutral-dot); }
.t2.hl-select-menu { position: fixed; inset: auto; margin: 0; padding: 5px; overflow: auto; overscroll-behavior: contain; border: 1px solid var(--line-2); border-radius: var(--radius-sm); background: var(--surface); color: var(--ink-2); box-shadow: var(--shadow-2); font: var(--type-caption); }
.t2 .hl-select-option { display: flex; align-items: center; gap: 10px; width: 100%; min-height: 36px; padding: 8px 10px; border: 0; border-radius: var(--radius-sm); background: transparent; font: inherit; color: var(--ink-2); text-align: left; cursor: pointer; }
.t2 .hl-select-option:hover, .t2 .hl-select-option:focus { background: var(--surface-3); }
.t2 .hl-select-option[aria-selected="true"] { background: var(--accent-tint); color: var(--accent-ink); font-weight: var(--weight-medium); }
.t2 .hl-select-option:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
.t2 .hl-select-check { margin-left: auto; color: var(--accent-ink); visibility: hidden; }
.t2 .hl-select-option[aria-selected="true"] .hl-select-check { visibility: visible; }
.t2 .hl-compact-list { flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: 0 0 10px; }
.t2.hl-workspace-page .hl-grid.is-overview { grid-template-columns: clamp(420px, 38%, 500px) minmax(0, 1fr); }
.t2 .hl-check-register { width: 100%; border-collapse: separate; border-spacing: 0; table-layout: fixed; text-align: left; font: var(--type-caption); }
.t2 .hl-check-register .hl-check-result-col { width: 94px; }
.t2 .hl-check-register .hl-check-threshold-col { width: 82px; }
.t2 .hl-check-register .hl-check-status-col { width: 108px; }
.t2 .hl-check-register thead { position: sticky; top: 0; z-index: 2; }
.t2 .hl-check-register thead th { background: var(--surface); color: var(--ink-4); font-weight: var(--weight-medium); padding: 11px 12px; border-bottom: 1px solid var(--line); white-space: nowrap; }
.t2 .hl-check-register thead th:nth-child(2), .t2 .hl-check-register thead th:nth-child(3) { text-align: right; }
.t2 .hl-check-register .hl-check-record > td { height: 38px; padding: 7px 12px; border-bottom: 1px solid var(--line-3); background: var(--surface); color: var(--ink-3); vertical-align: middle; }
.t2 .hl-check-register .hl-check-record:nth-child(odd) > td { background: var(--surface-4); }
.t2 .hl-check-register .hl-check-record:hover > td { background: var(--surface-2); }
.t2 .hl-check-register .hl-check-record:has(.hl-row.on) > td { background: var(--accent-tint); }
.t2 .hl-check-register .hl-check-record:has(.hl-row.on) > td:first-child { box-shadow: inset 3px 0 var(--accent); }
.t2 .hl-check-register .hl-register-result, .t2 .hl-check-register .hl-threshold-cell { text-align: right; font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
.t2 .hl-check-register .hl-register-result { font-weight: var(--weight-medium); color: var(--ink-2); }
.t2 .hl-check-register .hl-register-status { padding-left: 8px; padding-right: 8px; }
.t2 .hl-check-register .hl-check-record { cursor: pointer; }
.t2 .hl-compact-list .hl-group + .hl-group { margin-top: 18px; }
.t2 .hl-compact-list .hl-gh { padding: 14px 12px 8px; border: 0; background: var(--surface); display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
.t2 .hl-compact-list .hl-gh .t { margin: 0; font: var(--type-caption); text-transform: none; letter-spacing: normal; color: var(--ink-2); font-weight: var(--weight-strong); }
.t2 .hl-compact-list .hl-gh .n { font: var(--type-caption); color: var(--ink-4); }
.t2 .hl-compact-list .hl-row { display: block; width: 100%; min-height: 28px; border: 0; border-radius: 0; padding: 0; margin: 0; box-shadow: none; text-align: left; background: none; }
.t2 .hl-compact-list .hl-row.on, .t2 .hl-compact-list .hl-row:hover, .t2 .hl-compact-list .hl-row.on:hover { background: none; box-shadow: none; }
.t2 .hl-compact-list .hl-row .top { display: flex; align-items: center; gap: 6px; min-width: 0; }
.t2 .hl-compact-list .hl-row .title { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; font: var(--type-caption); line-height: 1.4; color: var(--ink-2); white-space: normal; }
.t2 .hl-result { color: var(--ink-3); font: var(--type-caption); font-variant-numeric: tabular-nums; }
.t2 .hl-status { display: inline-flex; gap: 6px; align-items: center; font: var(--type-caption); color: var(--ink-3); }
.t2 .hl-status::before { content: ""; display: inline-block; width: 6px; height: 6px; flex: none; border-radius: var(--radius-pill); background: var(--ink-5); }
.t2 .hl-compact-list .hl-status { font: var(--type-caption); font-size: var(--component-size-11px); gap: 5px; white-space: nowrap; }
.t2 .hl-compact-list .hl-status::before { width: 5px; height: 5px; }
.t2 .hl-check-caution { font: var(--type-caption); color: var(--warn); flex: none; }
.t2 .hl-explorer-foot { padding: 10px 14px; border-top: 1px solid var(--line-2); display: grid; gap: 4px; }
.t2 .hl-text-button, .t2 .hl-detail-config { background: none; border: 0; padding: 0; color: var(--accent-ink); font: var(--type-caption); cursor: pointer; text-align: left; }
.t2 .hl-text-button:hover, .t2 .hl-detail-config:hover { text-decoration: underline; text-underline-offset: 3px; }
.t2.hl-workspace-page .hl-ph { padding: 12px 24px; border-bottom: 1px solid var(--line-2); }
.t2 .hl-detail-eyebrow { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; font: var(--type-caption); color: var(--ink-4); }
.t2 .hl-detail-eyebrow .hl-status { padding: 3px 7px; border-radius: var(--radius-sm); background: var(--surface-3); }
.t2 .hl-detail-title { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 12px; }
.t2 .hl-detail-title .t { margin: 0; font: var(--type-heading); line-height: var(--leading-relaxed); }
.t2 .hl-detail-config { flex: none; margin-left: auto; }
.t2 .hl-check-facts { display: flex; flex-wrap: wrap; gap: 4px 18px; padding-top: 6px; }
.t2 .hl-check-facts > div { display: flex; gap: 6px; font: var(--type-caption); }
.t2 .hl-check-facts span { color: var(--ink-4); }
.t2 .hl-check-facts strong { color: var(--ink-2); font-weight: var(--weight-medium); }
.t2.hl-workspace-page .hl-ph .b { margin-top: 6px; font: var(--type-caption); color: var(--ink-3); line-height: var(--leading-relaxed); }
.t2.hl-workspace-page .hl-review-note { color: var(--warn); border-left: 2px solid var(--warn-dot); padding-left: 10px; }
.t2 .hl-evidence-heading { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; padding: 12px 24px 6px; font: var(--type-caption); }
.t2 .hl-evidence-heading .hint { margin: 0; }
.t2 .hl-evidence-toolbar { display: flex; gap: 12px; padding: 0 24px 10px; flex-wrap: wrap; align-items: center; }
.t2 .hl-evidence-toolbar .hl-search { flex: 1; min-width: 160px; }
.t2 .hl-evidence-toolbar .hl-dropdown { min-width: 180px; max-width: 220px; }
.t2 .hl-evidence-toolbar .btn { border: 0; border-bottom: 1px solid var(--line-2); border-radius: 0; box-shadow: none; background: none; color: var(--ink-3); }
.t2 .hl-wbs-toggle[aria-expanded="true"] { color: var(--accent-ink); border-bottom-color: var(--accent); }
.t2 .hl-wbs-filter { margin: 0 24px 12px; border-left: 2px solid var(--line-2); padding: 4px 8px; }
.t2 .hl-wbs-tree { max-height: 200px; overflow-y: auto; }
.t2 .hl-activity-scope { display: flex; align-items: center; gap: 12px; padding: 0 24px 8px; font: var(--type-caption); color: var(--ink-3); }
.t2.hl-workspace-page .hl-tw { margin: 0 24px; }
.t2 .hl-project-table { width: 100%; min-width: 870px; border-collapse: separate; border-spacing: 0; }
.t2 .hl-project-table th { padding: 8px; background: var(--surface-3); color: var(--ink-3); white-space: nowrap; font: var(--type-caption); text-align: left; }
.t2 .hl-project-table td { padding: 9px 8px; vertical-align: top; font: var(--type-caption); }
.t2 .hl-project-table th:first-child { width: 90px; }
.t2 .hl-project-table th:nth-child(2) { width: 28%; }
.t2 .hl-project-table th:nth-child(3) { width: 100px; }
.t2 .hl-project-table td { border-bottom: 1px solid var(--line-2); }
.t2 .hl-project-table tbody tr:nth-child(even) td { background: var(--surface-4); }
.t2 .hl-activity-id { white-space: nowrap; color: var(--ink-2); }
.t2 .hl-activity-type { color: var(--ink-4); }
.t2 .hl-project-table .hl-links { text-align: center; }
.t2 .hl-project-table .hl-date, .t2 .hl-project-table .hl-links, .t2 .hl-project-table td.v { white-space: nowrap; font-variant-numeric: tabular-nums; }
.t2 .hl-project-table .hl-date, .t2 .hl-project-table .hl-links { color: var(--ink-3); }
.t2 .hl-life { display: inline-block; white-space: nowrap; color: var(--ink-3); }
.t2 .hl-issue-detail summary { cursor: pointer; color: var(--ink); line-height: var(--leading-relaxed); min-width: 165px; }
.t2 .hl-issue-evidence { padding: 8px 0 0 12px; margin-top: 4px; border-left: 1px solid var(--line-2); }
.t2 .hl-issue-detail p { color: var(--ink-3); font: var(--type-caption); line-height: var(--leading-relaxed); margin: 4px 0 8px; }
.t2 .hl-issue-period { padding: 3px 0; color: var(--ink-3); font: var(--type-caption); }
.t2 .hl-pagination { display: flex; align-items: center; gap: 6px; padding: 8px 24px; }
.t2 .hl-pagination .hint { margin-right: auto; }
.t2 .hl-table-help { font: var(--type-caption); color: var(--ink-4); line-height: var(--leading-relaxed); padding: 0 24px; margin: 0 0 12px; }
.t2 .hl-detail-history { border-top: 1px solid var(--line-2); }
.t2 .hl-detail-history > summary { padding: 11px 24px; cursor: pointer; font: var(--type-caption); color: var(--ink-3); }
.t2 .hl-check-history-table { width: 100%; border-collapse: collapse; text-align: left; font: var(--type-caption); }
.t2 .hl-check-history-table th { color: var(--ink-4); font-weight: var(--weight-medium); }
.t2 .hl-check-history-table th, .t2 .hl-check-history-table td { padding: 8px 12px; border-bottom: 1px solid var(--line-2); }
.t2 .hl-history-inline-scroll { margin: 0 12px 12px; overflow: auto; }
.t2 .hl-finding-source { color: var(--ink-4); font: var(--type-caption); margin-bottom: 6px; }
.t2 .hl-project-findings .hl-finding { padding: 12px 24px 16px; }
.t2 .hl-preview-row { margin: 0; padding: 8px 24px; font: var(--type-caption); color: var(--ink-2); }
.t2 .hl-pending-issues > summary { color: var(--warn); }
.t2 .hl-project-history { display: flex; flex-direction: column; flex: 1; min-height: 0; min-width: 0; margin: 0; padding: 16px 0 0; border: 0; border-radius: 0; box-shadow: none; }
.t2 .hl-history-head, .t2 .hl-project-history > .hint { flex: none; }
.t2 .hl-history-head { display: flex; justify-content: space-between; flex-wrap: wrap; gap: 8px; font: var(--type-body); }
.t2 .hl-project-history > .hint { margin: 8px 0 14px; }
.t2 .hl-history-scroll { flex: 1; min-height: 0; overflow: auto; overscroll-behavior: contain; border-top: 1px solid var(--line-2); }
.t2 .hl-history-table { width: 100%; border-collapse: separate; border-spacing: 0; }
.t2 .hl-history-table th, .t2 .hl-history-table td { min-width: 140px; padding: 8px 12px; vertical-align: top; }
.t2 .hl-history-table thead th { position: sticky; top: 0; z-index: 2; background: var(--surface-2); }
.t2 .hl-history-table tr > :first-child { position: sticky; left: 0; min-width: 240px; max-width: 300px; background: var(--surface-3); z-index: 1; text-align: left; }
.t2 .hl-history-table thead th:first-child { z-index: 3; }
.t2 .hl-history-table small { display: block; margin-top: 4px; font-weight: var(--weight-regular); color: var(--ink-3); }
.t2 .hl-history-table .is-preview { background: var(--warn-tint); }
.t2 .hl-history-pick { padding: 0; border: 0; background: none; color: var(--ink); font: inherit; cursor: pointer; text-align: left; }
.t2 .hl-history-pick:hover { color: var(--accent); text-decoration: underline; }
.t2 .hl-history-state { font: var(--type-caption); text-transform: capitalize; }
.t2.hl-workspace-page .hl-empty { padding: 20px 24px; line-height: var(--leading-relaxed); }
.t2.hl-workspace-page .hl-empty.hl-clean-result { padding-block: 16px; font: var(--type-caption); }
.t2.hl-workspace-page .hl-empty .btn { display: block; margin-top: 14px; }
.t2.hl-workspace-page button:focus-visible, .hl-cfg-project button:focus-visible, .hl-cfg-project summary:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
/* Quiet score treatment with headings above each results table. */
.t2 .hl-project-overview { padding: 20px 24px; margin: 0; }
.t2 .hl-overview-intro { margin-bottom: 22px; }
.t2 .hl-score-block { padding: 0 0 14px; border-bottom: 1px solid var(--line-2); }
.t2 .hl-score-heading { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; }
.t2 .hl-project-overview h2 { font: var(--type-caption); font-weight: var(--weight-strong); color: var(--ink-2); margin: 0 0 10px; }
.t2 .hl-score-block .hl-score-heading h2 { margin: 0; font: var(--type-heading); }
.t2 .hl-score-source { color: var(--ink-4); font: var(--type-caption); }
.t2 .hl-score-value { margin-left: auto; padding: 4px 10px; border-radius: var(--radius-sm); background: var(--accent-tint); color: var(--accent-ink); font: var(--type-title); font-variant-numeric: tabular-nums; }
.t2 .hl-score-value.unavailable { font: var(--type-caption); }
.t2 .hl-score-caption { margin: 8px 0 0; font: var(--type-caption); color: var(--ink-3); }
.t2 .hl-score-exclusions { color: var(--ink-4); }
.t2 .hl-score-method { margin-top: 8px; font: var(--type-caption); color: var(--ink-4); line-height: var(--leading-relaxed); }
.t2 .hl-score-method summary { cursor: pointer; }
.t2 .hl-score-method summary:focus-visible { outline: 2px solid var(--focus); outline-offset: 3px; }
.t2 .hl-overview-tables { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px; }
.t2 .hl-summary-table, .t2 .hl-group-results { width: 100%; border-collapse: collapse; font: var(--type-caption); text-align: left; }
.t2 .hl-summary-table thead th, .t2 .hl-group-results thead th { padding: 8px 10px; background: var(--surface-3); color: var(--ink-4); font-weight: var(--weight-medium); border-bottom: 1px solid var(--line-2); }
.t2 .hl-summary-table tbody th, .t2 .hl-summary-table td, .t2 .hl-group-results td { padding: 9px 10px; font-weight: var(--weight-regular); border-bottom: 1px solid var(--line-2); color: var(--ink-3); }
.t2 .hl-summary-table .num, .t2 .hl-summary-table thead th:last-child, .t2 .hl-group-results th:not(:first-child), .t2 .hl-group-results td:not(:first-child) { text-align: right; font-variant-numeric: tabular-nums; }
.t2 .hl-breakdown-row, .t2 .hl-priority-row { border: 0; padding: 0; background: none; cursor: pointer; color: var(--ink-2); font: inherit; text-align: left; }
.t2 .hl-breakdown-row:hover, .t2 .hl-priority-row:hover { text-decoration: underline; text-underline-offset: 3px; }
.t2 .hl-score-breakdown tbody tr, .t2 .hl-priority-table tbody tr { cursor: pointer; }
.t2 .hl-score-breakdown tbody tr:hover, .t2 .hl-priority-table tbody tr:hover { background: var(--surface-4); }
.t2 .hl-overview-note { font: var(--type-caption); color: var(--ink-4); margin: 10px 0 0; }
.t2 .hl-overview-groups, .t2 .hl-priorities { margin-top: 22px; }
.t2 .hl-priorities-heading { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.t2 .hl-findings-table { min-width: 580px; }
.t2 .hl-findings-table th:nth-child(1) { width: 22%; }
.t2 .hl-findings-table th:nth-child(2) { width: 28%; }
.t2 .hl-findings-table th:last-child, .t2 .hl-preview-table th:last-child { text-align: left; }
.t2 .hl-findings-table td { vertical-align: top; line-height: var(--leading-relaxed); }
.t2 .hl-preview-table { min-width: 480px; }
/* Configuration keeps one navigation column and a single editing surface. */
.hl-cfg-project { width: min(960px, calc(100vw - 32px)); }
.hl-cfg-project .hl-cfg-h { padding: 20px 48px 16px 24px; }
.hl-cfg-workspace { display: grid; grid-template-columns: 250px minmax(0, 1fr); min-height: 0; overflow: hidden; }
.hl-cfg-project .hl-cfg-b { padding: 8px 24px 20px; }
.hl-cfg-nav { padding: 16px 10px; overflow-y: auto; background: var(--surface-3); border-right: 1px solid var(--line-2); }
.hl-cfg-nav .hl-search { width: 100%; }
.hl-cfg-nav .hl-cfg-k { padding: 4px 8px; }
.hl-cfg-pick { display: block; width: 100%; text-align: left; font: var(--type-caption); line-height: var(--leading-relaxed); color: var(--ink-3); background: none; border: 0; border-radius: 0; padding: 8px; cursor: pointer; }
.hl-cfg-pick:hover { background: var(--hover-wash); }
.hl-cfg-pick.on { background: var(--accent-tint); color: var(--accent-ink); font-weight: var(--weight-strong); }
.hl-cfg-project .hl-cfg-k { color: var(--ink-2); }
.hl-cfg-project .hl-cfg-f { padding: 16px 24px; flex-wrap: wrap; }
.hl-cfg-project .hl-cfg-f .hint { flex-basis: 100%; margin-bottom: 6px; }
.hl-cfg-project .hl-cfg-row { padding: 5px 0; }
.hl-cfg-project .hl-cfg-row input { accent-color: var(--accent); }
.hl-cfg-warning { padding: 10px; font: var(--type-caption); line-height: var(--leading-relaxed); color: var(--warn); background: var(--warn-tint); }
@media (max-width: 1200px) {
  .t2 .hl-project-overview { padding: 20px; }
}
@media (max-width: 900px) {
  .t2 .hl-overview-tables { grid-template-columns: minmax(0, 1fr); gap: 20px; }
}
@container schedule-health (max-width: 1100px) {
  .t2 .hl-nav-coverage { display: none; }
}
@container schedule-health (max-width: 820px) {
  .t2.hl-workspace-page > .pane { overflow: auto; padding-inline: 16px; }
  .t2 .hl-workspace-nav { gap: 8px; }
  .t2 .hl-toolbar-actions { flex: 1; }
  .t2.hl-workspace-page .hl-grid, .t2.hl-workspace-page .hl-grid.is-overview { grid-template-columns: minmax(0, 1fr); flex: none; height: auto; overflow: visible; }
  .t2.hl-workspace-page .hl-left { height: 330px; border-right: 0; border-bottom: 1px solid var(--line-2); }
  .t2.hl-workspace-page .hl-right { overflow: visible; }
  .t2 .hl-detail-title { flex-wrap: wrap; }
  .t2 .hl-project-overview { padding: 20px 0; }
  .t2 .hl-grid.is-overview .hl-right { grid-row: 1; }
  .t2 .hl-grid.is-overview .hl-left { height: 520px; border-top: 1px solid var(--line-2); }
  .t2 .hl-check-register .hl-check-result-col { width: 80px; }
  .t2 .hl-check-register .hl-check-status-col { width: 94px; }
  .t2 .hl-check-register thead th, .t2 .hl-check-register .hl-check-record > td { padding-inline: 8px; }
  .t2 .hl-check-register { min-width: 480px; }
  .t2 .hl-history-table tr > :first-child { min-width: 160px; max-width: 180px; }
  .t2.hl-workspace-page .hl-ph { padding-inline: 12px; }
  .t2 .hl-evidence-heading, .t2 .hl-evidence-toolbar { padding-inline: 12px; }
  .t2.hl-workspace-page .hl-tw { margin-inline: 12px; }
  .t2 .hl-overview-tables { grid-template-columns: minmax(0, 1fr); }
}
@container schedule-health (max-width: 600px) {
  .t2 .hl-project-context { gap: 6px; }
  .t2 .hl-view-tab { padding-inline: 8px; }
  .t2 .hl-source-date { display: none; }
  .t2 .hl-coverage-details { margin-left: auto; }
  .t2 .hl-coverage-info { left: auto; right: 0; }
  .t2 .hl-toolbar-actions { flex-basis: 100%; margin: 0; gap: 6px; justify-content: flex-start; }
}
@media (max-width: 760px) {
  .hl-cfg-workspace { grid-template-columns: minmax(0, 1fr); }
  .hl-cfg-nav { max-height: 150px; border-right: 0; border-bottom: 1px solid var(--line-2); }
  .hl-cfg-project .hl-cfg-b { max-height: 42vh; }
}

/* Separate current health from the timeline, with graphics grounded in check counts. */
.t2.hl-workspace-page { background: var(--surface-3); }
.t2.hl-workspace-page > .pane { padding-bottom: 16px; }
.t2 .hl-workspace-nav { border-bottom: 0; }
.t2 .hl-workspace-tabs { background: var(--surface-2); }
.t2 .hl-view-tab.on { background: var(--surface); box-shadow: var(--shadow-1); }
.t2.hl-workspace-page .hl-grid, .t2.hl-workspace-page .hl-grid.is-overview { gap: 16px; background: transparent; }
.t2.hl-workspace-page .hl-card { border: 1px solid var(--line-2); border-radius: var(--radius-lg); }
.t2.hl-workspace-page .hl-left { border-right: 1px solid var(--line-2); }
.t2 .hl-overview-pick { min-height: 42px; }
.t2 .hl-explorer-controls { padding-block: 12px; gap: 8px; }
.t2 .hl-explorer-heading strong { color: var(--ink-2); font-weight: var(--weight-strong); }
.t2 .hl-project-overview { padding: 20px; }
.t2 .hl-overview-intro { margin-bottom: 24px; }
.t2 .hl-score-block { display: grid; grid-template-columns: 112px minmax(0, 1fr); column-gap: 20px; align-content: center; padding: 18px; border: 0; border-radius: var(--radius-md); background: var(--surface-3); }
.t2 .hl-score-ring { position: relative; isolation: isolate; grid-row: 1 / 4; width: 112px; height: 112px; align-self: start; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px; border-radius: 50%; background: conic-gradient(var(--ok-dot) var(--health-score), var(--line-2) 0); }
.t2 .hl-score-ring::before { content: ""; position: absolute; inset: 7px; z-index: -1; background: var(--surface); border-radius: 50%; }
.t2 .hl-score-ring .hl-score-value { margin: 0; padding: 0; background: none; border-radius: 0; font: var(--type-display); color: var(--ink-2); }
.t2 .hl-score-ring .hl-score-value.unavailable { font: var(--type-caption); }
.t2 .hl-ring-label { font: var(--type-caption); font-size: var(--component-size-11px); color: var(--ink-4); }
.t2 .hl-score-heading { padding-top: 10px; align-self: end; }
.t2 .hl-score-source { padding: 3px 7px; border-radius: var(--radius-sm); background: var(--surface); }
.t2 .hl-score-caption { line-height: var(--leading-relaxed); }
.t2 .hl-score-method { margin-top: 5px; }
.t2 .hl-distribution { display: flex; width: 100%; height: 10px; gap: 2px; overflow: hidden; background: var(--surface-2); border-radius: var(--radius-pill); }
.t2 .hl-distribution-segment { min-width: 2px; height: 100%; }
.t2 .hl-score-breakdown > .hl-distribution { margin: 16px 0 10px; }
.t2 .hl-score-breakdown thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }
.t2 .hl-score-breakdown .hl-summary-table td { padding-block: 8px; }
.t2 .hl-overview-tables { gap: 24px; }
.t2 .hl-impact-summary .hl-summary-table { margin-top: 12px; }
.t2 .hl-impact-value { width: 47%; }
.t2 .hl-impact-value strong { display: inline-block; min-width: 26px; font-weight: var(--weight-medium); }
.t2 .hl-impact-track { display: inline-flex; vertical-align: middle; width: calc(100% - 34px); height: 6px; margin-right: 8px; overflow: hidden; border-radius: var(--radius-pill); background: var(--surface-2); }
.t2 .hl-impact-track > span { height: 100%; border-radius: inherit; }
.t2 .hl-impact-track .is-new { background: var(--warn-dot); }
.t2 .hl-impact-track .is-continuing { background: var(--accent); }
.t2 .hl-impact-track .is-cleared { background: var(--ok-dot); }
.t2 .hl-group-results td { padding-block: 12px; }
.t2 .hl-group-results td:first-child { width: 40%; }
.t2 .hl-group-results .hl-distribution { height: 6px; max-width: 230px; margin-top: 8px; }
.t2 .hl-project-history { padding: 16px; gap: 12px; background: var(--surface); border: 1px solid var(--line-2); border-radius: var(--radius-lg); overflow: auto; overscroll-behavior: contain; }
.t2 .hl-history-head { align-items: center; }
.t2 .hl-history-head h2 { margin: 0 0 5px; font: var(--type-title); color: var(--ink-2); }
.t2 .hl-history-head p, .t2 .hl-trend-heading p, .t2 .hl-matrix-head p { margin: 0; font: var(--type-caption); color: var(--ink-4); line-height: var(--leading-relaxed); }
.t2 .hl-history-count-badge { padding: 6px 10px; font: var(--type-caption); color: var(--accent-ink); background: var(--accent-tint); border-radius: var(--radius-pill); }
.t2 .hl-trend { flex: none; min-width: 0; padding: 10px 16px; background: var(--surface-3); border-radius: var(--radius-md); }
.t2 .hl-trend-heading, .t2 .hl-matrix-head { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; }
.t2 .hl-trend-heading h3, .t2 .hl-matrix-head h3 { margin: 0 0 4px; font: var(--type-body); font-weight: var(--weight-strong); color: var(--ink-2); }
.t2 .hl-trend-heading { gap: 8px 16px; }
.t2 .hl-trend-heading h3 { margin: 0; }
.t2 .hl-trend-toggle { flex: none; border: 0; border-radius: var(--radius-sm); padding: 5px 8px; background: var(--surface); color: var(--accent-ink); font: var(--type-caption); cursor: pointer; }
.t2 .hl-trend-toggle:hover { background: var(--accent-tint); }
.t2 .hl-trend-legend { display: flex; gap: 16px; font: var(--type-caption); color: var(--ink-3); }
.t2 .hl-trend-legend > span { display: inline-flex; align-items: center; gap: 6px; }
.t2 .hl-trend-legend > span::before { content: ""; width: 8px; height: 8px; box-sizing: border-box; border-radius: 50%; background: var(--ok-dot); }
.t2 .hl-trend-legend > .hl-legend-preview::before { border: 2px solid var(--warn-dot); background: var(--surface); }
.t2 .hl-trend-scroll { overflow-x: auto; overscroll-behavior: contain; }
.t2 .hl-trend-plot { height: 116px; position: relative; margin-top: 6px; }
.t2 .hl-trend-plot svg { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; }
.t2 .hl-trend-gridline { stroke: var(--line-2); stroke-dasharray: 3 5; vector-effect: non-scaling-stroke; }
.t2 .hl-trend-line { stroke: var(--ok-dot); stroke-width: 2; vector-effect: non-scaling-stroke; }
.t2 .hl-trend-axis { position: absolute; left: 0; transform: translateY(-50%); font: var(--type-caption); color: var(--ink-4); }
.t2 .hl-trend-point { position: absolute; width: 28px; height: 28px; transform: translate(-50%, -50%); display: grid; place-items: center; padding: 0; border: 0; border-radius: 50%; background: transparent; cursor: pointer; }
.t2 .hl-trend-point > span { width: 10px; height: 10px; border: 2px solid var(--surface); border-radius: 50%; background: var(--ok-dot); box-sizing: border-box; }
.t2 .hl-trend-point.is-preview > span { background: var(--surface); border-color: var(--warn-dot); }
.t2 .hl-trend-point:hover, .t2 .hl-trend-point[aria-pressed="true"] { background: var(--ok-line); }
.t2 .hl-trend-point.is-preview:hover, .t2 .hl-trend-point.is-preview[aria-pressed="true"] { background: var(--warn-line); }
.t2 .hl-trend-point.no-score > span { display: grid; place-items: center; width: 20px; height: 20px; background: var(--surface-2); color: var(--ink-4); border: 0; font: var(--type-caption); }
.t2 .hl-trend-dates { position: relative; height: 34px; margin-top: 0; font: var(--type-caption); color: var(--ink-4); }
.t2 .hl-trend-date { position: absolute; transform: translateX(-50%); width: 100px; text-align: center; }
.t2 .hl-trend-date strong { display: block; font-weight: var(--weight-medium); color: var(--ink-3); overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
.t2 .hl-trend-date small { display: block; margin-top: 3px; font: inherit; }
.t2 .hl-trend-readout { display: flex; flex: 1; min-width: 0; align-items: center; flex-wrap: wrap; gap: 4px 8px; font: var(--type-caption); color: var(--ink-3); }
.t2 .hl-trend-readout strong { max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: var(--weight-medium); color: var(--ink-3); }
.t2 .hl-trend-readout .hl-preview-label { color: var(--warn); }
.t2 .hl-trend-result { color: var(--ok); }
.t2 .hl-trend-note { font: var(--type-caption); color: var(--ink-4); margin: 6px 0 0; }
.t2 .hl-history-matrix { display: flex; flex-direction: column; flex: 1 0 300px; min-height: 300px; min-width: 0; }
.t2 .hl-matrix-head .hl-search { flex: 0 1 250px; border: 1px solid var(--line-2); border-radius: var(--radius-sm); }
.t2 .hl-matrix-legend { display: flex; flex-wrap: wrap; gap: 8px 16px; padding: 12px 0; }
.t2 .hl-history-settings { margin-left: auto; font: var(--type-caption); color: var(--ink-4); }
.t2 .hl-history-scroll { max-height: none; border: 1px solid var(--line-2); border-radius: var(--radius-md); }
.t2 .hl-history-table th, .t2 .hl-history-table td { border-bottom: 1px solid var(--line-2); border-right: 1px solid var(--line-3); padding: 10px 12px; }
.t2 .hl-history-table thead th { background: var(--surface-3); font: var(--type-caption); font-weight: var(--weight-strong); text-align: left; }
.t2 .hl-history-table tr > :first-child { background: var(--surface); }
.t2 .hl-history-table thead th:first-child { background: var(--surface-3); }
.t2 .hl-history-table .is-preview { background: var(--surface-4); }
.t2 .hl-history-table thead .is-preview small { color: var(--warn); }
.t2 .hl-history-state { display: inline-flex; align-items: center; gap: 5px; padding: 3px 6px; border-radius: var(--radius-sm); white-space: nowrap; }
.t2 .hl-history-table .is-selected-update { background: var(--accent-tint); box-shadow: inset 1px 0 var(--accent-tint-line), inset -1px 0 var(--accent-tint-line); }
.t2 .hl-history-table thead .is-selected-update { box-shadow: inset 0 3px var(--accent); }
@container schedule-health (max-width: 1050px) {
  .t2 .hl-score-block { grid-template-columns: minmax(0, 1fr); justify-items: start; }
  .t2 .hl-score-ring { grid-row: auto; }
  .t2 .hl-overview-tables { grid-template-columns: minmax(0, 1fr); }
}
@container schedule-health (max-width: 820px) {
  .t2.hl-workspace-page .hl-grid, .t2.hl-workspace-page .hl-grid.is-overview { gap: 16px; }
  .t2.hl-workspace-page .hl-right { overflow: hidden; }
  .t2 .hl-project-overview { padding: 16px; }
  .t2 .hl-score-block { grid-template-columns: 112px minmax(0, 1fr); column-gap: 14px; }
  .t2 .hl-score-ring { grid-row: 1 / 4; }
  .t2 .hl-project-history { overflow: visible; flex: none; padding: 16px; }
  .t2 .hl-history-matrix { flex: none; min-height: 0; }
  .t2 .hl-history-scroll { flex: none; max-height: 450px; }
  .t2 .hl-trend { padding: 10px; }
  .t2 .hl-trend-readout { order: 3; flex-basis: 100%; }
  .t2 .hl-trend-legend { order: 4; }
  .t2 .hl-trend-toggle { margin-left: auto; }
}
@container schedule-health (max-width: 470px) {
  .t2 .hl-score-block { grid-template-columns: minmax(0, 1fr); }
  .t2 .hl-score-ring { grid-row: auto; }
  .t2 .hl-group-results thead th, .t2 .hl-group-results td { padding-inline: 5px; }
  .t2 .hl-matrix-head .hl-search { flex-basis: 100%; }
}

/* Project health loading: centered progress from completed server work. */
.t2.hl-loading-page { background: var(--surface); }
.t2.hl-loading-page > .pane { display: flex; min-height: 0; padding: 0 24px; }
.t2 .hl-health-loading { flex: 1; min-height: 240px; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 24px; text-align: center; }
.t2 .hl-loading-circle { --loading-angle: 0deg; position: relative; isolation: isolate; display: grid; place-items: center; width: 108px; height: 108px; border-radius: 50%; background: conic-gradient(var(--accent) var(--loading-angle), var(--line-2) 0); }
.t2 .hl-loading-circle::before { content: ""; position: absolute; inset: 5px; border-radius: 50%; background: var(--surface); z-index: -1; }
.t2 .hl-loading-circle::after { content: ""; position: absolute; inset: -7px; border: 1px solid transparent; border-top-color: var(--accent-tint-line); border-radius: 50%; animation: hl-loading-orbit 2s linear infinite; }
.t2 .hl-loading-percent { font: var(--type-display); color: var(--accent-ink); font-variant-numeric: tabular-nums; }
.t2 .hl-health-loading h2 { margin: 22px 0 6px; color: var(--ink-2); font: var(--type-heading); }
.t2 .hl-loading-label { margin: 0; color: var(--ink-4); font: var(--type-caption); }
@keyframes hl-loading-orbit { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { .t2 .hl-loading-circle::after { animation: none; } }
.ik-return-subject { display: block; }
/* Schedule confirmation remains inside the page and fits short viewports. */
dialog.schedule-record-dialog { border:1px solid var(--line); padding:0; max-width:calc(100vw - 32px); max-height:calc(100dvh - 32px); }
dialog.schedule-record-dialog::backdrop { background:var(--schedule-dialog-backdrop); backdrop-filter:blur(3px); }
/* Let the title and pair share a row when space permits, retaining readable wraps. */
@media(min-width:1200px) {
 .t2.comparison-page .comparison-page-head { grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:8px 16px; }
 .comparison-page .comparison-page-head>p { grid-column:2; }
 .t2.comparison-page .comparison-page-actions { grid-column:3; grid-row:1; flex-wrap:wrap; }
}

/* Document actions must not fall into the pass icon's narrow grid column. */
.t2 .ik-prow > .ik-document-remove { grid-column:2 / -1; justify-self:end; width:auto; min-width:max-content; padding:0 12px; white-space:nowrap; }

/* Keep comparison metadata directly beneath, aligned with the schedule names. */
.t2.why-screen .why-context, .t2.why-screen .why-start .why-context { flex-direction: column; align-items: flex-start; }
.t2.why-screen .why-comparison-status { display: flex; align-items: center; flex-wrap: wrap; gap: 5px 8px; color: var(--ink-4); font: var(--type-caption); }
.t2.why-screen .why-comparison-status:empty { display: none; }
.t2.why-screen .why-preview-label { padding: 2px 6px; border-radius: var(--radius-sm); background: var(--warn-tint); color: var(--warn); }
.t2.why-screen .why-change-comparison { box-shadow: none; }
.t2.why-screen.why-selected .why-context { gap: 2px; }
.t2.why-screen.why-selected .why-context-value { min-height: 18px; }
.t2.why-screen.why-selected .why-comparison-status { font-size: var(--component-size-10px); gap: 3px 6px; }
@media (max-width: 980px) { .t2.why-screen .why-context { flex-wrap: wrap; } }

/* Delay investigation: a bounded details card beside the analysis workspace. */
.t2.scr.why-screen.why-selected > .pageblock { position: absolute; width: 1px; height: 1px; padding: 0; border: 0; overflow: hidden; clip-path: inset(50%); }
.t2.scr.why-screen.why-selected > .pane { display: grid; grid-template-columns: clamp(260px,22vw,312px) minmax(0,1fr); grid-template-rows: minmax(0,1fr); align-items: start; gap: 16px; padding: 16px 20px; overflow: hidden; }
.t2.why-screen.why-selected .why-head,
.t2.why-screen.why-selected .why-head.has-baseline { display: flex; flex-direction: column; align-items: stretch; gap: 18px; width: 100%; max-height: 100%; min-height: 0; box-sizing: border-box; padding: 18px; margin: 0; border: 1px solid var(--line); border-radius: var(--radius-lg); background: var(--surface); box-shadow: var(--shadow-1); overflow-y: auto; scrollbar-width: thin; }
.t2.why-screen.why-selected .why-head > * { flex-shrink: 0; }
.t2.why-screen.why-selected .why-detail-heading { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.t2.why-screen.why-selected .why-detail-heading h2 { margin: 0; font-size: var(--type-body-size); font-weight: var(--weight-strong); color: var(--ink-2); }
.t2.why-screen.why-selected .why-suggestions-trigger { min-height: 26px; padding: 4px 7px; background: var(--accent-tint); border: 0; color: var(--accent-ink); font-size: var(--component-size-10px); }
.t2.why-screen.why-selected .why-identity,
.t2.why-screen.why-selected .why-date-route,
.t2.why-screen.why-selected .why-metrics,
.t2.why-screen.why-selected .why-info-button { grid-area: auto; min-width: 0; }
.t2.why-screen.why-selected .why-identity { display: flex; flex-direction: column; gap: 9px; }
.t2.why-screen.why-selected .why-activity-controls { display: block; margin-bottom: 3px; }
.t2.why-screen.why-selected .why-field > .why-field-label { display: none; }
.t2.why-screen.why-selected .why-pick { min-height: 36px; padding: 8px 10px; background: var(--surface-3); border-color: var(--line); font-size: var(--type-caption-size); box-shadow: none; }
.t2.why-screen.why-selected .why-pick:hover { background: var(--accent-tint); border-color: var(--accent-tint-line); }
.t2.why-screen.why-selected .why-title { margin: 0; gap: 6px; flex-wrap: wrap; }
.t2.why-screen.why-selected .why-code { padding: 2px 5px; border-radius: var(--radius-sm); background: var(--surface-2); color: var(--ink-3); }
.t2.why-screen.why-selected .why-title .chip { font-size: var(--component-size-10px); line-height: 1.4; }
.t2.why-screen.why-selected .why-name { margin: 0; font-size: var(--component-size-18px); line-height: 1.4; letter-spacing: -.3px; overflow-wrap: anywhere; }
.t2.why-screen.why-selected .why-timeline { display: flex; flex-direction: column; gap: 16px; min-width: 0; padding-top: 18px; border-top: 1px solid var(--line-2); }
.t2.why-screen.why-selected .why-context { display: flex; flex-direction: column; align-items: flex-start; gap: 5px; padding: 0; border: 0; max-width: none; min-width: 0; }
.t2.why-screen.why-selected .why-context > .why-field-label { font-size: var(--component-size-10px); color: var(--ink-4); }
.t2.why-screen.why-selected .why-context-value { display: block; min-height: 0; font-size: var(--type-caption-size); line-height: 1.6; color: var(--ink-2); overflow-wrap: anywhere; }
.t2.why-screen.why-selected .why-comparison-status { font-size: var(--component-size-10px); }
.t2.why-screen.why-selected .why-date-route { position: relative; display: flex; flex-direction: column; align-items: stretch; width: 100%; gap: 16px; padding: 0 0 0 18px; border: 0; box-sizing: border-box; }
.t2.why-screen.why-selected .why-date-point { position: relative; display: grid; grid-template-columns: minmax(0,1fr) auto; align-items: center; max-width: none; gap: 8px; }
.t2.why-screen.why-selected .why-date-point::before { content: ''; position: absolute; left: -18px; top: calc(50% - 4px); width: 8px; height: 8px; border-radius: 50%; background: var(--surface); border: 2px solid var(--accent-tint-line); box-sizing: border-box; z-index: 1; }
.t2.why-screen.why-selected .why-date-point:last-child::before { background: var(--accent); border-color: var(--accent); }
.t2.why-screen.why-selected .why-date-point .k { font-size: var(--component-size-10px); }
.t2.why-screen.why-selected .why-date-point .v { font-size: var(--component-size-12px); line-height: 1.5; overflow-wrap: anywhere; text-align: right; max-width: 120px; }
.t2.why-screen.why-selected .why-date-connector { position: absolute; left: 3px; top: 9px; bottom: 9px; width: 1px; height: auto; margin: 0; background: var(--line); }
.t2.why-screen.why-selected .why-date-connector::before,
.t2.why-screen.why-selected .why-date-connector::after { display: none; }
.t2.why-screen.why-selected .why-outcomes { min-width: 0; }
.t2.why-screen.why-selected .why-metrics { display: flex; flex-direction: column; align-items: stretch; gap: 10px; }
.t2.why-screen.why-selected .why-metrics .why-total { display: grid; grid-template-columns: minmax(0,1fr) auto; align-items: baseline; gap: 4px 10px; min-width: 0; padding: 14px; border: 1px solid transparent; border-radius: var(--radius-md); background: var(--surface-2); }
.t2.why-screen.why-selected .why-total.has-delay { background: var(--warn-tint); }
.t2.why-screen.why-selected .why-total.has-gain { background: var(--ok-tint); }
.t2.why-screen.why-selected .why-total > .k { grid-column: 1 / -1; max-width: none; font-size: var(--type-caption-size); line-height: 1.5; }
.t2.why-screen.why-selected .why-total-values { min-width: 0; }
.t2.why-screen.why-selected .why-total-value { font-size: var(--component-size-32px); line-height: 1.2; letter-spacing: -.8px; overflow-wrap: anywhere; }
.t2.why-screen.why-selected .why-total-note { grid-column: 1 / -1; max-width: none; font-size: var(--component-size-11px); line-height: 1.5; }
.t2.why-screen.why-selected .why-metrics .why-baseline { background: var(--surface); border-color: var(--line-2); padding: 12px 14px; }
.t2.why-screen.why-selected .why-baseline > .k { grid-column: 1; }
.t2.why-screen.why-selected .why-baseline > .why-total-value { grid-column: 2; grid-row: 1 / 3; align-self: center; font-size: var(--component-size-22px); letter-spacing: -.4px; text-align: right; }
.t2.why-screen.why-selected .why-baseline > .why-total-note { grid-column: 1; }
.t2.why-screen.why-selected .why-explanation { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding-top: 14px; border-top: 1px solid var(--line-2); color: var(--ink-3); font-size: var(--component-size-11px); }
.t2.why-screen.why-selected .why-info-button { flex: 0 0 26px; width: 26px; height: 26px; }
.t2.why-screen.why-selected .why-workspace { min-width: 0; max-height: 100%; align-self: stretch; }
.t2.why-screen.why-selected .why-workspace:has(.why-tab-content[data-view="tornado"]) { align-self: start; }
.t2.why-screen.why-selected .why-head + .why-empty { min-width: 0; border: 1px solid var(--line); border-radius: var(--radius-lg); margin: 0; padding: 24px; }
@media (max-width: 1100px) and (min-width: 900px) {
 .t2.scr.why-screen.why-selected > .pane { grid-template-columns: 250px minmax(0,1fr); gap: 12px; padding: 12px; }
 .t2.why-screen.why-selected .why-head { padding: 16px; }
 .t2.why-screen.why-selected .why-tabs { gap: 6px; padding: 8px; }
 .t2.why-screen.why-selected .why-tab { padding-inline: 6px; }
}
@media (max-width: 899px), (max-height: 649px) {
 .t2.scr.why-screen.why-selected > .pane { overflow-y: auto; }
 .t2.why-screen.why-selected .why-head { max-height: none; overflow: visible; }
 .t2.why-screen.why-selected .why-workspace { max-height: none; }
}
@media (max-width: 899px) {
 .t2.scr.why-screen.why-selected > .pane { display: flex; flex-direction: column; gap: 14px; padding: 12px; }
 .t2.why-screen.why-selected .why-head,
 .t2.why-screen.why-selected .why-head.has-baseline { display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1fr); gap: 16px; padding: 16px; }
 .t2.why-screen.why-selected .why-detail-heading,
 .t2.why-screen.why-selected .why-identity,
 .t2.why-screen.why-selected .why-explanation { grid-column: 1 / -1; }
 .t2.why-screen.why-selected .why-timeline { grid-column: 1; padding: 0; border: 0; }
 .t2.why-screen.why-selected .why-outcomes { grid-column: 2; }
 .t2.why-screen.why-selected .why-date-point { display: flex; align-items: flex-start; gap: 3px; }
 .t2.why-screen.why-selected .why-date-point .v { text-align: left; max-width: none; }
 .t2.why-screen.why-selected .why-metrics .why-total { display: flex; flex-direction: column; align-items: flex-start; padding: 10px; }
 .t2.why-screen.why-selected .why-total-value { font-size: var(--component-size-24px); }
 .t2.why-screen.why-selected .why-baseline > .why-total-value { align-self: flex-start; text-align: left; font-size: var(--component-size-20px); }
 .t2.why-screen.why-selected .why-workspace { flex: none; width: 100%; box-sizing: border-box; }
}

/* Loading uses the same details/chart columns from the first paint. */
.t2.why-screen.why-selected .why-pending .why-pending-slot { grid-column: 1 / -1; min-width: 0; }
.t2.why-screen.why-selected .why-pending .why-find { margin: 0; }
.t2.why-screen.why-selected .why-pending .why-controls { display: flex; flex-direction: column; align-items: stretch; gap: 14px; }
.t2.why-screen.why-selected .why-pending .why-suggestions-trigger { align-self: flex-start; }
.t2.why-screen.why-selected .why-placeholder { height: 14px; border-radius: var(--radius-sm); background: var(--surface-2); }
.t2.why-screen.why-selected .why-placeholder-field { height: 36px; grid-column: 1 / -1; }
.t2.why-screen.why-selected .why-placeholder-line { width: 78%; }
.t2.why-screen.why-selected .why-placeholder-metric { height: 96px; grid-column: 1 / -1; }
.t2.why-screen.why-selected > .pane > .why-loading { align-self: stretch; min-width: 0; border: 1px solid var(--line); border-radius: var(--radius-lg); background: var(--surface); }

/* Missing health inputs: one searchable list with evidence kept in context. */
.t2.hl-not-computed-dialog { width: min(1040px, calc(100vw - 40px)); max-width: none; max-height: calc(100dvh - 64px); margin: auto; padding: 0; border: 1px solid var(--line); border-radius: var(--radius-xl); background: var(--surface); color: var(--ink); box-shadow: var(--shadow-2); overflow: hidden; }
.t2.hl-not-computed-dialog[open] { display: flex; flex-direction: column; }
.hl-not-computed-dialog::backdrop { background: var(--scrim); backdrop-filter: blur(3px); }
.t2 .hl-nc-header { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 22px 24px 8px; }
.t2 .hl-nc-title { display: flex; align-items: center; gap: 10px; }
.t2 .hl-nc-title h2 { margin: 0; font-size: var(--type-title-size); font-weight: var(--weight-strong); }
.t2 .hl-nc-count { padding: 3px 9px; border-radius: var(--radius-pill); background: var(--warn-tint); color: var(--warn); font-size: var(--type-body-size); font-weight: var(--weight-strong); }
.t2 .hl-nc-close { display: grid; place-items: center; width: 32px; height: 32px; border: 0; border-radius: var(--radius-sm); background: var(--surface-3); color: var(--ink-3); font-size: var(--type-display-size); cursor: pointer; }
.t2 .hl-nc-description { margin: 0; padding: 0 24px 18px; color: var(--ink-3); font-size: var(--type-body-size); line-height: 1.6; }
.t2 .hl-nc-toolbar { display: flex; align-items: center; gap: 16px; padding: 12px 24px; border-block: 1px solid var(--line); background: var(--surface-2); }
.t2 .hl-nc-toolbar input { width: min(420px, 100%); min-width: 0; padding: 9px 12px; border: 1px solid var(--line); border-radius: var(--radius-sm); background: var(--surface); color: var(--ink); font: inherit; }
.t2 .hl-nc-results { margin-left: auto; white-space: nowrap; font-size: var(--type-caption-size); color: var(--ink-3); }
.t2 .hl-nc-scroll { min-height: 0; overflow: auto; overscroll-behavior: contain; }
.t2 .hl-nc-table { width: 100%; border-collapse: collapse; table-layout: fixed; font-size: var(--type-body-size); }
.t2 .hl-nc-table > thead { position: sticky; top: 0; z-index: 1; background: var(--surface); }
.t2 .hl-nc-table > thead th { padding: 11px 24px; text-align: left; font-size: var(--type-caption-size); font-weight: var(--weight-medium); color: var(--ink-3); border-bottom: 1px solid var(--line); }
.t2 .hl-nc-table > thead th:first-child { width: 33%; }
.t2 .hl-nc-table > thead th:last-child { width: 110px; text-align: right; }
.t2 .hl-nc-row > td { padding: 15px 24px; border-bottom: 1px solid var(--line); vertical-align: middle; overflow-wrap: anywhere; }
.t2 .hl-nc-name strong { display: block; font-weight: var(--weight-medium); }
.t2 .hl-nc-name > span { display: block; margin-top: 5px; color: var(--ink-3); font-size: var(--type-caption-size); }
.t2 .hl-nc-reason { color: var(--ink-3); line-height: 1.5; }
.t2 .hl-nc-action { text-align: right; }
.t2 .hl-nc-toggle { padding: 6px 9px; border: 0; border-radius: var(--radius-sm); background: var(--accent-tint); color: var(--accent-ink); font: inherit; cursor: pointer; }
.t2 .hl-nc-toggle[aria-expanded="true"] { background: var(--accent); color: var(--surface); }
.t2 .hl-nc-detail-row > td { padding: 0; }
.t2 .hl-nc-detail { padding: 12px 20px; background: var(--surface-2); border-bottom: 1px solid var(--line); }
.t2 .hl-nc-detail .hl-panel { min-width: 0; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-sm); overflow: hidden; }
.t2 .hl-nc-empty { padding: 48px 24px; text-align: center; color: var(--ink-3); }
.t2 .hl-nc-footer { padding: 12px 24px; border-top: 1px solid var(--line); color: var(--ink-3); font-size: var(--type-caption-size); }
@media (max-width: 640px) {
  .t2.hl-not-computed-dialog { width: calc(100vw - 20px); max-height: calc(100dvh - 24px); }
  .t2 .hl-nc-header, .t2 .hl-nc-toolbar { padding-inline: 16px; }
  .t2 .hl-nc-description, .t2 .hl-nc-footer { padding-inline: 16px; }
  .t2 .hl-nc-toolbar { gap: 8px; }
  .t2 .hl-nc-table > thead { display: none; }
  .t2 .hl-nc-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; padding: 14px 16px; gap: 8px 12px; border-bottom: 1px solid var(--line); }
  .t2 .hl-nc-row > td { padding: 0; border: 0; }
  .t2 .hl-nc-reason { grid-row: 2; grid-column: 1 / -1; }
  .t2 .hl-nc-action { grid-column: 2; grid-row: 1; }
  .t2 .hl-nc-detail-row:not([hidden]), .t2 .hl-nc-detail-row > td { display: block; }
  .t2 .hl-nc-detail { padding: 8px; }
}
/* Schedule status and actions must remain reachable even on wide viewports. */
.t2 .schedules-list > .tablewrap { overflow-x: auto; }
.t2 .schedules-list table.grid.data { min-width: 1120px; }

/* ---- Comparison Report 1a: drawn from the report document alone. Values
   mirror the supplied design (Inter/system sans, JetBrains Mono, #f3f4f6 page,
   white cards, 52px header, 1fr/232px grid). Scoped to .json-report. ---- */
.json-report { flex:1; min-height:0; display:flex; flex-direction:column; background:#f3f4f6; color:#111827; font-family:Inter,system-ui,-apple-system,sans-serif; font-size:13px; line-height:1.5; -webkit-font-smoothing:antialiased; }
.json-report .mono, .json-report .jr-mono { font-family:'JetBrains Mono',ui-monospace,monospace; font-size:12px; }
.json-report .muted { color:#6b7280; padding:0; }
.json-report .small { font-size:11.5px; }
.json-report .strong { font-weight:600; }
.json-report .big { font-size:14px; font-weight:700; }
.json-report .r { text-align:right; }
.json-report .warn { color:#92400e; }
.json-report .ok { color:#2f8a5b; }
.json-report a.jr-link { color:#1e293b; font-weight:500; text-decoration:underline; text-decoration-color:#cbd5e1; text-underline-offset:2px; cursor:pointer; }
.json-report a.jr-link.mono { font-size:12px; }
.json-report .jr-links { display:inline; }
.json-report button { font-family:inherit; }
.jr-head { height:52px; flex-shrink:0; background:#fff; border-bottom:1px solid #e5e7eb; display:flex; align-items:center; justify-content:space-between; gap:12px; padding:0 24px; font-size:13px; }
.jr-crumbs { display:flex; gap:10px; align-items:center; min-width:0; overflow:hidden; white-space:nowrap; }
.jr-crumbs b { font-weight:600; }
.jr-crumbs .jr-sep { color:#d1d5db; }
.jr-crumbs .jr-mono { font-size:12.5px; }
.jr-head-actions { display:flex; gap:8px; align-items:center; }
.jr-mode { font-size:12px; color:#4b5563; }
.jr-btn { background:#fff; border:1px solid #d1d5db; border-radius:6px; padding:6px 11px; font-size:12.5px; cursor:pointer; color:#1f2937; line-height:1.3; font-weight:500; min-height:0; height:auto; box-shadow:none; }
.jr-btn.small { padding:5px 10px; font-size:12px; }
.jr-btn.primary, .jr-btn.on { background:#1e293b; color:#fff; border-color:#1e293b; }
.jr-btn.quiet { border-color:#e5e7eb; color:#4b5563; }
.jr-scroll { flex:1; min-height:0; overflow:auto; }
.jr-grid { display:grid; grid-template-columns:minmax(0,1fr) 200px; gap:20px; padding:18px 16px 48px; align-items:start; }
.jr-main { display:flex; flex-direction:column; gap:14px; min-width:0; }
.jr-side { align-self:stretch; display:flex; flex-direction:column; gap:12px; min-width:0; }
.jr-eyebrow { font-size:12px; letter-spacing:.06em; text-transform:uppercase; color:#4b5563; font-weight:500; }
.jr-src { font-family:'JetBrains Mono',ui-monospace,monospace; font-size:11px; color:#6b7280; }
.jr-card { background:#fff; border:1px solid #e5e7eb; border-radius:10px; padding:20px 24px; display:flex; flex-direction:column; gap:12px; box-sizing:border-box; min-width:0; }
.jr-card-head { display:flex; justify-content:space-between; align-items:baseline; gap:12px; flex-wrap:wrap; }
.jr-answer { font-size:17px; font-weight:600; line-height:1.4; text-wrap:pretty; color:#111827; }
.jr-answer.small { font-size:16px; line-height:1.35; }
.jr-unavailable { font-size:13px; color:#4b5563; }
.jr-note { font-size:12.5px; color:#4b5563; line-height:1.5; }
.jr-warnline { font-size:13px; color:#92400e; font-weight:600; }
.jr-pair { display:flex; align-items:center; gap:8px 10px; flex-wrap:wrap; font-size:13px; color:#374151; }
.jr-chip { display:flex; gap:6px; align-items:baseline; background:#fff; border:1px solid #d1d5db; border-radius:6px; padding:4px 9px; }
.jr-chip.cur { border-color:#1e293b; }
.jr-chip b { font-family:'JetBrains Mono',ui-monospace,monospace; font-size:12.5px; font-weight:600; }
.jr-chip-sub { color:#6b7280; font-size:12px; }
.jr-arrow { color:#6b7280; }
.jr-pair-text { color:#4b5563; }
.jr-warn { color:#92400e; font-weight:600; }
/* The finish */
.jr-finish { padding:22px 26px 20px; gap:14px; }
.jr-headline { font-size:26px; font-weight:600; letter-spacing:-0.015em; line-height:1.22; text-wrap:pretty; color:#111827; }
.jr-sentence { font-size:15px; line-height:1.55; color:#374151; text-wrap:pretty; max-width:760px; }
.jr-sentence .strong { font-weight:700; color:#111827; }
.jr-timeline { position:relative; height:126px; margin:6px 70px 0 60px; }
.jr-tl-axis { position:absolute; left:-60px; right:-70px; top:62px; height:1px; background:#cbd5e1; }
.jr-tl-label { position:absolute; transform:translateX(-50%); display:flex; flex-direction:column; align-items:center; white-space:nowrap; }
.jr-tl-label.top { top:0; } .jr-tl-label.bot { top:94px; }
.jr-tl-small { font-size:11px; color:#6b7280; }
.jr-tl-date { font-size:13px; font-weight:600; color:#374151; }
.jr-tl-date.contract { color:#92400e; } .jr-tl-date.strong { font-weight:700; color:#111827; }
.jr-tl-tick { position:absolute; width:1px; }
.jr-tl-tick.top { top:36px; height:30px; background:#64748b; } .jr-tl-tick.bot { top:62px; height:30px; background:#1e293b; }
.jr-tl-move { position:absolute; top:58px; height:9px; background:#1e293b; border-radius:2px; }
.jr-tl-movelabel { position:absolute; top:40px; transform:translateX(-50%); font-size:12px; font-weight:600; color:#111827; white-space:nowrap; }
.jr-tl-past { position:absolute; top:72px; height:8px; background:repeating-linear-gradient(135deg,#d97706 0 2px,#fff 2px 5px); border:1px solid #d97706; box-sizing:border-box; }
.jr-tl-pastlabel { position:absolute; top:69px; transform:translateX(calc(-100% - 8px)); font-size:12px; font-weight:600; color:#92400e; white-space:nowrap; }
.jr-tl-pastlabel.ahead { transform:translateX(8px); color:#2f6f4c; }
.jr-arith { font-family:'JetBrains Mono',ui-monospace,monospace; font-size:11.5px; color:#4b5563; padding-top:10px; border-top:1px solid #f0f1f3; }
/* Where the days sit */
.jr-days-row { display:grid; gap:12px; align-items:center; padding:8px 0; border-bottom:1px solid #f0f1f3; }
.jr-days-row.head { align-items:end; padding:0 0 6px; border-bottom:1px solid #e5e7eb; font-size:11.5px; color:#6b7280; }
.jr-days-row.total { padding:10px 0 2px; border-bottom:0; }
.jr-days-act { display:flex; flex-direction:column; gap:1px; min-width:0; }
.jr-days-name { font-size:13px; font-weight:500; color:#111827; }
.jr-days-reason { font-size:12px; color:#4b5563; }
.jr-ticks, .jr-track { position:relative; height:16px; }
.jr-tick { position:absolute; transform:translateX(-50%); font-family:'JetBrains Mono',ui-monospace,monospace; font-size:10.5px; }
.jr-gridline { position:absolute; top:-8px; bottom:-8px; width:1px; background:#f3f4f6; }
.jr-bar { position:absolute; top:2px; height:12px; box-sizing:border-box; border-radius:2px; }
.jr-bar.add { background:#334155; border:1px solid #334155; }
.jr-bar.rem { background:repeating-linear-gradient(135deg,#64748b 0 2px,#fff 2px 5px); border:1px solid #64748b; }
.jr-bar.none { background:#fff; border:1.5px dashed #475569; }
.jr-bar.net { background:#111827; }
.jr-narr { font-size:12px; color:#4b5563; } .jr-narr.bad { color:#111827; font-weight:600; }
.jr-legend { display:flex; gap:6px 18px; flex-wrap:wrap; align-items:center; font-size:12px; color:#4b5563; }
.jr-legend-item { display:flex; align-items:center; gap:6px; }
.jr-swatch { width:16px; height:10px; border-radius:2px; box-sizing:border-box; }
.jr-swatch.add { background:#334155; } .jr-swatch.rem { background:repeating-linear-gradient(135deg,#64748b 0 2px,#fff 2px 5px); border:1px solid #64748b; } .jr-swatch.none { border:1.5px dashed #475569; }
.jr-method { font-size:12px; color:#6b7280; line-height:1.5; }
/* Trust */
.jr-trust { padding:20px 22px; gap:10px; }
.jr-trust-list { display:flex; flex-direction:column; }
.jr-trust-row { display:grid; grid-template-columns:18px minmax(0,1fr); gap:8px; padding:8px 0; border-top:1px solid #f0f1f3; }
.jr-glyph { font-size:12px; line-height:20px; }
.jr-glyph.ok { color:#2f8a5b; } .jr-glyph.problem { color:#d97706; } .jr-glyph.mixed { color:#475569; } .jr-glyph.note { color:#6b7280; }
.jr-trust-body { display:flex; flex-direction:column; gap:2px; min-width:0; }
.jr-trust-head { font-size:13.5px; font-weight:600; color:#111827; }
.jr-trust-detail { font-size:12.5px; color:#4b5563; display:flex; gap:2px 10px; flex-wrap:wrap; }
/* What needs you, dividers */
.jr-needs, .jr-divider { display:flex; flex-direction:column; gap:4px; padding:18px 2px 4px; border-top:1px solid #d1d5db; margin-top:8px; }
.jr-needs-text { font-size:20px; font-weight:600; letter-spacing:-0.01em; }
.jr-divider-sub { font-size:13px; color:#4b5563; }
/* Old comments */
.jr-old { padding:0; gap:0; }
.jr-old-head { padding:20px 24px 14px; display:flex; flex-direction:column; gap:6px; }
.jr-old-sub { font-size:12.5px; color:#4b5563; }
.jr-old-row { border-top:1px solid #eef0f2; padding:14px 24px; display:grid; grid-template-columns:64px minmax(0,1fr); gap:4px 12px; }
.jr-old-id { font-family:'JetBrains Mono',ui-monospace,monospace; font-size:12.5px; font-weight:600; line-height:20px; }
.jr-old-body { display:flex; flex-direction:column; gap:4px; min-width:0; }
.jr-old-text { font-size:14px; font-weight:600; color:#111827; }
.jr-old-meta { display:flex; gap:4px 14px; flex-wrap:wrap; font-size:12.5px; color:#374151; }
.jr-ret { font-weight:600; padding:0 6px; border-radius:4px; }
.jr-ret.still_there { background:#fef3e2; color:#92400e; } .jr-ret.answered_not_fixed { background:#eef1f5; color:#1e293b; } .jr-ret.cannot_retest { background:#f1f3f6; color:#4b5563; } .jr-ret.fixed { background:#e8f4ed; color:#2f6f4c; }
.jr-old-note { font-size:13px; color:#4b5563; line-height:1.45; }
.jr-old-foot { display:flex; justify-content:space-between; gap:8px 12px; flex-wrap:wrap; align-items:center; margin-top:6px; }
.jr-conf { font-size:12px; color:#6b7280; } .jr-conf.on { color:#111827; font-weight:600; }
.jr-old-actions { display:flex; gap:6px; flex-wrap:wrap; }
.jr-old-empty { padding:14px 24px 20px; font-size:13px; color:#6b7280; border-top:1px solid #eef0f2; }
.jr-old-fixed { border-top:1px solid #eef0f2; padding:12px 24px; display:flex; flex-direction:column; gap:10px; background:#fafbfc; border-radius:0 0 10px 10px; }
.jr-old-fixed-head { display:flex; align-items:center; gap:6px 10px; flex-wrap:wrap; }
.jr-old-fixed-head .jr-btn { margin-left:auto; }
.jr-old-fixed-list { display:flex; flex-direction:column; gap:6px; padding-left:16px; }
.jr-old-fixed-row { display:grid; grid-template-columns:64px minmax(0,1fr); gap:10px; font-size:12.5px; }
.jr-reason { display:flex; flex-direction:column; gap:6px; margin-top:6px; }
.jr-textarea { width:100%; min-height:72px; border:1px solid #d1d5db; border-radius:6px; padding:8px 10px; font:inherit; font-size:13px; resize:vertical; box-sizing:border-box; }
.jr-row-actions { display:flex; gap:10px; flex-wrap:wrap; align-items:center; }
/* Findings */
.jr-findings { padding:0; gap:0; }
.jr-findings-head { padding:20px 24px 14px; display:flex; flex-direction:column; gap:8px; }
.jr-filter { display:flex; gap:2px; background:#f3f4f6; border-radius:7px; padding:2px; flex-wrap:wrap; }
.jr-filter-btn { border:0; border-radius:5px; padding:4px 9px; font-size:12px; cursor:pointer; background:transparent; color:#4b5563; }
.jr-filter-btn.on { background:#fff; color:#111827; box-shadow:0 1px 2px rgba(0,0,0,.1); }
.jr-firm-legend { display:flex; gap:4px 16px; flex-wrap:wrap; font-size:12px; color:#4b5563; }
.jr-group { padding:8px 24px; background:#f6f7f9; border-top:1px solid #eef0f2; border-bottom:1px solid #eef0f2; font-size:12px; color:#4b5563; display:flex; justify-content:space-between; gap:12px; }
.jr-group .strong { color:#111827; }
.jr-f { border-bottom:1px solid #eef0f2; background:#fff; }
.jr-f.rejected { background:#fafafa; } .jr-f.rejected .jr-f-title, .jr-f.rejected .jr-f-id { color:#6b7280; }
.jr-f-sum { padding:12px 24px; display:grid; grid-template-columns:52px minmax(0,1fr) auto; gap:5px 12px; cursor:pointer; align-items:baseline; }
.jr-f-id { font-family:'JetBrains Mono',ui-monospace,monospace; font-size:12.5px; font-weight:600; }
.jr-chev { color:#9ca3af; font-size:10px; }
.jr-f-title { font-size:14px; font-weight:600; color:#111827; text-wrap:pretty; }
.jr-f-effect { font-family:'JetBrains Mono',ui-monospace,monospace; font-size:12.5px; text-align:right; white-space:nowrap; }
.jr-f-effect.late { color:#92400e; } .jr-f-effect.early { color:#2f4b7c; }
.jr-f-subject { font-size:12.5px; color:#4b5563; grid-column:2 / -1; }
.jr-f-tags { display:flex; gap:6px 10px; flex-wrap:wrap; align-items:center; font-size:12px; grid-column:2; }
.jr-firm { display:inline-flex; gap:5px; align-items:center; padding:2px 8px; border-radius:4px; font-weight:500; }
.jr-firm.contract { background:#1e293b; color:#fff; border:1px solid #1e293b; }
.jr-firm.judgment { background:#fff; color:#1f2937; border:1px solid #9ca3af; }
.jr-firm.benchmark { background:#fff; color:#6b7280; border:1px dashed #9ca3af; }
.jr-f-path { color:#64748b; } .jr-f-path.on { color:#0f172a; font-weight:600; }
.jr-status { font-weight:600; } .jr-status.not_decided { color:#6b7280; } .jr-status.accepted { color:#1e293b; } .jr-status.rejected { color:#6b7280; } .jr-status.deferred { color:#92400e; }
.jr-f-actions { display:flex; gap:6px; justify-content:flex-end; flex-wrap:wrap; }
.jr-f-body { padding:4px 24px 18px 88px; display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr); gap:16px 28px; }
.jr-f-col { display:flex; flex-direction:column; gap:12px; min-width:0; }
.jr-f-evidence { display:grid; grid-template-columns:60px minmax(0,1fr); gap:5px 10px; font-size:12.5px; align-items:baseline; }
.jr-f-k { color:#6b7280; font-size:12px; }
.jr-f-rule { display:flex; flex-direction:column; gap:2px; font-size:13px; }
.jr-f-history { font-size:12.5px; color:#4b5563; }
.jr-f-why { font-size:13.5px; line-height:1.5; color:#111827; }
.jr-f-narr { font-size:12.5px; color:#374151; }
.jr-f-comment { border:1px solid #e5e7eb; border-radius:8px; padding:10px 12px; background:#fafbfc; display:flex; flex-direction:column; gap:6px; }
.jr-f-comment-text { font-size:13px; line-height:1.5; color:#1f2937; white-space:pre-wrap; }
/* Comment list */
.jr-comments { padding:0; gap:0; }
.jr-comments-head { padding:18px 20px 12px; display:flex; flex-direction:column; gap:6px; border-bottom:1px solid #f0f1f3; }
.jr-comment-lines { padding:14px 20px 18px; display:flex; flex-direction:column; gap:14px; user-select:text; }
.jr-comment-line { display:flex; flex-direction:column; gap:3px; }
.jr-comment-id { font-family:'JetBrains Mono',ui-monospace,monospace; font-size:12px; color:#111827; display:flex; gap:10px; flex-wrap:wrap; align-items:baseline; }
.jr-tag { padding:0 6px; border-radius:4px; background:#eef1f5; color:#1e293b; font-family:Inter,system-ui,sans-serif; font-size:11.5px; font-weight:600; }
.jr-tag.must { background:#fdecec; color:#991b1b; }
.jr-comment-text { font-size:13px; line-height:1.5; color:#1f2937; white-space:pre-wrap; }
/* Supporting answers */
.jr-answer-card { padding:0; gap:0; }
.jr-answer-card.dcma { background:#fafafa; border:1px dashed #cbd5e1; }
.jr-answer-card.dcma .jr-eyebrow, .jr-answer-card.dcma .jr-answer-text { color:#6b7280; }
.jr-answer-card.dcma .jr-answer-text { color:#4b5563; }
.jr-answer-card.spec { border:1px solid #64748b; } .jr-answer-card.spec .jr-eyebrow { color:#111827; }
.jr-answer-card.history { background:#fffaf1; border:1px solid #f5c98a; } .jr-answer-card.history .jr-eyebrow { color:#92400e; }
.jr-answer-head { padding:15px 20px; display:grid; grid-template-columns:minmax(0,1fr) auto; gap:4px 16px; cursor:pointer; align-items:baseline; }
.jr-answer-title { display:flex; gap:4px 10px; align-items:baseline; flex-wrap:wrap; }
.jr-flag { font-size:11.5px; font-weight:600; padding:0 6px; border-radius:4px; }
.jr-flag.muted { color:#6b7280; } .jr-flag.ink { color:#1e293b; background:#eef1f5; } .jr-flag.warn { color:#92400e; background:#fef3e2; }
.jr-answer-btn { display:flex; align-items:center; justify-content:center; width:24px; height:24px; color:#64748b; }
.jr-answer-arrow { width:8px; height:8px; border-right:2px solid currentColor; border-bottom:2px solid currentColor; transform:rotate(45deg); transition:transform .2s ease; }
.jr-answer-head[aria-expanded="true"] .jr-answer-arrow { transform:rotate(225deg); }
.jr-answer-head:hover .jr-answer-btn { color:#1e293b; }
.jr-answer-head:focus-visible { outline:2px solid #2563eb; outline-offset:-3px; border-radius:10px; }
@media (prefers-reduced-motion:reduce) { .jr-answer-arrow { transition:none; } }
.jr-answer-text { font-size:15px; font-weight:600; color:#111827; line-height:1.4; text-wrap:pretty; grid-column:1 / -1; }
.jr-answer-text.muted { font-weight:400; font-size:13px; }
.jr-answer-body { padding:14px 20px 20px; display:flex; flex-direction:column; gap:16px; border-top:1px solid #eef0f2; }
.jr-answer-q { font-size:12px; color:#6b7280; display:flex; gap:4px 12px; flex-wrap:wrap; }
.jr-bars { display:flex; flex-direction:column; gap:10px; }
.jr-bar-row { display:grid; grid-template-columns:minmax(0,210px) minmax(0,1fr) 110px; gap:14px; align-items:center; font-size:12.5px; }
.jr-bar-pair { display:flex; flex-direction:column; gap:3px; }
.jr-bar-line { display:flex; align-items:center; gap:8px; }
.jr-bar-track { flex:1; min-width:0; }
.jr-bar-fill { height:8px; border-radius:2px; } .jr-bar-fill.planned { background:#cbd5e1; } .jr-bar-fill.happened { background:#1e293b; }
.jr-bar-line .mono { width:130px; font-size:11.5px; }
.jr-table { display:flex; flex-direction:column; gap:4px; overflow-x:auto; }
.jr-table-cap { font-size:12.5px; font-weight:600; color:#374151; }
.jr-table-head { display:grid; gap:0 12px; border-bottom:1px solid #e5e7eb; padding:6px 0; }
.jr-table-head.strongrule { border-bottom-color:#1e293b; }
.jr-th { font-weight:500; color:#6b7280; font-size:11.5px; }
.jr-table-row { display:grid; gap:0 12px; padding:7px 0; border-bottom:1px solid #f0f1f3; }
.jr-table-row.total { background:#f8fafc; }
.jr-td { font-size:12.5px; line-height:1.4; min-width:0; color:#1f2937; overflow-wrap:anywhere; }
.jr-td.mono { font-size:12px; }
.jr-td.right, .jr-th.right { text-align:right; }
.jr-notes { display:flex; flex-direction:column; gap:7px; max-width:820px; }
.jr-note-line { font-size:13px; line-height:1.5; color:#374151; }
.jr-note-line.muted { color:#4b5563; } .jr-note-line.gap { margin-top:8px; }
.jr-checked { font-size:12.5px; color:#4b5563; line-height:1.5; }
/* Record, side */
.jr-record { font-size:12px; color:#6b7280; display:flex; flex-direction:column; gap:3px; padding-top:12px; border-top:1px solid #e5e7eb; margin-top:8px; overflow-wrap:anywhere; }
.jr-progress { background:#fff; border:1px solid #e5e7eb; border-radius:10px; padding:14px 16px; display:flex; flex-direction:column; gap:10px; }
.jr-progress .jr-eyebrow { font-size:11.5px; }
.jr-progress-text { font-size:13px; line-height:1.5; color:#111827; font-weight:500; }
.jr-meter { height:4px; background:#eef0f2; border-radius:2px; overflow:hidden; } .jr-meter-fill { height:4px; background:#1e293b; }
.jr-toc { position:sticky; top:12px; max-height:calc(100vh - 100px); overflow-y:auto; display:flex; flex-direction:column; gap:1px; padding:4px 0; }
.jr-toc-head { font-size:11.5px; color:#6b7280; padding:0 8px 6px; }
.jr-toc-item { font-size:13px; color:#4b5563; font-weight:400; padding:4px 6px; border-radius:5px; text-decoration:none; line-height:1.35; cursor:pointer; }
.jr-toc-item.is-current { color:#111827; font-weight:600; background:#e5e7eb; }
.jr-toc-item:hover { background:#e5e7eb; text-decoration:none; }
@media (max-width:1100px) { .jr-grid { grid-template-columns:minmax(0,1fr) 180px; padding:18px 20px 32px; gap:20px; } .jr-timeline { margin:6px 40px 0 40px; } }
@media (max-width:760px) { .jr-grid { display:block; padding:14px; } .jr-side { position:static; margin-top:20px; } .jr-toc { position:static; max-height:none; overflow:visible; flex-direction:row; flex-wrap:wrap; } .jr-f-body { grid-template-columns:minmax(0,1fr); padding-left:24px; } .jr-f-sum { grid-template-columns:44px minmax(0,1fr); } .jr-f-effect { text-align:left; } .jr-head { height:auto; padding:10px 14px; flex-wrap:wrap; } .jr-days-row { grid-template-columns:1fr 64px 48px !important; } .jr-days-row .jr-track, .jr-days-row .jr-ticks, .jr-days-row .jr-narr { grid-column:1 / -1; } }
@media print { .json-report { overflow:visible; } .jr-scroll { overflow:visible; } .jr-grid { display:block; padding:0; } .jr-side, .jr-head .jr-btn, .jr-f-actions, .jr-old-actions, .jr-filter, .jr-answer-btn { display:none !important; } .jr-answer-body[hidden], .jr-f-body { display:flex !important; } .jr-card { break-inside:avoid; margin-bottom:12px; } .jr-record { position:running(footer); } }
/* Baseline choice uses a native checkbox, not a full-width text field. */
.t2 .modal .msect label.cbrow { display: flex; align-items: center; }
.t2 .modal .msect .cbrow input[type="checkbox"] {
  width: 16px; height: 16px; flex: 0 0 16px; padding: 0; margin: 0;
  box-shadow: none; appearance: auto;
}

/* Keep Schedule labels readable on one line; overflow stays inside the table. */
.t2 .schedules-list table.grid.data { table-layout: fixed; min-width: 900px; }
.t2 .schedules-list table.grid.data thead th { white-space: normal; vertical-align: middle; }
.t2 .schedules-list table.grid.data thead th[data-sort="quality"] { white-space: nowrap; }
.t2 .schedules-list table.grid.data thead th[data-sort="finish"] { text-align: center; }
.t2 .schedules-list table.grid.data :is(th, td):nth-child(n+4):nth-child(-n+8) { text-align: center; }
.t2 .schedules-list table.grid.data thead th:nth-child(n+4):nth-child(-n+8) { padding-inline: 8px; }
.t2 .schedules-list table.grid.data tbody td { padding-inline: 8px; overflow-wrap: anywhere; }
.t2 .schedules-list .rowact { flex-wrap: wrap; }
.t2 .schedules-list .d-name { display: flex; min-width: 0; align-items: center; }
.t2 .schedules-list .d-name > .link { display: block; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.t2 .schedules-list .d-name > :not(.link) { flex-shrink: 0; }

.t2 .ik-documents-footer { align-items: flex-start; }

/* Wide-screen gutters belong only to the full comparison report body.
   Its header stays full-width; other pages keep their normal spacing. */
.json-report-full > .jr-scroll {
  padding-inline: clamp(0px, calc((100vw - 1280px) * .1), 6%);
  box-sizing: border-box;
}
@media print {
  .json-report-full > .jr-scroll { padding-inline: 0; }
}
/* An unfinished setup is an attention state, not a validation error. */
.topbar.t2 .setup-reminder {
  background: #fff7df;
  border-color: #ead59b;
  color: #805b14;
  box-shadow: none;
  white-space: nowrap;
  gap: 6px;
}
.topbar.t2 .setup-reminder:hover { background: #ffefc3; border-color: #d8b966; }
.topbar.t2 .setup-reminder svg { flex: none; }

/* Shared comparison evidence stays compact beside dedicated page checks. */
.shared-review { border:1px solid var(--line, #d8dee8); border-radius:8px; padding:10px 14px; margin-bottom:12px; background:var(--surface, #fff); }
.shared-review > summary { cursor:pointer; font-size:13px; }
.shared-review-body { padding-top:8px; }
.shared-review-body ul { max-height:280px; overflow:auto; padding-left:20px; }
.shared-review-body li { margin:8px 0; }
.hd-grid > .shared-review { grid-column:1 / -1; }

/* Keep the shared-document queue in the original list/detail workspace. */
.json-review-queue > .jr-scroll { display: flex; overflow: hidden; }
.json-review-queue .taskwrap { flex: 1; min-width: 0; }
.json-review-queue .qrow { width: 100%; text-align: left; font: inherit; color: inherit; background: transparent; border: 0; border-bottom: 1px solid var(--line); border-radius: 0; }
.json-review-queue .qrow.on { background: var(--surface-3); }
.json-review-queue .detail-inner > table { margin-block: 18px; width: 100%; table-layout: fixed; }
.json-review-queue .detail-inner td { overflow-wrap: anywhere; }
.json-review-queue .qrow { grid-template-columns: 42px minmax(0, 1fr); }
.json-review-queue .qrow > .mono { white-space: nowrap; }
.json-review-queue .dispbox select { margin-top: 10px; padding: 6px 10px; border: 1px solid var(--line); border-radius: var(--radius-sm); background: var(--surface); color: var(--ink); font: inherit; }

/* Review queue: restrained color for selection, priority and comment state. */
.json-review-queue .queue { background: #f6f8fc; }
.json-review-queue .queue-head { background: #edf2fa; border-bottom: 1px solid #ccd8e9; }
.json-review-queue .qrow { border-left: 3px solid transparent; }
.json-review-queue .qrow.on { background: #e6effc; border-left-color: #3767ac; }
.json-review-queue .qrow:hover:not(.on) { background: #edf2f8; }
.json-review-queue .detail { background: #fff; }
.json-review-queue .detail-inner thead th { background: #eaf0f8; color: #334b70; }
.json-review-queue .detail-inner tbody td { background: #f8fafd; padding: 12px; border-bottom: 1px solid #dce4ef; }
.json-review-queue .detail-inner tbody td:last-child { background: #eef6ff; }
.rq-status { display: inline-block; margin-top: 6px; padding: 3px 8px; border-radius: 12px; font-size: 11px; font-weight: 600; background: #e9eef6; color: #47566c; }
.rq-accepted, .rq-resolved { background: #e4f4eb; color: #216343; }
.rq-deferred, .rq-open { background: #fff1d6; color: #825a12; }
.rq-rejected { background: #f8e7e8; color: #913c46; }
.rq-activities { margin-top: 26px; border-top: 1px solid #dce4ef; padding-top: 20px; }
.rq-activity { margin-top: 14px; padding: 16px; border: 1px solid #d5e0ee; border-radius: 10px; background: #f7f9fd; }
.rq-activity-head, .rq-note-meta, .rq-note-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.rq-activity-head { justify-content: space-between; margin-bottom: 12px; color: #345780; }
.rq-note { padding: 12px; background: white; border: 1px solid #dee5ee; border-radius: 8px; margin-bottom: 10px; }
.rq-note.is-resolved { border-color: #c8e4d5; background: #f5fbf7; }
.rq-note p { white-space: pre-wrap; overflow-wrap: anywhere; }
.rq-activity > textarea { margin-block: 8px; }
.json-review-queue .qrow strong { display: block; }
.json-review-queue .rq-priority-1 > .mono { color: #9a5221; }
.json-review-queue .rq-priority-2 > .mono { color: #375f97; }
.json-review-queue .rq-priority-3 > .mono { color: #62748b; }

/* Intake puts its checks first and keeps the next upload visibly distinct. */
.t2.ik-workspace > .pageblock { padding: 12px 24px 8px; }
.t2.ik-workspace > .pageblock .pagehead > div { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 16px; }
.t2.ik-workspace > .pageblock .subline { margin: 0; }
.t2.ik-workspace > .pane { padding-top: 0; }
.t2 .ik-review-limits { margin: 0 0 8px; font-size: 12px; color: var(--ink-3); }
.t2 .ik-review-limits summary { cursor: pointer; width: fit-content; }
.t2 .ik-review-limits p { margin: 4px 0 8px; }
.t2 .ik-upload-next { display: flex; align-items: center; gap: 14px; width: 100%; box-sizing: border-box; padding: 18px; border: 1px dashed var(--control-line); border-radius: var(--radius-lg); background: var(--surface); color: var(--ink); cursor: pointer; text-align: left; font: inherit; }
.t2 .ik-upload-next:hover { border-color: var(--accent); background: var(--surface-3); }
.t2 .ik-upload-next:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.t2 .ik-upload-next > svg { width: 28px; height: 28px; flex: none; color: var(--ink-3); }
.t2 .ik-upload-next-label { display: flex; flex-direction: column; gap: 4px; }
.t2 .ik-upload-next-label > span { font-size: 12px; color: var(--ink-3); }

.jr-export { position:relative; }
.jr-export summary { list-style:none; }
.jr-export summary::-webkit-details-marker { display:none; }
.jr-export-menu { position:absolute; right:0; top:calc(100% + 8px); z-index:40; width:244px; padding:5px; display:grid; gap:2px; background:#fff; border:1px solid #e5e7eb; border-radius:10px; box-shadow:0 8px 28px #1720331a,0 2px 6px #17203308; }
.json-report .jr-export-option { width:100%; height:auto; min-height:0; border:0; border-radius:6px; box-shadow:none; background:transparent; display:flex; align-items:center; gap:11px; padding:10px; text-align:left; cursor:pointer; color:#1f2937; }
.json-report .jr-export-option:hover,.json-report .jr-export-option:focus-visible { background:#f3f4f6; outline:none; }
.jr-export-icon { display:flex; align-items:center; justify-content:center; width:30px; height:34px; flex-shrink:0; border:1px solid #e5e7eb; border-radius:5px; font-size:9px; font-weight:600; color:#64748b; background:#fafbfc; }
.jr-export-copy { display:flex; flex-direction:column; gap:3px; }
.jr-export-copy strong { font-size:13px; font-weight:600; line-height:1.25; }
.jr-export-copy > span { font-size:11px; color:#6b7280; line-height:1.3; }

.jr-empty-wrap { padding:28px 24px; }
.jr-report-unavailable { max-width:760px; padding:28px; gap:14px; }
.jr-empty-title { margin:0; font-size:22px; line-height:1.3; letter-spacing:-.02em; }
.jr-empty-reason { margin:0; font-size:14px; line-height:1.65; color:#4b5563; max-width:650px; }
.jr-empty-file { font-size:12px; color:#6b7280; overflow-wrap:anywhere; }
.jr-empty-actions { display:flex; flex-wrap:wrap; gap:8px; margin-top:8px; }
.jr-empty-actions a { text-decoration:none; display:inline-flex; align-items:center; }
.jr-unavailable-card { padding:20px 24px; gap:10px; }
@media(max-width:760px) { .jr-empty-wrap { padding:16px; } .jr-report-unavailable { padding:20px; } }

/* Report disclosures animate their natural height without rebuilding the page. */
.jr-fold { display:grid; grid-template-rows:0fr; visibility:hidden; transition:grid-template-rows 220ms ease, visibility 220ms; }
.jr-fold.is-open { grid-template-rows:1fr; visibility:visible; }
.jr-fold-inner { min-height:0; overflow:hidden; }
@media (prefers-reduced-motion:reduce) { .jr-fold { transition:none; } }
@media print { .jr-fold { display:block; visibility:visible; } .jr-fold-inner { overflow:visible; } }

/* Report limits: grouped coverage, next inputs, and manual review. */
#jr-limits .jr-notes { max-width:none; }
.jr-limits { display:grid; grid-template-columns:1fr; gap:20px; }
.jr-limits-group { min-width:0; border:1px solid #e2e6ec; border-radius:10px; padding:18px; background:#fafbfc; }
.jr-limits-group.blocked { background:#fffcf5; border-color:#eadbb8; }
.jr-limits-group.manual { grid-column:1 / -1; }
.jr-limits-heading { display:flex; align-items:center; gap:10px; justify-content:space-between; }
.jr-limits-heading h3 { margin:0; font-size:15px; color:#172033; }
.jr-limits-count { border-radius:20px; padding:2px 9px; background:#e9edf2; color:#374151; font-size:12px; }
.jr-limits-intro { margin:7px 0 16px; font-size:12px; color:#647084; line-height:1.5; }
.jr-limits-list { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); column-gap:24px; }
.jr-limits-item { padding:12px 0; border-top:1px solid #e4e7ec; overflow-wrap:anywhere; }
.jr-limits-item h4 { margin:0 0 5px; font-size:13px; font-weight:600; color:#273247; }
.jr-limits-item p, .jr-limits-empty { margin:0; font-size:12.5px; line-height:1.6; color:#526075; }
.jr-limits-item .jr-link { display:inline-block; margin-top:8px; font-size:12px; }
.jr-limits-group.manual .jr-limits-list { grid-template-columns:repeat(2,minmax(0,1fr)); column-gap:24px; }
@media(max-width:800px) { .jr-limits, .jr-limits-list, .jr-limits-group.manual .jr-limits-list { grid-template-columns:1fr; } }
@media print { .jr-limits { display:block; } .jr-limits-group { margin-bottom:12px; } .jr-limits-item { break-inside:avoid; } .jr-limits-item .jr-link { display:none; } }

.jr-record { overflow-wrap:anywhere; }

/* Compact sign-in and signup fields keep their labels inside the control. */
.t2 .unlock-card #auth-form .field { margin-bottom:12px; }
.t2 .unlock-card .auth-input { position:relative; }
.t2 .unlock-card .auth-input input { height:52px; padding:21px 14px 7px; box-sizing:border-box; }
.t2 .unlock-card .auth-input label { position:absolute; left:14px; top:16px; margin:0; line-height:20px; font-size:14px; color:var(--ink-3); pointer-events:none; transform-origin:left top; transition:transform 150ms ease, color 150ms ease; }
.t2 .unlock-card .auth-input input:focus + label,
.t2 .unlock-card .auth-input input:not(:placeholder-shown) + label { transform:translateY(-10px) scale(.8); }
.t2 .unlock-card .auth-input input:focus + label { color:var(--accent); }
@media(prefers-reduced-motion:reduce) { .t2 .unlock-card .auth-input label { transition:none; } }

.t2 .unlock-card .auth-input input[aria-invalid="true"] { border-color:#b42318; box-shadow:0 0 0 1px #b42318; }
.t2 .unlock-card .field .auth-field-error { color:#b42318; }

.t2 .unlock-card #auth-btn:disabled { color:#fff; background:#687789; opacity:1; cursor:not-allowed; }

.t2 .unlock-card .auth-input input:required + label::after { content:" *"; color:#b42318; }
.t2 .unlock-card .has-password-toggle input { padding-right:48px; }
.t2 .unlock-card .auth-password-toggle { position:absolute; right:6px; top:6px; width:40px; height:40px; padding:8px; display:grid; place-items:center; border:0; background:transparent; box-shadow:none; color:var(--ink-3); cursor:pointer; }
.t2 .unlock-card .auth-password-toggle:focus-visible { outline:2px solid var(--accent); outline-offset:-3px; }

/* Accepted invite codes stay compact beneath the password. */
.auth-invite-summary { display:flex; align-items:center; justify-content:space-between; gap:12px; margin:2px 0 16px; font-size:12px; line-height:20px; }
.auth-invite-summary[hidden] { display:none; }
.auth-invite-accepted { color:var(--ok); }

/* Initial setup is a focused task, without changing project pages behind it. */
.setup-onboarding .cmp-scrim { background: #eef1f5; backdrop-filter: none; }
/* Explain a mismatched delay comparison next to the selected files. */
.t2 .why-pair-warning { display: grid; gap: 8px; padding: 12px; border-radius: var(--radius-md); background: var(--warn-tint); color: var(--warn); font-size: 12px; line-height: 1.5; }
.t2 .why-pair-warning .btn { justify-self: start; max-width: 100%; white-space: normal; text-align: left; }

/* Keep the current delay layout steady until the next activity is ready. */
.t2.why-screen { position: relative; }
.t2.why-screen .why-update-status { position: absolute; z-index: 4; top: 22px; right: 28px; max-width: calc(100% - 56px); box-sizing: border-box; padding: 9px 13px; border: 1px solid var(--accent-tint-line); border-radius: var(--radius-md); background: var(--accent-tint); color: var(--accent-ink); box-shadow: var(--shadow-1); font-size: var(--type-caption-size); overflow-wrap: anywhere; pointer-events: none; }

/* Compact account form, with invitation editing kept inline. */
.unlock-col .unlock-card { max-width: 350px; }
.t2 .unlock-card #auth-form .field { margin-bottom: 10px; }
.t2 .unlock-card .auth-input input { height: 48px; padding-top: 19px; padding-bottom: 5px; }
.t2 .unlock-card .auth-input label { top: 14px; }
.t2 .unlock-card .auth-password-toggle { top: 4px; }
.auth-text-action { border:0; padding:4px 0; background:none; box-shadow:none; font:inherit; font-size:12px; color:var(--ink-3); text-decoration:underline; text-underline-offset:3px; cursor:pointer; }
.auth-text-action:focus-visible { outline:2px solid var(--focus); outline-offset:3px; }
.auth-invite-editor { margin:0 0 14px; padding:12px; border:1px solid var(--line); border-radius:8px; background:var(--surface); }
.auth-invite-actions { display:flex; align-items:center; gap:14px; margin-top:10px; }
.auth-invite-editor .hint { margin:6px 0; font-size:12px; line-height:1.4; color:var(--ink-4); }

/* Account entry: compact reference layout with a stable masthead and footer. */
.unlock-col.t2 { padding:28px 40px; align-items:start; background:#f6f7f9; }
.unlock-col .unlock-card { max-width:358px; min-height:calc(100vh - 56px); display:flex; flex-direction:column; }
.unlock-card .unlock-brand { display:flex; align-items:center; gap:10px; border:0; margin:0 0 36px; padding:0; }
.unlock-card .unlock-brand .sb-mark { width:28px; height:28px; margin:0; border-radius:5px; font-size:10px; }
.t2 .unlock-card .unlock-brand h1 { font-size:14px; font-weight:600; letter-spacing:0; line-height:20px; }
.t2 .unlock-card .auth-seg { display:flex; gap:0; padding:3px; margin:0 0 22px; background:#e8eaef; border:0; border-radius:8px; box-shadow:none; }
.t2 .unlock-card .auth-seg button { flex:1; height:30px; padding:0 8px; border:0; border-radius:5px; font-size:13px; background:transparent; color:#667085; box-shadow:none; transition:background 200ms ease,color 200ms ease,box-shadow 200ms ease; }
.t2 .unlock-card .auth-seg button.on { background:#fff; color:#182230; box-shadow:0 1px 3px #18223014; }
#auth-content { overflow:clip; padding:2px; margin:-2px; }
.auth-intro { margin-bottom:18px; }
.auth-intro h2 { margin:0 0 3px; font-size:18px; line-height:24px; font-weight:600; }
.unlock .auth-intro .sub { font-size:13px; line-height:19px; margin:0; color:#697586; }
.t2 .unlock-card #auth-form .field { margin-bottom:12px; min-width:0; }
.auth-name-row { display:grid; grid-template-columns:1fr 1fr; gap:12px; }
.auth-name-row[hidden] { display:none; }
.t2 .unlock-card .auth-input { display:flex; flex-direction:column; gap:5px; }
.t2 .unlock-card .auth-input label,
.t2 .unlock-card .auth-input input:focus + label,
.t2 .unlock-card .auth-input input:not(:placeholder-shown) + label { position:static; order:0; transform:none; font-size:12px; font-weight:400; line-height:16px; color:#344054; margin:0; pointer-events:auto; }
.t2 .unlock-card .auth-input input { order:1; width:100%; min-width:0; height:36px; padding:7px 10px; border:1px solid #cfd5df; border-radius:5px; background:#fff; font-size:13px; box-shadow:none; }
.t2 .unlock-card .has-password-toggle input { padding-right:36px; }
.t2 .unlock-card .auth-password-toggle { top:auto; bottom:0; right:1px; width:34px; height:36px; padding:9px; color:#697586; }
.t2 .unlock-card .auth-input input:focus { border-color:#69809b; box-shadow:0 0 0 2px #69809b20; }
.t2 .unlock-card .auth-input input[readonly] { background:#f3f5f7; color:#475467; }
.t2 .unlock-card .auth-input input:required + label::after { content:""; }
#forgot-link { position:absolute; top:0; right:0; font-size:12px; line-height:16px; }
#forgot-link a { color:#243247; text-decoration:none; }
#forgot-link a:hover { text-decoration:underline; }
.t2 .unlock-card #auth-btn { height:36px; min-height:36px; margin-top:4px; border:0; border-radius:5px; background:#1e293b; box-shadow:none; font-size:13px; }
.t2 .unlock-card #auth-btn:disabled { background:#697586; }
.auth-password-progress { margin-top:8px; }
.auth-requirements { display:flex; flex-wrap:wrap; gap:4px 10px; color:#7a8494; font-size:10px; line-height:15px; }
.auth-requirements span::before { content:""; display:inline-block; width:5px; height:5px; border-radius:50%; background:#d0d5dd; margin-right:4px; vertical-align:middle; }
.auth-requirements span.met { color:#168047; }
.auth-requirements span.met::before { background:#168047; }
.auth-invite-summary { padding:7px 11px; margin:0 0 12px; min-height:34px; box-sizing:border-box; border:1px solid #c7e9d2; background:#edf8f0; border-radius:5px; font-size:12px; }
.auth-invite-summary .auth-text-action { color:#168047; }
#f-invite .hint { display:none; }
.auth-footer { margin-top:auto; padding-top:32px; color:#697586; font-size:12px; line-height:16px; }
.auth-footer p { margin:3px 0 0; }
.auth-footer .auth-text-action { font-size:12px; color:#1e293b; text-decoration:none; padding:0; }
@media(max-width:480px) { .unlock-col.t2 { padding:24px; } .unlock-col .unlock-card { min-height:calc(100dvh - 48px); } }
@media(prefers-reduced-motion:reduce) { .t2 .unlock-card .auth-seg button { transition:none; } }

/* Keep the account panel compact on wide screens; its footer follows the form. */
@media (min-width:1024px) and (hover:hover) and (min-height:580px) {
  .unlock { grid-template-columns:minmax(0,1fr) 438px; }
}
.unlock-col.t2 { align-items:start; }
.unlock-col .unlock-card { min-height:0; }
.auth-footer { margin-top:28px; padding-top:0; }

/* Anchor the masthead to a centered signup-sized area, independent of form height. */
@media (min-width:1440px) and (min-height:760px) {
  .unlock-col.t2 { padding-top:max(28px, calc((100dvh - 604px) / 2)); }
}

/* Backend-selected comparison headline states. */
.jr-top-stack { display:flex; flex-direction:column; gap:16px; }
.jr-top-block { padding:24px; gap:12px; }
.jr-top-caution { background:#fffbeb; border-color:#e8cc8b; }
.jr-caution-mark { color:#854d0e; font-size:12px; font-weight:600; }
.jr-top-also { font-size:14px; color:#475569; line-height:1.6; }
@media(max-width:760px) { .jr-top-block { padding:18px; } }

/* Bounded activity evidence previews in comparison reports. */
.jr-evidence-list { margin: 12px 0; min-width: 0; font-weight: 400; }
.jr-evidence-count { display: block; margin-bottom: 8px; color: #657083; font-size: 12px; }
.jr-evidence-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.jr-evidence-chip { padding: 4px 8px; border: 1px solid #dce2e9; border-radius: 6px; background: #f7f9fb; color: #334155; font: 12px/1.5 ui-monospace, monospace; overflow-wrap: anywhere; max-width: 100%; }
.jr-evidence-actions { display: flex; gap: 12px; margin-top: 8px; }
.jr-evidence-more { border: 0; background: transparent; color: #365c89; padding: 4px 0; font-size: 12px; cursor: pointer; }
.jr-evidence-more:hover { text-decoration: underline; }
.jr-evidence-more:focus-visible { outline: 2px solid #365c89; outline-offset: 3px; }
.jr-evidence-more[hidden] { display: none; }

/* Finding evidence: file labels and values occupy separate, wrapping rows. */
.jr-f-comparison { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:10px; }
.jr-f-value-card { display:flex; flex-direction:column; gap:6px; padding:14px; border:1px solid #e2e7ee; border-radius:8px; background:#f8fafc; min-width:0; }
.jr-f-value-card:last-child { background:#f0f5fa; border-color:#cedbe9; }
.jr-f-file { font-size:12px; color:#475569; overflow-wrap:anywhere; }
.jr-f-value { font:600 15px/1.5 ui-monospace,monospace; font-variant-numeric:tabular-nums; color:#172338; overflow-wrap:anywhere; }
.jr-f-impact { display:flex; flex-direction:column; gap:4px; font-size:13px; overflow-wrap:anywhere; }
.jr-f-source { font-size:12px; color:#64748b; }
.jr-f-source summary { cursor:pointer; width:fit-content; }
.jr-f-source-text { margin-top:8px; padding:10px; background:#f8fafc; border-radius:6px; font:12px/1.6 ui-monospace,monospace; overflow-wrap:anywhere; }
.jr-f-review { border-left:1px solid #e5eaf0; padding-left:22px; gap:8px; }
.jr-f-body { padding-top:12px; padding-bottom:22px; }
.jr-f-effect { white-space:normal; max-width:280px; overflow-wrap:anywhere; }
@media(max-width:760px) {
  .jr-f-review { border-left:0; border-top:1px solid #e5eaf0; padding:14px 0 0; }
  .jr-f-effect { grid-column:2; max-width:none; }
  .jr-f-comparison { grid-template-columns:minmax(0,1fr); }
}

.jr-findings-pagination { display:flex; align-items:center; justify-content:space-between; flex-wrap:wrap; gap:12px; padding:16px 24px; border-top:1px solid #e5e7eb; }
.jr-findings-pagination [hidden] { display:none; }
@media print { .jr-findings-pagination { display:none; } }

/* Schedule context belongs to the page, never the application header. */
.page-schedule-selector { display:flex; align-items:center; gap:12px; padding:12px 24px; flex:0 0 auto; border-bottom:1px solid var(--line); background:var(--surface); }
.page-schedule-selector > span { font-size:13px; color:var(--muted); }
.page-schedule-selector button { max-width:100%; white-space:normal; text-align:left; }
@media (max-width:540px) { .page-schedule-selector { padding:10px 16px; flex-wrap:wrap; gap:6px; } }

/* ======================= Project setup wizard (v2) =======================
   Design: Project Setup Wizard v2. One bounded dialog: a 56px header (project,
   progress, close), a 44px stepper, a body that is the only scrolling region,
   and a 56px footer. Type: 18 step title, 15 panel head, 13 body and inputs,
   12 labels and help, 11 tags. Inputs and buttons are 32px tall. Colours are
   the app's own tokens. */
.cmp-host.kind-setup .cmp-modal {
  inset: 24px; margin: auto; max-width: 1040px; max-height: 680px;
  background: var(--surface); border-radius: var(--radius-xl);
}
.cmp-host.kind-setup .cmp-head { display: none; }
.cmp-host.kind-setup .cmp-body { overflow: hidden; }
.cmp-host.kind-setup .cmp-body > .scr,
.cmp-host.kind-setup .cmp-body .pane { flex: 1; height: 100%; min-height: 0; padding: 0; overflow: hidden; display: flex; flex-direction: column; }
@media (max-width: 720px) { .cmp-host.kind-setup .cmp-modal { inset: 0; max-height: none; border-radius: 0; } }

.sw { flex: 1; min-height: 0; display: flex; flex-direction: column; background: var(--surface); color: var(--ink);
  font: var(--type-body); font-size: var(--type-body-size); line-height: 1.45; }
.sw .mono, .sw-scrim .mono { font-family: var(--mono); font-size: var(--type-caption-size); }
.sw .muted, .sw-scrim .muted { color: var(--ink-4); padding: 0; font-size: inherit; line-height: inherit; }
.sw .ink, .sw-scrim .ink { color: var(--ink); }
.sw .bad, .sw-scrim .bad { color: var(--danger); }
.sw .right { text-align: right; }
.sw .strong { font-weight: var(--weight-medium); color: var(--ink); }
.sw-sp { flex: 1 1 auto; min-width: 0; }
.sw-ic { display: inline-flex; width: 14px; height: 14px; flex: none; }
.sw-ic svg { width: 100%; height: 100%; }

/* ---- header ---- */
.sw-head { flex: none; height: 56px; display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 0 16px 0 24px; }
.sw-hl { display: flex; align-items: center; gap: 10px; min-width: 0; }
.sw-kicker { color: var(--brand-accent); }
.sw-slash { color: var(--line); font-size: var(--type-body-size); }
.sw-proj { font-size: var(--type-heading-size); font-weight: var(--weight-strong); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sw-hr { display: flex; align-items: center; gap: 16px; flex: none; }
.sw-prog { display: flex; align-items: center; gap: 8px; }
.sw-tally { font-size: var(--type-caption-size); color: var(--ink-4); white-space: nowrap; }
.sw-bar { display: inline-block; width: 80px; height: 4px; border: 0; border-radius: 2px; background: var(--line-2); overflow: hidden; flex: none;
  appearance: none; -webkit-appearance: none; color: var(--accent); vertical-align: middle; }
.sw-bar::-webkit-progress-bar { background: var(--line-2); border-radius: 2px; }
.sw-bar::-webkit-progress-value { background: var(--accent); border-radius: 2px; transition: width .2s ease; }
.sw-bar::-moz-progress-bar { background: var(--accent); border-radius: 2px; }
.sw-bar.ok::-webkit-progress-value { background: var(--ok-dot); transition: width .3s ease; }
.sw-bar.ok::-moz-progress-bar { background: var(--ok-dot); }
.sw-bar.wide { width: 120px; }
.sw-status .sw-bar { flex: 1; width: auto; }

/* ---- stepper ---- */
.sw-steps { flex: none; display: flex; gap: 4px; padding: 0 24px; border-bottom: 1px solid var(--line-2); }
.sw-step-tab { flex: 1; min-width: 0; height: 44px; display: flex; align-items: center; gap: 8px; padding: 0 4px; margin-bottom: -1px;
  border: 0; border-bottom: 2px solid transparent; background: transparent; cursor: pointer; text-align: left; font: inherit; color: var(--ink-3); }
.sw-step-tab:hover { background: var(--surface-4); }
.sw-step-tab:focus { outline: none; }
.sw-step-tab:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; border-radius: var(--radius-xs); }
.sw-step-tab.on { border-bottom-color: var(--accent); color: var(--ink); }
.sw-glyph { width: 18px; height: 18px; flex: none; border-radius: 50%; display: grid; place-items: center; box-sizing: border-box;
  border: 1px solid var(--input-line); background: var(--surface); font-size: var(--sw-size-tag); font-weight: var(--weight-strong); color: var(--ink-3); }
.sw-glyph .n { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; margin: 0; padding: 0; line-height: 1; letter-spacing: 0; font-variant-numeric: tabular-nums; text-align: center; }
.sw-glyph .sw-ic { width: 10px; height: 10px; }
.sw-step-tab.done .sw-glyph { background: var(--ok-dot); border-color: transparent; color: var(--on-accent); }
.sw-step-tab.on .sw-glyph { background: var(--accent); border-color: transparent; color: var(--on-accent); }
.sw-stitle { font-size: var(--type-body-size); font-weight: var(--weight-medium); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sw-step-tab.on .sw-stitle { font-weight: var(--weight-strong); }
.sw-shint { display: inline-flex; align-items: center; gap: 5px; font-size: var(--sw-size-tag); color: var(--warn); white-space: nowrap; }

/* ---- body ---- */
.sw-body { flex: 1; min-height: 0; overflow: auto; padding: 20px 24px 24px; }
.sw-lead { display: flex; flex-direction: column; gap: 2px; margin-bottom: 14px; }
.sw-title { margin: 0; font-size: var(--sw-size-step); font-weight: var(--weight-strong); line-height: 1.3; letter-spacing: -.005em; }
.sw-desc { margin: 0; font-size: var(--type-body-size); color: var(--ink-4); line-height: 1.45; }
.sw-desc b { font-weight: var(--weight-strong); color: var(--ink); }
.sw-refuse { margin-bottom: 12px; padding: 8px 12px; border-radius: var(--radius-sm); background: var(--warn-tint); color: var(--warn); font-size: var(--type-caption-size); }

/* ---- footer ---- */
.sw-foot { flex: none; height: 56px; display: flex; align-items: center; gap: 8px; padding: 0 24px; border-top: 1px solid var(--line-2); background: var(--surface); }
.sw-footnote { display: inline-flex; align-items: center; gap: 6px; font-size: var(--type-caption-size); color: var(--warn); margin-right: 8px; }

/* ---- controls ---- */
.sw-btn { height: 32px; padding: 0 12px; display: inline-flex; align-items: center; justify-content: center; gap: 6px; white-space: nowrap; flex: none;
  border: 1px solid var(--input-line); border-radius: var(--radius-sm); background: var(--surface); color: var(--ink);
  font: inherit; font-size: var(--type-body-size); font-weight: var(--weight-medium); cursor: pointer; transition: background var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease); }
.sw-btn:hover { background: var(--surface-4); }
.sw-btn:focus { outline: none; }
.sw-btn:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.sw-btn:disabled { cursor: not-allowed; opacity: .55; }
.sw-btn.sw-primary { border-color: transparent; background: var(--accent); color: var(--on-accent); padding: 0 16px; }
.sw-btn.sw-primary:hover { background: var(--accent-hover); }
.sw-btn.sw-primary:disabled { background: var(--ink-5); opacity: 1; }
.sw-btn.sw-ghost { border-color: transparent; background: transparent; color: var(--ink-3); }
.sw-btn.sw-ghost:hover { background: var(--surface-2); }
.sw-btn.sw-ghost.danger { color: var(--danger); }
.sw-btn.sw-ghost.danger:hover { background: var(--danger-tint-2); }
.sw-btn.sw-sm { height: 26px; padding: 0 10px; font-size: var(--type-caption-size); }
.sw-btn.sw-sm.danger { color: var(--danger); border-color: var(--danger-line); }
.sw-btn.sw-link { height: auto; padding: 0; border: 0; background: none; font-size: var(--type-caption-size); color: var(--link); }
.sw-btn.sw-link:hover { text-decoration: underline; background: none; }
.sw-btn.sw-link.muted { color: var(--ink-4); font-weight: var(--weight-regular); }
.sw-btn.sw-link.light { color: var(--on-accent); font-weight: var(--weight-strong); }
.sw-ibtn { width: 26px; height: 26px; padding: 0; border: 0; background: transparent; color: var(--ink-5); }
.sw-ibtn:hover { background: var(--surface-2); color: var(--ink); }
.sw-ibtn.sw-rm:hover { background: var(--danger-tint); color: var(--danger); }
.sw-ibtn .sw-ic { width: 13px; height: 13px; }
.sw-x, .sw-dx { width: 32px; height: 32px; color: var(--ink-3); }
.sw-x .sw-ic, .sw-dx .sw-ic { width: 16px; height: 16px; }
.sw-warnbtn { height: 26px; padding: 0 10px; font-size: var(--type-caption-size); border-color: var(--warn-dot); color: var(--warn); }
.sw-warnbtn:hover { background: var(--warn-tint); }

.sw-field { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.sw-label { font-size: var(--type-caption-size); font-weight: var(--weight-medium); color: var(--ink-2); }
.sw-opt { color: var(--ink-5); font-weight: var(--weight-regular); }
.sw-hint { font-size: var(--type-caption-size); color: var(--ink-4); line-height: 1.45; }
.sw-hint.warn { color: var(--warn); font-size: var(--sw-size-tag); }
.sw-hint.faint { color: var(--ink-5); line-height: 32px; }
.sw-err { font-size: var(--type-caption-size); color: var(--danger); }
.sw-input, .sw-select { height: 32px; box-sizing: border-box; width: 100%; min-width: 0; padding: 0 10px; font: inherit; font-size: var(--type-body-size); color: var(--ink);
  border: 1px solid var(--input-line); border-radius: var(--radius-sm); background: var(--surface); outline: none; }
.sw-select { padding: 0 8px; }
.sw-input.mono { font-family: var(--mono); font-size: var(--type-caption-size); }
.sw-input:focus, .sw-select:focus { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-wash); }
.sw-input.bad { border-color: var(--danger-dot); }
.sw-input[readonly] { background: var(--surface-3); color: var(--ink-3); }
.sw-input.sw-filter { width: 160px; flex-shrink: 1; }
.sw-tag { display: inline-flex; align-items: center; flex: none; font-size: var(--sw-size-tag); padding: 1px 7px; border-radius: var(--radius-lg); border: 1px solid var(--line-2); color: var(--ink-4); white-space: nowrap; font-weight: var(--weight-regular); }
.sw-tag.ok { border-color: var(--ok-line); color: var(--ok); }
.sw-tag.ink { border-color: transparent; background: var(--accent-tint); color: var(--accent-ink); font-weight: var(--weight-medium); }
.sw-ok { width: 14px; height: 14px; flex: none; border-radius: 50%; background: var(--ok-dot); color: var(--on-accent); display: inline-grid; place-items: center; }
.sw-ok .sw-ic { width: 8px; height: 8px; }
.sw-dot { width: 6px; height: 6px; flex: none; border-radius: 50%; background: var(--ink-5); display: inline-block; }
.sw-dot.ok { background: var(--ok-dot); } .sw-dot.warn { background: var(--warn-dot); } .sw-dot.bad { background: var(--danger-dot); }
.sw-dot.none { background: var(--line); }
.sw-spin { width: 12px; height: 12px; flex: none; box-sizing: border-box; border-radius: 50%; border: 2px solid var(--line); border-top-color: var(--accent); display: inline-block; animation: sw-spin .8s linear infinite; }
@keyframes sw-spin { to { transform: rotate(360deg); } }
.sw-words { font-size: var(--type-body-size); white-space: nowrap; }
.sw-words b { font-weight: var(--weight-strong); }
.sw-empty { padding: 20px 12px; font-size: var(--type-body-size); color: var(--ink-4); text-align: center; }
.sw-two { display: grid; gap: 24px; align-items: start; }
.sw-two-side { grid-template-columns: minmax(0, 1fr) 280px; }
.sw-two-even { grid-template-columns: minmax(0, .85fr) minmax(0, 1.15fr); gap: 20px; }
.sw-panel, .sw-side { display: flex; flex-direction: column; gap: 12px; padding: 16px; border: 1px solid var(--line-2); border-radius: var(--radius-md); min-width: 0; }
.sw-side { background: var(--surface-4); }
.sw-phead { font-size: var(--type-heading-size); font-weight: var(--weight-strong); }
.sw-phrow { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.sw-phr { display: flex; align-items: center; gap: 8px; }
.sw-badge { display: inline-flex; align-items: center; gap: 5px; font-size: var(--sw-size-tag); }
.sw-badge.ok { color: var(--ok); } .sw-badge.warn { color: var(--warn); }

/* ---- step 1 ---- */
.sw-identity { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); gap: 16px; max-width: 720px; }

/* ---- step 2 ---- */
.sw-main { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
.sw-tools { display: flex; align-items: center; gap: 12px; min-height: 32px; }
.sw-standing { display: flex; align-items: center; gap: 10px; flex: none; }
.sw-banner { display: flex; align-items: center; gap: 8px; min-height: 36px; padding: 0 6px 0 12px; border-radius: var(--radius-sm); border: 1px solid var(--line-2); font-size: var(--type-body-size); }
.sw-banner.ok { background: var(--ok-tint); border-color: var(--ok-line); }
.sw-badded { display: inline-flex; align-items: center; gap: 6px; color: var(--ok); margin-right: 4px; white-space: nowrap; }
.sw-bskip { font-size: var(--type-caption-size); color: var(--ink-4); }
.sw-chip { height: 24px; display: inline-flex; align-items: center; gap: 6px; padding: 0 10px; border-radius: var(--radius-xl); border: 1px solid var(--line); background: var(--surface);
  font: inherit; font-size: var(--type-caption-size); font-weight: var(--weight-medium); white-space: nowrap; cursor: pointer; }
.sw-chip.warn { border-color: var(--warn-line); background: var(--warn-tint); color: var(--warn); }
.sw-chip.bad { border-color: var(--danger-line-2); background: var(--danger-tint); color: var(--danger); }
.sw-bx { width: 24px; height: 24px; }
.sw-table { border: 1px solid var(--line-2); border-radius: var(--radius-md); overflow: hidden; }
.sw-thead, .sw-cells { display: grid; grid-template-columns: 84px minmax(0, 1fr) minmax(0, 1.25fr) 60px 112px 28px; gap: 10px; align-items: center; padding: 0 12px; }
.sw-thead { height: 32px; background: var(--surface-4); border-bottom: 1px solid var(--line-2); font-size: var(--type-caption-size); font-weight: var(--weight-medium); color: var(--ink-4); }
.sw-tbody { max-height: 340px; overflow: auto; position: relative; }
.sw-row { border-bottom: 1px solid var(--line-3); transition: background .4s, box-shadow .4s; }
.sw-row:last-child { border-bottom: 0; }
.sw-cells { min-height: 40px; }
.sw-row.group { background: var(--warn-tint); }
.sw-row.foreign, .sw-row.job.err { background: var(--danger-tint-2); }
.sw-row.sup { opacity: .75; }
.sw-row.flash { box-shadow: inset 0 0 0 2px var(--warn-dot); }
.sw-row.foreign.flash { box-shadow: inset 0 0 0 2px var(--danger-dot); }
.sw-c { min-width: 0; }
.sw-c.name { display: flex; align-items: center; gap: 6px; font-weight: var(--weight-medium); }
.sw-c.name.warn { color: var(--warn); } .sw-c.name.muted { color: var(--ink-4); }
.sw-nm { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }
.sw-c.file { color: var(--ink-4); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sw-c.act { display: flex; justify-content: flex-end; }
.sw-delta { font-size: var(--sw-size-tag); padding: 2px 6px; border-radius: var(--radius-xs); background: var(--surface-3); border: 1px solid var(--line-2); color: var(--ink-2); }
.sw-status { display: flex; align-items: center; gap: 6px; font-size: var(--type-caption-size); min-width: 0; white-space: nowrap; }
.sw-status.ok { color: var(--ok); } .sw-status.bad { color: var(--danger); } .sw-status.muted { color: var(--ink-4); }
.sw-pct { width: 30px; text-align: right; font-size: var(--sw-size-tag); color: var(--ink-3); }
.sw-ring { width: 12px; height: 12px; border-radius: 50%; border: 2px dotted var(--line); box-sizing: border-box; flex: none; }
.sw-bang { width: 14px; height: 14px; flex: none; border-radius: 50%; background: var(--danger-dot); color: var(--on-accent); font-size: var(--sw-size-micro); font-weight: var(--weight-strong); display: inline-grid; place-items: center; }
.sw-subrow { display: flex; align-items: center; gap: 8px; padding: 0 12px 10px 106px; margin-top: -4px; font-size: var(--type-caption-size); }
.sw-subrow.bad { color: var(--danger); }
.sw-subrow b { font-weight: var(--weight-medium); }
.sw-footline { display: flex; align-items: center; gap: 12px; font-size: var(--type-caption-size); color: var(--ink-4); }
.sw-suggest { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; padding: 10px; border-radius: var(--radius-sm); border: 1px solid var(--line-2); background: var(--surface); }
.sw-suggest .sw-words { white-space: normal; font-size: var(--type-caption-size); line-height: 1.45; }

/* ---- step 3 ---- */
.sw-step3 { display: flex; flex-direction: column; gap: 20px; max-width: 840px; }
.sw-stds { display: flex; flex-direction: column; gap: 8px; }
.sw-rowhead { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.sw-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr)); gap: 10px; }
.sw-std { --t: var(--surface-2); --k: var(--ink-3); --b: var(--accent);
  display: flex; align-items: center; min-width: 0; gap: 10px; padding: 12px; border-radius: var(--radius-md); border: 1.5px solid var(--line-2);
  background: var(--surface); cursor: pointer; transition: border-color .15s, box-shadow .15s, background .15s; }
.sw-std[data-look="usace"] { --t: var(--std-usace-tint); --k: var(--std-usace-ink); --b: var(--std-usace-line); }
.sw-std[data-look="navfac"] { --t: var(--std-navfac-tint); --k: var(--std-navfac-ink); --b: var(--std-navfac-ink); }
.sw-std:hover { border-color: var(--ink-5); }
.sw-std:focus { outline: none; }
.sw-std:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.sw-std.on { border-color: var(--b); box-shadow: 0 0 0 3px var(--t); background: var(--surface-4); }
.sw-stdmono { min-width: 44px; height: 32px; padding: 0 6px; box-sizing: border-box; flex: none; border-radius: var(--radius-sm); background: var(--t); color: var(--k); font-size: var(--sw-size-micro); font-weight: var(--weight-strong); display: grid; place-items: center; }
.sw-stdwords { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.sw-stdname { font-weight: var(--weight-strong); }
.sw-stdname, .sw-stdref { white-space: normal; overflow-wrap: anywhere; }
.sw-stdref { font-size: var(--sw-size-tag) !important; color: var(--ink-4); }
.sw-radio { width: 16px; height: 16px; flex: none; box-sizing: border-box; border-radius: 50%; border: 1.5px solid var(--input-line); display: grid; place-items: center; }
.sw-radio-dot { width: 8px; height: 8px; border-radius: 50%; background: transparent; }
.sw-std.on .sw-radio, .sw-rrow.on .sw-radio { border-color: var(--b, var(--accent)); }
.sw-std.on .sw-radio-dot, .sw-rrow.on .sw-radio-dot { background: var(--b, var(--accent)); }
.sw-reqline { display: flex; align-items: center; gap: 6px; font-size: var(--type-caption-size); color: var(--ink-4); }
.sw-reqline.ok { color: var(--ok); }
.sw-reqline .sw-ic { width: 13px; height: 13px; }
.sw-reqbox { display: flex; flex-direction: column; gap: 10px; padding: 12px; border: 1px solid var(--line-2); border-radius: var(--radius-md); background: var(--surface-4); max-width: 560px; }
.sw-reqwords { display: flex; flex-direction: column; gap: 2px; }
.sw-reqtitle { font-weight: var(--weight-strong); }
.sw-reqrow { display: flex; gap: 8px; }
.sw-edition { max-width: 280px; }

/* ---- step 4 ---- */
.sw-step4 { display: flex; flex-direction: column; gap: 12px; }
.sw-none { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px; padding: 48px 0; text-align: center; }
.sw-nonet { font-size: var(--type-heading-size); font-weight: var(--weight-strong); }
.sw-mapped { display: flex; flex-direction: column; gap: 14px; padding: 16px 20px; border: 1px solid var(--ok-line); border-radius: var(--radius-md); background: var(--ok-tint); }
.sw-mappedhead { display: flex; align-items: center; gap: 10px; color: var(--ok); }
.sw-mappedhead b { font-weight: var(--weight-strong); }
.sw-mappedgrid { display: grid; grid-template-columns: 170px minmax(0, 1fr); gap: 8px 16px; font-size: var(--type-caption-size); padding-left: 24px; }
.sw-mappedgrid .k { color: var(--ink-3); }
.sw-mapcard { display: flex; flex-direction: column; padding: 4px 20px 6px; border: 1px solid var(--line-2); border-radius: var(--radius-md); }
.sw-why { display: flex; align-items: center; gap: 8px; padding: 12px 0 2px; font-size: var(--type-caption-size); color: var(--warn); }
.sw-readline { display: flex; align-items: baseline; gap: 12px; padding: 4px 0 2px; }
.sw-maprow { display: grid; grid-template-columns: 110px 200px minmax(0, 1fr); gap: 20px; align-items: start; padding: 12px 0; border-bottom: 1px solid var(--line-3); }
.sw-maprow:last-child { border-bottom: 0; }
.sw-rolename { font-weight: var(--weight-strong); line-height: 32px; }
.sw-rolesel { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.sw-qs { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
.sw-q { display: flex; flex-direction: column; gap: 6px; }
.sw-qtext { font-size: var(--type-caption-size); color: var(--ink-3); }
.sw-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 4px; }
.sw-chips .sw-chip { height: 26px; border-radius: var(--radius-pill); padding: 0 8px; font-weight: var(--weight-regular); color: var(--ink-2); transition: background .12s, color .12s; }
.sw-chips .sw-chip:hover { border-color: var(--ink-4); }
.sw-chips .sw-chip.on { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }
.sw-chips .sw-chip.solid { cursor: default; padding: 0 4px 0 9px; gap: 4px; }
.sw-chipx { width: 18px; height: 18px; border-radius: 50%; color: var(--on-accent-2); }
.sw-chipx:hover { background: var(--inverse-wash-2); color: var(--on-accent); }
.sw-chipx .sw-ic { width: 10px; height: 10px; }
.sw-chips .sw-chip.dashed { border-style: dashed; border-color: var(--ink-5); color: var(--accent-ink); font-weight: var(--weight-medium); padding: 0 10px; }
.sw-chips .sw-chip.dashed .sw-ic { width: 11px; height: 11px; }
.sw-count { font-size: var(--sw-size-tag); color: var(--ink-5); margin-left: 4px; }
.sw-checks { display: flex; flex-direction: column; gap: 6px; }
.sw-checklist { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 4px 20px; }
.sw-check { display: flex; align-items: baseline; gap: 8px; font-size: var(--type-caption-size); min-width: 0; }
.sw-check .nm { font-weight: var(--weight-medium); white-space: nowrap; }
.sw-check .st { color: var(--ink-4); min-width: 0; }
.sw-check.on .st { color: var(--ok); }
.sw-saving { display: flex; align-items: center; gap: 8px; font-size: var(--type-caption-size); color: var(--ink-2); }

/* ---- step 5 ---- */
.sw-basevalue { display: flex; align-items: flex-end; justify-content: space-between; gap: 8px; }
.sw-basewords { display: flex; flex-direction: column; gap: 2px; }
.sw-big { font-size: var(--sw-size-figure) !important; font-weight: var(--weight-medium); letter-spacing: -.01em; color: var(--ink); }
.sw-baseform { display: flex; flex-direction: column; gap: 6px; }
.sw-baserow { display: flex; gap: 8px; }
.sw-cmp { display: flex; flex-direction: column; gap: 4px; padding: 8px 10px; border-radius: var(--radius-sm); background: var(--surface-4); }
.sw-cmp.warn { background: var(--warn-tint); }
.sw-cmprow, .sw-totrow { display: flex; justify-content: space-between; gap: 12px; font-size: var(--type-caption-size); color: var(--ink-3); }
.sw-cmpwords { font-size: var(--type-caption-size); color: var(--ink-4); }
.sw-cmpwords.ok { color: var(--ok); } .sw-cmpwords.warn { color: var(--warn); }
.sw-totals { display: flex; flex-direction: column; gap: 4px; padding-top: 10px; border-top: 1px solid var(--line-3); }
.sw-totrow.strong { font-size: var(--type-body-size); font-weight: var(--weight-strong); color: var(--ink); }
.sw-ltable { border: 1px solid var(--line-2); border-radius: var(--radius-md); overflow: hidden; }
.sw-lhead, .sw-lcells { display: grid; grid-template-columns: 72px 76px minmax(0, 1fr) 56px 52px; gap: 8px; align-items: center; padding: 0 10px; }
.sw-lhead { height: 30px; background: var(--surface-4); border-bottom: 1px solid var(--line-2); font-size: var(--type-caption-size); font-weight: var(--weight-medium); color: var(--ink-4); }
.sw-lhead span:nth-child(3), .sw-lhead span:nth-child(4) { text-align: right; }
.sw-lrows { max-height: 260px; overflow: auto; }
.sw-lrow { border-bottom: 1px solid var(--line-3); }
.sw-lrow:last-child { border-bottom: 0; }
.sw-lrow.on { background: var(--surface-3); }
.sw-lrow.detected { background: var(--surface-4); }
.sw-lcells { min-height: 36px; font-size: var(--type-caption-size); }
.sw-lacts { display: flex; justify-content: flex-end; gap: 2px; }
.sw-lacts .sw-ibtn { width: 24px; height: 24px; }
.sw-lsub { padding: 0 10px 8px 90px; margin-top: -4px; font-size: var(--sw-size-tag); color: var(--ink-4); line-height: 1.4; }
.sw-lsub.warn { color: var(--warn); }
.sw-undo { display: flex; align-items: center; gap: 10px; height: 32px; padding: 0 6px 0 10px; border-radius: var(--radius-sm); background: var(--inverse-solid); color: var(--inverse-text); font-size: var(--type-caption-size); }
.sw-modform { display: flex; flex-direction: column; gap: 10px; padding: 12px; border: 1px solid var(--accent-tint-line); border-radius: var(--radius-md); background: var(--surface-4); }
.sw-formtitle { font-weight: var(--weight-strong); }
.sw-formgrid { display: grid; gap: 8px; }
.sw-formgrid.three { grid-template-columns: minmax(0, .8fr) minmax(0, 1fr) minmax(0, 1.2fr); }
.sw-formgrid.two { grid-template-columns: minmax(0, .8fr) minmax(0, 2.2fr); }
.sw-formgrid .sw-label { font-size: var(--type-caption-size); }
.sw-formrow { display: flex; align-items: center; gap: 8px; }
.sw-formmsg { font-size: var(--type-caption-size); color: var(--ink-4); line-height: 1.4; }
.sw-formmsg.bad { color: var(--danger); }
.sw-whybtn { align-self: flex-start; display: inline-flex; gap: 6px; }
.sw-chev { font-size: var(--sw-size-micro); }
.sw-whytext { padding-left: 16px; }

/* ---- dialogs over the wizard (mounted in #overlays) ---- */
.sw-scrim { position: fixed; inset: 0; z-index: 140; background: var(--setup-scrim); display: flex; align-items: center; justify-content: center; padding: 32px;
  font: var(--type-body); font-size: var(--type-body-size); color: var(--ink); }
.sw-dialog { width: 560px; max-width: 100%; max-height: 100%; display: flex; flex-direction: column; overflow: hidden; background: var(--surface); border-radius: var(--radius-xl); box-shadow: 0 24px 48px var(--setup-shadow-color); }
.sw-resolve .sw-dialog { width: 880px; }
.sw-vpick .sw-dialog { width: 460px; height: min(520px, 100%); }
.sw-leave .sw-dialog { width: 420px; }
.sw-dhead { flex: none; display: flex; align-items: flex-start; flex-wrap: wrap; gap: 10px; padding: 16px 12px 14px 20px; border-bottom: 1px solid var(--line-2); }
.sw-dwords { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.sw-dtitle { font-size: var(--type-heading-size); font-weight: var(--weight-strong); }
.sw-dsub { font-size: var(--type-caption-size); color: var(--ink-4); line-height: 1.45; }
.sw-dhead > .sw-input { flex: 1 0 100%; margin-right: 8px; }
.sw-vmeta { flex: 1 0 100%; display: flex; align-items: center; gap: 12px; font-size: var(--type-caption-size); margin-right: 8px; }
.sw-dbody { flex: 1; min-height: 0; overflow: auto; padding: 16px 20px; display: flex; flex-direction: column; gap: 12px; }
.sw-dfoot { flex: none; min-height: 56px; display: flex; align-items: center; justify-content: flex-end; gap: 8px; padding: 0 20px; border-top: 1px solid var(--line-2); font-size: var(--type-caption-size); }
.sw-leave .sw-dhead { border-bottom: 0; padding-bottom: 0; }
.sw-leave .sw-dbody { padding: 4px 20px; }
.sw-leave .sw-dfoot { border-top: 0; }
.sw-drop { height: 200px; flex-direction: column; gap: 10px; border: 1.5px dashed var(--input-line); border-radius: var(--radius-lg); background: var(--surface-4); font-weight: var(--weight-regular); }
.sw-drop:hover, .sw-drop.on { border-color: var(--accent); background: var(--surface-3); }
.sw-dropic { width: 40px; height: 40px; padding: 10px; box-sizing: border-box; border-radius: var(--radius-lg); background: var(--surface); border: 1px solid var(--line-2); color: var(--accent); }
.sw-drops { font-size: var(--type-caption-size); color: var(--ink-4); }
.sw-filein { display: none; }
.sw-pickhead { display: flex; align-items: center; gap: 12px; }
.sw-picked { border: 1px solid var(--line-2); border-radius: var(--radius-md); max-height: 300px; overflow: auto; }
.sw-pick { display: flex; align-items: center; gap: 10px; height: 36px; padding: 0 6px 0 12px; border-bottom: 1px solid var(--line-3); }
.sw-pick .mono.sw-sp { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--ink); }
.sw-pick .sw-ic { width: 16px; height: 16px; color: var(--ink-4); }
.sw-rtable { border: 1px solid var(--line-2); border-radius: var(--radius-md); overflow: hidden; }
.sw-rhead, .sw-rrow { display: grid; grid-template-columns: 28px minmax(0, 1.5fr) 124px 72px 92px minmax(0, 1.5fr); gap: 12px; align-items: center; padding: 0 12px; }
.sw-rhead { height: 32px; background: var(--surface-4); border-bottom: 1px solid var(--line-2); font-size: var(--type-caption-size); font-weight: var(--weight-medium); color: var(--ink-4); position: sticky; top: 0; }
.sw-rhead span:nth-child(4) { text-align: right; }
.sw-rrows { max-height: 360px; overflow: auto; }
.sw-rrow { min-height: 52px; padding-top: 6px; padding-bottom: 6px; border-bottom: 1px solid var(--line-3); cursor: pointer; }
.sw-rrow:hover { background: var(--surface-4); }
.sw-rrow:focus { outline: none; }
.sw-rrow:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
.sw-rrow.on { background: var(--surface-3); box-shadow: inset 3px 0 0 var(--accent); }
.sw-rfile { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.sw-rl1 { display: flex; align-items: center; gap: 6px; min-width: 0; }
.sw-rname { font-weight: var(--weight-medium); color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sw-rl2 { font-size: var(--sw-size-tag); color: var(--ink-4); }
.sw-rrow .amber { color: var(--warn); }
.sw-rdiff { font-size: var(--type-caption-size); color: var(--ink-2); line-height: 1.4; }
.sw-rdiff.muted { color: var(--ink-5); }
.sw-vlist { margin: -16px -20px; padding: 4px 0; }
.sw-vrow { display: grid; grid-template-columns: 18px minmax(0, 1fr) 56px; gap: 10px; align-items: center; height: 32px; padding: 0 20px; cursor: pointer; }
.sw-vrow:hover { background: var(--surface-4); }
.sw-vrow input { margin: 0; accent-color: var(--accent); }
.sw-vname { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sw-vrow .mono { font-size: var(--sw-size-tag); text-align: right; }

/* the skeleton the arrival paints */
.sw.su-skel .sw-head .skel { width: 280px; height: 14px; }
.sw.su-skel .sw-steps { gap: 12px; align-items: center; height: 44px; }
.sw.su-skel .sw-steps .skel { flex: 1; height: 12px; }
.sw.su-skel .sw-body { display: flex; flex-direction: column; gap: 12px; }
.sw.su-skel .sw-body .skel { height: 16px; max-width: 520px; }
.sw.su-skel .sw-body .skel:first-child { height: 22px; max-width: 220px; }

/* ---- matched to the design, state by state ---- */
.cmp-host.kind-setup .cmp-scrim { background: var(--sw-scrim); backdrop-filter: none; -webkit-backdrop-filter: none; }
.cmp-host.kind-setup .cmp-modal { box-shadow: var(--sw-shadow); }
.sw-kicker { color: var(--sw-kicker); }
.sw .sw-title { font-size: var(--sw-size-step); line-height: 1.3; letter-spacing: -.005em; }
.sw .sw-lead { margin-bottom: 14px; }
.sw-btn.sw-primary:disabled { background: var(--sw-disabled); }
.sw-row.fresh { background: var(--sw-fresh); }
.sw-row.group .sw-c.name, .sw-chip.warn, .sw-footnote, .sw-why, .sw-lsub.warn, .sw-cmpwords.warn { color: var(--sw-warn-ink); }
.sw-warnbtn { border-color: var(--warn-line); color: var(--sw-warn-ink); }
.sw-footline .sw-btn.sw-link { font-weight: var(--weight-regular); color: var(--ink-2); }
.sw-stdwords { line-height: 1.3; }
.sw-reqbox { max-width: 560px; box-sizing: content-box; }
.sw-mapped { background: var(--sw-ok-panel); }
.sw-mappedhead { color: var(--sw-ok-ink); }
.sw-mappedgrid { padding-left: 28px; line-height: 16px; }
.sw-why .sw-btn.sw-link { margin-left: auto; }
.sw-scrim { background: var(--sw-scrim-2); }
.sw-dialog { box-shadow: var(--sw-shadow-2); }
.sw-scrim .right { text-align: right; }
.sw-dtitle .mono { font-size: inherit; font-weight: var(--weight-medium); }
.sw-vpick .sw-dhead { flex-direction: column; flex-wrap: nowrap; align-items: stretch; gap: 10px; padding: 16px 20px 12px; }
.sw-vpick .sw-dhead > .sw-input, .sw-vpick .sw-vmeta { margin-right: 0; flex: none; }
.sw-vpick .sw-vmeta { flex: 0 0 auto; height: 18px; line-height: 18px; }
.sw-vpick .sw-dbody { padding: 4px 0; gap: 0; }
.sw-dtitle { line-height: 1.3; }
.sw-dsub { line-height: 1.35; }
.sw-vpick .sw-vlist { margin: 0; padding: 0; }
.sw-leave .sw-dialog { width: 460px; }
.sw-leave .sw-dhead { padding: 20px 20px 0; }
.sw-leave .sw-dsub { font-size: var(--type-body-size); color: var(--ink-3); margin-top: 6px; }
.sw-leave .sw-dfoot { padding: 8px 20px 20px; min-height: 0; }
.sw-modform { border-color: var(--accent-tint-line); background: var(--sw-form); }
.sw-add .sw-dhead { min-height: 56px; box-sizing: border-box; padding: 0 12px 0 20px; align-items: center; }
.sw-add .sw-dwords { gap: 1px; }
.sw-pick { height: 37px; }
.sw-pick .sw-ibtn { width: 24px; height: 24px; color: var(--ink-5); }
.sw-pick .sw-ibtn .sw-ic { width: 12px; height: 12px; }
.sw-mappedhead .sw-ok { width: 18px; height: 18px; }
.sw-mappedhead .sw-ok .sw-ic { width: 10px; height: 10px; }
.sw-shint { gap: 5px; }
.sw-modform .sw-field { gap: 4px; }
.sw-label .sw-pm { color: var(--ink-5); font-weight: var(--weight-regular); }
.sw-basewords .sw-hint { font-size: var(--type-caption-size); }

/* narrow: the side panels stack under the main column */
@media (max-width: 860px) {
  .sw-two-side, .sw-two-even { grid-template-columns: minmax(0, 1fr); }
  .sw-cards { grid-template-columns: minmax(0, 1fr); }
  .sw-maprow { grid-template-columns: minmax(0, 1fr); gap: 8px; }
  .sw-checklist { grid-template-columns: minmax(0, 1fr); }
  .sw-shint, .sw-tally { display: none; }
}
@media (max-width: 640px) {
  .sw-head, .sw-steps, .sw-body, .sw-foot { padding-left: 16px; padding-right: 16px; }
  .sw-identity, .sw-formgrid.three, .sw-formgrid.two { grid-template-columns: minmax(0, 1fr); }
  .sw-stitle { display: none; }
  .sw-step-tab { justify-content: center; }
  .sw-thead { display: none; }
  .sw-cells { grid-template-columns: 76px minmax(0, 1fr) auto 28px; }
  .sw-c.file, .sw-c.gap { display: none; }
  .sw-subrow { padding-left: 12px; flex-wrap: wrap; }
  .sw-tools { flex-wrap: wrap; }
  .sw-input.sw-filter { width: 100%; order: 3; }
  .sw-rhead { display: none; }
  .sw-rrow { grid-template-columns: 28px minmax(0, 1fr); }
  .sw-rrow > :nth-child(n+3) { grid-column: 2; }
}
@media (prefers-reduced-motion: reduce) {
  .sw-bar::-webkit-progress-value, .sw-row, .sw-std, .sw-btn, .sw-chips .sw-chip { transition: none; }
  .sw-spin { animation-duration: 2.4s; }
}
.sw-text { font-size: var(--type-body-size); color: var(--ink-2); line-height: 1.45; }
.sw-preview { margin-top: 2px; }
.sw-bindings { display: flex; flex-direction: column; gap: 8px; max-width: 840px; }
.sw-chips .sw-chip.on.ai-val { background: var(--ai); border-color: var(--ai); color: var(--on-accent); }
.sw-chips .sw-chip.ai-val::after, .sw-select.ai-val::after { content: none; }
.sw-select.ai-val { color: var(--ai); border-color: var(--ai-line); }

/* State classes other screens build at run time (timeline bars, Health
   states): restored after the setup stylesheet was replaced. */
.st-limit { padding: 10px 0; border-top: 1px solid var(--line-3); }
.st-limit:first-of-type { border-top: 0; padding-top: 2px; }
.st-limit .h { display: grid; grid-template-columns: 10px minmax(0, 1fr) auto; gap: 8px; align-items: baseline; }
.st-limit .n { font-size: 12px; font-weight: 500; }
.st-limit .val { font-size: 14px; font-weight: 500; letter-spacing: -.01em; }
.st-limit.applied .ic { color: var(--ok); }
.st-limit.applied .val { color: var(--ink); }
.st-limit.unapplied .ic { color: var(--ink-5); }
.st-limit.unapplied .val, .st-limit.unapplied .n { color: var(--ink-4); }
.st-limit .src, .st-limit .conf { margin-left: 18px; font-size: 11px; line-height: 1.5; color: var(--ink-4); }
.st-limit .conf { color: var(--warn); }
.t2 .st-limit .n { font-size: var(--type-caption-size); font-weight: var(--weight-medium); }
.t2 .st-limit .val { font-size: var(--type-heading-size); font-weight: var(--weight-medium); }
.t2 .st-limit .src, .t2 .st-limit .conf { font-size: var(--type-caption-size); }
.t2 .hl-row.st-not_computed .title, .t2 .hl-row.st-disabled .title { color: var(--ink-3); }
.t2 .gt-canvas .gt-bar.st-complete .bar { fill: var(--accent); }
.t2 .gt-canvas .gt-bar.st-complete .done { display: none; }
.t2 .gt-canvas .gt-bar.st-in_progress .bar { fill: var(--accent-tint-line); }
.t2 .gt-canvas .gt-bar.st-not_started .bar { fill: var(--line); }
.t2 .gt-legend .lg.st-complete i { background: var(--accent); }
.t2 .gt-legend .lg.st-in_progress i { background: var(--accent-tint-line); }
.t2 .hl-filter-dot.st-pass, .t2 .hl-filter-dot.st-cleared { background: var(--ok-dot); }
.t2 .hl-filter-dot.st-raised, .t2 .hl-filter-dot.st-not_assessed { background: var(--warn-dot); }
.t2 .hl-filter-dot.st-new, .t2 .hl-filter-dot.st-continuing, .t2 .hl-filter-dot.st-current { background: var(--accent); }
.t2 .hl-filter-dot.st-disabled { background: transparent; border: 1px solid var(--neutral-dot); }
.t2 .hl-status.st-raised { color: var(--warn); }
.t2 .hl-status.st-raised::before { background: var(--warn-dot); }
.t2 .hl-status.st-pass { color: var(--ok); }
.t2 .hl-status.st-pass::before { background: var(--ok-dot); }
.t2 .hl-compact-list .hl-status.st-not_computed, .t2 .hl-compact-list .hl-status.st-disabled { color: var(--ink-4); }
.t2 .hl-detail-eyebrow .st-pass { background: var(--ok-tint); }
.t2 .hl-detail-eyebrow .st-raised { background: var(--warn-tint); }
.t2 .hl-life.st-new { color: var(--warn); }
.t2 .hl-life.st-cleared { color: var(--ok); }
.t2 .hl-history-state.st-raised { color: var(--warn); }
.t2 .hl-history-state.st-pass { color: var(--ok); }
.t2 .hl-history-state.st-not_computed { color: var(--ink-4); }
.t2 .hl-group-results .st-pass { color: var(--ok); }
.t2 .hl-group-results .st-raised { color: var(--warn); }
.t2 .hl-group-results .st-not_computed { color: var(--ink-3); }
.t2 .hl-distribution-segment.st-pass { background: var(--ok-dot); }
.t2 .hl-distribution-segment.st-raised { background: var(--warn-dot); }
.t2 .hl-distribution-segment.st-not_computed { background: var(--neutral-dot); }
.t2 .hl-distribution-segment.st-disabled { background: var(--line-2); }
.t2 .hl-history-state.st-pass { background: var(--ok-tint); }
.t2 .hl-history-state.st-raised { background: var(--warn-tint); }
.t2 .hl-history-state.st-not_computed, .t2 .hl-history-state.st-disabled { background: var(--surface-2); }
.sw-btn.sw-primary[aria-disabled="true"] { background: var(--sw-disabled); cursor: not-allowed; }
.sw-input.sw-money:focus { font-family: var(--mono); font-size: var(--type-caption-size); }
.sw-none .sw-hint { font-size: var(--type-body-size); }

/* Brief, non-blocking MFA reminder, below the account controls. */
.mfa-warning-toast {
  position: fixed; top: 64px; right: 20px; z-index: 130;
  display: flex; align-items: flex-start; gap: 10px;
  box-sizing: border-box; width: 320px; max-width: calc(100vw - 32px);
  padding: 12px; border: 1px solid #ebd9ad; border-radius: 12px;
  color: #755015; background: #fffcf5;
  box-shadow: 0 4px 16px rgba(45,35,15,.09);
  font: 13px/1.4 var(--sans, system-ui, sans-serif);
}
.mfa-warning-icon {
  display: grid; place-items: center; flex: 0 0 26px; height: 26px;
  margin-top: 2px; border-radius: 50%; background: #fff0c9; color: #91600c;
  font-size: 15px; font-weight: 700;
}
.mfa-warning-copy { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }
.mfa-warning-copy strong { font-size: 13px; font-weight: 600; }
.mfa-warning-copy > span { color: #807057; font-size: 12px; }
.mfa-warning-dismiss {
  display: grid; place-items: center; flex: 0 0 24px; height: 24px;
  padding: 0; border: 0; border-radius: 6px; background: transparent;
  color: #998263; font: 20px/1 sans-serif; cursor: pointer;
}
.mfa-warning-dismiss:hover { color: #755015; background: #fff0c9; }
.mfa-warning-dismiss:focus-visible { outline: 2px solid #91600c; outline-offset: 2px; }

/* Original Girdero artwork: light auth surfaces and the dark navigation rail. */
.unlock-card .unlock-brand h1 { margin: 0; line-height: 1; }
.girdero-auth-logo { display: block; width: 190px; height: auto; max-width: 100%; }
.app.shell2 .sidebar .sb-mark { background: transparent; width: 28px; height: 28px; flex: none; }
.sidebar .sb-mark img { display: block; width: 100%; height: 100%; }
.girdero-rail-wordmark { display: block; max-width: 100%; object-fit: contain; object-position: left center; }
.app.shell2 .sidebar .sb-org-name { font-size: 11px; font-weight: 400; margin-top: 3px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.page-schedule-field { display:flex; align-items:center; gap:10px; min-width:0; }
.page-schedule-selector { flex-wrap:wrap; gap:12px 24px; }
.page-schedule-field > span { font-size:13px; flex-shrink:0; }
@media (max-width:540px) { .page-schedule-field { flex-wrap:wrap; gap:6px; } }
