// slides-1.jsx — агентская ознакомительная: слайды 1-6
// Дизайн-система «Эталон»: paper #F4F2EE, ink #15171A, ember #FF5A1F.
// Холст 1920×1080. Padding 96/100/88. Highlight-pill через <H>.

const TYPE_SCALE = { hero: 112, title: 76, subtitle: 44, lead: 30, body: 26, small: 22, meta: 18, figure: 180 };
const SPACING = { paddingTop: 96, paddingBottom: 88, paddingX: 100, titleGap: 48, itemGap: 28 };
const ACCENT_MAP = {
  ember: { soft: 'var(--c-ember-soft)', main: 'var(--c-ember)', deep: 'var(--c-ember-deep)' },
  teal:  { soft: 'var(--c-teal-soft)',  main: 'var(--c-teal)',  deep: 'var(--c-teal-deep)' },
  mauve: { soft: 'var(--c-mauve-soft)', main: 'var(--c-mauve)', deep: 'var(--c-mauve-deep)' },
  bolt:  { soft: 'var(--c-bolt-soft)',  main: 'var(--c-bolt)',  deep: 'var(--c-bolt-deep)' },
};

function SlideFrame({ bg = 'var(--c-paper)', color = 'var(--c-ink)', children, padX = SPACING.paddingX, padTop = SPACING.paddingTop, padBot = SPACING.paddingBottom, ...rest }) {
  return <div style={{ width: '100%', height: '100%', background: bg, color, padding: `${padTop}px ${padX}px ${padBot}px`, position: 'relative', overflow: 'hidden', fontFamily: 'var(--ff-body)', display: 'flex', flexDirection: 'column', ...rest.style }}>{children}</div>;
}

function Logo({ dark = false, size = 56 }) {
  return <div style={{ display: 'flex', alignItems: 'baseline', gap: 0, fontFamily: 'var(--ff-display)', fontWeight: 800, fontSize: size, lineHeight: 1, letterSpacing: '-0.04em', color: dark ? '#fff' : 'var(--c-ink)' }}>эталон<span style={{ color: 'var(--c-ember)' }}>.</span></div>;
}

function PageHeader({ dark = false, num, total, label }) {
  const t = total || (typeof window !== 'undefined' && window.KP_TOTAL) || 24;
  // На тёмных слайдах — fog (светло-серый), на светлых — smoke (тёмно-серый).
  // Размер 22px (вместо meta=18px) — на холсте 1920×1080 счётчик и breadcrumb
  // должны быть достаточно крупными, чтобы читаться без напряжения.
  const labelColor = dark ? 'var(--c-fog)' : 'var(--c-smoke)';
  const numColor = dark ? '#fff' : 'var(--c-ink)';
  return <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: SPACING.titleGap }}>
    <Logo dark={dark} />
    <div style={{ fontFamily: 'var(--ff-mono)', fontSize: 22, letterSpacing: '0.04em', color: labelColor, fontWeight: 500 }}>
      {label ? `/ ${label}` : ''} <span style={{ marginLeft: 28, color: numColor, fontWeight: 600 }}>{String(num).padStart(2,'0')} / {String(t).padStart(2,'0')}</span>
    </div>
  </div>;
}

function SectionTitle({ children, color = 'var(--c-ink)', size = TYPE_SCALE.title, weight = 700 }) {
  return <h1 style={{ fontFamily: 'var(--ff-display)', fontWeight: weight, fontSize: size, lineHeight: 1.02, letterSpacing: '-0.03em', color, margin: 0, textWrap: 'balance' }}>{children}</h1>;
}

function H({ children, bg, fg = '#fff' }) {
  return <em style={{ fontStyle: 'normal', background: bg || 'var(--c-ember)', color: fg, padding: '0 0.08em', borderRadius: 8, boxDecorationBreak: 'clone' }}>{children}</em>;
}

