/* ===== Orchestrator Log panel (decision pills + reasoning) ===== */
.orch-pill {
  padding: 1px 8px; border-radius: 9px; font-size: 0.66rem; font-weight: 700;
  letter-spacing: 0.03em; white-space: nowrap;
}
.orch-pill-rested { background: rgba(255,255,255,0.10); color: var(--text-secondary, #8a8a9a); }
.orch-pill-dispatched { background: rgba(254,202,87,0.18); color: var(--accent-yellow, #feca57); }
.orch-pill-escalated { background: rgba(255,107,107,0.18); color: var(--accent-red, #ff6b6b); }
.orch-pill-pending { background: transparent; color: var(--text-secondary, #8a8a9a); border: 1px dashed var(--glass-border, rgba(255,255,255,0.1)); }
.orch-log-detail { font-size: 0.68rem; color: var(--text-secondary, #8a8a9a); }
/* The reasoning is the product — readable by default, clamped at 3 lines,
   expand-on-tap for the long ones. */
.orch-log-reasoning {
  margin-top: 4px; color: var(--text-primary, #e8e8f0); line-height: 1.4;
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical;
  overflow: hidden; cursor: pointer;
}
.orch-log-reasoning.expanded { display: block; -webkit-line-clamp: unset; overflow: visible; }
.orch-log-ref { margin-top: 3px; font-size: 0.72rem; color: var(--accent-yellow, #feca57); }
.orch-log-by { margin-top: 2px; font-size: 0.66rem; color: var(--text-secondary, #8a8a9a); }

/* === FLEET Model Control — pop-out panel (spec v1, 2026-08-04, task 1374b8a0) ===
   Pit Wall tokens ONLY per the spec v1.1 design gate — no new colors, no new
   fonts. Amber (--fleet-your-move) = attention (post-#359 convention). Layered
   maroon surfaces via --fleet-panel; hairlines via --fleet-hair; typography
   via --fleet-ink / --fleet-text / --fleet-mono. Reuses the .fleet-card
   idiom's rail + hover pattern (line 4297+). */
.fm-panel {
  position: fixed; inset: 0; z-index: 250;
  display: none;
}
.fm-panel.fm-panel-open { display: block; }
.fm-panel-backdrop {
  position: absolute; inset: 0;
  background: rgba(0,0,0,0.55);
}
.fm-panel-body {
  position: absolute; top: 5vh; bottom: 5vh; left: 50%; transform: translateX(-50%);
  width: min(760px, 92vw);
  display: flex; flex-direction: column;
  border-radius: 14px; border: 1px solid var(--fleet-hair);
  background:
    repeating-linear-gradient(0deg, rgba(0,0,0,0.12) 0 1px, transparent 1px 3px),
    radial-gradient(600px 300px at 20% -10%, rgba(120,26,26,0.42), transparent 60%),
    linear-gradient(180deg, #2a1616 0%, #1f1111 100%);
  box-shadow: 0 30px 80px -20px rgba(0,0,0,0.6);
  overflow: hidden;
}
.fm-panel-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 14px 18px 10px;
  border-bottom: 1px solid var(--fleet-hair);
}
.fm-panel-title {
  font-family: var(--fleet-ink); font-weight: 900; text-transform: uppercase;
  letter-spacing: 0.14em; font-size: 0.88rem; color: var(--text-primary);
}
.fm-panel-close {
  background: transparent; border: 1px solid var(--fleet-hair); border-radius: 8px;
  color: var(--text-secondary); width: 32px; height: 32px; font-size: 1.2rem;
  cursor: pointer; line-height: 1;
}
.fm-panel-close:hover { color: var(--text-primary); border-color: rgba(255,255,255,0.18); }
.fm-panel-note {
  padding: 8px 18px 10px;
  font-family: var(--fleet-text); font-size: 0.76rem; color: var(--text-secondary);
  line-height: 1.5; opacity: 0.85;
}
.fm-panel-list {
  flex: 1; overflow-y: auto; padding: 4px 12px 16px;
}
.fm-empty {
  padding: 20px; text-align: center; color: var(--text-muted);
  font-family: var(--fleet-text); font-size: 0.82rem; font-style: italic;
}
.fm-room-block {
  margin-top: 12px; padding: 10px 12px; border-radius: 10px;
  border: 1px solid var(--fleet-hair);
  background: var(--fleet-panel);
}
.fm-room-name {
  font-family: var(--fleet-ink); font-weight: 700; text-transform: uppercase;
  letter-spacing: 0.08em; font-size: 0.78rem; color: var(--text-primary);
  margin-bottom: 8px;
}
.fm-row {
  display: grid;
  grid-template-columns: 60px 1fr 90px auto;
  align-items: center; gap: 10px;
  padding: 8px 6px; border-top: 1px solid var(--fleet-hair);
  min-height: 44px;
}
.fm-row:first-of-type { border-top: none; }
.fm-cell { min-width: 0; }
.fm-role {
  font-family: var(--fleet-mono); font-size: 0.72rem; text-transform: uppercase;
  letter-spacing: 0.06em; color: var(--text-secondary);
}
.fm-models { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.fm-running, .fm-configured {
  display: flex; align-items: baseline; gap: 8px; min-width: 0;
}
.fm-cell-label {
  font-family: var(--fleet-mono); font-size: 0.62rem; text-transform: uppercase;
  letter-spacing: 0.08em; color: var(--text-muted); min-width: 68px;
}
.fm-cell-val {
  font-family: var(--fleet-text); font-size: 0.82rem; color: var(--text-primary);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.fm-dim { color: var(--text-muted); opacity: 0.55; }
.fm-drift {
  display: inline-block; margin-left: 6px; padding: 1px 6px; border-radius: 4px;
  font-family: var(--fleet-mono); font-size: 0.6rem; text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--fleet-your-move); border: 1px solid rgba(254,202,87,0.55);
  background: rgba(254,202,87,0.08);
}
.fm-swapping {
  display: inline-block; margin-left: 6px; padding: 1px 6px; border-radius: 4px;
  font-family: var(--fleet-mono); font-size: 0.6rem;
  color: var(--fleet-your-move); border: 1px solid rgba(254,202,87,0.55);
  background: rgba(254,202,87,0.12);
  animation: fleet-pulse 1.3s ease-in-out infinite;
}
/* Inline server-refusal text under a seat row (task c992b1ab) — the 2s
   flash alone read as a dead button. Amber = attention, existing tokens
   only; spans the full row width below the controls. */
.fm-row-error {
  grid-column: 1 / -1; width: 100%;
  font-family: var(--fleet-mono); font-size: 0.65rem;
  color: var(--fleet-your-move);
  padding: 3px 2px 0;
}
/* Swap unconfirmed after the poll budget (spec §3 verify) — steady amber,
   no pulse: attention without implying progress. Same token family as
   .fm-swapping per the pit-wall amber = attention convention. */
.fm-swap-failed {
  display: inline-block; margin-left: 6px; padding: 1px 6px; border-radius: 4px;
  font-family: var(--fleet-mono); font-size: 0.6rem;
  color: var(--fleet-your-move); border: 1px solid rgba(254,202,87,0.55);
  background: rgba(254,202,87,0.04);
}
.fm-state {
  font-family: var(--fleet-mono); font-size: 0.7rem; text-transform: uppercase;
  letter-spacing: 0.06em; color: var(--text-secondary);
  text-align: right;
}
.fm-state-working { color: var(--fleet-your-move); }
.fm-state-dead { color: var(--fleet-dead); }
.fm-state-your-move { color: var(--fleet-your-move); }
.fm-controls { display: flex; align-items: center; gap: 6px; }
.fm-select {
  background: rgba(0,0,0,0.28); border: 1px solid var(--fleet-hair); border-radius: 6px;
  color: var(--text-primary);
  font-family: var(--fleet-mono); font-size: 0.72rem;
  padding: 4px 6px; max-width: 160px;
}
.fm-select:focus { outline: none; border-color: rgba(255,255,255,0.22); }
.fm-apply {
  background: rgba(254,202,87,0.10); border: 1px solid rgba(254,202,87,0.55);
  color: var(--fleet-your-move);
  font-family: var(--fleet-ink); font-weight: 700; text-transform: uppercase;
  letter-spacing: 0.08em; font-size: 0.7rem;
  padding: 5px 10px; border-radius: 6px; cursor: pointer;
}
.fm-apply:hover { background: rgba(254,202,87,0.18); }
.fm-apply:disabled { opacity: 0.5; cursor: not-allowed; }
/* Refresh — the relaunch fallback (spec §Behavior.4). Ghost treatment so
   Apply stays the primary action; same hairline recipe as .fm-select. */
.fm-refresh {
  background: transparent; border: 1px solid var(--fleet-hair);
  color: var(--text-secondary);
  font-family: var(--fleet-ink); font-weight: 700; text-transform: uppercase;
  letter-spacing: 0.08em; font-size: 0.7rem;
  padding: 5px 10px; border-radius: 6px; cursor: pointer;
}
.fm-refresh:hover { border-color: rgba(255,255,255,0.22); color: var(--text-primary); }
.fm-refresh:disabled { opacity: 0.5; cursor: not-allowed; }
.fm-apply-error {
  color: var(--fleet-dead); border-color: var(--fleet-dead);
  background: rgba(255,107,107,0.10);
}
/* Trigger button — sits on the FLEET view header. Small, ghost, keeps the
   pit-wall visual quiet unless hovered. */
.fm-trigger {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 5px 10px; border-radius: 8px;
  background: transparent; border: 1px solid var(--fleet-hair);
  color: var(--text-secondary);
  font-family: var(--fleet-ink); font-weight: 700; text-transform: uppercase;
  letter-spacing: 0.08em; font-size: 0.68rem;
  cursor: pointer;
}
.fm-trigger:hover { color: var(--text-primary); border-color: rgba(255,255,255,0.18); }

/* === Chat / DM view — Pit Wall reskin (PR: feature/pit-wall-chat-reskin) ===
   Same pattern as the Scoreboard reskin (#350): additive override section,
   local --pw-* names aliased onto the shared --fleet-* tokens (reuse, not
   fork). Originally scoped under .dm-sidebar only; surface 3 (Jase GO
   2026-07-11) consciously extends the SHARED rules to #view-general via
   comma-extension — one definition, two scopes, never a bare widen. The
   general-only treatments live in the surface-3 section at the end of this
   file. Status language: amber = needs-attention
   (unread, active view), green = verified/converged, hairlines everywhere.
   --pw-mono resolves through --fleet-mono, which carries DM Mono as of the
   tokens PR (2026-07-11); the system mono stack remains the fallback. */
.dm-sidebar {
  /* aliases of the :root --fleet-panel tokens (promoted in the tokens PR,
     2026-07-11) — same computed values the former literals carried */
  --pw-panel: var(--fleet-panel);
  --pw-panel-2: var(--fleet-panel-2);
  --pw-line: var(--fleet-hair);
  --pw-amber: var(--fleet-your-move);
  --pw-green: var(--fleet-working);
  --pw-ink-dark: #1f1111;
  --pw-dim: var(--text-muted); /* same dim tone as --sb-dim — one dim across surfaces */
  --pw-mono: var(--fleet-mono, 'SF Mono', 'Menlo', ui-monospace, monospace);
  font-family: var(--fleet-text);
  /* the maroon pit-wall surface — same recipe as .sb-wrap / the Fleet board */
  background:
    repeating-linear-gradient(0deg, rgba(0,0,0,0.16) 0 1px, transparent 1px 3px),
    radial-gradient(1200px 500px at 15% -10%, rgba(120,26,26,0.55), transparent 60%),
    radial-gradient(900px 500px at 100% 0%, rgba(60,18,18,0.6), transparent 55%),
    linear-gradient(180deg, #2a1616 0%, #1f1111 100%);
  border-left: 1px solid var(--pw-line);
}

/* headers — Campione display voice, darker strip, hairline */
.dm-sidebar .dm-sidebar-header,
.dm-sidebar .dm-thread-header {
  background: rgba(0,0,0,0.28);
  border-bottom: 1px solid var(--pw-line);
}
.dm-sidebar .dm-sidebar-header h2,
.dm-sidebar .dm-thread-header h2 {
  font-family: var(--fleet-ink);
  font-weight: 900;
  font-size: 0.95rem;
  letter-spacing: 2.5px;
  text-transform: uppercase;
}

/* switch row — the strip carries the Pit Wall hairline + padding now */
.dm-sidebar .dm-view-switchrow {
  padding: 6px 16px;
  border-bottom: 1px solid var(--pw-line);
}
/* view trio — segmented control: grouped hairline box, active icon amber */
.dm-sidebar .dm-view-trio {
  gap: 0;
}
/* pinned pane-tab row in the DM header — Pit Wall voice, mirroring the
   standalone #view-terminal tabs (amber active, hairline chrome, mono badges).
   No reparenting: this is a separate .tmux-tabs mount that renderTabs paints. */
.dm-sidebar .dm-tmux-tabs { gap: 4px; }
.dm-sidebar .dm-tmux-tabs .tmux-tab {
  font-family: var(--fleet-mono, 'SF Mono', 'Menlo', ui-monospace, monospace);
  background: rgba(255,255,255,0.015);
  border: 1px solid var(--fleet-hair);
  color: rgba(255,255,255,0.55);
}
.dm-sidebar .dm-tmux-tabs .tmux-tab.active {
  background: rgba(254,202,87,0.12);
  border-color: rgba(254,202,87,0.35);
  color: var(--fleet-your-move);
}
.dm-sidebar .dm-tmux-tabs .tmux-tab-add {
  background: rgba(46,213,115,0.12);
  border-color: rgba(46,213,115,0.3);
  color: var(--fleet-working);
}
.dm-sidebar .dm-tmux-tabs .tmux-tab-clear {
  font-family: var(--fleet-text);
  letter-spacing: 1px;
  text-transform: uppercase;
  background: rgba(254,202,87,0.12);
  border-color: rgba(254,202,87,0.3);
}
.dm-sidebar .dm-tmux-tabs .tmux-tab-bar {
  font-family: var(--fleet-mono, 'SF Mono', 'Menlo', ui-monospace, monospace);
}
.dm-sidebar .dm-view-trio .btn-icon {
  border-radius: 0;
  border: 1px solid var(--pw-line);
  border-left-width: 0;
  background: var(--pw-panel-2);
}
.dm-sidebar .dm-view-trio .btn-icon:first-child { border-left-width: 1px; border-radius: 6px 0 0 6px; }
.dm-sidebar .dm-view-trio .btn-icon:last-child { border-radius: 0 6px 6px 0; }
/* active-view marker (dm-panel-btn-active, set by syncViewSwitcher) + the
   bot-activity pulse move from red to amber — in the pit-wall status language
   red means dead, amber means your-move/attention. */
.dm-sidebar .dm-panel-btn-active {
  color: var(--pw-amber);
  background: rgba(254,202,87,0.12);
}
@media (prefers-reduced-motion: reduce) {
  .dm-sidebar .dm-panel-btn-pulse { animation: none; color: var(--pw-amber); }
}

/* sidebar sections — Choplin semibold micro-labels */
.dm-sidebar .dm-section-header {
  font-weight: 600;
  letter-spacing: 0.2em;
  color: var(--pw-dim);
}
/* unread pip: amber-on-dark (needs-attention), mono digits */
.dm-sidebar .dm-unread-pip {
  background: var(--pw-amber);
  color: var(--pw-ink-dark);
  font-family: var(--pw-mono);
  font-weight: 500;
}
.dm-sidebar .dm-converged-pip { color: var(--pw-green); }

/* convo rows — hairline card on hover, mono time */
.dm-sidebar .dm-convo-item {
  border: 1px solid transparent;
  border-radius: 6px;
}
.dm-sidebar .dm-convo-item:hover,
.dm-sidebar .dm-convo-item:active {
  background: var(--pw-panel);
  border-color: var(--pw-line);
}
.dm-sidebar .dm-convo-time {
  font-family: var(--pw-mono);
  font-size: 10px;
}

/* thread — maroon well behind the bubbles */
.dm-sidebar .dm-thread {
  background:
    radial-gradient(900px 400px at 80% -10%, rgba(120,26,26,0.28), transparent 60%),
    linear-gradient(180deg, rgba(0,0,0,0.30) 0%, rgba(0,0,0,0.44) 100%);
  gap: 8px;
}

/* bubbles — self goes amber (was red: red = dead in the status language) */
.dm-sidebar .dm-msg-self {
  background: linear-gradient(135deg, rgba(254,202,87,0.14), rgba(254,202,87,0.08));
  border: 1px solid rgba(254,202,87,0.26);
}
.dm-sidebar .dm-msg-other {
  background: var(--pw-panel);
  border: 1px solid var(--pw-line);
}
.dm-sidebar .dm-msg-content,
.dm-sidebar .dm-compose textarea {
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
}
.dm-sidebar .dm-msg-sender {
  font-size: 0.7rem;
  letter-spacing: 0.09em;
  text-transform: uppercase;
}
.dm-sidebar .dm-msg-time {
  font-family: var(--pw-mono);
  font-size: 0.6rem;
}

/* eval verdict = graded receipt — green-railed card on real eval messages
   (createBubble adds .dm-msg-eval when the sender is the room's eval bot) */
.dm-sidebar .dm-msg-eval {
  border-left: 3px solid var(--pw-green);
  border-top: 1px solid rgba(46,213,115,0.25);
  border-right: 1px solid rgba(46,213,115,0.25);
  border-bottom: 1px solid rgba(46,213,115,0.25);
  background: rgba(46,213,115,0.05);
  border-radius: 4px 14px 14px 4px;
}

/* date separator — mono ticker line */
.dm-sidebar .dm-date-separator::before,
.dm-sidebar .dm-date-separator::after,
#view-general .dm-date-separator::before,
#view-general .dm-date-separator::after { background: var(--fleet-hair); }
.dm-sidebar .dm-date-separator span,
#view-general .dm-date-separator span {
  /* global-safe values — the --pw-* aliases are scoped to .dm-sidebar and do
     not resolve here (same var-scope trap as the pulse keyframes on #364) */
  font-family: var(--fleet-mono, 'SF Mono', 'Menlo', ui-monospace, monospace);
  font-size: 0.62rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--text-muted);
}

/* bot-detail body inherits the mono chain (DM Mono when the token lands) */
.dm-sidebar .dm-bot-detail-body { font-family: var(--pw-mono); }

/* Technical-fold body reads as prose (paragraphs) — override the mono chain
   applied by .dm-bot-detail-body base (line 1893) and .dm-sidebar
   .dm-bot-detail-body above. Specificity ties the sidebar rule (both are
   0,2,0); placement AFTER the sidebar rule wins by source order. Eval
   PASS/FAIL body (no --technical modifier) keeps mono. */
.dm-bot-detail--technical .dm-bot-detail-body {
  font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text',
               'Segoe UI', Roboto, sans-serif;
}

/* Panel-clamp (task 2491fc0e per Jase msgId 8d8d238c "maybe three rows
   instead of one? Or up to three rows"): bot-panel bubbles clamp their
   human-content region to 3 rendered lines with a tap-to-expand affordance.
   Presentation only — routing (#446 classifier) is untouched. Fold-composition:
   `[technical]` / `[bot-detail]` folds render in a sibling `.dm-bot-detail`
   container, so the fold bar stays visible below the clamped summary
   (folds still collapse behind their own chevron). Sidebar-scoped so the
   main chat never clamps. */
.dm-sidebar .dm-msg .dm-msg-content {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.dm-sidebar .dm-msg.dm-msg-expanded .dm-msg-content {
  display: block;
  -webkit-line-clamp: unset;
  overflow: visible;
}
/* The expander button lives in every bubble's DOM (always present so no
   post-append node inserts are needed) but is HIDDEN by default. The
   post-append measurement in createBubble (js/modules/messages.js) toggles
   `.dm-msg-overflowing` on the bubble root iff the content region actually
   overflowed the 3-line clamp — CSS then reveals the button. This means a
   bubble that FITS naturally never shows an affordance the user can't act on. */
.dm-msg-expander {
  background: transparent;
  border: 0;
  color: var(--pw-dim, rgba(255,255,255,0.55));
  padding: 4px 0 0;
  font: inherit;
  font-size: 0.72rem;
  cursor: pointer;
  display: none;
  align-self: flex-start;
}
.dm-sidebar .dm-msg.dm-msg-overflowing .dm-msg-expander { display: inline-block; }
.dm-msg-expander::after { content: 'Show more'; }
.dm-msg.dm-msg-expanded .dm-msg-expander::after { content: 'Show less'; }

/* session/roster line under the room name (render markup, existing payload) */
.dm-sidebar .dm-thread-sess {
  display: block;
  font-family: var(--pw-mono);
  font-size: 0.62rem;
  letter-spacing: 0.04em;
  color: var(--pw-dim);
  margin-top: 2px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* composer — hairline top, amber send */
.dm-sidebar .dm-compose,
#view-general .dm-compose {
  background: rgba(0,0,0,0.36);
  border-top: 1px solid var(--fleet-hair);
}
.dm-sidebar .dm-compose textarea,
#view-general .dm-compose textarea {
  background: rgba(255,255,255,0.05);
  border: 1px solid var(--fleet-hair);
}
.dm-sidebar .dm-compose textarea:focus,
#view-general .dm-compose textarea:focus { border-color: rgba(254,202,87,0.4); }
.dm-sidebar .dm-send,
#view-general .dm-send { color: var(--fleet-your-move); }
/* === /Chat DM Pit Wall reskin === */

/* === Terminal / tmux view — Pit Wall reskin (surface 2, PR: feature/pit-wall-terminal-frame) ===
   Steer render approved by Jase 2026-07-10 21:46 ("Ok merge it so I can see
   it") including both semantic calls: ACTIVE TAB red→amber and UPLOAD KEY
   red→amber (red = dead in the lights language — a red active tab reads as a
   dead pane), plus the context menu's blue glass → maroon panel. The token
   badges and pane lights already speak Pit Wall and are untouched. CSS-only.

   Selector scoping is REPARENTING-AWARE: the terminal toggle reparents
   #terminal-container + #special-keys into .dm-terminal-host (see the
   dm-terminal-layer comment in index.html), so those two travel by ID —
   an id selector follows the node to either home. .tmux-tabs/.chat-bar stay
   in #view-terminal and scope under it. .tab-context-menu is appended to
   document.body (floating chrome, tmux tabs are its only producer — tmux.js
   showTabMenu), so it cannot scope under the view and is restyled bare. */
#view-terminal .tmux-tabs {
  gap: 4px;
  padding: 6px 10px;
  background: rgba(0,0,0,0.28);
  border-bottom: 1px solid var(--fleet-hair);
}
#view-terminal .tmux-tab {
  font-family: var(--fleet-mono, 'SF Mono', 'Menlo', ui-monospace, monospace);
  background: rgba(255,255,255,0.015);
  border: 1px solid var(--fleet-hair);
  color: rgba(255,255,255,0.55);
}
#view-terminal .tmux-tab.active {
  background: rgba(254,202,87,0.12);
  border-color: rgba(254,202,87,0.35);
  color: var(--fleet-your-move);
}
#view-terminal .tmux-tab-add {
  background: rgba(46,213,115,0.12);
  border-color: rgba(46,213,115,0.3);
  color: var(--fleet-working);
}
#view-terminal .tmux-tab-clear {
  font-family: var(--fleet-text);
  letter-spacing: 1px;
  text-transform: uppercase;
  background: rgba(254,202,87,0.12);
  border-color: rgba(254,202,87,0.3);
}
/* token badges keep their heat tiers; mono digits for the telemetry voice */
#view-terminal .tmux-tab-bar {
  font-family: var(--fleet-mono, 'SF Mono', 'Menlo', ui-monospace, monospace);
}

/* (the #364 .tmux-tab-menu scoped maroon lived here — removed by the chrome
   pass: the BASE .tab-context-menu flip at the end of this file covers all
   three producers, the ratified anti-fork completion) */

/* special keys — travel with the node into .dm-terminal-host by ID scope */
#special-keys {
  background: rgba(0,0,0,0.36);
  border-top: 1px solid var(--fleet-hair);
  gap: 5px;
}
#special-keys .skey {
  background: rgba(255,255,255,0.05);
  border: 1px solid var(--fleet-hair);
}
#special-keys .skey-toggle.active {
  background: rgba(254,202,87,0.16);
  border-color: rgba(254,202,87,0.4);
  color: var(--fleet-your-move);
}
/* upload key: solid red → amber (action accent, not a status) */
#special-keys .skey-upload {
  background: rgba(254,202,87,0.16);
  border-color: rgba(254,202,87,0.4);
  color: var(--fleet-your-move);
}
#special-keys .skey-upload svg { stroke: var(--fleet-your-move); }

/* chat bar — same treatment as the DM composer (PR #359/#362) */
#view-terminal .chat-bar {
  background: rgba(0,0,0,0.36);
  border-top: 1px solid var(--fleet-hair);
}
#view-terminal .chat-bar textarea {
  background: rgba(255,255,255,0.05);
  border: 1px solid var(--fleet-hair);
  border-radius: 8px;
}
#view-terminal .chat-bar textarea:focus { border-color: rgba(254,202,87,0.4); }
#view-terminal .chat-bar-send { color: var(--fleet-your-move); }
/* === /Terminal Pit Wall reskin === */

/* === #general room — Pit Wall reskin (surface 3, PR: feature/pit-wall-general-room) ===
   Jase GO 2026-07-11 03:23 on the steer render as-shown, all three color calls
   riding: chain-link hover red→amber, amber mention chips (stronger tint on
   YOUR mention), amber rail on link cards. The Slack-style row mechanics —
   grouping, hover times, quote staging, unfurls, receipts — are untouched.
   Message bodies keep the app default font (standing body-font steer, #362).
   Shared .dm-compose / .dm-date-separator treatments are comma-extended in
   the surface-1 block above (one definition, two scopes); this section holds
   the general-ONLY treatments. All values are global tokens or literals —
   the --pw-* aliases are .dm-sidebar-scoped and do not resolve here. */
#view-general {
  /* the maroon pit-wall surface — same recipe as .sb-wrap / the Fleet board */
  background:
    repeating-linear-gradient(0deg, rgba(0,0,0,0.16) 0 1px, transparent 1px 3px),
    radial-gradient(1200px 500px at 15% -10%, rgba(120,26,26,0.55), transparent 60%),
    radial-gradient(900px 500px at 100% 0%, rgba(60,18,18,0.6), transparent 55%),
    linear-gradient(180deg, #2a1616 0%, #1f1111 100%);
}
/* the thread well — #general-thread carries .dm-thread, whose global rule
   still paints the old blue-black gradient (#0a0a14) over the maroon surface;
   give general the same darkened well the DM thread got in surface 1 */
#view-general .dm-thread {
  background:
    radial-gradient(900px 400px at 80% -10%, rgba(120,26,26,0.28), transparent 60%),
    linear-gradient(180deg, rgba(0,0,0,0.30) 0%, rgba(0,0,0,0.44) 100%);
}
#view-general .general-header {
  background: rgba(0,0,0,0.22);
  border-bottom: 1px solid var(--fleet-hair);
  padding-bottom: 10px;
}
#view-general .general-header h2 {
  font-family: var(--fleet-ink);
  font-weight: 900;
  font-size: 1.05rem;
  letter-spacing: 3px;
  text-transform: uppercase;
}
#view-general .general-header .general-hash { color: var(--fleet-your-move); }
/* sender names take the Choplin label voice; times take the mono chain */
#view-general .gen-msg-sender {
  font-family: var(--fleet-text);
  font-size: 0.74rem;
  font-weight: 600;
  letter-spacing: 0.09em;
  text-transform: uppercase;
}
#view-general .gen-msg-time,
#view-general .gen-msg-hovertime,
#view-general .general-receipt {
  font-family: var(--fleet-mono, 'SF Mono', 'Menlo', ui-monospace, monospace);
}
#view-general .gen-msg-time { font-size: 0.62rem; }
/* mention chips: amber chip, stronger tint when it is YOUR mention (Jase call) */
#view-general .gen-mention {
  background: rgba(254,202,87,0.16);
  color: var(--fleet-your-move);
  border-radius: 4px;
  padding: 0 4px;
}
#view-general .gen-mention-me {
  background: rgba(254,202,87,0.3);
  color: #fff;
}
/* link cards pick up the amber rail (Jase call) */
#view-general .gen-unfurl-card {
  border: 1px solid var(--fleet-hair);
  border-left: 3px solid var(--fleet-your-move);
}
/* chain-link quote hover: red → amber (red = dead in the status language) */
#view-general .gen-msg-link:hover { color: var(--fleet-your-move); }
/* #general ⋯ menu — desktop only: shift left of the chain-link button
   (.gen-msg-link at right:8px, 28px wide → ends at right:36px). 44px clears
   with an 8px gap. Mobile keeps the base 6px because .gen-msg-link is
   display:none there (styles.css:3448-3450).
   Child combinator (Q3 B fix): scope the shift to the ROW-LEVEL ⋯ only —
   it is a direct child of .gen-msg-row (createRow: row.appendChild(menuBtn)).
   The photo-grid per-TILE ⋯ also carries .dm-msg-menu but nests deeper
   (row > main > grid > tile > menu), and its own right:4px must win inside
   a ~240px tile; without the combinator this id-scoped rule (1,1,0) beat
   the tile rule (0,2,0) and pushed every tile ⋯ 44px inboard. */
@media (min-width: 769px) {
  #view-general .gen-msg-row > .dm-msg-menu { right: 44px; }
}
/* Hover-boost parity: #531 gives .dm-msg-menu opacity 0.85 on .dm-msg
   hover, but .gen-msg-row isn't a .dm-msg so that rule never fires here.
   Mirror the boost so the ⋯ is as discoverable on desktop hover as it is
   in the DM path. Touch (@media hover: none) already has its own 0.65 base.
   Child combinator (Q3 B): row-level ⋯ only — same collision as the
   right:44px rule above; without it, row-hover (0,3,0) beat the tile
   menu's base opacity:0 (0,2,0) and revealed every tile ⋯ at once instead
   of the per-tile hover reveal. */
.gen-msg-row:hover > .dm-msg-menu { opacity: 0.85; }
/* === Photo-burst grid (Q3 Part B) === */
/* Same-sender image runs (≤ GROUP_WINDOW_MS) collapse into ONE tile-grid
   inside a single .gen-msg-row. Server model unchanged — each tile carries
   its own data-msg-id and its own ⋯ menu; delete removes just the tile. */
.gen-msg-photo-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 4px;
  max-width: 480px;
  border-radius: 12px;
  overflow: hidden;
  margin-top: 4px;
}
.gen-msg-photo-grid-tile {
  position: relative;
  aspect-ratio: 1 / 1;
  overflow: hidden;
  cursor: pointer;
  background: rgba(255,255,255,0.04);
}
.gen-msg-photo-grid-tile > img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
/* Hide tiles beyond the 4th by default; expanded state (tap the +N badge)
   flips them back on. The 4th tile itself carries the +N overlay when the
   grid holds ≥ 5 images. */
.gen-msg-photo-grid > .gen-msg-photo-grid-tile:nth-child(n+5) { display: none; }
.gen-msg-photo-grid-expanded > .gen-msg-photo-grid-tile { display: block !important; }
.gen-msg-photo-grid-more::after {
  content: '+' attr(data-more-count);
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, 0.55);
  color: #fff;
  font-size: 1.5rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  pointer-events: none;
}
/* Per-tile ⋯ menu — smaller than the row-level one; anchored inside the
   tile, not the row. Base opacity mirrors the row rule (0 desktop, 0.65
   touch), with tile-hover reveal on desktop. */
.gen-msg-photo-grid-tile .gen-msg-photo-tile-menu {
  position: absolute;
  top: 4px;
  right: 4px;
  opacity: 0;
  background: rgba(0,0,0,0.45);
  color: #fff;
  border-radius: 4px;
  padding: 2px 6px;
  cursor: pointer;
  transition: opacity 0.15s;
  z-index: 2;
}
.gen-msg-photo-grid-tile:hover .gen-msg-photo-tile-menu { opacity: 0.9; }
@media (hover: none) { .gen-msg-photo-grid-tile .gen-msg-photo-tile-menu { opacity: 0.75; } }
/* === /#general Pit Wall reskin === */

/* === Files view — Pit Wall reskin (surface 4, PR: feature/pit-wall-files-view) ===
   Jase standing GO 2026-07-11 03:57 (per-surface word-wait retired; comms
   scope-gate passed for files). CSS-only, zero markup, behavior untouched.
   PRODUCER-GREP ran pre-commit: file-card/file-icon/file-name are ALSO
   produced by messages.js + general.js (DM attachment cards), and
   loc-chip/files-breadcrumb/files-empty by seven panel modules — so EVERY
   rule here scopes under #view-files. Foreign chips rendered INTO the files
   view (code-tree etc.) correctly take the skin; the same classes in other
   views are untouched. btn-accent + Code-chip green deliberately unchanged
   (final-chrome surface / already fleet-speak). */
#view-files {
  /* the maroon pit-wall surface — same recipe as the other Pit Wall views */
  background:
    repeating-linear-gradient(0deg, rgba(0,0,0,0.16) 0 1px, transparent 1px 3px),
    radial-gradient(1200px 500px at 15% -10%, rgba(120,26,26,0.55), transparent 60%),
    radial-gradient(900px 500px at 100% 0%, rgba(60,18,18,0.6), transparent 55%),
    linear-gradient(180deg, #2a1616 0%, #1f1111 100%);
}
#view-files .view-header {
  background: rgba(0,0,0,0.22);
  border-bottom: 1px solid var(--fleet-hair);
  padding-bottom: 12px;
}
#view-files .view-header h2 {
  font-family: var(--fleet-ink);
  font-weight: 900;
  font-size: 1.05rem;
  letter-spacing: 3px;
  text-transform: uppercase;
}
/* location chips — hairline panel pills; the active/current one reads amber
   via aria-current set by renderLocations? no — active state is navigational
   only; chips restyle uniformly and the Code chip keeps its green */
#view-files .loc-chip {
  background: rgba(255,255,255,0.05);
  border: 1px solid var(--fleet-hair);
  font-family: var(--fleet-text);
}
#view-files .loc-chip-code { border-color: rgba(46,213,115,0.4); color: var(--fleet-working); }
/* breadcrumb — the telemetry strip: mono path, amber current crumb */
#view-files .files-breadcrumb {
  background: rgba(0,0,0,0.3);
  border-top: 1px solid var(--fleet-hair);
  border-bottom: 1px solid var(--fleet-hair);
}
#view-files .bc-up {
  background: rgba(255,255,255,0.05);
  border: 1px solid var(--fleet-hair);
}
#view-files .bc-segment,
#view-files .bc-sep {
  font-family: var(--fleet-mono, 'SF Mono', 'Menlo', ui-monospace, monospace);
  font-size: 0.72rem;
}
/* current location — overrides the existing :last-child white at L630 */
#view-files .bc-segment:last-child { color: var(--fleet-your-move); }
/* file cards — hairline panels, Choplin names, mono meta */
#view-files .file-card {
  background: rgba(255,255,255,0.04);
  border: 1px solid var(--fleet-hair);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}
#view-files .file-card:active { background: rgba(255,255,255,0.08); }
#view-files .file-name { font-family: var(--fleet-text); font-weight: 500; }
#view-files .file-meta {
  font-family: var(--fleet-mono, 'SF Mono', 'Menlo', ui-monospace, monospace);
  font-size: 0.65rem;
  letter-spacing: 0.04em;
}
/* upload progress — attention is amber, not danger */
#view-files .files-upload-progress {
  background: rgba(0,0,0,0.3);
  border-top: 1px solid var(--fleet-hair);
}
#view-files .files-upload-fill {
  background: var(--fleet-your-move);
  box-shadow: 0 0 8px rgba(254,202,87,0.5);
}
#view-files .files-upload-progress span {
  font-family: var(--fleet-mono, 'SF Mono', 'Menlo', ui-monospace, monospace);
}
/* === /Files Pit Wall reskin === */

/* === Ops-feed + Orch-log panels — Pit Wall reskin (surface 5, PR: feature/pit-wall-panels) ===
   Blanket-GO lane (Jase 2026-07-11; comms scope-gate ran RETROACTIVELY at
   merge review — this surface built straight to eval, a lane miss; the gate
   passed after the fact, msgId 0754b3eb). The org/goals
   half of this surface audit came back ALREADY Pit Wall — the Fleet board is
   the reference implementation — so this PR covers the two DM-cover panels
   that kept their blue glass through surface 1. Producer-grep: every class
   below has exactly one producer (messages.js) + the static index.html
   markup; scoped under .dm-sidebar where the panels live regardless.
   CSS-only except one flagged test-seam line in messages.js. */
.dm-sidebar .dm-ops-feed-panel {
  /* same darkened well as the DM thread — the panel covers it in place */
  background:
    radial-gradient(900px 400px at 80% -10%, rgba(120,26,26,0.28), transparent 60%),
    linear-gradient(180deg, #241414 0%, #1a0e0e 100%);
}
.dm-sidebar .dm-ops-feed-header {
  border-bottom: 1px solid var(--pw-line);
  background: rgba(0,0,0,0.22);
}
.dm-sidebar .dm-ops-feed-title {
  font-family: var(--fleet-text);
  font-weight: 600;
  font-size: 0.72rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}
.dm-sidebar .dm-ops-feed-status { font-family: var(--pw-mono); font-size: 0.62rem; }
.dm-sidebar .ops-feed-item {
  background: var(--pw-panel);
  border: 1px solid var(--pw-line);
}
.dm-sidebar .ops-feed-room,
.dm-sidebar .ops-feed-ts,
.dm-sidebar .orch-log-detail { font-family: var(--pw-mono); }
/* verdict chips onto the fleet status language: escalated/routed = amber
   attention (was off-fleet #ffb400), untriaged = cool waiting gray (was
   off-palette blue #5aa0ff), idle/fixed stays muted */
.dm-sidebar .ops-feed-verdict.escalated,
.dm-sidebar .ops-feed-verdict.routed {
  background: rgba(254,202,87,0.18);
  color: var(--pw-amber);
}
.dm-sidebar .ops-feed-verdict.untriaged {
  background: rgba(143,138,147,0.18);
  color: var(--fleet-waiting);
}
/* === /panels Pit Wall reskin === */

/* === Lock + Login — Pit Wall reskin (surface 6, PR: feature/pit-wall-lock-login) ===
   Comms scope-gate PASS 2026-07-11 05:30 (msgId 6fb970d3, pre-code this
   round) with all five calls ratified on the record: Campione over
   gradient-text, amber focus + PIN fill (progress not death), ERROR MESSAGES
   KEEP RED (wrong-PIN is honest failure feedback — ratified, not assumed),
   btn-accent deferred to the chrome pass, and the reduced-motion guard on
   the shake ratified as an a11y baseline riding the motion styling.
   HARD BOUNDARY held: zero JS this round — auth surface, no seams.
   Producer-grep: login-* static markup + auth.js/users.js state flips on the
   same elements; lock-* built solely by lock.js buildOverlay. No cross-
   surface class sharing; rules scope under the two fixed-position roots. */
.login-screen {
  background:
    repeating-linear-gradient(0deg, rgba(0,0,0,0.16) 0 1px, transparent 1px 3px),
    radial-gradient(1200px 500px at 15% -10%, rgba(120,26,26,0.55), transparent 60%),
    radial-gradient(900px 500px at 100% 0%, rgba(60,18,18,0.6), transparent 55%),
    linear-gradient(180deg, #2a1616 0%, #1f1111 100%);
}
.login-title {
  /* Campione display voice replaces the red-yellow gradient text */
  font-family: var(--fleet-ink);
  font-weight: 900;
  font-size: 1.3rem;
  letter-spacing: 4px;
  text-transform: uppercase;
  background: none;
  -webkit-background-clip: unset;
  -webkit-text-fill-color: unset;
  background-clip: unset;
  color: var(--text-primary);
}
.login-subtitle { font-family: var(--fleet-text); }
.login-screen input {
  background: rgba(255,255,255,0.05);
  border: 1px solid var(--fleet-hair);
  font-family: var(--fleet-mono, 'SF Mono', 'Menlo', ui-monospace, monospace);
}
.login-screen input:focus {
  border-color: rgba(254,202,87,0.5);
  box-shadow: 0 0 0 1px rgba(254,202,87,0.2);
}
.login-toggle:active { color: var(--fleet-your-move); }
/* login-error keeps its red — ratified: failure feedback, not a status lamp */

.lock-card {
  background:
    radial-gradient(400px 200px at 50% -20%, rgba(120,26,26,0.4), transparent 70%),
    linear-gradient(180deg, #2a1616 0%, #1f1111 100%);
  border: 1px solid var(--fleet-hair);
}
.lock-title {
  font-family: var(--fleet-ink);
  font-weight: 900;
  font-size: 1.15rem;
  letter-spacing: 3px;
  text-transform: uppercase;
}
.lock-sub { font-family: var(--fleet-text); }
.lock-box {
  border-color: rgba(255,255,255,0.25);
  background: rgba(0,0,0,0.25);
}
/* PIN fill: progress, not death — amber over the old accent-red */
.lock-box.filled { border-color: var(--fleet-your-move); }
.lock-box.filled::after {
  background: var(--fleet-your-move);
  box-shadow: 0 0 8px rgba(254,202,87,0.5);
}
.lock-msg {
  font-family: var(--fleet-mono, 'SF Mono', 'Menlo', ui-monospace, monospace);
  font-size: 0.7rem;
  letter-spacing: 0.08em;
}
/* lock-msg-err keeps its red — same ratified call as login-error */
/* a11y baseline (ratified): the shake never had a reduced-motion guard */
@media (prefers-reduced-motion: reduce) {
  .lock-shake { animation: none; }
}
/* === /Lock + Login Pit Wall reskin === */

/* === Channels view — Pit Wall reskin (surface: view-sessions, PR: feature/pit-wall-channels) ===
   Comms scope-gate PASS pre-code 2026-07-11 06:33 (msgId 6a1d9ad5), all five
   calls ratified: active-room amber, mono member line, tx pill onto fleet
   amber, power-stop hover KEEPS red (destructive affordance — honest-alarm
   family), and the 6 channels context menus DEFERRED to the chrome pass
   (base .tab-context-menu flips maroon globally there — the anti-fork
   inversion of #364's per-surface scoping class). Producer-grep: every
   channel- and tx- class single-producer (channels.js). CSS-only, scoped
   under #view-sessions. */
#view-sessions {
  background:
    repeating-linear-gradient(0deg, rgba(0,0,0,0.16) 0 1px, transparent 1px 3px),
    radial-gradient(1200px 500px at 15% -10%, rgba(120,26,26,0.55), transparent 60%),
    radial-gradient(900px 500px at 100% 0%, rgba(60,18,18,0.6), transparent 55%),
    linear-gradient(180deg, #2a1616 0%, #1f1111 100%);
}
#view-sessions .view-header {
  background: rgba(0,0,0,0.22);
  border-bottom: 1px solid var(--fleet-hair);
  padding-bottom: 12px;
}
#view-sessions .view-header h2 {
  font-family: var(--fleet-ink);
  font-weight: 900;
  font-size: 1.05rem;
  letter-spacing: 3px;
  text-transform: uppercase;
}
/* section micro-labels — Choplin semibold, wide tracking */
#view-sessions .channel-section-header {
  font-weight: 600;
  letter-spacing: 0.2em;
  color: rgba(255,255,255,0.42);
}
#view-sessions .channel-section-add {
  background: rgba(255,255,255,0.05);
  border: 1px solid var(--fleet-hair);
}
/* rows — hairline cards; the ACTIVE room reads amber (ratified) */
#view-sessions .channel-row {
  border: 1px solid transparent;
}
#view-sessions .channel-row:active,
#view-sessions .channel-row:hover {
  background: rgba(255,255,255,0.05);
  border-color: var(--fleet-hair);
}
#view-sessions .channel-active {
  background: rgba(254,202,87,0.08);
  border-color: rgba(254,202,87,0.25);
}
#view-sessions .channel-active .channel-name {
  color: var(--fleet-your-move);
}
/* member/session line — mono telemetry voice (ratified) */
#view-sessions .channel-members {
  font-family: var(--fleet-mono, 'SF Mono', 'Menlo', ui-monospace, monospace);
  font-size: 0.68rem;
  letter-spacing: 0.04em;
}
/* online dot gains the fleet glow; offline/unhealthy/sleep dots untouched */
#view-sessions .channel-online-dot {
  background: var(--fleet-working);
  box-shadow: 0 0 5px rgba(46,213,115,0.6);
}
/* power-stop hover KEEPS red — destructive affordance (ratified) */
/* tx episode pill: off-fleet #fbbf24 → fleet amber */
#view-sessions .tx-status-pill { font-family: var(--fleet-text); }
#view-sessions .tx-status-in-progress { color: var(--fleet-your-move); }
/* === /Channels Pit Wall reskin === */

/* === Calendar view — Pit Wall reskin (surface: view-calendar, PR: feature/pit-wall-calendar) ===
   Comms scope-gate PASS pre-code 2026-07-11 07:08 (msgId 8e4c167a). Ratified:
   today-cell/mode-toggle/layer-checkbox reds → amber (today is attention, not
   death), Campione month title, mono date telemetry, hairline cells — AND the
   categorical DATA LEGEND (platform + lifecycle pill colors) KEPT unchanged,
   now canon: status semantics govern panes and processes; content taxonomy
   keeps its own tell-apart legend. Preserving those pills is a pass
   condition. Drilldown modal deferred to the chrome pass. Producer-grep:
   cal- classes single-surface (calendar.js + this view's static markup).
   CSS-only, scoped under #view-calendar. */
#view-calendar {
  background:
    repeating-linear-gradient(0deg, rgba(0,0,0,0.16) 0 1px, transparent 1px 3px),
    radial-gradient(1200px 500px at 15% -10%, rgba(120,26,26,0.55), transparent 60%),
    radial-gradient(900px 500px at 100% 0%, rgba(60,18,18,0.6), transparent 55%),
    linear-gradient(180deg, #2a1616 0%, #1f1111 100%);
}
#view-calendar .cal-header {
  background: rgba(0,0,0,0.22);
  border-bottom: 1px solid var(--fleet-hair);
  padding-bottom: 10px;
}
#view-calendar .cal-header h2 {
  font-family: var(--fleet-ink);
  font-weight: 900;
  font-size: 1.05rem;
  letter-spacing: 3px;
  text-transform: uppercase;
}
#view-calendar .cal-nav,
#view-calendar .cal-today-btn {
  background: rgba(255,255,255,0.05);
  border: 1px solid var(--fleet-hair);
}
#view-calendar .cal-mode-toggle {
  background: var(--fleet-panel-2, rgba(255,255,255,0.015));
  border: 1px solid var(--fleet-hair);
}
/* active mode: red → amber */
#view-calendar .cal-mode-btn.active {
  background: rgba(254,202,87,0.16);
  color: var(--fleet-your-move);
}
/* telemetry voices */
#view-calendar .cal-weekday,
#view-calendar .cal-cell-date,
#view-calendar .cal-chip-time,
#view-calendar .cal-list-when {
  font-family: var(--fleet-mono);
}
#view-calendar .cal-weekday { letter-spacing: 1.5px; }
/* day cells: hairline panels; TODAY reads amber (attention, not death) */
#view-calendar .cal-cell {
  background: var(--fleet-panel, rgba(255,255,255,0.04));
  border: 1px solid var(--fleet-hair);
}
#view-calendar .cal-cell-empty { background: transparent; border-color: transparent; }
#view-calendar .cal-cell-today {
  border-color: rgba(254,202,87,0.5);
  background: rgba(254,202,87,0.07);
}
#view-calendar .cal-cell-today .cal-cell-date { color: var(--fleet-your-move); }
/* upcoming list rows: hairline panels */
#view-calendar .cal-list-row {
  background: var(--fleet-panel, rgba(255,255,255,0.04));
  border: 1px solid var(--fleet-hair);
}
/* layers menu: maroon panel replaces glass; checkbox accent red → amber */
#view-calendar .cal-layers-menu {
  background: #241414;
  border: 1px solid var(--fleet-hair);
  backdrop-filter: none;
}
#view-calendar .cal-layer-opt input { accent-color: var(--fleet-your-move); }
/* the categorical legend (cal-platform-*, cal-status-*) is DELIBERATELY
   untouched — ratified canon, see the section header */
/* === /Calendar Pit Wall reskin === */

/* === The last five views — Pit Wall batch (PR: feature/pit-wall-small-views) ===
   Activity, Quick Actions, Clipboard, System, Notes. Comms scope-gate PASS
   2026-07-11 07:20 (msgId 3ba826b4), ticked against the FIVE container IDs
   by both evals (the four-view miscount died at the gate). One PR under the
   comms condition: per-view scoping ONLY — ZERO .card rules, ZERO btn-accent
   (both chrome-pass); System/Notes/Clipboard card bodies deliberately keep
   the old chrome until then, exactly as the render's dashed ghosts showed. */

