// webinar-detail.jsx — univerzální konverzní landing pro webináře/kurzy/školení
// Vyhledá data z window.KH_WEBINARS podle ID v URL (page = 'kh-webinar-identita' apod.)

const { useState: useStateWD, useRef: useRefWD, useEffect: useEffectWD } = React;

// ────────────────────────────────────────────────
// Per-webinar contentové bloky. Stačí přidat klíč podle id webináře.
// Univerzální fallback v `WD_DEFAULT` pokud nic není.
// ────────────────────────────────────────────────
const WD_CONTENT = {
  'identita': {
    promise: 'Po kurzu budeš vědět, jaké rozhodnutí stojí za každým prvkem značky — a jak je obhájit.',
    intro: 'Školení tě provede tím, jak postavit vizuální identitu, která značku skutečně podpoří — od strategie přes logo a typografii až po brand guidelines.\n\nSeznámíš se s tím, co vůbec značka je, jak se liší od vizuální identity a proč je tohle rozlišení fundamentální pro každé další rozhodnutí. Naučíš se postavit vizuální systém, který je víc než „hezké logo" — kostru, která drží značku pohromadě napříč kanály.\n\nUkážeme ti, jak vést design review a nebát se říct „tohle ne". Pochopíš, co patří do brand guidelines, jak je udržet živé a jak postupovat, když značka roste a guidelines začínají skřípat.\n\nKurz uzavře praktický workshop, kde si zkusíš mini-rebrand vlastní (nebo fiktivní) značky s přímým feedbackem od lektora.',
    audience: [
      { who:'Majitelé firem', need:'kterým se značka „nějak vyvíjí" a chtějí v tom mít systém.' },
      { who:'Marketéři in-house', need:'co chystají rebrand nebo brand refresh.' },
      { who:'Designéři začínající', need:'kteří chtějí přejít z provedení k rozhodování.' },
      { who:'Brand manažeři', need:'co spravují více značek a chtějí v tom mít jasný systém.' },
    ],
    modules: [
      { n:'01', t:'Co je značka, co je identita',  d:'Slovník, který používá málokdo správně. Rozdíl mezi brandem, identitou a obalem — a proč je to fundamentální pro každé další rozhodnutí.' },
      { n:'02', t:'Strategie před vizuálem',       d:'Positioning, persona, tone of voice. Z čeho identita roste, jak jednotlivé vrstvy spolu souvisí a kde je nejčastější chyba v sekvenci.' },
      { n:'03', t:'Logo, logotyp a značka',        d:'Konstrukce, varianty, ochranné zóny, monogram, signet. Co testujeme, proč a co dělá logo trvanlivým a co naopak rychle stárne.' },
      { n:'04', t:'Barevná paleta a typografie',   d:'Primární, sekundární, accent. Pravidla pro kontrast a accessibility. Výběr písma, typographic scale, párování. Praktické příklady.' },
      { n:'05', t:'Vizuální systém',               d:'Grid, prvky, ikonografie, fotografie, ilustrace. Jak to celé poskládat dohromady tak, aby značka držela napříč kanály i autory.' },
      { n:'06', t:'Brand guidelines + workshop',   d:'Co patří do brand guidelines, jak je udržet živé a praktický mini-rebrand vlastní značky s feedbackem od lektora.' },
    ],
  },
  'linkedin': {
    promise: 'Po kurzu budeš mít LinkedIn profil, který přitahuje příležitosti — a jasnou content rutinu.',
    intro: 'Školení tě provede tím, jak si na LinkedIn vybudovat profesní značku, která ti otevírá dveře — bez agentury, bez ghostwritera a bez „content kalendáře", který stejně nedodržíš.\n\nProjdeme si profil řádek po řádku — headline, bio, banner, foto. Ukážu ti, co algoritmus 2026 skutečně promuje, co je už jen šum a jak najít své téma, ve kterém můžeš mluvit autenticky a zároveň relevantně.\n\nUkážeme si formáty postů, které dnes opravdu fungují, kdy publikovat a jak reagovat. Společně postavíme 30denní plán obsahu, který je dostatečně malý na to, abys ho zvládl, a dostatečně velký, aby se začaly hýbat čísla.',
    audience: [
      { who:'Manažeři a CEO', need:'co chtějí budovat osobní značku, ale neví od čeho začít.' },
      { who:'B2B obchodníci', need:'co potřebují, aby si je lidi všímali — bez cold mailů.' },
      { who:'Marketéři', need:'co řídí firemní LinkedIn a chtějí konečně mít výsledky.' },
      { who:'Recruiteři a HR', need:'co staví na LinkedIn employer brand a hledají kandidáty.' },
    ],
    modules: [
      { n:'01', t:'Profil jako landing page',  d:'Headline, bio, photo, banner. Co tam patří, proč a v jakém pořadí. Příklady, anti-patterny, konkrétní šablony.' },
      { n:'02', t:'Personal vs. company',      d:'Kde se vyplatí investovat čas a kde ne. Jak propojit firemní a osobní účet tak, aby se navzájem nesabotovaly.' },
      { n:'03', t:'Algoritmus 2026',           d:'Co LinkedIn skutečně promuje — data místo dojmů. Co se v posledním roce změnilo a co to znamená pro tvůj content plán.' },
      { n:'04', t:'Témata a hlas',             d:'Z čeho dlouhodobě těžit, jak najít svůj úhel pohledu a kdy se neostýchat sdílet i neúspěchy. Jak nepsat o všem.' },
      { n:'05', t:'Formáty postů',             d:'Text-only, carousel, video, články. Co funguje teď, co je už ztráta času a jak experimentovat tak, aby ses neztratil.' },
      { n:'06', t:'Plán a rutina',             d:'30 dní obsahu krok po kroku. Jak nepřepálit start, jak udržet kadenci a co dělat, když to týden nejde.' },
    ],
  },
  'persony': {
    promise: 'Po kurzu už nikdy nezpleteš segmentaci s personou — a budeš vědět, co s každou v praxi.',
    intro: 'Školení ti dá jasný rámec, jak v marketingu pracovat s cílovými skupinami a personami — bez zbytečné teorie, ale s metodikou, která funguje na reálných projektech.\n\nProjdeme si slovník, který si lidé pletou, a vysvětlíme rozdíl mezi segmentem, cílovou skupinou, personou a JTBD. Ukážeme si, jak segmentovat tak, aby z toho vznikla opravdu použitelná persona, a jak ji postavit na výzkumu, ne na stereotypech.\n\nKurz uzavře praktická aplikace v týmu — jak personu používat, aby neskončila v šuplíku, jaké rituály a procesy zavést a jak se rozhodovat, když persona se segmentem nesouhlasí.',
    audience: [
      { who:'Marketéři a PM', need:'kterým někdo řekl „udělejte si personu" a oni neví jak.' },
      { who:'Stratégové', need:'co chtějí svoji práci podepřít daty, ne dojmy.' },
      { who:'Zakladatelé', need:'kteří staví produkt a chtějí pochopit, pro koho.' },
      { who:'Výzkumníci', need:'co chtějí výzkum přetavit do výstupu, který tým použije.' },
    ],
    modules: [
      { n:'01', t:'Slovník',                  d:'Segment, target group, persona, JTBD — co je co, kde se to plete a proč je rozlišení důležité pro každé rozhodnutí.' },
      { n:'02', t:'Segmentace',               d:'Demografická, behaviorální, psychografická, kontextová. Kdy která dává smysl a jak je kombinovat bez toho, aby z toho vznikl chaos.' },
      { n:'03', t:'Výzkum bez budgetu',       d:'Jak na to bez velkého budgetu — qualitative interview, mini-průzkumy, social listening. Co je signál a co šum.' },
      { n:'04', t:'Tvorba persony',           d:'Co tam patří, co ne. Anti-patterny, příklady dobrých a špatných person. Šablona, kterou skutečně používáme v agentuře.' },
      { n:'05', t:'JTBD a use cases',         d:'Job to be done jako kompletní rámec — kdy je výhodnější než persona, jak je propojit a jak z toho udělat brief pro tým.' },
      { n:'06', t:'Použití v týmu',           d:'Aby persona neskončila v šuplíku — proces, rituály, jak ji zapojit do produktových a marketingových rozhodnutí.' },
    ],
  },
  'koncept': {
    promise: 'Po kurzu poznáš dobrý koncept od dobrého provedení — a budeš ho umět napsat.',
    intro: 'Školení tě naučí pracovat s kreativním konceptem na úrovni, která ti dovolí ho psát, posuzovat i obhájit. Bez floskulí, bez „intuice", ale s rámcem, který funguje.\n\nProjdeme, co koncept skutečně je, jak souvisí s positioning, claimem, taglinem a vizuálem. Ukážu ti, jak vypadá brief, ze kterého má smysl koncept stavět, a jak postupovat, když brief chybí nebo je zmatený.\n\nNakonec si zkusíš napsat vlastní koncept pro skutečnou (nebo fiktivní) značku, dostaneš zpětnou vazbu a naučíš se ho obhájit tak, aby prošel bez ředění při schvalování.',
    audience: [
      { who:'Stratégové a kreativci', need:'co chtějí mít rámec pro práci s konceptem.' },
      { who:'Marketing manažeři', need:'co posuzují koncepty od agentur a chtějí vědět co po nich chtít.' },
      { who:'Zakladatelé', need:'co potřebují konzistentně komunikovat značku napříč.' },
      { who:'Copywriteři', need:'co pracují s konceptem dennodenně a chtějí jej obhájit před klientem.' },
    ],
    modules: [
      { n:'01', t:'Co je koncept',             d:'Definice, hierarchie, vztah k positioning, claim a tagline. Co je koncept a co už není — s konkrétními příklady ze značek.' },
      { n:'02', t:'Brief',                     d:'Z čeho vychází koncept, jak vypadá dobrý brief a co dělat, když brief chybí. Šablona briefu, kterou si můžeš odnést.' },
      { n:'03', t:'Tvorba',                    d:'Techniky a metody, které opravdu fungují — od asociačních cvičení po creative tension framework. Bez „brainstormů".' },
      { n:'04', t:'Hodnocení konceptu',        d:'Jak rozeznat dobrý koncept od dobrého provedení. Testovací kritéria, anti-patterny, jak nehodnotit „líbí/nelíbí".' },
      { n:'05', t:'Obhajoba',                  d:'Jak prezentovat koncept tak, aby prošel bez ředění. Argumentace, vizuální storytelling, práce s námitkami.' },
      { n:'06', t:'Praktická aplikace',        d:'Workshop na vlastní (nebo zadané) značce s feedbackem. Konkrétní výstup, který si můžeš odnést k použití.' },
    ],
  },
};

