Observation, filed unassigned while correcting one inherited row on content/docs/components/basic/button-group.mdx for objectui#6347. Not a user-visible failure by itself — it is the reference page every component page defers to for the inherited props, so a reader who checks the authority for a BaseSchema key gets a narrower answer than the type gives.
What was measured
content/docs/api/schema-reference.md, the "Common Properties" table (lines 53-67), against packages/types/src/base.ts read off this tree. BaseSchema declares 21 members; the table has 13 rows covering 16 of them.
Five rows narrow a declared union to one limb:
| table row | table says | base.ts declares |
|---|
label | string | label?: string | I18nLabel |
description | string | description?: string | I18nLabel |
ariaLabel | string | ariaLabel?: string | KeyedI18nLabel |
visible / visibleOn | boolean / string | visible?: boolean | string — the expression limb is on visible too, not only on visibleOn |
disabled / disabledOn | boolean / string | disabled?: boolean | string — same shape |
The two paired rows are the interesting ones: pairing visible→boolean with visibleOn→string reads as a complete account, and it is that appearance of completeness that hides the third fact — visible itself takes a predicate expression. The Zod mirror is explicit about it (zod/base.zod.ts:190, z.union([z.boolean(), z.string()]).describe('Disabled state (boolean or predicate expression)')), so the two declaration faces agree with each other and only the docs diverge. hidden?: boolean really is boolean-only, so that row is correct — the divergence is not uniform and cannot be fixed by a blanket edit.
Five declared members have no row at all:placeholder?: string, style?: Record<string, string | number>, data?: any, bind?: string, visibleWhen?: string.
bind is the newest — declared on BaseSchema and its mirror by objectui#6574, which landed recently; the table simply has not caught up. visibleWhen sits beside two documented siblings (visible, visibleOn) which is the shape most likely to be read as an exhaustive list.
Why nothing goes red
Same hole objectui#6347's PR describes for component pages: no gate reads a plaintext fence or a prose table against the shipped types. check:doc-component-types reads only type string literals out of docs code blocks; check:doc-snippet-types compiles ts/tsx fences and this is a Markdown table. check:doc-key-tables (objectui#5106) judges plugin REGISTRATION key tables, not property tables.
Not just a docs edit — one of the rows is a question
Whether these should be corrected, or whether the types should narrow, is not obvious for all five, and the answer differs per row:
label / description / ariaLabel — the i18n limbs are real and widely authored; the table is simply out of date. A docs fix.bind, visibleWhen, placeholder, style, data — missing rows. Also a docs fix, though data?: any may deserve a word about why it is any rather than a row that reads as an endorsement.visible / disabled — a docs fix by the letter, but worth one look first: objectui#6347's PR found that 13 of the 14 component schemas documenting a schema-level disabled REDECLARE it as disabled?: boolean, narrowing the base union away. If narrowing is the intended house shape, the honest correction might be to say so here rather than to publish a union most concrete schemas refuse. Only ButtonGroupSchema inherits it unnarrowed.
I did not edit the page. objectui#6347's PR corrects exactly one inherited row on one component page, the one inside the fence it was already rewriting.
Refs: objectui#6347 · objectui#6574 · objectui#6143 · objectui#5106.
Observation, filed unassigned while correcting one inherited row on
content/docs/components/basic/button-group.mdxfor objectui#6347. Not a user-visible failure by itself — it is the reference page every component page defers to for the inherited props, so a reader who checks the authority for aBaseSchemakey gets a narrower answer than the type gives.What was measured
content/docs/api/schema-reference.md, the "Common Properties" table (lines 53-67), againstpackages/types/src/base.tsread off this tree.BaseSchemadeclares 21 members; the table has 13 rows covering 16 of them.Five rows narrow a declared union to one limb:
base.tsdeclareslabelstringlabel?: string | I18nLabeldescriptionstringdescription?: string | I18nLabelariaLabelstringariaLabel?: string | KeyedI18nLabelvisible/visibleOnboolean/stringvisible?: boolean | string— the expression limb is onvisibletoo, not only onvisibleOndisabled/disabledOnboolean/stringdisabled?: boolean | string— same shapeThe two paired rows are the interesting ones: pairing
visible→booleanwithvisibleOn→stringreads as a complete account, and it is that appearance of completeness that hides the third fact —visibleitself takes a predicate expression. The Zod mirror is explicit about it (zod/base.zod.ts:190,z.union([z.boolean(), z.string()]).describe('Disabled state (boolean or predicate expression)')), so the two declaration faces agree with each other and only the docs diverge.hidden?: booleanreally is boolean-only, so that row is correct — the divergence is not uniform and cannot be fixed by a blanket edit.Five declared members have no row at all:
placeholder?: string,style?: Record<string, string | number>,data?: any,bind?: string,visibleWhen?: string.bindis the newest — declared onBaseSchemaand its mirror by objectui#6574, which landed recently; the table simply has not caught up.visibleWhensits beside two documented siblings (visible,visibleOn) which is the shape most likely to be read as an exhaustive list.Why nothing goes red
Same hole objectui#6347's PR describes for component pages: no gate reads a
plaintextfence or a prose table against the shipped types.check:doc-component-typesreads onlytypestring literals out of docs code blocks;check:doc-snippet-typescompilests/tsxfences and this is a Markdown table.check:doc-key-tables(objectui#5106) judges plugin REGISTRATION key tables, not property tables.Not just a docs edit — one of the rows is a question
Whether these should be corrected, or whether the types should narrow, is not obvious for all five, and the answer differs per row:
label/description/ariaLabel— the i18n limbs are real and widely authored; the table is simply out of date. A docs fix.bind,visibleWhen,placeholder,style,data— missing rows. Also a docs fix, thoughdata?: anymay deserve a word about why it isanyrather than a row that reads as an endorsement.visible/disabled— a docs fix by the letter, but worth one look first: objectui#6347's PR found that 13 of the 14 component schemas documenting a schema-leveldisabledREDECLARE it asdisabled?: boolean, narrowing the base union away. If narrowing is the intended house shape, the honest correction might be to say so here rather than to publish a union most concrete schemas refuse. OnlyButtonGroupSchemainherits it unnarrowed.I did not edit the page. objectui#6347's PR corrects exactly one inherited row on one component page, the one inside the fence it was already rewriting.
Refs: objectui#6347 · objectui#6574 · objectui#6143 · objectui#5106.