docs(components): spell the inherited disabled as boolean | string - #7341

Merged
os-litant merged 2 commits into
mainfrom
claude/issue-7239-docs-disabled-boolean-or-string
Sep 2, 2026
Merged

docs(components): spell the inherited disabled as boolean | string#7341
os-litant merged 2 commits into
mainfrom
claude/issue-7239-docs-disabled-boolean-or-string

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes#7239

The docs half of the #7087 ruling (maintainer, 2026-09-01, option 1 scoped to disabled). That ruling removed the 18 disabled?: boolean narrowings from the concrete schemas, so the member is now inherited from BaseSchema as boolean | string — a boolean, or a predicate expression on the same evaluated path as visible. 13 component pages went on spelling the removed narrowing in their illustrative interfaces, teaching a type the shipped tree no longer has. A reader copying those rows would conclude that disabled: "${data.status === 'locked'}" is invalid, which is exactly the capability the ruling restored.

Premise re-verified on the base, not taken from the card

Base ebc05b4d6. Every one of the 22 disabled?: rows under content/docs/components was attributed to its enclosing interface by walking back to the nearest declaration, rather than trusting the card's table — the table turned out to be exactly right, including the two files that carry one in-scope and one out-of-scope row each:

populationrowsdisposition
schemas inheriting disabled from BaseSchema13corrected to `boolean
basic/button-group.mdx (ButtonGroupSchema)1already correct (#6347); the spelling the other 13 converged on
independent item/option shapes8left at plain boolean

All 13 in-scope interfaces were confirmed to extends BaseSchema with no disabled of their own on this base, and all remaining disabled?: boolean declarations in packages/types/src were confirmed to belong to independent shapes (ListItem, AccordionItem, ToggleGroupItem, SelectOptionMetadata, SelectOption, RadioOption, FormField, ComboboxOption, TabItem, NavLink, ButtonGroupButton, MenuCommandItem) — so the narrowings really are gone and the pages really were the stale side.

Why a pin instead of a gate turning red-then-green

No gate can see this drift, and that was measured rather than assumed: check-doc-snippet-types.mjs compiles only the fence languages in its own TS_FENCE_LANGUAGES set (line 317: ts, tsx, typescript), and all 14 rows in question live in plaintext fences (13) or a text fence (1). check-doc-component-types reads only the type string literals. So a member row in those fences may name any type at all and every gate stays green — the hole #6143 records.

The new pin packages/types/src/__tests__/component-docs-disabled-inherited-7239.test.ts (44 cases) therefore carries the invariant:

  1. Inherited (14 rows) — the page's disabled row reads boolean | string, and the shipped interface of the same name still extends BaseSchema without redeclaring disabled. The second half is what keeps the pin honest in the other direction: a future re-narrowing fails pointing at packages/types, not at the page, because in that world the page would be the thing that is right.
  2. Independent (8 rows) — the item/option shapes still read exactly boolean. This is the blanket-replace control: a sweep that rewrote every disabled?: boolean under content/docs/components turns these red.
  3. Completeness — the two tables account for everydisabled?: row under content/docs/components by measurement, so a new page carrying the stale spelling fails here instead of sitting unclassified.

Boundary stated in the file rather than implied: the three overlay menu-item rows are doc-local names with no shipped counterpart (ContextMenuCommandItem / DropdownMenuCommandItem / MenubarCommandItem against a shipped MenuCommandItem), so only their doc text is asserted.

Bounded in-place fix, named with evidence

packages/types/src/__tests__/button-group-doc-surface-6347.test.ts header said 13 of those 14 component schemas REDECLARE disabled?: boolean themselves … so their pages are right. After #7087 that sentence is false in both halves. The paragraph is rewritten to mark the 13-of-14 reading as history and point at the new pin. Comment text only — mechanically confirmed: git diff -U0 on that file, with comment lines filtered out, is empty, and the file's assertions stay green in the run below (it is one of the 87 files in the packages/types suite).

It qualifies as a bounded in-place fix on all four counts: same defect class as the card (a stale disabled?: boolean reading left behind by #7087), mechanical with the correct shape pinned by the landed ruling, no other claim holds that file, and no new verification surface (it is already covered by the packages/types suite).

Ablation — mutation and restore both proven on disk

The pin resolves nothing through any package dist/ (it imports only vitest and node:fs / node:path / node:url and reads source files off disk), so no rebuild is involved in either leg; the mutations were confirmed by anchored text counts, not by an editor's exit code.

legmutation proven on diskpin result
all 13 pages reverted to their base blobswide_union_rows=0, bare_boolean_rows=1513 failed / 31 passed — each naming its own page; ButtonGroupSchema and all 8 independent rows stayed green
form/select.mdx alone narrowedinjected_bare=1, removed_wide=01 failed / 43 passedExpected: "form/select.mdx SelectSchema -> boolean | string" / Received: "... -> boolean"
form/form.mdxFormField alone widened (blanket-replace control)injected_wide=1, removed_bare=01 failed / 43 passedExpected: "form/form.mdx FormField -> boolean" / Received: "... -> boolean | string"

Those results match the predictions written into the pin's header before the first run. Every restore leg used git checkout HEAD -- ABSOLUTE_PATH under a trap … EXIT INT TERM with absolute paths, and was proven by blob hash rather than by an exit code: 13/13 and 2/2 disk hashes equal to their HEAD blobs, none empty, with git diff HEAD empty and git status --porcelain clean afterwards.

Verification — union run at dd802b688 on a clean tree

checkverdict line
the new pinTest Files 1 passed (1) / Tests 44 passed (44)
packages/types suiteTest Files 87 passed (87) / Tests 1221 passed (1221)
@object-ui/typestype-checkexit 0, all three projects; --listFiles on tsconfig.test.json confirms both touched test files are in the 543-file compiled set (tsconfig.json excludes **/*.test.ts, so this was checked rather than assumed)
check:doc-fences✅ check:doc-fences — every TypeScript block in 224 document(s) is fenced ts/tsx/typescript …
check:doc-types✅ Every documented component type is registered.
docs:check-linksLinks are valid across 17 scan roots.
check:control-bytes✅ check-control-bytes: OK (scanned 6026 tracked text file(s); skipped 85 binary).
check:docs-route-closure✅ MEASURED_PAYLOAD is honest …
check-changeset-presence✅ 2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) …
check-changeset-no-major✅ No changeset declares a major bump.
check-governed-queue-guard --test✅ NOT GOVERNED — 16 path(s) checked against 5 governed surface(s); none matched.

Declared narrowing — check:doc-snippets was not run locally. It exits 2, which its own output defines as PRECONDITION NOT MET … This is "I could not run", NOT "I ran and found errors" (exit 1): it needs a 25-package build first. The narrowing is backed by measurement, not convenience: (1) the population comes from the gate's own TS_FENCE_LANGUAGES set rather than a guess about which files count; (2) 0 of the 14 changed doc rows are in that population — 13 sit in plaintext fences, 1 in a text fence; (3) the diff adds and removes no fence and changes no fence language (check:doc-fences green), and the other two changed files are a comment-only test edit and a new test, neither of which is a document, so the gate's verdict on untouched files cannot move. CI runs it regardless.

A changeset is owed and is included with empty frontmatter (declaring that nothing releases) — the two touched files under packages/types/src/ are published source, so the presence gate asks; its own text calls the empty-frontmatter form "a pass, not a workaround", and there is precedent in .changeset/theme-schema-doc-rewrite-5648.md.

Staying draft for the PM to land. #7087 remains closed by its own PR and is only referenced here; nothing in this PR changes packages/types source or content/docs/releases/.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NRRumy89BYdW9ogbcdHTho

Generated by Claude Code


Generated by Claude Code

objectui#7087 (maintainer ruling 2026-09-01, option 1 scoped to `disabled`)
removed the 18 `disabled?: boolean` narrowings from the concrete schemas, so
the member is now inherited from `BaseSchema` as `boolean | string` — a
boolean, or a predicate expression on the same evaluated path as `visible`.
13 component pages went on spelling the removed narrowing in their
illustrative interfaces, teaching a type the shipped tree no longer has.
Each of the 22 `disabled?:` rows under `content/docs/components` was
attributed to its enclosing interface before editing: 13 belong to schemas
that inherit the member and were corrected; 8 belong to independent
item/option shapes that declare their own `disabled?: boolean` and are left
at plain `boolean`; `basic/button-group.mdx` was already correct (objectui#6347)
and is the spelling the other 13 converged on.
No gate can see this drift — the rows live in `plaintext`/`text` fences and
`check-doc-snippet-types` compiles only `ts`/`tsx` (objectui#6143) — so the
invariant is pinned instead:
`packages/types/src/__tests__/component-docs-disabled-inherited-7239.test.ts`
holds all 14 inherited rows to the union, cross-checks against the shipped
interfaces so a re-narrowing fails pointing at `packages/types`, keeps the 8
independent rows at `boolean` as a blanket-replace control, and asserts the
two tables account for every documented row.
Also corrects the now-false 13-of-14 paragraph in the header of
`button-group-doc-surface-6347.test.ts` (comment text only; its assertions
are untouched and stay green).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NRRumy89BYdW9ogbcdHTho
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Console Performance Budget — gauge not trustworthy

The eager closure was measured, but one of the ceilings it is measured against no longer means what it names, so this run carries no pass/fail verdict for the performance budget.

This is not a budget violation. Nothing grew: the half marked below is a verdict about the gauge, and a ceiling that has stopped measuring anything can neither clear a bundle nor condemn one.

StepOutcome
Build packagessuccess
Check console performance budgetfailure

Which half objected:

Eager-closure halfVerdict
Aggregate closure ceiling✅ pass
Per-chunk ceilings✅ pass
Ceiling sensitivity (headroom)✅ pass
Ceiling freshness (checkout vs. base branch)⚠️ superseded ceiling

⚠️ A superseded ceiling is neither a size regression nor a drifted gauge. The bundle was measured correctly and the ceilings on the base branch are correct — but this checkout predates a change to them, so the verdicts above were weighed against numbers that are no longer in force. Nothing grew. Update this branch onto the base branch and let Bundle Analysis run again; do not widen a ceiling to clear it. The Check console performance budget step log names each superseded constant with both values (objectui#6245).

Reason: The entry chunk measured 142.6 KB, but the eager-closure half of this gate returned no trustworthy VERDICT: the report could not be read, a ceiling has drifted out of range of the regression it must catch, or (objectui#6245) a ceiling was replaced on the base branch after this checkout was made. The step log says which. This is not a passing budget — and it is not a size regression either.

See the workflow run for details.


📦 Bundle Size Report

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.33KB5.59KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)514.48KB117.36KB
core (index.js)5.55KB2.23KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.25KB61.73KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.92KB12.93KB
plugin-charts (index.js)70.02KB19.44KB
plugin-chatbot (index.js)190.53KB45.18KB
plugin-dashboard (index.js)132.63KB34.56KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)250.63KB63.90KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.78KB32.58KB
plugin-gantt (index.js)166.77KB40.76KB
plugin-grid (index.js)208.88KB56.59KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.51KB27.67KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)29.34KB8.47KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 48 chunks)3165.5 KB3191.4 KB
Main entry chunk (gzip)142.6 KB350 KB
Entry fileindex-BAsuzemp.js
StatusPASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.33KB5.59KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)514.48KB117.36KB
core (index.js)5.80KB2.32KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.25KB61.73KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)47.00KB12.97KB
plugin-charts (index.js)70.02KB19.44KB
plugin-chatbot (index.js)193.26KB45.80KB
plugin-dashboard (index.js)132.63KB34.56KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)250.63KB63.90KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.78KB32.58KB
plugin-gantt (index.js)166.93KB40.82KB
plugin-grid (index.js)208.88KB56.59KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.51KB27.67KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)29.15KB8.40KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants

@os-litant@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

docs(components): spell the inherited disabled as boolean | string - #7341

Merged
os-litant merged 2 commits into
mainfrom
claude/issue-7239-docs-disabled-boolean-or-string
Sep 2, 2026
Merged

docs(components): spell the inherited disabled as boolean | string#7341
os-litant merged 2 commits into
mainfrom
claude/issue-7239-docs-disabled-boolean-or-string

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes#7239

The docs half of the #7087 ruling (maintainer, 2026-09-01, option 1 scoped to disabled). That ruling removed the 18 disabled?: boolean narrowings from the concrete schemas, so the member is now inherited from BaseSchema as boolean | string — a boolean, or a predicate expression on the same evaluated path as visible. 13 component pages went on spelling the removed narrowing in their illustrative interfaces, teaching a type the shipped tree no longer has. A reader copying those rows would conclude that disabled: "${data.status === 'locked'}" is invalid, which is exactly the capability the ruling restored.

Premise re-verified on the base, not taken from the card

Base ebc05b4d6. Every one of the 22 disabled?: rows under content/docs/components was attributed to its enclosing interface by walking back to the nearest declaration, rather than trusting the card's table — the table turned out to be exactly right, including the two files that carry one in-scope and one out-of-scope row each:

populationrowsdisposition
schemas inheriting disabled from BaseSchema13corrected to `boolean
basic/button-group.mdx (ButtonGroupSchema)1already correct (#6347); the spelling the other 13 converged on
independent item/option shapes8left at plain boolean

All 13 in-scope interfaces were confirmed to extends BaseSchema with no disabled of their own on this base, and all remaining disabled?: boolean declarations in packages/types/src were confirmed to belong to independent shapes (ListItem, AccordionItem, ToggleGroupItem, SelectOptionMetadata, SelectOption, RadioOption, FormField, ComboboxOption, TabItem, NavLink, ButtonGroupButton, MenuCommandItem) — so the narrowings really are gone and the pages really were the stale side.

Why a pin instead of a gate turning red-then-green

No gate can see this drift, and that was measured rather than assumed: check-doc-snippet-types.mjs compiles only the fence languages in its own TS_FENCE_LANGUAGES set (line 317: ts, tsx, typescript), and all 14 rows in question live in plaintext fences (13) or a text fence (1). check-doc-component-types reads only the type string literals. So a member row in those fences may name any type at all and every gate stays green — the hole #6143 records.

The new pin packages/types/src/__tests__/component-docs-disabled-inherited-7239.test.ts (44 cases) therefore carries the invariant:

  1. Inherited (14 rows) — the page's disabled row reads boolean | string, and the shipped interface of the same name still extends BaseSchema without redeclaring disabled. The second half is what keeps the pin honest in the other direction: a future re-narrowing fails pointing at packages/types, not at the page, because in that world the page would be the thing that is right.
  2. Independent (8 rows) — the item/option shapes still read exactly boolean. This is the blanket-replace control: a sweep that rewrote every disabled?: boolean under content/docs/components turns these red.
  3. Completeness — the two tables account for everydisabled?: row under content/docs/components by measurement, so a new page carrying the stale spelling fails here instead of sitting unclassified.

Boundary stated in the file rather than implied: the three overlay menu-item rows are doc-local names with no shipped counterpart (ContextMenuCommandItem / DropdownMenuCommandItem / MenubarCommandItem against a shipped MenuCommandItem), so only their doc text is asserted.

Bounded in-place fix, named with evidence

packages/types/src/__tests__/button-group-doc-surface-6347.test.ts header said 13 of those 14 component schemas REDECLARE disabled?: boolean themselves … so their pages are right. After #7087 that sentence is false in both halves. The paragraph is rewritten to mark the 13-of-14 reading as history and point at the new pin. Comment text only — mechanically confirmed: git diff -U0 on that file, with comment lines filtered out, is empty, and the file's assertions stay green in the run below (it is one of the 87 files in the packages/types suite).

It qualifies as a bounded in-place fix on all four counts: same defect class as the card (a stale disabled?: boolean reading left behind by #7087), mechanical with the correct shape pinned by the landed ruling, no other claim holds that file, and no new verification surface (it is already covered by the packages/types suite).

Ablation — mutation and restore both proven on disk

The pin resolves nothing through any package dist/ (it imports only vitest and node:fs / node:path / node:url and reads source files off disk), so no rebuild is involved in either leg; the mutations were confirmed by anchored text counts, not by an editor's exit code.

legmutation proven on diskpin result
all 13 pages reverted to their base blobswide_union_rows=0, bare_boolean_rows=1513 failed / 31 passed — each naming its own page; ButtonGroupSchema and all 8 independent rows stayed green
form/select.mdx alone narrowedinjected_bare=1, removed_wide=01 failed / 43 passedExpected: "form/select.mdx SelectSchema -> boolean | string" / Received: "... -> boolean"
form/form.mdxFormField alone widened (blanket-replace control)injected_wide=1, removed_bare=01 failed / 43 passedExpected: "form/form.mdx FormField -> boolean" / Received: "... -> boolean | string"

Those results match the predictions written into the pin's header before the first run. Every restore leg used git checkout HEAD -- ABSOLUTE_PATH under a trap … EXIT INT TERM with absolute paths, and was proven by blob hash rather than by an exit code: 13/13 and 2/2 disk hashes equal to their HEAD blobs, none empty, with git diff HEAD empty and git status --porcelain clean afterwards.

Verification — union run at dd802b688 on a clean tree

checkverdict line
the new pinTest Files 1 passed (1) / Tests 44 passed (44)
packages/types suiteTest Files 87 passed (87) / Tests 1221 passed (1221)
@object-ui/typestype-checkexit 0, all three projects; --listFiles on tsconfig.test.json confirms both touched test files are in the 543-file compiled set (tsconfig.json excludes **/*.test.ts, so this was checked rather than assumed)
check:doc-fences✅ check:doc-fences — every TypeScript block in 224 document(s) is fenced ts/tsx/typescript …
check:doc-types✅ Every documented component type is registered.
docs:check-linksLinks are valid across 17 scan roots.
check:control-bytes✅ check-control-bytes: OK (scanned 6026 tracked text file(s); skipped 85 binary).
check:docs-route-closure✅ MEASURED_PAYLOAD is honest …
check-changeset-presence✅ 2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) …
check-changeset-no-major✅ No changeset declares a major bump.
check-governed-queue-guard --test✅ NOT GOVERNED — 16 path(s) checked against 5 governed surface(s); none matched.

Declared narrowing — check:doc-snippets was not run locally. It exits 2, which its own output defines as PRECONDITION NOT MET … This is "I could not run", NOT "I ran and found errors" (exit 1): it needs a 25-package build first. The narrowing is backed by measurement, not convenience: (1) the population comes from the gate's own TS_FENCE_LANGUAGES set rather than a guess about which files count; (2) 0 of the 14 changed doc rows are in that population — 13 sit in plaintext fences, 1 in a text fence; (3) the diff adds and removes no fence and changes no fence language (check:doc-fences green), and the other two changed files are a comment-only test edit and a new test, neither of which is a document, so the gate's verdict on untouched files cannot move. CI runs it regardless.

A changeset is owed and is included with empty frontmatter (declaring that nothing releases) — the two touched files under packages/types/src/ are published source, so the presence gate asks; its own text calls the empty-frontmatter form "a pass, not a workaround", and there is precedent in .changeset/theme-schema-doc-rewrite-5648.md.

Staying draft for the PM to land. #7087 remains closed by its own PR and is only referenced here; nothing in this PR changes packages/types source or content/docs/releases/.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NRRumy89BYdW9ogbcdHTho

Generated by Claude Code


Generated by Claude Code

objectui#7087 (maintainer ruling 2026-09-01, option 1 scoped to `disabled`)
removed the 18 `disabled?: boolean` narrowings from the concrete schemas, so
the member is now inherited from `BaseSchema` as `boolean | string` — a
boolean, or a predicate expression on the same evaluated path as `visible`.
13 component pages went on spelling the removed narrowing in their
illustrative interfaces, teaching a type the shipped tree no longer has.
Each of the 22 `disabled?:` rows under `content/docs/components` was
attributed to its enclosing interface before editing: 13 belong to schemas
that inherit the member and were corrected; 8 belong to independent
item/option shapes that declare their own `disabled?: boolean` and are left
at plain `boolean`; `basic/button-group.mdx` was already correct (objectui#6347)
and is the spelling the other 13 converged on.
No gate can see this drift — the rows live in `plaintext`/`text` fences and
`check-doc-snippet-types` compiles only `ts`/`tsx` (objectui#6143) — so the
invariant is pinned instead:
`packages/types/src/__tests__/component-docs-disabled-inherited-7239.test.ts`
holds all 14 inherited rows to the union, cross-checks against the shipped
interfaces so a re-narrowing fails pointing at `packages/types`, keeps the 8
independent rows at `boolean` as a blanket-replace control, and asserts the
two tables account for every documented row.
Also corrects the now-false 13-of-14 paragraph in the header of
`button-group-doc-surface-6347.test.ts` (comment text only; its assertions
are untouched and stay green).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NRRumy89BYdW9ogbcdHTho
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Console Performance Budget — gauge not trustworthy

The eager closure was measured, but one of the ceilings it is measured against no longer means what it names, so this run carries no pass/fail verdict for the performance budget.

This is not a budget violation. Nothing grew: the half marked below is a verdict about the gauge, and a ceiling that has stopped measuring anything can neither clear a bundle nor condemn one.

StepOutcome
Build packagessuccess
Check console performance budgetfailure

Which half objected:

Eager-closure halfVerdict
Aggregate closure ceiling✅ pass
Per-chunk ceilings✅ pass
Ceiling sensitivity (headroom)✅ pass
Ceiling freshness (checkout vs. base branch)⚠️ superseded ceiling

⚠️ A superseded ceiling is neither a size regression nor a drifted gauge. The bundle was measured correctly and the ceilings on the base branch are correct — but this checkout predates a change to them, so the verdicts above were weighed against numbers that are no longer in force. Nothing grew. Update this branch onto the base branch and let Bundle Analysis run again; do not widen a ceiling to clear it. The Check console performance budget step log names each superseded constant with both values (objectui#6245).

Reason: The entry chunk measured 142.6 KB, but the eager-closure half of this gate returned no trustworthy VERDICT: the report could not be read, a ceiling has drifted out of range of the regression it must catch, or (objectui#6245) a ceiling was replaced on the base branch after this checkout was made. The step log says which. This is not a passing budget — and it is not a size regression either.

See the workflow run for details.


📦 Bundle Size Report

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.33KB5.59KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)514.48KB117.36KB
core (index.js)5.55KB2.23KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.25KB61.73KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.92KB12.93KB
plugin-charts (index.js)70.02KB19.44KB
plugin-chatbot (index.js)190.53KB45.18KB
plugin-dashboard (index.js)132.63KB34.56KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)250.63KB63.90KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.78KB32.58KB
plugin-gantt (index.js)166.77KB40.76KB
plugin-grid (index.js)208.88KB56.59KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.51KB27.67KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)29.34KB8.47KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 48 chunks)3165.5 KB3191.4 KB
Main entry chunk (gzip)142.6 KB350 KB
Entry fileindex-BAsuzemp.js
StatusPASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.33KB5.59KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)514.48KB117.36KB
core (index.js)5.80KB2.32KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.25KB61.73KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)47.00KB12.97KB
plugin-charts (index.js)70.02KB19.44KB
plugin-chatbot (index.js)193.26KB45.80KB
plugin-dashboard (index.js)132.63KB34.56KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)250.63KB63.90KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.78KB32.58KB
plugin-gantt (index.js)166.93KB40.82KB
plugin-grid (index.js)208.88KB56.59KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.51KB27.67KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)29.15KB8.40KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants

@os-litant@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(components): spell the inherited disabled as boolean | string - #7341

Merged
os-litant merged 2 commits into
mainfrom
claude/issue-7239-docs-disabled-boolean-or-string
Sep 2, 2026
Merged

docs(components): spell the inherited disabled as boolean | string#7341
os-litant merged 2 commits into
mainfrom
claude/issue-7239-docs-disabled-boolean-or-string

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes#7239

The docs half of the #7087 ruling (maintainer, 2026-09-01, option 1 scoped to disabled). That ruling removed the 18 disabled?: boolean narrowings from the concrete schemas, so the member is now inherited from BaseSchema as boolean | string — a boolean, or a predicate expression on the same evaluated path as visible. 13 component pages went on spelling the removed narrowing in their illustrative interfaces, teaching a type the shipped tree no longer has. A reader copying those rows would conclude that disabled: "${data.status === 'locked'}" is invalid, which is exactly the capability the ruling restored.

Premise re-verified on the base, not taken from the card

Base ebc05b4d6. Every one of the 22 disabled?: rows under content/docs/components was attributed to its enclosing interface by walking back to the nearest declaration, rather than trusting the card's table — the table turned out to be exactly right, including the two files that carry one in-scope and one out-of-scope row each:

populationrowsdisposition
schemas inheriting disabled from BaseSchema13corrected to `boolean
basic/button-group.mdx (ButtonGroupSchema)1already correct (#6347); the spelling the other 13 converged on
independent item/option shapes8left at plain boolean

All 13 in-scope interfaces were confirmed to extends BaseSchema with no disabled of their own on this base, and all remaining disabled?: boolean declarations in packages/types/src were confirmed to belong to independent shapes (ListItem, AccordionItem, ToggleGroupItem, SelectOptionMetadata, SelectOption, RadioOption, FormField, ComboboxOption, TabItem, NavLink, ButtonGroupButton, MenuCommandItem) — so the narrowings really are gone and the pages really were the stale side.

Why a pin instead of a gate turning red-then-green

No gate can see this drift, and that was measured rather than assumed: check-doc-snippet-types.mjs compiles only the fence languages in its own TS_FENCE_LANGUAGES set (line 317: ts, tsx, typescript), and all 14 rows in question live in plaintext fences (13) or a text fence (1). check-doc-component-types reads only the type string literals. So a member row in those fences may name any type at all and every gate stays green — the hole #6143 records.

The new pin packages/types/src/__tests__/component-docs-disabled-inherited-7239.test.ts (44 cases) therefore carries the invariant:

  1. Inherited (14 rows) — the page's disabled row reads boolean | string, and the shipped interface of the same name still extends BaseSchema without redeclaring disabled. The second half is what keeps the pin honest in the other direction: a future re-narrowing fails pointing at packages/types, not at the page, because in that world the page would be the thing that is right.
  2. Independent (8 rows) — the item/option shapes still read exactly boolean. This is the blanket-replace control: a sweep that rewrote every disabled?: boolean under content/docs/components turns these red.
  3. Completeness — the two tables account for everydisabled?: row under content/docs/components by measurement, so a new page carrying the stale spelling fails here instead of sitting unclassified.

Boundary stated in the file rather than implied: the three overlay menu-item rows are doc-local names with no shipped counterpart (ContextMenuCommandItem / DropdownMenuCommandItem / MenubarCommandItem against a shipped MenuCommandItem), so only their doc text is asserted.

Bounded in-place fix, named with evidence

packages/types/src/__tests__/button-group-doc-surface-6347.test.ts header said 13 of those 14 component schemas REDECLARE disabled?: boolean themselves … so their pages are right. After #7087 that sentence is false in both halves. The paragraph is rewritten to mark the 13-of-14 reading as history and point at the new pin. Comment text only — mechanically confirmed: git diff -U0 on that file, with comment lines filtered out, is empty, and the file's assertions stay green in the run below (it is one of the 87 files in the packages/types suite).

It qualifies as a bounded in-place fix on all four counts: same defect class as the card (a stale disabled?: boolean reading left behind by #7087), mechanical with the correct shape pinned by the landed ruling, no other claim holds that file, and no new verification surface (it is already covered by the packages/types suite).

Ablation — mutation and restore both proven on disk

The pin resolves nothing through any package dist/ (it imports only vitest and node:fs / node:path / node:url and reads source files off disk), so no rebuild is involved in either leg; the mutations were confirmed by anchored text counts, not by an editor's exit code.

legmutation proven on diskpin result
all 13 pages reverted to their base blobswide_union_rows=0, bare_boolean_rows=1513 failed / 31 passed — each naming its own page; ButtonGroupSchema and all 8 independent rows stayed green
form/select.mdx alone narrowedinjected_bare=1, removed_wide=01 failed / 43 passedExpected: "form/select.mdx SelectSchema -> boolean | string" / Received: "... -> boolean"
form/form.mdxFormField alone widened (blanket-replace control)injected_wide=1, removed_bare=01 failed / 43 passedExpected: "form/form.mdx FormField -> boolean" / Received: "... -> boolean | string"

Those results match the predictions written into the pin's header before the first run. Every restore leg used git checkout HEAD -- ABSOLUTE_PATH under a trap … EXIT INT TERM with absolute paths, and was proven by blob hash rather than by an exit code: 13/13 and 2/2 disk hashes equal to their HEAD blobs, none empty, with git diff HEAD empty and git status --porcelain clean afterwards.

Verification — union run at dd802b688 on a clean tree

checkverdict line
the new pinTest Files 1 passed (1) / Tests 44 passed (44)
packages/types suiteTest Files 87 passed (87) / Tests 1221 passed (1221)
@object-ui/typestype-checkexit 0, all three projects; --listFiles on tsconfig.test.json confirms both touched test files are in the 543-file compiled set (tsconfig.json excludes **/*.test.ts, so this was checked rather than assumed)
check:doc-fences✅ check:doc-fences — every TypeScript block in 224 document(s) is fenced ts/tsx/typescript …
check:doc-types✅ Every documented component type is registered.
docs:check-linksLinks are valid across 17 scan roots.
check:control-bytes✅ check-control-bytes: OK (scanned 6026 tracked text file(s); skipped 85 binary).
check:docs-route-closure✅ MEASURED_PAYLOAD is honest …
check-changeset-presence✅ 2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) …
check-changeset-no-major✅ No changeset declares a major bump.
check-governed-queue-guard --test✅ NOT GOVERNED — 16 path(s) checked against 5 governed surface(s); none matched.

Declared narrowing — check:doc-snippets was not run locally. It exits 2, which its own output defines as PRECONDITION NOT MET … This is "I could not run", NOT "I ran and found errors" (exit 1): it needs a 25-package build first. The narrowing is backed by measurement, not convenience: (1) the population comes from the gate's own TS_FENCE_LANGUAGES set rather than a guess about which files count; (2) 0 of the 14 changed doc rows are in that population — 13 sit in plaintext fences, 1 in a text fence; (3) the diff adds and removes no fence and changes no fence language (check:doc-fences green), and the other two changed files are a comment-only test edit and a new test, neither of which is a document, so the gate's verdict on untouched files cannot move. CI runs it regardless.

A changeset is owed and is included with empty frontmatter (declaring that nothing releases) — the two touched files under packages/types/src/ are published source, so the presence gate asks; its own text calls the empty-frontmatter form "a pass, not a workaround", and there is precedent in .changeset/theme-schema-doc-rewrite-5648.md.

Staying draft for the PM to land. #7087 remains closed by its own PR and is only referenced here; nothing in this PR changes packages/types source or content/docs/releases/.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NRRumy89BYdW9ogbcdHTho

Generated by Claude Code


Generated by Claude Code

objectui#7087 (maintainer ruling 2026-09-01, option 1 scoped to `disabled`)
removed the 18 `disabled?: boolean` narrowings from the concrete schemas, so
the member is now inherited from `BaseSchema` as `boolean | string` — a
boolean, or a predicate expression on the same evaluated path as `visible`.
13 component pages went on spelling the removed narrowing in their
illustrative interfaces, teaching a type the shipped tree no longer has.
Each of the 22 `disabled?:` rows under `content/docs/components` was
attributed to its enclosing interface before editing: 13 belong to schemas
that inherit the member and were corrected; 8 belong to independent
item/option shapes that declare their own `disabled?: boolean` and are left
at plain `boolean`; `basic/button-group.mdx` was already correct (objectui#6347)
and is the spelling the other 13 converged on.
No gate can see this drift — the rows live in `plaintext`/`text` fences and
`check-doc-snippet-types` compiles only `ts`/`tsx` (objectui#6143) — so the
invariant is pinned instead:
`packages/types/src/__tests__/component-docs-disabled-inherited-7239.test.ts`
holds all 14 inherited rows to the union, cross-checks against the shipped
interfaces so a re-narrowing fails pointing at `packages/types`, keeps the 8
independent rows at `boolean` as a blanket-replace control, and asserts the
two tables account for every documented row.
Also corrects the now-false 13-of-14 paragraph in the header of
`button-group-doc-surface-6347.test.ts` (comment text only; its assertions
are untouched and stay green).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NRRumy89BYdW9ogbcdHTho
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Console Performance Budget — gauge not trustworthy

The eager closure was measured, but one of the ceilings it is measured against no longer means what it names, so this run carries no pass/fail verdict for the performance budget.

This is not a budget violation. Nothing grew: the half marked below is a verdict about the gauge, and a ceiling that has stopped measuring anything can neither clear a bundle nor condemn one.

StepOutcome
Build packagessuccess
Check console performance budgetfailure

Which half objected:

Eager-closure halfVerdict
Aggregate closure ceiling✅ pass
Per-chunk ceilings✅ pass
Ceiling sensitivity (headroom)✅ pass
Ceiling freshness (checkout vs. base branch)⚠️ superseded ceiling

⚠️ A superseded ceiling is neither a size regression nor a drifted gauge. The bundle was measured correctly and the ceilings on the base branch are correct — but this checkout predates a change to them, so the verdicts above were weighed against numbers that are no longer in force. Nothing grew. Update this branch onto the base branch and let Bundle Analysis run again; do not widen a ceiling to clear it. The Check console performance budget step log names each superseded constant with both values (objectui#6245).

Reason: The entry chunk measured 142.6 KB, but the eager-closure half of this gate returned no trustworthy VERDICT: the report could not be read, a ceiling has drifted out of range of the regression it must catch, or (objectui#6245) a ceiling was replaced on the base branch after this checkout was made. The step log says which. This is not a passing budget — and it is not a size regression either.

See the workflow run for details.


📦 Bundle Size Report

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.33KB5.59KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)514.48KB117.36KB
core (index.js)5.55KB2.23KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.25KB61.73KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.92KB12.93KB
plugin-charts (index.js)70.02KB19.44KB
plugin-chatbot (index.js)190.53KB45.18KB
plugin-dashboard (index.js)132.63KB34.56KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)250.63KB63.90KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.78KB32.58KB
plugin-gantt (index.js)166.77KB40.76KB
plugin-grid (index.js)208.88KB56.59KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.51KB27.67KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)29.34KB8.47KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 48 chunks)3165.5 KB3191.4 KB
Main entry chunk (gzip)142.6 KB350 KB
Entry fileindex-BAsuzemp.js
StatusPASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.33KB5.59KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)514.48KB117.36KB
core (index.js)5.80KB2.32KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.25KB61.73KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)47.00KB12.97KB
plugin-charts (index.js)70.02KB19.44KB
plugin-chatbot (index.js)193.26KB45.80KB
plugin-dashboard (index.js)132.63KB34.56KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)250.63KB63.90KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.78KB32.58KB
plugin-gantt (index.js)166.93KB40.82KB
plugin-grid (index.js)208.88KB56.59KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.51KB27.67KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)29.15KB8.40KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants

@os-litant@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(components): spell the inherited disabled as boolean | string - #7341

Merged
os-litant merged 2 commits into
mainfrom
claude/issue-7239-docs-disabled-boolean-or-string
Sep 2, 2026
Merged

docs(components): spell the inherited disabled as boolean | string#7341
os-litant merged 2 commits into
mainfrom
claude/issue-7239-docs-disabled-boolean-or-string

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes#7239

The docs half of the #7087 ruling (maintainer, 2026-09-01, option 1 scoped to disabled). That ruling removed the 18 disabled?: boolean narrowings from the concrete schemas, so the member is now inherited from BaseSchema as boolean | string — a boolean, or a predicate expression on the same evaluated path as visible. 13 component pages went on spelling the removed narrowing in their illustrative interfaces, teaching a type the shipped tree no longer has. A reader copying those rows would conclude that disabled: "${data.status === 'locked'}" is invalid, which is exactly the capability the ruling restored.

Premise re-verified on the base, not taken from the card

Base ebc05b4d6. Every one of the 22 disabled?: rows under content/docs/components was attributed to its enclosing interface by walking back to the nearest declaration, rather than trusting the card's table — the table turned out to be exactly right, including the two files that carry one in-scope and one out-of-scope row each:

populationrowsdisposition
schemas inheriting disabled from BaseSchema13corrected to `boolean
basic/button-group.mdx (ButtonGroupSchema)1already correct (#6347); the spelling the other 13 converged on
independent item/option shapes8left at plain boolean

All 13 in-scope interfaces were confirmed to extends BaseSchema with no disabled of their own on this base, and all remaining disabled?: boolean declarations in packages/types/src were confirmed to belong to independent shapes (ListItem, AccordionItem, ToggleGroupItem, SelectOptionMetadata, SelectOption, RadioOption, FormField, ComboboxOption, TabItem, NavLink, ButtonGroupButton, MenuCommandItem) — so the narrowings really are gone and the pages really were the stale side.

Why a pin instead of a gate turning red-then-green

No gate can see this drift, and that was measured rather than assumed: check-doc-snippet-types.mjs compiles only the fence languages in its own TS_FENCE_LANGUAGES set (line 317: ts, tsx, typescript), and all 14 rows in question live in plaintext fences (13) or a text fence (1). check-doc-component-types reads only the type string literals. So a member row in those fences may name any type at all and every gate stays green — the hole #6143 records.

The new pin packages/types/src/__tests__/component-docs-disabled-inherited-7239.test.ts (44 cases) therefore carries the invariant:

  1. Inherited (14 rows) — the page's disabled row reads boolean | string, and the shipped interface of the same name still extends BaseSchema without redeclaring disabled. The second half is what keeps the pin honest in the other direction: a future re-narrowing fails pointing at packages/types, not at the page, because in that world the page would be the thing that is right.
  2. Independent (8 rows) — the item/option shapes still read exactly boolean. This is the blanket-replace control: a sweep that rewrote every disabled?: boolean under content/docs/components turns these red.
  3. Completeness — the two tables account for everydisabled?: row under content/docs/components by measurement, so a new page carrying the stale spelling fails here instead of sitting unclassified.

Boundary stated in the file rather than implied: the three overlay menu-item rows are doc-local names with no shipped counterpart (ContextMenuCommandItem / DropdownMenuCommandItem / MenubarCommandItem against a shipped MenuCommandItem), so only their doc text is asserted.

Bounded in-place fix, named with evidence

packages/types/src/__tests__/button-group-doc-surface-6347.test.ts header said 13 of those 14 component schemas REDECLARE disabled?: boolean themselves … so their pages are right. After #7087 that sentence is false in both halves. The paragraph is rewritten to mark the 13-of-14 reading as history and point at the new pin. Comment text only — mechanically confirmed: git diff -U0 on that file, with comment lines filtered out, is empty, and the file's assertions stay green in the run below (it is one of the 87 files in the packages/types suite).

It qualifies as a bounded in-place fix on all four counts: same defect class as the card (a stale disabled?: boolean reading left behind by #7087), mechanical with the correct shape pinned by the landed ruling, no other claim holds that file, and no new verification surface (it is already covered by the packages/types suite).

Ablation — mutation and restore both proven on disk

The pin resolves nothing through any package dist/ (it imports only vitest and node:fs / node:path / node:url and reads source files off disk), so no rebuild is involved in either leg; the mutations were confirmed by anchored text counts, not by an editor's exit code.

legmutation proven on diskpin result
all 13 pages reverted to their base blobswide_union_rows=0, bare_boolean_rows=1513 failed / 31 passed — each naming its own page; ButtonGroupSchema and all 8 independent rows stayed green
form/select.mdx alone narrowedinjected_bare=1, removed_wide=01 failed / 43 passedExpected: "form/select.mdx SelectSchema -> boolean | string" / Received: "... -> boolean"
form/form.mdxFormField alone widened (blanket-replace control)injected_wide=1, removed_bare=01 failed / 43 passedExpected: "form/form.mdx FormField -> boolean" / Received: "... -> boolean | string"

Those results match the predictions written into the pin's header before the first run. Every restore leg used git checkout HEAD -- ABSOLUTE_PATH under a trap … EXIT INT TERM with absolute paths, and was proven by blob hash rather than by an exit code: 13/13 and 2/2 disk hashes equal to their HEAD blobs, none empty, with git diff HEAD empty and git status --porcelain clean afterwards.

Verification — union run at dd802b688 on a clean tree

checkverdict line
the new pinTest Files 1 passed (1) / Tests 44 passed (44)
packages/types suiteTest Files 87 passed (87) / Tests 1221 passed (1221)
@object-ui/typestype-checkexit 0, all three projects; --listFiles on tsconfig.test.json confirms both touched test files are in the 543-file compiled set (tsconfig.json excludes **/*.test.ts, so this was checked rather than assumed)
check:doc-fences✅ check:doc-fences — every TypeScript block in 224 document(s) is fenced ts/tsx/typescript …
check:doc-types✅ Every documented component type is registered.
docs:check-linksLinks are valid across 17 scan roots.
check:control-bytes✅ check-control-bytes: OK (scanned 6026 tracked text file(s); skipped 85 binary).
check:docs-route-closure✅ MEASURED_PAYLOAD is honest …
check-changeset-presence✅ 2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) …
check-changeset-no-major✅ No changeset declares a major bump.
check-governed-queue-guard --test✅ NOT GOVERNED — 16 path(s) checked against 5 governed surface(s); none matched.

Declared narrowing — check:doc-snippets was not run locally. It exits 2, which its own output defines as PRECONDITION NOT MET … This is "I could not run", NOT "I ran and found errors" (exit 1): it needs a 25-package build first. The narrowing is backed by measurement, not convenience: (1) the population comes from the gate's own TS_FENCE_LANGUAGES set rather than a guess about which files count; (2) 0 of the 14 changed doc rows are in that population — 13 sit in plaintext fences, 1 in a text fence; (3) the diff adds and removes no fence and changes no fence language (check:doc-fences green), and the other two changed files are a comment-only test edit and a new test, neither of which is a document, so the gate's verdict on untouched files cannot move. CI runs it regardless.

A changeset is owed and is included with empty frontmatter (declaring that nothing releases) — the two touched files under packages/types/src/ are published source, so the presence gate asks; its own text calls the empty-frontmatter form "a pass, not a workaround", and there is precedent in .changeset/theme-schema-doc-rewrite-5648.md.

Staying draft for the PM to land. #7087 remains closed by its own PR and is only referenced here; nothing in this PR changes packages/types source or content/docs/releases/.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NRRumy89BYdW9ogbcdHTho

Generated by Claude Code


Generated by Claude Code

objectui#7087 (maintainer ruling 2026-09-01, option 1 scoped to `disabled`)
removed the 18 `disabled?: boolean` narrowings from the concrete schemas, so
the member is now inherited from `BaseSchema` as `boolean | string` — a
boolean, or a predicate expression on the same evaluated path as `visible`.
13 component pages went on spelling the removed narrowing in their
illustrative interfaces, teaching a type the shipped tree no longer has.
Each of the 22 `disabled?:` rows under `content/docs/components` was
attributed to its enclosing interface before editing: 13 belong to schemas
that inherit the member and were corrected; 8 belong to independent
item/option shapes that declare their own `disabled?: boolean` and are left
at plain `boolean`; `basic/button-group.mdx` was already correct (objectui#6347)
and is the spelling the other 13 converged on.
No gate can see this drift — the rows live in `plaintext`/`text` fences and
`check-doc-snippet-types` compiles only `ts`/`tsx` (objectui#6143) — so the
invariant is pinned instead:
`packages/types/src/__tests__/component-docs-disabled-inherited-7239.test.ts`
holds all 14 inherited rows to the union, cross-checks against the shipped
interfaces so a re-narrowing fails pointing at `packages/types`, keeps the 8
independent rows at `boolean` as a blanket-replace control, and asserts the
two tables account for every documented row.
Also corrects the now-false 13-of-14 paragraph in the header of
`button-group-doc-surface-6347.test.ts` (comment text only; its assertions
are untouched and stay green).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NRRumy89BYdW9ogbcdHTho
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Console Performance Budget — gauge not trustworthy

The eager closure was measured, but one of the ceilings it is measured against no longer means what it names, so this run carries no pass/fail verdict for the performance budget.

This is not a budget violation. Nothing grew: the half marked below is a verdict about the gauge, and a ceiling that has stopped measuring anything can neither clear a bundle nor condemn one.

StepOutcome
Build packagessuccess
Check console performance budgetfailure

Which half objected:

Eager-closure halfVerdict
Aggregate closure ceiling✅ pass
Per-chunk ceilings✅ pass
Ceiling sensitivity (headroom)✅ pass
Ceiling freshness (checkout vs. base branch)⚠️ superseded ceiling

⚠️ A superseded ceiling is neither a size regression nor a drifted gauge. The bundle was measured correctly and the ceilings on the base branch are correct — but this checkout predates a change to them, so the verdicts above were weighed against numbers that are no longer in force. Nothing grew. Update this branch onto the base branch and let Bundle Analysis run again; do not widen a ceiling to clear it. The Check console performance budget step log names each superseded constant with both values (objectui#6245).

Reason: The entry chunk measured 142.6 KB, but the eager-closure half of this gate returned no trustworthy VERDICT: the report could not be read, a ceiling has drifted out of range of the regression it must catch, or (objectui#6245) a ceiling was replaced on the base branch after this checkout was made. The step log says which. This is not a passing budget — and it is not a size regression either.

See the workflow run for details.


📦 Bundle Size Report

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.33KB5.59KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)514.48KB117.36KB
core (index.js)5.55KB2.23KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.25KB61.73KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.92KB12.93KB
plugin-charts (index.js)70.02KB19.44KB
plugin-chatbot (index.js)190.53KB45.18KB
plugin-dashboard (index.js)132.63KB34.56KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)250.63KB63.90KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.78KB32.58KB
plugin-gantt (index.js)166.77KB40.76KB
plugin-grid (index.js)208.88KB56.59KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.51KB27.67KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)29.34KB8.47KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 48 chunks)3165.5 KB3191.4 KB
Main entry chunk (gzip)142.6 KB350 KB
Entry fileindex-BAsuzemp.js
StatusPASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.33KB5.59KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)514.48KB117.36KB
core (index.js)5.80KB2.32KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.25KB61.73KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)47.00KB12.97KB
plugin-charts (index.js)70.02KB19.44KB
plugin-chatbot (index.js)193.26KB45.80KB
plugin-dashboard (index.js)132.63KB34.56KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)250.63KB63.90KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.78KB32.58KB
plugin-gantt (index.js)166.93KB40.82KB
plugin-grid (index.js)208.88KB56.59KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.51KB27.67KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)29.15KB8.40KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants

@os-litant@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

docs(components): spell the inherited disabled as boolean | string - #7341

Merged
os-litant merged 2 commits into
mainfrom
claude/issue-7239-docs-disabled-boolean-or-string
Sep 2, 2026
Merged

docs(components): spell the inherited disabled as boolean | string#7341
os-litant merged 2 commits into
mainfrom
claude/issue-7239-docs-disabled-boolean-or-string

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes#7239

The docs half of the #7087 ruling (maintainer, 2026-09-01, option 1 scoped to disabled). That ruling removed the 18 disabled?: boolean narrowings from the concrete schemas, so the member is now inherited from BaseSchema as boolean | string — a boolean, or a predicate expression on the same evaluated path as visible. 13 component pages went on spelling the removed narrowing in their illustrative interfaces, teaching a type the shipped tree no longer has. A reader copying those rows would conclude that disabled: "${data.status === 'locked'}" is invalid, which is exactly the capability the ruling restored.

Premise re-verified on the base, not taken from the card

Base ebc05b4d6. Every one of the 22 disabled?: rows under content/docs/components was attributed to its enclosing interface by walking back to the nearest declaration, rather than trusting the card's table — the table turned out to be exactly right, including the two files that carry one in-scope and one out-of-scope row each:

populationrowsdisposition
schemas inheriting disabled from BaseSchema13corrected to `boolean
basic/button-group.mdx (ButtonGroupSchema)1already correct (#6347); the spelling the other 13 converged on
independent item/option shapes8left at plain boolean

All 13 in-scope interfaces were confirmed to extends BaseSchema with no disabled of their own on this base, and all remaining disabled?: boolean declarations in packages/types/src were confirmed to belong to independent shapes (ListItem, AccordionItem, ToggleGroupItem, SelectOptionMetadata, SelectOption, RadioOption, FormField, ComboboxOption, TabItem, NavLink, ButtonGroupButton, MenuCommandItem) — so the narrowings really are gone and the pages really were the stale side.

Why a pin instead of a gate turning red-then-green

No gate can see this drift, and that was measured rather than assumed: check-doc-snippet-types.mjs compiles only the fence languages in its own TS_FENCE_LANGUAGES set (line 317: ts, tsx, typescript), and all 14 rows in question live in plaintext fences (13) or a text fence (1). check-doc-component-types reads only the type string literals. So a member row in those fences may name any type at all and every gate stays green — the hole #6143 records.

The new pin packages/types/src/__tests__/component-docs-disabled-inherited-7239.test.ts (44 cases) therefore carries the invariant:

  1. Inherited (14 rows) — the page's disabled row reads boolean | string, and the shipped interface of the same name still extends BaseSchema without redeclaring disabled. The second half is what keeps the pin honest in the other direction: a future re-narrowing fails pointing at packages/types, not at the page, because in that world the page would be the thing that is right.
  2. Independent (8 rows) — the item/option shapes still read exactly boolean. This is the blanket-replace control: a sweep that rewrote every disabled?: boolean under content/docs/components turns these red.
  3. Completeness — the two tables account for everydisabled?: row under content/docs/components by measurement, so a new page carrying the stale spelling fails here instead of sitting unclassified.

Boundary stated in the file rather than implied: the three overlay menu-item rows are doc-local names with no shipped counterpart (ContextMenuCommandItem / DropdownMenuCommandItem / MenubarCommandItem against a shipped MenuCommandItem), so only their doc text is asserted.

Bounded in-place fix, named with evidence

packages/types/src/__tests__/button-group-doc-surface-6347.test.ts header said 13 of those 14 component schemas REDECLARE disabled?: boolean themselves … so their pages are right. After #7087 that sentence is false in both halves. The paragraph is rewritten to mark the 13-of-14 reading as history and point at the new pin. Comment text only — mechanically confirmed: git diff -U0 on that file, with comment lines filtered out, is empty, and the file's assertions stay green in the run below (it is one of the 87 files in the packages/types suite).

It qualifies as a bounded in-place fix on all four counts: same defect class as the card (a stale disabled?: boolean reading left behind by #7087), mechanical with the correct shape pinned by the landed ruling, no other claim holds that file, and no new verification surface (it is already covered by the packages/types suite).

Ablation — mutation and restore both proven on disk

The pin resolves nothing through any package dist/ (it imports only vitest and node:fs / node:path / node:url and reads source files off disk), so no rebuild is involved in either leg; the mutations were confirmed by anchored text counts, not by an editor's exit code.

legmutation proven on diskpin result
all 13 pages reverted to their base blobswide_union_rows=0, bare_boolean_rows=1513 failed / 31 passed — each naming its own page; ButtonGroupSchema and all 8 independent rows stayed green
form/select.mdx alone narrowedinjected_bare=1, removed_wide=01 failed / 43 passedExpected: "form/select.mdx SelectSchema -> boolean | string" / Received: "... -> boolean"
form/form.mdxFormField alone widened (blanket-replace control)injected_wide=1, removed_bare=01 failed / 43 passedExpected: "form/form.mdx FormField -> boolean" / Received: "... -> boolean | string"

Those results match the predictions written into the pin's header before the first run. Every restore leg used git checkout HEAD -- ABSOLUTE_PATH under a trap … EXIT INT TERM with absolute paths, and was proven by blob hash rather than by an exit code: 13/13 and 2/2 disk hashes equal to their HEAD blobs, none empty, with git diff HEAD empty and git status --porcelain clean afterwards.

Verification — union run at dd802b688 on a clean tree

checkverdict line
the new pinTest Files 1 passed (1) / Tests 44 passed (44)
packages/types suiteTest Files 87 passed (87) / Tests 1221 passed (1221)
@object-ui/typestype-checkexit 0, all three projects; --listFiles on tsconfig.test.json confirms both touched test files are in the 543-file compiled set (tsconfig.json excludes **/*.test.ts, so this was checked rather than assumed)
check:doc-fences✅ check:doc-fences — every TypeScript block in 224 document(s) is fenced ts/tsx/typescript …
check:doc-types✅ Every documented component type is registered.
docs:check-linksLinks are valid across 17 scan roots.
check:control-bytes✅ check-control-bytes: OK (scanned 6026 tracked text file(s); skipped 85 binary).
check:docs-route-closure✅ MEASURED_PAYLOAD is honest …
check-changeset-presence✅ 2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) …
check-changeset-no-major✅ No changeset declares a major bump.
check-governed-queue-guard --test✅ NOT GOVERNED — 16 path(s) checked against 5 governed surface(s); none matched.

Declared narrowing — check:doc-snippets was not run locally. It exits 2, which its own output defines as PRECONDITION NOT MET … This is "I could not run", NOT "I ran and found errors" (exit 1): it needs a 25-package build first. The narrowing is backed by measurement, not convenience: (1) the population comes from the gate's own TS_FENCE_LANGUAGES set rather than a guess about which files count; (2) 0 of the 14 changed doc rows are in that population — 13 sit in plaintext fences, 1 in a text fence; (3) the diff adds and removes no fence and changes no fence language (check:doc-fences green), and the other two changed files are a comment-only test edit and a new test, neither of which is a document, so the gate's verdict on untouched files cannot move. CI runs it regardless.

A changeset is owed and is included with empty frontmatter (declaring that nothing releases) — the two touched files under packages/types/src/ are published source, so the presence gate asks; its own text calls the empty-frontmatter form "a pass, not a workaround", and there is precedent in .changeset/theme-schema-doc-rewrite-5648.md.

Staying draft for the PM to land. #7087 remains closed by its own PR and is only referenced here; nothing in this PR changes packages/types source or content/docs/releases/.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NRRumy89BYdW9ogbcdHTho

Generated by Claude Code


Generated by Claude Code

objectui#7087 (maintainer ruling 2026-09-01, option 1 scoped to `disabled`)
removed the 18 `disabled?: boolean` narrowings from the concrete schemas, so
the member is now inherited from `BaseSchema` as `boolean | string` — a
boolean, or a predicate expression on the same evaluated path as `visible`.
13 component pages went on spelling the removed narrowing in their
illustrative interfaces, teaching a type the shipped tree no longer has.
Each of the 22 `disabled?:` rows under `content/docs/components` was
attributed to its enclosing interface before editing: 13 belong to schemas
that inherit the member and were corrected; 8 belong to independent
item/option shapes that declare their own `disabled?: boolean` and are left
at plain `boolean`; `basic/button-group.mdx` was already correct (objectui#6347)
and is the spelling the other 13 converged on.
No gate can see this drift — the rows live in `plaintext`/`text` fences and
`check-doc-snippet-types` compiles only `ts`/`tsx` (objectui#6143) — so the
invariant is pinned instead:
`packages/types/src/__tests__/component-docs-disabled-inherited-7239.test.ts`
holds all 14 inherited rows to the union, cross-checks against the shipped
interfaces so a re-narrowing fails pointing at `packages/types`, keeps the 8
independent rows at `boolean` as a blanket-replace control, and asserts the
two tables account for every documented row.
Also corrects the now-false 13-of-14 paragraph in the header of
`button-group-doc-surface-6347.test.ts` (comment text only; its assertions
are untouched and stay green).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NRRumy89BYdW9ogbcdHTho
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Console Performance Budget — gauge not trustworthy

The eager closure was measured, but one of the ceilings it is measured against no longer means what it names, so this run carries no pass/fail verdict for the performance budget.

This is not a budget violation. Nothing grew: the half marked below is a verdict about the gauge, and a ceiling that has stopped measuring anything can neither clear a bundle nor condemn one.

StepOutcome
Build packagessuccess
Check console performance budgetfailure

Which half objected:

Eager-closure halfVerdict
Aggregate closure ceiling✅ pass
Per-chunk ceilings✅ pass
Ceiling sensitivity (headroom)✅ pass
Ceiling freshness (checkout vs. base branch)⚠️ superseded ceiling

⚠️ A superseded ceiling is neither a size regression nor a drifted gauge. The bundle was measured correctly and the ceilings on the base branch are correct — but this checkout predates a change to them, so the verdicts above were weighed against numbers that are no longer in force. Nothing grew. Update this branch onto the base branch and let Bundle Analysis run again; do not widen a ceiling to clear it. The Check console performance budget step log names each superseded constant with both values (objectui#6245).

Reason: The entry chunk measured 142.6 KB, but the eager-closure half of this gate returned no trustworthy VERDICT: the report could not be read, a ceiling has drifted out of range of the regression it must catch, or (objectui#6245) a ceiling was replaced on the base branch after this checkout was made. The step log says which. This is not a passing budget — and it is not a size regression either.

See the workflow run for details.


📦 Bundle Size Report

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.33KB5.59KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)514.48KB117.36KB
core (index.js)5.55KB2.23KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.25KB61.73KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.92KB12.93KB
plugin-charts (index.js)70.02KB19.44KB
plugin-chatbot (index.js)190.53KB45.18KB
plugin-dashboard (index.js)132.63KB34.56KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)250.63KB63.90KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.78KB32.58KB
plugin-gantt (index.js)166.77KB40.76KB
plugin-grid (index.js)208.88KB56.59KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.51KB27.67KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)29.34KB8.47KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 48 chunks)3165.5 KB3191.4 KB
Main entry chunk (gzip)142.6 KB350 KB
Entry fileindex-BAsuzemp.js
StatusPASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.33KB5.59KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)514.48KB117.36KB
core (index.js)5.80KB2.32KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.25KB61.73KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)47.00KB12.97KB
plugin-charts (index.js)70.02KB19.44KB
plugin-chatbot (index.js)193.26KB45.80KB
plugin-dashboard (index.js)132.63KB34.56KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)250.63KB63.90KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.78KB32.58KB
plugin-gantt (index.js)166.93KB40.82KB
plugin-grid (index.js)208.88KB56.59KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.51KB27.67KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)29.15KB8.40KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants

@os-litant@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(components): spell the inherited disabled as boolean | string - #7341

Merged
os-litant merged 2 commits into
mainfrom
claude/issue-7239-docs-disabled-boolean-or-string
Sep 2, 2026
Merged

docs(components): spell the inherited disabled as boolean | string#7341
os-litant merged 2 commits into
mainfrom
claude/issue-7239-docs-disabled-boolean-or-string

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes#7239

The docs half of the #7087 ruling (maintainer, 2026-09-01, option 1 scoped to disabled). That ruling removed the 18 disabled?: boolean narrowings from the concrete schemas, so the member is now inherited from BaseSchema as boolean | string — a boolean, or a predicate expression on the same evaluated path as visible. 13 component pages went on spelling the removed narrowing in their illustrative interfaces, teaching a type the shipped tree no longer has. A reader copying those rows would conclude that disabled: "${data.status === 'locked'}" is invalid, which is exactly the capability the ruling restored.

Premise re-verified on the base, not taken from the card

Base ebc05b4d6. Every one of the 22 disabled?: rows under content/docs/components was attributed to its enclosing interface by walking back to the nearest declaration, rather than trusting the card's table — the table turned out to be exactly right, including the two files that carry one in-scope and one out-of-scope row each:

populationrowsdisposition
schemas inheriting disabled from BaseSchema13corrected to `boolean
basic/button-group.mdx (ButtonGroupSchema)1already correct (#6347); the spelling the other 13 converged on
independent item/option shapes8left at plain boolean

All 13 in-scope interfaces were confirmed to extends BaseSchema with no disabled of their own on this base, and all remaining disabled?: boolean declarations in packages/types/src were confirmed to belong to independent shapes (ListItem, AccordionItem, ToggleGroupItem, SelectOptionMetadata, SelectOption, RadioOption, FormField, ComboboxOption, TabItem, NavLink, ButtonGroupButton, MenuCommandItem) — so the narrowings really are gone and the pages really were the stale side.

Why a pin instead of a gate turning red-then-green

No gate can see this drift, and that was measured rather than assumed: check-doc-snippet-types.mjs compiles only the fence languages in its own TS_FENCE_LANGUAGES set (line 317: ts, tsx, typescript), and all 14 rows in question live in plaintext fences (13) or a text fence (1). check-doc-component-types reads only the type string literals. So a member row in those fences may name any type at all and every gate stays green — the hole #6143 records.

The new pin packages/types/src/__tests__/component-docs-disabled-inherited-7239.test.ts (44 cases) therefore carries the invariant:

  1. Inherited (14 rows) — the page's disabled row reads boolean | string, and the shipped interface of the same name still extends BaseSchema without redeclaring disabled. The second half is what keeps the pin honest in the other direction: a future re-narrowing fails pointing at packages/types, not at the page, because in that world the page would be the thing that is right.
  2. Independent (8 rows) — the item/option shapes still read exactly boolean. This is the blanket-replace control: a sweep that rewrote every disabled?: boolean under content/docs/components turns these red.
  3. Completeness — the two tables account for everydisabled?: row under content/docs/components by measurement, so a new page carrying the stale spelling fails here instead of sitting unclassified.

Boundary stated in the file rather than implied: the three overlay menu-item rows are doc-local names with no shipped counterpart (ContextMenuCommandItem / DropdownMenuCommandItem / MenubarCommandItem against a shipped MenuCommandItem), so only their doc text is asserted.

Bounded in-place fix, named with evidence

packages/types/src/__tests__/button-group-doc-surface-6347.test.ts header said 13 of those 14 component schemas REDECLARE disabled?: boolean themselves … so their pages are right. After #7087 that sentence is false in both halves. The paragraph is rewritten to mark the 13-of-14 reading as history and point at the new pin. Comment text only — mechanically confirmed: git diff -U0 on that file, with comment lines filtered out, is empty, and the file's assertions stay green in the run below (it is one of the 87 files in the packages/types suite).

It qualifies as a bounded in-place fix on all four counts: same defect class as the card (a stale disabled?: boolean reading left behind by #7087), mechanical with the correct shape pinned by the landed ruling, no other claim holds that file, and no new verification surface (it is already covered by the packages/types suite).

Ablation — mutation and restore both proven on disk

The pin resolves nothing through any package dist/ (it imports only vitest and node:fs / node:path / node:url and reads source files off disk), so no rebuild is involved in either leg; the mutations were confirmed by anchored text counts, not by an editor's exit code.

legmutation proven on diskpin result
all 13 pages reverted to their base blobswide_union_rows=0, bare_boolean_rows=1513 failed / 31 passed — each naming its own page; ButtonGroupSchema and all 8 independent rows stayed green
form/select.mdx alone narrowedinjected_bare=1, removed_wide=01 failed / 43 passedExpected: "form/select.mdx SelectSchema -> boolean | string" / Received: "... -> boolean"
form/form.mdxFormField alone widened (blanket-replace control)injected_wide=1, removed_bare=01 failed / 43 passedExpected: "form/form.mdx FormField -> boolean" / Received: "... -> boolean | string"

Those results match the predictions written into the pin's header before the first run. Every restore leg used git checkout HEAD -- ABSOLUTE_PATH under a trap … EXIT INT TERM with absolute paths, and was proven by blob hash rather than by an exit code: 13/13 and 2/2 disk hashes equal to their HEAD blobs, none empty, with git diff HEAD empty and git status --porcelain clean afterwards.

Verification — union run at dd802b688 on a clean tree

checkverdict line
the new pinTest Files 1 passed (1) / Tests 44 passed (44)
packages/types suiteTest Files 87 passed (87) / Tests 1221 passed (1221)
@object-ui/typestype-checkexit 0, all three projects; --listFiles on tsconfig.test.json confirms both touched test files are in the 543-file compiled set (tsconfig.json excludes **/*.test.ts, so this was checked rather than assumed)
check:doc-fences✅ check:doc-fences — every TypeScript block in 224 document(s) is fenced ts/tsx/typescript …
check:doc-types✅ Every documented component type is registered.
docs:check-linksLinks are valid across 17 scan roots.
check:control-bytes✅ check-control-bytes: OK (scanned 6026 tracked text file(s); skipped 85 binary).
check:docs-route-closure✅ MEASURED_PAYLOAD is honest …
check-changeset-presence✅ 2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) …
check-changeset-no-major✅ No changeset declares a major bump.
check-governed-queue-guard --test✅ NOT GOVERNED — 16 path(s) checked against 5 governed surface(s); none matched.

Declared narrowing — check:doc-snippets was not run locally. It exits 2, which its own output defines as PRECONDITION NOT MET … This is "I could not run", NOT "I ran and found errors" (exit 1): it needs a 25-package build first. The narrowing is backed by measurement, not convenience: (1) the population comes from the gate's own TS_FENCE_LANGUAGES set rather than a guess about which files count; (2) 0 of the 14 changed doc rows are in that population — 13 sit in plaintext fences, 1 in a text fence; (3) the diff adds and removes no fence and changes no fence language (check:doc-fences green), and the other two changed files are a comment-only test edit and a new test, neither of which is a document, so the gate's verdict on untouched files cannot move. CI runs it regardless.

A changeset is owed and is included with empty frontmatter (declaring that nothing releases) — the two touched files under packages/types/src/ are published source, so the presence gate asks; its own text calls the empty-frontmatter form "a pass, not a workaround", and there is precedent in .changeset/theme-schema-doc-rewrite-5648.md.

Staying draft for the PM to land. #7087 remains closed by its own PR and is only referenced here; nothing in this PR changes packages/types source or content/docs/releases/.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NRRumy89BYdW9ogbcdHTho

Generated by Claude Code


Generated by Claude Code

objectui#7087 (maintainer ruling 2026-09-01, option 1 scoped to `disabled`)
removed the 18 `disabled?: boolean` narrowings from the concrete schemas, so
the member is now inherited from `BaseSchema` as `boolean | string` — a
boolean, or a predicate expression on the same evaluated path as `visible`.
13 component pages went on spelling the removed narrowing in their
illustrative interfaces, teaching a type the shipped tree no longer has.
Each of the 22 `disabled?:` rows under `content/docs/components` was
attributed to its enclosing interface before editing: 13 belong to schemas
that inherit the member and were corrected; 8 belong to independent
item/option shapes that declare their own `disabled?: boolean` and are left
at plain `boolean`; `basic/button-group.mdx` was already correct (objectui#6347)
and is the spelling the other 13 converged on.
No gate can see this drift — the rows live in `plaintext`/`text` fences and
`check-doc-snippet-types` compiles only `ts`/`tsx` (objectui#6143) — so the
invariant is pinned instead:
`packages/types/src/__tests__/component-docs-disabled-inherited-7239.test.ts`
holds all 14 inherited rows to the union, cross-checks against the shipped
interfaces so a re-narrowing fails pointing at `packages/types`, keeps the 8
independent rows at `boolean` as a blanket-replace control, and asserts the
two tables account for every documented row.
Also corrects the now-false 13-of-14 paragraph in the header of
`button-group-doc-surface-6347.test.ts` (comment text only; its assertions
are untouched and stay green).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NRRumy89BYdW9ogbcdHTho
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Console Performance Budget — gauge not trustworthy

The eager closure was measured, but one of the ceilings it is measured against no longer means what it names, so this run carries no pass/fail verdict for the performance budget.

This is not a budget violation. Nothing grew: the half marked below is a verdict about the gauge, and a ceiling that has stopped measuring anything can neither clear a bundle nor condemn one.

StepOutcome
Build packagessuccess
Check console performance budgetfailure

Which half objected:

Eager-closure halfVerdict
Aggregate closure ceiling✅ pass
Per-chunk ceilings✅ pass
Ceiling sensitivity (headroom)✅ pass
Ceiling freshness (checkout vs. base branch)⚠️ superseded ceiling

⚠️ A superseded ceiling is neither a size regression nor a drifted gauge. The bundle was measured correctly and the ceilings on the base branch are correct — but this checkout predates a change to them, so the verdicts above were weighed against numbers that are no longer in force. Nothing grew. Update this branch onto the base branch and let Bundle Analysis run again; do not widen a ceiling to clear it. The Check console performance budget step log names each superseded constant with both values (objectui#6245).

Reason: The entry chunk measured 142.6 KB, but the eager-closure half of this gate returned no trustworthy VERDICT: the report could not be read, a ceiling has drifted out of range of the regression it must catch, or (objectui#6245) a ceiling was replaced on the base branch after this checkout was made. The step log says which. This is not a passing budget — and it is not a size regression either.

See the workflow run for details.


📦 Bundle Size Report

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.33KB5.59KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)514.48KB117.36KB
core (index.js)5.55KB2.23KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.25KB61.73KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.92KB12.93KB
plugin-charts (index.js)70.02KB19.44KB
plugin-chatbot (index.js)190.53KB45.18KB
plugin-dashboard (index.js)132.63KB34.56KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)250.63KB63.90KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.78KB32.58KB
plugin-gantt (index.js)166.77KB40.76KB
plugin-grid (index.js)208.88KB56.59KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.51KB27.67KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)29.34KB8.47KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 48 chunks)3165.5 KB3191.4 KB
Main entry chunk (gzip)142.6 KB350 KB
Entry fileindex-BAsuzemp.js
StatusPASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.33KB5.59KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)514.48KB117.36KB
core (index.js)5.80KB2.32KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.25KB61.73KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)47.00KB12.97KB
plugin-charts (index.js)70.02KB19.44KB
plugin-chatbot (index.js)193.26KB45.80KB
plugin-dashboard (index.js)132.63KB34.56KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)250.63KB63.90KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.78KB32.58KB
plugin-gantt (index.js)166.93KB40.82KB
plugin-grid (index.js)208.88KB56.59KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.51KB27.67KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)29.15KB8.40KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants

@os-litant@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(components): spell the inherited disabled as boolean | string - #7341

Merged
os-litant merged 2 commits into
mainfrom
claude/issue-7239-docs-disabled-boolean-or-string
Sep 2, 2026
Merged

docs(components): spell the inherited disabled as boolean | string#7341
os-litant merged 2 commits into
mainfrom
claude/issue-7239-docs-disabled-boolean-or-string

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes#7239

The docs half of the #7087 ruling (maintainer, 2026-09-01, option 1 scoped to disabled). That ruling removed the 18 disabled?: boolean narrowings from the concrete schemas, so the member is now inherited from BaseSchema as boolean | string — a boolean, or a predicate expression on the same evaluated path as visible. 13 component pages went on spelling the removed narrowing in their illustrative interfaces, teaching a type the shipped tree no longer has. A reader copying those rows would conclude that disabled: "${data.status === 'locked'}" is invalid, which is exactly the capability the ruling restored.

Premise re-verified on the base, not taken from the card

Base ebc05b4d6. Every one of the 22 disabled?: rows under content/docs/components was attributed to its enclosing interface by walking back to the nearest declaration, rather than trusting the card's table — the table turned out to be exactly right, including the two files that carry one in-scope and one out-of-scope row each:

populationrowsdisposition
schemas inheriting disabled from BaseSchema13corrected to `boolean
basic/button-group.mdx (ButtonGroupSchema)1already correct (#6347); the spelling the other 13 converged on
independent item/option shapes8left at plain boolean

All 13 in-scope interfaces were confirmed to extends BaseSchema with no disabled of their own on this base, and all remaining disabled?: boolean declarations in packages/types/src were confirmed to belong to independent shapes (ListItem, AccordionItem, ToggleGroupItem, SelectOptionMetadata, SelectOption, RadioOption, FormField, ComboboxOption, TabItem, NavLink, ButtonGroupButton, MenuCommandItem) — so the narrowings really are gone and the pages really were the stale side.

Why a pin instead of a gate turning red-then-green

No gate can see this drift, and that was measured rather than assumed: check-doc-snippet-types.mjs compiles only the fence languages in its own TS_FENCE_LANGUAGES set (line 317: ts, tsx, typescript), and all 14 rows in question live in plaintext fences (13) or a text fence (1). check-doc-component-types reads only the type string literals. So a member row in those fences may name any type at all and every gate stays green — the hole #6143 records.

The new pin packages/types/src/__tests__/component-docs-disabled-inherited-7239.test.ts (44 cases) therefore carries the invariant:

  1. Inherited (14 rows) — the page's disabled row reads boolean | string, and the shipped interface of the same name still extends BaseSchema without redeclaring disabled. The second half is what keeps the pin honest in the other direction: a future re-narrowing fails pointing at packages/types, not at the page, because in that world the page would be the thing that is right.
  2. Independent (8 rows) — the item/option shapes still read exactly boolean. This is the blanket-replace control: a sweep that rewrote every disabled?: boolean under content/docs/components turns these red.
  3. Completeness — the two tables account for everydisabled?: row under content/docs/components by measurement, so a new page carrying the stale spelling fails here instead of sitting unclassified.

Boundary stated in the file rather than implied: the three overlay menu-item rows are doc-local names with no shipped counterpart (ContextMenuCommandItem / DropdownMenuCommandItem / MenubarCommandItem against a shipped MenuCommandItem), so only their doc text is asserted.

Bounded in-place fix, named with evidence

packages/types/src/__tests__/button-group-doc-surface-6347.test.ts header said 13 of those 14 component schemas REDECLARE disabled?: boolean themselves … so their pages are right. After #7087 that sentence is false in both halves. The paragraph is rewritten to mark the 13-of-14 reading as history and point at the new pin. Comment text only — mechanically confirmed: git diff -U0 on that file, with comment lines filtered out, is empty, and the file's assertions stay green in the run below (it is one of the 87 files in the packages/types suite).

It qualifies as a bounded in-place fix on all four counts: same defect class as the card (a stale disabled?: boolean reading left behind by #7087), mechanical with the correct shape pinned by the landed ruling, no other claim holds that file, and no new verification surface (it is already covered by the packages/types suite).

Ablation — mutation and restore both proven on disk

The pin resolves nothing through any package dist/ (it imports only vitest and node:fs / node:path / node:url and reads source files off disk), so no rebuild is involved in either leg; the mutations were confirmed by anchored text counts, not by an editor's exit code.

legmutation proven on diskpin result
all 13 pages reverted to their base blobswide_union_rows=0, bare_boolean_rows=1513 failed / 31 passed — each naming its own page; ButtonGroupSchema and all 8 independent rows stayed green
form/select.mdx alone narrowedinjected_bare=1, removed_wide=01 failed / 43 passedExpected: "form/select.mdx SelectSchema -> boolean | string" / Received: "... -> boolean"
form/form.mdxFormField alone widened (blanket-replace control)injected_wide=1, removed_bare=01 failed / 43 passedExpected: "form/form.mdx FormField -> boolean" / Received: "... -> boolean | string"

Those results match the predictions written into the pin's header before the first run. Every restore leg used git checkout HEAD -- ABSOLUTE_PATH under a trap … EXIT INT TERM with absolute paths, and was proven by blob hash rather than by an exit code: 13/13 and 2/2 disk hashes equal to their HEAD blobs, none empty, with git diff HEAD empty and git status --porcelain clean afterwards.

Verification — union run at dd802b688 on a clean tree

checkverdict line
the new pinTest Files 1 passed (1) / Tests 44 passed (44)
packages/types suiteTest Files 87 passed (87) / Tests 1221 passed (1221)
@object-ui/typestype-checkexit 0, all three projects; --listFiles on tsconfig.test.json confirms both touched test files are in the 543-file compiled set (tsconfig.json excludes **/*.test.ts, so this was checked rather than assumed)
check:doc-fences✅ check:doc-fences — every TypeScript block in 224 document(s) is fenced ts/tsx/typescript …
check:doc-types✅ Every documented component type is registered.
docs:check-linksLinks are valid across 17 scan roots.
check:control-bytes✅ check-control-bytes: OK (scanned 6026 tracked text file(s); skipped 85 binary).
check:docs-route-closure✅ MEASURED_PAYLOAD is honest …
check-changeset-presence✅ 2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) …
check-changeset-no-major✅ No changeset declares a major bump.
check-governed-queue-guard --test✅ NOT GOVERNED — 16 path(s) checked against 5 governed surface(s); none matched.

Declared narrowing — check:doc-snippets was not run locally. It exits 2, which its own output defines as PRECONDITION NOT MET … This is "I could not run", NOT "I ran and found errors" (exit 1): it needs a 25-package build first. The narrowing is backed by measurement, not convenience: (1) the population comes from the gate's own TS_FENCE_LANGUAGES set rather than a guess about which files count; (2) 0 of the 14 changed doc rows are in that population — 13 sit in plaintext fences, 1 in a text fence; (3) the diff adds and removes no fence and changes no fence language (check:doc-fences green), and the other two changed files are a comment-only test edit and a new test, neither of which is a document, so the gate's verdict on untouched files cannot move. CI runs it regardless.

A changeset is owed and is included with empty frontmatter (declaring that nothing releases) — the two touched files under packages/types/src/ are published source, so the presence gate asks; its own text calls the empty-frontmatter form "a pass, not a workaround", and there is precedent in .changeset/theme-schema-doc-rewrite-5648.md.

Staying draft for the PM to land. #7087 remains closed by its own PR and is only referenced here; nothing in this PR changes packages/types source or content/docs/releases/.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NRRumy89BYdW9ogbcdHTho

Generated by Claude Code


Generated by Claude Code

objectui#7087 (maintainer ruling 2026-09-01, option 1 scoped to `disabled`)
removed the 18 `disabled?: boolean` narrowings from the concrete schemas, so
the member is now inherited from `BaseSchema` as `boolean | string` — a
boolean, or a predicate expression on the same evaluated path as `visible`.
13 component pages went on spelling the removed narrowing in their
illustrative interfaces, teaching a type the shipped tree no longer has.
Each of the 22 `disabled?:` rows under `content/docs/components` was
attributed to its enclosing interface before editing: 13 belong to schemas
that inherit the member and were corrected; 8 belong to independent
item/option shapes that declare their own `disabled?: boolean` and are left
at plain `boolean`; `basic/button-group.mdx` was already correct (objectui#6347)
and is the spelling the other 13 converged on.
No gate can see this drift — the rows live in `plaintext`/`text` fences and
`check-doc-snippet-types` compiles only `ts`/`tsx` (objectui#6143) — so the
invariant is pinned instead:
`packages/types/src/__tests__/component-docs-disabled-inherited-7239.test.ts`
holds all 14 inherited rows to the union, cross-checks against the shipped
interfaces so a re-narrowing fails pointing at `packages/types`, keeps the 8
independent rows at `boolean` as a blanket-replace control, and asserts the
two tables account for every documented row.
Also corrects the now-false 13-of-14 paragraph in the header of
`button-group-doc-surface-6347.test.ts` (comment text only; its assertions
are untouched and stay green).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NRRumy89BYdW9ogbcdHTho
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Console Performance Budget — gauge not trustworthy

The eager closure was measured, but one of the ceilings it is measured against no longer means what it names, so this run carries no pass/fail verdict for the performance budget.

This is not a budget violation. Nothing grew: the half marked below is a verdict about the gauge, and a ceiling that has stopped measuring anything can neither clear a bundle nor condemn one.

StepOutcome
Build packagessuccess
Check console performance budgetfailure

Which half objected:

Eager-closure halfVerdict
Aggregate closure ceiling✅ pass
Per-chunk ceilings✅ pass
Ceiling sensitivity (headroom)✅ pass
Ceiling freshness (checkout vs. base branch)⚠️ superseded ceiling

⚠️ A superseded ceiling is neither a size regression nor a drifted gauge. The bundle was measured correctly and the ceilings on the base branch are correct — but this checkout predates a change to them, so the verdicts above were weighed against numbers that are no longer in force. Nothing grew. Update this branch onto the base branch and let Bundle Analysis run again; do not widen a ceiling to clear it. The Check console performance budget step log names each superseded constant with both values (objectui#6245).

Reason: The entry chunk measured 142.6 KB, but the eager-closure half of this gate returned no trustworthy VERDICT: the report could not be read, a ceiling has drifted out of range of the regression it must catch, or (objectui#6245) a ceiling was replaced on the base branch after this checkout was made. The step log says which. This is not a passing budget — and it is not a size regression either.

See the workflow run for details.


📦 Bundle Size Report

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.33KB5.59KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)514.48KB117.36KB
core (index.js)5.55KB2.23KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.25KB61.73KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.92KB12.93KB
plugin-charts (index.js)70.02KB19.44KB
plugin-chatbot (index.js)190.53KB45.18KB
plugin-dashboard (index.js)132.63KB34.56KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)250.63KB63.90KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.78KB32.58KB
plugin-gantt (index.js)166.77KB40.76KB
plugin-grid (index.js)208.88KB56.59KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.51KB27.67KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)29.34KB8.47KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 48 chunks)3165.5 KB3191.4 KB
Main entry chunk (gzip)142.6 KB350 KB
Entry fileindex-BAsuzemp.js
StatusPASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.33KB5.59KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)514.48KB117.36KB
core (index.js)5.80KB2.32KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.25KB61.73KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)47.00KB12.97KB
plugin-charts (index.js)70.02KB19.44KB
plugin-chatbot (index.js)193.26KB45.80KB
plugin-dashboard (index.js)132.63KB34.56KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)250.63KB63.90KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.78KB32.58KB
plugin-gantt (index.js)166.93KB40.82KB
plugin-grid (index.js)208.88KB56.59KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.51KB27.67KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)29.15KB8.40KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants

@os-litant@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

docs(components): spell the inherited disabled as boolean | string - #7341

Merged
os-litant merged 2 commits into
mainfrom
claude/issue-7239-docs-disabled-boolean-or-string
Sep 2, 2026
Merged

docs(components): spell the inherited disabled as boolean | string#7341
os-litant merged 2 commits into
mainfrom
claude/issue-7239-docs-disabled-boolean-or-string

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes#7239

The docs half of the #7087 ruling (maintainer, 2026-09-01, option 1 scoped to disabled). That ruling removed the 18 disabled?: boolean narrowings from the concrete schemas, so the member is now inherited from BaseSchema as boolean | string — a boolean, or a predicate expression on the same evaluated path as visible. 13 component pages went on spelling the removed narrowing in their illustrative interfaces, teaching a type the shipped tree no longer has. A reader copying those rows would conclude that disabled: "${data.status === 'locked'}" is invalid, which is exactly the capability the ruling restored.

Premise re-verified on the base, not taken from the card

Base ebc05b4d6. Every one of the 22 disabled?: rows under content/docs/components was attributed to its enclosing interface by walking back to the nearest declaration, rather than trusting the card's table — the table turned out to be exactly right, including the two files that carry one in-scope and one out-of-scope row each:

populationrowsdisposition
schemas inheriting disabled from BaseSchema13corrected to `boolean
basic/button-group.mdx (ButtonGroupSchema)1already correct (#6347); the spelling the other 13 converged on
independent item/option shapes8left at plain boolean

All 13 in-scope interfaces were confirmed to extends BaseSchema with no disabled of their own on this base, and all remaining disabled?: boolean declarations in packages/types/src were confirmed to belong to independent shapes (ListItem, AccordionItem, ToggleGroupItem, SelectOptionMetadata, SelectOption, RadioOption, FormField, ComboboxOption, TabItem, NavLink, ButtonGroupButton, MenuCommandItem) — so the narrowings really are gone and the pages really were the stale side.

Why a pin instead of a gate turning red-then-green

No gate can see this drift, and that was measured rather than assumed: check-doc-snippet-types.mjs compiles only the fence languages in its own TS_FENCE_LANGUAGES set (line 317: ts, tsx, typescript), and all 14 rows in question live in plaintext fences (13) or a text fence (1). check-doc-component-types reads only the type string literals. So a member row in those fences may name any type at all and every gate stays green — the hole #6143 records.

The new pin packages/types/src/__tests__/component-docs-disabled-inherited-7239.test.ts (44 cases) therefore carries the invariant:

  1. Inherited (14 rows) — the page's disabled row reads boolean | string, and the shipped interface of the same name still extends BaseSchema without redeclaring disabled. The second half is what keeps the pin honest in the other direction: a future re-narrowing fails pointing at packages/types, not at the page, because in that world the page would be the thing that is right.
  2. Independent (8 rows) — the item/option shapes still read exactly boolean. This is the blanket-replace control: a sweep that rewrote every disabled?: boolean under content/docs/components turns these red.
  3. Completeness — the two tables account for everydisabled?: row under content/docs/components by measurement, so a new page carrying the stale spelling fails here instead of sitting unclassified.

Boundary stated in the file rather than implied: the three overlay menu-item rows are doc-local names with no shipped counterpart (ContextMenuCommandItem / DropdownMenuCommandItem / MenubarCommandItem against a shipped MenuCommandItem), so only their doc text is asserted.

Bounded in-place fix, named with evidence

packages/types/src/__tests__/button-group-doc-surface-6347.test.ts header said 13 of those 14 component schemas REDECLARE disabled?: boolean themselves … so their pages are right. After #7087 that sentence is false in both halves. The paragraph is rewritten to mark the 13-of-14 reading as history and point at the new pin. Comment text only — mechanically confirmed: git diff -U0 on that file, with comment lines filtered out, is empty, and the file's assertions stay green in the run below (it is one of the 87 files in the packages/types suite).

It qualifies as a bounded in-place fix on all four counts: same defect class as the card (a stale disabled?: boolean reading left behind by #7087), mechanical with the correct shape pinned by the landed ruling, no other claim holds that file, and no new verification surface (it is already covered by the packages/types suite).

Ablation — mutation and restore both proven on disk

The pin resolves nothing through any package dist/ (it imports only vitest and node:fs / node:path / node:url and reads source files off disk), so no rebuild is involved in either leg; the mutations were confirmed by anchored text counts, not by an editor's exit code.

legmutation proven on diskpin result
all 13 pages reverted to their base blobswide_union_rows=0, bare_boolean_rows=1513 failed / 31 passed — each naming its own page; ButtonGroupSchema and all 8 independent rows stayed green
form/select.mdx alone narrowedinjected_bare=1, removed_wide=01 failed / 43 passedExpected: "form/select.mdx SelectSchema -> boolean | string" / Received: "... -> boolean"
form/form.mdxFormField alone widened (blanket-replace control)injected_wide=1, removed_bare=01 failed / 43 passedExpected: "form/form.mdx FormField -> boolean" / Received: "... -> boolean | string"

Those results match the predictions written into the pin's header before the first run. Every restore leg used git checkout HEAD -- ABSOLUTE_PATH under a trap … EXIT INT TERM with absolute paths, and was proven by blob hash rather than by an exit code: 13/13 and 2/2 disk hashes equal to their HEAD blobs, none empty, with git diff HEAD empty and git status --porcelain clean afterwards.

Verification — union run at dd802b688 on a clean tree

checkverdict line
the new pinTest Files 1 passed (1) / Tests 44 passed (44)
packages/types suiteTest Files 87 passed (87) / Tests 1221 passed (1221)
@object-ui/typestype-checkexit 0, all three projects; --listFiles on tsconfig.test.json confirms both touched test files are in the 543-file compiled set (tsconfig.json excludes **/*.test.ts, so this was checked rather than assumed)
check:doc-fences✅ check:doc-fences — every TypeScript block in 224 document(s) is fenced ts/tsx/typescript …
check:doc-types✅ Every documented component type is registered.
docs:check-linksLinks are valid across 17 scan roots.
check:control-bytes✅ check-control-bytes: OK (scanned 6026 tracked text file(s); skipped 85 binary).
check:docs-route-closure✅ MEASURED_PAYLOAD is honest …
check-changeset-presence✅ 2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) …
check-changeset-no-major✅ No changeset declares a major bump.
check-governed-queue-guard --test✅ NOT GOVERNED — 16 path(s) checked against 5 governed surface(s); none matched.

Declared narrowing — check:doc-snippets was not run locally. It exits 2, which its own output defines as PRECONDITION NOT MET … This is "I could not run", NOT "I ran and found errors" (exit 1): it needs a 25-package build first. The narrowing is backed by measurement, not convenience: (1) the population comes from the gate's own TS_FENCE_LANGUAGES set rather than a guess about which files count; (2) 0 of the 14 changed doc rows are in that population — 13 sit in plaintext fences, 1 in a text fence; (3) the diff adds and removes no fence and changes no fence language (check:doc-fences green), and the other two changed files are a comment-only test edit and a new test, neither of which is a document, so the gate's verdict on untouched files cannot move. CI runs it regardless.

A changeset is owed and is included with empty frontmatter (declaring that nothing releases) — the two touched files under packages/types/src/ are published source, so the presence gate asks; its own text calls the empty-frontmatter form "a pass, not a workaround", and there is precedent in .changeset/theme-schema-doc-rewrite-5648.md.

Staying draft for the PM to land. #7087 remains closed by its own PR and is only referenced here; nothing in this PR changes packages/types source or content/docs/releases/.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NRRumy89BYdW9ogbcdHTho

Generated by Claude Code


Generated by Claude Code

objectui#7087 (maintainer ruling 2026-09-01, option 1 scoped to `disabled`)
removed the 18 `disabled?: boolean` narrowings from the concrete schemas, so
the member is now inherited from `BaseSchema` as `boolean | string` — a
boolean, or a predicate expression on the same evaluated path as `visible`.
13 component pages went on spelling the removed narrowing in their
illustrative interfaces, teaching a type the shipped tree no longer has.
Each of the 22 `disabled?:` rows under `content/docs/components` was
attributed to its enclosing interface before editing: 13 belong to schemas
that inherit the member and were corrected; 8 belong to independent
item/option shapes that declare their own `disabled?: boolean` and are left
at plain `boolean`; `basic/button-group.mdx` was already correct (objectui#6347)
and is the spelling the other 13 converged on.
No gate can see this drift — the rows live in `plaintext`/`text` fences and
`check-doc-snippet-types` compiles only `ts`/`tsx` (objectui#6143) — so the
invariant is pinned instead:
`packages/types/src/__tests__/component-docs-disabled-inherited-7239.test.ts`
holds all 14 inherited rows to the union, cross-checks against the shipped
interfaces so a re-narrowing fails pointing at `packages/types`, keeps the 8
independent rows at `boolean` as a blanket-replace control, and asserts the
two tables account for every documented row.
Also corrects the now-false 13-of-14 paragraph in the header of
`button-group-doc-surface-6347.test.ts` (comment text only; its assertions
are untouched and stay green).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NRRumy89BYdW9ogbcdHTho
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Console Performance Budget — gauge not trustworthy

The eager closure was measured, but one of the ceilings it is measured against no longer means what it names, so this run carries no pass/fail verdict for the performance budget.

This is not a budget violation. Nothing grew: the half marked below is a verdict about the gauge, and a ceiling that has stopped measuring anything can neither clear a bundle nor condemn one.

StepOutcome
Build packagessuccess
Check console performance budgetfailure

Which half objected:

Eager-closure halfVerdict
Aggregate closure ceiling✅ pass
Per-chunk ceilings✅ pass
Ceiling sensitivity (headroom)✅ pass
Ceiling freshness (checkout vs. base branch)⚠️ superseded ceiling

⚠️ A superseded ceiling is neither a size regression nor a drifted gauge. The bundle was measured correctly and the ceilings on the base branch are correct — but this checkout predates a change to them, so the verdicts above were weighed against numbers that are no longer in force. Nothing grew. Update this branch onto the base branch and let Bundle Analysis run again; do not widen a ceiling to clear it. The Check console performance budget step log names each superseded constant with both values (objectui#6245).

Reason: The entry chunk measured 142.6 KB, but the eager-closure half of this gate returned no trustworthy VERDICT: the report could not be read, a ceiling has drifted out of range of the regression it must catch, or (objectui#6245) a ceiling was replaced on the base branch after this checkout was made. The step log says which. This is not a passing budget — and it is not a size regression either.

See the workflow run for details.


📦 Bundle Size Report

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.33KB5.59KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)514.48KB117.36KB
core (index.js)5.55KB2.23KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.25KB61.73KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.92KB12.93KB
plugin-charts (index.js)70.02KB19.44KB
plugin-chatbot (index.js)190.53KB45.18KB
plugin-dashboard (index.js)132.63KB34.56KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)250.63KB63.90KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.78KB32.58KB
plugin-gantt (index.js)166.77KB40.76KB
plugin-grid (index.js)208.88KB56.59KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.51KB27.67KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)29.34KB8.47KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 48 chunks)3165.5 KB3191.4 KB
Main entry chunk (gzip)142.6 KB350 KB
Entry fileindex-BAsuzemp.js
StatusPASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)15.33KB5.59KB
app-shell (runtime-config.js)20.68KB7.36KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)514.48KB117.36KB
core (index.js)5.80KB2.32KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)178.20KB49.60KB
fields (index.js)244.25KB61.73KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.98KB10.98KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)11.71KB4.29KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)6.24KB2.16KB
permissions (discardProofCache.js)1.04KB0.55KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)4.83KB2.27KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)47.00KB12.97KB
plugin-charts (index.js)70.02KB19.44KB
plugin-chatbot (index.js)193.26KB45.80KB
plugin-dashboard (index.js)132.63KB34.56KB
plugin-designer (index.js)212.87KB43.19KB
plugin-detail (index.js)250.63KB63.90KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.78KB32.58KB
plugin-gantt (index.js)166.93KB40.82KB
plugin-grid (index.js)208.88KB56.59KB
plugin-kanban (index.js)53.21KB14.66KB
plugin-list (index.js)113.51KB27.67KB
plugin-map (index.js)20.20KB6.66KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)29.15KB8.40KB
plugin-tree (index.js)8.98KB3.08KB
plugin-view (index.js)85.90KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)81.07KB26.86KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)3.11KB1.48KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants

@os-litant@claude