/* SpitzerData — colors lifted from Output.xlsm!DS3 + API_output.xlsm
   via xlwings Font.Color / Interior.Color / DisplayFormat reads.

   Static palette:
     #0E1F3D  navy band (cell fill on header / section rows)
     #D9F7FD  pale cream-cyan text on the navy band
     #002060  dark-blue data-cell text (default body color)
     #F2F2F2  grey zebra band for odd data rows (API_output rows 13/15/17/…)
     #FFFFFF  white background for even data rows

   Conditional-formatting fills are applied as inline `style="background:…"`
   per cell (sourced from cell_fills[col_letter] in api_output.py); the
   stylesheet just provides the zebra fallback and typography.

   Typography: Verdana Pro, no borders, tight spacing.
*/

:root {
  --navy: #0E1F3D;
  --cream: #D9F7FD;
  --datablue: #002060;
  --bg: #FFFFFF;
  --zebra: #F2F2F2;
  --neg: #C00000;
  --pos: #007a3a;
  --chip-bg: #F0F4F8;
  --chip-border: #C7D3E0;
  --chip-hover: #FFF4D6;
  --accent: var(--datablue);
  /* Uniform height for every non-top-row /database chart row, so
     graph 1 (paired with the spanned aggbox) lines up with graphs 3-8
     below. Iterated empirically. */
  --chart-row: 600px;
}

* { box-sizing: border-box; }

html, body {
  margin: 0;
  padding: 0;
  /* Navy page background — same colour as the header band and section
     titles, so when the tables are narrower than the viewport the page
     gutters match the header. */
  background: var(--navy);
  color: var(--datablue);
  font-family: "Verdana Pro", Verdana, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  font-size: 11px;
  line-height: 1.25;
}

/* ── Top toolbar (logo + brand strip above the header) ───────────────── */
/* Same navy as the body background -- visually a continuation of the
   page gutter. Separated from the header band below by a thin cream
   line. Logo + "CTFN" wordmark are centred as a group.
   Sized so the row feels like a proper banner above the table, not a
   thin strip: ~50% bigger than the original 48px version. */
.top-toolbar {
  background: var(--navy);
  height: 72px;
  padding: 0 24px;
  display: flex;
  align-items: center;       /* vertically centre logo + brand */
  justify-content: flex-start; /* push the pair to the left edge */
  gap: 16px;
  border-bottom: 1px solid var(--cream);
}
.toolbar-logo {
  height: 54px;
  width: auto;
  display: block;
  /* Nudge the logo image up 3px relative to the wordmark/toolbar
     centreline so it visually sits where Deane wants it (was -7px,
     bumped down 4px on his ask). */
  transform: translateY(-3px);
}
.toolbar-brand {
  /* Same family / weight / colour as `.page-header h1`. Font-size set
     to the logo's pixel height so the CTFN wordmark visually balances
     the logo to its left.
     `inline-flex` + explicit 54px height + `align-items: center` so
     the visible glyphs (which by default sit in the top portion of
     the line-box due to Verdana's ascender/descender ratio) get
     centred inside a 54px box matching the logo height -- the toolbar's
     own `align-items: center` then centres the box vertically. Without
     this the wordmark reads as floating high relative to the logo. */
  display: inline-flex;
  align-items: center;
  height: 54px;
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-weight: 700;
  font-size: 54px;
  letter-spacing: 0.5px;
  color: var(--cream);
  line-height: 1.0;
}

/* ── Header band ────────────────────────────────────────────────────── */
.page-header {
  background: var(--navy);
  color: var(--cream);
  padding: 12px 24px;
  text-align: center;
}
.page-header h1 {
  margin: 0;
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-weight: 700;
  font-size: 28px;
  letter-spacing: 0.5px;
  color: var(--cream);
  line-height: 1.0;
}
.subtitle {
  color: var(--cream);
  opacity: 0.85;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.5px;
  margin-top: 4px;
}
.refresh-indicator {
  opacity: 0.7;
  font-weight: 500;
  margin-left: 6px;
}
#last-refreshed.error { color: #ffb3a3; }

/* ── /database page layout ────────────────────────────────────────────── */
.page-nav {
  background: var(--navy);
  padding: 12px 24px;
  display: flex;
  gap: 32px;
  border-bottom: 1px solid var(--cream);
}
.page-nav a {
  color: var(--cream);
  text-decoration: none;
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-weight: 700;
  font-size: 16px;
  letter-spacing: 0.5px;
  padding-bottom: 2px;
  border-bottom: 2px solid transparent;
}
.page-nav a.active { border-bottom-color: var(--cream); }
.page-nav a:hover:not(.active):not(.disabled) { opacity: 0.8; }
.page-nav a.disabled { opacity: 0.4; cursor: default; }
/* Hover-dropdown wrapper for nav items that spill a submenu below
   (e.g. LIVE METRICS -> GET EXCEL PLUGIN). Per Deane 2026-05-27. */
.page-nav .nav-with-dropdown {
  position: relative;
  display: inline-block;
}
.page-nav .nav-dropdown {
  display: none;
  position: absolute;
  top: 100%;             /* directly below the parent anchor */
  left: 0;
  width: fit-content;    /* hug the widest child instead of min-width */
  background: var(--navy);
  /* Per Deane 2026-05-28: no border -- the dropdown should read as a
     seamless extension of the dark toolbar above, not a bordered card. */
  border: none;
  padding: 8px 0;
  z-index: 50;
}
.page-nav .nav-with-dropdown:hover .nav-dropdown,
.page-nav .nav-with-dropdown:focus-within .nav-dropdown {
  display: block;
}
.page-nav .nav-dropdown a {
  display: block;
  padding: 6px 16px;
  font-size: 12px;
  border-bottom: none;
  white-space: nowrap;
}
.page-nav .nav-dropdown a:hover { opacity: 0.8; }

/* ── /pre-event-pusu page (Deane 2026-05-28) ────────────────────────
   Layout: left column = chart (top) + sitbox (full remaining height);
   right column = aggbox (spans full height). Overrides the default
   .db-charts grid which is tuned for the /database 5x2 chart grid. */
.db-charts.pre-event-main {
  grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
  /* Chart row at 450px (was 250px) -- +40% on 2026-05-28, then
     +100px on 2026-05-28. */
  grid-template-rows: 450px;
  grid-auto-rows: 1fr;
  min-height: calc(100vh - 230px);  /* fill remaining viewport */
}
.db-charts.pre-event-main .chart-cell[data-chart-cell="top-left"]  { grid-column: 1; grid-row: 1; }
.db-charts.pre-event-main .chart-cell[data-chart-cell="top-right"] { grid-column: 2; grid-row: 1 / span 2; }
.db-charts.pre-event-main .chart-cell[data-chart-cell="bottom"]    { grid-column: 1; grid-row: 2; min-height: 400px; }

/* Sitbox table styling -- shares look-and-feel with .deals-list but
   uses its own classes so the two never fight over column widths. */
.sitbox-wrap {
  flex: 1; min-height: 0; overflow-y: auto;
  font-family: "Verdana Pro", Verdana, sans-serif; font-size: 10px;
}
.sit-table {
  width: 100%; border-collapse: collapse;
  /* Fixed layout so per-column widths below are authoritative; without
     this, browsers expand "wide" data cells regardless of th width. */
  table-layout: fixed;
}
.sit-table th {
  position: sticky; top: 0;
  background: var(--navy); color: var(--cream);
  text-align: left; padding: 4px 6px;
  font-weight: 700; letter-spacing: 0.3px;
  border-bottom: 1px solid rgba(217,247,253,0.3);
  white-space: normal;   /* allow header wrap (Undisturbed<br>date) */
  font-size: 10px;
}
.sit-table td {
  padding: 3px 6px; color: var(--cream);
  border-bottom: 1px solid rgba(217,247,253,0.08);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.sit-table tr:hover td { background: rgba(217,247,253,0.04); }
.sit-empty { text-align: center; padding: 24px; opacity: 0.6; }

/* Sitbox column widths. Pinned-width columns first (date / type /
   status / undervalued lookups); the variable-text columns (Target,
   Target sector, Acquirers) get per-mode tuning below. */
.sit-table .col-undisturbed   { width: 115px; }  /* fits 'Undisturbed date' inline (Deane 2026-05-28) */
.sit-table .col-first-24      { width: 90px; }
.sit-table .col-acquirer-type { width: 110px; }
.sit-table .col-undervalued   { width: 130px; }
.sit-table .col-final-ext     { width: 90px; }
.sit-table .col-status        { width: 80px; }

/* Pre-event mode (Deane 2026-05-28):
     Target +10% (was 18% -> now 20%)
     Target sector: pinned just wide enough to hold the typical
       sector label (no width:auto -- under table-layout: fixed,
       auto would split remaining space, which we want to give
       wholly to Acquirers).
     Acquirers: no declared width -> absorbs every spare px. */
.sit-mode-all .col-target        { width: calc(20% + 15px); }  /* +15px; comes off the auto-width Acquirers column (Deane 2026-05-30) */
.sit-mode-all .col-target-sector { width: 143px; }  /* +10% from 130px (Deane 2026-05-28); spare px comes off Acquirers */

/* PUSU mode (Deane 2026-05-28):
     Target sector pinned at 130px (matches Other-mode baseline).
     Acquirer type shrinks to content (header 'Acquirer type' wraps to
       'Acquirer / type' on two lines; data values 'PE' / 'SPAC' /
       'Strategic' all fit at 60px).
     Status gets +15px left padding so the column is pushed right
       (cells AND header inherit the bumped padding-left).
     Acquirers: NO declared width -> absorbs every spare pixel under
       table-layout: fixed, including the ~50px freed by Acquirer type
       shrinking and the implicit shift from Status's left padding. */
.sit-mode-pusu .col-target         { width: calc(18% + 15px); }  /* +15px off Acquirers (Deane 2026-05-30) */
.sit-mode-pusu .col-target-sector  { width: 130px; }
.sit-mode-pusu .col-acquirer-type  { width: 70px; }  /* +10px (Deane 2026-05-28) -- pushes Final extension + everything to its right 10px over; the gain comes off the auto-width Acquirers column */
.sit-mode-pusu .col-status         { padding-left: 21px; }

/* ── /deal/{sit_id} per-sit page (Deane 2026-05-28) ─────────────────── */
.deal-header {
  text-align: center;
  margin: 22px auto 8px;
  color: var(--cream);
  font-family: "Verdana Pro", Verdana, sans-serif;
}
.deal-header .deal-title {
  font-size: 22px; font-weight: 700; letter-spacing: 0.4px;
}
.deal-header .deal-ticker {
  font-size: 14px; font-weight: 600; margin-top: 4px; opacity: 0.85;
}
.deal-layout {
  display: grid;
  grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr);
  gap: 14px;
  padding: 0 18px;
  margin-top: 12px;
  /* The left column (chart + parameter list) defines the row height; the
     right column (aggbox) overrides this with align-self: start + a fixed
     height so it ends level with the bottom of the graph rather than
     stretching down alongside the parameters -- see the top-right rule
     below (Deane 2026-05-30). */
  align-items: stretch;
}
/* Left column wrapper: chart on top, parameter list below. Flex
   column so the chart can take a fixed height and the parameter
   list flows under it. Gap is 14px + the same half-line bump as
   between parameter rows (~9px) = ~23px between the chart's
   bottom edge and the first parameter row (Deane 2026-05-28). */
.deal-main {
  display: flex;
  flex-direction: column;
  gap: 23px;
  min-width: 0;
}
/* Chart cell is 3x taller than the original ~200px rendered height
   (Deane 2026-05-28). Explicit height (not min-height) so the grid
   row pins to it -- otherwise Chart.js's responsive canvas was
   collapsing to its parent's intrinsic height. */
.deal-chart-cell { height: 600px; }
/* Aggbox ends level with the bottom of the graph: pin it to the chart's
   height instead of stretching down alongside the parameter list. Keep in
   sync with .deal-chart-cell above; its internal .aggbox-wrap (flex:1;
   overflow-y:auto) scrolls the headlines within (Deane 2026-05-30). */
.deal-layout .chart-cell[data-chart-cell="top-right"] {
  height: 600px;
  align-self: start;
}
.deal-empty {
  padding: 60px 24px; text-align: center;
  color: var(--cream); opacity: 0.7;
  font-family: "Verdana Pro", Verdana, sans-serif; font-size: 12px;
  line-height: 1.6;
}
.deal-empty code {
  background: rgba(217,247,253,0.10); padding: 1px 6px;
  border-radius: 3px; font-family: ui-monospace, "SF Mono", Monaco, monospace;
  font-size: 11px;
}
.deal-status {
  text-align: center;
  color: var(--cream);
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 12px;
  margin: 14px auto 24px;
  letter-spacing: 0.3px;
}
.deal-status .sep { margin: 0 10px; opacity: 0.45; }
.deal-status strong { font-weight: 700; }

/* Per-sit parameter list (Deane 2026-05-28). Lives inside the
   left column under the chart (.deal-main), so it shares horizontal
   space with the aggbox sibling rather than running full-width below.
   Bold labels, plain values, half-line spacing between rows. */
.deal-params {
  color: var(--cream);
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 12px;
  line-height: 1.55;
}
/* Half-line spacing -- 1.55 line-height x 0.5 = 0.775em added below
   each row (margin-bottom rather than top+bottom so consecutive rows
   collapse cleanly). */
.deal-param-row { margin: 0 0 0.775em; }
.deal-param-row:last-child { margin-bottom: 0; }
.deal-param-row strong { font-weight: 700; }
/* Group separator -- one blank line between logical groups (per the PDF
   spacing spec, Deane 2026-05-30). */
.deal-param-gap { height: 0.7em; }

/* Three info columns below the graph + aggbox (Deane 2026-05-30):
   Target / Acquirer / Deal, full width, each with a centred header.
   Reuses .deal-param-row for the rows. */
.deal-info-cols {
  display: grid;
  /* Four narrow text columns + a wider 5th for the timing chart. */
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1.8fr);
  gap: 18px;
  padding: 0 18px;
  /* Negative top margin pulls the info block up tight under the
     graph/aggbox (Deane 2026-05-30: 20px -> 10px -> -30px). */
  margin: -30px auto 28px;
}
/* Pre-event / PUSU situations show only Target / Potential acquirer /
   Situation columns (no regulatory clearances or timing graph) -- 3 equal
   columns instead of the announced-deal 5 (Deane 2026-05-30). */
.deal-info-cols-pre {
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr);
  max-width: 1100px;
}
/* Pill under the deal header marking the situation type + lifecycle. */
.deal-situation-badge {
  display: inline-block;
  margin-top: 8px;
  padding: 2px 12px;
  border: 1px solid rgba(217,247,253,0.35);
  border-radius: 999px;
  font-size: 12px; font-weight: 600; letter-spacing: 0.3px;
  color: var(--cream); background: rgba(217,247,253,0.08);
}
/* Pre-event/PUSU sitbox rows link to their /deal/{sit_id} page. */
.sit-row-link { cursor: pointer; }
.deal-info-col {
  color: var(--cream);
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 12px;
  line-height: 1.55;
  min-width: 0;
}
.deal-info-header {
  text-align: center;
  font-weight: 700;
  font-size: 14px;
  letter-spacing: 0.4px;
  margin-bottom: 12px;
  padding-bottom: 6px;
  border-bottom: 1px solid rgba(217,247,253,0.18);
}

/* Column 5: the "Average timing" chart + the clickable cross-filter controls
   in the info columns (Deane 2026-05-30). */
.deal-timing-col .dt-canvas-wrap { position: relative; height: 280px; }
.deal-timing-col .dt-empty {
  text-align: center; font-size: 11px; font-style: italic;
  color: var(--cream); opacity: 0.6; margin-top: 8px;
}
/* Acquirer name sub-headers + co-acquirer display rows. */
.deal-acq-name { font-weight: 700; margin: 8px 0 4px; }
.deal-acq-name:first-child { margin-top: 0; }
.deal-subrow { padding-left: 10px; opacity: 0.9; }
/* Indent the primary acquirer's clickable classification under its name
   (parallel to the co-acquirer subrows) when there are multiple acquirers. */
.deal-indent { padding-left: 10px; }
/* Clickable classification filter chips + clearance agency buttons. */
.dt-filter, .dt-agency {
  background: rgba(217,247,253,0.10); color: var(--cream);
  border: 1px solid rgba(217,247,253,0.30); border-radius: 3px;
  font-family: inherit; font-size: 11px; padding: 1px 6px; cursor: pointer;
  line-height: 1.4;
}
.dt-filter:hover, .dt-agency:hover { background: rgba(217,247,253,0.20); }
.dt-filter.active, .dt-agency.active {
  background: var(--cream); color: var(--datablue); font-weight: 700;
  border-color: var(--cream);
}
.dt-agencies { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 4px; }
.dt-agency.dt-status-cleared { border-color: rgba(127,207,250,0.7); }
.dt-agency.dt-status-not-filed { opacity: 0.8; }

/* Aggbox row highlighted by chart-dot hover (Deane 2026-05-28).
   Mousing over a news dot on /deal/{sit_id} tints the corresponding
   headline row so the user can read it without losing chart context. */
.aggbox-row.aggbox-row-hover {
  background: rgba(217,247,253,0.18) !important;
  outline: 1px solid rgba(217,247,253,0.45);
}

/* Live Metrics Target / Acquirer cells link to /deal/{sit_id}
   (Deane 2026-05-28). Anchor inherits the cell's color + font; the
   cell itself gets a pointer cursor + faint underline on hover so
   the link affordance is obvious without re-skinning the column. */
.metrics-table td.sit-link-cell { cursor: pointer; }
.metrics-table td.sit-link-cell .sit-link {
  color: inherit;
  text-decoration: none;
  display: block;   /* whole-cell hit target, including padding */
}
.metrics-table td.sit-link-cell:hover .sit-link {
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 2px;
}
/* LOG IN / LOG OUT pinned to the far right of the nav row. The form
   wrapper around LOG OUT POSTs to /signout; the button is styled to
   match the anchor siblings so the nav row reads as one consistent
   group. (Per Deane, 2026-05-27.) */
.page-nav .nav-auth {
  margin-left: auto;
}
.page-nav form.nav-auth {
  display: inline;   /* don't break the flex row */
}
.page-nav form.nav-auth button {
  background: none;
  border: none;
  padding: 0;
  cursor: pointer;
  color: var(--cream);
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-weight: 700;
  font-size: 16px;
  letter-spacing: 0.5px;
  padding-bottom: 2px;
  border-bottom: 2px solid transparent;
}
.page-nav form.nav-auth button:hover { opacity: 0.8; }
.summary-bar {
  background: var(--navy);
  color: var(--cream);
  padding: 12px 24px;
  display: flex;
  gap: 40px;
  flex-wrap: wrap;
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 12px;
  border-bottom: 1px solid rgba(217,247,253,0.2);
}
.summary-stat strong { font-size: 14px; margin-left: 6px; }
.database-layout {
  display: grid;
  grid-template-columns: 220px 1fr;
  gap: 16px;
  padding: 16px 24px;
  background: var(--navy);
  min-height: calc(100vh - 200px);
}
.db-filters {
  color: var(--cream);
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 11px;
  /* Sticky + align-self: start so the sidebar pins at the top of the
     viewport as the user scrolls past it, without the grid track
     stretching to match the much-taller chart column. */
  position: sticky;
  top: 0;
  align-self: start;
  /* Mouse-wheel over the sidebar scrolls ONLY the sidebar -- doesn't
     bubble out to scroll the page. overscroll-behavior: contain stops
     scroll-chaining at the sidebar's boundary, so even when there's
     nothing to scroll inside, the wheel event doesn't reach the
     window (per Deane, 2026-05-23 "scroll independently" clarification).
     max-height + overflow-y: auto make it an actual scroll container
     so the contain rule has something to anchor to; the hidden
     scrollbar keeps the chrome out of the way. */
  max-height: 100vh;
  overflow-y: auto;
  overscroll-behavior: contain;
  scrollbar-width: none;
}
.db-filters::-webkit-scrollbar { display: none; }

/* CFIUS event-state select has exactly 4 options and size=4, so the
   scrollbar is purely cosmetic gutter (per Deane, 2026-05-23) -- hide
   it. Same vocab as the other 4-option events but those don't render
   a scrollbar because their lists are slightly shorter. */
#f-cfius {
  overflow: hidden;
  scrollbar-width: none;     /* Firefox */
}
#f-cfius::-webkit-scrollbar { display: none; }  /* Chromium / Safari */
.db-filters .filter-section {
  font-weight: 700; font-size: 12px; letter-spacing: 0.4px;
  margin: 16px 0 6px; padding-bottom: 4px;
  border-bottom: 1px solid rgba(217,247,253,0.3);
}
.db-filters .filter-group { margin-bottom: 8px; }
.db-filters label { display: block; font-size: 11px; margin-bottom: 2px; opacity: 0.85; }
.db-filters select, .db-filters input {
  background: rgba(217,247,253,0.1); color: var(--cream);
  border: 1px solid rgba(217,247,253,0.3);
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 10px; padding: 3px; width: 100%; box-sizing: border-box;
}
.db-filters .filter-row { display: flex; gap: 4px; }
.db-filters .filter-row input { width: 50%; }
/* Date-range row: from / "to" / to, evenly distributed with the
   word "to" between, keeping the two date inputs narrow enough that
   the picker icons still fit. */
.db-filters .filter-row.date-range { align-items: center; gap: 4px; }
.db-filters .filter-row.date-range input[type=date] {
  flex: 1 1 0; min-width: 0; width: auto;
}
.db-filters .filter-row.date-range .range-sep {
  color: var(--cream); font-size: 10px; opacity: 0.75;
  flex: 0 0 auto;
}
/* Events two-up grid (Antitrust / FDI & FSR sections) -- each filter
   sits in 50% of the sidebar width, two per row, so all six event
   selectors fit in 3 visual rows instead of 6. */
.db-filters .events-grid {
  display: grid; grid-template-columns: 1fr 1fr; gap: 4px 8px;
}
.db-filters .events-grid .filter-group { margin-bottom: 0; }
/* "Search to add:" composite widget. Sits in one .events-grid cell
   (same width as a regulator dropdown next to it) and stacks four
   single-line controls: label, level, location, text-entry. */
.db-filters .reg-search-group { display: flex; flex-direction: column; gap: 2px; }
/* Push the "Search:" label down 2px and zero its bottom-margin so the
   gap to the "Level: all" box shrinks (label is visually closer to its
   group's first control). */
.db-filters .reg-search-group label {
  margin-top: 2px;
  margin-bottom: 0;
}
/* Bumped from 18 to 22 so the placeholder text ("Level: all" etc.) is
   vertically centred inside the box instead of being clipped. */
.db-filters .reg-search-group select,
.db-filters .reg-search-group input { height: 22px; }
/* (text-autocomplete uses native <datalist>; no custom suggestion list) */
/* Right-hand widget that surfaces the picked regulator's states.
   Made a flex column so its <select> can grow to fill whatever vertical
   space the grid row gives it -- which is whatever height the left
   widget needs. Net effect: right widget height auto-matches left. */
.db-filters .reg-selected-group { display: flex; flex-direction: column; }
.db-filters .reg-selected-group .reg-selected-label {
  font-weight: 700; min-height: 14px;
}
.db-filters .reg-selected-group .reg-selected-states {
  flex: 1; min-height: 0;
}
/* Hide the scrollbar on selects whose `size` attribute already matches
   their option count (SAMR has 4 options at size=4; the regulator-
   search right-hand widget likewise has the 4 fixed states). */
#f-samr,
.db-filters .reg-selected-states {
  overflow: hidden;
  scrollbar-width: none;
}
#f-samr::-webkit-scrollbar,
.db-filters .reg-selected-states::-webkit-scrollbar {
  display: none;
}
/* Autocomplete input above Banker / Lawyer selects: type to filter
   the visible options. The select below still drives the actual
   multi-select state. */
.db-filters .ac-input {
  display: block; width: 100%; margin-bottom: 2px; box-sizing: border-box;
  background: rgba(217,247,253,0.1); color: var(--cream);
  border: 1px solid rgba(217,247,253,0.3);
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 10px; padding: 3px;
}
.db-filters select[multiple] {
  height: auto;
  background: rgba(217,247,253,0.1); color: var(--cream);
}
/* Style the option list itself (both in multi-select's inline panel and
   in the open-on-click popup of single-selects). Browsers default to
   white-bg / black-text for option lists; override to match the navy
   sidebar background + cream text. Applies to sidebar dropdowns AND
   to the in-chart dropdowns (chart-group, process-type, reg-level, etc.). */
/* Timing-chart [from]->[to] pair-selector row -- shows below the
   regulator-selector inside the chart head, only for the four
   bespoke regulators (FTC/DOJ, EC antitrust, CMA, EC FSR). */
.timing-pair-row {
  display: flex;
  flex-wrap: wrap;
  gap: 6px 10px;
  margin-top: 4px;
  width: 100%;
}
.timing-pair {
  display: inline-flex;
  align-items: center;
  gap: 4px;
}
.timing-pair select {
  font-size: 10px;
  padding: 2px 4px;
  background: rgba(217,247,253,0.07);
  color: var(--cream);
  border: 1px solid rgba(217,247,253,0.25);
  border-radius: 2px;
  font-family: "Verdana Pro", Verdana, sans-serif;
  max-width: 140px;
}
.timing-pair select:disabled {
  opacity: 0.4;
  cursor: not-allowed;
}
.timing-pair-arrow {
  color: var(--cream);
  opacity: 0.6;
  font-size: 12px;
  user-select: none;
}
.timing-pair select option {
  background-color: var(--navy);
  color: var(--cream);
}

.db-filters select option,
.chart-group option,
.reg-search-inline select option,
.chart-head-search select option {
  background-color: var(--navy);
  color: var(--cream);
}
/* Selected options get a bright cream background + dark-blue bold text
   so they pop against the translucent navy background. */
.db-filters select[multiple] option:checked {
  background: var(--cream); color: var(--datablue); font-weight: 700;
}
#f-reset {
  margin-top: 16px; background: var(--cream); color: var(--datablue);
  border: none; padding: 8px 16px;
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 11px; font-weight: 700; cursor: pointer; width: 100%;
}
#f-reset:hover { opacity: 0.85; }
.db-charts {
  display: grid;
  /* minmax(0, 1fr) instead of plain 1fr -- 1fr's default minimum is
     each column's min-content size, so a long unbreakable headline
     in aggbox would push the right column past 50%. Forcing the
     minimum to 0 makes the two columns exactly equal regardless of
     intrinsic content widths. */
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 14px;
  /* Row 1 (the two top boxes) is pinned at 250px so the dealbox can
     show ~10 rows of deals; row-track stays put regardless of how
     much content paintDealsList puts in the top-left cell.
     All subsequent rows are pinned to --chart-row via grid-auto-rows
     so graph 1 (row 2 col 1, paired with the spanned aggbox) lines up
     with graphs 3-8 below -- prevents drift between Chart.js's natural
     canvas height for any one cell and the explicit row 2 height. */
  grid-template-rows: 250px;
  grid-auto-rows: var(--chart-row);
}
.chart-cell {
  background: rgba(217,247,253,0.08);
  border: 1px solid rgba(217,247,253,0.18);
  border-radius: 4px; padding: 10px;
  display: flex; flex-direction: column; min-height: 132px;
}

/* Aggbox absorbs graph 2's old slot (per Deane, 2026-05-23): top-right
   spans rows 1+2 of column 2; top-left stays pinned to column 1 row 1.
   Without explicit grid-column the auto-flow can put the spanning cell
   in the wrong column -- pinning both makes the placement bullet-proof.
   Aggbox's internal .aggbox-wrap has overflow-y:auto so headlines past
   the 396px-tall cell scroll within rather than ballooning the row. */
.chart-cell[data-chart-cell="top-left"]  { grid-column: 1; grid-row: 1; }
.chart-cell[data-chart-cell="top-right"] { grid-column: 2; grid-row: 1 / span 6; }

/* ── Dealbox v2: 4-col deals-list panel ──────────────────────────────
   The top row's height is locked by .db-charts { grid-template-rows: 250px }
   above -- both top cells fill exactly 250px. The dealbox wrap below
   fills that height via flex:1 and scrolls internally for long tables.
   Acquirers column has width:100% to absorb the remaining horizontal
   space; the other three columns size to content via white-space:nowrap. */
.deals-list-wrap {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 10px;
}
.deals-list {
  width: 100%;
  border-collapse: collapse;
  /* table-layout: fixed makes <col> widths authoritative for every row,
     so the JS focus handler can rebalance widths just by setting the
     col element's style.width. */
  table-layout: fixed;
}
/* Announced, EV, and Acquirer type are pinned widths. Acquirer type
   is sized for its HEADER text ("Acquirer type", 13 chars) rather
   than its data values, per Deane: 110px comfortably fits the header
   at the table's 10px Verdana Bold.
   Target and Acquirers stay at the original "(100% - 240px)/3" each;
   Target sector gives up the 30px taken by the wider Acquirer type. */
.deals-list .col-announced     { width: 90px; }
.deals-list .col-ev            { width: 70px; }
.deals-list .col-acquirer-type { width: 110px; }
/* Per Deane: shift the Acquirer type column 5px rightward. With
   table-layout: fixed, the cleanest visual shift is extra left
   padding on the cells (default is 6px; bumped to 11px = +5). */
.deals-list th[data-col="acquirer_type"],
.deals-list td[data-col="acquirer_type"] {
  padding-left: 11px;
}
.deals-list .col-target,
.deals-list .col-acquirers {
  width: calc((100% - 240px) / 3);
}
.deals-list .col-target-sector {
  width: calc((100% - 330px) / 3);
}
/* ── Dashboard sitbox: EV / Target / Acquirers / metric1 / metric2 / Status.
   Two dropdown-header metric columns (replacing the minimetrics box). ── */
.dashboard-mode .deals-list .col-ev        { width: 64px; }
.dashboard-mode .deals-list .col-metric    { width: 64px; }  /* col7 (Gross spread): unchanged */
.dashboard-mode .deals-list .col-metric2   { width: 74px; }  /* col5: +10px (was 64) */
.dashboard-mode .deals-list .col-metric3   { width: 78px; }  /* col6: +10px (was 68) */
.dashboard-mode .deals-list .col-acqtype   { width: 76px; }  /* col4: +4px (was 72) */
.dashboard-mode .deals-list .col-status    { width: 93px; }
.dashboard-mode .deals-list .col-target    { width: 151px; } /* col2: -7px (was 158) */
.dashboard-mode .deals-list .col-acquirers { width: auto; }  /* col3: elastic absorber, takes the net +11 off itself (= -11, as asked) */
/* Drag-to-resize handle on each sitbox column header (Deane 2026-05-30). */
.deals-list th { position: sticky; }
.col-resize-handle {
  position: absolute; top: 0; right: 0; width: 6px; height: 100%;
  cursor: col-resize; user-select: none; z-index: 2;
}
.col-resize-handle:hover { background: rgba(217,247,253,0.35); }
/* Metric dropdown header: a visible WRAPPING label (.sitbox-metric-label)
   backed by a transparent native <select> overlay (.sitbox-metric-select).
   The chip carries the public/private-style look the bare select used to
   have; the overlay keeps the native dropdown + resize handle working while
   letting the long metric name wrap instead of truncate (Deane 2026-05-31). */
.deals-list th.sitbox-metric-th { padding: 2px 4px; }
.deals-list .sitbox-metric-chip {
  position: relative; display: block; cursor: pointer;
  background: rgba(217,247,253,0.10); color: var(--cream);
  border: 1px solid rgba(217,247,253,0.30); border-radius: 2px;
  padding: 1px 13px 1px 3px;   /* right room for the ▾ + the resize strip */
}
.deals-list .sitbox-metric-chip::after {
  content: "▾"; position: absolute; right: 4px; top: 0;
  pointer-events: none; opacity: 0.7;
}
.deals-list .sitbox-metric-label {
  display: block; white-space: normal; overflow-wrap: anywhere;
  font-family: "Verdana Pro", Verdana, sans-serif; font-size: 10px; font-weight: 700;
  line-height: 1.15; pointer-events: none;   /* clicks fall through to select */
}
.deals-list .sitbox-metric-chip .sitbox-metric-select {
  position: absolute; top: 0; left: 0; width: 100%; height: 100%;
  margin: 0; padding: 0; border: 0; opacity: 0; cursor: pointer; z-index: 1;
}
.deals-list .sitbox-metric-chip .sitbox-metric-select option {
  background-color: var(--navy); color: var(--cream);
}
.deals-list td.sitbox-metric-cell { text-align: right; }
.deals-list th {
  position: sticky; top: 0;
  background: var(--navy); color: var(--cream);
  text-align: left; padding: 2px 6px;
  font-weight: 700; letter-spacing: 0.3px;
  border-bottom: 1px solid rgba(217,247,253,0.3);
  white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis;
}
/* Dashboard sitbox: allow header labels to WRAP rather than truncate
   (Deane 2026-05-31). Scoped to dashboard-mode so the /database deals-list
   layout (locked) keeps its single-line ellipsis headers. Data cells (td)
   are intentionally left single-line. */
.dashboard-mode .deals-list th {
  white-space: normal; overflow: visible; text-overflow: clip;
  height: auto; line-height: 1.2; vertical-align: bottom;
}
/* Unbold all Dashboard sitbox header text (Deane 2026-06-01). Scoped to
   dashboard-mode; the /database deals-list headers stay bold. */
.dashboard-mode .deals-list th,
.dashboard-mode .deals-list .sitbox-metric-label,
.dashboard-mode .deals-list .sitbox-metric-select { font-weight: normal; }
.deals-list th.clickable {
  cursor: pointer;
  user-select: none;
}
.deals-list th.clickable:hover {
  background: rgba(217,247,253,0.15);
}
.deals-list td {
  padding: 2px 6px;
  color: var(--cream);
  border-bottom: 1px solid rgba(217,247,253,0.08);
  white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis;
  vertical-align: top;
}
.deals-list tbody tr:hover td {
  background: rgba(217,247,253,0.06);
}
/* Linked rows (every row with a sit_id) get a pointer cursor so the
   click-target is discoverable. Deane 2026-05-28: each dealbox row
   navigates to /deal/{sit_id}. */
.deals-list tbody tr.dealbox-row-link { cursor: pointer; }
.deals-list tbody tr.dealbox-row-link:hover td { background: rgba(217,247,253,0.10); }
/* Subtle highlight on the focused header so the user can see which
   column is currently expanded. */
.deals-list[data-focus] th[data-col]:not(.clickable) { /* no-op selector to keep specificity uniform */ }
.deals-list[data-focus="target"] th[data-col="target"],
.deals-list[data-focus="target_sector"] th[data-col="target_sector"],
.deals-list[data-focus="acquirers"] th[data-col="acquirers"] {
  background: rgba(217,247,253,0.18);
}

.chart-head {
  display: flex; align-items: center;
  gap: 6px; margin-bottom: 8px;
  flex-wrap: wrap;
}

/* ── Aggbox: news headlines in the top-right chart-cell ──────────────
   Lives inside the same 250px-tall .chart-cell as dealbox, so the
   internal wrap uses flex:1 + overflow-y:auto to scroll long lists
   without growing the box. Each row is an anchor (whole row clicks
   through) with a lettermark "logo" + headline + relative time. */
/* Aggbox toggle tabs at the top of the chart-cell. Two buttons:
   News (default) and Announcements & filings. flex:0 0 auto keeps
   them out of the scroll area below; the active tab gets a subtle
   underline + background tint. */
.aggbox-tabs {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 4px;
  margin-bottom: 6px;
  border-bottom: 1px solid rgba(217,247,253,0.18);
}
.aggbox-tabs-left {
  display: flex;
  gap: 4px;
  align-items: flex-end;
  min-width: 0;
}
/* Scope slider lives at the right edge of the tabs row. Per Deane
   (2026-05-19): two text labels flank a 7-step <input type=range>;
   the underlying tier vocabulary is NOT shown to the user. */
.aggbox-scope {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-left: auto;
  margin-bottom: 2px;
  padding-right: 2px;
}
.aggbox-scope-label {
  color: var(--cream);
  opacity: 0.75;
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 9px;
  letter-spacing: 0.3px;
  white-space: nowrap;
  user-select: none;
}
.aggbox-scope-slider {
  -webkit-appearance: none;
  appearance: none;
  width: 90px;
  height: 4px;
  background: rgba(217,247,253,0.22);
  border-radius: 2px;
  outline: none;
  cursor: pointer;
  padding: 0;
  margin: 0;
}
.aggbox-scope-slider::-webkit-slider-runnable-track {
  height: 4px;
  background: rgba(217,247,253,0.22);
  border-radius: 2px;
}
.aggbox-scope-slider::-moz-range-track {
  height: 4px;
  background: rgba(217,247,253,0.22);
  border-radius: 2px;
  border: none;
}
.aggbox-scope-slider::-webkit-slider-thumb {
  -webkit-appearance: none;
  appearance: none;
  width: 10px;
  height: 12px;
  background: var(--cream);
  border-radius: 2px;
  border: none;
  cursor: pointer;
  margin-top: -4px;
}
.aggbox-scope-slider::-moz-range-thumb {
  width: 10px;
  height: 12px;
  background: var(--cream);
  border-radius: 2px;
  border: none;
  cursor: pointer;
}
.aggbox-tab {
  background: transparent;
  border: none;
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  padding: 3px 8px 4px;
  color: var(--cream);
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.3px;
  opacity: 0.6;
  cursor: pointer;
  user-select: none;
}
.aggbox-tab:hover {
  opacity: 0.9;
}
.aggbox-tab.active {
  opacity: 1;
  border-bottom-color: var(--cream);
  background: rgba(217,247,253,0.07);
}

/* Toggle checkboxes (replaced tab buttons 2026-05-21). News and
   Announcements & filings are independent on/off controls; both
   default to on. The label has the visual "checked" state via the
   .on class; the underlying <input type=checkbox> is custom-styled. */
.aggbox-toggle {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 3px 8px 4px;
  color: var(--cream);
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.3px;
  opacity: 0.55;
  cursor: pointer;
  user-select: none;
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
}
.aggbox-toggle:hover { opacity: 0.85; }
.aggbox-toggle.on {
  opacity: 1;
  border-bottom-color: var(--cream);
  background: rgba(217,247,253,0.07);
}
.aggbox-toggle input[type="checkbox"] {
  appearance: none;
  -webkit-appearance: none;
  width: 11px;
  height: 11px;
  border: 1.5px solid rgba(217,247,253,0.55);
  border-radius: 2px;
  background: transparent;
  cursor: pointer;
  flex: 0 0 auto;
  position: relative;
  margin: 0;
}
.aggbox-toggle.on input[type="checkbox"] {
  background: var(--cream);
  border-color: var(--cream);
}
.aggbox-toggle.on input[type="checkbox"]::after {
  /* Inline check-mark using a unicode glyph so no separate icon
     file is needed. Dark fill contrasts the cream box. */
  content: "✓";
  color: #04284a;
  font-size: 10px;
  font-weight: 900;
  line-height: 8px;
  position: absolute;
  top: 0px;
  left: 1px;
}
.aggbox-wrap {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  font-family: "Verdana Pro", Verdana, sans-serif;
  /* Same independent-scroll behaviour as the sidebar (per Deane
     2026-05-23): mouse-wheel over aggbox scrolls aggbox, doesn't
     chain out to the page. Scrollbar hidden too. */
  overscroll-behavior: contain;
  scrollbar-width: none;
}
.aggbox-wrap::-webkit-scrollbar { display: none; }
.aggbox-empty {
  color: var(--cream); opacity: 0.65;
  font-size: 11px; padding: 8px 4px;
  font-style: italic;
}
.aggbox-row {
  display: flex; align-items: center;
  gap: 8px;
  padding: 4px 4px;
  border-bottom: 1px solid rgba(217,247,253,0.08);
  text-decoration: none;
  color: var(--cream);
  font-size: 10px;
  line-height: 1.3;
}
.aggbox-row:hover {
  background: rgba(217,247,253,0.07);
}
.aggbox-logo {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center; justify-content: center;
  min-width: 36px; height: 22px;   /* +20% from 30x18 (Deane 2026-05-23) */
  padding: 0 4px;
  border-radius: 2px;
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 9px; font-weight: 700;
  letter-spacing: 0.3px;
  color: #ffffff;
}
/* Real-logo variant: same footprint as the lettermark so rows align
   whether a row has an image logo or the text fallback. object-fit
   keeps the source's aspect ratio inside the 36x22 box. */
.aggbox-logo-img {
  flex: 0 0 auto;
  width: 36px; height: 22px;       /* +20% from 30x18 (Deane 2026-05-23) */
  object-fit: contain;
  border-radius: 2px;
  /* Per Deane: aggbox logo backgrounds are a darker navy (#1E304C)
     that matches the chart-cell tone, NOT cream. Transparent-bg
     SVGs (FTC/DOJ seals) still read against this since their seal
     interiors are colored. */
  background: #1E304C;
  padding: 1px;
  box-sizing: border-box;
}
/* SEC EDGAR seal already has its own white-on-blue field; no extra
   pad needed. Removing the cream surround makes it sit more cleanly. */
.aggbox-logo-img[alt="sec_edgar"] {
  background: transparent;
  padding: 0;
}

/* CTFN rows are the high-signal source -- give them ~50% more
   vertical room than other rows and a larger toolbar-style logo.
   The logo file at /static/source-logos/ctfn.png is a copy of the
   header toolbar mark, so no cream surround is needed. */
.aggbox-row.is-ctfn {
  padding-top: 7px;
  padding-bottom: 7px;
}
.aggbox-row.is-ctfn .aggbox-logo-img {
  width: 53px;                     /* +20% from 44 (Deane 2026-05-23) */
  height: 31px;                    /* +20% from 26 */
  background: transparent;
  padding: 0;
  /* Nudge the CTFN mark 6px to the left so it visually anchors
     against the cell's left padding rather than the row gutter. */
  margin-left: -6px;
}
/* CTFN rows get a slightly larger headline (~+2pt) to match their
   bigger logo footprint. 12px ≈ 10px (default) + 2pt. Plus bold +
   a 3px nudge left so the text anchors closer to the logo. */
.aggbox-row.is-ctfn .aggbox-headline {
  font-size: 14px;     /* +1pt over the previous 13 (~+4pt over 10 default) */
  font-weight: 700;
  margin-left: -5px;
  position: relative;  /* enables `top` nudge without affecting layout */
  top: 1px;            /* visually centers a bit lower vs the larger logo */
}
.aggbox-row.is-ctfn .aggbox-logo {
  /* Lettermark fallback (if the PNG fails to load) keeps the larger
     dimensions so the row layout doesn't shift. */
  min-width: 53px;                 /* +20% from 44 (Deane 2026-05-23) */
  height: 31px;                    /* +20% from 26 */
  font-size: 11px;
}
.aggbox-headline {
  flex: 1 1 auto;
  /* min-width: 0 lets the flex item shrink below its intrinsic
     content size so `overflow: hidden + text-overflow: ellipsis`
     can actually clip long headlines instead of forcing the row
     (and hence the grid cell) to grow horizontally. */
  min-width: 0;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.aggbox-meta {
  /* Both formats are 5 chars now ("HH:MM" or "MM-DD"), so 32px is
     ample at 9px tabular-nums. Tighter column = tickers push right.
     margin-right:2px pulls the timestamp 2px off the row's right edge. */
  flex: 0 0 32px;
  font-size: 9px;
  opacity: 0.6;
  margin-left: 6px;
  margin-right: 4px;
  white-space: nowrap;
  text-align: right;
  font-variant-numeric: tabular-nums;
}
/* Ticker badges at far right of the row -- one pill per tagged
   ticker (cap 3 + a "+N" pill for the rest). Compact pill style
   so multiple fit without dominating the row. */
.aggbox-tickers {
  flex: 0 0 auto;
  display: inline-flex;
  gap: 3px;
  margin-left: 6px;
}
.aggbox-ticker {
  display: inline-flex;
  align-items: center;
  height: 14px;
  padding: 0 5px;
  border-radius: 7px;
  background: rgba(217,247,253,0.18);
  color: var(--cream);
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 9px;
  font-weight: 700;
  letter-spacing: 0.3px;
}
.aggbox-ticker.more {
  opacity: 0.6;
}
/* Chosen-ticker selection (chosen_tickers.js): click a ticker to choose
   the company; chosen tickers get inverted colours. Deane 2026-05-30. */
.aggbox-ticker { cursor: pointer; }
.aggbox-ticker.more { cursor: default; }
.aggbox-ticker.chosen {
  background: var(--cream);
  color: var(--datablue);
}
/* Single-situation page tickers (beneath the company name). */
.deal-ticker-tkr {
  cursor: pointer;
  padding: 0 5px;
  border-radius: 5px;
  transition: background 0.1s, color 0.1s;
}
.deal-ticker-tkr.chosen {
  background: var(--cream);
  color: var(--datablue);
}
/* Comma between acquirer chips: pull it back over the preceding chip's
   right padding so it reads "Tinicum, Blackstone" not "Tinicum , ...". */
.dt-sub-comma { margin-left: -5px; }
/* ── Dashboard (Deane 2026-05-30) ── reuses the M&A Database layout but
   shows only the first chart; the others stay in the DOM (painted off-
   screen) so database.js needs no chart guards. */
.db-charts.dashboard-mode > .chart-cell:not([data-chart-cell="top-left"]):not([data-chart-cell="top-right"]):not(.dash-keep) {
  display: none;
}
.dash-chips {
  display: flex; flex-wrap: wrap; align-items: center; gap: 6px;
  padding: 8px 18px 2px;
}
.dash-chips-list { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.dash-chips-empty {
  color: var(--cream); opacity: 0.6; font-size: 12px;
  font-family: "Verdana Pro", Verdana, sans-serif;
}
.dash-chip {
  background: var(--cream); color: var(--datablue);
  border: 1px solid var(--cream); border-radius: 999px;
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 11px; font-weight: 700; letter-spacing: 0.3px;
  padding: 2px 9px; cursor: pointer;
}
.dash-chip:hover { opacity: 0.85; }
.dash-chip-x { font-weight: 700; margin-left: 1px; }
/* Ticker-format dropdown at the very left of the chip bar. */
.dash-ticker-format {
  background: rgba(217,247,253,0.10); color: var(--cream);
  border: 1px solid rgba(217,247,253,0.30); border-radius: 2px;
  font-family: "Verdana Pro", Verdana, sans-serif; font-size: 11px;
  padding: 3px 6px; cursor: pointer; flex: 0 0 auto;
}
/* Dropdown-menu colours match the public/private (.db-filters) selector. */
.dash-ticker-format option { background-color: var(--navy); color: var(--cream); }
/* Search-to-add box (to the right of the ticker-format dropdown). */
.dash-search { position: relative; flex: 0 0 auto; }
.dash-search-input {
  background: rgba(217,247,253,0.10); color: var(--cream);
  border: 1px solid rgba(217,247,253,0.30); border-radius: 2px;
  font-family: "Verdana Pro", Verdana, sans-serif; font-size: 11px;
  padding: 3px 11px; width: 150px;
}
.dash-search-input::placeholder { color: var(--cream); opacity: 0.55; }
.dash-search-input:focus { outline: none; border-color: var(--cream); }
.dash-search-results {
  position: absolute; top: 100%; left: 0; z-index: 60;
  margin-top: 3px; min-width: 260px; max-height: 280px; overflow-y: auto;
  background: var(--navy); border: 1px solid rgba(217,247,253,0.30);
  border-radius: 6px; box-shadow: 0 6px 18px rgba(0,0,0,0.35);
}
.dash-search-opt {
  display: block; width: 100%; text-align: left;
  background: none; color: var(--cream); border: none;
  font-family: "Verdana Pro", Verdana, sans-serif; font-size: 11px;
  padding: 5px 11px; cursor: pointer;
}
.dash-search-opt:hover { background: rgba(217,247,253,0.12); }
.dash-search-none {
  color: var(--cream); opacity: 0.55; font-size: 11px; padding: 5px 11px;
  font-family: "Verdana Pro", Verdana, sans-serif;
}
/* Dashboard sitbox Status column. */
.deals-list .col-status { white-space: nowrap; }
/* Dashboard sitbox extends to fill the space the (now-removed) minimetrics box
   occupied: row 1 = the tall sitbox, the graph moves up to row 2, and the
   aggbox spans both rows -- capped so it's never taller than the left-side
   menu (min(850px,92vh) stays under the row-inflation threshold on tall
   screens and within the sidebar's 100vh on short ones). Verified in headless
   Chrome (Deane 2026-05-30). */
/* Dashboard sitbox auto-sizes to its selected deals — row 1 is content-height
   (was a fixed 480px) and the deals-list-wrap neither flex-fills nor scrolls,
   so the sitbox is exactly as tall as the chosen situations & deals need, with
   no internal scrollbar (Deane 2026-06-01). Scoped to dashboard-mode; the
   /database deals-list is unchanged. The aggbox stays in its own row track so
   its (tall) content can't inflate the sitbox row — see the explicit
   grid-template-rows below. */
.db-charts.dashboard-mode { grid-template-rows: min-content var(--chart-row); position: relative; }
.db-charts.dashboard-mode .chart-cell[data-chart-cell="top-left"] {
  /* Floor: never shorter than a standard box (132px) for the empty / few-deal
     state; grows beyond it to fit more deals. The cell's min-height lifts row
     1's min-content floor without re-coupling it to the spanning aggbox. */
  min-height: 132px; align-self: start; overflow: visible;
}
.db-charts.dashboard-mode .chart-cell[data-chart-cell="top-left"] .deals-list-wrap {
  flex: 0 0 auto; overflow: visible; min-height: 0;
}
.db-charts.dashboard-mode .dash-keep { grid-column: 1; grid-row: 2; }
/* Dashboard aggbox is absolutely positioned over column 2 (Deane 2026-06-01).
   As a normal grid item spanning rows 1+2, a tall aggbox (synced to the
   filter-menu height) forced the auto sitbox row to grow — leaving a big gap
   between the sitbox and the graph. Taking it out of flow keeps its
   filter-matched height while leaving row 1 = the sitbox's own content, so the
   sitbox-graph gap stays tight (14px). Width = column 2 of the 1fr/1fr grid
   (container minus the 14px column-gap, halved); height comes from the JS sync. */
.db-charts.dashboard-mode .chart-cell[data-chart-cell="top-right"] {
  position: absolute;
  grid-column: 2; grid-row: 1 / span 2;   /* abspos containing block = column-2 area */
  top: 0; left: 0; right: 0;               /* fill that area's width; align to its top */
  min-height: 0; max-height: min(850px, 92vh);
}
/* Multi-line chart head: title row, search row, toggle row. Used by
   the antitrust % occurrence chart whose regulator picker is a search
   widget rather than a fixed-option dropdown. */
.chart-head-multiline {
  display: block;
}
.chart-head-multiline .chart-head-title {
  color: var(--cream); font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 13px; font-weight: 700; margin: 0 0 4px; letter-spacing: 0.3px;
}
.chart-reg-acronym { font-weight: 700; }
/* Horizontal layout of the in-chart regulator search: Level / Location
   / text input, all on one line so the chart canvas keeps room. */
.reg-search-inline {
  display: flex; flex-direction: row; gap: 4px; align-items: center;
  margin: 0 0 4px;
}
.reg-search-inline select, .reg-search-inline input {
  height: 22px; font-size: 10px;
  background: rgba(217,247,253,0.1); color: var(--cream);
  border: 1px solid rgba(217,247,253,0.3);
  font-family: "Verdana Pro", Verdana, sans-serif;
  padding: 0 4px; box-sizing: border-box;
}
.reg-search-inline .reg-level { flex: 0 0 90px; }
.reg-search-inline .reg-loc { flex: 0 0 110px; }
.reg-search-inline .reg-search { flex: 1 1 auto; }

/* First chart metric/grouping row: same translucent-navy look as
   the rest of the in-chart selects (was cream-pill .chart-group;
   user wants visual parity with the % occurrence chart's dropdowns). */
.chart-metric-row select {
  background: rgba(217,247,253,0.1);
  color: var(--cream);
  border: 1px solid rgba(217,247,253,0.3);
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-weight: 600;
  height: 22px;
  font-size: 10px;
  padding: 0 4px;
  box-sizing: border-box;
}
.chart-metric-by {
  color: var(--cream); opacity: 0.85;
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 11px; font-weight: 600;
  align-self: center;
}
.chart-head-toggle { margin: 0 0 4px; }

/* Toggle (e.g. "Show cases not filed") gets pushed to the right of the row. */
.chart-toggle {
  margin-left: auto;
  display: inline-flex; align-items: center; gap: 4px;
  color: var(--cream); font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 10px; font-weight: 600; opacity: 0.85; cursor: pointer;
  user-select: none;
}
/* In the multiline chart head the toggle sits flush-left on its own
   line, not pushed right. */
.chart-head-multiline .chart-toggle { margin-left: 0; }
.chart-toggle input[type=checkbox] { margin: 0; cursor: pointer; }
.chart-head h3 {
  color: var(--cream); font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 13px; font-weight: 700; margin: 0; letter-spacing: 0.3px;
}
.chart-group {
  background: var(--cream); color: var(--datablue); border: none;
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-size: 10px; font-weight: 700; padding: 3px 6px; cursor: pointer;
}
/* Chart.js's official "responsive in a flex parent" recipe: wrap the
   canvas in a position:relative div that takes the remaining column
   space, and absolute-position the canvas inside it. Removes the
   canvas from normal flow so its size never feeds back into the
   parent -- without this, hovering a bar triggers a Chart.js redraw
   that re-reads the parent height and expands the canvas, looping. */
.chart-canvas-wrap {
  flex: 1;
  position: relative;
  min-height: 0;
}
.chart-canvas-wrap canvas {
  position: absolute !important;
  inset: 0;
  width: 100% !important;
  height: 100% !important;
}

/* Footer band — same navy as the body background, cream italic text
   matching the header colour. Two lines (copyright + contact)
   stacked centre-aligned, table-data font size, generous bottom
   padding for breathing room. */
.page-footer {
  background: var(--navy);
  color: var(--cream);
  font-style: italic;
  font-size: 10px;
  letter-spacing: 0.3px;
  margin-top: 32px;
  padding: 14px 24px 28px;
  text-align: center;
}
.page-footer span {
  display: block;
}
.page-footer .footer-contact {
  margin-top: 4px;
}
/* Cloudflare's Email Address Obfuscation wraps info@ctfn.news in
   <a class="__cf_email__"> which the user agent paints with its
   default link colour. Override so the email blends with the rest
   of the footer text. */
.page-footer a {
  color: var(--cream);
  text-decoration: none;
}

/* Brief highlight when a cell's value changes during a live refresh. */
@keyframes cellflash {
  0%   { box-shadow: inset 0 0 0 9999px rgba(208, 226, 253, 0.65); }
  100% { box-shadow: inset 0 0 0 9999px rgba(208, 226, 253, 0); }
}
.metrics-table tbody td.flash {
  animation: cellflash 0.9s ease-out;
}

/* ── Section bands ─────────────────────────────────────────────────── */
.section {
  /* Transparent so the navy body background shows in the gutters
     either side of the (now content-width) table. */
  background: transparent;
}
/* Sections after the first get a navy gutter above them — roughly two
   data-row heights — so the second table's banner doesn't crowd the
   first table's last row. */
.section + .section {
  margin-top: 32px;
}
.section h2 {
  background: var(--navy);
  color: var(--cream);
  margin: 0;
  padding: 8px 24px;
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-weight: 700;
  font-size: 15px;
  letter-spacing: 1px;
  text-align: center;
}

/* "Download CSV" pill below each section banner. Sits on the navy
   gutter band, picks up the cream/datablue accent colors. */
.section-actions {
  text-align: center;
  padding: 10px 0 31px;
}
/* .plugin-btn (Excel-plugin download under the Live Metrics datestamp,
   Deane 2026-05-29) shares the section Download-CSV button's look. */
.csv-btn,
.plugin-btn,
.reset-btn {
  display: inline-block;
  color: var(--cream);
  background: transparent;
  border: 1px solid rgba(217, 247, 253, 0.4);
  border-radius: 2px;
  padding: 2px 10px;
  font-family: "Verdana Pro", Verdana, sans-serif;
  font-weight: 700;
  font-size: 10px;
  letter-spacing: 0.4px;
  text-decoration: none;
  text-transform: uppercase;
  cursor: pointer;
  transition: background 0.12s, color 0.12s;
}
.csv-btn:hover,
.plugin-btn:hover,
.reset-btn:hover {
  background: var(--cream);
  color: var(--navy);
  border-color: var(--cream);
}
/* RESET sits directly under the Download CSV button (Deane 2026-05-30). */
.reset-btn { display: block; margin: 6px auto 0; cursor: pointer; }
/* Centred row holding the plugin button, directly under the datestamp. */
.plugin-download {
  text-align: center;
  margin-top: 10px;
}

/* ── Tables ─────────────────────────────────────────────────────────── */
.table-wrap {
  overflow-x: auto;
}
.metrics-table {
  /* Shrink-to-fit so the table is only as wide as its content needs.
     Centred in the wrap so the navy body bg shows symmetrically. */
  width: auto;
  margin: 0 auto;
  border-collapse: collapse;
  font-size: 10.5px;
  font-variant-numeric: tabular-nums;
  background: var(--bg);
}
.metrics-table th,
.metrics-table td {
  padding: 2px 4px;
  border: none;
  vertical-align: middle;
}
.metrics-table td { white-space: nowrap; }

/* Super-headers row (DEAL PARTIES / PRICE LEVELS / …) — navy band */
.super-headers th {
  background: var(--navy);
  color: var(--cream);
  font-weight: 700;
  font-size: 10.5px;
  letter-spacing: 0.4px;
  padding: 3px 4px;
  text-align: center;
  white-space: nowrap;
}

/* Column-name row — same navy band; `pre-line` honors explicit `\n`
   in the header labels (DS3 puts them in "Ann.\nall-in",
   "Target break,\n1W %Δ", and "Implied gross chance of close,\n1W Δ"). */
.col-headers th {
  background: var(--navy);
  color: var(--cream);
  font-weight: 700;
  font-size: 9px;
  padding: 3px 3px 4px;
  text-align: center;
  vertical-align: bottom;
  white-space: pre-line;
  line-height: 1.1;
  min-width: 28px;
  max-width: 70px;
  cursor: pointer;
  user-select: none;
  position: relative;
}
/* Narrow specifically the liquidity column (header is wordy but values
   are ≤ 4 digits). */
.col-headers th[data-kind="liquidity"] {
  min-width: 36px;
  max-width: 48px;
}
/* CHANGES columns also stay narrow — the labels wrap on the comma. */
.col-headers th[data-kind="pct_int"] {
  max-width: 56px;
}
/* Profit pool: wrap the wordy "Profit pool (USD mn)" header so the
   column hugs the data (3-5 digit USD mn). Force centring on the
   wrapped lines via the inner sort-label since text-align on the th
   alone doesn't always centre inline-collapsed wrap content. */
.col-headers th[data-field="profit_pool"] {
  white-space: normal;
  min-width: 36px;
  max-width: 52px;
  text-align: center;
}
.col-headers th[data-field="profit_pool"] .sort-label {
  display: inline-block;
  text-align: center;
}
/* Spread + downside + target-price columns: values are short
   (percentages with at most 2 digits, or 4-7 digit money) so these
   columns can be much tighter than the default pct/money slot.
   Headers wrap via white-space:normal; .sort-label is inline-block
   + text-align centre so each wrapped line lands centred within
   the th. Vertical alignment + padding-bottom intentionally NOT
   overridden — they inherit the default `vertical-align: bottom`
   and `padding-bottom: 4px` from .col-headers th so the bottom
   lines of these wrapped headers align with the bottom lines of
   every other header in the row. */
.col-headers th[data-field="gross_spread"],
.col-headers th[data-field="all_in_spread"] {
  max-width: 42px;
  white-space: normal;
}
#live-table .col-headers th[data-field="gross_downside"],
#live-table .col-headers th[data-field="downside_with_rt_fees"] {
  min-width: 57px;
  max-width: 57px;
  white-space: normal;
  text-align: center;
}
#live-table .col-headers th[data-field="gross_downside"] .sort-label,
#live-table .col-headers th[data-field="downside_with_rt_fees"] .sort-label {
  display: inline-block;
  text-align: center;
}
#live-table .col-headers th[data-field="target_pre_deal"],
#live-table .col-headers th[data-field="target_break"],
#live-table .col-headers th[data-field="target_break_with_rt_fee"],
#live-table .col-headers th[data-field="target_now"] {
  max-width: 48px;
  white-space: normal;
  text-align: center;
}
#live-table .col-headers th[data-field="target_pre_deal"] .sort-label,
#live-table .col-headers th[data-field="target_break"] .sort-label,
#live-table .col-headers th[data-field="target_break_with_rt_fee"] .sort-label,
#live-table .col-headers th[data-field="target_now"] .sort-label {
  display: inline-block;
  text-align: center;
}
/* Situation type — narrow column, multi-line body so "Pre-event w/ activist"
   and "PUSU w/ activist" stack onto two lines via the <br> the template
   emits. Plain "Pre-event" / "PUSU" / "Live" fit comfortably on one line. */
