/* Session status row at the top */
  .floor-status-row {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--sp-4);
    margin-bottom: var(--sp-5);
  }
  @media (max-width: 700px) { .floor-status-row { grid-template-columns: 1fr; } }
  .floor-chamber-card {
    background: var(--paper);
    border: 1px solid var(--ink-200);
    border-radius: var(--r-lg);
    padding: var(--sp-4) var(--sp-5);
    display: flex;
    align-items: center;
    gap: var(--sp-3);
  }
  .floor-chamber-card .dot {
    width: 12px; height: 12px; border-radius: 50%;
    background: var(--ink-400);
    flex-shrink: 0;
  }
  .floor-chamber-card .dot.is-on {
    background: #16A34A;
    box-shadow: 0 0 0 4px rgba(22, 163, 74, 0.18);
    animation: oa-pulse 2s ease-in-out infinite;
  }
  .floor-chamber-card .body { flex: 1; min-width: 0; }
  .floor-chamber-card h2,
  .floor-chamber-card h3 {
    margin: 0 0 4px;
    font-size: var(--fs-lg);
    color: var(--ink-900);
  }
  .floor-chamber-card .meta {
    color: var(--ink-600);
    font-size: var(--fs-sm);
    margin: 0;
  }
  .floor-chamber-card .live-btn {
    background: var(--live-accent);
    color: var(--always-white);
    padding: 6px 12px;
    border-radius: var(--r-md);
    font-weight: 700;
    font-size: var(--fs-sm);
    text-decoration: none;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    flex-shrink: 0;
  }
  .floor-chamber-card .live-btn:hover { background: var(--live-fg); color: var(--always-white); text-decoration: none; }
  .floor-chamber-card .live-btn { border: none; cursor: pointer; }
  .floor-chamber-card .live-btn-secondary {
    background: transparent;
    color: var(--live-accent);
    border: 1px solid var(--live-accent);
    padding: 6px 9px;
  }
  .floor-chamber-card .live-btn-secondary:hover {
    background: var(--live-accent);
    color: var(--always-white);
  }

  /* House live embed — 16:9 responsive iframe, full row width.
     Sits between the status row and the floor narrative tabs.
     Rendered inline whenever the House is in session; the Hide
     stream button can collapse it. */
  .live-embed {
    position: relative;
    width: 100%;
    margin: var(--sp-4) 0;
    border-radius: var(--r-md);
    overflow: hidden;
    background: #000;
    aspect-ratio: 16 / 9;
    max-height: 70vh;
  }
  .live-embed iframe {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    border: 0;
  }

  /* Two-column body */
  .floor-cols {
    display: grid;
    grid-template-columns: 1.4fr 1fr;
    gap: var(--sp-5);
  }
  @media (max-width: 900px) { .floor-cols { grid-template-columns: 1fr; } }

  /* Schedule items */
  .schedule-section { margin-bottom: var(--sp-5); }
  .schedule-section h3 {
    font-size: var(--fs-sm);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--ink-500);
    margin: 0 0 var(--sp-3);
    font-weight: 700;
  }
  .schedule-item {
    display: grid;
    grid-template-columns: 110px 1fr;
    gap: var(--sp-3);
    padding: var(--sp-3) var(--sp-4);
    border-bottom: 1px solid var(--ink-100);
    text-decoration: none;
    color: inherit;
  }
  .schedule-item:last-child { border-bottom: 0; }
  .schedule-item:hover { background: var(--ink-50); text-decoration: none; color: inherit; }
  .schedule-item .label {
    font-family: var(--font-mono);
    background: var(--ink-100);
    color: var(--ink-700);
    padding: 2px 8px;
    border-radius: var(--r-sm);
    font-size: 0.8rem;
    align-self: start;
  }
  .schedule-item .title { font-weight: 600; color: var(--ink-900); line-height: 1.4; }

  /* Live floor action stream */
  .floor-stream {
    background: var(--paper);
    border: 1px solid var(--ink-200);
    border-radius: var(--r-lg);
    overflow: hidden;
  }
  .floor-stream-head {
    padding: var(--sp-3) var(--sp-4);
    background: var(--ink-50);
    border-bottom: 1px solid var(--ink-200);
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    font-weight: 700;
  }
  .floor-stream-head .live-pill {
    background: var(--live-accent);
    color: var(--always-white);
    padding: 2px 8px;
    border-radius: var(--r-full);
    font-size: 0.6rem;
    font-weight: 800;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    margin-left: auto;
  }
  .floor-stream-body { max-height: 600px; overflow-y: auto; }
  .floor-action {
    display: grid;
    grid-template-columns: 100px 1fr;
    gap: var(--sp-3);
    padding: var(--sp-3) var(--sp-4);
    border-bottom: 1px solid var(--ink-100);
    font-size: var(--fs-sm);
  }
  .floor-action:last-child { border-bottom: 0; }
  .floor-action .time {
    font-family: var(--font-mono);
    font-size: 0.75rem;
    color: var(--ink-500);
    white-space: nowrap;
  }
  .floor-action .desc { color: var(--ink-800); line-height: 1.5; }

  /* Premium teaser — kept as a backward-compat alias of the unified
     .nudge component in theme.css. New surfaces should use
     <div class="nudge nudge--inline"> directly. */
  .tier-nudge {
    background: linear-gradient(90deg, var(--civic-amber-soft) 0%, var(--paper) 100%);
    border: 1px solid rgba(212, 175, 55, 0.4);
    border-left: 4px solid var(--civic-amber);
    border-radius: var(--r-md);
    padding: var(--sp-3) var(--sp-4);
    font-size: var(--fs-sm);
    color: var(--ink-700);
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    margin-bottom: var(--sp-4);
  }
  .tier-nudge i { color: var(--civic-amber); }
  .tier-nudge a { color: var(--civic-amber); font-weight: 700; }

  /* ---- Live floor-activity narrative timeline -------------------------
     Rendered between the chamber status cards and the weekly schedule
     grid on /floor/. Each entry has a timestamp, an optional bill chip,
     and the clerk's plain-English narrative. */
  .floor-narrative {
    margin: var(--sp-5) 0;
  }
  .floor-narrative h2 {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-size: clamp(1.15rem, 2.2vw, 1.4rem);
    margin: 0 0 var(--sp-3);
  }
  .floor-narrative h2 .live-dot.is-on {
    background: var(--live-accent);
    box-shadow: 0 0 0 4px var(--live-pulse-soft);
    animation: floor-pulse 1.6s ease-in-out infinite;
  }
  .floor-narrative h2 .floor-narrative-meta {
    font-size: 0.78rem;
    font-weight: 500;
    margin-left: 0.4rem;
    color: var(--ink-500);
  }
  .floor-narrative-list {
    list-style: none;
    padding: 0;
    margin: 0;
    display: grid;
    gap: 0.55rem;
  }
  .floor-narrative-item {
    padding: 0.75rem 1rem;
    background: var(--paper);
    border: 1px solid var(--ink-200);
    border-left: 2px solid var(--live-border-soft);
    border-radius: 4px;
    display: grid;
    grid-template-columns: auto 1fr;
    gap: 0.8rem;
    align-items: start;
    color: var(--ink-900);
  }
  .floor-narrative-time {
    font-family: var(--font-mono, ui-monospace, monospace);
    font-size: 0.82rem;
    color: var(--ink-500);
    white-space: nowrap;
    padding-top: 0.1rem;
  }
  .floor-narrative-bill {
    font-weight: 700;
    color: var(--live-fg);
    text-decoration: none;
    margin-right: 0.35rem;
  }
  .floor-narrative-bill:hover { text-decoration: underline; }
  /* Bill references linkified inside a floor description (a rule that bundles
     several bills) — read as clickable within the prose. */
  .floor-bill-ref {
    color: var(--live-fg);
    font-weight: 600;
    text-decoration: underline;
    text-underline-offset: 2px;
  }
  .floor-bill-ref:hover { opacity: 0.82; }
  .floor-narrative-sep {
    color: var(--ink-500);
    margin-right: 0.35rem;
  }
  .floor-narrative-desc {
    font-size: 0.92rem;
    line-height: 1.5;
    color: var(--ink-800);
  }
  .floor-detail-footer {
    font-size: 0.85em;
    color: var(--ink-500);
  }
  @keyframes floor-pulse {
    0%, 100% { box-shadow: 0 0 0 4px var(--live-pulse-soft); }
    50%      { box-shadow: 0 0 0 8px var(--live-pulse-fade); }
  }

  /* New floor-narrative item arriving from the live poller. Slides down
     from above and fades up while the left rail flashes the live red,
     then settles back to the default look (the .is-new class is removed
     by the JS ~1.8s after insert). */
  .floor-narrative-item.is-new {
    animation: floor-narrative-arrive 1.2s var(--ease, ease-out) both;
    border-left-color: var(--live-accent);
  }
  @keyframes floor-narrative-arrive {
    0%   { opacity: 0; transform: translateY(-6px); background: var(--live-bg-soft); }
    60%  { opacity: 1; transform: translateY(0); background: var(--live-bg-soft); }
    100% { opacity: 1; transform: translateY(0); background: var(--paper); }
  }
  @media (prefers-reduced-motion: reduce) {
    .floor-narrative-item.is-new { animation: none; }
  }

  /* House (narrative) + Senate (recent votes) layout.
     - Desktop (>=980px): side-by-side columns, tabs hidden.
     - Mobile (<980px):   stacked, with tabs above; only the active
       chamber's section is visible. CSS-only via :checked sibling
       selectors — no JS needed. */
  .floor-narrative-tabwrap { margin: var(--sp-5) 0; }
  .floor-narrative-cols {
    display: grid;
    gap: var(--sp-5);
    grid-template-columns: 1fr;
  }
  @media (min-width: 980px) {
    .floor-narrative-cols { grid-template-columns: 1.2fr 1fr; }
  }
  .floor-narrative-cols .floor-narrative { margin: 0; }

  /* Tabs: visually-hidden radios drive everything via :checked. */
  .floor-tab-radio {
    position: absolute;
    width: 1px; height: 1px;
    padding: 0; margin: -1px; overflow: hidden;
    clip: rect(0 0 0 0); border: 0;
  }
  .floor-narrative-tabs {
    display: none;            /* desktop hides the tabs entirely */
    gap: var(--sp-2);
    margin-bottom: var(--sp-3);
    border-bottom: 1px solid var(--ink-200);
  }
  .floor-narrative-tab {
    flex: 1;
    text-align: center;
    padding: var(--sp-3) var(--sp-3);
    cursor: pointer;
    font-weight: 600;
    color: var(--ink-600);
    border-bottom: 2px solid transparent;
    margin-bottom: -1px;
    transition: color var(--t-fast) var(--ease),
                border-color var(--t-fast) var(--ease);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.4rem;
  }

  @media (max-width: 979.98px) {  /* mirror the >=980px column rule; 992 left a blank 2nd column in the 980–992px band */
    /* On mobile show the tabs and hide both chamber sections by default.
       The :checked radio that comes before .floor-narrative-cols in the
       DOM flips the matching [data-chamber] back on. */
    .floor-narrative-tabs { display: flex; }
    .floor-narrative-cols [data-chamber] { display: none; }
    #floor-tab-house:checked  ~ .floor-narrative-cols [data-chamber="house"]  { display: block; }
    #floor-tab-senate:checked ~ .floor-narrative-cols [data-chamber="senate"] { display: block; }
    /* Active-tab indicator: blue underline + ink-900 text. */
    #floor-tab-house:checked  ~ .floor-narrative-tabs label[for="floor-tab-house"],
    #floor-tab-senate:checked ~ .floor-narrative-tabs label[for="floor-tab-senate"] {
      color: var(--ink-900);
      border-bottom-color: var(--civic-blue);
    }
    /* Keyboard focus ring on whichever label corresponds to the focused radio. */
    .floor-tab-radio:focus-visible ~ .floor-narrative-tabs label {
      outline: none;
    }
    #floor-tab-house:focus-visible  ~ .floor-narrative-tabs label[for="floor-tab-house"],
    #floor-tab-senate:focus-visible ~ .floor-narrative-tabs label[for="floor-tab-senate"] {
      outline: 2px solid var(--civic-blue);
      outline-offset: 2px;
    }
  }

  .floor-narrative-disclaimer {
    font-size: 0.85rem;
    line-height: 1.55;
    color: var(--ink-600);
    background: var(--ink-50);
    border: 1px solid var(--ink-200);
    border-left: 3px solid var(--ink-300);
    border-radius: 4px;
    padding: 0.55rem 0.85rem;
    margin: 0 0 var(--sp-3);
  }
  .floor-narrative-disclaimer a { color: var(--civic-blue); }

  .floor-narrative-tally {
    font-family: var(--font-mono, ui-monospace, monospace);
    font-size: 0.85rem;
    color: var(--ink-700);
    margin-left: 0.35rem;
  }

  .floor-narrative-empty {
    font-size: 0.92rem;
    color: var(--ink-500);
    background: var(--paper);
    border: 1px dashed var(--ink-200);
    border-radius: 4px;
    padding: 0.85rem 1rem;
    margin: 0;
  }

  /* Small "Updated 10:42 AM" badge that the live poller refreshes after
     each successful tick. Sits next to the narrative heading. */
  .floor-live-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    font-family: var(--font-mono, ui-monospace, monospace);
    font-size: 0.72rem;
    font-weight: 500;
    color: var(--ink-500);
    margin-left: 0.5rem;
  }
  .floor-live-badge::before {
    content: '';
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: var(--live-accent);
    box-shadow: 0 0 0 3px var(--live-pulse-soft);
    animation: floor-pulse 1.6s ease-in-out infinite;
  }
  @media (prefers-reduced-motion: reduce) {
    .floor-live-badge::before { animation: none; }
  }
  @media (prefers-reduced-motion: reduce) {
    .floor-narrative h2 .live-dot.is-on { animation: none; }
  }

.floor-group-header {
  padding: var(--sp-2) var(--sp-4);
  background: var(--ink-50);
  font-size: var(--fs-xs);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--ink-500);
}
.floor-schedule-default { cursor: default; }
.floor-empty-card {
  padding: var(--sp-3) var(--sp-4);
  background: var(--paper);
  border: 1px solid var(--ink-200);
  border-radius: var(--r-md);
}
.floor-live-dot { font-size: 6px; }
.floor-section-subhead {
  padding: var(--sp-3) var(--sp-4);
  background: var(--ink-50);
  border-bottom: 1px solid var(--ink-200);
  font-size: var(--fs-xs);
  color: var(--ink-600);
}
.floor-empty-line {
  padding: var(--sp-5);
  text-align: center;
  margin: 0;
}
.floor-lookup-box {
  margin-top: var(--sp-3);
  padding: var(--sp-3);
  background: var(--paper);
  border: 1px solid var(--ink-200);
  border-radius: var(--r-md);
}
.floor-lookup-label {
  font-size: var(--fs-xs);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--ink-500);
  font-weight: 700;
}
.floor-lookup-label .plan-badge { margin-right: 4px; }
.floor-lookup-form {
  display: flex;
  gap: 6px;
  margin-top: 6px;
}
.floor-lookup-input {
  flex: 1;
  padding: 6px var(--sp-2);
  border: 1px solid var(--ink-300);
  border-radius: var(--r-sm);
}
.floor-tier-nudge { margin-top: var(--sp-3); }

