/* global React */
const EC = {
  bg: 'rgb(6,11,24)',
  bgDeep: 'rgb(21,19,49)',
  gold: '#E6C79C',
  lavender: 'rgb(186,171,212)',
  muted: 'rgb(78,70,114)',
  white: 'rgb(255,255,255)',
  violet: 'rgba(59,39,172,0.5)'
};

const EXP_LIST = [
{
  name: 'Konstancja Zahmala Lumia',
  slug: 'konstancjazahmalalumia',
  role: 'Tarocistka | Odczyty Energetyczne | Radiestetka',
  photo: 'assets/eksperci/konstancja.png',
  objectPos: 'center 15%',
  bio: 'Urodzona pod mistrzowską energią, od zawsze czułam i widziałam więcej niż inni. Pracuję z tarotem jako narzędziem rozmowy - nie z przyszłością, ale z tym, co już w Tobie jest. Z tym, co czujesz, ale czego jeszcze nie nazwałeś. Swoją pracę rozszerzam o analizę energetyczną, w której poprzez wgląd w wewnętrzne mechanizmy, emocje i pole energetyczne pokazuję to, co niewidoczne na pierwszy rzut oka, a co realnie wpływa na Twoje życie. Łączę intuicję z precyzyjnym odczytem energii, aby uchwycić głębsze warstwy tego, co dzieje się w Tobie i nazwać to, co do tej pory było trudne do uchwycenia.',
  specTitle: 'Tarot — rozmowa z intuicją',
  specBody: 'Tarot to nie jest przewidywanie przyszłości. To spotkanie z tym, co już w Tobie jest — tylko jeszcze nienazwane. Karty działają jak lustro. Pokazują to, co czujesz, ale czego czasem nie potrafisz uchwycić albo dopuścić do głosu. To przestrzeń, w której możesz zatrzymać się na chwilę i spojrzeć na swoją sytuację z innej perspektywy. Bez ocen. Bez presji. Z uważnością.',
  services: [
  { tag: 'TAROT', title: 'Lunarny Portret Duszy', subtitle: 'Zobacz to, co niewidoczne', body: 'Pogłębiony odczyt łączący tarot z analizą energetyczną — wgląd w wewnętrzne mechanizmy, emocje i pole energetyczne. Pokazuję to, co realnie wpływa na Twoje życie, choć trudne do uchwycenia na pierwszy rzut oka.', icon: '✦' },
  { tag: 'ENERGIA', title: 'Odczyt\nEnergetyczny', subtitle: 'Zajrzyj w to, co Cię prowadzi', body: 'Bezpośredni odczyt Twojego pola energetycznego — sygnały, blokady i zasoby, które realnie wpływają na to, jak żyjesz i decydujesz. Punktowe spojrzenie tu i teraz.', icon: '☉' },
  { tag: 'TAROT', title: 'Stawianie Tarota', subtitle: 'Przyjrzyj się temu, co domaga się uwagi', body: 'Tarot pozwala skupić się na konkretnym pytaniu lub obszarze życia i zobaczyć go w bardziej uporządkowany sposób.', icon: '⚁' }],

  flipped: false
},
{
  name: 'Tomasz Buniek',
  slug: 'tomaszbuniek',
  role: 'Numerolog | Runista',
  photo: 'assets/eksperci/tomaszbuniek.png',
  objectPos: 'center 20%',
  bio: 'Specjalizuje się w autorskich portretach numerologicznych, numerologii biznesu i imionach wzmacniających oraz w pracy indywidualnej gdzie poprzez analizę liczb odkrywa potencjał, blokady, oraz powtarzające się wzorce. Utalentowany i posiadający ogromną wiedzę runista, na co dzień pracujący z runami, bindrunami i energiami symboli.',
  specTitle: 'Numerologia — wiedza o nas samych wyczytana z liczb',
  specBody: 'Liczby to ustawienia, z którymi przychodzimy na świat. To wzorce, które wpływają na nasze decyzje, relacje i kierunek życia.',
  spec2Title: 'Runy — alfabet Twoich intencji',
  spec2Body: 'Runy to znaki składowe starszego Futhark czyli alfabetu historycznych ludów nordyckich. Słowo Runa oznacza dosłownie — tajemnice. Od setek a nawet tysięcy lat wykorzystywano je nie tylko do pisania lecz głównie do działań ezoterycznych czyli dywinacji (wróżenia).',
  services: [
  { tag: 'NUMEROLOGIA', title: 'Portret\nNumerologiczny', subtitle: 'Twoja historia zapisana w liczbach', body: 'Pogłębiona analiza oparta na dacie urodzenia oraz wszystkich imionach i nazwiskach.', icon: '☉' },
  { tag: 'NUMEROLOGIA', title: 'Nadawanie Imion\nWzmacniających', subtitle: 'Imię, które wzmacnia', body: 'Dobór imienia lub pseudonimu, które wspiera Twoje naturalne talenty i intencje.', icon: '✦' },
  { tag: 'NUMEROLOGIA', title: 'Biznesowa Konsultacja\nNumerologiczna', subtitle: 'Liczby pracujące dla firmy', body: 'Analiza wibracji firm, nazw i dat kluczowych wydarzeń — wsparcie strategiczne.', icon: '☽' },
  { tag: 'RUNY', title: 'Tworzenie\nBindrun', subtitle: 'Symbole intencji', body: 'Indywidualnie projektowane bindruny — splecione runy wzmacniające konkretne intencje.', icon: 'ᚠ' }],

  flipped: false
},
{
  name: 'Olga Konieczna',
  slug: 'olgakonieczna',
  role: 'Astrolog | Kosmogramy | Astrokartografia',
  photo: 'assets/eksperci/annakonieczna.png',
  objectPos: 'center 20%',
  bio: 'Olga od lat zgłębia astrologię jako narzędzie do głębokiego rozumienia człowieka i jego życiowej drogi. W swojej pracy łączy intuicję z konkretem. Potrafi przełożyć złożone układy planetarne na jasne, zrozumiałe wskazówki, które mają realne zastosowanie w codziennym życiu.',
  specTitle: 'Astrologia — coś więcej niż horoskop',
  specBody: 'Astrologia to głęboka analiza energii, z którą przychodzisz na świat. Układ planet w chwili narodzin tworzy unikalny kod, który wpływa na Twoją osobowość, emocje, relacje oraz sposób, w jaki doświadczasz życia. Kosmogram pozwala spojrzeć na siebie z szerszej perspektywy i lepiej zrozumieć swoje naturalne predyspozycje, wyzwania oraz kierunek rozwoju. To połączenie intuicji i konkretu — wiedzy, która pomaga zrozumieć siebie, zamiast działać wbrew własnej naturze.',
  services: [
  { tag: 'ASTROLOGIA', title: 'Kosmogram', subtitle: 'Mapa Twojego potencjału', body: 'Czytanie kosmogramu — Słońce, Księżyc, planety i domy. Zrozumienie wrodzonych predyspozycji i napięć.', icon: '♄' },
  { tag: 'ASTROLOGIA', title: 'Astrokartografia', subtitle: 'Miejsca mocy', body: 'Poznaj miejsca na mapie, które wspierają konkretne obszary Twojego życia — karierę, miłość, wzrost.', icon: '♅' }],

  flipped: false
},
{
  name: 'Karolina Mardoll Kułakowska',
  slug: 'karolinamardoll',
  role: 'Analityk Duszy',
  photo: 'assets/eksperci/karolinamardoll.png',
  objectPos: 'center 15%',
  bio: 'Od lat pasjonuję się ezoteryką, a szczególne miejsce w mojej duchowości zajmują nordyccy bogowie - Freja i Frejr. Jestem wiedźmą nordycką, starą duszą, autorką czterech książek oraz kilkudziesięciu obrazów.',
  specTitle: 'Analiza Duszy — spojrzenie z innej perspektywy',
  specBody: 'W swojej pracy łączę wiedzę z zakresu duchowości i tradycji nordyckich, tworząc autorskie podejście oparte na intuicji, wrażliwości oraz głębokim rozumieniu ludzkiej natury. Pomagam spojrzeć na życie z innej perspektywy, odnaleźć sens w trudnych doświadczeniach i odkryć własny potencjał. Moje analizy nie są jedynie interpretacją znaków, to przede wszystkim narzędzie do lepszego poznania siebie oraz świadomego kierowania swoim życiem.',
  services: [
  { tag: 'ENERGIA', title: 'Analiza\nDuszy', subtitle: 'Spojrzenie z innej perspektywy', body: 'Autorskie podejście łączące tradycję nordycką, intuicję i wrażliwość — narzędzie do głębszego poznania siebie i świadomego kierowania życiem.', icon: '☽' },
  { tag: 'TAROT', title: 'Karty\nwyroczni', subtitle: 'Symbole, które mówią więcej', body: 'Praca z kartami wyroczni jako dopełnienie tarota — łagodniejszy język symboli prowadzący do wglądu w obecny moment.', icon: '✦' }],

  flipped: false
},
{
  name: 'Karol Majewski',
  slug: 'karolmajewski',
  role: 'Chiromanta',
  photo: 'assets/eksperci/karolmajewski.png',
  objectPos: 'center 15%',
  bio: 'Karol pomaga zobaczyć siebie wyraźniej. Łączy precyzyjną wiedzę chirologiczną z intuicją — pokazuje to, co często pozostaje niewidoczne: Twoją siłę, blokady, relacje oraz ścieżki rozwoju. Praca z dłonią to dla niego rozmowa, nie wyrocznia.',
  specTitle: 'Chirologia to nie magia — to czysta wiedza',
  specBody: 'Odkrywam Twój potencjał i możliwe zagrożenia, tworząc szczegółową analizę Twojej dłoni. Każda dłoń jest unikalną mapą doświadczeń, talentów i możliwości. Moim celem jest pokazanie Ci tego, co często pozostaje niewidoczne — Twojej siły, blokad, relacji oraz ścieżki rozwoju.',
  services: [
  { tag: 'CHIROLOGIA', title: 'Analiza\nDłoni', subtitle: 'Mapa Twoich predyspozycji', body: 'Pełny odczyt linii, wzgórz i kształtu dłoni — szczegółowa analiza pokazująca potencjał, blokady, relacje i ścieżki rozwoju.', icon: '✋' }],

  flipped: false
}];


// ─ HERO ─
function ExpertsHero() {
  return (
    <section style={{
      position: 'relative', height: 559, paddingTop: 84,
      display: 'flex', alignItems: 'flex-end', justifyContent: 'center',
      overflow: 'hidden'
    }}>
      <div style={{
        position: 'absolute', inset: 0,
        backgroundImage: `url(assets/hero-bg.png)`,
        backgroundSize: 'cover', backgroundPosition: 'center'
      }} />
      <div style={{
        position: 'absolute', inset: 0,
        background: `linear-gradient(${EC.bg} 0%, rgba(6,11,24,0) 18%, rgba(6,11,24,0) 82%, ${EC.bg} 100%)`
      }} />
      <div style={{
        position: 'relative', zIndex: 2, maxWidth: 1100,
        display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 28,
        padding: '0 40px 64px', textAlign: 'center'
      }}>
        <span style={{
          fontFamily: 'Nunito', fontWeight: 700, fontSize: 14,
          letterSpacing: '0.3em', color: EC.gold
        }}>NASI EKSPERCI</span>
        <h1 style={{
          margin: 0, fontFamily: 'Playfair Display', fontWeight: 400, fontSize: 64,
          lineHeight: 1.15, letterSpacing: '-0.022em', color: EC.white
        }}>Ludzie, którzy prowadzą<br />Cię przez proces</h1>
        <p style={{
          margin: 0, maxWidth: 820,
          fontFamily: 'Nunito', fontSize: 18, lineHeight: 1.6, color: EC.lavender
        }}>Każdy z naszych ekspertów wnosi własne doświadczenie i metodę pracy, ale łączy nas wspólny sposób myślenia: rzetelność, spokój i odpowiedzialność.</p>
      </div>
    </section>);

}

