/* Auto-generated by scripts/extract-broadside-runtime.py clean-light — DO NOT hand-edit.
 * Source: html_gen_prompt.py _CLEAN_LIGHT_EXTRA_TOKENS + _CLEAN_LIGHT_STAT_CARD_CSS
 * Loaded by editor.html so editor + viewer render clean-light decks
 * even when the saved markup lost the prompt-injected <style> block.
 * (Rainy 2026-05-29 — AI gen for these 4 templates dropped prompt CSS.)
 */

/* ── Legacy left-rail kill-switch (Rainy 2026-06-29) ───────────────────
   Clean-light decks generated before the rail was removed have
   .strip / .vlabel / .cover-author / etc. baked into slide.data.html
   AND the same class names show up in samples/clean-light-figma/deck.json
   (used by dashboard/templates preview grids). Emit sites + defs are
   ripped upstream, but this defensive `display: none` hides any node
   whose class name survives, no data migration required. Lives here
   (not in deck-engine.css) so it also loads in dashboard.html and
   templates.html — deck-engine.css is editor-only. */
.strip, .vlabel,
.clean-strip, .clean-author, .cover-author,
.cover-strip, .sd-strip, .ag-strip, .closing-strip {
  display: none !important;
}

[data-template="clean-light"] {

  /* Clean Light — design tokens (mirror of spec :root)
     Source of truth: ~/Downloads/clean-light-design-system.html
     ─────────────────────────────────────────── */
  --ink: #31475D !important; /* primary text + dividers */
  --mute: #656565 !important; /* secondary text */
  --teal: #78EAEC !important; /* blob accent / .card.is-teal hint */
  --teal-num: #65D7D7 !important; /* stats / positive delta / sd-num */
  --teal-grad-a: #CBFFFF !important; /* highlighted card top */
  --teal-grad-b: #EAFFFF !important; /* highlighted card bottom */
  --lilac: #CFBAFF !important; /* blob accent / sd-purple */
  --card: #F5F5F5 !important; /* card surface */
  --ph: transparent !important; /* placeholder transparent — dev-only design-spec used #D9D9D9 to mark image / chart slot positions (Rainy 2026-06-25) */
  --line: #31475D !important; /* divider rules */
  --red: #E07B7B !important; /* negative delta */
  --bg: #FFFFFF !important; /* slide canvas */

  /* Single typeface — Inter */
  --font: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif !important;
  --font-cover: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif !important;
  --font-heading: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif !important;
  --font-body: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif !important;

}


/* ═══════════════════════════════════════════════════════════════════════════
   CLEAN LIGHT — Slide-production component CSS
   Canvas: 1920×1080. All sizes in canvas pixels.
   Source of truth: ~/Downloads/clean-light-design-system.html

   STRICT mapping to spec components only. NO custom components allowed.
   Components: .scaffold .strip .vlabel .ph .card .card.is-teal .stat .nrow
               .ktable ul.bullets + cover-family (.cover/.sd/.ag/.closing).
   Color semantics:
     teal-num (#65D7D7) = stats / positive delta / cover/sd accent
     red (#E07B7B) = negative delta
     ink (#31475D) = primary text + dividers
     teal (#78EAEC) = .card.is-teal highlight
     lilac (#CFBAFF) = sd-purple variant
   ═══════════════════════════════════════════════════════════════════════════ */

* { box-sizing: border-box; margin: 0; padding: 0; }

/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   SLIDE SHELL (1920×1080)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
[data-template="clean-light"].slide {
  width: 1920px !important; height: 1080px !important;
  position: relative !important; overflow: hidden !important;
  font-family: var(--font) !important;
  color: var(--ink) !important;
}

/* ── SHARED SCAFFOLD (radial-gradient bg) ── */
[data-template="clean-light"] .scaffold {
  position: absolute !important; inset: 0 !important; overflow: hidden !important; z-index: 0 !important;
  background:
    radial-gradient(ellipse 55% 65% at -2% 50%,  rgba(120,234,236,.55) 0%, transparent 75%),
    radial-gradient(ellipse 28% 30% at  9%  0%,  rgba(49, 71, 93, .18) 0%, transparent 75%),
    radial-gradient(ellipse 52% 55% at 105% 100%, rgba(207,186,255,.50) 0%, transparent 70%),
    var(--bg);
}

/* Left strip + vertical AUTHOR label removed 2026-06-29 — see
   clean-light.html header comment for context. */

/* ── COVER / CLOSING WAVE DECORATION ──
   `<svg class="wave-deco">` is injected by `_normalizeHeroCleanLight`
   (generate-modal.js) on cover (data-layout="hero") and closing slides.
   Without explicit width/height the SVG renders inline at the UA-default
   ~300×150, so the wave paths (drawn at viewBox x=1305..2202) fall off
   the rendered SVG box and the decoration looks completely missing.
   These rules guarantee the SVG fills the 1920×1080 canvas in editor,
   viewer, and thumbnail render paths. */
[data-template="clean-light"] svg.wave-deco {
  position: absolute !important; inset: 0 !important;
  width: 1920px !important; height: 1080px !important;
  z-index: 2 !important; pointer-events: none !important;
}