function Eyebrow({ children, color = 'var(--c-smoke)' }) {
  return <div style={{ fontFamily: 'var(--ff-mono)', fontSize: TYPE_SCALE.meta, letterSpacing: '0.04em', color, display: 'flex', alignItems: 'center', gap: 8 }}><span style={{ opacity: 0.5 }}>/</span> {children}</div>;
}

function ImgPlaceholder({ label, bg, src, children, style }) {
  // Если есть src — рендерим реальную картинку как background-image (cover, center).
  // Если нет — градиентный плейсхолдер с лейблом.
  const bgStyle = src
    ? { backgroundImage: `url("${src}")`, backgroundSize: 'cover', backgroundPosition: 'center', backgroundRepeat: 'no-repeat' }
    : { background: bg || 'var(--c-mist)' };
  return <div className="img-dropzone" style={{ width: '100%', height: '100%', borderRadius: 'var(--r-xl)', position: 'relative', overflow: 'hidden', display: 'flex', alignItems: 'flex-end', padding: 28, color: '#fff', fontFamily: 'var(--ff-mono)', fontSize: 14, letterSpacing: '0.06em', textShadow: '0 1px 2px rgba(0,0,0,0.35)', ...bgStyle, ...style }}>
    {!src && <span style={{ opacity: 0.85 }}>/ {label}</span>}{children}
  </div>;
}

// ─────────────── 01: COVER (ред.) ───────────────
// ВАЖНО: DOM-иерархия eyebrow/title/lead должна остаться:
// section > frame-DIV0 > body-DIV1 > left-col-DIV0 > eyebrow-DIV0/title-H10/lead-P0.
// Иначе ломаются eid'ы s1_DIV0_DIV1_DIV0_DIV0 / _H10 / _P0 в overrides.
// Поэтому новые элементы добавляются ПОСЛЕ <p> (DIV3+) и в правой колонке.
function S01_Cover({ accent }) {
  const A = ACCENT_MAP[accent] || ACCENT_MAP.ember;
  return <SlideFrame bg={`linear-gradient(135deg, ${A.soft} 0%, var(--c-paper) 55%, var(--c-paper) 100%)`}>
    {/* Декоративный orbit — концентрические круги ember за всем контентом.
        Центр на середине фотки (1380, 540 в slide coords), дуги выходят далеко
        за слайд: видны слева на бежевом фоне (через всю левую колонку), снизу
        и сверху (где паддинг). Радиальный vibe как на референс-сайте. */}
    <svg aria-hidden="true" style={{
      position: 'absolute', inset: 0,
      width: '100%', height: '100%',
      pointerEvents: 'none', zIndex: 0,
    }} viewBox="0 0 1920 1080" preserveAspectRatio="none">
      {/* Концентрические круги — radial vibe референса */}
      <circle cx="1380" cy="540" r="440"  fill="none" stroke={A.main} strokeWidth="1.8" strokeDasharray="4 8"  opacity="0.55"/>
      <circle cx="1380" cy="540" r="620"  fill="none" stroke={A.main} strokeWidth="1.6" strokeDasharray="4 10" opacity="0.42"/>
      <circle cx="1380" cy="540" r="820"  fill="none" stroke={A.main} strokeWidth="1.4" strokeDasharray="4 12" opacity="0.30"/>
      <circle cx="1380" cy="540" r="1040" fill="none" stroke={A.main} strokeWidth="1.2" strokeDasharray="4 14" opacity="0.20"/>
      <circle cx="1380" cy="540" r="1280" fill="none" stroke={A.main} strokeWidth="1.0" strokeDasharray="4 16" opacity="0.13"/>
      {/* Тонкие глифы-точки на ключевых orbit-позициях — акцентные маркеры */}
      <circle cx="940"  cy="540" r="6" fill={A.main} opacity="0.85"/>
      <circle cx="1380" cy="100" r="5" fill={A.main} opacity="0.7"/>
      <circle cx="1380" cy="980" r="5" fill={A.main} opacity="0.7"/>
      <circle cx="760"  cy="540" r="4" fill={A.main} opacity="0.55"/>
      <circle cx="560"  cy="540" r="3" fill={A.main} opacity="0.40"/>
    </svg>

    {/* Diagonal accent line — тонкая ember-stripe бежит из нижнего-левого угла
        через слайд, добавляет dynamic flow и движение взгляду. */}
    <svg aria-hidden="true" style={{
      position: 'absolute', inset: 0,
      width: '100%', height: '100%',
      pointerEvents: 'none', zIndex: 0,
    }} viewBox="0 0 1920 1080" preserveAspectRatio="none">
      <line x1="40" y1="980" x2="900" y2="120" stroke={A.main} strokeWidth="1.5" strokeDasharray="2 12" opacity="0.18"/>
    </svg>

    {/* Dot pattern в нижнем-левом углу — vector SVG (не radial-gradient!),
        иначе PDF-экспорт растеризует и точки выходят крупнее/грубее чем в веб.
        Cells 18×18px, точки r=1.6 — точно как в CSS-варианте, но vector-clean. */}
    <svg aria-hidden="true" style={{
      position: 'absolute', left: 60, bottom: 70,
      width: 220, height: 180,
      pointerEvents: 'none', zIndex: 0,
    }} viewBox="0 0 220 180">
      {Array.from({ length: 13 }, (_, col) =>
        Array.from({ length: 11 }, (_, row) => (
          <circle key={`${col}-${row}`} cx={9 + col*18} cy={9 + row*18} r="1.6" fill={A.main} opacity="0.32"/>
        ))
      ).flat()}
    </svg>

    {/* Тонкая ember-полоска у левого края — vertical accent stripe */}
    <div aria-hidden="true" style={{
      position: 'absolute', left: 0, top: '32%', bottom: '20%',
      width: 4, background: A.main, opacity: 0.6,
      pointerEvents: 'none', zIndex: 0,
      borderRadius: '0 4px 4px 0',
    }} />

    <PageHeader num={1} label="Об агентстве" />
    <div style={{ flex: 1, display: 'grid', gridTemplateColumns: '1fr 1.15fr', gap: 56, alignItems: 'stretch', minHeight: 0, position: 'relative', zIndex: 1 }}>
      {/* ── Левая колонка: text only (без micro-stats — дублировались с S3) ───
          Структура сохранена: Eyebrow(DIV0) / SectionTitle(H10) / p(P0) — eid'ы
          s1_DIV0_DIV1_DIV0_DIV0/H10/P0 не сломаны. */}
      <div style={{ display: 'flex', flexDirection: 'column', gap: 36, justifyContent: 'center', paddingBottom: 8 }}>
        <Eyebrow>Маркетинговое агентство · сайты + Я.Директ + Авито для строительной ниши</Eyebrow>
        <SectionTitle size={TYPE_SCALE.hero}>
          Увеличиваем выручку <H bg={A.main} fg="#fff">строительных компаний</H>
        </SectionTitle>
        <p style={{ fontSize: TYPE_SCALE.lead, lineHeight: 1.35, margin: 0, color: 'var(--c-graphite)', maxWidth: 720, textWrap: 'pretty' }}>
          Разрабатываем конверсионные сайты и&nbsp;привлекаем качественные заявки в&nbsp;бизнес.
        </p>
      </div>

      {/* ── Правая колонка: фотка ─────────────────────────────── */}
      <div style={{ position: 'relative', height: '100%', display: 'flex', flexDirection: 'column' }}>
        {/* Главная фотка во всю высоту */}
        <div className="img-dropzone" style={{
          flex: 1,
          backgroundImage: 'url("assets/photos/slide01_img03.jpg")',
          backgroundSize: 'cover',
          backgroundPosition: 'center',
          borderRadius: 'var(--r-xl)',
          position: 'relative',
          overflow: 'hidden',
          boxShadow: 'var(--sh-lg)',
          zIndex: 1,
        }}>
          {/* Затемнение снизу для читаемости подписи */}
          <div style={{ position: 'absolute', inset: 0, background: 'linear-gradient(to bottom, rgba(0,0,0,0) 55%, rgba(0,0,0,0.55) 100%)', pointerEvents: 'none' }} />
          {/* Подпись внизу справа */}
          <div style={{ position: 'absolute', bottom: 24, left: 28, right: 28, color: '#fff', display: 'flex', justifyContent: 'space-between', alignItems: 'flex-end', gap: 16 }}>
            <span style={{ fontFamily: 'var(--ff-mono)', fontSize: 13, letterSpacing: '0.06em', opacity: 0.85, textTransform: 'uppercase' }}>/ объект клиента · ИЖС</span>
            <span style={{ fontFamily: 'var(--ff-mono)', fontSize: 13, letterSpacing: '0.06em', opacity: 0.85 }}>01 / 33</span>
          </div>
          {/* Угловой акцент-блок: щит-с-галочкой = «гарантия результата» */}
          <div style={{
            position: 'absolute', top: 24, right: 24,
            background: A.main, color: '#fff',
            padding: '16px 18px', borderRadius: 'var(--r-md)',
            display: 'flex', flexDirection: 'column', gap: 8, alignItems: 'flex-start',
            boxShadow: '0 8px 24px rgba(255,90,31,0.35)',
          }}>
            <svg width="36" height="36" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
              <path d="M12 2L4 5v7c0 5 3.5 9 8 10 4.5-1 8-5 8-10V5l-8-3z"/>
              <path d="M9 12l2 2 4-4"/>
            </svg>
            <div style={{ fontFamily: 'var(--ff-mono)', fontSize: 11, letterSpacing: '0.06em', opacity: 0.92, textTransform: 'uppercase', lineHeight: 1.35 }}>не боимся<br/>давать гарантии</div>
          </div>
        </div>
      </div>
    </div>
  </SlideFrame>;
}