// Univerzální fallback
const WD_DEFAULT_CONTENT = {
  promise: 'Po kurzu budeš mít praktické znalosti, které můžeš hned aplikovat ve vlastní práci.',
  intro: 'Školení tě provede tématem od základů až k pokročilým konceptům. Bez zbytečné teorie, s konkrétními příklady a praktickými cvičeními, která si můžeš odnést a hned použít.\n\nProjdeme všechny klíčové oblasti, ukážeme si nejčastější chyby a jak se jim vyhnout. Získáš nejen know-how, ale i šablony a postupy, které v agentuře skutečně používáme.',
  audience: [
    { who:'Marketéři', need:'co chtějí svoji práci posunout o úroveň výš.' },
    { who:'Manažeři', need:'kteří potřebují rozumět tomu, co po týmu chtějí.' },
    { who:'Začátečníci', need:'co se chtějí dobře zorientovat v tématu.' },
    { who:'Zakladatelé', need:'co marketing zatím dělají sami a chtějí se v tématu zorientovat.' },
  ],
  modules: [],
};

const WD_TESTIMONIALS = [
  {
    name:'Marek Beneš',
    role:'CEO · Beneš & spol.',
    avatar:'./assets/team-misko.png',
    quote:'Konečně někdo, kdo to neřekne abstraktně, ale ukáže to na konkrétních příkladech. Tomáš má dar složitý problém vyložit tak, že to dává smysl. Po půl roce mi to pořád vrací investici a doporučuju každému, kdo to s marketingem myslí vážně.',
  },
  {
    name:'Klára Vítková',
    role:'Marketing manažerka · TRINITY',
    avatar:'./assets/team-sara.png',
    quote:'Šla jsem s konkrétními otázkami a odešla s plánem, jak je vyřešit. Tomáš nemluví jenom o teorii, ale ukáže ti rovnou, jak to v praxi nastavit. Tohle školení by mělo být povinné pro každého, kdo má pod sebou marketing.',
  },
  {
    name:'Petr Novotný',
    role:'CMO · BIDFOOD',
    avatar:'./assets/team-oto.png',
    quote:'Kurz mi nedal teorii — dal mi rámec, jak rozhodovat. To je 100× cennější. Hned po skončení jsem se vracel k záznamu a po týdnu jsme v týmu změnili tři zásadní procesy. Money well spent.',
  },
  {
    name:'Eva Kopecká',
    role:'Brand managerka · Notino',
    avatar:'./assets/team-misa.png',
    quote:'Měla jsem strach, že to bude moc obecné. Není. Tomáš se opravdu ptá, co konkrétně řešíš, a feedback na cvičení je věcný, ne diplomatický. To je v dnešní době velmi vzácné.',
  },
  {
    name:'Jakub Horák',
    role:'Founder · Roastery 22',
    avatar:'./assets/team-prokop.png',
    quote:'Jsem zakladatel, tedy marketéra hraju spíš ze zoufalství než z lásky. Tohle školení mi pomohlo přestat střílet naslepo. Teď mám systém, ve kterém se vyznám, a to za 12 měsíců spolupráce s agenturou nikdo neudělal.',
  },
  {
    name:'Alice Pokorná',
    role:'CEO · Studio Aniny',
    avatar:'./assets/team-sara.png',
    quote:'Pár dní po školení jsem si přečetla své staré marketingové dokumenty a začala je škrtat. To je pro mě ten největší přínos — že vidím, co je nedotažené, a vím, co s tím. Doporučuji všem zakladatelům.',
  },
];

// FAQ sjednocené se stránkou Kontakt — vyber odpovídá kurzu/webináři
const WD_FAQ = [
  {
    q:'Pro koho je tento kurz určen?',
    a:'Pro marketéry, manažery i začátečníky, kteří chtějí danému tématu lépe rozumět. Předpokládáme základní orientaci v marketingu, ne expertní znalosti. Pokud váháš, jestli je kurz pro tebe, napiš nám — rádi ti poradíme.',
  },
  {
    q:'Bude k dispozici záznam?',
    a:'Ano. Všichni účastníci dostávají záznam celého kurzu po dobu 12 měsíců — můžeš se k němu vracet, kdykoliv budeš potřebovat osvěžit znalosti nebo si pustit konkrétní pasáž.',
  },
  {
    q:'Mohu se zúčastnit, i když nestihnu živý termín?',
    a:'Ano, ale doporučujeme živou účast — můžeš se ptát, diskutovat s ostatními a získat zpětnou vazbu. Záznam funguje jako záloha pro ty, kdo nemohou stihnout konkrétní termín.',
  },
  {
    q:'Vystavujete fakturu na firmu?',
    a:'Samozřejmě. Po odeslání rezervace si v dalším kroku vyžádáme fakturační údaje a fakturu pošleme do druhého dne. Standardně se splatností 14 dní.',
  },
  {
    q:'Je možné dostat slevu pro tým?',
    a:'Ano — od 3 účastníků z jedné firmy nabízíme 15% slevu, od 5 účastníků 25%. Napiš nám na hello@justmighty.cz a dohodneme detail.',
  },
  {
    q:'Co když mi to po prvním modulu nesedne?',
    a:'Garantujeme vrácení peněz do 7 dní od prvního setkání, bez otázek. Pokud zjistíš, že kurz není pro tebe, peníze obratem vrátíme.',
  },
];

// ─── helpers ────────────────────────────────────
function wdFmtDate(d) {
  const days = ['ne','po','út','st','čt','pá','so'];
  const mons = ['ledna','února','března','dubna','května','června','července','srpna','září','října','listopadu','prosince'];
  return {
    wd: days[d.getDay()],
    day: d.getDate(),
    mon: mons[d.getMonth()],
    year: d.getFullYear(),
    hh: String(d.getHours()).padStart(2,'0'),
    mm: String(d.getMinutes()).padStart(2,'0'),
  };
}

// ─── HERO ────────────────────────────────────────
function WdHero({ w, content, onScrollToForm }) {
  const next = w.sessions[0];
  const f = next ? wdFmtDate(next.date) : null;
  return (
    <section className="wd-hero" data-screen-label="WD1 Hero">
      <div className="wd-hero__bg" aria-hidden="true">
        {w.image && <img src={w.image} alt="" />}
      </div>
      <div className="wd-hero__veil" aria-hidden="true" />

      <div className="shell wd-hero__shell">
        <div className="wd-hero__left" data-reveal>
          <div className="wd-hero__crumb">
            <a href="#knowhub" onClick={(e)=>{e.preventDefault(); window.__appNav && window.__appNav('knowhub');}}>Knowhub</a>
            <span>·</span>
            <span>Webináře a kurzy</span>
          </div>

          <span className={"wd-hero__org mono wd-hero__org--" + w.org.kind}>
            organizuje {w.org.full}
          </span>

          <h1 className="wd-hero__title">{w.title}</h1>
          <p className="wd-hero__promise">{content.promise}</p>

          <ul className="wd-hero__facts">
            <li><span className="mono">délka</span><strong>{w.duration}</strong></li>
            <li><span className="mono">formát</span><strong>{w.format}</strong></li>
            <li><span className="mono">úroveň</span><strong>{w.level}</strong></li>
            <li><span className="mono">cena</span><strong className="wd-hero__price">{w.price}</strong></li>
          </ul>

          <div className="wd-hero__cta">
            <button className="btn btn--coral" onClick={onScrollToForm}>
              Rezervovat místo<span className="arrow">↗</span>
            </button>
            {next && (
              <span className="wd-hero__next mono">
                nejbližší termín · <strong>{f.day}. {f.mon} {f.year}</strong> · {f.hh}:{f.mm}
              </span>
            )}
          </div>
        </div>

        <aside className="wd-hero__card" data-reveal style={{ "--reveal-delay":"180ms" }}>
          <span className="wd-hero__card-eyebrow mono">● {w.sessions.length} {w.sessions.length === 1 ? 'termín' : w.sessions.length < 5 ? 'termíny' : 'termínů'}</span>
          <ul className="wd-hero__card-list">
            {w.sessions.map((s, i) => {
              const sf = wdFmtDate(s.date);
              return (
                <li key={i}>
                  <span className="wd-hero__card-date">
                    <span className="wd-hero__card-day">{sf.day}</span>
                    <span className="wd-hero__card-mon mono">{sf.mon.slice(0,3)}</span>
                  </span>
                  <span className="wd-hero__card-info">
                    <span className="wd-hero__card-wd mono">{sf.wd} · {sf.hh}:{sf.mm}</span>
                    <span className="wd-hero__card-host">{s.host}</span>
                  </span>
                </li>
              );
            })}
          </ul>
          <button className="wd-hero__card-cta mono" onClick={onScrollToForm}>
            přihlásit se na termín ↓
          </button>
        </aside>
      </div>
    </section>
  );
}

// ─── PROOF STRIP ─────────────────────────────────
function WdProof() {
  return (
    <section className="wd-proof" data-screen-label="WD2 Proof">
      <div className="shell wd-proof__shell" data-reveal>
        <ul className="wd-proof__list">
          <li>
            <span className="wd-proof__big">300+</span>
            <span className="wd-proof__unit mono">účastníků</span>
            <span className="wd-proof__lbl">absolventů našich kurzů</span>
          </li>
          <li>
            <span className="wd-proof__big">4,9 / 5</span>
            <span className="wd-proof__unit mono">hodnocení</span>
            <span className="wd-proof__lbl">průměr z absolventů</span>
          </li>
          <li>
            <span className="wd-proof__big">92 %</span>
            <span className="wd-proof__unit mono">doporučí dál</span>
            <span className="wd-proof__lbl">kolegům nebo kamarádům</span>
          </li>
          <li>
            <span className="wd-proof__big">12</span>
            <span className="wd-proof__unit mono">let praxe</span>
            <span className="wd-proof__lbl">v marketingu a brandingu</span>
          </li>
        </ul>
      </div>
    </section>
  );
}

// ─── O KURZU + PRO KOHO (sloučené) ────────────────
function WdAbout({ content }) {
  const paragraphs = (content.intro || '').split('\n\n');
  return (
    <section className="wd-about" data-screen-label="WD3 O kurzu">
      <div className="shell wd-about__grid">
        <div className="wd-about__copy" data-reveal>
          <header className="wd-h">
            <span className="eyebrow wd-h__eyebrow">● O kurzu</span>
            <h2 className="wd-h__title">co tě <em>čeká</em>.</h2>
          </header>
          {paragraphs.map((p, i) => (
            <p key={i} className="wd-about__p">{p}</p>
          ))}
        </div>

        <aside className="wd-about__audience" data-reveal style={{ "--reveal-delay":"120ms" }}>
          <span className="mono wd-about__audience-h">● Je to pro tebe?</span>
          <ul>
            {content.audience.map((a, i) => (
              <li key={i}>
                <strong>{a.who}</strong>
                <span>{a.need}</span>
              </li>
            ))}
          </ul>
        </aside>
      </div>
    </section>
  );
}

// ─── PROGRAM (Co tě čeká + Co si odneseš sloučeno) ──
function WdProgram({ content }) {
  if (!content.modules || !content.modules.length) return null;
  const modules = content.modules.slice(0, 6);
  return (
    <section className="wd-program" data-screen-label="WD5 Program">
      <div className="shell">
        <header className="wd-h" data-reveal>
          <span className="eyebrow wd-h__eyebrow">● Program kurzu</span>
          <h2 className="wd-h__title">co se <em>naučíš</em>.</h2>
          <p className="wd-h__lede">{modules.length} modulů, které tě dovedou od základů až k praxi.</p>
        </header>
        <ol className="wd-program__list">
          {modules.map((m, i) => (
            <li key={i} className="wd-program__item" data-reveal style={{ "--reveal-delay":(i*40)+"ms" }}>
              <span className="wd-program__n mono">{m.n}</span>
              <div className="wd-program__body">
                <h3>{m.t}</h3>
                <p>{m.d}</p>
              </div>
            </li>
          ))}
        </ol>
      </div>
    </section>
  );
}

// ─── LEKTOR ──────────────────────────────────────
function WdLecturer({ w }) {
  const isUs = w.org.kind === 'us';
  return (
    <section className="wd-lecturer" data-screen-label="WD6 Lektor">
      <div className="shell wd-lecturer__grid">
        <div className="wd-lecturer__photo" data-reveal>
          <img src={isUs ? "./assets/tom-portrait.jpg" : "./assets/team-misa.png"} alt="" />
          <span className="wd-lecturer__badge mono">{isUs ? '12 let v oboru' : 'partner Justmighty'}</span>
        </div>
        <div className="wd-lecturer__body" data-reveal style={{ "--reveal-delay":"100ms" }}>
          <span className="eyebrow wd-h__eyebrow">● Tvůj lektor</span>
          <h2 className="wd-h__title wd-lecturer__title">
            {isUs ? <>Tomáš <em>Pohl</em></> : <>Tým <em>{w.org.full}</em></>}
          </h2>
          {isUs ? (
            <>
              <p className="wd-lecturer__lead">
                Tomáš Pohl je majitelem a zakladatelem kreativní agentury Justmighty. Tomáš je bývalým designérem a jeho agentura o 25 lidech má za sebou kampaně pro značky jako je Škoda Auto, Kofola, Notino, Nutrend, Gabriella Salvete a mnoho dalších.
              </p>
              <p className="wd-lecturer__lead">
                Pečují o firmy a jejich značky už více než 10 let a zaměřují se zejména na tvorbu strategií, branding, web, kampaně a obsahový i výkonnostní marketing. Tomáš je také autorem a moderátorem marketingového podcastu 69 dní po splatnosti.
              </p>
              <ul className="wd-lecturer__credits">
                <li><strong>500+</strong> projektů</li>
                <li><strong>25 lidí</strong> v agentuře</li>
                <li><strong>12 let</strong> v oboru</li>
                <li><strong>Podcast</strong> 69 dní po splatnosti</li>
              </ul>
            </>
          ) : (
            <>
              <p className="wd-lecturer__lead">
                Kurz vede partnerský tým {w.org.full}. Justmighty zajišťuje organizaci, registraci a kvalitu obsahu.
              </p>
              <ul className="wd-lecturer__credits">
                <li><strong>Partner</strong> Justmighty</li>
                <li><strong>Roky zkušeností</strong> v oboru</li>
                <li><strong>Stovky absolventů</strong> kurzů</li>
              </ul>
            </>
          )}
        </div>
      </div>
    </section>
  );
}

// ─── TESTIMONIALY ────────────────────────────────
function WdQuotes() {
  return (
    <section className="wd-quotes" data-screen-label="WD7 Reference">
      <div className="shell">
        <header className="wd-h" data-reveal>
          <span className="eyebrow wd-h__eyebrow">● Co říkají absolventi</span>
          <h2 className="wd-h__title">tohle nám <em>pošlou</em>.</h2>
        </header>
        <div className="wd-quotes__grid">
          {WD_TESTIMONIALS.map((t, i) => (
            <figure key={i} className="wd-quote" data-reveal style={{ "--reveal-delay":(i*80)+"ms" }}>
              <span className="wd-quote__mark" aria-hidden="true">"</span>
              <blockquote>{t.quote}</blockquote>
              <figcaption className="wd-quote__foot">
                <span className="wd-quote__avatar"><img src={t.avatar} alt="" loading="lazy" /></span>
                <span className="wd-quote__who">
                  <strong>{t.name}</strong>
                  <span>{t.role}</span>
                </span>
              </figcaption>
            </figure>
          ))}
        </div>
      </div>
    </section>
  );
}

// ─── FAQ (sjednocené se stránkou Kontakt — kfaq) ──
function WdFaq() {
  const [open, setOpen] = useStateWD(null);
  const half = Math.ceil(WD_FAQ.length / 2);
  const cols = [WD_FAQ.slice(0, half), WD_FAQ.slice(half)];
  return (
    <section className="kfaq" data-screen-label="WD8 FAQ">
      <div className="shell" style={{ padding: '120px 36px' }}>
        <div className="kfaq__head">
          <div>
            <span className="eyebrow eyebrow--dark" data-reveal>● FAQ</span>
            <h2 className="kfaq__title h-2" data-reveal style={{ marginTop: 16 }}>
              časté <em>otázky</em>
            </h2>
          </div>
          <p className="kfaq__lede" data-reveal>
            Odpovědi na otázky, které dostáváme nejčastěji k registraci na kurz. Pokud tu tu svoji nenajdeš, napiš — odpovíme rádi.
          </p>
        </div>

        <div className="kfaq__grid">
          {cols.map((col, ci) => (
            <ul key={ci} className="kfaq__col">
              {col.map((item, i) => {
                const idx = ci * half + i;
                const isOpen = open === idx;
                return (
                  <li key={idx} className={"kfaq__card " + (isOpen ? 'is-open' : '')}>
                    <button type="button" className="kfaq__btn" onClick={() => setOpen(isOpen ? null : idx)} aria-expanded={isOpen}>
                      <span className="kfaq__num mono">{String(idx + 1).padStart(2, '0')}</span>
                      <span className="kfaq__q">{item.q}</span>
                      <span className="kfaq__plus" aria-hidden="true">
                        <span className="kfaq__plus-h" />
                        <span className="kfaq__plus-v" />
                      </span>
                    </button>
                    <div className="kfaq__a-wrap">
                      <div className="kfaq__a-inner">
                        <p>{item.a}</p>
                      </div>
                    </div>
                  </li>
                );
              })}
            </ul>
          ))}
        </div>
      </div>
    </section>
  );
}

// ─── REGISTRAČNÍ FORMULÁŘ ────────────────────────
function WdForm({ w, formRef }) {
  const [selected, setSelected] = useStateWD(0);
  const [submitted, setSubmitted] = useStateWD(false);
  const handleSubmit = (e) => {
    e.preventDefault();
    setSubmitted(true);
  };

  return (
    <section className="wd-form" ref={formRef} id="wd-form" data-screen-label="WD9 Formular">
      <div className="shell wd-form__grid">
        <div className="wd-form__left" data-reveal>
          <span className="eyebrow wd-h__eyebrow">● Registrace</span>
          <h2 className="wd-h__title">vyber <em>termín</em> a&nbsp;přihlas se.</h2>
          <p className="wd-form__lede">
            Po odeslání ti pošleme potvrzení e-mailem do 10 minut. Místo je rezervované, jakmile máme údaje. Platbu doladíme spolu.
          </p>
          <ul className="wd-form__perks">
            <li>✓ záznam celého kurzu na 12 měsíců</li>
            <li>✓ materiály a šablony ke stažení</li>
            <li>✓ certifikát o absolvování</li>
            <li>✓ 7denní záruka vrácení peněz</li>
            <li>✓ Q&amp;A s lektorem během kurzu</li>
            <li>✓ sleva 15 % od 3 osob z firmy</li>
          </ul>
        </div>

        <form className="wd-form__form" onSubmit={handleSubmit} data-reveal style={{ "--reveal-delay":"120ms" }}>
          {submitted ? (
            <div className="wd-form__success">
              <span className="wd-form__success-icon" aria-hidden="true">✓</span>
              <h3>Děkujeme!</h3>
              <p>Tvoji rezervaci jsme přijali. Do 10 minut ti přijde e-mail s potvrzením a platebními údaji.</p>
            </div>
          ) : (
            <>
              <fieldset className="wd-form__fs">
                <legend className="mono">● vyber termín</legend>
                <div className="wd-form__sessions">
                  {w.sessions.map((s, i) => {
                    const sf = wdFmtDate(s.date);
                    return (
                      <label key={i} className={"wd-form__session " + (selected===i ? 'is-on' : '')}>
                        <input
                          type="radio"
                          name="session"
                          checked={selected===i}
                          onChange={()=>setSelected(i)}
                        />
                        <span className="wd-form__session-date">
                          <span className="wd-form__session-day">{sf.day}</span>
                          <span className="wd-form__session-mon mono">{sf.mon.slice(0,3)}</span>
                        </span>
                        <span className="wd-form__session-info">
                          <span className="wd-form__session-wd mono">{sf.wd} · {sf.hh}:{sf.mm} · {sf.year}</span>
                          <span className="wd-form__session-host">{s.host}</span>
                        </span>
                        <span className="wd-form__session-pin" aria-hidden="true" />
                      </label>
                    );
                  })}
                </div>
              </fieldset>

              <fieldset className="wd-form__fs">
                <legend className="mono">● tvoje údaje</legend>
                <div className="wd-form__row">
                  <label className="wd-form__field">
                    <span>Jméno a příjmení *</span>
                    <input type="text" required placeholder="Jan Novák" />
                  </label>
                  <label className="wd-form__field">
                    <span>E-mail *</span>
                    <input type="email" required placeholder="jan@firma.cz" />
                  </label>
                </div>
                <div className="wd-form__row">
                  <label className="wd-form__field">
                    <span>Telefon</span>
                    <input type="tel" placeholder="+420 …" />
                  </label>
                  <label className="wd-form__field">
                    <span>Firma / pozice</span>
                    <input type="text" placeholder="Acme · marketing manager" />
                  </label>
                </div>
              </fieldset>

              <label className="wd-form__check">
                <input type="checkbox" required />
                <span>Souhlasím se <a href="#">zpracováním osobních údajů</a> a <a href="#">obchodními podmínkami</a>.</span>
              </label>

              <div className="wd-form__submit">
                <button type="submit" className="btn btn--coral">
                  Odeslat rezervaci<span className="arrow">↗</span>
                </button>
                <span className="wd-form__total mono">
                  Cena: <strong>{w.price}</strong> · {w.format}
                </span>
              </div>
            </>
          )}
        </form>
      </div>
    </section>
  );
}

