/* ─── IPO — DRHP forensics page. Uses common.css theme tokens (both themes).
   Type scale mirrors deep-dive/kavach: serif only at page level; section headers
   13px/800/uppercase; prose 13px/1.7; sub-labels 11px; data via font-data. ── */

.ipo-wrap { max-width: 1080px; margin: 0 auto; }
/* Detail page spans the full deep-dive width (1200px) so it reads identically to the 360° profile.
   Data (tables/stats/command strip) uses the width; PROSE is capped to a reading measure below. */
.ipo-wrap-detail { max-width: 1200px; padding: 0 24px; box-sizing: border-box; }
/* Prose flows full-width like the 360° profile's .ov-prose (no ch-cap) so sections fill the 1200px card
   instead of leaving a dead right half. Two-column blocks (flag tables, moat grid) fill the rest. */

/* page-level heading (serif — mirrors the deep-dive/360° hero EXACTLY: 28px / 800 / -0.02em tracking).
   NOTE: DM Serif Display ships only at 400, so 800 is browser-synthesized bold — kept to stay identical
   to the 360° header; a proper real-bold face is a shared cross-page fix, not an IPO-only divergence.
   line-height 1.2 (not 1.15) so long IPO names wrap cleanly instead of colliding descenders/caps. */
.ipo-h1 {
  font-family: var(--font-heading);
  font-size: 28px;
  font-weight: 800;
  line-height: 1.2;
  letter-spacing: -0.02em;
  color: var(--text-primary);
  margin: 0;
}

.ipo-head { margin: 18px 0 18px; }

.ipo-sub {
  font-family: var(--font-body);
  font-size: 13px;
  line-height: 1.7;
  color: var(--text-secondary);
  max-width: 660px;
  margin: 8px 0 0;
}

/* filters */
.ipo-filters { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin: 0 0 18px; }
.ipo-search { flex: 0 1 220px; min-width: 140px; padding: 7px 14px; border-radius: 999px; border: 1px solid var(--border); background: var(--bg-secondary, transparent); color: var(--text-primary); font-size: 13px; outline: none; }
.ipo-search:focus { border-color: var(--accent); }
.ipo-search::placeholder { color: var(--text-tertiary); }
.ipo-filter-gap { flex: 1; }

.ipo-pill {
  font-family: var(--font-body);
  background: var(--tint-4);
  color: var(--text-secondary);
  border: 1px solid transparent;
  border-radius: 999px;
  padding: 6px 14px;
  font-size: 12px;
  font-weight: 600;
  cursor: pointer;
}

.ipo-pill.active { background: var(--accent-tint, rgba(52,211,153,0.12)); color: var(--accent); border-color: var(--accent); }

/* list cards */
.ipo-card {
  border-left: 4px solid var(--sig, var(--border));
  cursor: pointer;
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: 16px;
  margin-bottom: 14px;
  transition: transform 0.12s ease, box-shadow 0.12s ease;
}

.ipo-card:hover { transform: translateY(-1px); box-shadow: var(--shadow-card-sm); }

/* Listed cards are read-only recaps — no navigation, so no click affordance. */
.ipo-card-static { cursor: default; }
.ipo-card-static:hover { transform: none; box-shadow: none; }

.ipo-card-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
/* Name row: company name with the ECS ring sitting immediately to its right. */
.ipo-card-name-row { display: flex; align-items: center; gap: 10px; }

.ipo-card-name { font-family: var(--font-body); font-size: 14px; font-weight: 700; color: var(--text-primary); line-height: 1.3; }
.ipo-card-industry { font-size: 11px; color: var(--text-tertiary); margin-top: 3px; }

.ipo-chip-row { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; }

.ipo-chip {
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  padding: 3px 8px;
  border-radius: 5px;
  background: var(--tint-6);
  color: var(--text-secondary);
  white-space: nowrap;
}

.ipo-chip.st-open { color: var(--green); background: rgba(52,211,153,0.12); }
.ipo-chip.sub-live { color: var(--green); background: rgba(52,211,153,0.12); font-variant-numeric: tabular-nums; }
.ipo-chip.sub-under { color: var(--warn, #e8a13c); background: rgba(232,161,60,0.12); font-variant-numeric: tabular-nums; }
.ipo-sub-split { font-size: 11px; font-weight: 600; color: var(--text-tertiary); margin-top: 2px; font-variant-numeric: tabular-nums; }
.ipo-chip.st-upcoming { color: var(--blue); background: rgba(96,165,250,0.12); }
.ipo-chip.st-closed { color: var(--amber); background: rgba(251,191,36,0.12); }

.ipo-card-facts { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px; }

.ipo-label {
  display: block;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.07em;
  text-transform: uppercase;
  color: var(--text-tertiary);
  margin-bottom: 2px;
}

.ipo-fact { font-family: var(--font-data); font-variant-numeric: tabular-nums; font-size: 13px; font-weight: 700; color: var(--text-primary); line-height: 1.25; }

.ipo-card-sub {
  display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap;
  padding-top: 10px; border-top: 1px solid var(--tint-5);
}
.ipo-card-sub-main {
  font-family: var(--font-data); font-variant-numeric: tabular-nums;
  font-size: 12px; font-weight: 700; color: var(--accent);
}
.ipo-card-sub-cats {
  font-family: var(--font-data); font-variant-numeric: tabular-nums;
  font-size: 11px; font-weight: 600; color: var(--text-tertiary);
}

/* Subscription tier colors on the first-class fact (SEBI demand buckets, factual only) */
.ipo-fact .ipo-sub-hot { color: var(--accent); }
.ipo-fact .ipo-sub-under { color: var(--warn, #e8a13c); }

.ipo-card-verdict {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding-top: 10px; border-top: 1px solid var(--border);
  font-size: 12px; font-weight: 500; color: var(--text-primary);
}

.ipo-card-verdict-label { font-size: 12px; font-weight: 600; }
.ipo-pending { color: var(--text-tertiary); font-size: 12px; }
/* Clickability cue — always accent so the affordance is visible at rest; the arrow
   nudges right on card hover for a live feel. */
.ipo-card-cta {
  font-size: 12px; font-weight: 700; color: var(--accent);
  white-space: nowrap; display: inline-flex; align-items: center; gap: 4px;
}
.ipo-card-cta-arrow { transition: transform 0.15s ease; display: inline-block; }
.ipo-card:hover .ipo-card-cta { text-decoration: underline; }
.ipo-card:hover .ipo-card-cta-arrow { transform: translateX(3px); }

/* Right cluster of the verdict row: ECS ring + DRHP link, pushed to the edge. */
.ipo-card-verdict-right { margin-left: auto; display: inline-flex; align-items: center; gap: 12px; }
.ipo-card-drhp {
  font-family: var(--font-mono);
  font-size: 12px; font-weight: 700;
  color: var(--blue);
  background: rgba(96,165,250,0.12);
  border: 1px solid rgba(96,165,250,0.35);
  border-radius: 8px; padding: 6px 12px;
  text-decoration: none; white-space: nowrap;
}
.ipo-card-drhp:hover { text-decoration: underline; background: rgba(96,165,250,0.2); }
.ipo-ecs-ring { display: inline-flex; }
.ipo-ecs-ring-num {
  font-family: var(--font-mono); font-size: 13px; font-weight: 800;
  fill: var(--text-primary);
}

/* signal badge — color + shape + label, never color alone */
.ipo-signal-badge {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 10px; font-weight: 800; letter-spacing: 0.07em; text-transform: uppercase;
  padding: 4px 10px; border-radius: 999px; border: 1px solid currentColor;
}
.ipo-signal-badge .dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; }

/* detail: hero */
.ipo-back { display: inline-block; font-size: 12px; font-weight: 600; color: var(--text-tertiary); text-decoration: none; margin: 8px 0; padding: 8px 0; }
.ipo-back:hover { color: var(--text-primary); }

/* card-less, like the deep-dive header — the header + command strip sit directly on the page */
.ipo-hero { margin-bottom: 18px; }
/* breathing room between the header (name/meta/verdict) and the command strip — the 360° gets this
   from its flex-column gap; scope to .ipo-hero so the shared .dd-command-strip is untouched elsewhere. */
.ipo-hero .dd-command-strip { margin-top: 20px; }

.ipo-signal-label { font-family: var(--font-body); font-size: 13px; font-weight: 700; margin: 8px 0 0; max-width: 220px; line-height: 1.45; }

.ipo-score-block { display: flex; align-items: center; gap: 16px; flex-shrink: 0; }
.ipo-ring { width: 84px; height: 84px; flex-shrink: 0; }
.ipo-ring text { font-family: var(--font-data); font-size: 24px; font-weight: 800; fill: var(--text-primary); }
.ipo-ring-side { display: flex; flex-direction: column; align-items: flex-start; }

/* the numbers everyone tracks — fixed 3-row tile anatomy so baselines always align */
.ipo-facts {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(126px, 1fr));
  gap: 14px 0;
  margin-top: 20px;
  border-top: 1px solid var(--border);
  padding-top: 16px;
}

.ipo-facts-tile {
  display: flex; flex-direction: column; gap: 3px; min-width: 0;
  padding-right: 16px; margin-right: 16px;
  border-right: 1px solid var(--border);
}
.ipo-facts-tile:last-child { border-right: none; margin-right: 0; }

.ipo-facts-label {
  font-size: 10px; font-weight: 700; letter-spacing: 0.07em; text-transform: uppercase;
  color: var(--text-tertiary); line-height: 14px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

.ipo-facts-value {
  font-family: var(--font-data); font-variant-numeric: tabular-nums;
  font-size: 16px; font-weight: 700; color: var(--text-primary);
  line-height: 20px; white-space: nowrap;
}
.ipo-facts-value.muted { color: var(--text-tertiary); font-weight: 500; }

.ipo-facts-sub {
  font-family: var(--font-data);
  font-size: 10px; font-weight: 600; color: var(--text-tertiary);
  line-height: 14px; min-height: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ipo-facts-sub .up { color: var(--green); }
.ipo-facts-sub .down { color: var(--red); }

@media (max-width: 720px) {
  .ipo-facts { grid-template-columns: repeat(3, 1fr); }
  .ipo-facts-tile:nth-child(3n) { border-right: none; }
}

/* sections use the 360° profile header (kavach-section-hdr from dd-kavach.css) */
.ipo-section .kavach-section-hdr { margin-bottom: 16px; }
.ipo-section { padding: 24px 28px; margin-bottom: 16px; }
.ipo-secnum {
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 600;
  color: var(--text-tertiary);
  margin-right: 10px;
  letter-spacing: 0;
}
/* teaching (i) — progressive disclosure on the section title */
.ipo-info {
  position: relative; display: inline-flex; align-items: center; justify-content: center;
  width: 15px; height: 15px; margin-left: 8px; vertical-align: 1px;
  border: 1px solid var(--tint-10); border-radius: 50%;
  font-family: var(--font-mono); font-size: 9px; font-weight: 600; font-style: normal;
  color: var(--text-tertiary); text-transform: none; letter-spacing: 0; cursor: help;
}
.ipo-info:hover, .ipo-info:focus-visible { color: var(--accent); border-color: var(--accent); outline: none; }
.ipo-info-card {
  display: none; position: absolute; top: calc(100% + 8px); left: -8px; z-index: 20;
  width: 320px; padding: 12px 14px;
  font-family: var(--font-body); font-size: 12px; font-weight: 400; line-height: 1.7;
  letter-spacing: 0; text-transform: none; text-align: left;
  color: var(--text-secondary); background: var(--bg-elevated);
  border: 1px solid var(--border); border-radius: 10px;
  box-shadow: 0 8px 24px rgba(0,0,0,0.3); pointer-events: none;
}
.ipo-info:hover .ipo-info-card, .ipo-info:focus-visible .ipo-info-card, .ipo-info:focus .ipo-info-card { display: block; }
/* one prose size everywhere (13px/1.7) — self-sufficient so a block without .kavach-prose can't
   fall back to a larger inherited default (was making the reviews line bigger than the lead). */
.ipo-prose-block { margin: 0 0 12px; font-size: 13px; line-height: 1.7; color: var(--text-secondary); }

/* plain-English lead + newbie explainer */

.ipo-explainer {
  font-size: 11px;
  line-height: 1.65;
  color: var(--text-tertiary);
  font-style: italic;
  margin: 0 0 14px;
}
.ipo-explainer .q { font-weight: 700; color: var(--text-secondary); margin-right: 4px; }

.ipo-sub-label {
  font-size: 11px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--text-secondary); margin: 14px 0 8px;
}

/* fresh vs OFS split bar */
.ipo-split { margin: 4px 0 16px; }
.ipo-split-track { display: flex; height: 12px; border-radius: 6px; overflow: hidden; background: var(--tint-5); }
.ipo-split-seg.fresh { background: var(--green); }
.ipo-split-seg.ofs { background: var(--amber); }
.ipo-split-legend { display: flex; gap: 18px; flex-wrap: wrap; margin-top: 8px; font-size: 11px; color: var(--text-secondary); }
.ipo-split-legend .swatch { display: inline-block; width: 8px; height: 8px; border-radius: 2px; margin-right: 6px; }
.ipo-split-legend .swatch.fresh { background: var(--green); }
.ipo-split-legend .swatch.ofs { background: var(--amber); }

/* compact inline flags (deep-dive 360° pattern) */
.ipo-inline-flags { margin-top: 14px; border-top: 1px dashed var(--border); padding-top: 12px; }
.ipo-inline-flag { display: flex; gap: 8px; font-size: 12px; line-height: 1.65; color: var(--text-secondary); margin-bottom: 6px; }
.ipo-inline-flag .mark { flex-shrink: 0; font-size: 11px; }

/* flags (verdict section only) */
.ipo-flag-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-top: 4px; }
@media (max-width: 720px) { .ipo-flag-cols { grid-template-columns: 1fr; } .ipo-card-facts { grid-template-columns: 1fr 1fr; } }

.ipo-col-head { font-size: 10px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; margin: 0 0 8px; color: var(--text-secondary); }
.ipo-col-head.red { color: var(--red); }
.ipo-col-head.green { color: var(--green); }

.ipo-flag {
  border-left: 2px solid var(--red);
  padding: 2px 0 2px 14px;
  margin-bottom: 14px;
}
.ipo-flag.green { border-left-color: var(--green); }

.ipo-flag-title { font-size: 12px; font-weight: 700; color: var(--text-primary); margin: 0 0 4px; }
.ipo-flag-desc { font-size: 12px; line-height: 1.65; color: var(--text-secondary); margin: 0; }
.ipo-flag-impact { font-size: 11px; line-height: 1.6; color: var(--text-tertiary); margin: 6px 0 0; padding-top: 6px; border-top: 1px dashed var(--border); }

/* stat tiles */
.ipo-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 260px)); gap: 12px 24px; margin: 0 0 14px; }

.ipo-stat { border-top: 1px solid var(--border); padding: 10px 2px 0; }
.ipo-stat-value { font-family: var(--font-data); font-variant-numeric: tabular-nums; font-size: 16px; font-weight: 700; color: var(--text-primary); line-height: 1.2; }

.ipo-cite {
  display: inline-block;
  font-family: var(--font-mono);
  font-size: 9px;
  font-weight: 600;
  color: var(--text-tertiary);
  border-bottom: 1px dotted var(--text-tertiary);
  margin-top: 6px;
  cursor: help;
  white-space: nowrap;
  text-decoration: none;
}
a.ipo-cite:hover { color: var(--accent); border-bottom-color: var(--accent); }

/* tables */
.ipo-table-wrap { overflow-x: auto; margin-bottom: 14px; }
.ipo-table { width: 100%; border-collapse: collapse; font-size: 12px; font-family: var(--font-data); font-variant-numeric: tabular-nums; }
.ipo-table th {
  font-family: var(--font-body); font-size: 10px; font-weight: 700; letter-spacing: 0.07em; text-transform: uppercase;
  color: var(--text-tertiary); text-align: left; padding: 8px 10px; border-bottom: 1px solid var(--border);
}
.ipo-table td { padding: 9px 10px; border-bottom: 1px solid var(--border); color: var(--text-primary); vertical-align: top; line-height: 1.5; }
.ipo-table th.num, .ipo-table td.num { text-align: right; }
.ipo-table td .ipo-cite { margin-top: 2px; margin-left: 6px; }

/* callouts */
.ipo-callout { border-radius: 10px; padding: 13px 16px; font-size: 13px; line-height: 1.7; margin: 2px 0 16px; }
.ipo-callout.warn { background: rgba(251,191,36,0.09); color: var(--amber); }
.ipo-callout.ok { background: rgba(52,211,153,0.08); color: var(--green); }
/* the highlighter: one decision insight per section. Neutral text with an emerald accent —
   amber is reserved house-wide for warnings, and a decoded insight is analysis, not a warning. */
.ipo-callout.decoded { background: rgba(52,211,153,0.06); color: var(--text-secondary); border-left: 3px solid var(--green); border-radius: 0 10px 10px 0; }
.ipo-callout.decoded strong { color: var(--green); font-weight: 800; }
/* bottom line — the amber verdict, now CLOSING each section (prose leads above it) */
.ipo-bl { margin-top: 16px; }
.ipo-bl-tag { display: block; font-size: 10px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; opacity: 0.7; margin-bottom: 3px; }

/* trust + review */
.ipo-trust {
  margin-top: 16px; padding-top: 12px; border-top: 1px solid var(--border);
  font-size: 11px; font-weight: 500; color: var(--text-tertiary); line-height: 1.7;
}
.ipo-trust a { color: var(--accent); text-decoration: underline; font-weight: 600; margin-left: 4px; white-space: nowrap; }

.ipo-review {
  margin-top: 12px; padding: 10px 14px; border-radius: 10px;
  background: rgba(251,191,36,0.1); color: var(--amber);
  font-size: 12px; font-weight: 600;
}

/* ── analysis-in-progress panel ── */
@keyframes ipoAnalyzeSpin { to { transform: rotate(360deg); } }
.ipo-analyzing-card { padding: 26px 28px; }
.ipo-analyzing-top { display: flex; gap: 14px; align-items: flex-start; margin-bottom: 18px; }
.ipo-analyzing-orb {
  flex: 0 0 auto; width: 30px; height: 30px; border-radius: 50%;
  background: conic-gradient(from 0deg, var(--accent), var(--accent-tint), var(--accent));
  -webkit-mask: radial-gradient(closest-side, transparent 58%, #000 60%);
          mask: radial-gradient(closest-side, transparent 58%, #000 60%);
  animation: ipoAnalyzeSpin 1.05s linear infinite;
}
.ipo-analyzing-title { font-size: 16px; font-weight: 700; color: var(--text-primary); letter-spacing: -0.01em; }
.ipo-analyzing-sub { margin-top: 3px; font-size: 12.5px; color: var(--text-secondary); line-height: 1.5; max-width: 56ch; }
.ipo-dots i { font-style: normal; opacity: 0.2; animation: ipoDot 1.4s infinite; }
.ipo-dots i:nth-child(2) { animation-delay: 0.2s; }
.ipo-dots i:nth-child(3) { animation-delay: 0.4s; }
@keyframes ipoDot { 0%, 60%, 100% { opacity: 0.2; } 30% { opacity: 1; } }

.ipo-asteps { list-style: none; margin: 0; padding: 0; }
.ipo-astep {
  display: flex; gap: 12px; align-items: center; padding: 9px 10px; border-radius: 10px;
  opacity: 0.4; transition: opacity 0.55s ease, background 0.4s ease;
}
.ipo-astep.is-done, .ipo-astep.is-active { opacity: 1; }
.ipo-astep.is-active { background: var(--surface-2, rgba(0,0,0,0.03)); }
.ipo-astep-mark { position: relative; flex: 0 0 auto; width: 20px; height: 20px; }
.ipo-astep-mark > span {
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  opacity: 0; transition: opacity 0.3s ease;
}
.ipo-astep-dot { opacity: 1; }
.ipo-astep-dot::before { content: ''; width: 7px; height: 7px; border-radius: 50%; background: var(--text-tertiary); opacity: 0.45; }
.ipo-astep-spin::before {
  content: ''; width: 15px; height: 15px; border-radius: 50%;
  border: 2px solid var(--border); border-top-color: var(--accent); animation: ipoAnalyzeSpin 0.7s linear infinite;
}
.ipo-astep-tick { font-size: 11px; font-weight: 800; color: #fff; background: var(--green); border-radius: 50%; }
.ipo-astep.is-active .ipo-astep-dot { opacity: 0; }
.ipo-astep.is-active .ipo-astep-spin { opacity: 1; }
.ipo-astep.is-done .ipo-astep-dot, .ipo-astep.is-done .ipo-astep-spin { opacity: 0; }
.ipo-astep.is-done .ipo-astep-tick { opacity: 1; }
.ipo-astep-txt { display: flex; flex-direction: column; line-height: 1.3; min-width: 0; }
.ipo-astep-title { font-size: 13.5px; font-weight: 600; color: var(--text-primary); }
.ipo-astep.is-active .ipo-astep-title { color: var(--accent); }
.ipo-astep-sub { font-size: 11.5px; color: var(--text-tertiary); }
.ipo-analyzing-foot {
  margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--border);
  font-size: 11.5px; color: var(--text-tertiary); line-height: 1.6;
}

/* ── derived-number "how it's calculated" tooltip (ⓘ on m-cap, P/E, D/E, growth …) ── */
.ipo-calc {
  display: inline-flex; align-items: center; justify-content: center;
  width: 14px; height: 14px; margin-left: 5px; border-radius: 50%;
  border: 1px solid var(--border-strong, var(--border)); color: var(--text-tertiary);
  font-size: 9px; font-weight: 700; font-style: normal; line-height: 1; cursor: help;
  position: relative; vertical-align: middle;
  transition: color 0.15s ease, border-color 0.15s ease;
}
.ipo-calc:hover, .ipo-calc:focus { color: var(--accent); border-color: var(--accent); outline: none; }
.ipo-calc-pop {
  position: absolute; bottom: calc(100% + 8px); left: 50%; transform: translateX(-50%);
  min-width: 190px; max-width: 300px; padding: 9px 12px; z-index: 40;
  background: var(--text-primary); color: var(--card-bg, #fff);
  border-radius: 8px; font-size: 11.5px; font-weight: 500; line-height: 1.55;
  white-space: normal; text-align: left; letter-spacing: normal;
  box-shadow: 0 6px 22px rgba(0, 0, 0, 0.2);
  opacity: 0; visibility: hidden; transition: opacity 0.15s ease, visibility 0.15s ease; pointer-events: none;
}
.ipo-calc-pop::after {
  content: ''; position: absolute; top: 100%; left: 50%; transform: translateX(-50%);
  border: 5px solid transparent; border-top-color: var(--text-primary);
}
.ipo-calc:hover .ipo-calc-pop, .ipo-calc:focus .ipo-calc-pop { opacity: 1; visibility: visible; }

/* people cards — persons are entities, not paragraphs */
.ipo-people-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 16px; }
@media (max-width: 720px) { .ipo-people-grid { grid-template-columns: 1fr; } }
.ipo-person {
  background: var(--tint-2); border: 1px solid var(--tint-5); border-radius: 10px;
  padding: 14px 16px; display: flex; flex-direction: column;
}
.ipo-person-name { font-size: 13px; font-weight: 700; color: var(--text-primary); margin: 0; }
.ipo-person-role { font-size: 11px; font-weight: 600; color: var(--text-tertiary); margin: 1px 0 8px; }
.ipo-person-bg { font-size: 12px; line-height: 1.65; color: var(--text-secondary); margin: 0 0 10px; }
.ipo-person-cost {
  font-size: 12px; color: var(--text-secondary); margin: auto 0 0;
  padding-top: 10px; border-top: 1px solid var(--tint-5);
}
.ipo-person-cost strong { color: var(--text-primary); font-family: var(--font-data); }
.ipo-person-web { margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--tint-5); }
.ipo-person-web-hd {
  font-size: 9px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--text-tertiary); margin: 0 0 6px;
}
.ipo-person-record { font-size: 12px; line-height: 1.65; color: var(--text-secondary); margin: 0 0 6px; }
.ipo-person-record .mark { font-size: 8px; vertical-align: 2px; margin-right: 4px; }

.ipo-case {
  border-left: 2px solid var(--amber);
  padding: 2px 0 2px 14px;
  margin-bottom: 12px;
  font-size: 12px;
  line-height: 1.65;
  color: var(--text-secondary);
}

/* beyond-the-DRHP web findings */
.ipo-web-finding { display: flex; gap: 10px; padding: 10px 0; border-bottom: 1px solid var(--border); }
.ipo-web-finding:last-child { border-bottom: none; }
.ipo-web-finding .dot { width: 7px; height: 7px; border-radius: 50%; margin-top: 5px; flex-shrink: 0; }
.ipo-web-finding .t { font-size: 13px; font-weight: 700; color: var(--text-primary); margin: 0 0 3px; }
.ipo-ft-title .cat, .ipo-web-finding .cat {
  font-size: 9px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--text-tertiary); background: var(--tint-5); border-radius: 4px; padding: 2px 6px; margin-left: 6px; vertical-align: 1px;
}
.ipo-web-finding .d { font-size: 13px; line-height: 1.7; color: var(--text-secondary); margin: 0; }

.ipo-src {
  font-family: var(--font-mono);
  font-size: 9px; font-weight: 600;
  color: var(--blue);
  background: rgba(96,165,250,0.1);
  border-radius: 4px; padding: 2px 6px;
  text-decoration: none; white-space: nowrap;
}
.ipo-src:hover { text-decoration: underline; }
.ipo-src-pending { color: var(--text-tertiary); background: var(--tint-10); }

/* outside-world evidence: every point behind the story callout with its source */
.ipo-evi { margin: 0 0 16px; }
.ipo-evi-hd {
  font-size: 10px; font-weight: 700; letter-spacing: 0.07em; text-transform: uppercase;
  color: var(--text-tertiary); margin: 0 0 8px;
}
.ipo-evi-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 7px; }
.ipo-evi-item { display: flex; gap: 8px; align-items: baseline; font-size: 12.5px; line-height: 1.55; color: var(--text-secondary); }
.ipo-evi-item .mark { flex-shrink: 0; font-size: 10px; }
.ipo-evi-text { flex: 1; }

.ipo-none { font-size: 12px; color: var(--text-tertiary); font-style: italic; }

/* misc */
.ipo-empty { text-align: center; color: var(--text-tertiary); padding: 60px 0; font-size: 13px; }
.ipo-loading { text-align: center; color: var(--text-tertiary); padding: 90px 0; font-size: 13px; }
.ipo-spinner {
  width: 28px; height: 28px; border: 3px solid var(--tint-10); border-top-color: var(--accent);
  border-radius: 50%; margin: 0 auto 14px; animation: ipo-spin 0.9s linear infinite;
}
@keyframes ipo-spin { to { transform: rotate(360deg); } }

.ipo-footnote { margin: 32px 0 8px; font-size: 11px; line-height: 1.7; color: var(--text-tertiary); max-width: 680px; }

/* hero meta line — quiet, no chips */
/* micro-meta OF the name — must stay quieter than the verdict deck below (weight 500, hugs the title). */
.ipo-meta-line {
  font-size: 11px; font-weight: 500; letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--text-tertiary); margin: 5px 0 0;
}
/* Demand chip beside the NAME — the one number everyone asks first on a live/closed issue.
   Inline inside the h1 so it wraps WITH the name; nudged up to sit on the caps' optical middle. */
.ipo-h1 .ipo-chip { margin-left: 12px; vertical-align: middle; transform: translateY(-3px); }

/* Command-strip demand cell: dd-pulse-value is a nowrap flex row (chart.css), which flattened the
   category split onto the multiple's line and overflowed the cell. The split takes its own full
   row inside the cell and wraps, centered like the rest of the tile. */