// ─ WSTĘP (single centered line) ─
function ExpertsIntro() {
  return (
    <section style={{
      position: 'relative', background: EC.bg,
      borderTop: `1px solid ${EC.muted}`, borderBottom: `1px solid ${EC.muted}`,
      padding: '80px 24px'
    }}>
      <div style={{ maxWidth: 1156, margin: '0 auto', textAlign: 'center' }}>
        <div style={{
          fontFamily: 'Nunito', fontWeight: 700, fontSize: 14,
          letterSpacing: '0.2em', color: EC.muted, marginBottom: 20
        }}>LUDZIE ZA LUNA PERSONA</div>
        <h2 style={{
          margin: 0, fontFamily: 'Playfair Display', fontWeight: 400, fontSize: 40,
          lineHeight: 1.3, letterSpacing: '-0.022em', color: EC.white,
          fontStyle: 'italic'
        }}>Pracujemy z tym, co <em style={{ color: EC.white }}>nienazwane</em> — z uważnością, spokojem i odpowiedzialnością.</h2>
      </div>
    </section>);

}

// ─ EXPERT BLOCK ─
function ExpertBlock({ exp }) {
  const [ebVw, setEbVw] = React.useState(() => typeof window !== 'undefined' ? window.innerWidth : 1440);
  React.useEffect(() => {
    const onR = () => setEbVw(window.innerWidth);
    window.addEventListener('resize', onR);
    return () => window.removeEventListener('resize', onR);
  }, []);
  const ebMobile = ebVw <= 900;
  const PH = ebMobile ? Math.min(ebVw - 80, 300) : 537;
  const photoNode =
  <div style={{
    width: '100%', maxWidth: ebMobile ? PH : '100%', margin: ebMobile ? '0 auto' : undefined,
    height: PH, borderRadius: 16,
    background: '#151331', position: 'relative', overflow: 'visible'
  }}>
      <img src={exp.photo} alt={exp.name}
    style={{
      position: 'absolute',
      left: '50%',
      transform: 'translateX(-50%)',
      bottom: 0,
      height: PH + (ebMobile ? 44 : 80),
      width: 'auto',
      objectFit: 'contain',
      pointerEvents: 'none'
    }} />
    </div>;


  const textNode =
  <div style={{ display: 'flex', flexDirection: 'column', gap: 20, justifyContent: 'center' }}>
      <h2 style={{
      margin: 0, fontFamily: 'Playfair Display', fontWeight: 400, fontSize: 40,
      lineHeight: 1.2, letterSpacing: '-0.022em', color: EC.white
    }}>{exp.name}</h2>
      <div style={{
      fontFamily: 'Playfair Display',
      letterSpacing: '-0.022em', color: EC.gold, fontSize: "24px"
    }}>{exp.role}</div>
      <p style={{
      margin: 0, fontFamily: 'Nunito', fontSize: 16, lineHeight: 1.6, color: EC.lavender
    }}>{exp.bio}</p>
      <div style={{ marginTop: 8, display: 'flex', flexDirection: 'column', gap: 8 }}>
        <h3 style={{
        margin: 0, fontFamily: 'Nunito', fontSize: 20, color: EC.white, fontWeight: "400"
      }}>{exp.specTitle}</h3>
        <p style={{
        margin: 0, fontFamily: 'Nunito', fontSize: 15, lineHeight: 1.6, color: EC.lavender
      }}>{exp.specBody}</p>
      </div>
      {exp.spec2Title &&
      <div style={{ marginTop: 8, display: 'flex', flexDirection: 'column', gap: 8 }}>
        <h3 style={{
        margin: 0, fontFamily: 'Nunito', fontSize: 20, color: EC.white, fontWeight: "400"
      }}>{exp.spec2Title}</h3>
        <p style={{
        margin: 0, fontFamily: 'Nunito', fontSize: 15, lineHeight: 1.6, color: EC.lavender
      }}>{exp.spec2Body}</p>
      </div>}
    </div>;


  return (
    <section style={{ background: EC.bg, padding: '180px 24px 40px' }}>
      <div style={{
        maxWidth: 1312, margin: '0 auto', padding: '0 40px',
        display: 'grid',
        gridTemplateColumns: ebMobile ? '1fr' : (exp.flipped ? '1fr 478px' : '478px 1fr'),
        gap: ebMobile ? 24 : 64, alignItems: 'center'
      }}>
        {ebMobile ? photoNode : (exp.flipped ? textNode : photoNode)}
        {ebMobile ? textNode : (exp.flipped ? photoNode : textNode)}
      </div>

      {/* Co przygotuję */}
      <ExpServicesGrid services={exp.services} expertName={exp.name} />
    </section>);

}

