/* global React, window, CasePlate, BagPlate, TrunkPlate, RoundPlate, ShoeCabinetPlate, Eyebrow, Rule, palette, ensembles, bags, trunks, rounds, shoecabinets, useIsMobile */
const { useState, useMemo } = React;

/* =========================================================
   Shared atoms
   ========================================================= */
function Container({ children, style }) {
  const m = useIsMobile();
  return <div style={{ maxWidth: 1480, margin: "0 auto", padding: m ? "0 20px" : "0 40px", ...style }}>{children}</div>;
}

function SectionHeading({ kicker, title, side }) {
  const m = useIsMobile();
  return (
    <div style={{ display: "flex", flexDirection: m ? "column" : "row", alignItems: m ? "flex-start" : "flex-end", justifyContent: "space-between", gap: m ? 16 : 40, padding: "0 0 28px" }}>
      <div>
        <Eyebrow>{kicker}</Eyebrow>
        <h2 style={{
          fontFamily: "'Cormorant Garamond', serif", fontWeight: 300, fontStyle: "italic",
          fontSize: "clamp(34px, 4.4vw, 64px)", lineHeight: 1.02, margin: "14px 0 0",
          color: "var(--ink)", maxWidth: 760, letterSpacing: "-0.005em",
        }} dangerouslySetInnerHTML={{ __html: title }} />
      </div>
      {side && <div style={{ fontFamily: "'Manrope', sans-serif", fontSize: 13, color: "rgba(0,0,0,0.55)", maxWidth: m ? "none" : 320, lineHeight: 1.65, paddingBottom: 8 }}>{side}</div>}
    </div>
  );
}

function GhostButton({ children, onClick, style }) {
  return (
    <button onClick={onClick} style={{
      all: "unset", cursor: "pointer",
      fontFamily: "'Manrope', sans-serif", fontSize: 12, letterSpacing: "0.22em",
      textTransform: "uppercase", color: "var(--ink)",
      padding: "16px 26px",
      border: "1px solid var(--ink)",
      transition: "background 200ms ease, color 200ms ease",
      ...style,
    }}
    onMouseEnter={e => { e.currentTarget.style.background = "var(--ink)"; e.currentTarget.style.color = "var(--cream)"; }}
    onMouseLeave={e => { e.currentTarget.style.background = "transparent"; e.currentTarget.style.color = "var(--ink)"; }}
    >{children}</button>
  );
}

function TextLink({ children, onClick }) {
  return (
    <button onClick={onClick} style={{
      all: "unset", cursor: "pointer",
      fontFamily: "'Manrope', sans-serif", fontSize: 12, letterSpacing: "0.22em",
      textTransform: "uppercase", color: "var(--ink)",
      borderBottom: "1px solid var(--ink)", paddingBottom: 2,
    }}>{children}</button>
  );
}

/* =========================================================
   HOME  ·  Royal Harmony premium homepage
   Two equal product directions: чемоданы/сундуки и портфели/рюкзаки.
   Responsive in three tiers: mobile (<820) · tablet (<1080) · desktop.
   ========================================================= */
function HomePage({ setRoute }) {
  const m = useIsMobile();         // phones (< 820)
  const tab = useIsMobile(1080);   // phones + tablets (< 1080)

  const goCases   = () => setRoute("ensembles");
  const goTrunks  = () => setRoute("trunks");
  const goBags    = () => setRoute("bags", "all");
  const goContact = () => setRoute("contact");

  const collections = [
    { key: "cases",   t: "Премиальные чемоданы",          d: "Изделия собственного производства для&nbsp;путешествий и&nbsp;подарков.", plate: "case",  tones: [palette.cognac,  palette.brass, palette.bone],  onClick: goCases  },
    { key: "trunks",  t: "Сундуки и интерьерные изделия", d: "Крупные кожаные сундуки и&nbsp;формы для&nbsp;дома и&nbsp;интерьера.",     plate: "trunk", tones: [palette.oxblood, palette.brass, palette.bone],  onClick: goTrunks },
    { key: "school",  t: "Школьные портфели",             d: "Ранцы и&nbsp;портфели с&nbsp;аккуратной формой и&nbsp;продуманной конструкцией.", plate: "bag", tones: [palette.navy, palette.brass, palette.bone], onClick: goBags },
    { key: "leather", t: "Кожаные рюкзаки",               d: "Городские и&nbsp;повседневные модели в&nbsp;эстетике бренда.",            plate: "bag",   tones: [palette.storm,   palette.cognac, palette.cream], onClick: goBags   },
  ];

  const benefits = [
    "Собственное производство и&nbsp;контроль качества",
    "Премиальный внешний вид без&nbsp;лишней вычурности",
    "Продуманные материалы и&nbsp;фурнитура",
    "Изделия для&nbsp;путешествий, школы и&nbsp;делового стиля",
    "Работаем по&nbsp;России и&nbsp;за&nbsp;её пределами",
  ];
  const roman = ["I", "II", "III", "IV", "V"];

  return (
    <div>
      {/* ===== 1 · HERO ===== */}
      <section style={{ position: "relative", paddingTop: m ? 92 : tab ? 120 : 152, paddingBottom: m ? 64 : 96 }}>
        <Container>
          <div style={{
            display: "grid",
            gridTemplateColumns: tab ? "1fr" : "1.04fr 0.96fr",
            gap: m ? 48 : tab ? 56 : 72,
            alignItems: "center",
          }}>
            <div>
              <Eyebrow>Royal Harmony · Премиальные изделия</Eyebrow>
              <h1 style={{
                fontFamily: "'Cormorant Garamond', serif", fontWeight: 300,
                fontSize: "clamp(38px, 6vw, 84px)", lineHeight: 1.02,
                letterSpacing: "-0.015em", margin: "20px 0 0", color: "var(--ink)",
              }}>
                Премиальные чемоданы, сундуки и&nbsp;<span style={{ fontStyle: "italic", color: "var(--accent)" }}>портфели</span> Royal&nbsp;Harmony
              </h1>
              <p style={{
                fontFamily: "'Manrope', sans-serif", fontSize: m ? 15 : 16.5, lineHeight: 1.7,
                maxWidth: 540, marginTop: 26, color: "rgba(0,0,0,0.7)",
              }}>
                Собственное производство, продуманный дизайн и&nbsp;изделия
                для&nbsp;путешествий, учёбы и&nbsp;делового образа.
              </p>
              <div style={{ display: "flex", gap: 14, marginTop: m ? 32 : 42, flexWrap: "wrap" }}>
                <GhostButton onClick={goCases} style={{ background: "var(--ink)", color: "var(--cream)" }}>Смотреть&nbsp;чемоданы</GhostButton>
                <GhostButton onClick={goBags}>Смотреть портфели и&nbsp;рюкзаки</GhostButton>
              </div>
            </div>

            <HeroComposition m={m} />
          </div>
        </Container>
      </section>

      {/* ===== 2 · DIRECTION SELECTION ===== */}
      <section style={{ paddingBottom: m ? 64 : 100 }}>
        <Container>
          <div style={{ display: "grid", gridTemplateColumns: m ? "1fr" : "1fr 1fr", gap: m ? 18 : 32 }}>
            <DirectionCard
              m={m}
              kicker="Собственное производство"
              title="Чемоданы и&nbsp;сундуки"
              text="Премиальные изделия собственного производства для&nbsp;путешествий, интерьера и&nbsp;подарков."
              cta="Перейти к&nbsp;чемоданам"
              plate="case" tones={[palette.cognac, palette.brass, palette.bone]}
              onClick={goCases}
            />
            <DirectionCard
              m={m}
              kicker="Коллекция Royal Harmony"
              title="Портфели и&nbsp;рюкзаки"
              text="Школьные, городские и&nbsp;кожаные модели Royal Harmony с&nbsp;продуманной конструкцией и&nbsp;аккуратной формой."
              cta="Перейти к&nbsp;портфелям"
              plate="bag" tones={[palette.navy, palette.brass, palette.bone]}
              onClick={goBags}
            />
          </div>
        </Container>
      </section>

      {/* ===== 3 · ABOUT BRAND ===== */}
      <section style={{ background: "var(--bone)", padding: m ? "64px 0" : "104px 0" }}>
        <Container>
          <div style={{ maxWidth: 880, margin: "0 auto", textAlign: "center" }}>
            <Eyebrow>О бренде</Eyebrow>
            <h2 style={{
              fontFamily: "'Cormorant Garamond', serif", fontWeight: 300,
              fontSize: "clamp(30px, 4vw, 56px)", lineHeight: 1.06, margin: "16px 0 0",
              letterSpacing: "-0.005em", color: "var(--ink)",
            }}>
              Royal Harmony - <span style={{ fontStyle: "italic" }}>изделия с&nbsp;характером</span>
            </h2>
            <p style={{
              fontFamily: "'Manrope', sans-serif", fontSize: m ? 15 : 17, lineHeight: 1.8,
              color: "rgba(0,0,0,0.7)", margin: "24px auto 0", maxWidth: 720,
            }}>
              Мы создаём чемоданы, сундуки, портфели и&nbsp;рюкзаки, в&nbsp;которых форма,
              материалы, детали и&nbsp;назначение работают как&nbsp;единая система.
              Наши изделия подходят для&nbsp;путешествий, учёбы, делового образа
              и&nbsp;повседневного использования.
            </p>
          </div>
        </Container>
      </section>

      {/* ===== 4 · SUITCASES & TRUNKS ===== */}
      <FeatureSection
        m={m} tab={tab}
        kicker="Собственное производство"
        title='Чемоданы и&nbsp;сундуки<br/><em>собственного производства</em>'
        text="Мы изготавливаем изделия под&nbsp;заказ, контролируем форму, материалы, фурнитуру и&nbsp;финальную сборку. Возможна индивидуальная комплектация и&nbsp;изготовление в&nbsp;премиальном стиле."
        cta="Смотреть чемоданы и&nbsp;сундуки"
        onClick={goCases}
        visualKind="case" tones={[palette.cognac, palette.brass, palette.bone]}
        caption="Чемоданы и сундуки · собственное производство"
      />

      {/* ===== 5 · BRIEFCASES & BACKPACKS (equal prominence) ===== */}
      <FeatureSection
        m={m} tab={tab} reverse background="var(--bone)"
        kicker="Коллекция Royal Harmony"
        title='Портфели и&nbsp;рюкзаки<br/><em>Royal Harmony</em>'
        text="Модели для&nbsp;школы, города и&nbsp;повседневного образа: продуманная конструкция, аккуратная форма, комфорт и&nbsp;визуальная эстетика бренда."
        cta="Смотреть портфели и&nbsp;рюкзаки"
        onClick={goBags}
        visualKind="bag" tones={[palette.navy, palette.brass, palette.bone]}
        caption="Портфели и рюкзаки · коллекция Royal Harmony"
      />

      {/* ===== 6 · WHY ROYAL HARMONY ===== */}
      <section style={{ padding: m ? "64px 0" : "104px 0" }}>
        <Container>
          <SectionHeading
            kicker="Преимущества"
            title="Почему Royal&nbsp;Harmony"
            side="Единая философия для&nbsp;всех изделий: форма, материалы и&nbsp;назначение продуманы как&nbsp;одна система."
          />
          <div style={{ display: "grid", gridTemplateColumns: m ? "1fr" : "1fr 1fr", columnGap: 56 }}>
            {benefits.map((b, i) => (
              <div key={i} style={{
                display: "flex", gap: m ? 16 : 24, alignItems: "flex-start",
                padding: m ? "22px 0" : "26px 0", borderTop: "1px solid rgba(0,0,0,0.14)",
              }}>
                <div style={{ fontFamily: "'Cormorant Garamond', serif", fontStyle: "italic", fontSize: m ? 24 : 30, lineHeight: 1, color: "var(--accent)", minWidth: 38 }}>{roman[i]}</div>
                <div style={{ fontFamily: "'Manrope', sans-serif", fontSize: m ? 15 : 16, lineHeight: 1.6, color: "var(--ink)", paddingTop: 3 }}
                     dangerouslySetInnerHTML={{ __html: b }} />
              </div>
            ))}
          </div>
        </Container>
      </section>

      {/* ===== 7 · COLLECTIONS ===== */}
      <section style={{ background: "var(--bone)", padding: m ? "64px 0" : "104px 0" }}>
        <Container>
          <SectionHeading
            kicker="Каталог"
            title="Коллекции"
            side="Структурированные семейства изделий - от&nbsp;чемоданов до&nbsp;кожаных рюкзаков."
          />
          <div style={{
            display: "grid",
            gridTemplateColumns: tab ? "1fr 1fr" : "repeat(4, 1fr)",
            gap: m ? 18 : 32, rowGap: m ? 32 : 40,
          }}>
            {collections.map(item => <CollectionCard key={item.key} item={item} m={m} />)}
          </div>
        </Container>
      </section>

      {/* ===== 8 · TRUST ===== */}
      <section style={{ padding: m ? "64px 0" : "104px 0" }}>
        <Container>
          <div style={{ display: "grid", gridTemplateColumns: tab ? "1fr" : "1.1fr 1fr", gap: m ? 28 : 72, alignItems: "center" }}>
            <h2 style={{
              fontFamily: "'Cormorant Garamond', serif", fontWeight: 300,
              fontSize: "clamp(28px, 3.6vw, 50px)", lineHeight: 1.05, margin: 0,
              letterSpacing: "-0.005em", color: "var(--ink)",
            }}>
              Единый подход к&nbsp;форме,<br />деталям и&nbsp;<span style={{ fontStyle: "italic" }}>качеству</span>.
            </h2>
            <div>
              <p style={{ fontFamily: "'Manrope', sans-serif", fontSize: m ? 15 : 16.5, lineHeight: 1.75, color: "rgba(0,0,0,0.7)", margin: 0, maxWidth: 480 }}>
                Royal Harmony - это не&nbsp;случайный ассортимент, а&nbsp;единая система изделий,
                созданных вокруг эстетики, практичности и&nbsp;аккуратного исполнения.
              </p>
              <div style={{ marginTop: 28, paddingTop: 22, borderTop: "1px solid rgba(0,0,0,0.14)" }}>
                <div style={{ fontFamily: "'Cormorant Garamond', serif", fontStyle: "italic", fontSize: m ? 22 : 26, lineHeight: 1.3, color: "var(--ink)" }}>
                  Более 15 лет опыта в&nbsp;изделиях, материалах и&nbsp;производственных процессах.
                </div>
              </div>
            </div>
          </div>
        </Container>
      </section>

      {/* ===== 9 · FINAL CTA ===== */}
      <section style={{ background: "var(--ink)", color: "var(--cream)", padding: m ? "64px 0" : "100px 0" }}>
        <Container>
          <div style={{ maxWidth: 820, margin: "0 auto", textAlign: "center" }}>
            <Eyebrow color="rgba(255,255,255,0.55)">Royal Harmony</Eyebrow>
            <h2 style={{
              fontFamily: "'Cormorant Garamond', serif", fontWeight: 300,
              fontSize: "clamp(32px, 4.4vw, 60px)", lineHeight: 1.04, margin: "16px 0 0",
              letterSpacing: "-0.005em", color: "var(--cream)",
            }}>
              Выберите изделие <span style={{ fontStyle: "italic" }}>Royal&nbsp;Harmony</span>
            </h2>
            <p style={{
              fontFamily: "'Manrope', sans-serif", fontSize: m ? 14.5 : 16, lineHeight: 1.7,
              color: "rgba(255,255,255,0.7)", margin: "22px auto 0", maxWidth: 620,
            }}>
              Чемодан для&nbsp;путешествия, сундук для&nbsp;интерьера, портфель для&nbsp;школы
              или рюкзак для&nbsp;повседневного образа.
            </p>
            <div style={{ display: "flex", gap: 14, marginTop: m ? 32 : 40, flexWrap: "wrap", justifyContent: "center" }}>
              <DarkCTAButton filled onClick={goCases}>Смотреть&nbsp;чемоданы</DarkCTAButton>
              <DarkCTAButton onClick={goBags}>Смотреть портфели и&nbsp;рюкзаки</DarkCTAButton>
              <DarkCTAButton onClick={goContact}>Связаться с&nbsp;нами</DarkCTAButton>
            </div>
          </div>
        </Container>
      </section>
    </div>
  );
}

/* =========================================================
   HOME · supporting pieces
   ========================================================= */

/* Hero visual: чемодан и портфель из одной design-семьи стоят РЯДОМ на
   одной «витрине». Общий тон фона плашек = тон витрины, поэтому силуэты
   читаются как стоящие на одной поверхности. Выровнены по нижней кромке,
   ничего не перекрывается - одна семья изделий, без беспорядка. */
function HeroComposition({ m }) {
  const shelf = palette.bone; // общий тон витрины и фона силуэтов
  return (
    <div style={{ position: "relative" }}>
      <div style={{
        background: shelf,
        border: "1px solid rgba(0,0,0,0.08)",
        padding: m ? "26px 20px 0" : "44px 40px 0",
      }}>
        {/* ratio плашек подобран под их silhouette-viewBox (чемодан 100×75,
            портфель 100×120), чтобы силуэты заполняли кадр и стояли на полке. */}
        <div style={{ display: "flex", alignItems: "flex-end", justifyContent: "center", gap: m ? 14 : 32 }}>
          <div style={{ width: "55%", flex: "0 0 auto" }}>
            <CasePlate id="hero-case" tones={[palette.cognac, palette.brass, shelf]} ratio="4/3" />
          </div>
          <div style={{ width: "32%", flex: "0 0 auto" }}>
            <BagPlate id="hero-bag" tones={[palette.navy, palette.brass, shelf]} ratio="5/6" />
          </div>
        </div>
        {/* линия-полка: подчёркивает, что оба изделия на одной поверхности */}
        <div style={{ height: 1, background: "rgba(0,0,0,0.16)" }} />
        <div style={{ height: m ? 14 : 18 }} />
      </div>
      <div style={{
        marginTop: 16, textAlign: "right", lineHeight: 1.5,
        fontFamily: "'JetBrains Mono', ui-monospace, monospace", fontSize: m ? 9.5 : 11,
        letterSpacing: "0.08em", color: "rgba(0,0,0,0.5)", textTransform: "uppercase",
      }}>
        Чемоданы · Сундуки · Портфели · Рюкзаки
      </div>
    </div>
  );
}

/* Large equal-weight card for the two-direction selector. */
function DirectionCard({ kicker, title, text, cta, plate, tones, onClick, m }) {
  const [hover, setHover] = useState(false);
  const Plate = plate === "bag" ? BagPlate : CasePlate;
  return (
    <button
      onClick={onClick}
      onMouseEnter={() => setHover(true)}
      onMouseLeave={() => setHover(false)}
      style={{
        all: "unset", cursor: "pointer", display: "block", width: "100%", textAlign: "left",
        border: "1px solid " + (hover ? "rgba(0,0,0,0.2)" : "rgba(0,0,0,0.1)"),
        background: "var(--cream)",
        transition: "transform 500ms cubic-bezier(0.2,0.7,0.2,1), box-shadow 500ms ease, border-color 300ms ease",
        transform: hover ? "translateY(-4px)" : "none",
        boxShadow: hover ? "0 44px 70px -48px rgba(0,0,0,0.45)" : "none",
      }}
    >
      <div style={{ padding: m ? "16px 16px 0" : "24px 24px 0" }}>
        <div style={{ background: "var(--bone)", padding: m ? 18 : 30, overflow: "hidden" }}>
          <div style={{ transition: "transform 700ms cubic-bezier(0.2,0.7,0.2,1)", transform: hover ? "scale(1.04)" : "scale(1)" }}>
            <Plate id={"dir-" + plate} tones={tones} ratio={m ? "5/4" : "16/10"} />
          </div>
        </div>
      </div>
      <div style={{ padding: m ? "20px 18px 24px" : "26px 28px 32px" }}>
        <Eyebrow>{kicker}</Eyebrow>
        <h3 style={{
          fontFamily: "'Cormorant Garamond', serif", fontWeight: 300, fontStyle: "italic",
          fontSize: m ? 30 : 40, lineHeight: 1.04, margin: "12px 0 0", color: "var(--ink)",
        }} dangerouslySetInnerHTML={{ __html: title }} />
        <p style={{ fontFamily: "'Manrope', sans-serif", fontSize: m ? 13.5 : 14.5, lineHeight: 1.7, color: "rgba(0,0,0,0.65)", margin: "14px 0 0", maxWidth: 440 }}
           dangerouslySetInnerHTML={{ __html: text }} />
        <div style={{
          marginTop: 22, display: "inline-flex", alignItems: "center", gap: 10,
          fontFamily: "'Manrope', sans-serif", fontSize: 12, letterSpacing: "0.18em",
          textTransform: "uppercase", color: "var(--ink)",
          borderBottom: "1px solid var(--ink)", paddingBottom: 4,
        }}>
          <span dangerouslySetInnerHTML={{ __html: cta }} />
          <span style={{ transition: "transform 300ms ease", transform: hover ? "translateX(4px)" : "none" }}>→</span>
        </div>
      </div>
    </button>
  );
}

/* Alternating image/text feature block. Both product directions get the
   identical treatment so neither feels secondary. `reverse` swaps the
   columns on desktop only; on tablet/mobile the visual always leads. */
function FeatureSection({ kicker, title, text, cta, onClick, visualKind, tones, caption, reverse, background, m, tab }) {
  const Plate = visualKind === "bag" ? BagPlate : visualKind === "trunk" ? TrunkPlate : CasePlate;
  const [hover, setHover] = useState(false);
  const desktopReverse = !tab && reverse;

  const visual = (
    <div
      style={{ order: desktopReverse ? 2 : 0 }}
      onMouseEnter={() => setHover(true)}
      onMouseLeave={() => setHover(false)}
    >
      <div style={{ background: background ? "var(--cream)" : "var(--bone)", padding: m ? 24 : 52, overflow: "hidden" }}>
        <div style={{ transition: "transform 800ms cubic-bezier(0.2,0.7,0.2,1)", transform: hover ? "scale(1.03)" : "scale(1)" }}>
          <Plate id={"feat-" + visualKind} tones={tones} ratio={m ? "5/4" : "4/3"} />
        </div>
      </div>
      <div style={{ marginTop: 14, fontFamily: "'JetBrains Mono', ui-monospace, monospace", fontSize: m ? 10 : 11, letterSpacing: "0.08em", color: "rgba(0,0,0,0.5)", textTransform: "uppercase" }}>
        {caption}
      </div>
    </div>
  );

  const copy = (
    <div style={{ order: desktopReverse ? 1 : 0 }}>
      <Eyebrow>{kicker}</Eyebrow>
      <h2 style={{
        fontFamily: "'Cormorant Garamond', serif", fontWeight: 300,
        fontSize: "clamp(28px, 3.8vw, 52px)", lineHeight: 1.05, margin: "16px 0 0",
        letterSpacing: "-0.005em", color: "var(--ink)",
      }} dangerouslySetInnerHTML={{ __html: title }} />
      <p style={{ fontFamily: "'Manrope', sans-serif", fontSize: m ? 15 : 16.5, lineHeight: 1.75, color: "rgba(0,0,0,0.7)", margin: "22px 0 0", maxWidth: 480 }}
         dangerouslySetInnerHTML={{ __html: text }} />
      <div style={{ marginTop: m ? 28 : 34 }}>
        <GhostButton onClick={onClick} style={{ background: "var(--ink)", color: "var(--cream)" }}>
          <span dangerouslySetInnerHTML={{ __html: cta }} />
        </GhostButton>
      </div>
    </div>
  );

  return (
    <section style={{ background: background || "transparent", padding: m ? "64px 0" : "104px 0" }}>
      <Container>
        <div style={{ display: "grid", gridTemplateColumns: tab ? "1fr" : "1fr 1fr", gap: m ? 36 : 72, alignItems: "center" }}>
          {visual}
          {copy}
        </div>
      </Container>
    </section>
  );
}

/* Compact collection card. */
function CollectionCard({ item, m }) {
  const [hover, setHover] = useState(false);
  const Plate = item.plate === "bag" ? BagPlate : item.plate === "trunk" ? TrunkPlate : CasePlate;
  return (
    <button
      onClick={item.onClick}
      onMouseEnter={() => setHover(true)}
      onMouseLeave={() => setHover(false)}
      style={{ all: "unset", cursor: "pointer", display: "block", width: "100%", textAlign: "left" }}
    >
      <div style={{ background: "var(--cream)", border: "1px solid rgba(0,0,0,0.08)", padding: m ? 14 : 20, overflow: "hidden" }}>
        <div style={{ transition: "transform 700ms cubic-bezier(0.2,0.7,0.2,1)", transform: hover ? "scale(1.05)" : "scale(1)" }}>
          <Plate id={"col-" + item.key} tones={item.tones} ratio="4/5" />
        </div>
      </div>
      <div style={{ paddingTop: 16 }}>
        <div style={{ fontFamily: "'Cormorant Garamond', serif", fontStyle: "italic", fontSize: m ? 19 : 23, lineHeight: 1.15, color: "var(--ink)" }}>{item.t}</div>
        <p style={{ fontFamily: "'Manrope', sans-serif", fontSize: m ? 12.5 : 13, lineHeight: 1.6, color: "rgba(0,0,0,0.6)", margin: "8px 0 0" }}
           dangerouslySetInnerHTML={{ __html: item.d }} />
        <div style={{ marginTop: 12, fontSize: 16, color: "var(--ink)", display: "inline-block", transition: "transform 300ms ease", transform: hover ? "translateX(5px)" : "none" }}>→</div>
      </div>
    </button>
  );
}

/* Buttons used on the dark final-CTA band (GhostButton inverts wrong on dark). */
function DarkCTAButton({ children, onClick, filled }) {
  const [hover, setHover] = useState(false);
  const base = {
    all: "unset", cursor: "pointer",
    fontFamily: "'Manrope', sans-serif", fontSize: 12, letterSpacing: "0.22em",
    textTransform: "uppercase", padding: "16px 26px",
    border: "1px solid var(--cream)",
    transition: "background 200ms ease, color 200ms ease",
  };
  const style = filled
    ? { ...base, background: hover ? "transparent" : "var(--cream)", color: hover ? "var(--cream)" : "var(--ink)" }
    : { ...base, background: hover ? "var(--cream)" : "transparent", color: hover ? "var(--ink)" : "var(--cream)" };
  return (
    <button onClick={onClick} onMouseEnter={() => setHover(true)} onMouseLeave={() => setHover(false)} style={style}>
      {children}
    </button>
  );
}

/* =========================================================
   Cards
   ========================================================= */
function EnsembleCard({ item, onClick }) {
  const m = useIsMobile();
  const base = m ? 82 : 120;
  return (
    <button onClick={onClick} style={{ all: "unset", cursor: "pointer", display: "block", width: "100%", textAlign: "left" }}>
      <div style={{ background: "var(--cream)", padding: m ? 24 : 36, border: "1px solid rgba(0,0,0,0.08)" }}>
        <div style={{ display: "flex", alignItems: "flex-end", gap: m ? 10 : 14, justifyContent: "center", minHeight: m ? 160 : 220 }}>
          {item.dims.map((_, i) => {
            const scales = [1, 0.86, 0.72, 0.6];
            const s = scales[i] ?? 0.5;
            const body = item.tones[i] ?? item.tones[0];
            return (
              <div key={i} style={{ width: base * s + "px", flex: "0 0 auto" }}>
                <CasePlate id={item.id + "_" + i} tones={[body, palette.brass, palette.bone]} ratio="4/3" />
              </div>
            );
          })}
        </div>
      </div>
      <div style={{ paddingTop: 22, display: "flex", flexDirection: m ? "column" : "row", gap: m ? 10 : 0, justifyContent: "space-between", alignItems: m ? "stretch" : "baseline" }}>
        <div>
          <Eyebrow>{item.pieces} предмета · комплект</Eyebrow>
          <div style={{ fontFamily: "'Cormorant Garamond', serif", fontWeight: 400, fontSize: 28, fontStyle: "italic", marginTop: 10 }}>{item.name}</div>
          <p style={{ fontFamily: "'Manrope', sans-serif", fontSize: 13, color: "rgba(0,0,0,0.6)", marginTop: 10, maxWidth: 440, lineHeight: 1.6 }}>
            {item.note}
          </p>
        </div>
        <div style={{ textAlign: m ? "left" : "right" }}>
          <div style={{ fontFamily: "'Manrope', sans-serif", fontSize: 13, color: "var(--ink)" }}>{item.price}</div>
          <div style={{ fontFamily: "'JetBrains Mono', ui-monospace, monospace", fontSize: 10, color: "rgba(0,0,0,0.5)", marginTop: 6, letterSpacing: "0.08em" }}>
            {item.dims.join(" · ")}
          </div>
        </div>
      </div>
    </button>
  );
}

/* =========================================================
   Generic product card (used for trunks, rounds)
   ========================================================= */
function ProductCard({ item, Plate, ratio = "4/5", onClick }) {
  const [hover, setHover] = useState(false);
  return (
    <button
      onClick={onClick}
      onMouseEnter={() => setHover(true)}
      onMouseLeave={() => setHover(false)}
      style={{
        all: "unset", cursor: "pointer", display: "block", width: "100%",
        textAlign: "left",
      }}
    >
      <div style={{ position: "relative", overflow: "hidden" }}>
        <div style={{
          transition: "transform 700ms cubic-bezier(0.2, 0.7, 0.2, 1)",
          transform: hover ? "scale(1.03)" : "scale(1)",
        }}>
          <Plate id={item.id} tones={item.tones} ratio={ratio} />
        </div>
        {item.tag && (
          <div style={{
            position: "absolute", top: 14, left: 14,
            background: "var(--cream)", padding: "6px 10px",
            fontFamily: "'Manrope', sans-serif", fontSize: 10, letterSpacing: "0.2em", textTransform: "uppercase",
          }}>{item.tag}</div>
        )}
      </div>
      <div style={{ paddingTop: 16, display: "flex", justifyContent: "space-between", alignItems: "baseline" }}>
        <div>
          <div style={{ fontFamily: "'Cormorant Garamond', serif", fontWeight: 400, fontSize: 22, fontStyle: "italic" }}>{item.name}</div>
          <div style={{ fontFamily: "'JetBrains Mono', ui-monospace, monospace", fontSize: 11, letterSpacing: "0.08em", color: "rgba(0,0,0,0.5)", marginTop: 6 }}>
            {item.dims} см
          </div>
        </div>
        <div style={{ fontFamily: "'Manrope', sans-serif", fontSize: 13, color: "var(--ink)" }}>{item.price}</div>
      </div>
    </button>
  );
}

/* =========================================================
   TRUNKS catalogue
   ========================================================= */
function TrunksPage({ setRoute }) {
  const m = useIsMobile();
  return (
    <div style={{ paddingTop: m ? 96 : 140, paddingBottom: m ? 72 : 120 }}>
      <Container>
        <SectionHeading
          kicker="Каталог · Сундуки"
          title="Семь форматов <br/><em>для&nbsp;интерьера дома</em>."
          side="Крупные кожаные сундуки для&nbsp;прихожей, спальни и&nbsp;гостиной. Любой размер - под&nbsp;заказ."
        />

        <div style={{
          display: "flex", justifyContent: "space-between", alignItems: "center",
          borderTop: "1px solid rgba(0,0,0,0.12)", borderBottom: "1px solid rgba(0,0,0,0.12)",
          padding: "16px 0", margin: "12px 0 48px",
        }}>
          <div style={{ fontFamily: "'Manrope', sans-serif", fontSize: 12, letterSpacing: "0.18em", textTransform: "uppercase", color: "rgba(0,0,0,0.55)" }}>
            От&nbsp;большого к&nbsp;малому
          </div>
          <div style={{ fontFamily: "'JetBrains Mono', ui-monospace, monospace", fontSize: 11, letterSpacing: "0.1em", color: "rgba(0,0,0,0.5)" }}>
            {trunks.length} ИЗДЕЛИЙ
          </div>
        </div>

        <div style={{ display: "grid", gridTemplateColumns: m ? "1fr 1fr" : "repeat(3, 1fr)", gap: m ? 18 : 40, rowGap: m ? 36 : 64 }}>
          {trunks.map(t => <ProductCard key={t.id} item={t} Plate={TrunkPlate} ratio="4/3" onClick={() => setRoute("contact")} />)}
        </div>

        <Rule style={{ margin: m ? "56px 0 40px" : "96px 0 60px" }} />

        <div style={{ display: "grid", gridTemplateColumns: m ? "1fr" : "1fr 1fr", gap: m ? 28 : 80, alignItems: "center" }}>
          <h3 style={{ fontFamily: "'Cormorant Garamond', serif", fontWeight: 300, fontStyle: "italic", fontSize: "clamp(30px, 3.4vw, 48px)", lineHeight: 1.05, margin: 0, letterSpacing: "-0.005em" }}>
            Сундук под&nbsp;ваш интерьер -<br />в&nbsp;любом размере и&nbsp;тоне.
          </h3>
          <div>
            <p style={{ fontFamily: "'Manrope', sans-serif", fontSize: 15, lineHeight: 1.7, color: "rgba(0,0,0,0.65)", maxWidth: 460 }}>
              Подберём размер под&nbsp;конкретное место в&nbsp;комнате. Срок изготовления - 24–40 дней.
            </p>
            <div style={{ marginTop: 24 }}>
              <GhostButton onClick={() => setRoute("contact")} style={{ background: "var(--ink)", color: "var(--cream)" }}>
                Заказать индивидуально
              </GhostButton>
            </div>
          </div>
        </div>
      </Container>
    </div>
  );
}

/* =========================================================
   ROUNDS catalogue
   ========================================================= */
function RoundsPage({ setRoute }) {
  const m = useIsMobile();
  return (
    <div style={{ paddingTop: m ? 96 : 140, paddingBottom: m ? 72 : 120 }}>
      <Container>
        <SectionHeading
          kicker="Каталог · Круги"
          title="Круглые футляры <br/><em>разных диаметров</em>."
          side="Цилиндрические коробки для&nbsp;шляп, аксессуаров и&nbsp;декора. От&nbsp;маленького шляпного до&nbsp;большого напольного."
        />

        <div style={{
          display: "flex", justifyContent: "space-between", alignItems: "center",
          borderTop: "1px solid rgba(0,0,0,0.12)", borderBottom: "1px solid rgba(0,0,0,0.12)",
          padding: "16px 0", margin: "12px 0 48px",
        }}>
          <div style={{ fontFamily: "'Manrope', sans-serif", fontSize: 12, letterSpacing: "0.18em", textTransform: "uppercase", color: "rgba(0,0,0,0.55)" }}>
            От&nbsp;Ø 20 до&nbsp;Ø 48 см
          </div>
          <div style={{ fontFamily: "'JetBrains Mono', ui-monospace, monospace", fontSize: 11, letterSpacing: "0.1em", color: "rgba(0,0,0,0.5)" }}>
            {rounds.length} ИЗДЕЛИЙ
          </div>
        </div>

        <div style={{ display: "grid", gridTemplateColumns: m ? "1fr 1fr" : "repeat(4, 1fr)", gap: m ? 18 : 32, rowGap: m ? 36 : 56 }}>
          {rounds.map(r => <ProductCard key={r.id} item={r} Plate={RoundPlate} ratio="4/5" onClick={() => setRoute("contact")} />)}
        </div>

        <Rule style={{ margin: m ? "56px 0 40px" : "96px 0 60px" }} />

        <div style={{ display: "grid", gridTemplateColumns: m ? "1fr" : "1fr 1fr", gap: m ? 28 : 80, alignItems: "center" }}>
          <h3 style={{ fontFamily: "'Cormorant Garamond', serif", fontWeight: 300, fontStyle: "italic", fontSize: "clamp(30px, 3.4vw, 48px)", lineHeight: 1.05, margin: 0, letterSpacing: "-0.005em" }}>
            Круг произвольного<br />диаметра под&nbsp;заказ.
          </h3>
          <div>
            <p style={{ fontFamily: "'Manrope', sans-serif", fontSize: 15, lineHeight: 1.7, color: "rgba(0,0,0,0.65)", maxWidth: 460 }}>
              Сделаем шляпную коробку, чехол для&nbsp;ваз или декоративный футляр любого размера.
            </p>
            <div style={{ marginTop: 24 }}>
              <GhostButton onClick={() => setRoute("contact")} style={{ background: "var(--ink)", color: "var(--cream)" }}>
                Заказать индивидуально
              </GhostButton>
            </div>
          </div>
        </div>
      </Container>
    </div>
  );
}

/* =========================================================
   SHOE CABINET
   ========================================================= */
function ShoeCabinetPage({ setRoute }) {
  const item = shoecabinets[0];
  const m = useIsMobile();
  return (
    <div style={{ paddingTop: m ? 96 : 140, paddingBottom: m ? 72 : 120 }}>
      <Container>
        <SectionHeading
          kicker="Каталог · Обувница"
          title="Обувница для&nbsp;прихожей <br/><em>в&nbsp;стиле дорожного сундука</em>."
          side="Высокий комод на&nbsp;три-четыре ряда, обтянутый кожей. Металлические уголки, литая фурнитура."
        />

        <div style={{ display: "grid", gridTemplateColumns: m ? "1fr" : "1fr 1.1fr", gap: m ? 40 : 80, alignItems: "start", marginTop: 24 }}>
          <div style={{ maxWidth: m ? 320 : "none", margin: m ? "0 auto" : 0, width: "100%" }}>
            <ShoeCabinetPlate id={item.id} tones={item.tones} ratio="3/4" label={item.name} />
            <div style={{
              display: "flex", justifyContent: "space-between", marginTop: 14,
              fontFamily: "'JetBrains Mono', ui-monospace, monospace", fontSize: 11,
              letterSpacing: "0.08em", color: "rgba(0,0,0,0.5)", textTransform: "uppercase",
            }}>
              <span>Стандарт</span>
              <span>{item.dims} см</span>
            </div>
          </div>

          <div style={{ paddingTop: 12 }}>
            <Eyebrow>Одна модель · любой размер</Eyebrow>
            <h3 style={{
              fontFamily: "'Cormorant Garamond', serif", fontWeight: 300, fontStyle: "italic",
              fontSize: "clamp(32px, 3.4vw, 48px)", lineHeight: 1.05, margin: "14px 0 24px",
            }}>
              {item.name}
            </h3>
            <p style={{ fontFamily: "'Manrope', sans-serif", fontSize: 15, lineHeight: 1.75, color: "rgba(0,0,0,0.7)", maxWidth: 480 }}>
               Тот&nbsp;же&nbsp;каркас и&nbsp;кожа, что и&nbsp;на&nbsp;чемоданах. Полки из&nbsp;фанеры, обшитые кожей,
              металлические ручки. Делаем под&nbsp;высоту вашей прихожей и&nbsp;нужное количество рядов.
            </p>

            <Rule style={{ margin: "32px 0" }} />

            <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: 24, marginBottom: 32 }}>
              <div>
                <div style={{ fontFamily: "'Manrope', sans-serif", fontSize: 11, letterSpacing: "0.2em", textTransform: "uppercase", color: "rgba(0,0,0,0.5)" }}>Размер</div>
                <div style={{ fontFamily: "'Cormorant Garamond', serif", fontStyle: "italic", fontSize: 24, marginTop: 6 }}>{item.dims} см</div>
              </div>
              <div>
                <div style={{ fontFamily: "'Manrope', sans-serif", fontSize: 11, letterSpacing: "0.2em", textTransform: "uppercase", color: "rgba(0,0,0,0.5)" }}>Цена</div>
                <div style={{ fontFamily: "'Cormorant Garamond', serif", fontStyle: "italic", fontSize: 24, marginTop: 6 }}>{item.price}</div>
              </div>
            </div>

            <GhostButton onClick={() => setRoute("contact")} style={{ background: "var(--ink)", color: "var(--cream)" }}>
              Заказать индивидуально
            </GhostButton>
          </div>
        </div>
      </Container>
    </div>
  );
}

/* =========================================================
   ENSEMBLES
   ========================================================= */
function EnsemblesPage({ setRoute }) {
  const m = useIsMobile();
  return (
    <div style={{ paddingTop: m ? 96 : 140, paddingBottom: m ? 72 : 120 }}>
      <Container>
        <SectionHeading
          kicker="Готовые комплекты"
          title="Стопки из&nbsp;двух,<br/>трёх и&nbsp;<em>четырёх размеров</em>."
          side="Подобраны в&nbsp;единый тон кожи и&nbsp;металла. Идеальны для&nbsp;витрин, прихожих и&nbsp;подарков."
        />
        <div style={{ display: "grid", gridTemplateColumns: m ? "1fr" : "1fr 1fr", gap: 48, rowGap: m ? 40 : 64 }}>
          {ensembles.map(e => <EnsembleCard key={e.id} item={e} onClick={() => setRoute("ensemble", e.id)} />)}
        </div>
      </Container>
    </div>
  );
}

/* =========================================================
   ENSEMBLE DETAIL
   ========================================================= */
function EnsembleDetailPage({ id, setRoute }) {
  const item = ensembles.find(e => e.id === id) || ensembles[0];
  const mainTone = item.tones[0];
  const m = useIsMobile();
  const mainBase = m ? 110 : 180;

  return (
    <div style={{ paddingTop: m ? 96 : 140, paddingBottom: m ? 72 : 120 }}>
      <Container>
        <div style={{ marginBottom: 28 }}>
          <TextLink onClick={() => setRoute("ensembles")}>← Все комплекты</TextLink>
        </div>

        <div style={{ display: "grid", gridTemplateColumns: m ? "1fr" : "1.15fr 1fr", gap: m ? 40 : 80, alignItems: "start" }}>
          {/* Левая колонка - главное фото + миниатюры (placeholders) */}
          <div>
            <div style={{ background: "var(--cream)", padding: m ? 20 : 40, border: "1px solid rgba(0,0,0,0.08)" }}>
              <div style={{ display: "flex", alignItems: "flex-end", gap: m ? 10 : 18, justifyContent: "center", minHeight: m ? 220 : 360 }}>
                {item.dims.map((_, i) => {
                  const scales = [1, 0.86, 0.72, 0.6];
                  const s = scales[i] ?? 0.5;
                  const body = item.tones[i] ?? item.tones[0];
                  return (
                    <div key={i} style={{ width: mainBase * s + "px", flex: "0 0 auto" }}>
                      <CasePlate id={item.id + "_main_" + i} tones={[body, palette.brass, palette.bone]} ratio="4/3" />
                    </div>
                  );
                })}
              </div>
            </div>
            <div style={{
              marginTop: 14, fontFamily: "'JetBrains Mono', ui-monospace, monospace",
              fontSize: 10, letterSpacing: "0.1em", color: "rgba(0,0,0,0.5)", textTransform: "uppercase",
            }}>
              Фото изделия - от Royal Harmony
            </div>

            {/* Сетка под дополнительные фото / детали */}
            <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr 1fr", gap: 14, marginTop: 14 }}>
              {[0, 1, 2].map(i => (
                <div key={i} style={{ background: "var(--cream)", border: "1px solid rgba(0,0,0,0.08)", aspectRatio: "1 / 1", padding: 16, display: "flex", alignItems: "center", justifyContent: "center" }}>
                  <CasePlate id={item.id + "_thumb_" + i} tones={[item.tones[i] ?? mainTone, palette.brass, palette.bone]} ratio="1/1" dense />
                </div>
              ))}
            </div>
          </div>

          {/* Правая колонка - инфо */}
          <div>
            <Eyebrow>{item.pieces} предмета · комплект</Eyebrow>
            <h1 style={{
              fontFamily: "'Cormorant Garamond', serif", fontWeight: 300, fontStyle: "italic",
              fontSize: "clamp(40px, 4.4vw, 64px)", lineHeight: 1.02,
              margin: "14px 0 24px", letterSpacing: "-0.005em",
            }}>
              {item.name}
            </h1>

            <p style={{ fontFamily: "'Manrope', sans-serif", fontSize: 15, lineHeight: 1.7, color: "rgba(0,0,0,0.7)", maxWidth: 480, marginBottom: 36 }}>
              {item.note}
            </p>

            <Rule style={{ margin: "0 0 24px" }} />

            <div style={{ display: "grid", gridTemplateColumns: "120px 1fr", rowGap: 14, columnGap: 24, fontFamily: "'Manrope', sans-serif", fontSize: 13 }}>
              <div style={{ color: "rgba(0,0,0,0.5)", letterSpacing: "0.08em", textTransform: "uppercase", fontSize: 11 }}>Размеры</div>
              <div style={{ fontFamily: "'JetBrains Mono', ui-monospace, monospace", fontSize: 12, color: "var(--ink)" }}>
                {item.dims.map((d, i) => <div key={i}>{d} см</div>)}
              </div>

              <div style={{ color: "rgba(0,0,0,0.5)", letterSpacing: "0.08em", textTransform: "uppercase", fontSize: 11 }}>Цена</div>
              <div style={{ color: "var(--ink)" }}>{item.price}</div>

              <div style={{ color: "rgba(0,0,0,0.5)", letterSpacing: "0.08em", textTransform: "uppercase", fontSize: 11 }}>Тона</div>
              <div style={{ display: "flex", gap: 8 }}>
                {item.tones.map((t, i) => (
                  <div key={i} title={t} style={{ width: 26, height: 26, background: t, border: "1px solid rgba(0,0,0,0.12)" }} />
                ))}
              </div>

              <div style={{ color: "rgba(0,0,0,0.5)", letterSpacing: "0.08em", textTransform: "uppercase", fontSize: 11 }}>Состав</div>
              <div style={{ color: "var(--ink)", lineHeight: 1.6 }}>
                Веганская кожа, многослойный каркас,<br />
                металлическая фурнитура, ручная отстрочка.
              </div>
            </div>

            <Rule style={{ margin: "32px 0 24px" }} />

            <div style={{ display: "flex", gap: 14, flexWrap: "wrap" }}>
              <GhostButton onClick={() => setRoute("contact")} style={{ background: "var(--ink)", color: "var(--cream)" }}>
                Заказать комплект
              </GhostButton>
              <GhostButton onClick={() => setRoute("contact")}>Изменить размеры или тон</GhostButton>
            </div>

            <p style={{ fontFamily: "'Manrope', sans-serif", fontSize: 12, color: "rgba(0,0,0,0.5)", marginTop: 24, lineHeight: 1.65 }}>
              Подробное описание, фотографии и&nbsp;комплектация - на&nbsp;стороне Royal&nbsp;Harmony.
              Здесь сейчас черновая раскладка для&nbsp;будущего наполнения.
            </p>
          </div>
        </div>
      </Container>
    </div>
  );
}

/* =========================================================
   BAGS catalogue
   ========================================================= */
function BagsPage({ filter, setRoute }) {
  const filtered = useMemo(() => filter === "all" ? bags : bags.filter(b => b.audience === filter), [filter]);

  const audienceCopy = {
    all: { kicker: "Школьная коллекция", title: "Ранцы, портфели,<br/><em>рюкзаки и&nbsp;сумки</em>.", side: "Полный школьный каталог: ткани, кожа, светоотражающие элементы, ортопедическая спинка." },
    gentlemen: { kicker: "Для джентльменов", title: "Юным&nbsp;путешественникам<br/><em>и&nbsp;будущим&nbsp;капитанам</em>.", side: "Сдержанные тона, металлическая фурнитура, прочные&nbsp;швы." },
    princesses: { kicker: "Для принцесс", title: "Маленьким&nbsp;придворным<br/>дамам и&nbsp;<em>будущим&nbsp;поэтессам</em>.", side: "Пастельная кожа, прочные застёжки, потайное отделение для&nbsp;маленьких секретов." },
  };
  const c = audienceCopy[filter] || audienceCopy.all;
  const m = useIsMobile();

  return (
    <div style={{ paddingTop: m ? 96 : 140, paddingBottom: m ? 72 : 120 }}>
      <Container>
        <SectionHeading kicker={c.kicker} title={c.title} side={c.side} />

        <div style={{
          display: "flex", flexDirection: m ? "column" : "row",
          justifyContent: "space-between", alignItems: m ? "flex-start" : "center", gap: m ? 14 : 0,
          borderTop: "1px solid rgba(0,0,0,0.12)", borderBottom: "1px solid rgba(0,0,0,0.12)",
          padding: "16px 0", margin: "12px 0 48px",
        }}>
          <div style={{ display: "flex", gap: m ? 18 : 28, flexWrap: "wrap" }}>
            {[
              ["all", "Смешанный каталог"],
              ["gentlemen", "Для джентльменов"],
              ["princesses", "Для принцесс"],
            ].map(([k, l]) => (
              <button key={k} onClick={() => setRoute("bags", k)} style={{
                all: "unset", cursor: "pointer",
                fontFamily: "'Manrope', sans-serif", fontSize: 12, letterSpacing: "0.18em",
                textTransform: "uppercase", color: filter === k ? "var(--ink)" : "rgba(0,0,0,0.55)",
                fontWeight: filter === k ? 500 : 400,
                borderBottom: filter === k ? "1px solid var(--ink)" : "1px solid transparent",
                paddingBottom: 4,
              }}>{l}</button>
            ))}
          </div>
          <div style={{ fontFamily: "'JetBrains Mono', ui-monospace, monospace", fontSize: 11, letterSpacing: "0.1em", color: "rgba(0,0,0,0.5)" }}>
            {filtered.length} МОДЕЛЕЙ
          </div>
        </div>

        <div style={{ display: "grid", gridTemplateColumns: m ? "1fr 1fr" : "repeat(4, 1fr)", gap: m ? 18 : 32, rowGap: m ? 36 : 56 }}>
          {filtered.map(b => <BagCard key={b.id} item={b} />)}
        </div>
      </Container>
    </div>
  );
}

function BagCard({ item }) {
  const [hover, setHover] = useState(false);
  return (
    <div onMouseEnter={() => setHover(true)} onMouseLeave={() => setHover(false)}
      style={{ display: "block", width: "100%", textAlign: "left" }}>
      <div style={{ overflow: "hidden" }}>
        <div style={{ transition: "transform 700ms cubic-bezier(0.2,0.7,0.2,1)", transform: hover ? "scale(1.04)" : "scale(1)" }}>
          <BagPlate id={item.id} tones={item.tones} ratio="4/5" />
        </div>
      </div>
      <div style={{ paddingTop: 14 }}>
        <div style={{ fontFamily: "'JetBrains Mono', ui-monospace, monospace", fontSize: 10, letterSpacing: "0.16em", textTransform: "uppercase", color: "rgba(0,0,0,0.5)" }}>
          {item.kind} · {item.age}
        </div>
        <div style={{ fontFamily: "'Cormorant Garamond', serif", fontWeight: 400, fontSize: 20, fontStyle: "italic", marginTop: 6 }}>{item.name}</div>
        <div style={{ display: "flex", justifyContent: "space-between", marginTop: 8, fontFamily: "'Manrope', sans-serif", fontSize: 12, color: "rgba(0,0,0,0.6)" }}>
          <span>{item.dims} см</span>
          <span style={{ color: "var(--ink)" }}>{item.price}</span>
        </div>
      </div>
    </div>
  );
}

/* =========================================================
   CUSTOM order
   ========================================================= */
function CustomPage() {
  const [form, setForm] = useState({
    type: "case",
    width: 80, height: 46, depth: 21,
    leather: "cognac",
    hardware: "gold-gloss",
    interior: "leather",
    monogram: "",
    name: "", contact: "", note: "",
  });
  const [sent, setSent] = useState(false);

  const update = (k, v) => setForm(f => ({ ...f, [k]: v }));

  const leathers = [
    ["cognac", "Коньяк", palette.cognac],
    ["ink", "Графит", palette.storm],
    ["oxblood", "Кардинал", palette.oxblood],
    ["forest", "Хвоя", palette.forest],
    ["bone", "Слоновая кость", palette.bone],
    ["rose", "Пудра", palette.blush],
  ];
  const hardwares = [
    ["gold-gloss",    "Золото · глянец",  "#B8924A"],
    ["gold-brushed",  "Золото · тёртое",  "#8C6F45"],
    ["silver-gloss",  "Серебро · глянец", "#CFCFD3"],
    ["silver-brushed","Серебро · тёртое", "#9A9A9E"],
  ];

  const selectedLeather = leathers.find(l => l[0] === form.leather)[2];
  const accentColor = (hardwares.find(h => h[0] === form.hardware) || hardwares[0])[2];
  const m = useIsMobile();

  return (
    <div style={{ paddingTop: m ? 96 : 140, paddingBottom: m ? 80 : 140 }}>
      <Container>
        <SectionHeading
          kicker="Индивидуальный заказ"
          title="Соберите чемодан<br/><em>по&nbsp;своим размерам</em>."
          side="Любая модель из&nbsp;каталога переделывается. Срок изготовления 18–30&nbsp;дней. Предоплата - 50%."
        />

        <div style={{ display: "grid", gridTemplateColumns: m ? "1fr" : "1.1fr 1fr", gap: m ? 40 : 72, alignItems: "flex-start" }}>
          {/* preview */}
          <div style={{ position: m ? "static" : "sticky", top: 140 }}>
            <div style={{ background: "var(--cream)", border: "1px solid rgba(0,0,0,0.08)", padding: m ? 24 : 48 }}>
              <CasePlate
                id={"preview-" + form.leather + form.hardware}
                tones={[selectedLeather, accentColor, palette.bone]}
                ratio="5/4"
                label={form.monogram ? `MONOGRAM · ${form.monogram.toUpperCase()}` : "MONOGRAM · -"}
              />
              <div style={{ display: "grid", gridTemplateColumns: "repeat(3, 1fr)", gap: 0, borderTop: "1px solid rgba(0,0,0,0.1)", marginTop: 24 }}>
                {[
                  ["Ширина", form.width + " см"],
                  ["Высота", form.height + " см"],
                  ["Глубина", form.depth + " см"],
                ].map(([l, v], i) => (
                  <div key={i} style={{
                    padding: "18px 0",
                    borderLeft: i ? "1px solid rgba(0,0,0,0.1)" : "none",
                    paddingLeft: i ? 18 : 0,
                  }}>
                    <div style={{ fontFamily: "'Manrope', sans-serif", fontSize: 11, letterSpacing: "0.2em", textTransform: "uppercase", color: "rgba(0,0,0,0.5)" }}>{l}</div>
                    <div style={{ fontFamily: "'Cormorant Garamond', serif", fontStyle: "italic", fontSize: 28, marginTop: 4 }}>{v}</div>
                  </div>
                ))}
              </div>
            </div>
            <div style={{ marginTop: 16, fontFamily: "'JetBrains Mono', ui-monospace, monospace", fontSize: 11, letterSpacing: "0.08em", color: "rgba(0,0,0,0.5)", textTransform: "uppercase" }}>
              Превью в&nbsp;реальном масштабе соотношений. Финальный образец - на&nbsp;утверждение в&nbsp;мастерской.
            </div>
          </div>

          {/* form */}
          <div>
            <FormGroup label="01 · Тип изделия">
              <Pill active={form.type === "case"} onClick={() => update("type", "case")}>Чемодан</Pill>
              <Pill active={form.type === "ensemble"} onClick={() => update("type", "ensemble")}>Комплект</Pill>
            </FormGroup>

            <FormGroup label="02 · Размеры, см">
              <Slider label="Ширина"  min={40} max={120} value={form.width}  onChange={v => update("width", v)} />
              <Slider label="Высота"  min={28} max={70}  value={form.height} onChange={v => update("height", v)} />
              <Slider label="Глубина" min={12} max={32}  value={form.depth}  onChange={v => update("depth", v)} />
              <div style={{ fontFamily: "'Manrope', sans-serif", fontSize: 12, color: "rgba(0,0,0,0.5)", marginTop: 4 }}>
                Стандарт: 90×56×22, 80×46×21, 70×42×19, 55×36×16
              </div>
            </FormGroup>

            <FormGroup label="03 · Кожа">
              <div style={{ display: "flex", gap: 14, flexWrap: "wrap" }}>
                {leathers.map(([k, l, c]) => (
                  <button key={k} onClick={() => update("leather", k)} style={{
                    all: "unset", cursor: "pointer",
                    display: "flex", flexDirection: "column", alignItems: "center", gap: 8,
                  }}>
                    <div style={{
                      width: 56, height: 56, background: c,
                      outline: form.leather === k ? "1px solid var(--ink)" : "1px solid rgba(0,0,0,0.12)",
                      outlineOffset: form.leather === k ? 3 : 0,
                      transition: "outline-offset 180ms ease",
                    }} />
                    <div style={{ fontFamily: "'Manrope', sans-serif", fontSize: 11, letterSpacing: "0.1em", textTransform: "uppercase", color: "rgba(0,0,0,0.65)" }}>{l}</div>
                  </button>
                ))}
              </div>
            </FormGroup>

            <FormGroup label="04 · Фурнитура">
              {hardwares.map(([k, l]) => <Pill key={k} active={form.hardware === k} onClick={() => update("hardware", k)}>{l}</Pill>)}
            </FormGroup>

            <FormGroup label="05 · Подкладка">
              <Pill active={form.interior === "leather"} onClick={() => update("interior", "leather")}>Кожа</Pill>
            </FormGroup>

            <FormGroup label="06 · Монограмма (до 10 знаков)">
              <input
                value={form.monogram}
                maxLength={10}
                onChange={e => update("monogram", e.target.value)}
                placeholder="М К"
                style={inputStyle}
              />
            </FormGroup>

            <Rule style={{ margin: "32px 0" }} />

            <FormGroup label="07 · Контактные данные">
              <input value={form.name}    onChange={e => update("name", e.target.value)}    placeholder="Имя" style={inputStyle} />
              <input value={form.contact} onChange={e => update("contact", e.target.value)} placeholder="Телефон или e-mail" style={inputStyle} />
              <textarea value={form.note} onChange={e => update("note", e.target.value)}    placeholder="Пожелания, особый тон, дата подарка…" rows={4} style={{ ...inputStyle, resize: "vertical" }} />
            </FormGroup>

            <div style={{ marginTop: 24, display: "flex", alignItems: "center", gap: 20 }}>
              <button onClick={() => setSent(true)} style={{
                all: "unset", cursor: "pointer",
                fontFamily: "'Manrope', sans-serif", fontSize: 12, letterSpacing: "0.22em",
                textTransform: "uppercase", color: "var(--cream)", background: "var(--ink)",
                padding: "18px 30px",
              }}>
                Отправить заявку
              </button>
              {sent && (
                <span style={{ fontFamily: "'Manrope', sans-serif", fontSize: 13, color: "var(--ink)" }}>
                  Заявка принята. Мастер свяжется в&nbsp;течение дня.
                </span>
              )}
            </div>
          </div>
        </div>
      </Container>
    </div>
  );
}

