Found while implementing #5461, which names three sites and asserts they are the
complete set. They are not. Filing rather than fixing — #5461's declared file surface is
packages/types/src/layout.ts and packages/components/src/renderers/layout/react-page.tsx
only, and its dispatch says stop on breach.
Why #5461's measurement under-counted
#5461 measured with grep -rn "HTML + Tailwind" packages/ apps/ content/ and got 3 hits.
That single-line, single-spelling probe misses two whole classes:
HTML+Tailwind (no spaces) — a different spelling of the same compound.
JSX/Tailwind — a third spelling that drops "HTML" entirely.
- Line-wrapped occurrences —
packages/react-runtime/README.md wraps the exact
phrase across a line boundary inside a blockquote (... constrained JSX/HTML + /
> Tailwind, parsed ...), so even the literal spelling is invisible to a
line-oriented grep.
A multiline-tolerant sweep for every compound spelling finds 11 live sites, plus 5 in
CHANGELOG.md files (immutable release history — those must stay):
grep -rnP -U -z -o --include='*.ts' --include='*.tsx' --include='*.md' \
--include='*.mdx' --include='*.json' --include='*.js' --include='*.mjs' --include='*.css' \
'(JSX|HTML|html|jsx)\s*[/+]\s*(\*|>|//|\n|\r|\s)*\s*Tailwind' .
The 8 sites left over after #5461
Measured at 9bd753682.
| # |
Site |
Spelling |
| 1 |
packages/components/src/renderers/layout/page.tsx:541 |
JSX/HTML+Tailwind |
| 2 |
packages/sdui-parser/src/types.ts:5 |
JSX/HTML+Tailwind |
| 3 |
packages/react-runtime/README.md:17-18 |
JSX/HTML + ⏎ Tailwind (line-wrapped) |
| 4 |
packages/components/src/renderers/basic/html-elements.tsx:10 |
JSX/Tailwind |
| 5 |
packages/components/src/__tests__/div-deprecation-provenance.test.tsx:12 |
JSX/Tailwind |
| 6 |
packages/components/src/__tests__/span-deprecation-provenance.test.tsx:13 |
JSX/Tailwind |
| 7 |
content/docs/components/basic/div.mdx:20 |
JSX/Tailwind |
| 8 |
content/docs/components/basic/span.mdx:22 |
JSX/Tailwind |
Two of these are the highest-reach of the whole family after the TSDoc #5461 fixes:
page.tsx:541 sits on the kind === 'html' dispatch arm itself — the exact line a
reader lands on when tracing how an html page renders.
react-runtime/README.md:17-18 is a published package README: it goes to npm,
and it is the paragraph that routes untrusted-author work to the html tier.
div.mdx / span.mdx are published docs pages; the two *-deprecation-provenance
tests carry the framing in a header docstring only (no assertion depends on it).
The authority (unchanged from #5461)
ADR-0080's header amendment, 2026-06-30, under ADR-0065 (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 tiers themselves stand; only the styling primitive changes.
Already-correct sources to match, so the tree does not gain a fourth phrasing:
Suggested shape
Same as #5461's: drop the Tailwind half of the compound, keep every load-bearing claim
(parse-never-execute, the untrusted-author safety argument, the deprecated jsx alias),
and name the real primitive where the site is consumer-facing — the published README and
the two .mdx pages. The three test/source docstrings can just drop "+ Tailwind"; they
are not teaching styling.
Related: the console preview harnesses do not merely describe this framing, they
demonstrate it — filed separately.
Generated by Claude Code
Found while implementing #5461, which names three sites and asserts they are the
complete set. They are not. Filing rather than fixing — #5461's declared file surface is
packages/types/src/layout.tsandpackages/components/src/renderers/layout/react-page.tsxonly, and its dispatch says stop on breach.
Why #5461's measurement under-counted
#5461 measured with
grep -rn "HTML + Tailwind" packages/ apps/ content/and got 3 hits.That single-line, single-spelling probe misses two whole classes:
HTML+Tailwind(no spaces) — a different spelling of the same compound.JSX/Tailwind— a third spelling that drops "HTML" entirely.packages/react-runtime/README.mdwraps the exactphrase across a line boundary inside a blockquote (
... constrained JSX/HTML +/> Tailwind, parsed ...), so even the literal spelling is invisible to aline-oriented grep.
A multiline-tolerant sweep for every compound spelling finds 11 live sites, plus 5 in
CHANGELOG.mdfiles (immutable release history — those must stay):The 8 sites left over after #5461
Measured at
9bd753682.packages/components/src/renderers/layout/page.tsx:541JSX/HTML+Tailwindpackages/sdui-parser/src/types.ts:5JSX/HTML+Tailwindpackages/react-runtime/README.md:17-18JSX/HTML +⏎Tailwind(line-wrapped)packages/components/src/renderers/basic/html-elements.tsx:10JSX/Tailwindpackages/components/src/__tests__/div-deprecation-provenance.test.tsx:12JSX/Tailwindpackages/components/src/__tests__/span-deprecation-provenance.test.tsx:13JSX/Tailwindcontent/docs/components/basic/div.mdx:20JSX/Tailwindcontent/docs/components/basic/span.mdx:22JSX/TailwindTwo of these are the highest-reach of the whole family after the TSDoc #5461 fixes:
page.tsx:541sits on thekind === 'html'dispatch arm itself — the exact line areader lands on when tracing how an html page renders.
react-runtime/README.md:17-18is a published package README: it goes to npm,and it is the paragraph that routes untrusted-author work to the
htmltier.div.mdx/span.mdxare published docs pages; the two*-deprecation-provenancetests carry the framing in a header docstring only (no assertion depends on it).
The authority (unchanged from #5461)
ADR-0080's header amendment, 2026-06-30, under ADR-0065 (Accepted): a page's
sourceis 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 tiers themselves stand; only the styling primitive changes.
Already-correct sources to match, so the tree does not gain a fourth phrasing:
content/docs/guide/react-pages.md§Styling (corrected by docs(guide): react-pages.md contradicts the framework's sources on four points — Tailwind styling, record:* scope, adapter.find options, and the block inventory #5413 / PR docs(guide): resolve four react-pages.md contradictions toward the framework's sources #5462) — carriesthe per-tier table.
validatePageSourceStylingin the framework'spackages/lint/src/validate-page-source-styling.ts,rule
page-source-className-tailwind, released in@objectstack/lint@11.5.0— awarning on kinds
html,reactandjsx. Note: notvalidate-responsive-styles.ts, which never reads pagesource(it walksregions[].components[]).Suggested shape
Same as #5461's: drop the Tailwind half of the compound, keep every load-bearing claim
(parse-never-execute, the untrusted-author safety argument, the deprecated
jsxalias),and name the real primitive where the site is consumer-facing — the published README and
the two
.mdxpages. The three test/source docstrings can just drop "+ Tailwind"; theyare not teaching styling.
Related: the console preview harnesses do not merely describe this framing, they
demonstrate it — filed separately.
Generated by Claude Code