function ExpServicesGrid({ services, expertName }) {
  const trackRef = React.useRef(null);
  const [vw, setVw] = React.useState(() => typeof window !== 'undefined' ? window.innerWidth : 1440);
  React.useEffect(() => {
    const onR = () => setVw(window.innerWidth);
    window.addEventListener('resize', onR);
    return () => window.removeEventListener('resize', onR);
  }, []);
  const isMobile = vw <= 900;
  const GAP = isMobile ? 16 : 24;
  // Mobile: 1 card visible, fills viewport; desktop: 3 cards across the 1232 content width.
  const VISIBLE = isMobile ? 1 : 3;
  const CARD_W = isMobile ? Math.min(vw - 64, 360) : (1232 - GAP * 2) / 3;
  const slider = isMobile ? services.length > 1 : services.length > 3;
  const [idx, setIdx] = React.useState(0);
  const maxIdx = Math.max(0, services.length - VISIBLE);
  React.useEffect(() => { setIdx((i) => Math.min(i, maxIdx)); }, [maxIdx]);
  const offset = -idx * (CARD_W + GAP);
  return (
    <div style={{ maxWidth: 1312, margin: '48px auto 0', padding: '40px' }}>
      <h3 style={{
        margin: '0 0 48px', fontFamily: 'Playfair Display', fontWeight: 400, fontSize: 32,
        letterSpacing: '-0.022em', color: EC.white
      }}>Co dla Ciebie przygotuję?</h3>
      {slider ?
      <>
        <div style={{ overflow: 'hidden' }}>
          <div ref={trackRef} style={{
            display: 'flex', gap: GAP,
            transform: `translateX(${offset}px)`,
            transition: 'transform 550ms cubic-bezier(0.22,1,0.36,1)'
          }}>
            {services.map((s, i) =>
            <div key={i} style={{ width: CARD_W, flex: '0 0 auto' }}>
              <ServiceCard item={{ ...s, expert: expertName }} cardWidth="100%" compact />
            </div>
            )}
          </div>
        </div>
        <div style={{ display: 'flex', justifyContent: 'center', gap: 16, marginTop: 32 }}>
          <RoundArrow dir="left" disabled={idx === 0} onClick={() => setIdx(Math.max(0, idx - 1))} />
          <RoundArrow dir="right" disabled={idx >= maxIdx} onClick={() => setIdx(Math.min(maxIdx, idx + 1))} />
        </div>
      </> :
      <div style={{
        display: 'grid',
        gridTemplateColumns: `repeat(${Math.max(services.length, isMobile ? 1 : 3)}, 1fr)`,
        gap: GAP
      }}>
        {services.map((s, i) =>
        <ServiceCard key={i} item={{ ...s, expert: expertName }} cardWidth="100%" compact />
        )}
      </div>
      }
    </div>);

}

function Experts({ name }) {
  useExpertsTick(); // re-render once the DB load resolves
  const e = (name && EXP_LIST.find((x) => x.name === name)) || EXP_LIST[0];
  if (!e) return null;
  return (
    <ExpertBlock exp={e} />);

}

// ─ POZOSTALI EKSPERCI (carousel — same design language as home) ─
const OTHER_EXPERTS_LIST = [
{
  name: 'Konstancja Zahmala Lumia',
  slug: 'konstancjazahmalalumia',
  role: 'Tarocistka | Odczyty Energetyczne | Radiestetka',
  img: 'assets/konstancja.png',
  bio: 'Pracuję z tarotem jako narzędziem rozmowy — nie z przyszłością, ale z tym, co już w Tobie jest.'
},
{
  name: 'Tomasz Buniek',
  slug: 'tomaszbuniek',
  role: 'Numerolog | Runista',
  img: 'assets/eksperci/tomaszbuniek.png',
  bio: 'Pomaga odkrywać potencjał, przełamywać blokady i zrozumieć wzorce poprzez numerologię. Specjalizuje się w pracy z runami i energią symboli, pomaga odkrywać ukryte wzorce, wzmacniać intencję oraz lepiej zrozumieć własną drogę.'
},
{
  name: 'Olga Konieczna',
  slug: 'olgakonieczna',
  role: 'Astrolog | Kosmogramy | Astrokartografia',
  img: 'assets/eksperci/annakonieczna.png',
  bio: 'Łączę intuicję z konkretem — tłumaczę złożone układy planetarne na jasne wskazówki, które realnie pomagają w codziennych decyzjach. Astrologia jest dla mnie językiem czasu i drogi.'
},
{
  name: 'Karolina Mardoll Kułakowska',
  slug: 'karolinamardoll',
  role: 'Analityk Duszy',
  img: 'assets/eksperci/karolinamardoll.png',
  bio: 'Wiedźma nordycka, autorka czterech książek. Łączę duchowość i tradycje nordyckie — pomagam spojrzeć na życie z innej perspektywy i odnaleźć sens w trudnych doświadczeniach.'
},
{
  name: 'Karol Majewski',
  slug: 'karolmajewski',
  role: 'Chiromanta',
  img: 'assets/eksperci/karolmajewski.png',
  bio: 'Odkrywam Twój potencjał i możliwe zagrożenia, tworząc szczegółową analizę Twojej dłoni. Każda dłoń to unikalna mapa doświadczeń, talentów i możliwości.'
}];


function OtherExpertCard({ e, scale, animate = true, width }) {
  const W = width || 1000;
  const isMobile = W < 700;
  const H = isMobile ? 620 : 420;
  const PAD = isMobile ? 20 : 36;
  const SQ = isMobile ? Math.min(W - PAD * 2, 220) : H - PAD * 2;
  return (
    <div style={{
      width: W, minWidth: W, height: H,
      transform: `scale(${scale})`,
      transformOrigin: 'center center',
      transition: animate ? 'transform 550ms cubic-bezier(0.22, 1, 0.36, 1), opacity 550ms' : 'none',
      opacity: scale > 0.9 ? 1 : 0.55,
      display: 'flex', alignItems: 'center', justifyContent: 'center',
      flex: '0 0 auto'
    }}>
      <div style={{
        width: W, height: H,
        borderRadius: 16, border: `1px solid ${EC.muted}`,
        background: '#060B18',
        position: 'relative',
        padding: PAD,
        display: isMobile ? 'flex' : 'grid',
        flexDirection: isMobile ? 'column' : undefined,
        gridTemplateColumns: isMobile ? undefined : `${SQ}px 1fr`,
        columnGap: 36, rowGap: isMobile ? 16 : undefined,
        alignItems: 'center',
        boxSizing: 'border-box'
      }}>
        <div style={{ position: 'relative', width: SQ, height: SQ, flexShrink: 0 }}>
          <div style={{ position: 'absolute', inset: 0, borderRadius: 12, background: '#151331' }} />
          <img src={e.img || 'assets/expert.png'} alt={e.name}
            style={{
              position: 'absolute', left: '50%', transform: 'translateX(-50%)',
              bottom: 0, height: SQ + (isMobile ? 44 : 56), width: 'auto',
              objectFit: 'contain', pointerEvents: 'none'
            }} />
        </div>
        <div style={{
          display: 'flex', flexDirection: 'column', gap: 16,
          paddingRight: isMobile ? 0 : 8,
          alignItems: isMobile ? 'center' : 'stretch',
          textAlign: isMobile ? 'center' : 'left'
        }}>
          <h3 style={{
            margin: 0, fontFamily: 'Playfair Display', fontWeight: 400,
            letterSpacing: '-0.022em', color: EC.white, lineHeight: 1.1, fontSize: isMobile ? 30 : 40
          }}>{e.name}</h3>
          <div style={{
            fontWeight: 400, color: EC.gold, letterSpacing: '0.01em',
            marginTop: -6, fontFamily: '"Playfair Display"', fontSize: isMobile ? 20 : 24
          }}>{e.role}</div>
          <p style={{
            margin: 0, fontFamily: 'Nunito', lineHeight: 1.7,
            color: EC.lavender, maxWidth: 460, fontSize: 16
          }}>{e.bio}</p>
          <div style={{ marginTop: 8 }}>
            <BtnSecond small href={(e.slug ? e.slug + '.html' : expertHref(e.name))}>Poznaj eksperta</BtnSecond>
          </div>
        </div>
      </div>
    </div>);

}

function OtherExperts({ currentName }) {
  useExpertsTick(); // re-render once the DB load resolves
  const list = OTHER_EXPERTS_LIST.filter((x) => x.name !== currentName);
  const [vw, setVw] = React.useState(() => typeof window !== 'undefined' ? window.innerWidth : 1440);
  React.useEffect(() => {
    const onR = () => setVw(window.innerWidth);
    window.addEventListener('resize', onR);
    return () => window.removeEventListener('resize', onR);
  }, []);
  const isMobile = vw <= 900;
  const CARD_W = isMobile ? Math.min(vw - 24, 360) : 1000;
  const GAP = isMobile ? 12 : 48;
  const STEP = CARD_W + GAP;
  const n = list.length;
  const triple = [...list, ...list, ...list];
  const [index, setIndex] = React.useState(n);
  const [animate, setAnimate] = React.useState(true);
  const [dragX, setDragX] = React.useState(0);
  const dragRef = React.useRef({ active: false, startX: 0, moved: false });

  const handleTransitionEnd = () => {
    if (index >= 2 * n) { setAnimate(false); setIndex(index - n); }
    else if (index < n) { setAnimate(false); setIndex(index + n); }
  };

  React.useEffect(() => {
    if (!animate) {
      const id = requestAnimationFrame(() => setAnimate(true));
      return () => cancelAnimationFrame(id);
    }
  }, [animate]);

  const scroll = (dir) => setIndex((i) => i + dir);

  const onPointerDown = (e) => {
    if (e.button !== undefined && e.button !== 0) return;
    dragRef.current = { active: true, startX: e.clientX, moved: false, target: e.currentTarget, pointerId: e.pointerId };
    setAnimate(false);
    setDragX(0);
  };
  const onPointerMove = (e) => {
    if (!dragRef.current.active) return;
    const dx = e.clientX - dragRef.current.startX;
    if (Math.abs(dx) > 4 && !dragRef.current.moved) {
      dragRef.current.moved = true;
      try { dragRef.current.target.setPointerCapture(dragRef.current.pointerId); } catch (_) {}
    }
    if (dragRef.current.moved) setDragX(dx);
  };
  const onPointerEnd = (e) => {
    if (!dragRef.current.active) return;
    const dx = e.clientX - dragRef.current.startX;
    dragRef.current.active = false;
    const threshold = STEP * 0.18;
    setAnimate(true);
    setDragX(0);
    if (dx <= -threshold) setIndex((i) => i + 1);
    else if (dx >= threshold) setIndex((i) => i - 1);
    try { e.currentTarget.releasePointerCapture(e.pointerId); } catch (_) {}
  };
  const onClickCapture = (e) => {
    if (dragRef.current.moved) {
      e.preventDefault();
      e.stopPropagation();
      dragRef.current.moved = false;
    }
  };

  if (n === 0) return null;

  return (
    <section style={{
      background: EC.bg, padding: '80px 0',
      borderTop: `1px solid ${EC.muted}`, borderBottom: `1px solid ${EC.muted}`,
      overflow: 'hidden'
    }}>
      <div style={{ maxWidth: 1312, margin: '0 auto 72px', padding: '0 40px' }}>
        <div style={{ textAlign: 'center' }}>
          <div style={{
            fontFamily: 'Nunito', fontWeight: 700, fontSize: 14,
            letterSpacing: '0.2em', color: EC.muted, marginBottom: 20
          }}>POZNAJ ZESPÓŁ</div>
          <h2 style={{
            margin: 0, fontFamily: 'Playfair Display', fontWeight: 400,
            lineHeight: 1.15, letterSpacing: '-0.022em', color: EC.white, fontSize: 48
          }}>Zobacz <em style={{ fontStyle: 'italic' }}>pozostałych</em> ekspertów</h2>
        </div>
      </div>

      <div style={{ position: 'relative' }}>
        <div
          onPointerDown={onPointerDown}
          onPointerMove={onPointerMove}
          onPointerUp={onPointerEnd}
          onPointerCancel={onPointerEnd}
          onClickCapture={onClickCapture}
          style={{ overflow: 'hidden', cursor: dragRef.current.active ? 'grabbing' : 'grab', touchAction: 'pan-y', userSelect: 'none' }}>
          <div
            onTransitionEnd={handleTransitionEnd}
            style={{
              display: 'flex', gap: GAP, alignItems: 'center',
              width: 'max-content',
              transform: `translate3d(calc(50vw - ${CARD_W / 2}px - ${index * STEP}px + ${dragX}px), 0, 0)`,
              transition: animate ? 'transform 550ms cubic-bezier(0.22, 1, 0.36, 1)' : 'none',
              willChange: 'transform',
              padding: '60px 0'
            }}>
            {triple.map((e, i) => {
              const isActive = i === index;
              return (
                <OtherExpertCard key={i} e={e} scale={isActive ? 1 : 0.78} animate={animate} width={CARD_W} />);

            })}
          </div>
        </div>
        {n > 1 &&
        <div style={{
          display: 'flex', justifyContent: 'center', gap: 16, marginTop: 32,
          position: 'relative', zIndex: 2
        }}>
            <RoundArrow dir="left" onClick={() => scroll(-1)} />
            <RoundArrow dir="right" onClick={() => scroll(1)} />
          </div>
        }
      </div>
    </section>);

}

// ─ DLACZEGO WARTO (2-col) ─
function ExpDlaczegoWarto() {
  const points = [
  { title: 'Uważność zamiast schematów', body: 'Nie zakładamy jednej drogi dla wszystkich. Każda konsultacja i każda analiza opiera się na indywidualnym kontekście.' },
  { title: 'Różne specjalizacje, jeden standard jakości', body: 'Każdy ekspert wnosi własne doświadczenie i metodę pracy, ale łączy nas wspólny sposób myślenia: rzetelność, spokój i odpowiedzialność.' },
  { title: 'Zrozumienie, które porządkuje', body: 'Pomagamy zobaczyć więcej tam, gdzie pojawia się chaos, niepewność lub powtarzalność doświadczeń.' },
  { title: 'Przestrzeń do świadomych decyzji', body: 'Naszym celem nie jest dawanie gotowych recept, ale wspieranie Cię w lepszym rozumieniu siebie i swojej sytuacji.' }];

  return (
    <section style={{
      position: 'relative', background: EC.bg,
      borderTop: `1px solid ${EC.muted}`, borderBottom: `1px solid ${EC.muted}`,
      padding: '80px 24px', overflow: 'hidden'
    }}>
      <div style={{
        position: 'relative', maxWidth: 1312, margin: '0 auto', padding: '0 40px',
        display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 64
      }}>
        <div style={{ display: 'flex', flexDirection: 'column', gap: 20, justifyContent: 'flex-start' }}>
          <div style={{
            fontFamily: 'Nunito', fontWeight: 700, fontSize: 14,
            letterSpacing: '0.2em', color: EC.muted
          }}>DLACZEGO WARTO</div>
          <h2 style={{
            margin: 0, fontFamily: 'Playfair Display', fontWeight: 400, fontSize: 48,
            lineHeight: 1.15, letterSpacing: '-0.022em', color: EC.white
          }}>To co ważne, wymaga <em style={{ color: 'rgb(255, 255, 255)' }}>uważnego</em> podejścia</h2>
          <p style={{
            margin: 0, fontFamily: 'Nunito', fontSize: 16, lineHeight: 1.6, color: EC.lavender
          }}>W pracy z człowiekiem nie ma miejsca na przypadkowość ani uproszczenia. Dlatego łączymy doświadczenie ekspertów, spokojny proces i podejście, które pomaga lepiej zrozumieć swoją sytuację.</p>
        </div>
        <div style={{ display: 'flex', flexDirection: 'column', gap: 36 }}>
          {points.map((p, i) =>
          <div key={i} style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
              <h3 style={{
              margin: 0, fontFamily: 'Nunito', fontSize: 22, color: EC.white, fontWeight: "400"
            }}>{p.title}</h3>
              <p style={{
              margin: 0, fontFamily: 'Nunito', fontSize: 15, lineHeight: 1.6, color: EC.lavender
            }}>{p.body}</p>
            </div>
          )}
        </div>
      </div>
    </section>);

}

// ─ CTA ─
function ExpertsCTA() {
  return (
    <section style={{
      position: 'relative', background: EC.bg,
      padding: '0 24px 80px', overflow: 'hidden', textAlign: 'center',
      minHeight: 720, display: 'flex', alignItems: 'flex-end', justifyContent: 'center'
    }}>
      <div aria-hidden style={{
        position: 'absolute', inset: 0,
        backgroundImage: 'url(assets/cta_pyl.jpg)',
        backgroundSize: 'contain',
        backgroundPosition: 'center top',
        backgroundRepeat: 'no-repeat',
        pointerEvents: 'none'
      }} />
      <div aria-hidden style={{
        position: 'absolute', inset: 0,
        background: `linear-gradient(180deg, rgba(6,11,24,0) 0%, rgba(6,11,24,0) 55%, ${EC.bg} 100%)`,
        pointerEvents: 'none'
      }} />
      <div style={{
        position: 'relative', maxWidth: 1156, margin: '0 auto',
        display: 'flex', flexDirection: 'column', gap: 20, alignItems: 'center'
      }}>
        <h2 style={{
          margin: 0, fontFamily: 'Playfair Display', fontWeight: 400, fontSize: 48,
          lineHeight: 1.2, letterSpacing: '-0.022em', color: EC.white
        }}>Nie wiesz, od czego zacząć?</h2>
        <p style={{
          margin: '0 0 16px', maxWidth: 720,
          fontFamily: 'Nunito', fontSize: 16, lineHeight: 1.6, color: EC.lavender
        }}>Zobacz wszystkie usługi albo skontaktuj się z nami, a pomożemy dobrać najlepszy punkt wyjścia.</p>
        <div style={{ display: 'flex', gap: 36 }}>
          <BtnSecond href="index.html#uslugi">Zobacz nasze usługi</BtnSecond>
        </div>
      </div>
    </section>);

}

// ─────────────────────────────────────────────────────────────
// DB-driven content: fetch experts from CMS and replace EXP_LIST + OTHER_EXPERTS_LIST
// contents. Components subscribe to the 'luna-experts-loaded' event via the
// useExpertsTick() hook so they re-render when the fetch resolves.
// Static arrays above act as a fallback while the request is in flight.
// ─────────────────────────────────────────────────────────────
function useExpertsTick() {
  const [, tick] = React.useState(0);
  React.useEffect(() => {
    const f = () => tick((t) => t + 1);
    window.addEventListener('luna-experts-loaded', f);
    return () => window.removeEventListener('luna-experts-loaded', f);
  }, []);
}

(function loadExpertsFromDB() {
  if (typeof window === 'undefined') return;
  fetch('/api/public/content?type=experts', { credentials: 'include' })
    .then((r) => r.json())
    .then(({ items }) => {
      if (!Array.isArray(items) || !items.length) return;
      const mapped = items.map((item) => ({
        name: item.name,
        slug: item.slug,
        role: item.title || '',
        photo: item.photo_url || '',
        objectPos: item.photo_position || 'center top',
        bio: item.long_bio || item.short_bio || '',
        specTitle: item.specialty_title || '',
        specBody: item.specialty_body || '',
        spec2Title: item.specialty2_title || '',
        spec2Body: item.specialty2_body || '',
        services: Array.isArray(item.services_list) ? item.services_list : [],
        flipped: false
      }));
      EXP_LIST.length = 0;
      EXP_LIST.push(...mapped);
      OTHER_EXPERTS_LIST.length = 0;
      OTHER_EXPERTS_LIST.push(...items.map((item) => ({
        name: item.name, slug: item.slug, role: item.title || '',
        img: item.photo_url || '', bio: item.short_bio || ''
      })));
      try { window.dispatchEvent(new CustomEvent('luna-experts-loaded')); } catch (_) {}
    })
    .catch((err) => { console.error('[eksperci] load failed', err); });
})();

Object.assign(window, {
  ExpertsHero, ExpertsIntro, Experts, OtherExperts, ExpDlaczegoWarto, ExpertsCTA, useExpertsTick
});