// ─────────────── 02: УСЛУГИ ───────────────
function S02_Services({ accent }) {
  const A = ACCENT_MAP[accent] || ACCENT_MAP.ember;
  const services = [
    { n: '01', t: 'Разработка лендинга',                          d: 'Одностраничный сайт для рекламы, презентации продукта или для ознакомления с компанией' },
    { n: '02', t: 'Разработка многостраничного сайта',            d: 'Корпоративный сайт, сайт для рекламы с разными направлениями бизнеса' },
    { n: '03', t: 'Редизайн сайта',                               d: 'Современные и удобные сайты для роста бизнес-метрик без потери позиций в поисковой выдаче' },
    { n: '04', t: 'Техническая поддержка сайтов на Тильде и WordPress', d: 'Оперативная работа по вашим задачам сайта в срок' },
    { n: '05', t: 'Реклама в Яндекс.Директ',                      d: 'Настройка рекламы с гарантией результата. В обратном случае вернём деньги' },
    { n: '06', t: 'Авито',                                        d: 'Настройка рекламы с гарантией результата. В обратном случае вернём деньги' },
    { n: '07', t: 'Яндекс Бизнес',                                d: 'Размещение в Яндекс Картах и приоритетное место в локальной выдаче для привлечения клиентов из вашего региона' },
    { n: '08', t: 'Автоматизация бизнеса',                        d: '30% рутины в вашей компании уже может делать AI — покажем где и как' },
  ];
  return <SlideFrame bg="var(--c-paper)">
    <PageHeader num={2} label="Услуги" />
    <div style={{ flex: 1, display: 'grid', gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 1.3fr)', gap: 80, alignItems: 'start', minHeight: 0 }}>
      <div style={{ display: 'flex', flexDirection: 'column', gap: 32 }}>
        <Eyebrow color={A.deep}>основные направления</Eyebrow>
        <SectionTitle size={TYPE_SCALE.hero}>Наши <br/>услуги</SectionTitle>
        <p style={{ fontSize: TYPE_SCALE.lead, lineHeight: 1.4, margin: 0, color: 'var(--c-graphite)', maxWidth: 560 }}>
          Мы не&nbsp;можем быть экспертными во&nbsp;всём, поэтому выбрали 8&nbsp;ключевых направлений
        </p>
      </div>
      <ol style={{ margin: 0, padding: 0, listStyle: 'none', display: 'flex', flexDirection: 'column', gap: 0 }}>
        {services.map((s, i) => (
          <li key={i} style={{ display: 'grid', gridTemplateColumns: '64px 1fr', alignItems: 'center', gap: 24, borderTop: i === 0 ? '1px solid var(--c-mist)' : 'none', borderBottom: '1px solid var(--c-mist)', padding: '20px 0' }}>
            <span style={{ fontFamily: 'var(--ff-mono)', fontSize: 19, letterSpacing: '0.04em', color: A.deep }}>{s.n}</span>
            <div>
              <div style={{ fontFamily: 'var(--ff-display)', fontWeight: 600, fontSize: 28, letterSpacing: '-0.02em', lineHeight: 1.15, color: 'var(--c-ink)' }}>{s.t}</div>
              <div style={{ fontFamily: 'var(--ff-mono)', fontSize: 14, color: 'var(--c-smoke)', marginTop: 6, letterSpacing: '0.02em' }}>{s.d}</div>
            </div>
          </li>
        ))}
      </ol>
    </div>
  </SlideFrame>;
}

// ─────────────── 03: КТО МЫ ───────────────
// v3: заголовок сверху + lead-описание + 3 равные stat-карточки в один ряд.
// Карточки разные по визуальному весу (ink / accent.deep / paper-snow с обводкой)
// — даёт ритм и иерархию, а не просто три одинаковых блока.
function S03_WhoWeAre({ accent }) {
  const A = ACCENT_MAP[accent] || ACCENT_MAP.ember;
  return <SlideFrame bg={A.soft} data-vxv="3">
    <PageHeader num={3} label="Кто мы" />
    <div style={{ flex: 1, display: 'flex', flexDirection: 'column', gap: 48, minHeight: 0 }}>
      <div style={{ display: 'flex', flexDirection: 'column', gap: 24, maxWidth: 1400 }}>
        <SectionTitle size={84}>
          В&nbsp;цифрах о&nbsp;том,<br/>чем занимается <H bg={A.main} fg="#fff">Эталон</H>
        </SectionTitle>
        <p style={{ margin: 0, fontSize: 22, lineHeight: 1.45, color: 'var(--c-graphite)', maxWidth: 900, textWrap: 'pretty' }}>
          Маркетинговое агентство для&nbsp;компаний в&nbsp;нише строительства. Привлекаем квалифицированные заявки и&nbsp;разрабатываем конверсионные сайты.
        </p>
      </div>
      <div style={{ flex: 1, display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 24, minHeight: 0 }}>
        <BigStatCard
          figure="50+"
          label="клиентов"
          tail="в&nbsp;нише строительства — застройщики, ИЖС, стройматериалы"
          bg="var(--c-ink)" figureColor={A.main} fg="#fff" softColor={A.soft}
        />
        <BigStatCard
          figure="1 млрд ₽"
          label="продаж"
          tail="привлекли клиентам совокупным оборотом за&nbsp;время сотрудничества"
          bg={A.deep} figureColor="#fff" fg="#fff" softColor="rgba(255,255,255,0.6)"
          small
        />
        <BigStatCard
          figure="6 лет"
          label="на рынке"
          tail="опыт команды — работаем только с&nbsp;практикующими специалистами"
          bg="var(--c-snow)" figureColor="var(--c-ink)" fg="var(--c-ink)" softColor="var(--c-smoke)"
          accentBar={A.main}
        />
      </div>
    </div>
  </SlideFrame>;
}

function BigStatCard({ figure, label, tail, bg, fg = '#fff', figureColor, small, softColor, accentBar }) {
  // Размер цифры подобран так, чтобы все три варианта (50+ / 1 млрд ₽ / 6 лет)
  // визуально весили одинаково в 3-колоночном grid.
  const figSize = small ? 92 : 116;
  return <div style={{
    background: bg, color: fg,
    borderRadius: 'var(--r-xl)',
    padding: 36,
    display: 'flex', flexDirection: 'column', justifyContent: 'space-between',
    height: '100%', minHeight: 0, overflow: 'hidden',
    border: bg === 'var(--c-snow)' ? '1px solid var(--c-mist)' : 'none',
    position: 'relative',
  }}>
    {accentBar ? <div style={{ position: 'absolute', top: 0, left: 36, right: 36, height: 4, background: accentBar, borderRadius: '0 0 4px 4px' }} /> : null}
    <span style={{ fontFamily: 'var(--ff-mono)', fontSize: TYPE_SCALE.meta, letterSpacing: '0.04em', color: softColor || 'rgba(255,255,255,0.7)' }}>/ {label}</span>
    <div style={{ fontFamily: 'var(--ff-display)', fontWeight: 700, fontSize: figSize, lineHeight: 0.92, letterSpacing: '-0.04em', color: figureColor, margin: '24px 0' }}>{figure}</div>
    <span style={{ fontSize: 19, lineHeight: 1.45, opacity: 0.85 }} dangerouslySetInnerHTML={{ __html: tail }} />
  </div>;
}

// ─────────────── 04: РАЗДЕЛИТЕЛЬ «ОПЫТ» ───────────────
function S04_ExperienceDivider({ accent }) {
  const A = ACCENT_MAP[accent] || ACCENT_MAP.ember;
  return <SlideFrame bg="var(--c-paper)">
    <PageHeader num={4} label="Раздел" />
    <div style={{ flex: 1, display: 'flex', flexDirection: 'column', justifyContent: 'center', gap: 56, minHeight: 0 }}>
      <Eyebrow color={A.deep}>раздел · опыт</Eyebrow>
      <SectionTitle size={TYPE_SCALE.hero} weight={700}>
        Имеем большой опыт <H bg={A.main} fg="#fff">продвижения компаний и&nbsp;разработки сайтов</H>
      </SectionTitle>
      <div style={{ display: 'flex', alignItems: 'center', gap: 40, marginTop: 16 }}>
        <div style={{ flex: 1, height: 1, background: 'var(--c-mist)' }} />
        <span style={{ fontFamily: 'var(--ff-mono)', fontSize: 16, color: 'var(--c-smoke)', letterSpacing: '0.06em' }}>17 КЕЙСОВ ДАЛЕЕ →</span>
        <div style={{ flex: 1, height: 1, background: 'var(--c-mist)' }} />
      </div>
    </div>
  </SlideFrame>;
}

// ─────────────── Универсальные карточки кейсов ───────────────
function CaseSlide({ accent, num, label, eyebrow, title, tasks, metrics, photos, links }) {
  const A = ACCENT_MAP[accent] || ACCENT_MAP.ember;
  return <SlideFrame bg="var(--c-paper)">
    <PageHeader num={num} label={label} />
    <div style={{ flex: 1, display: 'grid', gridTemplateColumns: '1.25fr 1fr', gap: 64, alignItems: 'stretch', minHeight: 0 }}>
      <div style={{ display: 'flex', flexDirection: 'column', gap: 28 }}>
        <Eyebrow color={A.deep}>{eyebrow || 'кейс агентства'}</Eyebrow>
        <SectionTitle size={56}>{title}</SectionTitle>
        <div style={{ display: 'flex', flexDirection: 'column', gap: 24, marginTop: 8 }}>
          {tasks && tasks.length > 0 && (
            <div>
              <div style={{ fontFamily: 'var(--ff-display)', fontWeight: 700, fontSize: 22, marginBottom: 10, color: 'var(--c-ink)', textDecoration: 'underline', textUnderlineOffset: '4px', textDecorationColor: A.main }}>Задачи:</div>
              <ul style={{ margin: 0, padding: 0, listStyle: 'none', display: 'flex', flexDirection: 'column', gap: 8 }}>
                {tasks.map((t, i) => (
                  <li key={i} style={{ fontSize: TYPE_SCALE.body, lineHeight: 1.4, color: 'var(--c-ink-2)', display: 'flex', gap: 12 }}><span style={{ color: A.main, fontFamily: 'var(--ff-mono)', fontSize: 18 }}>—</span><span dangerouslySetInnerHTML={{__html: t}} /></li>
                ))}
              </ul>
            </div>
          )}
          {metrics && metrics.length > 0 && (
            <div>
              <div style={{ fontFamily: 'var(--ff-display)', fontWeight: 700, fontSize: 22, marginBottom: 10, color: 'var(--c-ink)', textDecoration: 'underline', textUnderlineOffset: '4px', textDecorationColor: A.main }}>Показатели:</div>
              <ul style={{ margin: 0, padding: 0, listStyle: 'none', display: 'flex', flexDirection: 'column', gap: 8 }}>
                {metrics.map((m, i) => (
                  <li key={i} style={{ fontSize: TYPE_SCALE.body, lineHeight: 1.4, color: 'var(--c-ink-2)', display: 'flex', gap: 12 }}><span style={{ color: A.main, fontFamily: 'var(--ff-mono)', fontSize: 18 }}>—</span><span dangerouslySetInnerHTML={{__html: m}} /></li>
                ))}
              </ul>
            </div>
          )}
          {links && links.length > 0 && (
            <div style={{ display: 'flex', flexDirection: 'column', gap: 8, marginTop: 4 }}>
              {links.map((l, i) => (
                <a key={i} href={l.url || '#'} style={{ fontSize: TYPE_SCALE.small, color: A.deep, textDecoration: 'underline', textUnderlineOffset: '4px' }}>{l.text}</a>
              ))}
            </div>
          )}
        </div>
      </div>
      <div style={{ display: 'grid', gridTemplateRows: '1fr 1fr', gap: 24, height: '100%', maxHeight: 760 }}>
        {photos.map((p, i) => (
          <ImgPlaceholder key={i} label={p.label} bg={p.bg} src={p.src} />
        ))}
      </div>
    </div>
  </SlideFrame>;
}

function ScreenshotCaseSlide({ accent, num, label, caption, metrics, side = 'right', src }) {
  const A = ACCENT_MAP[accent] || ACCENT_MAP.ember;
  const cols = side === 'left' ? '1fr 1.6fr' : '1.6fr 1fr';
  const innerStyle = src
    ? { flex: 1, backgroundImage: `url("${src}")`, backgroundSize: 'contain', backgroundPosition: 'center', backgroundRepeat: 'no-repeat', backgroundColor: '#fff', borderRadius: 12 }
    : { flex: 1, background: 'rgba(255,255,255,0.03)', border: '1px dashed rgba(255,255,255,0.14)', borderRadius: 12, display: 'flex', alignItems: 'center', justifyContent: 'center', flexDirection: 'column', gap: 14 };
  const screenBlock = (
    <div style={{ background: '#0F1115', borderRadius: 'var(--r-xl)', padding: 28, display: 'flex', flexDirection: 'column', gap: 18, color: '#fff', boxShadow: 'var(--sh-lg)' }}>
      <div style={{ display: 'flex', alignItems: 'center', gap: 12, fontFamily: 'var(--ff-mono)', fontSize: 14, color: 'rgba(255,255,255,0.5)', letterSpacing: '0.04em' }}>
        <span style={{ display: 'flex', gap: 6 }}>
          <span style={{ width: 12, height: 12, background: '#FF5F57', borderRadius: '50%' }}/>
          <span style={{ width: 12, height: 12, background: '#FEBC2E', borderRadius: '50%' }}/>
          <span style={{ width: 12, height: 12, background: '#28C840', borderRadius: '50%' }}/>
        </span>
        <span style={{ marginLeft: 10 }}>{caption}</span>
      </div>
      <div className="img-dropzone" style={innerStyle}>
        {!src && <>
          <span style={{ fontFamily: 'var(--ff-mono)', fontSize: 14, color: 'rgba(255,255,255,0.45)', letterSpacing: '0.08em' }}>/ ВСТАВЬТЕ СКРИНШОТ</span>
          <span style={{ fontFamily: 'var(--ff-body)', fontSize: 19, color: 'rgba(255,255,255,0.6)', maxWidth: 500, textAlign: 'center', lineHeight: 1.4 }}>Перетащите изображение в&nbsp;edit-режиме</span>
        </>}
      </div>
    </div>
  );
  const metricsBlock = <MetricsPanel metrics={metrics} A={A} />;
  return <SlideFrame bg="var(--c-paper)">
    <PageHeader num={num} label={label} />
    <div style={{ flex: 1, display: 'grid', gridTemplateColumns: cols, gap: 40, alignItems: 'stretch', minHeight: 0 }}>
      {side === 'left' ? metricsBlock : screenBlock}
      {side === 'left' ? screenBlock : metricsBlock}
    </div>
  </SlideFrame>;
}

function MetricsPanel({ metrics, A }) {
  return <div style={{ display: 'flex', flexDirection: 'column', gap: 14, justifyContent: 'center' }}>
    {metrics.map((m, i) => (
      <div key={i} style={{ background: m.dark ? 'var(--c-ink)' : '#fff', color: m.dark ? '#fff' : 'var(--c-ink)', border: m.dark ? 'none' : '1px solid var(--c-mist)', borderRadius: 'var(--r-lg)', padding: '22px 26px', display: 'flex', flexDirection: 'column', gap: 6 }}>
        <span style={{ fontFamily: 'var(--ff-mono)', fontSize: 14, letterSpacing: '0.05em', color: m.dark ? 'var(--c-fog)' : 'var(--c-smoke)', textTransform: 'uppercase' }}>/ {m.label}</span>
        <span style={{ fontFamily: 'var(--ff-display)', fontWeight: 700, fontSize: m.value && m.value.length > 10 ? 36 : 50, letterSpacing: '-0.02em', lineHeight: 1, color: m.dark ? A.main : 'var(--c-ink)' }}>{m.value}</span>
      </div>
    ))}
  </div>;
}

// ─────────────── 05: КЕЙС «КАРКАСНЫЕ ДОМА» ───────────────
function S05_CaseFrameHouses({ accent }) {
  return <CaseSlide
    accent={accent} num={5} label="Кейс · Авито · Каркасные дома"
    eyebrow="кейс · авито"
    title="Строительство каркасных домов"
    tasks={['Увеличить количество заказов на&nbsp;строительство каркасных домов']}
    metrics={['Средний результат: <strong>26 целевых обращений</strong>', 'Средняя цена целевого обращения: <strong>2&nbsp;687&nbsp;₽</strong>']}
    photos={[
      { label: 'СТРОЙКА КАРКАСА', src: 'assets/photos/slide05_img02.jpg' },
      { label: 'ГОТОВЫЙ ДОМ · ТЁМНАЯ КРЫША', src: 'assets/photos/slide05_img03.jpg' },
    ]}
  />;
}

// ─────────────── 06: СКРИН АВИТО · ДОМОСТРОЙ ───────────────
function S06_AvitoDomostroyScreen({ accent }) {
  return <ScreenshotCaseSlide
    accent={accent} num={6} label="Пруф · Авито · Домострой"
    caption="кабинет Авито · Домострой · апр–июль"
    src="assets/photos/slide06_img02.jpg"
    metrics={[
      { label: 'просмотры', value: '2 261', dark: false },
      { label: 'контакты', value: '209', dark: true },
      { label: 'избранное', value: '184', dark: false },
      { label: 'расход', value: '69 866 ₽', dark: false },
    ]}
  />;
}

Object.assign(window, {
  TYPE_SCALE, SPACING, ACCENT_MAP,
  SlideFrame, Logo, PageHeader, SectionTitle, H, Eyebrow, ImgPlaceholder,
  CaseSlide, ScreenshotCaseSlide, MetricsPanel, BigStatCard,
  S01_Cover, S02_Services, S03_WhoWeAre, S04_ExperienceDivider,
  S05_CaseFrameHouses, S06_AvitoDomostroyScreen,
});
