Skip to content

finding(components): the static table renderer reads 9 of the 20 keys TableSchema/TableColumn declare — hoverable, striped, align, sortable, cell and 6 more are inert, and the reference page documents two of them as working #5474

Description

@os-support-ai

Found while implementing #5350 (retiring that renderer's undeclared column aliases). Observation class — filed unassigned and deliberately NOT fixed there, because which way it resolves is an ADR-0049 enforce-or-remove contract decision, not a re-spelling. #5350 stayed inside the spelling question the family ruling settled.

Measured

Every key packages/components/src/renderers/complex/table.tsx reads, derived from the file rather than recalled:

grep -oE '(schema|col)\.[a-zA-Z]+' packages/components/src/renderers/complex/table.tsx | sort -u
col.accessorKey col.cellClassName col.className col.header col.width
schema.caption schema.columns schema.data schema.footer

Nine. Against that, packages/types/src/data-display.ts declares:

declaring typedeclared and readdeclared and inert
TableSchemacaption, columns, data, footerhoverable, striped
TableColumnheader, accessorKey, className, cellClassName, widthminWidth, align, fixed, type, sortable, filterable, resizable, editable, cell

Eleven declared keys are never read. hoverable and striped even carry @default annotations (true / false) describing behaviour that does not exist on this renderer.

The published page documents two of them as working

content/docs/api/schema-reference.md §TableSchema:

PropertyTypeDescription
hoverablebooleanHighlight rows on hover.
stripedbooleanAlternate row background colors.

and its copyable example sets "hoverable": true, "striped": true. Both are inert. The section header one line above likewise reads "A data table with columns, optional striping, and hover effects."

This is the same declared-but-unenforced shape as #5373 (type: 'crud': four declaration faces, no renderer), one level down: the type renders, but a majority of what it declares does not. #5350 corrected the same section's spelling contract and deliberately left hoverable/striped in the example, because deleting them would have pre-empted this decision.

Not merely cosmetic for AI authoring

align and sortable are the two most likely for a generator to emit — a right-aligned amount column is the obvious thing to author, and the pre-#5350 reference example did exactly that ({ "name": "amount", "label": "Amount", "align": "right" }). It is accepted, type-checks, and does nothing, with no diagnostic. Same silent class as #5349.

The routes, not pre-decided

  1. Implement the inert keys on this renderer (hoverable/striped/align are a few lines each; sortable/filterable/resizable/editable/cell are substantially more, and arguably why data-table exists).
  2. Retire them from TableSchema/TableColumn under ADR-0049 and point authors at data-table for the interactive set — the narrow reading being that table is deliberately the dumb static renderer and its type over-declares.
  3. Split the type: keep TableColumn as the rich shared shape data-table honours and give the static renderer a narrow declared subset, so declared = enforced holds per renderer.

Route 2 or 3 look consistent with the startup-focus / implementation-first standing instruction, but the pick is a maintainer call. Note TableColumn is shared: DataTableSchema and others consume it, so a retirement must be checked against those consumers first — this is not a single-renderer edit.

Reproduce

grep -oE '(schema|col)\.[a-zA-Z]+' packages/components/src/renderers/complex/table.tsx | sort -u
sed -n '227,278p' packages/types/src/data-display.ts # TableColumn
sed -n '285,313p' packages/types/src/data-display.ts # TableSchema
sed -n '394,422p' content/docs/api/schema-reference.md # the page, post-#5350

Related: #5350 (the spelling half, which left this alone), #5373 (same enforce-or-remove class), #5349 (the silence).

Generated by Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:queue

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions