// Rhyme Compass LP — app shell: nav, tweaks, reveal, mount

const NAV_LINKS = [
  { href: "#problems", label: "課題" },
  { href: "#features", label: "機能" },
  { href: "#takes", label: "テイク" },
  { href: "#roadmap", label: "Roadmap" },
  { href: "#pricing", label: "料金" },
];

function Navbar() {
  const [scrolled, setScrolled] = React.useState(false);
  const [open, setOpen] = React.useState(false);
  React.useEffect(() => {
    const onScroll = () => setScrolled(window.scrollY > 60);
    window.addEventListener("scroll", onScroll, { passive: true });
    return () => window.removeEventListener("scroll", onScroll);
  }, []);
  return (
    <nav className={`nav ${scrolled ? "nav--scrolled" : ""}`}>
      <div className="nav__inner">
        <a href="#top" className="nav__logo"><i className="ph ph-compass" />Rhyme Compass</a>
        <div className="nav__links">
          {NAV_LINKS.map((l) => <a key={l.href} href={l.href} className="nav__link">{l.label}</a>)}
        </div>
        <div className="nav__cta-wrap"><a href="https://app.rhymecompass.com" className="nav__cta">無料で使う</a></div>
        <button className="nav__burger" onClick={() => setOpen(!open)} aria-label="Menu">
          <span /><span /><span />
        </button>
      </div>
      <div className={`mobile-menu ${open ? "mobile-menu--open" : ""}`}>
        <div className="mobile-menu__inner">
          {NAV_LINKS.map((l) => <a key={l.href} href={l.href} onClick={() => setOpen(false)}>{l.label}</a>)}
          <a href="https://app.rhymecompass.com" onClick={() => setOpen(false)}>無料で使う</a>
        </div>
      </div>
    </nav>
  );
}

// ---- accent palettes — defaults map to DS domain gradient tokens ----
const ACCENTS = {
  "Cyber Blue": { grad: "var(--gradient-apps)", ink: "#a5b4fc",
    soft: "rgba(99,102,241,.12)", line: "rgba(99,102,241,.32)", glow: "rgba(49,46,129,.28)" },
  "Neon Tech": { grad: "linear-gradient(135deg,#22d3ee,#38bdf8,#818cf8)", ink: "#7dd3fc",
    soft: "rgba(56,189,248,.12)", line: "rgba(56,189,248,.32)", glow: "rgba(8,47,73,.4)" },
  "Music": { grad: "var(--gradient-music)", ink: "#fcd34d",
    soft: "rgba(245,158,11,.12)", line: "rgba(245,158,11,.32)", glow: "rgba(127,29,29,.3)" },
};
const HERO_BGS = { "コンパス": "assets/bg-compass.jpg", "聖堂": "assets/bg-cathedral.jpg", "星雲": "assets/bg-nebula.jpg" };

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "accent": "Cyber Blue",
  "headFont": "Geist",
  "heroBg": "コンパス",
  "headline": "「文字数パズル」",
  "loopDemo": true
}/*EDITMODE-END*/;

function App() {
  const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);

  // apply accent + font + hero bg to CSS vars
  React.useEffect(() => {
    const a = ACCENTS[t.accent] || ACCENTS["Cyber Blue"];
    const r = document.documentElement.style;
    r.setProperty("--grad-accent", a.grad);
    r.setProperty("--accent-ink", a.ink);
    r.setProperty("--accent-soft", a.soft);
    r.setProperty("--accent-line", a.line);
    r.setProperty("--accent-glow", a.glow);
    r.setProperty("--head-font", t.headFont === "Geist Mono" ? "var(--font-mono)" : "var(--font-sans)");
    BG.compass = HERO_BGS[t.heroBg] || HERO_BGS["コンパス"];
  }, [t.accent, t.headFont, t.heroBg]);

  // reveal-on-scroll. Content is visible by default; we only arm the hidden
  // state via <html class="anim"> when JS runs, then reveal. A hard safety net
  // guarantees nothing can stay invisible even if IntersectionObserver misbehaves.
  React.useEffect(() => {
    const root = document.documentElement;
    const els = Array.from(document.querySelectorAll(".reveal"));
    const show = (e) => e.classList.add("in");
    if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
      els.forEach(show); return;
    }
    root.classList.add("anim");
    const vh = () => window.innerHeight || 800;
    els.forEach((e) => { if (e.getBoundingClientRect().top < vh() * 0.95) show(e); });
    let io;
    if ("IntersectionObserver" in window) {
      io = new IntersectionObserver((ents) => {
        ents.forEach((e) => { if (e.isIntersecting) { show(e.target); io.unobserve(e.target); } });
      }, { threshold: 0.12, rootMargin: "0px 0px -6% 0px" });
      els.forEach((e) => { if (!e.classList.contains("in")) io.observe(e); });
    }
    const onScroll = () => els.forEach((e) => { if (!e.classList.contains("in") && e.getBoundingClientRect().top < vh()) show(e); });
    window.addEventListener("scroll", onScroll, { passive: true });
    const t1 = setTimeout(onScroll, 1200);
    const t2 = setTimeout(() => els.forEach(show), 3000); // hard safety net
    return () => { if (io) io.disconnect(); window.removeEventListener("scroll", onScroll); clearTimeout(t1); clearTimeout(t2); };
  }, []);

  // patch hero headline highlight from tweak
  const phrases = HERO_PHRASES;

  return (
    <React.Fragment>
      <Navbar />
      <HeroTweaked headline={t.headline} bg={t.heroBg} phrases={phrases} />
      <Problems />
      <Features />
      <Takes />
      <Target />
      <Roadmap />
      <Pricing />
      <Finale />

      <TweaksPanel>
        <TweakSection label="Brand accent" />
        <TweakRadio label="アクセント" value={t.accent}
          options={["Cyber Blue", "Neon Tech", "Music"]} onChange={(v) => setTweak("accent", v)} />
        <TweakSection label="Typography" />
        <TweakRadio label="見出しフォント" value={t.headFont}
          options={["Geist", "Geist Mono"]} onChange={(v) => setTweak("headFont", v)} />
        <TweakSection label="Hero" />
        <TweakSelect label="背景画像" value={t.heroBg}
          options={["コンパス", "聖堂", "星雲"]} onChange={(v) => setTweak("heroBg", v)} />
        <TweakText label="キャッチコピー強調語" value={t.headline}
          onChange={(v) => setTweak("headline", v)} />
      </TweaksPanel>
    </React.Fragment>
  );
}

// Hero variant that injects the tweakable headline + bg without editing sections.jsx
function HeroTweaked({ headline, bg, phrases }) {
  return (
    <section id="top" className="section bg-section hero">
      <div className="bg" style={{ backgroundImage: `url(${HERO_BGS[bg] || HERO_BGS["コンパス"]})` }} />
      <div className="scrim" />
      <div className="section__inner">
        <div className="hero__grid">
          <div>
            <span className="pill"><i className="ph ph-compass" />登録不要・3秒でスタート</span>
            <h1>
              メロ先作詞の<br /><span className="grad">{headline}</span>を、<br />一瞬で解決する。
            </h1>
            <p className="hero__lead">
              <b style={{ color: "var(--zinc-100)", fontWeight: 500 }}>Rhyme&nbsp;Compass</b>は、MIDIを読み込むだけでフレーズを自動分割し、
              音数の過不足をリアルタイムに可視化する、作曲家・作詞家のためのスマート歌詞エディタ。
            </p>
            <div className="hero__cta">
              <Btn variant="primary" size="lg" href="https://app.rhymecompass.com">無料で今すぐ使う</Btn>
              <Btn variant="secondary" href="#features" iconRight>機能を見る</Btn>
            </div>
            <div className="hero__sub">
              <i className="ph-fill ph-check-circle" />アカウント登録なし。ブラウザを開けば、すぐ書き始められます。
            </div>
            <div className="hero__chips">
              <span className="hero__chip">MIDI インポート</span>
              <span className="hero__chip">音数バリデーション</span>
              <span className="hero__chip">.svp 書き出し</span>
              <span className="hero__chip">テイク管理</span>
            </div>
          </div>
          <div>
            <RcEditor phrases={phrases} pitch={HERO_PITCH} />
          </div>
        </div>
      </div>
    </section>
  );
}

const _rcRootEl = document.getElementById("rc-app");
if (!_rcRootEl.__rcMounted) {
  _rcRootEl.__rcMounted = true;
  ReactDOM.createRoot(_rcRootEl).render(<App />);
}
