Primitive · Composition
The Aodann editor and the public renderer share one model: named compositions (CTA, Frame, Feature Grid) built from reusable primitives (Stack, Heading, Body, Action, …), driven by a declarative recipe stored as data.
This section is the durable reference for that model. It complements the working code in packages/page-renderer and apps/editor, and it grows as understanding does.
Where to start
- Learning Log — running discussion of questions about the model, with answers. The page evolves as new questions land.
- Interactive map — clickable diagram of clusters and files. Hover anything to add a comment; the map writes answers back via the doc itself.
The shape, in one paragraph
A composition (CTA, Frame, Feature Grid) is described once as a recipe — a tree of layout nodes (Stack, Cluster, Grid) with slot leaves that bind to fields on saved data (node.props). One runtime walks that recipe and renders it twice: once with editable controls for the editor, once with read-only output for the public renderer. The recipe is the single source of truth for both surfaces.
Status as of 2026-05-29
Frame,CTA, andFeature Gridmigrated to the shared recipe runtime.Hero,ProsePanel,MediaShowcasestill bespoke, by design.repeaterNode.tsxshrank from 2,023 → 592 lines as Feature Grid migrated.- Scope (
topLevelvsframeChild) propagates via React context on the editor side and explicit arg on the public side (Next server components can’t use context). - Tokens layer is still hardcoded to Aretetic; formalization is deferred until site #2.