/* Senate end-of-day digest — published late evening Eastern after the
   Senate gavels out. Renders inside the Senate floor-narrative column
   below the recent-votes list. Was inlined when shipped; classes
   here so it themes and dark-modes cleanly. */
.floor-senate-digest {
  margin-top: var(--sp-4);
  padding-top: var(--sp-3);
  border-top: 1px solid var(--ink-200);
}
.floor-senate-digest h3 {
  font-size: var(--fs-base);
  margin: 0 0 6px;
}
.floor-senate-digest__fallback-tag {
  font-weight: normal;
  font-style: italic;
}
.floor-senate-digest__meta {
  margin: 0 0 var(--sp-3);
}
.floor-senate-digest__intro {
  margin: 0 0 var(--sp-3);
  font-style: italic;
}
.floor-senate-digest__section {
  margin-bottom: var(--sp-3);
}
.floor-senate-digest__section-title {
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--ink-500);
  margin-bottom: 4px;
}
.floor-senate-digest__doc {
  padding: 6px 0;
  border-top: 1px solid var(--ink-200);
}
.floor-senate-digest__status {
  margin-top: 2px;
}
.floor-senate-digest__empty {
  margin: 0;
}
.floor-senate-digest__source {
  display: block;
  margin-top: 6px;
}
/* Banner above the non-session-day body when we're falling back to
   the most recent published digest (today's isn't out yet). Without
   this banner the h3 fallback tag was the only cue and got missed —
   users read "Senate did not meet" and thought it was about today. */
.floor-senate-digest__fallback-banner {
  background: var(--civic-blue-soft, rgba(13,148,136,0.08));
  color: var(--ink-700);
  padding: 6px 10px;
  border-radius: var(--r-sm);
  font-size: var(--fs-xs);
  margin: 0 0 var(--sp-3);
}

/* ---- Dark-mode tuning ------------------------------------------------
   Pulse-dot colors (#16A34A — green) and the live-embed black background
   (#000) are intentional and stay; they're the active-broadcast signal
   and the YouTube iframe shell. Tweaks below adjust the fallback info
   banner and amber-tinted nudge wash that read too bright on dark. -----*/
[data-theme="dark"] .floor-senate-digest__fallback-banner {
  background: rgba(13, 148, 136, 0.16);
  color: var(--ink-300);
}
