// Simulated webinar campaign assets — 1600x900 LP, 600x150 email, 600x200 zoom, IAB ad sizes
// Composition lifted from /2025---Tines-Dragos-RegScale-Webinar/LP-Tines-Dragos-RegScale_Webinar_1920x1080
// Verified against /MASTER-RegScale-Hosted-Webinar-Assets/* and /Template-Webinar-Name---Year---Hosted-Webinar/Graphic-Requirements

const { useState: useStateCM, useEffect: useEffectCM, useRef: useRefCM } = React;

const CAMPAIGN = {
  pretitle: "Hosted Webinar",
  title: "3 Ways to Mature Your Legacy GRC Program in a Highly Regulated Environment",
  date: "September 3, 2025",
  time: "10:00 AM ET",
  cta: "Register Now",
  speakers: [
    { name: "Travis Howerton", title: "Co-Founder & CEO, RegScale" },
    { name: "Eoin Hinchy",     title: "Co-Founder & CEO, Tines" },
    { name: "Robert M. Lee",   title: "Co-Founder & CEO, Dragos" },
  ],
  partners: ["Tines", "Dragos"],
};

// ── Building blocks ──────────────────────────────────────────────────────

function WebinarKey({ scale = 1, label = "webinar" }) {
  return (
    <div style={{
      display: "inline-block",
      background: "var(--rs-light-blue)",
      border: `${5 * scale}px solid #fff`,
      borderRadius: `${40 * scale}px`,
      padding: `${10 * scale}px ${36 * scale}px`,
      fontFamily: "Montserrat",
      fontWeight: 700,
      fontSize: `${40 * scale}px`,
      letterSpacing: "0.020em",
      color: "#fff",
      lineHeight: 1,
      textTransform: "lowercase",
    }}>
      {label}
    </div>
  );
}

function CtaButton({ label, scale = 1 }) {
  return (
    <button style={{
      background: "var(--rs-cyber-orange)",
      color: "#fff",
      border: `${4 * scale}px solid #fff`,
      borderRadius: 999,
      padding: `${18 * scale}px ${48 * scale}px`,
      fontFamily: "Roboto",
      fontWeight: 700,
      fontSize: `${28 * scale}px`,
      letterSpacing: "0.06em",
      textTransform: "uppercase",
      cursor: "pointer",
      boxShadow: `0 ${10 * scale}px ${24 * scale}px rgba(242,89,36,0.35)`,
      whiteSpace: "nowrap",
    }}>
      {label}
    </button>
  );
}

function DateBlock({ scale = 1, date, time }) {
  // The slate calendar icon block per the Tines LP — simplified
  const s = scale;
  return (
    <div style={{ display: "flex", alignItems: "center", gap: 24 * s }}>
      <div style={{
        width: 134 * s, height: 134 * s,
        background: "var(--rs-slate-grey)",
        borderRadius: 16 * s,
        position: "relative",
        flexShrink: 0,
        boxShadow: `0 ${6 * s}px ${20 * s}px rgba(0,0,0,0.25)`,
      }}>
        {/* binder rings */}
        <div style={{ position: "absolute", top: -8 * s, left: 24 * s, width: 14 * s, height: 24 * s, background: "var(--rs-slate-grey)", borderRadius: 4 * s }} />
        <div style={{ position: "absolute", top: -8 * s, right: 24 * s, width: 14 * s, height: 24 * s, background: "var(--rs-slate-grey)", borderRadius: 4 * s }} />
        {/* check */}
        <div style={{ position: "absolute", inset: 24 * s, background: "#D8EFEF", borderRadius: 8 * s, border: `${4 * s}px solid var(--rs-slate-grey)`, display: "grid", placeItems: "center" }}>
          <svg width={50 * s} height={36 * s} viewBox="0 0 50 36" fill="none">
            <path d="M4 18 L20 32 L46 4" stroke="var(--rs-slate-grey)" strokeWidth={6} strokeLinecap="round" strokeLinejoin="round" />
          </svg>
        </div>
      </div>
      <div style={{
        fontFamily: "Roboto",
        fontWeight: 700,
        fontSize: 64 * s,
        lineHeight: 1.18,
        color: "#fff",
        textShadow: `0 ${6 * s}px ${6 * s}px rgba(0,0,0,0.25)`,
        whiteSpace: "nowrap",
      }}>
        {date} <span style={{ opacity: 0.6, fontWeight: 300, margin: `0 ${12 * s}px` }}>|</span> {time}
      </div>
    </div>
  );
}

// Inverse RegScale wordmark sized to a target width
function InverseWordmark({ width = 440 }) {
  return (
    <div style={{ display: "inline-flex", alignItems: "center", gap: width * 0.04, color: "#fff" }}>
      <div style={{
        width: width * 0.16, height: width * 0.16,
        background: "url(./assets/regscale-symbol-color.png) center/contain no-repeat",
      }} />
      <div style={{
        fontFamily: "Montserrat",
        fontWeight: 800,
        fontSize: width * 0.16,
        letterSpacing: "-0.02em",
        lineHeight: 1,
      }}>
        Reg<span style={{ color: "var(--rs-light-blue)" }}>Scale</span>
      </div>
    </div>
  );
}

// ── Mock surfaces ────────────────────────────────────────────────────────

function LandingPage1600() {
  // 1600x900 hero. Rendered at scale via CSS transform in caller.
  return (
    <div style={{
      position: "relative",
      width: 1600, height: 900,
      overflow: "hidden",
      background: "var(--rs-slate-blue)",
      boxShadow: "0 30px 80px rgba(46,48,145,0.25)",
      borderRadius: 4,
    }}>
      {/* Photography placeholder — striped duotone */}
      <div style={{
        position: "absolute", inset: 0,
        background: "linear-gradient(135deg, #2E3091 0%, #0070BD 50%, #29ABE3 100%)",
      }}>
        <svg width="100%" height="100%" style={{ mixBlendMode: "overlay", opacity: 0.4 }}>
          <defs>
            <pattern id="lp-stripes" width="24" height="24" patternUnits="userSpaceOnUse" patternTransform="rotate(35)">
              <line x1="0" y1="0" x2="0" y2="24" stroke="#000" strokeWidth="9" opacity="0.55" />
            </pattern>
          </defs>
          <rect width="100%" height="100%" fill="url(#lp-stripes)" />
        </svg>
      </div>
      {/* Diagonal magenta image overlay — matches Tines LP exactly */}
      <div style={{
        position: "absolute", left: 0, top: 0,
        width: 900, height: 1600,
        transform: "matrix(0,-1,1,0,0,900)",
        transformOrigin: "0 0",
        background: "linear-gradient(rgb(158,0,93) 0%, rgba(32,30,167,0) 52%, rgb(158,0,93) 67%, rgb(158,0,93) 97%)",
        opacity: 0.85,
      }} />

      {/* RegScale inverse logo — top-left */}
      <div style={{ position: "absolute", left: 64, top: 56 }}>
        <InverseWordmark width={460} />
      </div>

      {/* Partner row — center-top */}
      <div style={{ position: "absolute", left: 540, top: 64, display: "flex", alignItems: "center", gap: 36 }}>
        <div style={{
          width: 200, height: 60,
          display: "grid", placeItems: "center",
          color: "#fff", fontFamily: "Montserrat", fontWeight: 800, fontSize: 44, letterSpacing: "-0.02em",
          opacity: 0.95,
        }}>tines</div>
        <div style={{ width: 1, height: 50, background: "rgba(255,255,255,0.4)" }} />
        <div style={{
          height: 60,
          display: "grid", placeItems: "center",
          color: "#fff", fontFamily: "Montserrat", fontWeight: 800, fontSize: 44, letterSpacing: "-0.04em",
        }}>DRAGOS</div>
      </div>

      {/* Webinar key — top-right */}
      <div style={{ position: "absolute", right: 64, top: 64 }}>
        <WebinarKey />
      </div>

      {/* Headline */}
      <div style={{
        position: "absolute",
        left: 252,
        top: 218,
        width: 1213,
        fontFamily: "Montserrat",
        fontWeight: 800,
        fontSize: 92,
        lineHeight: 1.04,
        letterSpacing: "-0.01em",
        color: "#fff",
        textShadow: "0 8px 8px rgba(0,0,0,0.25)",
        textWrap: "balance",
      }}>
        3 Ways to Mature Your <span style={{ color: "var(--rs-light-blue)" }}>Legacy GRC Program</span> in a Highly Regulated Environment
      </div>

      {/* Date row */}
      <div style={{ position: "absolute", left: 193, top: 575 }}>
        <DateBlock date="September 3, 2025" time="10:00 AM ET" />
      </div>

      {/* CTA */}
      <div style={{ position: "absolute", left: 504, top: 740 }}>
        <CtaButton label="Register Now →" />
      </div>

      {/* Speakers strip — bottom-left */}
      <div style={{ position: "absolute", left: 64, bottom: 36, display: "flex", gap: 28 }}>
        {CAMPAIGN.speakers.map((s, i) => (
          <div key={i} style={{ display: "flex", alignItems: "center", gap: 12 }}>
            <div style={{
              width: 56, height: 56, borderRadius: 999,
              background: ["#29ABE3","#0DC7BF","#9E005D"][i],
              border: "3px solid #fff",
            }} />
            <div style={{ color: "#fff", fontFamily: "Montserrat" }}>
              <div style={{ fontSize: 14, fontWeight: 700 }}>{s.name}</div>
              <div style={{ fontSize: 11, opacity: 0.8 }}>{s.title}</div>
            </div>
          </div>
        ))}
      </div>
    </div>
  );
}