/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   TYPOGRAPHY (spec Section B)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
[data-template="clean-light"] .h-section { font-size: 52px; font-weight: 500; color: var(--ink); line-height: 1.2; margin: 0; }
[data-template="clean-light"] .h-bigtitle { font-size: 80px; font-weight: 600; color: var(--ink); line-height: 1.1; margin: 0; }
[data-template="clean-light"] .h-card-title {
  font-size: 38px !important; font-weight: 600 !important;
  color: var(--ink) !important; text-transform: uppercase !important; letter-spacing: .5px !important;
  line-height: 1.2 !important;
  margin: 0 0 40px !important;
}
[data-template="clean-light"] .label-tag {
  font-size: 22px !important; font-weight: 600 !important; color: var(--ink) !important;
  letter-spacing: 4px !important; text-transform: uppercase !important;
  line-height: 1 !important; margin: 0 0 22px !important;
}
[data-template="clean-light"] .body-lg { font-size: 38px; font-weight: 400; color: var(--ink); line-height: 1.5; margin: 0; }
[data-template="clean-light"] .body-md { font-size: 26px; font-weight: 400; color: var(--ink); line-height: 1.45; margin: 0; }
[data-template="clean-light"] .body-sm { font-size: 26px; font-weight: 400; color: var(--ink); line-height: 1.5; margin: 0; }

[data-template="clean-light"] ul.bullets { list-style: none; padding: 0; margin: 0; }
[data-template="clean-light"] ul.bullets li {
  position: relative !important; padding-left: 32px !important;
  font-size: 26px !important; font-weight: 400 !important; line-height: 1.5 !important;
  color: var(--ink) !important; margin-bottom: 12px !important;
}
[data-template="clean-light"] ul.bullets li::before {
  content: "" !important; position: absolute !important;
  left: 10px !important; top: 16px !important;
  width: 6px !important; height: 6px !important; border-radius: 50% !important;
  background: var(--ink) !important;
}

/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   SPEC CONTAINERS — only these components are allowed
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */

/* ── IMAGE / CHART PLACEHOLDER ── (gray fill is design-doc only; production = transparent) */
[data-template="clean-light"] .ph {
  background: transparent !important;
  border-radius: 15px !important;
  overflow: hidden !important;
}
[data-template="clean-light"] .ph > img {
  width: 100% !important; height: 100% !important; object-fit: cover !important; display: block !important;
}
[data-template="clean-light"] .ph > canvas {
  width: 100% !important; height: 100% !important; display: block !important;
}

/* ── CARD ── (#F5F5F5 IS the production fill, per spec slide 09) */
[data-template="clean-light"] .card {
  background: var(--card) !important;
  border-radius: 15px !important;
  position: relative !important;
  overflow: hidden !important;
}
/* page-09 6-card grid: spec puts each .card at absolute coords
   (left:140/720/1300, top:365/665, 560×280). Default .card is
   position:relative, so the inline left/top become flow offsets and
   cards drift / misalign / overlap. Same pattern as midnight-purple
   .s-card fix. Force absolute when inline left/top present, OR when
   on page-09 layout. (Rainy 2026-06-19: 6 灰色方块布局乱.) */
[data-template="clean-light"][data-layout="page-09"] .card,
[data-template="clean-light"] .card[style*="left:"],
[data-template="clean-light"] .card[style*="top:"] {
  position: absolute !important;
}
/* Hide any 7th+ card the model occasionally emits without inline
   coords (renders as an empty placeholder in the corner). Only cards
   WITHOUT inline left= are removed — the 6 spec cards all have it. */
[data-template="clean-light"][data-layout="page-09"] .card:not([style*="left:"]) {
  display: none !important;
}
[data-template="clean-light"] .card.is-teal {
  background: linear-gradient(180deg, var(--teal-grad-a) 0%, var(--teal-grad-b) 100%) !important;
}

/* Card description — NO truncation. Content MUST fit by char-count
   constraints in the prompt. Ellipsis is forbidden. */
[data-template="clean-light"] .card .body-md, [data-template="clean-light"] .card p.body-md {
  line-height: 1.5 !important;
}

/* ── STAT (spec slide 04 — also doubles as 2×2 icon-card cell content) ── */
[data-template="clean-light"] .stat .num {
  font-size: 72px !important; font-weight: 600 !important;
  color: var(--teal-num) !important; line-height: 1 !important;
  letter-spacing: -1.5px !important; margin: 0 0 10px !important;
}
[data-template="clean-light"] .stat .stat-title {
  font-size: 30px !important; font-weight: 600 !important;
  color: var(--ink) !important; text-transform: uppercase !important; letter-spacing: 2px !important;
  margin: 0 0 12px !important;
}
[data-template="clean-light"] .stat .stat-body {
  font-size: 26px !important; font-weight: 400 !important;
  color: var(--ink) !important; line-height: 1.5 !important; margin: 0 !important;
}

/* ── NUMBERED ROW (spec slide 05) ── */
[data-template="clean-light"] .nrow {
  display: flex !important; align-items: baseline !important; gap: 24px !important;
  border-bottom: 1px solid var(--line) !important;
  padding: 18px 0 !important;
}
[data-template="clean-light"] .nrow .n {
  font-size: 38px !important; font-weight: 600 !important; color: var(--ink) !important;
  font-feature-settings: "tnum" !important; flex: 0 0 auto !important;
}
[data-template="clean-light"] .nrow .t {
  font-size: 26px !important; font-weight: 600 !important; color: var(--ink) !important;
  white-space: nowrap !important;
  overflow: hidden !important;
  text-overflow: ellipsis !important;
  flex: 1 !important; min-width: 0 !important;
}

/* ── KPI TABLE (spec slide 07) ── */
[data-template="clean-light"] .ktable .row {
  display: grid !important;
  grid-template-columns: 1.4fr .65fr .4fr !important;
  gap: 32px !important;
  padding: 22px 0 !important;
  border-top: 1px solid var(--line) !important;
  align-items: center !important;
}
[data-template="clean-light"] .ktable .row.head {
  border-top: none !important;
  padding-top: 0 !important; padding-bottom: 14px !important;
  border-bottom: 1px solid var(--line) !important;
}
[data-template="clean-light"] .ktable .row .col-head {
  font-size: 22px !important; font-weight: 600 !important; color: var(--ink) !important;
  letter-spacing: 4px !important; text-transform: uppercase !important;
}
[data-template="clean-light"] .ktable .row .ttl {
  font-size: 30px !important; font-weight: 600 !important; color: var(--ink) !important;
  text-transform: uppercase !important; letter-spacing: 1px !important;
  margin: 0 0 6px !important;
}
[data-template="clean-light"] .ktable .row .desc {
  font-size: 26px !important; color: var(--ink) !important; margin: 0 !important; line-height: 1.5 !important; font-weight: 400 !important;
  display: -webkit-box !important;
  -webkit-line-clamp: 2 !important;
  -webkit-box-orient: vertical !important;
  overflow: hidden !important;
}
[data-template="clean-light"] .ktable .row .v {
  font-size: 72px !important; font-weight: 600 !important; color: #000 !important;
  text-align: left !important; font-feature-settings: "tnum" !important; letter-spacing: -1.5px !important;
}
[data-template="clean-light"] .ktable .row .delta {
  font-size: 38px !important; font-weight: 600 !important; color: var(--teal-num) !important; text-align: right !important;
}
[data-template="clean-light"] .ktable .row .delta.is-down { color: var(--red); }
[data-template="clean-light"] .ktable .row .delta.is-flat { color: var(--ink); }

/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   CHART.JS LEGEND (spec slide 10 — horizontal, transparent)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
[data-template="clean-light"] .chart-legend {
  display: flex !important; flex-direction: row !important; justify-content: center !important;
  flex-wrap: wrap !important; gap: 32px !important;
  background: transparent !important;
  margin-top: 24px !important;
}
[data-template="clean-light"] .chart-legend-item {
  display: inline-flex !important; align-items: center !important; gap: 12px !important;
  font-size: 24px !important; font-weight: 500 !important; color: var(--ink) !important;
}
[data-template="clean-light"] .chart-legend-dot {
  width: 14px !important; height: 14px !important; border-radius: 50% !important;
  flex-shrink: 0 !important;
}

/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   COVER FAMILY (cover · agenda · section-divider · closing)
   Source: spec Section A (cover) + cover-family CSS.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
[data-template="clean-light"] .cover, [data-template="clean-light"] .sd, [data-template="clean-light"] .ag, [data-template="clean-light"] .closing {
  position: relative !important;
  width: 1920px !important; height: 1080px !important;
  overflow: hidden !important;
  font-family: var(--font) !important;
  background:
    radial-gradient(ellipse 55% 65% at -2% 50%,   rgba(120,234,236,.55) 0%, transparent 75%),
    radial-gradient(ellipse 28% 30% at  9%  0%,   rgba(49, 71, 93, .18) 0%, transparent 75%),
    radial-gradient(ellipse 52% 55% at 105% 100%, rgba(207,186,255,.50) 0%, transparent 70%),
    var(--bg);
}

/* .cover-strip / .sd-strip / .ag-strip / .closing-strip removed
   2026-06-29 alongside .strip — same 105px left-column decoration. */

/* Wave background for the div-based wave layers (.sd-waves on section
   dividers, .ag-waves on the TOC, .closing-waves, .cover-waves). The cover
   and closing pages ALSO get an inline `svg.wave-deco` from the hero
   normalizer; these classes are what the model emits everywhere else.

   SOURCE OF TRUTH: `_CLEAN_LIGHT_WAVES_SVG_RAW` in code/python/html_gen_prompt.py.
   Do NOT hand-edit the data URI below — regenerate it from that constant so
   the two copies cannot drift.

   This shipped BROKEN from 2026-06-13 (commit e7a2a06e) until 2026-07-27: the
   batch that dumped the prompt CSS into static runtime files copied
   clean-light's template string BEFORE the `.replace("__WAVES_BG_URL__", …)`
   substitution, so the literal placeholder reached the browser. An invalid
   background-image value makes the browser drop the whole declaration, i.e.
   computed `background-image: none` — every divider / TOC / closing wave
   painted nothing while position and size applied normally, which is why it
   looked like a styling mystery rather than a missing asset. It is also the
   dead end AI Designer kept steering into when asked to "add the waves back".
   Verified with getComputedStyle before and after. (Rainy 2026-07-27.) */