/* --- shared surface + header treatment, comma-listed across the five
       containers (one definition, five explicit scopes — not a bare widen) --- */
#view-activity, #view-actions, #view-clipboard, #view-system, #view-build-notes {
  background:
    repeating-linear-gradient(0deg, rgba(0,0,0,0.16) 0 1px, transparent 1px 3px),
    radial-gradient(1200px 500px at 15% -10%, rgba(120,26,26,0.55), transparent 60%),
    radial-gradient(900px 500px at 100% 0%, rgba(60,18,18,0.6), transparent 55%),
    linear-gradient(180deg, #2a1616 0%, #1f1111 100%);
}
#view-activity .view-header, #view-actions .view-header, #view-clipboard .view-header,
#view-system .view-header, #view-build-notes .view-header {
  background: rgba(0,0,0,0.22);
  border-bottom: 1px solid var(--fleet-hair);
  padding-bottom: 12px;
}
#view-activity .view-header h2, #view-actions .view-header h2, #view-clipboard .view-header h2,
#view-system .view-header h2, #view-build-notes .view-header h2 {
  font-family: var(--fleet-ink);
  font-weight: 900;
  font-size: 1.05rem;
  letter-spacing: 3px;
  text-transform: uppercase;
}

/* --- Activity: reuses the SHARED dm-convo classes (activity.js) — per-view
       scoping here is mandatory CORRECTNESS, not preference: a bare rule
       would restyle the DM sidebar (comms gate note) --- */
#view-activity .dm-convo-item {
  border: 1px solid transparent;
  border-radius: 6px;
}
#view-activity .dm-convo-item:hover,
#view-activity .dm-convo-item:active {
  background: rgba(255,255,255,0.05);
  border-color: var(--fleet-hair);
}
#view-activity .dm-convo-time {
  font-family: var(--fleet-mono);
  font-size: 10px;
}

/* --- Quick Actions: hairline panels (blur off); output joins the mono chain --- */
#view-actions .action-btn {
  background: var(--fleet-panel, rgba(255,255,255,0.04));
  border: 1px solid var(--fleet-hair);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}
#view-actions .action-btn:active {
  background: rgba(254,202,87,0.1);
  border-color: rgba(254,202,87,0.3);
}
#view-actions .action-output {
  background: rgba(0,0,0,0.4);
  border: 1px solid var(--fleet-hair);
}
#view-actions .action-output-header {
  font-family: var(--fleet-text);
  font-size: 0.7rem;
  letter-spacing: 1px;
  text-transform: uppercase;
  border-bottom: 1px solid var(--fleet-hair);
}
#view-actions .action-output pre { font-family: var(--fleet-mono); }

/* --- Clipboard: search input hairline; focus red → amber (same call as login) --- */
#view-clipboard .clipboard-search input {
  background: var(--fleet-panel, rgba(255,255,255,0.05));
  border: 1px solid var(--fleet-hair);
}
#view-clipboard .clipboard-search input:focus {
  border-color: rgba(254,202,87,0.5);
}

/* --- System: hostname badge goes mono telemetry --- */
#view-system .badge {
  font-family: var(--fleet-mono);
  letter-spacing: 0.06em;
}
/* === /last five views Pit Wall batch === */

/* === The chrome pass — Pit Wall finale (PR: feature/pit-wall-chrome) ===
   The last surface. Comms scope-gate PASS 2026-07-11 07:39 (msgId 4a40970f),
   every call ratified as rendered. This is the ONE PR allowed to restyle the
   shared chrome classes every prior surface deferred — the deferrals were the
   discipline, this is the payoff. Fleet-wide clearance bar: every prior
   surface harness re-drives. One declared JS touch: the one-token removal of
   the #364 tmux-tab-menu scoping class (anti-fork completion — the base menu
   flip below makes it redundant). Danger/error reds and data-legend colors
   stay, per canon. Consumes tokens, never defines. */

/* --- btn-accent: the legacy red-yellow gradient WAS the old accent language;
       solid amber with dark ink IS the pit wall. Jase's amber-family-gradient
       alternative stays a one-rule swap if he calls it on the walkthrough. --- */
.btn-accent {
  background: var(--fleet-your-move);
  color: #1f1111;
  font-weight: 700;
  box-shadow: 0 0 14px rgba(254,202,87,0.25);
}
.btn-cancel {
  background: var(--fleet-panel);
  border: 1px solid var(--fleet-hair);
}

/* --- app header: gradient-text out, Campione in; maroon strip --- */
.app-header {
  background: linear-gradient(180deg, #2a1616 0%, #1f1111 100%);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  border-bottom: 1px solid var(--fleet-hair);
}
.app-header h1 {
  font-family: var(--fleet-ink);
  font-weight: 900;
  font-size: 0.95rem;
  letter-spacing: 3px;
  text-transform: uppercase;
  background: none;
  -webkit-background-clip: unset;
  -webkit-text-fill-color: unset;
  background-clip: unset;
  color: var(--text-primary);
}

/* --- bottom nav: blue-black out, maroon in; active red → amber --- */
.bottom-nav {
  background: linear-gradient(0deg, #1a0e0e 0%, #241414 100%);
  border-top: 1px solid var(--fleet-hair);
}
.nav-btn.active { color: var(--fleet-your-move); }

/* --- main backdrop: every view transition sits on the pit surface --- */
main {
  background:
    repeating-linear-gradient(0deg, rgba(0,0,0,0.16) 0 1px, transparent 1px 3px),
    linear-gradient(180deg, #2a1616 0%, #1f1111 100%);
}

/* --- the shared card system: glass out, hairline panel in. This lights up
       the System/Notes/Clipboard bodies that ghosted in the batch PR. --- */
.card {
  background: var(--fleet-panel);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  border: 1px solid var(--fleet-hair);
}

/* --- every modal in one rule; titles take the display voice --- */
.modal {
  background: linear-gradient(180deg, #2a1616 0%, #1f1111 100%);
  border: 1px solid var(--fleet-hair);
}
.modal h3 {
  font-family: var(--fleet-ink);
  font-weight: 900;
  font-size: 0.95rem;
  letter-spacing: 2px;
  text-transform: uppercase;
}

/* --- context menus: the BASE class flips maroon — tmux, channels and the DM
       attach menu land together (the #364 per-surface scope comes out; its
       rule below is deleted in this same diff) --- */
.tab-context-menu {
  background: #241414;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  border: 1px solid var(--fleet-hair);
}

/* --- dropdowns + toasts: maroon panels; error rails keep red per canon --- */
.notif-dropdown,
.profile-dropdown,
.dm-mention-dropdown {
  background: #241414;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  border: 1px solid var(--fleet-hair);
}
.gen-toast {
  background: #241414;
  border: 1px solid var(--fleet-hair);
  border-left: 3px solid var(--fleet-working);
}
.gen-toast.gen-toast-error { border-left-color: var(--fleet-dead); }

/* --- remaining red chrome accents → amber (focus rings; danger buttons keep
       their red — honest-alarm canon) --- */
.dm-bot-detail-header:focus-visible { outline-color: var(--fleet-your-move); }
/* === /chrome pass === */