const inputStyle = {
  all: "unset", display: "block", width: "100%", boxSizing: "border-box",
  fontFamily: "'Manrope', sans-serif", fontSize: 14, color: "var(--ink)",
  borderBottom: "1px solid rgba(0,0,0,0.2)", padding: "12px 0", marginTop: 8,
};

function FormGroup({ label, children }) {
  return (
    <div style={{ marginBottom: 32 }}>
      <div style={{ fontFamily: "'Manrope', sans-serif", fontSize: 11, letterSpacing: "0.22em", textTransform: "uppercase", color: "rgba(0,0,0,0.55)", marginBottom: 16 }}>{label}</div>
      <div style={{ display: "flex", flexWrap: "wrap", gap: 10 }}>{children}</div>
    </div>
  );
}
function Pill({ active, onClick, children }) {
  return (
    <button onClick={onClick} style={{
      all: "unset", cursor: "pointer",
      fontFamily: "'Manrope', sans-serif", fontSize: 12, letterSpacing: "0.14em",
      textTransform: "uppercase",
      padding: "12px 18px",
      border: "1px solid " + (active ? "var(--ink)" : "rgba(0,0,0,0.2)"),
      background: active ? "var(--ink)" : "transparent",
      color: active ? "var(--cream)" : "var(--ink)",
      transition: "all 160ms ease",
    }}>{children}</button>
  );
}
function Slider({ label, min, max, value, onChange }) {
  return (
    <div style={{ width: "100%", marginBottom: 8 }}>
      <div style={{ display: "flex", justifyContent: "space-between", fontFamily: "'Manrope', sans-serif", fontSize: 12, color: "rgba(0,0,0,0.6)" }}>
        <span>{label}</span>
        <span style={{ fontFamily: "'JetBrains Mono', ui-monospace, monospace", color: "var(--ink)" }}>{value} см</span>
      </div>
      <input type="range" min={min} max={max} value={value} onChange={e => onChange(+e.target.value)}
        style={{ width: "100%", marginTop: 6, accentColor: "var(--ink)" }} />
    </div>
  );
}

/* =========================================================
   ABOUT
   ========================================================= */
function AboutPage({ setRoute }) {
  const m = useIsMobile();

  const timeline = [
    ["2001", "Начало", "Открыли маленькую мастерскую. Первые годы - копили опыт, отбирали кожу и&nbsp;фурнитуру, собирали команду мастеров."],
    ["2008", "Своя школа", "Сложился собственный почерк: дорожный сундук, ручная сборка, прочные швы. Каждый мастер отвечает за&nbsp;свою часть работы."],
    ["2014", "Первые клиенты", "О&nbsp;нас начали узнавать. Появились первые постоянные заказчики и&nbsp;первые подарочные комплекты."],
    ["2019", "За&nbsp;пределами страны", "Постоянные клиенты и&nbsp;заказы из&nbsp;разных стран. Добавили интерьерную и&nbsp;школьную коллекции."],
    ["2025", "Индивидуальные работы", "Сложные индивидуальные заказы стали главным направлением. Делаем предметы, которые остаются в&nbsp;семье как наследие."],
  ];

  return (
    <div style={{ paddingTop: m ? 96 : 140, paddingBottom: m ? 80 : 140 }}>
      <Container>
        <SectionHeading
          kicker="О нас"
          title="Больше двадцати лет<br/><em>одного ремесла</em>."
          side="Маленькая мастерская. Один мастер - одна часть работы. Без&nbsp;потоков, без&nbsp;спешки - с&nbsp;2001&nbsp;года."
        />
        <div style={{ display: "grid", gridTemplateColumns: m ? "1fr" : "1fr 1.2fr", gap: m ? 40 : 80 }}>
          <div style={{ maxWidth: m ? 300 : "none", margin: m ? "0 auto" : 0, width: "100%" }}>
            <CasePlate id="about" tones={[palette.cognac, palette.brass, palette.bone]} ratio="3/4" label="Royal Harmony · Plate 00" />
            <div style={{ marginTop: 14, fontFamily: "'JetBrains Mono', ui-monospace, monospace", fontSize: 11, letterSpacing: "0.08em", color: "rgba(0,0,0,0.5)", textTransform: "uppercase" }}>
              Royal Harmony · С 2001 года
            </div>
          </div>
          <div>
            <p style={{ fontFamily: "'Cormorant Garamond', serif", fontStyle: "italic", fontSize: 26, lineHeight: 1.35, color: "var(--ink)", margin: 0 }}>
              «Мы&nbsp;делаем не&nbsp;чемодан на&nbsp;один сезон. Мы&nbsp;делаем
              предмет, который десять лет в&nbsp;дороге и&nbsp;дома и&nbsp;остаётся
              в&nbsp;семье как наследие».
            </p>
            <div style={{ marginTop: 18, fontFamily: "'Manrope', sans-serif", fontSize: 12, letterSpacing: "0.18em", textTransform: "uppercase", color: "rgba(0,0,0,0.55)" }}>
              - Мастер мастерской
            </div>

            <Rule style={{ margin: m ? "36px 0" : "44px 0" }} />

            <Eyebrow>Как мы росли</Eyebrow>

            <div style={{ marginTop: 28 }}>
              {timeline.map(([y, head, body], i) => (
                <div
                  key={i}
                  style={{
                    display: "grid",
                    gridTemplateColumns: m ? "64px 1fr" : "96px 1fr",
                    gap: m ? 18 : 28,
                    paddingBottom: i === timeline.length - 1 ? 0 : (m ? 26 : 30),
                    marginBottom: i === timeline.length - 1 ? 0 : (m ? 26 : 30),
                    borderBottom: i === timeline.length - 1 ? "none" : "1px solid rgba(0,0,0,0.12)",
                  }}
                >
                  <div style={{ fontFamily: "'Cormorant Garamond', serif", fontStyle: "italic", fontSize: m ? 30 : 40, lineHeight: 1, color: "var(--ink)" }}>{y}</div>
                  <div>
                    <div style={{ fontFamily: "'Manrope', sans-serif", fontSize: 12, letterSpacing: "0.16em", textTransform: "uppercase", color: "var(--ink)", marginBottom: 8 }}>{head}</div>
                    <p style={{ fontFamily: "'Manrope', sans-serif", fontSize: 13.5, lineHeight: 1.65, color: "rgba(0,0,0,0.6)", margin: 0 }}
                       dangerouslySetInnerHTML={{ __html: body }} />
                  </div>
                </div>
              ))}
            </div>

            <div style={{ marginTop: 44 }}>
              <GhostButton onClick={() => setRoute("contact")}>Связаться&nbsp;с&nbsp;нами</GhostButton>
            </div>
          </div>
        </div>
      </Container>
    </div>
  );
}

/* =========================================================
   CONTACT
   ========================================================= */
function ContactPage() {
  const m = useIsMobile();
  return (
    <div style={{ paddingTop: m ? 96 : 140, paddingBottom: m ? 80 : 140 }}>
      <Container>
        <SectionHeading
          kicker="Контакты"
          title="Напишите -<br/><em>и&nbsp;Royal&nbsp;Harmony ответит в&nbsp;течение дня</em>."
          side="Мы&nbsp;не&nbsp;работаем через колл-центр. На&nbsp;письма и&nbsp;звонки отвечаем лично."
        />
        <div style={{ display: "grid", gridTemplateColumns: m ? "1fr" : "1fr 1fr 1fr", gap: m ? 32 : 48, borderTop: "1px solid rgba(0,0,0,0.12)", paddingTop: m ? 32 : 48 }}>
          {[
            ["Почта", "royalharmony@mail.ru"],
            ["Чемоданы", "+7 (928) 058-58-88<br/>@RoyalHarmonyy · Telegram<br/>@Royal.Harmonyy · Instagram"],
            ["Сумки", "+7 (777) 777-77-77<br/>@mesami.shop · Instagram"],
          ].map(([k, v], i) => (
            <div key={i}>
              <Eyebrow>{k}</Eyebrow>
              <div style={{ fontFamily: "'Cormorant Garamond', serif", fontStyle: "italic", fontSize: 26, lineHeight: 1.3, marginTop: 14, color: "var(--ink)" }}
                   dangerouslySetInnerHTML={{ __html: v }} />
            </div>
          ))}
        </div>
      </Container>
    </div>
  );
}

/* =========================================================
   PRIVACY POLICY
   Политика обработки персональных данных (152-ФЗ).
   Отражает реальный сбор данных на сайте: регистрация по почте/паролю,
   вход через Google, имя в кабинете, формы обратной связи и заказа,
   письма для сброса пароля. Тексты - без длинного тире.
   ========================================================= */
function PrivacyPage({ setRoute }) {
  const m = useIsMobile();

  const sectionTitle = {
    fontFamily: "'Cormorant Garamond', serif", fontWeight: 300, fontStyle: "italic",
    fontSize: m ? 24 : 30, lineHeight: 1.15, margin: "0 0 16px", color: "var(--ink)",
    letterSpacing: "-0.005em",
  };
  const body = {
    fontFamily: "'Manrope', sans-serif", fontSize: m ? 14.5 : 15.5, lineHeight: 1.8,
    color: "rgba(0,0,0,0.72)", margin: "0 0 14px", maxWidth: 760,
  };
  const li = { ...body, margin: "0 0 8px" };
  const num = {
    fontFamily: "'Cormorant Garamond', serif", fontStyle: "italic",
    fontSize: m ? 22 : 26, color: "var(--accent)", lineHeight: 1, minWidth: 44,
  };

  const Section = ({ n, title, children }) => (
    <section style={{ display: "flex", gap: m ? 16 : 28, alignItems: "flex-start", padding: m ? "28px 0" : "36px 0", borderTop: "1px solid rgba(0,0,0,0.12)" }}>
      <div style={num}>{n}</div>
      <div style={{ flex: 1 }}>
        <h2 style={sectionTitle}>{title}</h2>
        {children}
      </div>
    </section>
  );

  return (
    <div style={{ paddingTop: m ? 96 : 140, paddingBottom: m ? 80 : 140 }}>
      <Container>
        <SectionHeading
          kicker="Royal Harmony"
          title="Политика обработки<br/><em>персональных данных</em>."
          side="Как мы&nbsp;собираем, используем и&nbsp;храним ваши данные на&nbsp;сайте royalharmony.ru. Редакция от&nbsp;2&nbsp;июня&nbsp;2026&nbsp;года."
        />

        <div style={{ maxWidth: 860 }}>
          <p style={{ ...body, marginTop: m ? 8 : 16 }}>
            Настоящая Политика разработана в&nbsp;соответствии с&nbsp;Федеральным законом
            от&nbsp;27.07.2006 №&nbsp;152-ФЗ «О&nbsp;персональных данных» и&nbsp;определяет порядок
            обработки персональных данных пользователей сайта royalharmony.ru
            (далее&nbsp;- Сайт). Используя Сайт, регистрируясь или отправляя нам&nbsp;сообщение,
            вы&nbsp;соглашаетесь с&nbsp;условиями этой Политики.
          </p>

          <Section n="1" title="Оператор данных">
            <p style={body}>
              Обработку персональных данных осуществляет Индивидуальный предприниматель
              Иманалиев Юсуп Иманалиевич (бренд Royal&nbsp;Harmony, далее&nbsp;- Оператор).
            </p>
            <ul style={{ paddingLeft: 0, listStyle: "none", margin: "0 0 6px" }}>
              <li style={li}>- ОГРНИП: 323057100108871;</li>
              <li style={li}>- ИНН: 053409980892;</li>
              <li style={li}>- регион регистрации: Республика Дагестан, г.&nbsp;Махачкала.</li>
            </ul>
            <p style={body}>
              По&nbsp;всем вопросам, связанным с&nbsp;обработкой данных, можно написать
              на&nbsp;почту <b>royalharmony@mail.ru</b>.
            </p>
          </Section>

          <Section n="2" title="Какие данные мы собираем">
            <p style={body}>Мы&nbsp;обрабатываем только те&nbsp;данные, которые вы&nbsp;сообщаете сами:</p>
            <ul style={{ paddingLeft: 0, listStyle: "none", margin: "0 0 6px" }}>
              <li style={li}>- имя и&nbsp;адрес электронной почты&nbsp;- при&nbsp;регистрации и&nbsp;входе в&nbsp;личный кабинет;</li>
              <li style={li}>- пароль&nbsp;- хранится только в&nbsp;зашифрованном виде (хеш), в&nbsp;открытом виде нам&nbsp;недоступен;</li>
              <li style={li}>- основные данные профиля Google (имя, адрес почты)&nbsp;- если&nbsp;вы&nbsp;используете вход через&nbsp;Google;</li>
              <li style={li}>- имя, телефон, контакт и&nbsp;текст обращения&nbsp;- при&nbsp;отправке формы заказа или&nbsp;обращения в&nbsp;контактах;</li>
              <li style={li}>- технические данные: cookies и&nbsp;локальное хранилище браузера для&nbsp;поддержания сессии входа.</li>
            </ul>
            <p style={body}>
              Мы&nbsp;не&nbsp;собираем специальные категории данных и&nbsp;не&nbsp;запрашиваем платёжные
              реквизиты на&nbsp;Сайте.
            </p>
          </Section>

          <Section n="3" title="Зачем мы используем данные">
            <ul style={{ paddingLeft: 0, listStyle: "none", margin: 0 }}>
              <li style={li}>- регистрация и&nbsp;авторизация в&nbsp;личном кабинете;</li>
              <li style={li}>- обработка заказов, расчётов и&nbsp;индивидуальных запросов;</li>
              <li style={li}>- ответы на&nbsp;ваши обращения и&nbsp;связь по&nbsp;заказу;</li>
              <li style={li}>- отправка служебных писем, включая восстановление пароля;</li>
              <li style={li}>- обеспечение работы и&nbsp;безопасности Сайта.</li>
            </ul>
          </Section>

          <Section n="4" title="Передача данных третьим лицам">
            <p style={body}>
              Мы&nbsp;не&nbsp;продаём ваши данные. Для&nbsp;работы Сайта мы&nbsp;используем
              сервисы, которые могут обрабатывать отдельные данные по&nbsp;нашему поручению:
            </p>
            <ul style={{ paddingLeft: 0, listStyle: "none", margin: 0 }}>
              <li style={li}>- Google (вход через&nbsp;аккаунт Google)&nbsp;- проверка личности при&nbsp;входе;</li>
              <li style={li}>- сервис отправки писем&nbsp;- доставка служебных сообщений на&nbsp;вашу почту;</li>
              <li style={li}>- хостинг-провайдер&nbsp;- размещение Сайта и&nbsp;хранение данных.</li>
            </ul>
            <p style={body}>
              Данные также могут быть переданы по&nbsp;законному требованию уполномоченных
              государственных органов.
            </p>
          </Section>

          <Section n="5" title="Хранение и защита">
            <p style={body}>
              Данные хранятся столько, сколько необходимо для&nbsp;указанных целей или&nbsp;пока
              действует ваша учётная запись. Пароли хранятся в&nbsp;виде хеша, доступ
              к&nbsp;данным ограничен, передача между браузером и&nbsp;сервером защищена
              шифрованием. После удаления аккаунта связанные с&nbsp;ним данные удаляются
              или&nbsp;обезличиваются, если иное не&nbsp;требуется законом.
            </p>
          </Section>

          <Section n="6" title="Ваши права">
            <p style={body}>Вы&nbsp;вправе:</p>
            <ul style={{ paddingLeft: 0, listStyle: "none", margin: 0 }}>
              <li style={li}>- получить сведения об&nbsp;обработке ваших данных;</li>
              <li style={li}>- уточнить, изменить или&nbsp;удалить свои данные;</li>
              <li style={li}>- отозвать согласие на&nbsp;обработку и&nbsp;удалить учётную запись;</li>
              <li style={li}>- направить жалобу в&nbsp;уполномоченный орган по&nbsp;защите прав субъектов данных.</li>
            </ul>
            <p style={body}>
              Для&nbsp;этого напишите на&nbsp;<b>royalharmony@mail.ru</b>. Мы&nbsp;ответим
              в&nbsp;срок, установленный законом.
            </p>
          </Section>

          <Section n="7" title="Cookies">
            <p style={body}>
              Сайт использует cookies и&nbsp;локальное хранилище браузера, чтобы вы&nbsp;оставались
              в&nbsp;системе после входа и&nbsp;чтобы Сайт работал корректно. Вы&nbsp;можете отключить
              cookies в&nbsp;настройках браузера, но&nbsp;тогда вход в&nbsp;личный кабинет может стать
              недоступен.
            </p>
          </Section>

          <Section n="8" title="Изменения политики">
            <p style={body}>
              Мы&nbsp;можем обновлять эту Политику. Действующая редакция всегда размещена
              на&nbsp;этой странице с&nbsp;указанием даты. Существенные изменения вступают в&nbsp;силу
              с&nbsp;момента публикации.
            </p>
          </Section>

          <div style={{ borderTop: "1px solid rgba(0,0,0,0.12)", paddingTop: m ? 28 : 36, marginTop: m ? 8 : 12, display: "flex", flexWrap: "wrap", gap: 16, alignItems: "center", justifyContent: "space-between" }}>
            <div style={{ fontFamily: "'JetBrains Mono', ui-monospace, monospace", fontSize: 11, letterSpacing: "0.1em", color: "rgba(0,0,0,0.5)", textTransform: "uppercase" }}>
              Редакция · 02.06.2026
            </div>
            <GhostButton onClick={() => setRoute("contact")} style={{ background: "var(--ink)", color: "var(--cream)" }}>
              Связаться с&nbsp;нами
            </GhostButton>
          </div>
        </div>
      </Container>
    </div>
  );
}

/* =========================================================
   ПОКУПАТЕЛЯМ
   Публичная оферта + права потребителя (ЗоЗПП №2300-1, ст. 26.1 о
   дистанционной торговле). Учитывает, что многие изделия делаются
   под заказ (индивидуально-определённые - возврату надлежащего
   качества не подлежат). Тексты - без длинного тире.
   ========================================================= */
function BuyersPage({ setRoute }) {
  const m = useIsMobile();

  const sectionTitle = {
    fontFamily: "'Cormorant Garamond', serif", fontWeight: 300, fontStyle: "italic",
    fontSize: m ? 24 : 30, lineHeight: 1.15, margin: "0 0 16px", color: "var(--ink)",
    letterSpacing: "-0.005em",
  };
  const body = {
    fontFamily: "'Manrope', sans-serif", fontSize: m ? 14.5 : 15.5, lineHeight: 1.8,
    color: "rgba(0,0,0,0.72)", margin: "0 0 14px", maxWidth: 760,
  };
  const li = { ...body, margin: "0 0 8px" };
  const num = {
    fontFamily: "'Cormorant Garamond', serif", fontStyle: "italic",
    fontSize: m ? 22 : 26, color: "var(--accent)", lineHeight: 1, minWidth: 44,
  };

  const Section = ({ n, title, children }) => (
    <section style={{ display: "flex", gap: m ? 16 : 28, alignItems: "flex-start", padding: m ? "28px 0" : "36px 0", borderTop: "1px solid rgba(0,0,0,0.12)" }}>
      <div style={num}>{n}</div>
      <div style={{ flex: 1 }}>
        <h2 style={sectionTitle}>{title}</h2>
        {children}
      </div>
    </section>
  );

  return (
    <div style={{ paddingTop: m ? 96 : 140, paddingBottom: m ? 80 : 140 }}>
      <Container>
        <SectionHeading
          kicker="Royal Harmony"
          title="Покупателям -<br/><em>оферта, оплата и&nbsp;возврат</em>."
          side="Условия заказа, доставки и&nbsp;возврата, а&nbsp;также ваши права как&nbsp;покупателя. Редакция от&nbsp;2&nbsp;июня&nbsp;2026&nbsp;года."
        />

        <div style={{ maxWidth: 860 }}>
          <p style={{ ...body, marginTop: m ? 8 : 16 }}>
            Эти условия определяют порядок оформления, оплаты, доставки и&nbsp;возврата
            изделий, заказанных у&nbsp;Royal&nbsp;Harmony, и&nbsp;разработаны с&nbsp;учётом
            Закона&nbsp;РФ от&nbsp;07.02.1992 №&nbsp;2300-1 «О&nbsp;защите прав потребителей»
            и&nbsp;Гражданского кодекса&nbsp;РФ. Размещённая на&nbsp;сайте информация о&nbsp;товарах
            является публичной офертой; оформление заказа означает согласие с&nbsp;этими условиями.
          </p>

          <Section n="1" title="Продавец">
            <p style={body}>
              Продавец&nbsp;- Индивидуальный предприниматель Иманалиев Юсуп Иманалиевич
              (бренд Royal&nbsp;Harmony).
            </p>
            <ul style={{ paddingLeft: 0, listStyle: "none", margin: "0 0 6px" }}>
              <li style={li}>- ОГРНИП: 323057100108871;</li>
              <li style={li}>- ИНН: 053409980892;</li>
              <li style={li}>- регион регистрации: Республика Дагестан, г.&nbsp;Махачкала;</li>
              <li style={li}>- для&nbsp;обращений и&nbsp;претензий: <b>royalharmony@mail.ru</b>.</li>
            </ul>
          </Section>

          <Section n="2" title="Товары и цены">
            <p style={body}>
              Большинство изделий изготавливается вручную и&nbsp;под&nbsp;заказ, поэтому
              возможны незначительные отличия оттенка кожи, фактуры и&nbsp;размеров
              от&nbsp;изображений на&nbsp;сайте&nbsp;- это не&nbsp;является недостатком товара.
              Точная цена, комплектация и&nbsp;срок изготовления подтверждаются при&nbsp;оформлении
              заказа. Цены указаны в&nbsp;рублях.
            </p>
          </Section>

          <Section n="3" title="Оформление и оплата">
            <p style={body}>
              Заказ оформляется через контакты, указанные на&nbsp;сайте (почта, телефон,
              мессенджеры). Состав заказа, стоимость, способ и&nbsp;сроки оплаты, изготовления
              и&nbsp;доставки согласовываются индивидуально и&nbsp;фиксируются до&nbsp;начала работ.
              Для&nbsp;индивидуальных изделий может потребоваться предоплата.
            </p>
          </Section>

          <Section n="4" title="Изготовление и доставка">
            <p style={body}>
              Срок изготовления зависит от&nbsp;изделия и&nbsp;сообщается при&nbsp;оформлении
              заказа. Доставка осуществляется по&nbsp;России и&nbsp;за&nbsp;её пределами
              транспортными и&nbsp;курьерскими службами; стоимость и&nbsp;сроки доставки
              согласовываются отдельно. Риск случайной гибели или&nbsp;повреждения товара
              переходит к&nbsp;покупателю с&nbsp;момента передачи товара покупателю или&nbsp;перевозчику.
            </p>
          </Section>

          <Section n="5" title="Возврат и обмен">
            <p style={body}>
              <b>Товар надлежащего качества.</b> При&nbsp;дистанционной продаже покупатель
              вправе отказаться от&nbsp;товара в&nbsp;любое время до&nbsp;его передачи,
              а&nbsp;после передачи&nbsp;- в&nbsp;течение 7&nbsp;дней (ст.&nbsp;26.1 Закона
              «О&nbsp;защите прав потребителей»), если сохранены товарный вид, потребительские
              свойства и&nbsp;документ, подтверждающий покупку. Возврату не&nbsp;подлежит товар
              надлежащего качества, имеющий индивидуально-определённые свойства, то&nbsp;есть
              изготовленный по&nbsp;индивидуальному заказу покупателя (размеры, тон, монограмма
              и&nbsp;иная персонализация).
            </p>
            <p style={body}>
              <b>Товар ненадлежащего качества.</b> Если в&nbsp;изделии обнаружен недостаток,
              покупатель вправе предъявить требования, предусмотренные Законом
              «О&nbsp;защите прав потребителей»&nbsp;- на&nbsp;замену, соразмерное уменьшение цены,
              безвозмездное устранение недостатков или&nbsp;возврат уплаченной суммы. Доставка
              крупногабаритного или&nbsp;некачественного товара для&nbsp;возврата и&nbsp;обмена
              осуществляется силами и&nbsp;за&nbsp;счёт продавца.
            </p>
            <p style={body}>
              Для&nbsp;возврата или&nbsp;обмена напишите на&nbsp;<b>royalharmony@mail.ru</b>
              с&nbsp;описанием изделия и&nbsp;причины. Возврат денежных средств производится
              тем&nbsp;же способом, которым была произведена оплата, в&nbsp;срок не&nbsp;позднее
              10&nbsp;дней с&nbsp;момента предъявления соответствующего требования.
            </p>
          </Section>

          <Section n="6" title="Качество и гарантия">
            <p style={body}>
              Мы&nbsp;отвечаем за&nbsp;качество материалов и&nbsp;сборки. На&nbsp;изделия
              распространяются права потребителя, установленные законом; при&nbsp;наличии
              согласованного гарантийного срока он&nbsp;указывается в&nbsp;документах к&nbsp;заказу.
              Гарантия не&nbsp;распространяется на&nbsp;естественный износ, а&nbsp;также повреждения,
              возникшие из-за&nbsp;нарушения правил эксплуатации и&nbsp;ухода.
            </p>
          </Section>

          <Section n="7" title="Права потребителя и споры">
            <p style={body}>
              Права покупателя как&nbsp;потребителя защищены Законом&nbsp;РФ
              «О&nbsp;защите прав потребителей». Спорные вопросы мы&nbsp;стремимся решать
              в&nbsp;досудебном порядке: направьте претензию на&nbsp;<b>royalharmony@mail.ru</b>,
              и&nbsp;мы&nbsp;ответим в&nbsp;установленный законом срок. При&nbsp;недостижении согласия
              покупатель вправе обратиться в&nbsp;Роспотребнадзор или&nbsp;в&nbsp;суд в&nbsp;порядке,
              предусмотренном законодательством&nbsp;РФ.
            </p>
          </Section>

          <div style={{ borderTop: "1px solid rgba(0,0,0,0.12)", paddingTop: m ? 28 : 36, marginTop: m ? 8 : 12, display: "flex", flexWrap: "wrap", gap: 16, alignItems: "center", justifyContent: "space-between" }}>
            <div style={{ fontFamily: "'JetBrains Mono', ui-monospace, monospace", fontSize: 11, letterSpacing: "0.1em", color: "rgba(0,0,0,0.5)", textTransform: "uppercase" }}>
              Редакция · 02.06.2026
            </div>
            <GhostButton onClick={() => setRoute("contact")} style={{ background: "var(--ink)", color: "var(--cream)" }}>
              Связаться с&nbsp;нами
            </GhostButton>
          </div>
        </div>
      </Container>
    </div>
  );
}

/* =========================================================
   FOOTER
   ========================================================= */
function Footer({ setRoute }) {
  const m = useIsMobile();
  return (
    <footer style={{ background: "var(--ink)", color: "var(--cream)", padding: m ? "56px 0 28px" : "80px 0 32px", marginTop: m ? 56 : 80 }}>
      <Container>
        <div style={{ display: "grid", gridTemplateColumns: m ? "1fr 1fr" : "1.4fr 1fr 1fr 1fr", gap: m ? 32 : 64 }}>
          <div style={m ? { gridColumn: "1 / -1" } : undefined}>
            <div style={{
              fontFamily: "'Cormorant Garamond', serif", fontWeight: 300,
              fontSize: m ? 26 : 32, letterSpacing: "0.28em", textTransform: "uppercase",
            }}>Royal Harmony</div>
            <div style={{
              fontFamily: "'Manrope', sans-serif",
              fontSize: 10, letterSpacing: "0.4em", marginTop: 6, color: "rgba(255,255,255,0.5)",
            }}>ROYAL HARMONY · 2001 → 2026</div>
            <p style={{ fontFamily: "'Manrope', sans-serif", fontSize: 13, lineHeight: 1.7, color: "rgba(255,255,255,0.65)", marginTop: 28, maxWidth: 340 }}>
              С&nbsp;2001 года собираем в&nbsp;дорогу - в&nbsp;путешествие
              и&nbsp;в&nbsp;школу. Чемоданы делаем вручную, сумки -
              по&nbsp;нашим стандартам.
            </p>
          </div>

          <FooterCol title="Чемоданы" items={[
            ["Сундуки", () => setRoute("trunks")],
            ["Круги", () => setRoute("rounds")],
            ["Обувница", () => setRoute("shoecabinet")],
            ["Комплекты", () => setRoute("ensembles")],
          ]} />
          <FooterCol title="Сумки" items={[
            ["Полный каталог", () => setRoute("bags", "all")],
            ["Для джентльменов", () => setRoute("bags", "gentlemen")],
            ["Для принцесс", () => setRoute("bags", "princesses")],
          ]} />
          <FooterCol title="Royal Harmony" items={[
            ["О нас", () => setRoute("about")],
            ["Контакты", () => setRoute("contact")],
            ["Покупателям и возврат", () => setRoute("buyers")],
            ["Политика конфиденциальности", () => setRoute("privacy")],
          ]} />
        </div>

        <div style={{ borderTop: "1px solid rgba(255,255,255,0.14)", marginTop: m ? 48 : 72, paddingTop: 24, display: "flex", flexWrap: "wrap", gap: m ? 8 : 24, justifyContent: "space-between", fontFamily: "'JetBrains Mono', ui-monospace, monospace", fontSize: 10, letterSpacing: "0.16em", textTransform: "uppercase", color: "rgba(255,255,255,0.4)" }}>
          <span>© 2026 Royal Harmony</span>
          <span>Чемоданы&nbsp;-&nbsp;ручная&nbsp;работа</span>
          <span style={{ fontFamily: "'Cormorant Garamond', serif", textTransform: "none", letterSpacing: "0.1em", fontSize: 13, color: "rgba(255,255,255,0.55)" }}>Mr</span>
          <span>RU · EN&nbsp;по&nbsp;запросу</span>
        </div>
      </Container>
    </footer>
  );
}
function FooterCol({ title, items }) {
  return (
    <div>
      <div style={{ fontFamily: "'Manrope', sans-serif", fontSize: 11, letterSpacing: "0.22em", textTransform: "uppercase", color: "rgba(255,255,255,0.5)", marginBottom: 18 }}>{title}</div>
      <ul style={{ listStyle: "none", padding: 0, margin: 0, display: "flex", flexDirection: "column", gap: 10 }}>
        {items.map(([l, fn], i) => (
          <li key={i}>
            <button onClick={fn} style={{
              all: "unset", cursor: "pointer",
              fontFamily: "'Manrope', sans-serif", fontSize: 13,
              color: "rgba(255,255,255,0.85)",
            }}>{l}</button>
          </li>
        ))}
      </ul>
    </div>
  );
}

Object.assign(window, { HomePage, TrunksPage, RoundsPage, ShoeCabinetPage, EnsemblesPage, EnsembleDetailPage, BagsPage, CustomPage, AboutPage, ContactPage, PrivacyPage, BuyersPage, Footer });