[data-template="clean-light"] .cover-waves, [data-template="clean-light"] .sd-waves, [data-template="clean-light"] .ag-waves, [data-template="clean-light"] .closing-waves {
  position: absolute !important; top: 0 !important; left: 0 !important;
  width: 100% !important; height: 100% !important;
  z-index: 2 !important; pointer-events: none !important;
  background-image: url("data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 1920 1080%22 preserveAspectRatio=%22xMidYMid slice%22 fill=%22none%22%3E%3Cdefs%3E%3ClinearGradient id=%22clg1%22 x1=%221915%22 y1=%2230%22 x2=%221915%22 y2=%221049%22 gradientUnits=%22userSpaceOnUse%22%3E%3Cstop stop-color=%22%23CFBAFF%22/%3E%3Cstop offset=%221%22 stop-color=%22%2378EAEC%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22clg2%22 x1=%221866%22 y1=%2230%22 x2=%221866%22 y2=%221049%22 gradientUnits=%22userSpaceOnUse%22%3E%3Cstop stop-color=%22%23CFBAFF%22/%3E%3Cstop offset=%221%22 stop-color=%22%2378EAEC%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22clg3%22 x1=%221816%22 y1=%2230%22 x2=%221816%22 y2=%221049%22 gradientUnits=%22userSpaceOnUse%22%3E%3Cstop stop-color=%22%23CFBAFF%22/%3E%3Cstop offset=%221%22 stop-color=%22%2378EAEC%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22clg4%22 x1=%221767%22 y1=%2230%22 x2=%221767%22 y2=%221049%22 gradientUnits=%22userSpaceOnUse%22%3E%3Cstop stop-color=%22%23CFBAFF%22/%3E%3Cstop offset=%221%22 stop-color=%22%2378EAEC%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22clg5%22 x1=%221717%22 y1=%2230%22 x2=%221717%22 y2=%221049%22 gradientUnits=%22userSpaceOnUse%22%3E%3Cstop stop-color=%22%23CFBAFF%22/%3E%3Cstop offset=%221%22 stop-color=%22%2378EAEC%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22clg6%22 x1=%221668%22 y1=%2230%22 x2=%221668%22 y2=%221049%22 gradientUnits=%22userSpaceOnUse%22%3E%3Cstop stop-color=%22%23CFBAFF%22/%3E%3Cstop offset=%221%22 stop-color=%22%2378EAEC%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22clg7%22 x1=%221619%22 y1=%2230%22 x2=%221619%22 y2=%221049%22 gradientUnits=%22userSpaceOnUse%22%3E%3Cstop stop-color=%22%23CFBAFF%22/%3E%3Cstop offset=%221%22 stop-color=%22%2378EAEC%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22clg8%22 x1=%221570%22 y1=%2230%22 x2=%221570%22 y2=%221049%22 gradientUnits=%22userSpaceOnUse%22%3E%3Cstop stop-color=%22%23CFBAFF%22/%3E%3Cstop offset=%221%22 stop-color=%22%2378EAEC%22/%3E%3C/linearGradient%3E%3C/defs%3E%3Cpath stroke=%22url(%23clg1)%22 stroke-width=%222%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22 d=%22M1650.05 523.981C1650.05 565.693 1623.5 607.711 1628.96 646.479C1634.84 688.314 1675.3 720.027 1686.65 756.893C1699.34 797.992 1699.83 838.906 1718.28 871.847C1741.27 912.822 1769.47 941.469 1799.33 966.189C1834.88 995.633 1867.62 1049 1909.37 1049C1951.12 1049 1991.21 1004.47 2026.77 975.023C2056.56 950.302 2058.46 902.088 2081.39 861.112C2099.85 828.172 2156.19 809.34 2168.88 768.18C2180.28 731.314 2149.44 683.345 2155.27 641.572C2160.72 602.865 2202.04 565.693 2202.04 523.919C2202.04 482.146 2186.47 441.415 2181.01 402.648C2175.13 360.813 2141.9 328.364 2130.56 291.498C2117.87 250.399 2150.06 191.511 2131.6 158.571C2108.61 117.595 2049.02 106.615 2019.23 81.956C1983.73 52.5736 1951.12 30 1909.37 30C1867.62 30 1824.15 39.3852 1788.6 68.829C1758.8 93.5495 1752.92 141.702 1729.93 182.678C1711.48 215.618 1672.12 241.566 1659.37 282.664C1647.96 319.53 1655.99 362.653 1650.11 404.488C1644.65 443.194 1649.99 482.269 1649.99 523.981H1650.05Z%22/%3E%3Cpath stroke=%22url(%23clg2)%22 stroke-width=%222%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22 d=%22M1600.96 523.981C1600.96 565.693 1574.45 607.711 1579.9 646.479C1585.78 688.314 1626.17 720.027 1637.5 756.893C1650.17 797.992 1650.66 838.906 1669.08 871.847C1692.03 912.822 1720.19 941.469 1750 966.189C1785.5 995.633 1818.18 1049 1859.86 1049C1901.54 1049 1941.57 1004.47 1977.07 975.023C2006.82 950.302 2008.72 902.088 2031.61 861.112C2050.03 828.172 2106.28 809.34 2118.95 768.18C2130.33 731.314 2099.55 683.345 2105.36 641.572C2110.81 602.865 2152.06 565.693 2152.06 523.919C2152.06 482.146 2136.52 441.415 2131.07 402.648C2125.19 360.813 2092.02 328.364 2080.7 291.498C2068.03 250.399 2100.16 191.511 2081.74 158.571C2058.78 117.595 1999.29 106.615 1969.54 81.956C1934.11 52.5736 1901.54 30 1859.86 30C1818.18 30 1774.78 39.3852 1739.28 68.829C1709.54 93.5495 1703.66 141.702 1680.71 182.678C1662.29 215.618 1622.93 241.566 1610.26 282.664C1598.88 319.53 1606.89 362.653 1601.02 404.488C1595.57 443.194 1600.9 482.269 1600.9 523.981H1600.96Z%22/%3E%3Cpath stroke=%22url(%23clg3)%22 stroke-width=%222%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22 d=%22M1551.01 523.981C1551.01 565.693 1524.46 607.711 1529.92 646.479C1535.8 688.314 1576.27 720.027 1587.61 756.893C1600.3 797.992 1600.79 838.906 1619.24 871.847C1642.23 912.822 1670.43 941.469 1700.29 966.189C1735.84 995.633 1768.58 1049 1810.33 1049C1852.08 1049 1892.17 1004.47 1927.73 975.023C1957.53 950.302 1959.43 902.088 1982.35 861.112C2000.81 828.172 2057.15 809.34 2069.84 768.18C2081.24 731.314 2050.4 683.345 2056.23 641.572C2061.68 602.865 2103 565.693 2103 523.919C2103 482.146 2087.43 441.415 2081.98 402.648C2076.09 360.813 2042.86 328.364 2031.52 291.498C2018.83 250.399 2051.02 191.511 2032.56 158.571C2009.57 117.595 1949.98 106.615 1920.19 81.956C1884.63 52.5736 1852.08 30 1810.33 30C1768.58 30 1725.12 39.3852 1689.56 68.829C1659.76 93.5495 1653.88 141.702 1630.89 182.678C1612.44 215.618 1573.08 241.566 1560.33 282.664C1548.92 319.53 1556.95 362.653 1551.07 404.488C1545.61 443.194 1550.95 482.269 1550.95 523.981H1551.01Z%22/%3E%3Cpath stroke=%22url(%23clg4)%22 stroke-width=%222%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22 d=%22M1501.92 523.981C1501.92 565.693 1475.42 607.711 1480.86 646.479C1486.74 688.314 1527.14 720.027 1538.46 756.893C1551.13 797.992 1551.62 838.906 1570.04 871.847C1592.99 912.822 1621.15 941.469 1650.96 966.189C1686.46 995.633 1719.14 1049 1760.82 1049C1802.5 1049 1842.53 1004.47 1878.03 975.023C1907.78 950.302 1909.68 902.088 1932.57 861.112C1950.99 828.172 2007.24 809.34 2019.91 768.18C2031.29 731.314 2000.51 683.345 2006.32 641.572C2011.77 602.865 2053.02 565.693 2053.02 523.919C2053.02 482.146 2037.48 441.415 2032.03 402.648C2026.15 360.813 1992.98 328.364 1981.66 291.498C1968.99 250.399 2001.12 191.511 1982.7 158.571C1959.74 117.595 1900.25 106.615 1870.5 81.956C1835 52.5736 1802.5 30 1760.82 30C1719.14 30 1675.75 39.3852 1640.25 68.829C1610.5 93.5495 1604.62 141.702 1581.67 182.678C1563.25 215.618 1523.89 241.566 1511.22 282.664C1499.84 319.53 1507.86 362.653 1501.98 404.488C1496.53 443.194 1501.86 482.269 1501.86 523.981H1501.92Z%22/%3E%3Cpath stroke=%22url(%23clg5)%22 stroke-width=%222%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22 d=%22M1451.98 523.981C1451.98 565.693 1425.44 607.711 1430.9 646.479C1436.78 688.314 1477.24 720.027 1488.58 756.893C1501.27 797.992 1501.76 838.906 1520.22 871.847C1543.21 912.822 1571.41 941.469 1601.26 966.189C1636.82 995.633 1669.56 1049 1711.31 1049C1753.06 1049 1793.15 1004.47 1828.71 975.023C1858.5 950.302 1860.4 902.088 1883.33 861.112C1901.78 828.172 1958.12 809.34 1970.81 768.18C1982.22 731.314 1951.38 683.345 1957.2 641.572C1962.66 602.865 2003.98 565.693 2003.98 523.919C2003.98 482.146 1988.41 441.415 1982.95 402.648C1977.07 360.813 1943.84 328.364 1932.5 291.498C1919.81 250.399 1951.99 191.511 1933.54 158.571C1910.55 117.595 1850.96 106.615 1821.17 81.956C1785.61 52.5736 1753.06 30 1711.31 30C1669.56 30 1626.09 39.3852 1590.54 68.829C1560.74 93.5495 1554.86 141.702 1531.87 182.678C1513.41 215.618 1473.99 241.566 1461.3 282.664C1449.9 319.53 1457.93 362.653 1452.05 404.488C1446.59 443.194 1451.92 482.269 1451.92 523.981H1451.98Z%22/%3E%3Cpath stroke=%22url(%23clg6)%22 stroke-width=%222%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22 d=%22M1403.78 523.981C1403.78 565.693 1377.32 607.711 1382.76 646.479C1388.63 688.314 1428.96 720.027 1440.26 756.893C1452.91 797.992 1453.4 838.906 1471.79 871.847C1494.71 912.822 1522.82 941.469 1552.58 966.189C1588.02 995.633 1620.65 1049 1662.27 1049C1703.88 1049 1743.85 1004.47 1779.29 975.023C1808.99 950.302 1810.88 902.088 1833.74 861.112C1852.13 828.172 1908.29 809.34 1920.94 768.18C1932.3 731.314 1901.57 683.345 1907.37 641.572C1912.81 602.865 1954 565.693 1954 523.919C1954 482.146 1938.47 441.415 1933.04 402.648C1927.17 360.813 1894.05 328.364 1882.74 291.498C1870.1 250.399 1902.18 191.511 1883.78 158.571C1860.87 117.595 1801.47 106.615 1771.77 81.956C1736.33 52.5736 1703.88 30 1662.27 30C1620.65 30 1577.33 39.3852 1541.88 68.829C1512.19 93.5495 1506.32 141.702 1483.4 182.678C1465.01 215.618 1425.72 241.566 1413.07 282.664C1401.7 319.53 1409.71 362.653 1403.84 404.488C1398.4 443.194 1403.72 482.269 1403.72 523.981H1403.78Z%22/%3E%3Cpath stroke=%22url(%23clg7)%22 stroke-width=%222%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22 d=%22M1354.76 523.981C1354.76 565.693 1328.26 607.711 1333.71 646.479C1339.58 688.314 1379.98 720.027 1391.3 756.893C1403.97 797.992 1404.46 838.906 1422.88 871.847C1445.84 912.822 1473.99 941.469 1503.8 966.189C1539.3 995.633 1571.98 1049 1613.67 1049C1655.35 1049 1695.38 1004.47 1730.88 975.023C1760.62 950.302 1762.52 902.088 1785.41 861.112C1803.84 828.172 1860.08 809.34 1872.75 768.18C1884.14 731.314 1853.35 683.345 1859.17 641.572C1864.61 602.866 1905.87 565.693 1905.87 523.919C1905.87 482.146 1890.32 441.415 1884.87 402.648C1879 360.813 1845.82 328.364 1834.5 291.498C1821.83 250.399 1853.96 191.511 1835.54 158.571C1812.59 117.595 1753.1 106.615 1723.35 81.956C1687.85 52.5736 1655.35 30 1613.67 30C1571.98 30 1528.59 39.3852 1493.09 68.829C1463.34 93.5495 1457.47 141.702 1434.51 182.678C1416.09 215.618 1376.73 241.566 1364.07 282.664C1352.68 319.53 1360.7 362.653 1354.82 404.488C1349.38 443.194 1354.7 482.269 1354.7 523.981H1354.76Z%22/%3E%3Cpath stroke=%22url(%23clg8)%22 stroke-width=%222%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22 d=%22M1304.83 523.981C1304.83 565.693 1278.28 607.711 1283.74 646.479C1289.62 688.314 1330.09 720.027 1341.43 756.893C1354.12 797.992 1354.61 838.906 1373.06 871.847C1396.05 912.822 1424.25 941.469 1454.11 966.189C1489.66 995.633 1522.4 1049 1564.15 1049C1605.9 1049 1645.99 1004.47 1681.55 975.023C1711.35 950.302 1713.25 902.088 1736.17 861.112C1754.63 828.172 1810.97 809.34 1823.66 768.18C1835.06 731.314 1804.22 683.345 1810.05 641.572C1815.5 602.865 1856.82 565.693 1856.82 523.919C1856.82 482.146 1841.25 441.415 1835.8 402.648C1829.91 360.813 1796.68 328.364 1785.34 291.498C1772.65 250.399 1804.84 191.511 1786.38 158.571C1763.39 117.595 1703.81 106.615 1674.01 81.956C1638.45 52.5736 1605.9 30 1564.15 30C1522.4 30 1478.94 39.3852 1443.38 68.829C1413.58 93.5495 1407.7 141.702 1384.71 182.678C1366.26 215.618 1326.9 241.566 1314.15 282.664C1302.74 319.53 1310.77 362.653 1304.89 404.488C1299.43 443.194 1304.77 482.269 1304.77 523.981H1304.83Z%22/%3E%3C/svg%3E") !important;
  background-size: cover !important;
  background-position: center !important;
  background-repeat: no-repeat !important;
}