.ipo-hero .dd-pulse-value { flex-wrap: wrap; justify-content: center; }
.ipo-hero .dd-pulse-value .ipo-sub-split { flex-basis: 100%; white-space: normal; text-align: center; font-size: 10px; line-height: 1.5; margin-top: 1px; }

/* hero thesis deck — our one-sentence synthesis, the actual VERDICT and the payload for a first-timer.
   It is the clear #2 element under the name: upright (not italic — a full sentence reads faster upright),
   sized and darkened to out-rank the meta. The left bar's colour is SENTIMENT-driven (set inline from the
   quality signal): amber for a caution, red for high-risk, green only for a genuinely clean verdict — never
   a fixed brand green on a warning. Default here is neutral; JS overrides border-left-color per signal. */
.ipo-hero-deck {
  font-size: 15px; font-weight: 400; font-style: normal; line-height: 1.6;
  color: var(--text-secondary); margin: 16px 0 0; max-width: 62ch;
  border-left: 3px solid var(--text-tertiary); padding-left: 12px; margin-left: -15px;
}

/* "contradicts the DRHP" marker — the highest-value web finding gets the loudest chip */
.ipo-contra {
  display: inline-block; font-size: 9px; font-weight: 800; letter-spacing: 0.06em;
  text-transform: uppercase; color: var(--red); border: 1px solid var(--red);
  border-radius: 4px; padding: 1px 6px; margin-left: 6px; vertical-align: 1px;
}

/* Strengths | Concerns table — the one flags component used in every section */
.ipo-flagtbl {
  display: grid; grid-template-columns: 1fr 1fr; gap: 0 28px;
  margin-top: 16px; border-top: 1px solid var(--border); padding-top: 14px;
}
.ipo-flagtbl.single { grid-template-columns: 1fr; }
.ipo-ft-col { min-width: 0; }
.ipo-ft-head {
  font-size: 10px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase;
  margin: 0 0 4px; padding-bottom: 6px;
}
.ipo-ft-head.green { color: var(--green); }
.ipo-ft-head.red { color: var(--red); }
.ipo-ft-row { border-top: 1px solid var(--tint-5); padding: 9px 0; }
.ipo-ft-title { font-size: 12px; font-weight: 700; color: var(--text-primary); margin: 0 0 3px; line-height: 1.5; }
.ipo-ft-desc { font-size: 12px; font-weight: 400; color: var(--text-secondary); margin: 0; line-height: 1.65; }
.ipo-ft-impact { font-size: 11px; color: var(--text-tertiary); margin: 4px 0 0; line-height: 1.6; }
@media (max-width: 720px) { .ipo-flagtbl { grid-template-columns: 1fr; } }

/* promoter cost line */


/* peer symbol chip */
.ipo-peer-sym {
  font-family: var(--font-mono); font-size: 9px; font-weight: 600;
  color: var(--text-tertiary); background: var(--tint-5);
  border-radius: 4px; padding: 1px 5px; margin-left: 6px; vertical-align: 1px;
}
/* a discovered peer (surfaced by us, not named in the DRHP) — muted note next to the company name */
.ipo-peer-note { font-size: 11px; color: var(--text-tertiary); font-style: italic; margin-left: 6px; }
/* peer POSITION cell — who this peer is vs the issuer (the 360° peer table's Position column) */
.ipo-peer-pos { font-size: 12px; color: var(--text-secondary); line-height: 1.45; max-width: 340px; }
/* peer name → its 360° deep-dive */
.ipo-peer-link { color: var(--text-primary); text-decoration: none; font-weight: 600; border-bottom: 1px solid var(--border); }
.ipo-peer-link:hover { color: var(--accent); border-bottom-color: var(--accent); }

/* ─── layered reading model ─── */

/* "The story" plain-English lead — what the company sells, calm and readable, not a verdict */
/* Matches the 360°-profile story prose (.kavach-prose): calm, readable, NOT bold. */
.ipo-story-lead { font-size: 13px; font-weight: 400; line-height: 1.7; color: var(--text-secondary); margin: 0 0 14px; }

/* Analyze button — the un-analyzed card's one action; accent-styled, quiet, honest */
.ipo-analyze-btn {
  font-family: var(--font-body); font-size: 12px; font-weight: 700;
  color: var(--accent); background: color-mix(in srgb, var(--accent) 10%, transparent);
  border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
  border-radius: 8px; padding: 6px 14px; cursor: pointer;
}
.ipo-analyze-btn.primary {
  background: var(--accent); color: #08110c; border-color: var(--accent);
  font-weight: 700; padding: 10px 22px;
}
.ipo-analyze-btn.primary:hover { filter: brightness(1.08); }

.ipo-analyze-btn:hover { background: color-mix(in srgb, var(--accent) 18%, transparent); }
.ipo-analyze-btn:disabled { opacity: 0.6; cursor: default; }

/* verified clients — light chips, each led by a green ✓ (every chip here is customer-side verified) */
/* Full-Details sub-sections (Clients / Reviews / Strengths+Concerns): a light rule between each so
   they read as distinct blocks instead of running together. The first block needs no top rule. */
.ipo-details-body > .ipo-sub-label { margin-top: 22px; padding-top: 16px; border-top: 1px solid var(--border); }
.ipo-details-body > .ipo-sub-label:first-child { margin-top: 2px; padding-top: 0; border-top: none; }
.ipo-details-body > .ipo-flagtbl { margin-top: 22px; padding-top: 18px; border-top: 1px solid var(--border); }

.ipo-client-chips { display: flex; flex-wrap: wrap; gap: 10px; margin: 4px 0 4px; }
.ipo-client-chip {
  display: inline-flex; align-items: center; gap: 7px;
  font-size: 13px; font-weight: 600; line-height: 1.35; padding: 7px 13px; border-radius: 9px;
  background: var(--card-bg); color: var(--text-primary); text-decoration: none;
  border: 1px solid var(--border); transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.ipo-client-chip::before { content: "✓"; color: var(--green); font-weight: 800; font-size: 11px; }
a.ipo-client-chip:hover { border-color: var(--accent); box-shadow: 0 1px 4px rgba(0,0,0,0.06); }

/* Business tags — green pills, matching the 360°-profile story tags */
.ipo-story-tags { display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 16px; }
.ipo-tag {
  font-size: 11px; font-weight: 600; padding: 3px 10px; border-radius: 999px;
  background: color-mix(in srgb, var(--green) 10%, transparent);
  color: var(--green); border: 1px solid color-mix(in srgb, var(--green) 20%, transparent);
}

/* moat breakdown — what protects the business vs what could erode it, side by side */

/* "What they do" — scannable product/business lines (label in bold, plain detail after the em-dash) */
.ipo-wtd { list-style: none; margin: 0 0 16px; padding: 0; }
.ipo-wtd li { position: relative; padding: 6px 0 6px 18px; font-size: 13.5px; line-height: 1.55; color: var(--text-secondary); }
.ipo-wtd li + li { border-top: 1px solid var(--tint-5); }
.ipo-wtd li::before { content: "•"; position: absolute; left: 3px; top: 6px; color: var(--accent); font-weight: 700; }
.ipo-wtd strong { color: var(--text-primary); font-weight: 800; }

/* always-visible section lead line */
.ipo-brief { font-size: 13px; font-weight: 600; line-height: 1.65; color: var(--text-primary); margin: 0 0 12px; }
.ipo-brief strong { font-family: var(--font-data); }

/* 60-second brief card */
.ipo-brief-card { border-left: 3px solid var(--accent); }
.ipo-brief-lead { font-size: 14px; margin-bottom: 14px; }
.ipo-brief-rows { display: flex; flex-direction: column; }
.ipo-brief-row {
  display: flex; align-items: baseline; gap: 12px;
  padding: 9px 0; border-top: 1px solid var(--border);
  text-decoration: none;
}
.ipo-brief-row:hover .ipo-brief-text { color: var(--text-primary); }
.ipo-brief-label {
  flex: 0 0 88px;
  font-size: 10px; font-weight: 800; letter-spacing: 0.07em; text-transform: uppercase;
  color: var(--text-tertiary);
}
.ipo-brief-text { flex: 1; font-size: 13px; line-height: 1.6; color: var(--text-secondary); }
.ipo-brief-grade {
  font-family: var(--font-body); font-size: 11px; font-weight: 800;
  letter-spacing: 0.05em; text-transform: uppercase;
  flex-shrink: 0; margin-left: 12px; align-self: center;
}

/* full-details expander */
.ipo-details { margin-top: 4px; }
.ipo-details summary {
  cursor: pointer; list-style: none;
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 11px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--accent); padding: 6px 0;
}
.ipo-details summary::-webkit-details-marker { display: none; }
.ipo-details summary { outline: none; }
.ipo-details summary:focus-visible { text-decoration: underline; }
.ipo-details summary::after { content: '▾'; font-size: 10px; transition: transform 0.15s ease; }
.ipo-details[open] summary::after { transform: rotate(180deg); }
.ipo-details-body { padding-top: 10px; }

/* anchored sections scroll below the fixed header */
.ipo-section { scroll-margin-top: 72px; }

/* ── Market pulse: live demand + mood, beside (never inside) the document verdict ── */
.ipo-pulse-card { display: flex; flex-direction: column; gap: 14px; }
.ipo-pulse-head { display: flex; align-items: center; gap: 8px; }
.ipo-pulse-title { font-size: 13px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-secondary); margin: 0; }
.ipo-pulse { display: flex; align-items: flex-end; gap: 18px; flex-wrap: wrap; }
.ipo-pulse-now { display: flex; align-items: baseline; gap: 8px; }
.ipo-pulse-mult { font-size: 26px; font-weight: 800; color: var(--text-primary); }
.ipo-pulse-delta { font-size: 12px; color: var(--text-tertiary); }
.ipo-pulse-delta.up, .ipo-pulse-split .up { color: var(--green); }
.ipo-pulse-delta.down, .ipo-pulse-split .down { color: var(--red); }
/* Day-by-day micro-chart: each bidding day is a column — closing multiple above, bar, date below.
   Bars scale to the biggest day; the printed value carries the truth when a day dwarfs the rest. */
.ipo-pulse-bars { display: flex; align-items: flex-end; gap: 10px; }
.ipo-pulse-day { display: flex; flex-direction: column; align-items: center; gap: 3px; }
.ipo-pulse-day-val { font-size: 10px; font-weight: 700; color: var(--text-secondary); font-variant-numeric: tabular-nums; }
.ipo-pulse-day-lbl { font-size: 10px; font-weight: 600; color: var(--text-tertiary); text-transform: uppercase; letter-spacing: 0.04em; white-space: nowrap; }
.ipo-pulse-bar { width: 16px; border-radius: 2px 2px 0 0; background: var(--green); opacity: 0.75; display: inline-block; }
.ipo-pulse-day:last-child .ipo-pulse-bar { opacity: 1; }
.ipo-pulse-split { font-size: 12px; color: var(--text-secondary); display: flex; align-items: center; gap: 6px; flex-wrap: wrap; row-gap: 4px; }
.ipo-pulse-asof { color: var(--text-tertiary); margin-left: 8px; font-size: 11px; }
.ipo-mood { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; border-top: 1px solid var(--border); padding-top: 12px; }
.ipo-mood-chip { font-weight: 800; font-size: 13px; white-space: nowrap; }
.ipo-pulse-driver { font-size: 13px; color: var(--text-secondary); line-height: 1.6; }

