// Hair L2 — app composition

const { useEffect, useState } = React;

// Re-scans on every render so newly-mounted `.reveal` elements (e.g. when
// switching subcategory layouts via Tweaks) get observed and faded in.
function useHairReveal() {
  React.useEffect(() => {
    const io = new IntersectionObserver((entries) => {
      entries.forEach((e) => {
        if (e.isIntersecting) { e.target.classList.add("in"); io.unobserve(e.target); }
      });
    }, { threshold: 0.08, rootMargin: "0px 0px -40px 0px" });

    const scan = () => {
      document.querySelectorAll(".reveal:not(.in)").forEach((el) => {
        const r = el.getBoundingClientRect();
        if (r.top < window.innerHeight && r.bottom > 0) {
          el.classList.add("in");
        } else {
          io.observe(el);
        }
      });
    };

    scan();
    const mo = new MutationObserver(scan);
    mo.observe(document.body, { childList: true, subtree: true });
    return () => { io.disconnect(); mo.disconnect(); };
  }, []);
}

function HairApp() {
  const [t, setTweak] = useTweaks(window.TWEAK_DEFAULTS);
  useHairReveal();

  React.useEffect(() => {
    const b = document.body;
    b.classList.remove("fp-playfair-dmsans", "fp-dmserif-dmsans", "fp-fraunces-inter");
    b.classList.add(`fp-${t.fontPairing}`);
    b.classList.remove("ac-coral", "ac-oxblood", "ac-champagne", "ac-terracotta", "ac-bronze", "ac-mahogany");
    b.classList.add(`ac-${t.accent}`);
    b.classList.toggle("dark", !!t.dark);
    b.classList.remove("cs-editorial", "cs-rounded", "cs-framed", "cs-minimal");
    b.classList.add(`cs-${t.cardStyle || "editorial"}`);
  }, [t.fontPairing, t.accent, t.dark, t.cardStyle]);

  return (
    <>
      <Header onDark={false} />

      <nav className="crumb" aria-label="Breadcrumb">
        <a href="/">Home</a>
        <span className="sl">/</span>
        <span className="cur">Hair</span>
      </nav>

      <div className="l2" data-screen-label="Hair L2">
        <HairSidebar activeId="hair" />
        <main className="l2-main">
          <HairHero variant={t.heroVariant} />

          <HairSectionHead n="I." eyebrow="The Seven Axes" h={<>Seven ways into the <em>hair</em> chapter.</>} link="Index A–Z" />
          <HairSubcats layout={t.subcatLayout || "spreads"} />

          <HairSectionHead n="II." eyebrow="Hair profile finder · 30 seconds" h={<>First — what kind of <em>hair</em> are we working with?</>} />
          <HairQuiz />

          <HairSectionHead n="III." eyebrow="Order of operations" h={<>The <em>wash-day</em> sequence, scalp to ends.</>} link="Print this" />
          <HairSequenceBuilder />

          <HairSectionHead n="IV." eyebrow="A year, root to tip" h={<>Your hair in <em>four seasons.</em></>} link="Read the series" />
          <HairSeasonal />

          <HairSectionHead n="V." eyebrow="Things we heard, and what's true" h={<>Myth, meet <em>fact.</em></>} />
          <HairMyths />

          {t.showFaq !== false && (
            <>
              <HairSectionHead n="VI." eyebrow="You've asked" h={<>Five <em>honest</em> answers.</>} />
              <HairFAQSection />
            </>
          )}

          <HairSectionHead n={t.showFaq !== false ? "VII." : "VI."} eyebrow="Related — by texture & technique" h={<>Everything else <em>in this</em> chapter.</>} link="Full index" />
          <HairRelated />

          <HairSectionHead n={t.showFaq !== false ? "VIII." : "VII."} eyebrow="From the desk" h={<>More <em>reading.</em></>} link="All from Nelly" />
          <HairReads />

          <HairNextShelf />
        </main>
      </div>

      <NellyTop3 category="hair" />
      <Newsletter />
      <Footer />

      <TweaksPanel>
        <TweakSection label="Subcategories" />
        <TweakRadio label="Layout" value={t.subcatLayout || "spreads"}
          options={[
            {value: "spreads", label: "Spreads"},
            {value: "cards",   label: "Cards"},
            {value: "rows",    label: "Rows"},
          ]}
          onChange={(v) => setTweak("subcatLayout", v)} />

        <TweakSection label="Hero" />
        <TweakRadio label="Variant" value={t.heroVariant}
          options={[
            {value: "cinematic", label: "Cinematic"},
            {value: "text",      label: "Text-first"},
          ]}
          onChange={(v) => setTweak("heroVariant", v)} />

        <TweakSection label="Sections" />
        <TweakToggle label="Show FAQ" value={t.showFaq !== false} onChange={(v) => setTweak("showFaq", v)} />

        <TweakSection label="Typography" />
        <TweakRadio label="Font pairing" value={t.fontPairing}
          options={[
            {value: "playfair-dmsans", label: "Playfair"},
            {value: "dmserif-dmsans",  label: "DM Serif"},
            {value: "fraunces-inter",  label: "Fraunces"},
          ]}
          onChange={(v) => setTweak("fontPairing", v)} />

        <TweakSection label="Accent" />
        <TweakRadio label="Color" value={t.accent}
          options={[
            {value: "coral",      label: "Coral"},
            {value: "oxblood",    label: "Oxblood"},
            {value: "champagne",  label: "Champagne"},
            {value: "terracotta", label: "Terra"},
            {value: "bronze",     label: "Bronze"},
            {value: "mahogany",   label: "Mahogany"},
          ]}
          onChange={(v) => setTweak("accent", v)} />

        <TweakSection label="Theme" />
        <TweakToggle label="Dark mode" value={!!t.dark} onChange={(v) => setTweak("dark", v)} />
      </TweaksPanel>
    </>
  );
}

ReactDOM.createRoot(document.getElementById("root")).render(<HairApp />);