/* COVER (slide 01) */
/* .cover-author (vertical AUTHOR label) removed 2026-06-29. */
[data-template="clean-light"] .cover-accent {
  position: absolute !important; left: 256px !important; top: 514px !important;
  width: 81px !important; height: 9px !important;
  border-radius: 4px !important; background: var(--teal) !important;
  z-index: 5 !important;
}
[data-template="clean-light"] .cover-text {
  position: absolute !important; left: 252px !important; top: 543px !important;
  max-width: 990px !important; z-index: 5 !important; /* match internal-page widths */
}
[data-template="clean-light"] .cover-title {
  font-size: 102px !important; font-weight: 700 !important;
  color: var(--ink) !important; letter-spacing: -0.5px !important; line-height: 1.05 !important;
  margin: 0 0 32px 0 !important;
}
[data-template="clean-light"] .cover-subtitle {
  padding-left: 4px !important;
  font-size: 39px !important; font-weight: 400 !important;
  color: var(--ink) !important; opacity: .65 !important; margin: 0 !important;
}

/* SECTION DIVIDER (.sd) */
[data-template="clean-light"] .sd-content {
  position: absolute !important;
  left: 256px !important; top: 50% !important; transform: translateY(-50%) !important;
  max-width: 1050px !important; z-index: 5 !important;
}
[data-template="clean-light"] .sd-num {
  font-size: 240px !important; font-weight: 700 !important;
  line-height: 0.85 !important; letter-spacing: -10px !important;
  color: var(--teal-num) !important;
}
[data-template="clean-light"] .sd.purple .sd-num { color: var(--lilac); }
[data-template="clean-light"] .sd-dash {
  width: 81px !important; height: 9px !important; border-radius: 4px !important;
  background: var(--teal-num) !important;
  margin-top: 40px !important; margin-bottom: 56px !important;
}
[data-template="clean-light"] .sd.purple .sd-dash { background: var(--lilac); }
[data-template="clean-light"] .sd-title {
  font-size: 102px !important; font-weight: 700 !important;
  color: var(--ink) !important; line-height: 1.05 !important;
  letter-spacing: -0.5px !important; margin-bottom: 32px !important;
}
[data-template="clean-light"] .sd-desc {
  font-size: 42px !important; font-weight: 300 !important;
  color: var(--ink) !important; opacity: 0.65 !important;
  line-height: 1.5 !important;
}

/* AGENDA / TOC (.ag) */
[data-template="clean-light"] .ag-content {
  position: absolute !important;
  left: 256px !important; top: 128px !important;
  max-width: 1050px !important; z-index: 5 !important;
}
[data-template="clean-light"] .ag-eyebrow {
  font-size: 22px !important; font-weight: 600 !important;
  letter-spacing: 4px !important; text-transform: uppercase !important;
  color: var(--teal-num) !important; margin-bottom: 32px !important;
}
[data-template="clean-light"] .ag-title {
  font-size: 102px !important; font-weight: 700 !important;
  color: var(--ink) !important; line-height: 1.05 !important;
  letter-spacing: -0.5px !important; margin-bottom: 80px !important;
}
[data-template="clean-light"] .ag-list {
  list-style: none !important; padding: 0 !important; margin: 0 !important;
  display: flex !important; flex-direction: column !important;
  gap: 44px !important;
}
[data-template="clean-light"] .ag-item { display: flex; align-items: flex-start; gap: 36px; }
[data-template="clean-light"] .ag-num {
  font-size: 72px !important; font-weight: 700 !important;
  line-height: 1 !important; letter-spacing: -2px !important;
  color: var(--teal-num) !important; min-width: 120px !important;
}
[data-template="clean-light"] .ag-item-body { flex: 1; padding-top: 10px; }
[data-template="clean-light"] .ag-name {
  font-size: 40px !important; font-weight: 500 !important;
  color: var(--ink) !important; line-height: 1.2 !important; margin-bottom: 8px !important;
}
[data-template="clean-light"] .ag-desc {
  font-size: 26px !important; font-weight: 300 !important;
  color: var(--ink) !important; opacity: 0.65 !important; line-height: 1.4 !important;
}