// ─── STICKY BAR ─────────────────────────────────
function WdStickyBar({ w, onScrollToForm }) {
  const [show, setShow] = useStateWD(false);
  useEffectWD(() => {
    const onScroll = () => setShow(window.scrollY > 600);
    window.addEventListener('scroll', onScroll, { passive: true });
    return () => window.removeEventListener('scroll', onScroll);
  }, []);
  return (
    <div className={"wd-sticky " + (show ? 'is-show' : '')} aria-hidden={!show}>
      <div className="wd-sticky__inner">
        <div className="wd-sticky__info">
          <span className="wd-sticky__title">{w.title}</span>
          <span className="wd-sticky__meta mono">{w.duration} · {w.format} · {w.price}</span>
        </div>
        <button className="btn btn--coral" onClick={onScrollToForm}>
          Rezervovat<span className="arrow">↗</span>
        </button>
      </div>
    </div>
  );
}

// ─── HLAVNÍ STRÁNKA ─────────────────────────────
function WebinarDetailPage({ page, onNav }) {
  useReveal();
  const id = (page || '').replace(/^kh-webinar-/, '').replace(/^webinar-/, '');
  const w = (window.KH_WEBINARS || []).find(x => x.id === id);
  const formRef = useRefWD(null);

  if (!w) {
    return (
      <>
        <section className="page-hero">
          <div className="shell" style={{padding:'160px 36px'}}>
            <span className="mono" style={{color:'var(--coral)',fontSize:12,letterSpacing:'.18em'}}>● 404</span>
            <h1 style={{marginTop:24}}>Kurz nenalezen<span style={{color:'var(--coral)'}}>.</span></h1>
            <p style={{maxWidth:'52ch',color:'#bdbdbd',marginTop:24,fontSize:18}}>
              Zkus se vrátit na <a href="#knowhub" onClick={(e)=>{e.preventDefault();onNav('knowhub');}} style={{color:'var(--coral)'}}>Knowhub</a> a vybrat jiný kurz.
            </p>
          </div>
        </section>
        <Footer />
      </>
    );
  }

  const content = Object.assign({}, WD_DEFAULT_CONTENT, WD_CONTENT[id] || {});

  const scrollToForm = () => {
    if (formRef.current) {
      formRef.current.scrollIntoView({ behavior: 'smooth', block: 'start' });
    }
  };

  return (
    <>
      <WdHero w={w} content={content} onScrollToForm={scrollToForm} />
      <WdProof />
      <WdAbout content={content} />
      <WdProgram content={content} />
      <WdLecturer w={w} />
      <WdQuotes />
      <WdFaq />
      <WdForm w={w} formRef={formRef} />
      {window.Crossroads && <window.Crossroads onNav={onNav} />}
      <WdStickyBar w={w} onScrollToForm={scrollToForm} />
      <Footer />
    </>
  );
}

window.WebinarDetailPage = WebinarDetailPage;
