// components-modules.jsx — Belt (三块碑文) + Modules Bento grid. // All hand-drawn module art removed; replaced with PicSlot placeholders. /* ─────────── BELT · 三块碑文 ─────────── */ const ROMAN = ["I", "II", "III"]; function Belt({ items }) { return (
{items.map((it, i) => (
{ROMAN[i] || (i + 1)}

{it.h}

{it.p}

))}
); } /* ─────────── MODULES · Bento Grid ─────────── Layout (12-col): [ Atlas (big · 8) ][ Cast (4) ] [ Outline 4 ][ Codex 4 ][ Library 4 ] [ Agent (12 · wide bottom) ] */ const BENTO_SPAN = { atlas: { cols: 8, tall: true }, characters: { cols: 4, tall: true }, outline: { cols: 4, tall: false }, rules: { cols: 4, tall: false }, library: { cols: 4, tall: false }, agent: { cols: 12, tall: false, wide: true }, }; function ModuleCard({ card, lang }) { const span = BENTO_SPAN[card.kind] || { cols: 4 }; const cls = [ "feature-card", `feature-card--cols-${span.cols}`, span.tall ? "feature-card--tall" : "", span.wide ? "feature-card--wide-row" : "", ].join(" "); return (
{card.tag}

{card.h}

{card.p}

); } function ModulesSection({ copy, lang }) { // Reorder cards to fit the Bento layout: atlas, characters, outline, rules, library, agent const orderKey = ["atlas", "characters", "outline", "rules", "library", "agent"]; const cards = [...copy.moduleCards].sort( (a, b) => orderKey.indexOf(a.kind) - orderKey.indexOf(b.kind) ); return (
{copy.modules.eyebrow}

{copy.modules.title}

{copy.modules.kicker}

{cards.map((c, i) => )}
); } Object.assign(window, { Belt, ModuleCard, ModulesSection });