function EmailBanner600() {
  // 600x150
  return (
    <div style={{
      position: "relative", width: 600, height: 150,
      overflow: "hidden", borderRadius: 4,
      boxShadow: "0 8px 24px rgba(46,48,145,0.18)",
      background: "linear-gradient(135deg, #2E3091 0%, #0070BD 100%)",
    }}>
      <svg width="100%" height="100%" style={{ position: "absolute", inset: 0, mixBlendMode: "overlay", opacity: 0.32 }}>
        <defs>
          <pattern id="em-stripes" width="14" height="14" patternUnits="userSpaceOnUse" patternTransform="rotate(35)">
            <line x1="0" y1="0" x2="0" y2="14" stroke="#000" strokeWidth="6" />
          </pattern>
        </defs>
        <rect width="100%" height="100%" fill="url(#em-stripes)" />
      </svg>
      {/* logo */}
      <div style={{ position: "absolute", left: 18, top: 16 }}>
        <InverseWordmark width={170} />
      </div>
      {/* webinar key */}
      <div style={{ position: "absolute", right: 16, top: 16 }}>
        <WebinarKey scale={0.36} />
      </div>
      {/* headline */}
      <div style={{
        position: "absolute", left: 18, top: 60, right: 18,
        fontFamily: "Montserrat", fontWeight: 800, fontSize: 20, lineHeight: 1.1, color: "#fff",
        letterSpacing: "-0.01em",
      }}>
        3 Ways to Mature Your Legacy GRC Program
      </div>
      {/* date + cta */}
      <div style={{ position: "absolute", left: 18, bottom: 14, fontFamily: "Roboto", fontWeight: 700, fontSize: 13, color: "#fff" }}>
        Sept 3, 2025 · 10 AM ET
      </div>
      <div style={{ position: "absolute", right: 14, bottom: 12 }}>
        <button style={{
          background: "var(--rs-cyber-orange)", color: "#fff",
          fontFamily: "Roboto", fontWeight: 700, fontSize: 11, letterSpacing: "0.08em",
          textTransform: "uppercase", border: "2px solid #fff",
          borderRadius: 999, padding: "7px 16px", cursor: "pointer",
        }}>Register</button>
      </div>
    </div>
  );
}

function ZoomBanner600() {
  // 600x200
  return (
    <div style={{
      position: "relative", width: 600, height: 200,
      overflow: "hidden", borderRadius: 4,
      boxShadow: "0 8px 24px rgba(46,48,145,0.18)",
      background: "linear-gradient(135deg, #2E3091 0%, #29ABE3 100%)",
    }}>
      <svg width="100%" height="100%" style={{ position: "absolute", inset: 0, mixBlendMode: "overlay", opacity: 0.3 }}>
        <defs>
          <pattern id="zm-stripes" width="14" height="14" patternUnits="userSpaceOnUse" patternTransform="rotate(35)">
            <line x1="0" y1="0" x2="0" y2="14" stroke="#000" strokeWidth="6" />
          </pattern>
        </defs>
        <rect width="100%" height="100%" fill="url(#zm-stripes)" />
      </svg>
      {/* magenta side overlay */}
      <div style={{
        position: "absolute", left: 0, top: 0, width: 200, height: 200,
        background: "linear-gradient(180deg, rgba(158,0,93,0.85) 0%, rgba(158,0,93,0) 100%)",
      }} />
      <div style={{ position: "absolute", left: 18, top: 18 }}>
        <InverseWordmark width={170} />
      </div>
      <div style={{ position: "absolute", right: 18, top: 18 }}>
        <WebinarKey scale={0.42} />
      </div>
      <div style={{
        position: "absolute", left: 18, top: 84, right: 18,
        fontFamily: "Montserrat", fontWeight: 800, fontSize: 22, lineHeight: 1.1, color: "#fff",
        letterSpacing: "-0.01em",
      }}>
        3 Ways to Mature Your Legacy GRC Program
      </div>
      <div style={{
        position: "absolute", left: 18, bottom: 16,
        fontFamily: "Roboto", fontWeight: 700, fontSize: 16, color: "#fff",
      }}>
        Sept 3, 2025 · 10:00 AM ET
      </div>
      <div style={{ position: "absolute", right: 18, bottom: 14 }}>
        <button style={{
          background: "var(--rs-cyber-orange)", color: "#fff",
          fontFamily: "Roboto", fontWeight: 700, fontSize: 12, letterSpacing: "0.1em",
          textTransform: "uppercase", border: "3px solid #fff",
          borderRadius: 999, padding: "9px 20px", cursor: "pointer",
        }}>Register Now</button>
      </div>
    </div>
  );
}

// ── IAB Ad sizes ──────────────────────────────────────────────────────────

function AdMedRectangle300x250() {
  return (
    <div style={{
      position: "relative", width: 300, height: 250, overflow: "hidden", borderRadius: 4,
      background: "linear-gradient(180deg, #0070BD 0%, #2E3091 100%)",
      boxShadow: "0 6px 18px rgba(46,48,145,0.22)",
    }}>
      <div style={{ position: "absolute", left: 14, top: 14 }}><InverseWordmark width={140} /></div>
      <div style={{ position: "absolute", right: 12, top: 12 }}><WebinarKey scale={0.28} /></div>
      <div style={{
        position: "absolute", left: 14, top: 70, right: 14,
        fontFamily: "Montserrat", fontWeight: 800, fontSize: 22, lineHeight: 1.05, color: "#fff",
        letterSpacing: "-0.01em",
      }}>
        Mature Your Legacy GRC Program
      </div>
      <div style={{
        position: "absolute", left: 14, top: 158,
        fontFamily: "Roboto", fontWeight: 700, fontSize: 14, color: "#fff",
      }}>
        Sept 3, 2025 · 10 AM ET
      </div>
      <div style={{ position: "absolute", left: 14, bottom: 14 }}>
        <button style={{
          background: "var(--rs-cyber-orange)", color: "#fff",
          fontFamily: "Roboto", fontWeight: 700, fontSize: 11, letterSpacing: "0.1em",
          textTransform: "uppercase", border: "2px solid #fff",
          borderRadius: 999, padding: "9px 20px", cursor: "pointer",
        }}>Register Now</button>
      </div>
    </div>
  );
}

function AdLeaderboard728x90() {
  return (
    <div style={{
      position: "relative", width: 728, height: 90, overflow: "hidden", borderRadius: 4,
      background: "linear-gradient(90deg, #2E3091 0%, #0070BD 100%)",
      boxShadow: "0 6px 18px rgba(46,48,145,0.22)",
      display: "flex", alignItems: "center", padding: "0 16px", gap: 16,
    }}>
      <div style={{ flexShrink: 0 }}><InverseWordmark width={150} /></div>
      <div style={{ flexShrink: 0 }}><WebinarKey scale={0.26} /></div>
      <div style={{
        flex: 1,
        fontFamily: "Montserrat", fontWeight: 800, fontSize: 18, lineHeight: 1.15, color: "#fff",
        letterSpacing: "-0.01em", textWrap: "balance",
      }}>
        Mature Your Legacy GRC Program · Sept 3
      </div>
      <button style={{
        background: "var(--rs-cyber-orange)", color: "#fff",
        fontFamily: "Roboto", fontWeight: 700, fontSize: 11, letterSpacing: "0.1em",
        textTransform: "uppercase", border: "2px solid #fff",
        borderRadius: 999, padding: "10px 20px", cursor: "pointer", flexShrink: 0,
      }}>Register</button>
    </div>
  );
}

function AdSkyscraper160x600() {
  return (
    <div style={{
      position: "relative", width: 160, height: 600, overflow: "hidden", borderRadius: 4,
      background: "linear-gradient(180deg, #0070BD 0%, #2E3091 60%, #9E005D 100%)",
      boxShadow: "0 6px 18px rgba(46,48,145,0.22)",
    }}>
      <div style={{ position: "absolute", left: 12, top: 14 }}><InverseWordmark width={130} /></div>
      <div style={{ position: "absolute", left: 12, top: 70 }}><WebinarKey scale={0.28} /></div>
      <div style={{
        position: "absolute", left: 14, top: 140, right: 14,
        fontFamily: "Montserrat", fontWeight: 800, fontSize: 22, lineHeight: 1.05, color: "#fff",
        letterSpacing: "-0.01em",
      }}>
        Mature Your Legacy GRC Program
      </div>
      <div style={{
        position: "absolute", left: 14, top: 380,
        fontFamily: "Roboto", fontWeight: 700, fontSize: 14, color: "#fff",
        lineHeight: 1.4,
      }}>
        Sept 3<br/>10 AM ET
      </div>
      <div style={{ position: "absolute", left: 14, bottom: 18, right: 14 }}>
        <button style={{
          width: "100%",
          background: "var(--rs-cyber-orange)", color: "#fff",
          fontFamily: "Roboto", fontWeight: 700, fontSize: 11, letterSpacing: "0.08em",
          textTransform: "uppercase", border: "2px solid #fff",
          borderRadius: 999, padding: "11px 0", cursor: "pointer",
        }}>Register</button>
      </div>
    </div>
  );
}

function AdMobileBanner320x50() {
  return (
    <div style={{
      position: "relative", width: 320, height: 50, overflow: "hidden", borderRadius: 4,
      background: "linear-gradient(90deg, #2E3091 0%, #0070BD 100%)",
      display: "flex", alignItems: "center", padding: "0 10px", gap: 8,
      boxShadow: "0 4px 12px rgba(46,48,145,0.22)",
    }}>
      <div style={{ flexShrink: 0 }}><InverseWordmark width={88} /></div>
      <div style={{
        flex: 1,
        fontFamily: "Montserrat", fontWeight: 700, fontSize: 11, lineHeight: 1.15, color: "#fff",
        letterSpacing: "-0.005em",
      }}>
        Mature Your Legacy GRC · Sept 3
      </div>
      <button style={{
        background: "var(--rs-cyber-orange)", color: "#fff",
        fontFamily: "Roboto", fontWeight: 700, fontSize: 9, letterSpacing: "0.08em",
        textTransform: "uppercase", border: "1.5px solid #fff",
        borderRadius: 999, padding: "6px 12px", cursor: "pointer", flexShrink: 0,
      }}>Register</button>
    </div>
  );
}

// ── Page wrappers ────────────────────────────────────────────────────────

function ScaledFrame({ width, height, label, children }) {
  // Scale to fit container width at most
  const [scale, setScale] = useStateCM(1);
  const ref = useRefCM(null);
  useEffectCM(() => {
    const el = ref.current;
    if (!el) return;
    const ro = new ResizeObserver(() => {
      const cw = el.clientWidth;
      setScale(Math.min(1, cw / width));
    });
    ro.observe(el);
    return () => ro.disconnect();
  }, [width]);
  return (
    <div ref={ref} style={{ width: "100%" }}>
      <div style={{
        width: "100%",
        height: height * scale,
        position: "relative",
        background: "var(--rs-bg)",
        border: "1px solid var(--rs-border)",
        borderRadius: 8,
        overflow: "hidden",
      }}>
        <div style={{
          position: "absolute",
          left: 0, top: 0,
          transform: `scale(${scale})`,
          transformOrigin: "0 0",
        }}>
          {children}
        </div>
      </div>
      <div style={{
        marginTop: 8,
        display: "flex", justifyContent: "space-between", alignItems: "baseline",
        fontFamily: "JetBrains Mono, monospace", fontSize: 11, color: "var(--rs-text-muted)",
      }}>
        <span style={{ fontWeight: 700, color: "var(--rs-text)", fontFamily: "Montserrat", fontSize: 13 }}>{label}</span>
        <span>{width} × {height}</span>
      </div>
    </div>
  );
}

function CampaignLandingPage() {
  return (
    <div className="page-anim">
      <SectionHeader eyebrow="Reference · Webinar campaign" title="Landing page mock — 1600×900"
        lede="Simulated webinar registration LP using the canonical RegScale composition: full-bleed photo + diagonal magenta overlay + inverse logo + Light Blue webinar key + Roboto Bold date row + solid Cyber Orange CTA."
        provenance={{ level: "verified", note: "Composition lifted from /2025---Tines-Dragos-RegScale-Webinar/LP-Tines-Dragos-RegScale_Webinar_1920x1080 (figma node 1186:869). Webinar-key dimensions, logo placement, gradient overlay rotation, and CTA pill styling all match the production source." }} />

      <H2 sub="Click any element with the inspector for placement specs.">Hero — 1600×900</H2>
      <ScaledFrame width={1600} height={900} label="LP / Social Graphic">
        <LandingPage1600 />
      </ScaledFrame>

      <H2 sub="Below-the-fold copy follows. Form sits in a right rail on the live page; we mock the visual hero only.">Anatomy</H2>
      <div className="grid grid-2">
        {[
          ["RegScale inverse logo",  "Top-left, white wordmark + Light Blue 'Scale'. ~28% of total width."],
          ["Partner co-brand row",   "Center-top. Thin white divider between partner marks."],
          ["Webinar key pill",       "Top-right. Light Blue #29ABE3 background, 5px white border, 40px Montserrat 700, 0.020em tracking."],
          ["Hero headline",          "Montserrat 800, ~92px, white with subtle shadow, balance-wrapped, key term in Light Blue."],
          ["Date block",             "Slate Grey calendar icon (134px) + 64px Roboto Bold white. Emphasizes time over everything else."],
          ["Primary CTA",            "Solid Cyber Orange + 4px white border, Roboto Bold ALL CAPS, ~18px tracking."],
          ["Speakers strip",         "Bottom-left, 56px circular avatars in brand-accent colors, Montserrat captions."],
          ["Magenta overlay",        "Diagonal gradient via 90° rotation — Protected Purple at edges, transparent center. The signature RegScale photo treatment."],
        ].map(([k, v]) => (
          <div key={k} className="card" style={{ padding: 16 }}>
            <h4 style={{ margin: "0 0 6px", fontSize: 13 }}>{k}</h4>
            <p style={{ margin: 0, fontSize: 12.5, color: "var(--rs-text-muted)", lineHeight: 1.55 }}>{v}</p>
          </div>
        ))}
      </div>

      <H2>Touchpoint set per the Hosted Webinar template</H2>
      <div className="card" style={{ padding: 18 }}>
        <p style={{ margin: 0, fontSize: 13, color: "var(--rs-text-muted)" }}>
          The 2025 Hosted Webinar template ships <b>four touchpoints</b> per campaign — see them on the next page.
        </p>
        <ul style={{ margin: "10px 0 0", paddingLeft: 20, fontSize: 13.5, lineHeight: 1.7 }}>
          <li>1× LP / Social Graphic — <code>1600×900</code></li>
          <li>1× Email Banner — <code>600×150</code></li>
          <li>1× Zoom Banner — <code>600×200</code></li>
          <li>(Optional) 1× Speaker Graphic</li>
        </ul>
      </div>
    </div>
  );
}

function CampaignAdsPage() {
  return (
    <div className="page-anim">
      <SectionHeader eyebrow="Reference · Webinar campaign" title="HTML5 ad set + email/zoom banners"
        lede="Simulated paid-media set extending the same webinar campaign across IAB standard ad sizes plus the canonical email and Zoom banners."
        provenance={{ level: "mixed", note: "Email (600×150) and Zoom (600×200) sizes verified against the Hosted Webinar template's Graphic-Requirements frame. IAB ad sizes (300×250, 728×90, 160×600, 320×50) are paid-media standards — the Figma library doesn't include canonical RegScale ad templates, so layouts are extrapolated from the LP composition." }} />

      <H2>Email & Zoom (canonical)</H2>
      <div className="grid grid-2">
        <ScaledFrame width={600} height={150} label="Email banner">
          <EmailBanner600 />
        </ScaledFrame>
        <ScaledFrame width={600} height={200} label="Zoom banner">
          <ZoomBanner600 />
        </ScaledFrame>
      </div>

      <H2 sub="Standard IAB sizes — extrapolated from the LP composition.">HTML5 ad set</H2>
      <div className="grid grid-2">
        <ScaledFrame width={300} height={250} label="Medium Rectangle">
          <AdMedRectangle300x250 />
        </ScaledFrame>
        <ScaledFrame width={728} height={90} label="Leaderboard">
          <AdLeaderboard728x90 />
        </ScaledFrame>
        <ScaledFrame width={160} height={600} label="Wide Skyscraper">
          <AdSkyscraper160x600 />
        </ScaledFrame>
        <ScaledFrame width={320} height={50} label="Mobile Banner">
          <AdMobileBanner320x50 />
        </ScaledFrame>
      </div>

      <H2>Hierarchy rules across sizes</H2>
      <div className="grid grid-2">
        <div className="voice-card">
          <div className="voice-side"><h5 className="is">Always present</h5><p>RegScale inverse logo · Webinar key pill · Solid Cyber Orange CTA.</p></div>
          <div className="voice-side"><h5 className="isnt">Drops at small sizes</h5><p>Partner co-brand · Speakers strip · Body description.</p></div>
        </div>
        <div className="voice-card">
          <div className="voice-side"><h5 className="is">Headline shrinks</h5><p>Reduce to a single benefit clause at ≤300px width. No more than 6 words.</p></div>
          <div className="voice-side"><h5 className="isnt">Don't shrink the CTA</h5><p>Action element retains 11px+ uppercase tracking. Lower legibility kills click-through.</p></div>
        </div>
        <div className="voice-card">
          <div className="voice-side"><h5 className="is">Date stays visible</h5><p>Even in 320×50, surface "Sept 3" — urgency drives webinar registration.</p></div>
          <div className="voice-side"><h5 className="isnt">No emoji</h5><p>Brand voice doesn't use them. Don't add them just because the surface is small.</p></div>
        </div>
        <div className="voice-card">
          <div className="voice-side"><h5 className="is">Animate the CTA</h5><p>HTML5 ads can pulse the orange button at 4–6s intervals (90 % opacity bob, 240ms ease-emphasis).</p></div>
          <div className="voice-side"><h5 className="isnt">Don't autoplay everything</h5><p>One animated element max per ad. Don't loop the headline. Don't loop the gradient.</p></div>
        </div>
      </div>

      <H2>Production notes</H2>
      <div className="card" style={{ padding: 18 }}>
        <ul style={{ margin: 0, paddingLeft: 20, fontSize: 13.5, lineHeight: 1.8 }}>
          <li><b>Click area:</b> entire ad surface should be clickable, with the CTA button as the visual focus.</li>
          <li><b>Polite load:</b> initial file size ≤ 150KB per IAB; defer secondary assets to backup image.</li>
          <li><b>Backup image:</b> ship a flattened JPG/PNG of frame 1 for non-HTML5 placements.</li>
          <li><b>Copy:</b> drop pretitle ("Hosted Webinar") at ≤728×90 — the webinar pill carries the same signal.</li>
          <li><b>Tracking:</b> all CTAs append <code>?utm_source</code>+<code>utm_campaign</code> per the marketing standard.</li>
        </ul>
      </div>
    </div>
  );
}

Object.assign(window, { CampaignLandingPage, CampaignAdsPage });
