/* sema ikutoke Collections — main App */
const { useState: useStateA, useEffect: useEffectA } = React;
function App() {
const [tweaks, setTweak] = useTweaks(TWEAK_DEFAULTS);
const [view, setView] = useStateA("landing");
const [page, setPage] = useStateA(window.DEFAULT_PAGE);
const [checkoutOpen, setCheckoutOpen] = useStateA(false);
const goto = (v) => {
if (v === "checkout") {
// For drawer/modal variants, open overlay over storefront.
if (tweaks.checkout !== "page") {
setView("store");
setCheckoutOpen(true);
return;
}
}
setCheckoutOpen(false);
setView(v);
window.scrollTo({ top: 0, behavior: "instant" });
};
// Apply palette + pair via data attrs on root
useEffectA(() => {
document.documentElement.setAttribute("data-palette", tweaks.palette);
document.documentElement.setAttribute("data-pair", tweaks.pair);
}, [tweaks.palette, tweaks.pair]);
const item = {
name: page.find((b) => b.type === "hero")?.data.title || "Field Notes Vol. 03",
price: page.find((b) => b.type === "buybar")?.data.price || "1,200",
};
const onBuy = () => {
if (tweaks.checkout === "page") setView("checkout");
else setCheckoutOpen(true);
};
const closeCheckout = () => setCheckoutOpen(false);
const onCheckoutSuccess = () => {
setCheckoutOpen(false);
setTimeout(() => setView("dashboard"), 200);
};
return (
{view === "landing" &&
}
{view === "signup" &&
}
{view === "templates" &&
}
{view === "channels" &&
}
{view === "dashboard" &&
}
{view === "builder" && (
)}
{view === "store" && (
)}
{view === "checkout" && tweaks.checkout === "page" && (
)}
{checkoutOpen && tweaks.checkout === "drawer" && (
)}
{checkoutOpen && tweaks.checkout === "modal" && (
)}
setTweak("palette", v)} />
setTweak("pair", v)}
/>
setTweak("hero", v)}
/>
setTweak("pricing", v)}
/>
setTweak("checkout", v)}
/>
{ setView("store"); setTimeout(onBuy, 100); }} />
setTweak("canvas", v)}
/>
);
}
/* Custom palette swatch row (since our palettes use named keys, not raw colors) */
const PALETTE_PREVIEWS = {
cream: ["#F1E8D1", "#161210", "#E14118"],
ink: ["#14110D", "#F2EAD2", "#F1582E"],
moss: ["#E8E5D7", "#1B2618", "#C2421A"],
blush: ["#F4DCD2", "#2A1813", "#5D2BD0"],
};
function PaletteSwatches({ value, onChange }) {
return (
{Object.entries(PALETTE_PREVIEWS).map(([k, colors]) => (
))}
);
}
function TypePreview({ pair }) {
const pairs = {
editorial: { serif: "Instrument Serif", sans: "Geist" },
modern: { serif: "Newsreader", sans: "Manrope" },
classic: { serif: "DM Serif Display", sans: "Space Grotesk" },
};
const p = pairs[pair];
return (
Field Notes
{p.serif} · {p.sans}
);
}
ReactDOM.createRoot(document.getElementById("root")).render();