.col-headers th[data-field="situation_type"] {
  max-width: 56px;
  white-space: normal;
  text-align: center;
}
.col-headers th[data-field="situation_type"] .sort-label {
  display: inline-block;
  text-align: center;
}
.metrics-table td.sit-type {
  max-width: 56px;
  white-space: normal;
  line-height: 1.1;
  text-align: center;
}

/* Pre-event table: gross_downside + gross_spread columns are narrower
   than their live-table siblings — pre-event values are typically 2-3
   chars (no negative %, no decimal), so the wider Live spacings waste
   horizontal real-estate. */
#preevent-table .col-headers th[data-field="gross_downside"],
#preevent-table .col-headers th[data-field="gross_spread"] {
  min-width: 38px;
  max-width: 42px;
  white-space: normal;
  text-align: center;
}
#preevent-table .col-headers th[data-field="gross_downside"] .sort-label,
#preevent-table .col-headers th[data-field="gross_spread"] .sort-label {
  display: inline-block;
  text-align: center;
}
#preevent-table td[data-field="gross_downside"],
#preevent-table td[data-field="gross_spread"] {
  max-width: 42px;
}

.col-headers th:hover { background: #1a304f; }
.col-headers th .sort-label { display: inline; }
.col-headers th .sort-arrow {
  display: inline-block;
  width: 10px;
  margin-left: 2px;
  font-size: 9px;
  opacity: 0.8;
}
.col-headers th.sort-asc .sort-arrow::before  { content: "▲"; }
.col-headers th.sort-desc .sort-arrow::before { content: "▼"; }

/* Subtle cream-tinted vertical separators between column groups */
.super-headers th + th,
.col-headers th + th {
  box-shadow: inset 1px 0 0 rgba(217, 247, 253, 0.16);
}

/* Data rows: zebra alternation (matches API_output A-column pattern).
   :nth-child re-evaluates after sort, so the alternation tracks the
   current visual order — not the original order.
   Inline `style="background:..."` from cell_fills overrides this when
   conditional formatting applies. */
.metrics-table tbody tr:nth-child(odd) {
  --row-bg: var(--zebra);
}
.metrics-table tbody tr:nth-child(odd) td {
  background: var(--row-bg);
}
.metrics-table tbody tr:nth-child(even) {
  --row-bg: var(--bg);
}
.metrics-table tbody tr:nth-child(even) td {
  background: var(--row-bg);
}
/* Cells whose value should visually disappear into the row bg
   (profit_pool ≤ 0). Using var(--row-bg) — not a hard-coded zebra —
   so the disappearance follows the current sort order. */
.metrics-table tbody td.zebra-hide {
  background: var(--row-bg);
  color: var(--row-bg);
}
/* Italicise every cell in a CVR row to visually flag deals with a
   contingent-value-right (CVR) component to the offer structure. */
.metrics-table tbody tr.cvr-row td {
  font-style: italic;
}
.metrics-table tbody td {
  color: var(--datablue);
  font-size: 10px;
  padding: 1.5px 4px;
  line-height: 1.15;
  text-align: center;     /* all row contents centered per user request */
  white-space: normal;    /* allow text wrap to shrink column widths further */
}
.metrics-table tbody tr:hover td {
  filter: brightness(0.96);
}

td.num { text-align: center; }
td.txt { text-align: center; }

/* Editable cells (undisturbed date, CTFN closing estimate) — click to
   override locally. A faint dashed underline tells the user the value
   is interactive; the column-wide chip-hover background flags it on
   hover. */
td.editable {
  cursor: pointer;
  text-decoration: underline dashed rgba(0, 32, 96, 0.35);
  text-underline-offset: 2px;
}
td.editable:hover {
  background: var(--chip-hover) !important;
  text-decoration-color: var(--datablue);
}
/* Any cell carrying an active user override — both the directly-edited
   cells (date / estimate) and downstream recomputed cells (ann all-in
   after a close-date change) get the bold-amber treatment so the user
   can see at a glance which values come from their overrides. */
.metrics-table tbody td.overridden {
  font-weight: 700;
  color: #6b4400;
}
td.editable.overridden {
  text-decoration: underline solid #b8910a;
}
td.editable input.cell-input {
  width: 100%;
  box-sizing: border-box;
  border: 1px solid var(--datablue);
  background: #fff;
  color: var(--datablue);
  font: inherit;
  font-size: 10px;
  text-align: center;
  padding: 1px 2px;
  border-radius: 2px;
  outline: none;
}

/* Comp chips — column hugs the chip content with only a small margin.
   Wider than 220/320 to absorb the horizontal space freed by the
   narrowed Profit pool / spread / downside / target-price columns. */
td.comps {
  white-space: normal;
  min-width: 260px;
  max-width: 400px;
  padding: 1px 4px;
  text-align: left;          /* override the centred default in this cell */
}
/* Header for COMPS — match the body cell's bounds so the column
   doesn't get stretched by the (possibly long) header label. */
.col-headers th[data-kind="comps"],
.col-headers th[data-kind="comps_multi"] {
  min-width: 260px;
  max-width: 400px;
}

/* Pre-Event table: every column 8% wider than the Live table. Done by
   scaling each min-width / max-width by 1.08 (rounded). Touching all
   ranges in the col-headers + the body comps cell keeps Live unchanged. */
#preevent-table .col-headers th {
  min-width: 30px;     /* 28 * 1.08 */
  max-width: 76px;     /* 70 * 1.08 */
}
#preevent-table .col-headers th[data-kind="liquidity"] {
  min-width: 39px;     /* 36 * 1.08 */
  max-width: 52px;     /* 48 * 1.08 */
}
#preevent-table .col-headers th[data-kind="pct_int"] {
  max-width: 60px;     /* 56 * 1.08 */
}
#preevent-table .col-headers th[data-kind="comps_multi"],
#preevent-table .col-headers th[data-kind="comps"],
#preevent-table td.comps {
  min-width: 281px;    /* 260 * 1.08 */
  max-width: 432px;    /* 400 * 1.08 */
}
/* Pre-Event Target + Acquirer columns: body cells wrap to 2 lines for
   long target names (Brighthouse Financial, Caesars Entertainment,
   Whitestone REIT, etc.) so the columns stay the same width as the
   other Pre-Event headers and the "Target" / "Acquirer" col-headers
   pick up the identical formatting -- no special-cased min-width /
   max-width / white-space, they're treated like every other Pre-Event
   header. Earlier attempts used `max-width: none` + `white-space:
   nowrap` to keep names on one line, but that auto-sized the column
   wide enough that the short header text floated in a much taller-
   than-it-needed-to-be navy block and read as "headers too low". */
#preevent-table td[data-field="target"],
#preevent-table td[data-field="acquirer"] {
  white-space: normal;
}
/* One row per FAHIM space inside the COMPS cell; chips on the left,
   weight percentage flushed right via flexbox. */
.comp-line {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 4px;
  line-height: 1.2;
  padding: 2px 0;
}
/* Thin grey divider between FAHIM-space lines in a multi-space cell */
.comp-line:not(:last-child) {
  border-bottom: 1px solid #d8dde5;
}
.comp-tickers {
  flex: 1;
  /* Keep all chips for a single FAHIM space on one line. The column's
     min-width is sized to fit a typical 4-chip set; if a row needs more,
     `td.comps`'s max-width is the cap and any overflow would scroll
     within the cell — but in practice we don't see >4 chips per space. */
  white-space: nowrap;
}
.comp-weight {
  font-weight: 700;
  font-size: 9px;
  color: var(--datablue);
  opacity: 0.75;
  padding-left: 4px;
  flex-shrink: 0;
}
.comp-chip {
  display: inline-block;
  padding: 0 4px;
  margin: 1px 1px;
  background: var(--chip-bg);
  border: 1px solid var(--chip-border);
  border-radius: 2px;
  cursor: pointer;
  font-weight: 400;      /* non-bold per user request */
  font-size: 9.5px;
  color: var(--datablue);
  transition: background 0.12s, border-color 0.12s;
}
.comp-chip:hover {
  background: var(--chip-hover);
  border-color: var(--datablue);
}
.comp-chip.swapped {
  background: var(--chip-hover);
  border-color: #b8910a;
  color: #6b4400;
}

/* ── Swap modal ─────────────────────────────────────────────────────── */
.swap-overlay {
  position: fixed;
  inset: 0;
  background: rgba(14, 31, 61, 0.65);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 1000;
}
.swap-overlay.hidden { display: none; }

.swap-modal {
  background: var(--bg);
  width: 440px;
  border-radius: 3px;
  box-shadow: 0 10px 40px rgba(0,0,0,0.35);
  overflow: hidden;
  font-family: "Verdana Pro", Verdana, sans-serif;
}
.swap-header {
  background: var(--navy);
  color: var(--cream);
  padding: 8px 14px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.3px;
}
.swap-header strong { color: #FFF4D6; }
.swap-close {
  background: none;
  border: none;
  color: var(--cream);
  font-size: 22px;
  line-height: 1;
  cursor: pointer;
  padding: 0;
}
.swap-section {
  padding: 10px 14px;
  border-bottom: 1px solid #e5e9ee;
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: wrap;
}
.swap-section:last-of-type { border-bottom: none; }
.swap-section label {
  width: 100%;
  font-size: 11px;
  color: #5b6b7d;
  font-weight: 600;
}
.swap-section select,
.swap-section input {
  flex: 1;
  padding: 4px 6px;
  border: 1px solid #c7d3e0;
  border-radius: 2px;
  font: inherit;
  font-size: 11px;
  color: var(--datablue);
  background: #fbfcfd;
}
.swap-section select:focus,
.swap-section input:focus {
  outline: none;
  border-color: var(--datablue);
}
.swap-section button {
  padding: 4px 12px;
  background: var(--navy);
  color: var(--cream);
  border: none;
  border-radius: 2px;
  cursor: pointer;
  font: inherit;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.4px;
  text-transform: uppercase;
}
.swap-section button:hover { background: #1a304f; }
.swap-status {
  padding: 6px 14px;
  font-size: 10px;
  color: #5b6b7d;
  min-height: 22px;
  background: #f5f7f9;
}
.swap-status.success { color: var(--pos); font-weight: 700; }
.swap-status.error { color: var(--neg); font-weight: 700; }
