/* TDD — root app + Tweaks integration */
const { useState: useSt, useEffect: useEf, useRef: useRf } = React;
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"palette": "brass-moss",
"displayFont": "Cormorant Garamond",
"audience": "trade",
"heroImage": "orange",
"density": "editorial"
}/*EDITMODE-END*/;
const PALETTES = {
"brass-moss": {
name: "Brass + Moss",
swatches: ["#9A7A3E", "#38483A", "#B25A66"],
vars: { "--brass": "#9A7A3E", "--brass-deep": "#6F5828", "--moss": "#38483A", "--rose": "#B25A66" },
},
"teal-rose": {
name: "Teal + Rose",
swatches: ["#2E6E6A", "#234B49", "#B65C6A"],
vars: { "--brass": "#2E6E6A", "--brass-deep": "#234B49", "--moss": "#3A2F36", "--rose": "#B65C6A" },
},
"terracotta-sage": {
name: "Terracotta + Sage",
swatches: ["#B86A4A", "#5B6B52", "#C09553"],
vars: { "--brass": "#B86A4A", "--brass-deep": "#8A4D32", "--moss": "#3F4D38", "--rose": "#C09553" },
},
"ink-cream": {
name: "Ink + Cream",
swatches: ["#2A2620", "#6E6253", "#B25A66"],
vars: { "--brass": "#6E6253", "--brass-deep": "#3A332B", "--moss": "#26221C", "--rose": "#B25A66" },
},
};
const FONT_OPTIONS = [
{ key: "Cormorant Garamond", label: "Cormorant" },
{ key: "Fraunces", label: "Fraunces" },
{ key: "Playfair Display", label: "Playfair" },
];
function TweaksPanel({ tweaks, setTweak, onClose }) {
return (
Tweaks
Palette
{Object.entries(PALETTES).map(([k, p]) => (
))}
Display font
{FONT_OPTIONS.map(f => (
))}
Audience-first copy
Hero scene
Density
);
}
function App() {
const [route, setRoute] = useSt("home");
const [brandSlug, setBrandSlug] = useSt(null);
const [locale, setLocale] = useSt("en");
const [tweaks, setTweaks] = useSt(TWEAK_DEFAULTS);
const [tweaksOpen, setTweaksOpen] = useSt(false);
const dir = locale === "ar" ? "rtl" : "ltr";
// Sync palette + font + density to CSS vars
useEf(() => {
const p = PALETTES[tweaks.palette] || PALETTES["brass-moss"];
Object.entries(p.vars).forEach(([k, v]) => document.documentElement.style.setProperty(k, v));
document.documentElement.style.setProperty("--serif", `"${tweaks.displayFont}", "EB Garamond", Georgia, serif`);
document.documentElement.setAttribute("dir", dir);
document.body.style.fontFamily = locale === "ar" ? "var(--arabic)" : "var(--sans)";
// Density
if (tweaks.density === "compact") {
document.documentElement.style.setProperty("--section-y", "70px");
} else {
document.documentElement.style.setProperty("--section-y", "110px");
}
}, [tweaks, locale, dir]);
// Edit mode protocol (Tweaks)
useEf(() => {
function onMsg(e) {
if (!e.data || typeof e.data !== "object") return;
if (e.data.type === "__activate_edit_mode") setTweaksOpen(true);
if (e.data.type === "__deactivate_edit_mode") setTweaksOpen(false);
}
window.addEventListener("message", onMsg);
window.parent.postMessage({ type: "__edit_mode_available" }, "*");
return () => window.removeEventListener("message", onMsg);
}, []);
function setTweak(k, v) {
setTweaks(t => {
const next = { ...t, [k]: v };
window.parent.postMessage({ type: "__edit_mode_set_keys", edits: { [k]: v } }, "*");
return next;
});
}
function navigate(r) {
setRoute(r);
setBrandSlug(null);
window.scrollTo({ top: 0, behavior: "smooth" });
}
function openBrand(slug) {
setBrandSlug(slug);
setRoute("brand");
window.scrollTo({ top: 0, behavior: "smooth" });
}
function closeTweaks() {
setTweaksOpen(false);
window.parent.postMessage({ type: "__edit_mode_dismissed" }, "*");
}
const audience = tweaks.audience;
const setAudience = (a) => setTweak("audience", a);
let page;
if (route === "home") page = ;
else if (route === "brands") page = ;
else if (route === "brand") page = ;
else if (route === "materials") page = ;
else if (route === "studio") page = navigate("contact")} />;
else if (route === "about") page = ;
else if (route === "contact") page = ;
return (
<>
{page}
{tweaksOpen && }
>
);
}
const root = ReactDOM.createRoot(document.getElementById("app"));
root.render();