Skip to content

retire(detail): remove the record:details layout input and its dead renderer branch - #4245

Merged
yinlianghui merged 2 commits into
mainfrom
claude/issue-3818-retire-layout-input
Aug 11, 2026
Merged

retire(detail): remove the record:details layout input and its dead renderer branch#4245
yinlianghui merged 2 commits into
mainfrom
claude/issue-3818-retire-layout-input

Conversation

@yinlianghui

@yinlianghui yinlianghui commented Aug 11, 2026

Copy link
Copy Markdown
Collaborator

Fixes #3818

Completes the objectui half of the record:details layout retirement, per the maintainer ruling of 2026-08-09 on this card (removal) and the upstream retirement in objectstack#6946 (ADR-0087 D2), now active on the pinned @objectstack/spec@17.0.0-rc.6.

What was wrong

record:details published a body selector that never selected anything:

  • packages/plugin-detail/src/index.tsx declared { name: 'layout', type: 'enum', enum: ['auto','custom'], defaultValue: 'auto' }, described as "auto uses the object highlightFields; custom uses explicit sections".
  • The renderer's ONLY read (renderers/record-details.tsx:103-104) tested schema.layout === 'inline' || schema.layout === 'compact' — two values the schema never permitted — so both legal values fell through the same ternary to 'vertical'.

auto and custom therefore behaved identically, in both directions and with zero diagnostics: 'auto' plus explicit sections still rendered the sections, and 'custom' with no sections silently fell back to the flat body. Because the input carried a defaultValue, this was the manifest actively offering the key, not stale prose.

Premise check

All four points verified on this branch's tip before implementing:

check result
(a) index.tsx still declares the input yes, at line 274
(b) renderer still reads the retired vocabulary yes, at lines 103-104
(c) installed spec rejects layout yes — 17.0.0-rc.6, path: ["layout"], code: invalid_type, expected: "never", with the ADR-0087 migration message
(d) fixture half already landed (PR #4208) yes — recordDetailsInputs.spec-parity.test.ts is layout-free; treated as control, not redone

Changes

  • Deleted the layout input declaration, and the two pieces of prose that outlived it: the block comment's layout: 'custom' clause and the sections description's closing "Required when layout is 'custom'". A neighbouring description would otherwise have kept teaching the key after the input was gone.
  • Deleted the dead inline/compact branch. The const collapsed to the constant it always resolved to, so it is inlined as layout: 'vertical' with a comment recording why it is constant by contract.
  • Added a tombstone comment at the declaration site, so the key is not re-added by someone reading the spec's shape.

Pins

Negative, mirroring the #4239/#4226 shapes — in recordDetailsInputs.spec-parity.test.ts:

  • the spec rejects layout for all four values (auto, custom, inline, compact), asserted as a full envelope — path + code + the named migration message, not a bare "it failed";
  • the published surface offers no layout input (non-empty inputs() asserted FIRST, so the absence cannot pass vacuously);
  • no input description still teaches the key;
  • the renderer source carries no schema.layout read.

Positive control — new recordDetailsBodySource.test.tsx, pinning the contract that was doing the work all along and is now the only declared one: sections presence decides the body. Sections authored renders the groups and excludes a field outside them; sections absent renders the flat body; and the empty-array boundary behaves as absence rather than blanking the page.

The tombstone blind spot — worth the reviewer's attention, it bit twice in opposite directions

An ADR-0087 D2 tombstone stays IN the spec's .shape as a z.never(). Measured here:

specTopLevelKeys = [ 'columns', 'layout', 'sections', 'fields', 'hideFields', 'aria' ]

Every gate that asks "is this key in the shape" therefore reads a retired key as live. This PR hit both sides of that:

  1. False green (forward direction). The parity file's derived gate "declares no top-level input the spec does not accept" answered "yes, layout is declared" and stayed green with the retired input still published — which is why this drift survived the rc.6 pin bump undetected. That gate now filters tombstoned members out.
  2. False red (reverse direction), found by CI, not locally. The repo-wide gate in apps/console/src/__tests__/registry-inputs-spec-parity.test.ts asserts the mirror image — every spec-declared key must be published — so deleting the input made it demand the key back:
record:details publishes every top-level key its spec props schema declares
AssertionError: expected [ 'layout' ] to deeply equal []

Same root cause, opposite sign. Fixed the way that file already established for its four other D2 tombstones (element:record_picker's trio and page:card.body): an UNPUBLISHED_EXEMPTIONS entry citing #3809, the open card that owns narrowing specTopLevelKeys repo-wide. Narrowing it here instead would do #3809's work and strand those four entries as stale — and the entry's comment records why this one is not more stale-pin cover: the other four are still published awaiting a pin bump, whereas this key is already withdrawn and its tombstone is live at rc.6.

Reverse verification

Direction predicted before running: reverting both deletions should turn 4 assertions red, and the 3 positive-control tests should stay green. Confirmed exactly:

× declares no top-level input the spec does not accept
  AssertionError: expected [ 'layout' ] to deeply equal []
× the published surface offers no `layout` input
  AssertionError: expected [ 'columns', 'layout', ...(3) ] to not include 'layout'
× no input description still teaches `layout` as an authorable key
  AssertionError: expected 'Field groups rendered as the detail b...' not to match /\blayout is\b/i
× the renderer contains no `schema.layout` read
  AssertionError: expected '/**\n * ObjectUI\n * Copyright (c) 20...' not to match /schema\s*\.\s*layout/

Test Files  1 failed | 1 passed (2)
     Tests  4 failed | 12 passed (16)

The first red is the proof that the tombstone-awareness fix is load-bearing: before it, that gate was green with the input published.

The positive-control tests staying green is deliberate, and is recorded in the test file rather than papered over. The deleted branch fed synthesized.layout, and DetailView never reads layout at all — no read site, no schema spread. The branch was dead twice over (retired vocabulary AND ignored consumer), so restoring it changes no rendered output. A DOM-equality "authoring layout changes nothing" assertion would therefore have stayed green through the exact regression it appeared to guard, so it was not written; the read point is pinned where it can actually go red.

Restored afterwards, back to 16/16 green.

Mirror verdict: stays attached

The ruling attached the @object-ui/types mirror drift to #2231/#2890, and the measurement agrees. RecordDetailsComponentProps.layout?: 'stacked' | 'inline' | 'compact' still has a reader after the renderer read is deleted — packages/types/src/__tests__/p1-spec-alignment.test.ts constructs layout: 'stacked' and asserts it — so it is not dead-code cleanup that can ride along here. Left in place, noted on #2890.

Verification

  • pnpm --filter '@object-ui/plugin-detail^...' build (dependency closure first, in a fresh worktree)
  • pnpm --filter '@object-ui/plugin-detail' test70 files, 626 tests, all passing (main was 1 failed | 618 passed before PR fix(i18n): render I18nLabel objects at the 13 remaining sites #4208 fixed the fixture half; 619 + 7 new = 626)
  • pnpm --filter '@object-ui/plugin-detail' type-check — green (both tsc --noEmit and the typetests project)
  • pnpm exec vitest run apps/console/src/__tests__/registry-inputs-spec-parity.test.ts — 51/51 green after the exemption entry
  • eslint on the changed files — 0 errors (59 pre-existing no-explicit-any warnings)
  • pnpm check:control-bytes — OK, 3948 files
  • pnpm check:spec-symbols — green, unchanged
  • pnpm changeset:check — green
  • CI converged green on the second pass — all 20 checks, including Lint, Type Check and all four test shards (the two skipped are dependabot and Test (coverage), both by design).

Straggler sweep

Repo-wide grep for the retired vocabulary: no doc row lists the layout input (content/docs/guide/react-pages.md mentions record:details but not this key), and no generated manifest artifact is tracked in git — sdui.manifest.json / sdui-intrinsics.d.ts are written at build time. Every remaining occurrence is deliberate historical narrative in the test files, plus the immutable CHANGELOG.md.

Changeset: @object-ui/plugin-detail patch. Nothing that worked stops working — the key is already unauthorable at the contract, and os migrate meta --from 16 rewrites existing sources — so this is removing a false advertisement rather than a capability. Flagging the level for the bump-policy call: AGENTS.md allows minor for objectui's own breaking changes and forbids major; patch is per dispatch, and easy to raise if you read a published-input removal as breaking.


Generated by Claude Code

…ad renderer branch (#3818)

`record:details` published `layout: enum ['auto','custom']` with
`defaultValue: 'auto'`, described as the detail-body selector. It never
selected anything: the renderer's only `schema.layout` read tested
`'inline' | 'compact'` — values the schema never permitted — so both legal
values took the same branch and resolved to `'vertical'`.

@objectstack/spec 17.0.0 removed the property (objectstack#6946, ADR-0087 D2)
and the pinned 17.0.0-rc.6 already rejects it on parse. This completes the
objectui half per the 2026-08-09 maintainer ruling on #3818:

- delete the `layout` input declaration and the prose that taught it
- delete the dead `inline`/`compact` branch; the synthesized `layout` is now
  the constant it always resolved to
- pin the retirement: the spec rejects the key (path + code + migration
  message), the manifest publishes no `layout` input, no description teaches
  it, and the renderer source carries no `schema.layout` read
- pin the real contract as the positive control — `sections` presence decides
  the body, both directions plus the empty-array boundary

Also makes the derived "declares no top-level input the spec does not accept"
gate tombstone-aware. A D2 tombstone stays in the spec's `.shape` as a
`z.never()`, so a retired key still answers a key-presence check — which is
why this input survived the rc.6 bump with every derived gate green.

The `@object-ui/types` mirror's `layout` key stays attached to #2231/#2890 per
the ruling: it still has a reader (`types/src/__tests__/p1-spec-alignment.test.ts`).

Fixes #3818

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qqyix2QcnpUC9XeYVDzx3
@vercel

vercel Bot commented Aug 11, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectui Ignored Ignored Aug 11, 2026 7:25am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 28.3 KB 350 KB
Entry file index-kfzRq97r.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 8.88KB 3.25KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 7.57KB 2.97KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 22.10KB 4.37KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.13KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.64KB 2.21KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 35.76KB 9.11KB
auth (createAuthenticatedFetch.js) 4.37KB 1.69KB
auth (index.js) 2.35KB 1.07KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 4.91KB 0.87KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 26.07KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.65KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 488.60KB 108.25KB
core (index.js) 3.04KB 1.15KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 144.34KB 37.61KB
fields (index.js) 228.33KB 56.58KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.65KB 1.06KB
i18n (pickLocalized.js) 1.70KB 0.83KB
i18n (provider.js) 9.48KB 3.27KB
i18n (useObjectLabel.js) 27.59KB 6.63KB
i18n (useSafeTranslation.js) 4.52KB 1.96KB
layout (index.js) 38.98KB 10.85KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.74KB
mobile (index.js) 1.50KB 0.62KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 8.75KB 3.06KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.67KB 1.12KB
permissions (evaluator.js) 4.41KB 1.44KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.55KB 0.71KB
plugin-ai (index.js) 15.71KB 3.79KB
plugin-calendar (index.js) 45.23KB 12.45KB
plugin-charts (index.js) 61.52KB 17.49KB
plugin-chatbot (index.js) 180.33KB 42.79KB
plugin-dashboard (index.js) 118.58KB 30.71KB
plugin-designer (index.js) 210.85KB 42.64KB
plugin-detail (index.js) 238.31KB 59.57KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 114.58KB 27.68KB
plugin-gantt (index.js) 164.14KB 39.98KB
plugin-grid (index.js) 187.97KB 49.90KB
plugin-kanban (index.js) 48.60KB 13.41KB
plugin-list (index.js) 110.31KB 26.76KB
plugin-map (index.js) 17.00KB 5.32KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 40.58KB 10.58KB
plugin-timeline (index.js) 26.21KB 7.52KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 84.03KB 20.55KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.71KB 3.53KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.67KB 2.37KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 23.71KB 7.96KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.23KB 0.66KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 4.47KB 2.03KB
sdui-parser (parse.js) 10.04KB 2.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 4.69KB 1.48KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-retry.js) 4.32KB 2.02KB
types (index.js) 2.71KB 1.34KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 2.59KB 1.31KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (spec-report.js) 5.05KB 1.93KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 3.40KB 1.71KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

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

…on (#3818)

CI shard 2/4 went red on the repo-wide gate in
`apps/console/src/__tests__/registry-inputs-spec-parity.test.ts`:

    record:details publishes every top-level key its spec props schema declares
    AssertionError: expected [ 'layout' ] to deeply equal []

Same tombstone blindness this PR fixed in the plugin-detail parity file, in the
MIRROR direction. `specTopLevelKeys` reads raw `Object.keys(shape)`; an
ADR-0087 D2 retirement replaces the member with `z.never().optional()` rather
than deleting it, so the retired `layout` still reads as "spec-declared" and
the reverse direction demands the input this PR deliberately removed.

Parked as an `UNPUBLISHED_EXEMPTIONS` entry, the convention this file already
established for the four other D2 tombstones (`element:record_picker`'s trio
and `page:card.body`), each of which cites objectui#3809 — the open card that
owns narrowing `specTopLevelKeys` to non-tombstone members. Fixing it here
instead would do #3809's work and strand those four entries as stale.

The entry's comment records why this one is NOT more stale-pin cover: the four
above are still published and waiting for a pin bump, whereas this key is
already withdrawn and the tombstone is live at rc.6 — the reverse direction
demanding a key the forward direction forbids.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qqyix2QcnpUC9XeYVDzx3
@github-actions github-actions Bot added the apps label Aug 11, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 28.3 KB 350 KB
Entry file index-vi_BbY3n.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 8.88KB 3.25KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 7.57KB 2.97KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 22.10KB 4.37KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.13KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.64KB 2.21KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 35.76KB 9.11KB
auth (createAuthenticatedFetch.js) 4.37KB 1.69KB
auth (index.js) 2.35KB 1.07KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 4.91KB 0.87KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 26.07KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.65KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 488.60KB 108.25KB
core (index.js) 3.04KB 1.15KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 144.34KB 37.61KB
fields (index.js) 228.43KB 56.61KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.65KB 1.06KB
i18n (pickLocalized.js) 1.70KB 0.83KB
i18n (provider.js) 9.48KB 3.27KB
i18n (useObjectLabel.js) 27.59KB 6.63KB
i18n (useSafeTranslation.js) 4.52KB 1.96KB
layout (index.js) 38.98KB 10.85KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.74KB
mobile (index.js) 1.50KB 0.62KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 8.75KB 3.06KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.67KB 1.12KB
permissions (evaluator.js) 4.41KB 1.44KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.55KB 0.71KB
plugin-ai (index.js) 15.71KB 3.79KB
plugin-calendar (index.js) 45.23KB 12.45KB
plugin-charts (index.js) 61.52KB 17.49KB
plugin-chatbot (index.js) 180.33KB 42.79KB
plugin-dashboard (index.js) 118.58KB 30.71KB
plugin-designer (index.js) 210.91KB 42.67KB
plugin-detail (index.js) 238.86KB 59.70KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 114.58KB 27.68KB
plugin-gantt (index.js) 164.14KB 39.98KB
plugin-grid (index.js) 187.97KB 49.90KB
plugin-kanban (index.js) 48.60KB 13.41KB
plugin-list (index.js) 110.31KB 26.76KB
plugin-map (index.js) 17.00KB 5.32KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 40.58KB 10.58KB
plugin-timeline (index.js) 26.21KB 7.52KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 84.03KB 20.55KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.71KB 3.53KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.67KB 2.37KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 23.71KB 7.96KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.23KB 0.66KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 4.47KB 2.03KB
sdui-parser (parse.js) 10.04KB 2.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 4.69KB 1.48KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-retry.js) 4.32KB 2.02KB
types (index.js) 3.05KB 1.52KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 2.59KB 1.31KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (spec-report.js) 5.05KB 1.93KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 3.40KB 1.71KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

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

@yinlianghui
yinlianghui marked this pull request as ready for review August 11, 2026 07:36
@yinlianghui
yinlianghui added this pull request to the merge queue Aug 11, 2026
Merged via the queue into main with commit 7d04b0e Aug 11, 2026
21 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-3818-retire-layout-input branch August 11, 2026 07:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants