/* ============================================================ GEMS Group — App shell + Tweaks (Option C only) ============================================================ */ const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "fontPairing": "arimo", "pillarLayout": "columns", "verifyBadges": true, "animations": true, "showGrid": false }/*EDITMODE-END*/; function App() { const [t, setTweak] = useTweaks(TWEAK_DEFAULTS); useLang(); // subscribe: re-render whole tree on VI/EN switch React.useEffect(() => { document.body.classList.toggle("serif-mode", t.fontPairing === "serif"); document.body.classList.toggle("no-anim", !t.animations); document.body.classList.toggle("show-grid", t.showGrid); document.body.classList.toggle("hide-verify", !t.verifyBadges); }, [t.fontPairing, t.animations, t.showGrid, t.verifyBadges]); return ( <> {t.showGrid && } setTweak("pillarLayout", v)} />

Ba phương án cho section 02: thẻ đứng (Cards), danh mục biên tập (Ledger), thẻ ảnh thương hiệu (Visual).

setTweak("verifyBadges", v)} />

Badge vàng đánh dấu số liệu / nội dung chưa có trong tài liệu GEMS Introduction 2026.

setTweak("fontPairing", v)} />

"Sans only" dùng Plus Jakarta Sans cho toàn bộ. "Serif" thêm Cormorant Garamond cho display heading.

setTweak("animations", v)} /> setTweak("showGrid", v)} />
); } function GridOverlay() { return (
{Array.from({ length: 12 }).map((_, i) => (
))}
); } const root = ReactDOM.createRoot(document.getElementById("root")); root.render();