/* CLOSING (slide 11) */
[data-template="clean-light"] .closing-accent {
  position: absolute !important; left: 142px !important; top: 480px !important;
  width: 81px !important; height: 9px !important;
  border-radius: 4px !important; background: var(--teal) !important;
  z-index: 5 !important;
}
[data-template="clean-light"] .closing-title {
  position: absolute !important;
  left: 142px !important; top: 510px !important;
  font-size: 120px !important; font-weight: 700 !important;
  color: var(--ink) !important; line-height: 1 !important; margin: 0 0 32px !important;
  z-index: 5 !important;
}
[data-template="clean-light"] .closing-subtitle {
  position: absolute !important;
  left: 142px !important; top: 660px !important;
  font-size: 38px !important; font-weight: 400 !important;
  color: var(--ink) !important; opacity: .65 !important; margin: 0 !important;
  z-index: 5 !important;
}

/* ─────────────────────────────────────────────────────────────────
   L8 Chart slide — force spec layout per design-specs/clean-light.html
   line 1289. Mirror of midnight-purple E8 / gradient-bloom E8 pattern.
   Spec: heading h2.h-section @ top:80 left:142 max-width:1700 (left-
   aligned, slab), canvas 1708×765 @ (140, 255) with 15px rounded
   corners, no caption slot. (Rainy 2026-06-19.)
   ───────────────────────────────────────────────────────────────── */
/* Only force coords on the OUTERMOST chart wrap — model often nests
   .tmpl-img.chart-host inside a .ph wrapper. If both layers get
   left:140 top:255 absolute, the inner one stacks 140px right + 255px
   down from .ph (already at 140/255 in design coords), pushing the
   chart way off-spec. (Rainy 2026-06-19: chart 位移严重, .ph + nested
   .tmpl-img.chart-host both forced same coords.) Use `> *` direct-
   child selectors so only top-level wraps get coords; nested ones
   below fall through to the fill-parent rule. */
[data-template="clean-light"][data-layout="page-10"] > .ph,
[data-template="clean-light"][data-layout="page-10"] > .tmpl-chart,
[data-template="clean-light"][data-layout="page-10"] > .tmpl-img.chart-host,
[data-template="clean-light"][data-layout="page-10"] > .chart-host,
[data-template="clean-light"][data-layout="page-10"] .obj-html-inner > .ph,
[data-template="clean-light"][data-layout="page-10"] .obj-html-inner > .tmpl-chart,
[data-template="clean-light"][data-layout="page-10"] .obj-html-inner > .tmpl-img.chart-host,
[data-template="clean-light"][data-layout="page-10"] .obj-html-inner > .chart-host {
  position: absolute !important;
  left: 140px !important; top: 255px !important;
  width: 1708px !important; height: 765px !important;
  max-width: none !important; max-height: none !important;
  min-width: 1708px !important; min-height: 765px !important;
  margin: 0 !important;
  background: transparent !important;
  border: none !important;
  border-radius: 15px !important;
  z-index: 2 !important;
  overflow: hidden !important;
}
/* Inner chart wraps (nested inside the outer .ph etc.) just fill
   their parent — no coords, no double-offset. */
