/* Stream Translations — main app */
const { useState: useStateA, useEffect: useEffectA, useRef: useRefA } = React;
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"heroVariant": "full",
"headlineTone": "gothic",
"density": "comfortable"
}/*EDITMODE-END*/;
function App() {
const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
const [lang, setLangState] = useStateA(() => localStorage.getItem("st_lang") || "ja");
const [scrollY, setScrollY] = useStateA(0);
const [heroH, setHeroH] = useStateA(800);
const contactRef = useRefA(null);
const c = window.LP_CONTENT[lang];
const setLang = (l) => { setLangState(l); localStorage.setItem("st_lang", l); };
// scroll tracking for parallax + header
useEffectA(() => {
let raf = null;
const onScroll = () => {
if (raf) return;
raf = requestAnimationFrame(() => { setScrollY(window.scrollY); raf = null; });
};
const onResize = () => setHeroH(window.innerHeight);
onResize();
window.addEventListener("scroll", onScroll, { passive: true });
window.addEventListener("resize", onResize);
return () => { window.removeEventListener("scroll", onScroll); window.removeEventListener("resize", onResize); };
}, []);
// apply typography + density tweaks to root
useEffectA(() => {
const root = document.documentElement.style;
if (t.headlineTone === "mincho") {
root.setProperty("--lp-headline-font", '"Noto Serif JP", serif');
root.setProperty("--lp-headline-weight", "600");
} else {
root.setProperty("--lp-headline-font", '"Noto Sans JP", sans-serif');
root.setProperty("--lp-headline-weight", "700");
}
if (t.density === "compact") {
root.setProperty("--lp-section-pad", "84px");
root.setProperty("--lp-gap-scale", "0.7");
} else {
root.setProperty("--lp-section-pad", "120px");
root.setProperty("--lp-gap-scale", "1");
}
}, [t.headlineTone, t.density]);
const scrolled = scrollY > 40;
const overHero = scrollY < heroH - 90;
const parallax = Math.min(scrollY * 0.35, heroH * 0.45);
const onNav = (id) => {
const el = document.getElementById(id);
if (el) window.scrollTo({ top: el.getBoundingClientRect().top + window.scrollY - 64, behavior: "smooth" });
};
const onContact = () => {
const el = contactRef.current;
if (el) window.scrollTo({ top: el.getBoundingClientRect().top + window.scrollY - 50, behavior: "smooth" });
};
return (
setTweak("heroVariant", v)}
/>
setTweak("headlineTone", v)}
/>
setTweak("density", v)}
/>
);
}
ReactDOM.createRoot(document.getElementById("root")).render();