/* god-level pulse: headline stats row (subscription + sourced GMP), numeric split, timestamped mood */
.ipo-pulse-row { display: flex; align-items: flex-end; gap: 34px; flex-wrap: wrap; }
.ipo-pulse-stat { display: flex; flex-direction: column; gap: 2px; }
.ipo-pulse-sub { display: flex; align-items: baseline; gap: 8px; }
.ipo-pulse-cat { white-space: nowrap; font-variant-numeric: tabular-nums; }
.ipo-pulse-cat-name { color: var(--text-tertiary); font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; }
.ipo-pulse-sep { margin: 0 4px; color: var(--text-tertiary); }
.ipo-mood-top { display: flex; align-items: baseline; gap: 12px; margin-bottom: 4px; }

/* pulse zones: demand / mood / in-the-news, separated like section stanzas */
.ipo-pulse-zone { padding: 14px 0; border-top: 1px solid var(--border); }
.ipo-pulse-zone:first-of-type { border-top: none; padding-top: 2px; }
.ipo-pulse-zone > .ipo-label { margin-bottom: 10px; }
/* stat tiles share the hero-facts anatomy AND the full card width (grid, not a left cluster) */
.ipo-pulse-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 14px 0; align-items: end; }
.ipo-pulse-stat { padding-right: 24px; margin-right: 24px; border-right: 1px solid var(--border); }
.ipo-pulse-stat:last-child { border-right: none; }
.ipo-pulse-stat .ipo-pulse-sub { min-height: 18px; align-items: baseline; }
.ipo-pulse-split { margin-top: 8px; }
/* mood header: label · chip left, timestamp on the far right */
.ipo-mood-top { display: flex; align-items: baseline; gap: 12px; margin-bottom: 8px; }
.ipo-mood-time { margin-left: auto; }
/* every analysis/news line is a scannable marked row, one shared vocabulary */
/* prose flows full-width, matching the 360-profile sections (no ch-cap on this page) */
.ipo-pulse-analysis { font-size: 13px; color: var(--text-secondary); line-height: 1.75; }
.ipo-pulse-analysis p { margin: 0 0 10px; }
.ipo-pulse-analysis p:last-child { margin-bottom: 0; }
.ipo-pulse-refs { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin-top: 10px; }
.ipo-pulse-refs-label { font-size: 10px; font-weight: 700; letter-spacing: 0.07em; text-transform: uppercase; color: var(--text-tertiary); }

/* GMP carries its own caution: street data, never advice */
.ipo-gmp-disclaimer { font-size: 10px; color: var(--text-tertiary); line-height: 1.5; margin-top: 4px; }
.ipo-pulse-head-chip { margin-left: auto; font-size: 12px; font-weight: 800; }

/* ── Mobile audit fixes (2026-07-31) ─────────────────────────────────────── */
/* The page NEVER scrolls horizontally: clip (not hidden — no phantom scroll area) at the page
   container, so edge-hugging absolute helpers (hit-area pseudos, popovers) cannot widen the page. */
.ipo-wrap, .ipo-wrap-detail { overflow-x: clip; }
/* The hero ring and the BQ signal card scroll to this anchor — without the offset the sticky
   header swallows the card title. */
#ecs-full-picture { scroll-margin-top: 84px; }
/* 40px thumb hit-areas on the tiny (i) affordances without growing their visual size. */
.ipo-calc, .ipo-info { position: relative; }
.ipo-calc::before, .ipo-info::before { content: ''; position: absolute; inset: -13px; }
/* Stacked mobile flag columns scroll the STRENGTHS/CONCERNS head off-screen — each row carries
   its side as a colored left edge, so severity survives without the column head. */
.ipo-ft-col:has(.ipo-ft-head.red) .ipo-ft-row { border-left: 2px solid rgba(248,113,113,0.35); padding-left: 10px; }
.ipo-ft-col:has(.ipo-ft-head.green) .ipo-ft-row { border-left: 2px solid rgba(52,211,153,0.30); padding-left: 10px; }
@media (max-width: 720px) {
  /* single-column pulse stats: desktop cell dividers become floating line fragments */
  .ipo-pulse-stat { border-right: none; padding-right: 0; margin-right: 0; }
  /* filter bar: status pills row, search on its OWN full row, board pills row — the desktop
     gap spacer scattered the groups into a jumble when wrapping (iPhone report). */
  .ipo-filter-gap { display: none; }
  .ipo-search { flex: 1 1 100%; min-width: 0; }
  /* thumb targets; 16px on the search input also stops the iOS focus auto-zoom */
  .ipo-pill { padding: 9px 14px; }
  .ipo-analyze-btn { padding: 10px 16px; }
  .ipo-search { font-size: 16px; padding: 8px 14px; }
  /* the provenance layer has a legibility floor */
  .ipo-cite { font-size: 10px; }
  .ipo-table th, .ipo-table td { font-size: 11px; }
  /* peer table: the description column must read as sentences; the wrap scrolls for the rest */
  td.ipo-peer-pos { min-width: 200px; }
  /* 60-second brief: label + grade share the top line, the sentence takes the full width below */
  .ipo-brief-row { flex-wrap: wrap; row-gap: 2px; }
  .ipo-brief-text { flex: 1 1 100%; order: 3; }
  .ipo-brief-grade { margin-left: auto; }
}
/* One quiet line of honesty under the pitch. */
.ipo-sub-disclaimer { font-size: 11px; color: var(--text-tertiary); margin: 6px 0 0; }