[data-template="clean-light"][data-layout="page-10"] .ph .tmpl-img,
[data-template="clean-light"][data-layout="page-10"] .ph .chart-host,
[data-template="clean-light"][data-layout="page-10"] .ph .tmpl-chart,
[data-template="clean-light"][data-layout="page-10"] .tmpl-chart .chart-host {
  position: absolute !important;
  inset: 0 !important;
  left: 0 !important; top: 0 !important;
  width: 100% !important; height: 100% !important;
  background: transparent !important;
  border: none !important;
}
/* Canvas always fills its immediate wrap. */
[data-template="clean-light"][data-layout="page-10"] canvas {
  width: 100% !important; height: 100% !important;
  display: block !important;
}

/* Heading per spec — h2.h-section @ top:80 left:142 max-width:1700,
   font 52px / weight 500 / ink color. Force font-size + weight + color
   so headings render uniformly regardless of which tag (h1/h2/h3) or
   class the model emitted. (Rainy 2026-06-19: 两个 chart heading
   字号不一致.) */
[data-template="clean-light"][data-layout="page-10"] h1,
[data-template="clean-light"][data-layout="page-10"] h2,
[data-template="clean-light"][data-layout="page-10"] h3,
[data-template="clean-light"][data-layout="page-10"] .h-section,
[data-template="clean-light"][data-layout="page-10"] [class*="headline"] {
  position: absolute !important;
  top: 80px !important;
  left: 142px !important;
  max-width: 1700px !important;
  margin: 0 !important;
  z-index: 3 !important;
  font-size: 52px !important;
  font-weight: 500 !important;
  line-height: 1.2 !important;
  color: var(--ink) !important;
}

/* Hide stray caption / subtitle — L8 spec has only heading + chart. */
[data-template="clean-light"][data-layout="page-10"] .obj-html-inner > p,
[data-template="clean-light"][data-layout="page-10"] .obj-html-inner > span,
[data-template="clean-light"][data-layout="page-10"] .obj-html-inner > div:not(.tmpl-chart):not(.tmpl-img):not(.chart-host):not(.ph):not(.scaffold):not([class*="blob"]):not(.veil),
[data-template="clean-light"][data-layout="page-10"] > p,
[data-template="clean-light"][data-layout="page-10"] > span {
  display: none !important;
}

/* Cover + closing slide dedupe: when _cleanLightApplyCoverChrome
   runs, it appends spec elements (.cover-text wrapper + .cover-title +
   .cover-subtitle) but the model's original elements (whatever class
   names — sometimes .cover-title, sometimes .closing-title, sometimes
   bare h1/p) also remain in the section, since the regex-replace
   doesn't always fully remove them. Result: two "Thank You" / two
   "Creator Economy Data Report" overlapping. Hide every direct h1/p/
   spec-class child of obj-html-inner WHEN .cover-text wrapper is
   present — that's the normalize-fired signal. (Rainy 2026-06-19:
   "close 也有重叠 / cover 也有两层".) */
[data-template="clean-light"][data-layout="hero"]:has(.cover-text) .obj-html-inner > h1,
[data-template="clean-light"][data-layout="hero"]:has(.cover-text) .obj-html-inner > h2,
[data-template="clean-light"][data-layout="hero"]:has(.cover-text) .obj-html-inner > p,
[data-template="clean-light"][data-layout="hero"]:has(.cover-text) .obj-html-inner > .cover-title,
[data-template="clean-light"][data-layout="hero"]:has(.cover-text) .obj-html-inner > .cover-subtitle,
[data-template="clean-light"][data-layout="closing"]:has(.cover-text) .obj-html-inner > h1,
[data-template="clean-light"][data-layout="closing"]:has(.cover-text) .obj-html-inner > h2,
[data-template="clean-light"][data-layout="closing"]:has(.cover-text) .obj-html-inner > p,
[data-template="clean-light"][data-layout="closing"]:has(.cover-text) .obj-html-inner > .closing-title,
[data-template="clean-light"][data-layout="closing"]:has(.cover-text) .obj-html-inner > .closing-subtitle,
[data-template="clean-light"][data-layout="closing"]:has(.cover-text) .obj-html-inner > .closing-waves,
[data-template="clean-light"][data-layout="closing"]:has(.cover-text) .obj-html-inner > .closing-accent,
[data-template="clean-light"][data-layout="closing"]:has(.cover-text) .obj-html-inner > .cover-title,
[data-template="clean-light"][data-layout="closing"]:has(.cover-text) .obj-html-inner > .cover-subtitle {
  display: none !important;
}

/* Slot bounds — see code/scripts/check_slot_bounds.py, which flagged these.
 *
 * Nothing sits beneath them, but the canvas does not scroll: unbounded copy
 * runs off the bottom edge, losing the text as surely as printing over a
 * neighbour would.
 *
 * This file is generated from html_gen_prompt.py, so the same declarations were
 * added to that source — a regeneration keeps them instead of quietly dropping
 * the fix. (Rainy 2026-07-28.)
 */
[data-template="clean-light"] .closing-title { max-height: 510px !important; overflow: hidden !important; }
[data-template="clean-light"] .closing-subtitle { max-height: 360px !important; overflow: hidden !important; }

[data-template="clean-light"] .closing-title , [data-template="clean-light"] .closing-subtitle { --ocu-min-font: 22px; }
