Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
d960b10
feat: add preset-organism.columns for editor-composed multi-column la…
odenirdev Jul 20, 2026
fbcec58
docs: composition-builder design spec (JSON tree builder replaces DZ …
odenirdev Jul 20, 2026
71f32ec
docs(spec): unify layout-node attrs into one shared curated container…
odenirdev Jul 20, 2026
56012ab
feat(shared): publishable press-shared + PressTree wire contract
odenirdev Jul 20, 2026
660a57a
feat(shared): sanitizing PressTree runtime validator
odenirdev Jul 20, 2026
5c2f582
feat(cms): preset-molecule.link descriptor + curated plain-text atoms…
odenirdev Jul 20, 2026
0e93a11
feat(cms)!: page.body + site-setting.pageDefaults become the builder …
odenirdev Jul 20, 2026
651c71d
feat(cms): preset-layout descriptors + full-palette schema serializat…
odenirdev Jul 20, 2026
46d1071
test(cms): cover preset-layout descriptor registration + container/ro…
odenirdev Jul 20, 2026
a0f1f7d
feat(cms): serve-time hydration of media assetId and page documentId …
odenirdev Jul 20, 2026
1dc540f
fix(cms): batch page-list hydration into one query pair + serve-hydra…
odenirdev Jul 21, 2026
8e6537a
feat(cms): lifecycle validation backstop for composition-tree writes
odenirdev Jul 21, 2026
29e3add
feat(cms): seed pageDefaults once with bare navbar/footer block nodes
odenirdev Jul 21, 2026
8025316
feat(cms-admin): pure immutable tree operations with structural invar…
odenirdev Jul 21, 2026
d8565f4
feat(cms-admin): registry-driven form model (descriptors, container a…
odenirdev Jul 21, 2026
e2721a7
feat(cms-admin): structural composition-builder custom field (tree + …
odenirdev Jul 21, 2026
f4f92f2
feat(web): PressLink + resolveLink — the engine's one link resolver
odenirdev Jul 21, 2026
28013ba
feat(web)!: plain-text atoms + link-descriptor button; blocks AST lea…
odenirdev Jul 21, 2026
0e1a4c8
refactor(web)!: hero/cta/navbar consume the shared link descriptor vi…
odenirdev Jul 21, 2026
1910964
feat(web): curated container-attr → layout-primitive mappings for the…
odenirdev Jul 21, 2026
39e8aec
feat(web)!: pageDefaults slots + one-point engine-block hydration (re…
odenirdev Jul 21, 2026
331efed
feat(web)!: TreeRenderer replaces BlockRenderer; columns organism and…
odenirdev Jul 21, 2026
66282c8
feat(web)!: host renders the tree shell; prose rail rescoped to direc…
odenirdev Jul 21, 2026
06e2071
feat(web)!: generator emits tree-world types (PageBody = PressTree, P…
odenirdev Jul 21, 2026
de9707f
feat(cli)!: seed the demo home as a PressTree + pageDefaults navigati…
odenirdev Jul 21, 2026
1a454ad
fix(cli): publish-readiness reflects press-shared as a published runt…
odenirdev Jul 21, 2026
3291338
fix(shared): drop files allowlist so .npmignore excludes tests from t…
odenirdev Jul 22, 2026
c178078
docs+chore!: playground regenerated for the composition builder; chan…
odenirdev Jul 22, 2026
37e5b12
fix(cms): serialize-schema enumerates the registry via keys()+get(), …
odenirdev Jul 22, 2026
7b64cc5
fix(cms): externalize react/react-dom so the admin builder uses the h…
odenirdev Jul 22, 2026
a75dac9
chore(repo)!: pin the workspace to React 19 to match Strapi 5's admin
odenirdev Jul 22, 2026
2c53f05
feat(cms): enhance composition builder UI with Strapi design system
odenirdev Jul 22, 2026
4df312d
docs(plan): free column spans — plan + design spec
odenirdev Jul 23, 2026
f38c581
feat(shared)!: column spans replace row ratio; PRESS_TREE_VERSION 2
odenirdev Jul 23, 2026
758a695
feat(web)!: render column.span; drop RATIO_SPANS and the Ratio re-export
odenirdev Jul 23, 2026
df19f0b
feat(cms)!: tree-ops setColumnSpan/effectiveSpan; MAX_COLUMNS 12; dro…
odenirdev Jul 23, 2026
c50a1e2
feat(cms)!: builder span controls, 12-track preview bar, tier toggle …
odenirdev Jul 23, 2026
e73fc33
feat(cms)!: drop ratio from the row descriptor; serve tree version 2
odenirdev Jul 23, 2026
a7c6a7e
feat(cli)!: seed spanned columns at tree version 2; generated PresetL…
odenirdev Jul 23, 2026
27d615d
docs+chore!: document column spans; changeset (shared/web/cms major)
odenirdev Jul 23, 2026
c3f333d
docs(cms): fix stale tree-ops header comment (1-4 -> 1-12 columns)
odenirdev Jul 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions .changeset/builder-design-system-ui.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
---
'@ogs-tech/press-cms': patch
'@ogs-tech/create-press': patch
---

fix(cms): rebuild the composition builder UI on Strapi's design-system

The `plugin::press-cms.builder` custom field was raw, unstyled HTML (native
`<select>`/`<details>`/`<fieldset>`, unicode `↑↓✕` controls, raw component uids as
labels) — jarring islands of light-mode browser widgets inside the dark admin,
and hard to read once the tree nested. It is now rebuilt with
`@strapi/design-system` + `@strapi/icons`, so the builder reads as native admin UI:

- Blocks are collapsible cards with a friendly name + icon (derived from the uid
via a new `palette-labels` helper — unmapped/`custom-*` blocks degrade
gracefully) and reorder/remove `IconButton`s.
- Rows and columns are distinct titled cards; container attrs collapse into a
"Layout options" disclosure instead of always-open noise.
- "Add block" opens ONE inline palette grouped by category (this also removes a
duplicate adder that rendered twice per column).
- Per-field forms use design-system inputs (`TextInput`, `Textarea`,
`NumberInput`, `Toggle`, `SingleSelect`, `Field`), and empty slots show a hint.

Rows are now collapsible cards too (with a per-slot "Collapse all" / "Expand all"
control), so a deeply nested page stays scannable instead of exploding every
column and nested row at once.

`@strapi/design-system` and `@strapi/icons` are declared as `peerDependencies` so
`@strapi/sdk-plugin` externalizes them (the builder uses the host admin's single
copy — the same contract as React); a guard test pins this. No wire, schema, or
API change: `tree-ops`/`form-model` and the served `PressSchema` are untouched.

**Scaffold seed (`create-press`)**: the demo home is trimmed from a kitchen-sink
page (hero, list, quote, a nested-row recursion demo, separator, button, spacer,
cta, callout) to a simple, focused showcase of the two things worth demonstrating
up front — the **components** you place (a few blocks plus a note on the wider
palette) and the **grid layout** (one 50-50 row with an image in one column and a
paragraph in the other). The image component still carries the media-crosses-REST
proof. The rest of the palette is meant to be composed in the builder, and a
simple starting page is far easier to edit and test than a pre-filled one.
42 changes: 42 additions & 0 deletions .changeset/columns-organism.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
---
'@ogs-tech/press-cms': minor
'@ogs-tech/press-web': minor
---

feat: `preset-organism.columns` — the first editor-composed layout block

`@ogs-tech/press-cms`:

- **New page-body organism `preset-organism.columns`** (admitted statically in
`page/schema.json`, body only — the hero/cta placement rule). Layout controls
are flat CLOSED enums on the organism (the `hero.align` precedent):
`ratio` (`50-50 | 33-67 | 67-33 | 33-33-33 | 25-25-25-25`), `gap`
(`compact | normal | spacious`), `verticalAlign` (`top | center | bottom`).
The raw `GridGap`/`Span` scales are never exposed to the CMS.
- **New nested-only molecule `preset-molecule.column`** (rich text + optional
image + optional `preset-atom.button` — the `navbar.cta` nesting pattern);
repeatable 2–4 per block, never a DZ member. `preset-layout` stays reserved
and empty: the top-level block is a content ORGANISM that consumes the grid
internally, so "layout is never an editor-placed top-level block" holds.
- **`buildBodyPopulate` deep-populates the columns chain.** `populate: '*'` is
shallow; a column's `image`/`button` sit TWO levels below the DZ member and
silently came back empty — the exact shape that already forced the navbar's
deep populate in the chrome zones.
- Serializer and generator needed **zero code change** — the BFS follows the
two-level chain (`columns → column → button`) generically; new tests pin that.

`@ogs-tech/press-web`:

- **New `Columns` renderer** (`preset-organism.columns` in `organismBlocks`,
overridable like every organism) built on Container/Grid/Column, mirroring
the Hero: stacks at base, `25-25-25-25` goes 2×2 on md before 4-up on lg,
`spacious` gap is tier-scaled (never a flat `lg` — the 11-gap 528px floor).
Tolerant: no columns renders nothing; an empty column keeps its cell; a
column beyond the ratio's slots reuses the last span instead of dropping.
- Cells render rich text via `renderBlocks` + raw `<img>`/`<a>` — NOT the atom
components, whose `data-block="preset-atom.*"` would match the prose-width
rule at any depth and fight the cell's own width.
- theme.css: columns section styles + the per-column button joins the shared
button family (all variants and states).
- New exported types `PresetOrganismColumns` / `PresetMoleculeColumn`; the CLI
seed demonstrates a `33-33-33` block with a nested secondary button.
32 changes: 32 additions & 0 deletions .changeset/composition-builder.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
---
'@ogs-tech/press-shared': major
'@ogs-tech/press-cms': major
'@ogs-tech/press-web': major
'@ogs-tech/create-press': major
---

feat!: composition builder — a JSON PressTree replaces the dynamic-zone mechanism engine-wide

BREAKING (wire + palette + API), no data migration (pre-release):

- `page.body` and the new `site-setting.pageDefaults` store a `PressTree` /
`Node[]` slots via the `plugin::press-cms.builder` JSON custom field; the
page-body and chrome Dynamic Zones (and `dz-populate`) are gone.
- Per-page layout root: header/footer slots (`inherit | none | custom`), rows
with 1–4 ratio-bound columns, full recursion, adopter `custom-*` blocks
anywhere. Curated `container` attrs (`width`/`gap`/`verticalAlign`).
- `@ogs-tech/press-shared` is now a PUBLISHED runtime dependency of press-web:
it ships the tree types + the sanitizing `validatePressTree` validator used
by the cms write path and the web render path.
- Palette: new `preset-molecule.link` (label/page/url/newTab) referenced by
button/hero/cta/navbar; `preset-molecule.nav-item`, `preset-molecule.column`,
`preset-organism.columns` removed. Text atoms store curated PLAIN TEXT
(`content: text`) — the Strapi blocks AST leaves the wire (`renderBlocks`
removed). `preset-layout.{container,row,column}` descriptors drive the
builder's layout forms.
- Serve-time hydration: media `{ assetId }` and page `{ documentId }` refs are
resolved server-side (fresh URLs/slugs; rename-safe internal links).
- Web: `TreeRenderer` (header/main/footer shell) replaces `BlockRenderer`;
`PressLink`/`resolveLink` are the one link resolver; prose rail rescoped to
direct `<main>` children; `PageBody` generates as `PressTree`; the
`HeaderBlocks`/`FooterBlocks` unions are gone.
26 changes: 26 additions & 0 deletions .changeset/free-column-spans.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
'@ogs-tech/press-shared': major
'@ogs-tech/press-web': major
'@ogs-tech/press-cms': major
'@ogs-tech/create-press': patch
---

feat!: free 1–12 column spans per breakpoint, replacing the row ratio enum

BREAKING (wire): `PRESS_TREE_VERSION` bumps 1 → 2. `RowNode.ratio` (and the
`Ratio` type) is removed; each `ColumnNode` now carries `span: { base; md?; lg? }`
(1–12 tracks, mobile-first, `base` required) — the one responsive value stored in
the composition tree. Readers fail-to-empty on any other version; writers reject
malformed spans. **No data migration** (pre-release, authorized): stored v1 trees
are dropped on read.

- shared: `Span`/`ColumnSpan` types, span validation (default `{ base: 12 }` +
warn on malformed tiers), version-2 gate, no wire column cap.
- web: `spanFor(column)` passthrough; `RATIO_SPANS` removed; `<Column>`, the four
primitives, and `theme.css` are untouched.
- cms: builder replaces the row-ratio select with per-column base/md/lg span
selects, a read-only 12-track preview bar, a breakpoint toggle, and a per-tier
total badge; `MAX_COLUMNS` 4 → 12; `preset-layout.row` descriptor drops `ratio`.

Adopters must reseed: a playground/dev DB seeded at v1 (pageDefaults/home) reads
back empty until reseeded — reset the DB and let `pnpm dev` reseed at v2.
Loading
Loading