/* global React, ReactDOM */
const { useState: useStateA, useEffect: useEffectA } = React;
/* =========================================================
APP ROOT — router, providers, cart state
========================================================= */
function App() {
const route = useRoute();
const [lang, setLang] = useStateA("en");
const [cart, setCart] = useStateA([]);
const [cartOpen, setCartOpen] = useStateA(false);
const [toast, setToast] = useStateA("");
// Tweaks — defaults wrapped for EDITMODE persistence
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"palette": "gold",
"density": "default",
"hero": "maker",
"showOOAKBadges": true,
"introQuote": "This is luxury now. The handmade and unique."
}/*EDITMODE-END*/;
const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
// Apply tweaks at document level
useEffectA(() => {
document.documentElement.setAttribute("data-palette", t.palette);
document.documentElement.setAttribute("data-density", t.density);
document.documentElement.setAttribute("data-ooak", t.showOOAKBadges ? "on" : "off");
document.documentElement.setAttribute("dir", lang === "ar" ? "rtl" : "ltr");
document.documentElement.lang = lang;
}, [t.palette, t.density, t.showOOAKBadges, lang]);
// Cart helpers
const addToCart = (p, qty = 1) => {
setCart((prev) => {
const i = prev.findIndex(x => x.id === p.id);
if (i >= 0) {
const next = prev.slice();
next[i] = { ...next[i], qty: next[i].qty + qty };
return next;
}
return [...prev, { id: p.id, name: p.name, img: p.img, price: p.price, type: p.type, material: p.material, qty }];
});
setToast("Added to bag · " + p.name.slice(0, 40));
setTimeout(() => setToast(""), 2200);
setCartOpen(true);
};
const removeFromCart = (id) => setCart((prev) => prev.filter(x => x.id !== id));
const setQty = (id, q) => setCart((prev) => {
if (q < 1) return prev.filter(x => x.id !== id);
return prev.map(x => x.id === id ? { ...x, qty: q } : x);
});
const ctx = {
route, lang, setLang,
cart, addToCart, removeFromCart, setQty,
cartOpen, openCart: () => setCartOpen(true), closeCart: () => setCartOpen(false),
toast,
palette: t.palette, density: t.density, hero: t.hero,
introQuote: t.introQuote, showOOAKBadges: t.showOOAKBadges
};
// Routing
let page;
const segs = route.segments;
if (segs.length === 0) page = ;
else if (segs[0] === "story") page = ;
else if (segs[0] === "fashion") page = ;
else if (segs[0] === "home-decor") page = ;
else if (segs[0] === "sustainability") page = ;
else if (segs[0] === "boutique") page = ;
else if (segs[0] === "contact") page = ;
else if (segs[0] === "journal" && segs[1]) page = ;
else if (segs[0] === "journal") page = ;
else if (segs[0] === "product" && segs[1]) page = ;
else page = ;
// Palette options — first hex is the "primary" for that palette
const palettes = [
["#BF9F58", "#9C6B45", "#33405B"], // gold
["#9C6B45", "#7e5535", "#241B14"], // copper
["#33405B", "#232c40", "#BF9F58"] // indigo
];
const paletteName = { "#BF9F58": "gold", "#9C6B45": "copper", "#33405B": "indigo" };
const currentPalette = palettes.find(p => paletteName[p[0]] === t.palette) || palettes[0];
return (
{page}
setTweak("palette", paletteName[opt[0]])}
/>
setTweak("density", v)}
/>
setTweak("hero", v)}
/>
setTweak("showOOAKBadges", v)}
/>
setTweak("introQuote", v)}
/>
);
}
/* =========================================================
Hide OOAK badges via root flag (CSS in styles.css uses it)
========================================================= */
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render();