Found while fixing #5413 (the react-pages guide's four contradictions). Filing rather
than fixing — #5413's file surface is content/docs/guide/react-pages.md only.
The framing
ADR-0080 carries a header amendment (2026-06-30, under ADR-0065 which is Accepted):
a page's source is runtime metadata, so the console's build-time Tailwind never scans
it and an authored utility class silently produces no CSS. "Do not author Tailwind
classes in page source."
The framework side has already been corrected to match — @objectstack/lint ships
validatePageSourceStyling (rule page-source-className-tailwind, released in
11.5.0), the generated react contract says "Do NOT use Tailwind className in page
source", and objectstack#10286 / PR #10436 has just fixed the same wording on
PageSchema's own kind / source describes.
Three sites in this repo still carry the retracted framing.
1. packages/types/src/layout.ts:616 — a published type surface
* Source-authored (`source` carries the body; `regions` is unused) —
* ADR-0080, see `content/docs/guide/react-pages.md`:
* - `"html"`: constrained JSX/HTML + Tailwind, PARSED into a SchemaNode
This is the TSDoc on PageSchema.kind, so it ships in the package's .d.ts and shows
up on hover for every consumer. It is the exact analogue of the spec-side describe
objectstack#10286 just fixed — and note it links the guide, so once #5413 lands this
comment will contradict the page it points at.
2 + 3. packages/components/src/renderers/layout/react-page.tsx:24 and :49
* each as a prop-driven wrapper that renders via SchemaRenderer. Layout is
* left to plain HTML + Tailwind (React's strength); only the data blocks
// data/leaf blocks (non-containers) as prop-driven wrappers; layout containers
// are intentionally left out — in react mode the author composes layout with
// real HTML + Tailwind, not our schema-children renderers.
These sit on buildComponentScope — the function that builds the react scope — so they
are what the next person reads when working on this tier.
Why it is worth a card
The half of each sentence that says layout containers are not injected is correct and
should survive; only the "so use Tailwind" conclusion is retracted. The replacement is
already settled and written down: react styles with inline style objects using
hsl(var(--token)) colours, html styles with the blocks' structured props plus a JSON
style object.
Suggested shape: drop "+ Tailwind" from all three, name the real per-tier primitive in
the layout.ts TSDoc (it is the consumer-facing one), and leave the container claim
alone. No behaviour change; layout.ts is a published src/, so it needs a changeset.
Measurement
Verified at objectui 77f846a8b and objectstack f094214b3:
$ grep -rn "HTML + Tailwind" packages/ apps/ content/
packages/types/src/layout.ts:616
packages/components/src/renderers/layout/react-page.tsx:24
packages/components/src/renderers/layout/react-page.tsx:49
Counter-probe: the three real kind:'react' pages in the framework's
examples/app-showcase contain zeroclassName and 37 style={{ between them, so
the sources are the outlier, not the practice.
Found while fixing #5413 (the react-pages guide's four contradictions). Filing rather
than fixing — #5413's file surface is
content/docs/guide/react-pages.mdonly.The framing
ADR-0080 carries a header amendment (2026-06-30, under ADR-0065 which is Accepted):
a page's
sourceis runtime metadata, so the console's build-time Tailwind never scansit and an authored utility class silently produces no CSS. "Do not author Tailwind
classes in page source."
The framework side has already been corrected to match —
@objectstack/lintshipsvalidatePageSourceStyling(rulepage-source-className-tailwind, released in11.5.0), the generated react contract says "Do NOT use Tailwind className in page
source", and objectstack#10286 / PR #10436 has just fixed the same wording on
PageSchema's ownkind/sourcedescribes.Three sites in this repo still carry the retracted framing.
1.
packages/types/src/layout.ts:616— a published type surfaceThis is the TSDoc on
PageSchema.kind, so it ships in the package's.d.tsand showsup on hover for every consumer. It is the exact analogue of the spec-side describe
objectstack#10286 just fixed — and note it links the guide, so once #5413 lands this
comment will contradict the page it points at.
2 + 3.
packages/components/src/renderers/layout/react-page.tsx:24and:49These sit on
buildComponentScope— the function that builds the react scope — so theyare what the next person reads when working on this tier.
Why it is worth a card
The half of each sentence that says layout containers are not injected is correct and
should survive; only the "so use Tailwind" conclusion is retracted. The replacement is
already settled and written down: react styles with inline
styleobjects usinghsl(var(--token))colours, html styles with the blocks' structured props plus a JSONstyleobject.Suggested shape: drop "+ Tailwind" from all three, name the real per-tier primitive in
the
layout.tsTSDoc (it is the consumer-facing one), and leave the container claimalone. No behaviour change;
layout.tsis a publishedsrc/, so it needs a changeset.Measurement
Verified at objectui
77f846a8band objectstackf094214b3:Counter-probe: the three real
kind:'react'pages in the framework'sexamples/app-showcasecontain zeroclassNameand 37style={{between them, sothe sources are the outlier, not the practice.