// Root app — wires everything together + Tweaks const { BrandMark, UtilityStrip, Header, Hero, Marquee, Worlds, Picks, aed } = window.__sfApp1; const { Editorial, HiddenPlayground, Values, Brands, Gifting, Visit, Happenings, Footer, CartDrawer, Toast } = window.__sfApp2; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "palette": "berry", "heroStyle": "magazine", "heroMotifs": true, "headline": "world", "marquee": true, "density": "comfortable" }/*EDITMODE-END*/; // Palette variants — all stay in the brief's spirit (warm paper + berry/sage/sun) const PALETTES = { berry: { label: "Berry (default)", swatch: ["#FBF4EE", "#C0436A", "#7FA66A", "#E9B44C"], vars: {} // brief defaults }, terracotta: { label: "Terracotta morning", swatch: ["#FBF4EE", "#C76B3F", "#7FA66A", "#E9B44C"], vars: { "--primary": "#C76B3F", "--primary-ink": "#9A4F2A", "--focus": "#E27A4F" } }, sage: { label: "Sage hour", swatch: ["#FBF4EE", "#7FA66A", "#C0436A", "#E9B44C"], vars: { "--primary": "#4F7341", "--primary-ink": "#365228", "--focus": "#7FA66A" } }, plum: { label: "Plum dusk", swatch: ["#FBF4EE", "#7B3A66", "#E9B44C", "#7FA66A"], vars: { "--primary": "#7B3A66", "--primary-ink": "#5A2649", "--focus": "#A85C8E" } }, }; function App() { const t = window.useTweaks(TWEAK_DEFAULTS); const tweaks = t[0]; const setTweak = t[1]; const [cart, setCart] = React.useState([]); const [cartOpen, setCartOpen] = React.useState(false); const [toast, setToast] = React.useState(""); const [locale, setLocale] = React.useState("en"); const toastTimer = React.useRef(); // Apply palette CSS vars React.useEffect(() => { const root = document.documentElement; // reset first ["--primary","--primary-ink","--focus"].forEach(v => root.style.removeProperty(v)); const vars = PALETTES[tweaks.palette]?.vars || {}; Object.entries(vars).forEach(([k, v]) => root.style.setProperty(k, v)); }, [tweaks.palette]); // Apply RTL when Arabic is selected React.useEffect(() => { document.documentElement.dir = locale === "ar" ? "rtl" : "ltr"; document.documentElement.lang = locale; }, [locale]); const addToCart = (p) => { if (!p) return; setCart(prev => { const found = prev.find(x => x.id === p.id); if (found) return prev.map(x => x.id === p.id ? { ...x, qty: x.qty + 1 } : x); return [...prev, { ...p, qty: 1 }]; }); setToast(`Added · ${p.title}`); clearTimeout(toastTimer.current); toastTimer.current = setTimeout(() => setToast(""), 1800); }; const changeQty = (id, qty) => setCart(prev => prev.map(x => x.id === id ? { ...x, qty } : x)); const removeItem = (id) => setCart(prev => prev.filter(x => x.id !== id)); const jumpTo = (id) => { if (id === "top") return window.scrollTo({ top: 0, behavior: "smooth" }); const el = document.getElementById(id); if (el) { const y = el.getBoundingClientRect().top + window.scrollY - 90; window.scrollTo({ top: y, behavior: "smooth" }); } }; const cartCount = cart.reduce((s, x) => s + x.qty, 0); // Tweakable hero headline variants const headlineVariants = { world: <>A world of magic
& imagination for
the next generation., curated: <>Objects, curated the way
grown-ups choose art., playground: <>A strawberry tucked
between the galleries., }; return ( <>
setCartOpen(true)} locale={locale} onLocale={setLocale} onJump={jumpTo} /> {tweaks.heroStyle === "magazine" ? ( jumpTo("worlds")} onPlayground={() => jumpTo("playground")} onAdd={addToCart} /> ) : (
{tweaks.heroMotifs && ( <> )}
A curated children's design house

{headlineVariants[tweaks.headline] || headlineVariants.world}

Five hundred and fifteen carefully chosen objects from forty-eight design houses — and a real-life Hidden Playground at Alserkal Avenue, Dubai. Sustainable, design-led, parent-trusted.

515objects in store
48design houses
WH G58Alserkal Avenue, Dubai
Little Lights · Train Hibou Home · Wallpaper
)} {tweaks.marquee && }