Skip to content

docs: react-pages.md states only the react tier's PascalCase tag rule, so html-tier authors copy a spelling the parser rejects #7006

Description

@claude

content/docs/guide/react-pages.md is this repo's home for both source-authoring
tiers, but the only tag-naming rule it states is the react tier's PascalCase one. An
author who writes a kind:'html' page from this page copies that spelling and is
rejected at save time, with nothing on the page naming the rule they broke.

Where the page states the rule

The scope table (the ### What is in scope section) lists

| The public data blocks | Every public non-container block, as a PascalCase tag — … |

and the #### Two tiers: what resolves, and what you author against section derives the
spelling explicitly:

Tags are derived by splitting the registry type on -, _ and : and PascalCasing
each part: object-grid<ObjectGrid>, record:details<RecordDetails>.

Neither passage is wrong — both are react-tier material. Neither is marked as such.

Where the html tier needs it and does not have it

The ## kind:'html' section says the whitelist exists but never says how its entries are
spelled:

Only tags in the public block manifest are allowed, props are validated against each
block's declared inputs, and unknown tags are a hard error at save time.

The page names kind:'html' at seven places (frontmatter description, the kind table,
the "reach for html by default" callout, the capability-switch paragraph, the styling
row, and the section itself) and its own html examples use the correct lowercase form
(<flex direction gap>, <grid columns>) — so the correct spelling is demonstrated
while the stated rule is the other tier's.

What the html tier actually accepts (objectstack side, measured)

The whitelist is the registry's own type names, compared by exact string:

  • packages/sdui-parser/src/index.ts:41const allowedTags = new Set(Object.keys(manifest.components))
  • packages/sdui-parser/src/index.ts:99-100 — the manifest is keyed by the registry
    config's own type: components[c.type] = { type: c.type, … }
  • packages/sdui-parser/src/parse.ts:61!this.opts.allowedTags.has(tag), an exact
    Set.has; no case folding anywhere in the parser

Compiled against the real 57-component manifest: ListViewListView is not an allowed component; list-view → accepted. ObjectForm → rejected; object-form
accepted. RecordRelatedList → rejected; record:related_list → accepted.

⚠️ The rule is registered type names written verbatim, not "kebab-case": 28 of the 57
registered names carry a namespace prefix (record:, page:, element:, action:) and
four are snake_case after the colon — record:related_list, record:line_items,
record:quick_actions, record:reference_rail. Documenting "kebab-case" alone sends an
author to record:related-list, which is not registered either.

Prior art — the same defect, already fixed upstream

objectstack-ai/objectstack#12650 is this defect on content/docs/ui/react-pages.mdx in
the framework repo; objectstack-ai/objectstack#13734 fixes it with two body edits (one
paragraph in the html-tier section naming the registered spelling, and "On this tier"
scoping on the react-tier naming sentence). That diff is a usable model for this page.

Provenance

Found by the dev implementing objectstack-ai/objectstack#12650, whose triage first-touch
reserved this cross-repo follow-up for the PM to file rather than take as a rider.
Verified independently against this repo's origin/main (content/docs/guide/react-pages.md).
Duplicate check: 271 open issues in this repo scanned for PascalCase / react-pages /
html tier / allowed component; no existing card covers it.


Generated by Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions