Skip to content

fix(console,plugin-form): render a form section that references a field group (#8641) - #8727

Merged
os-justin merged 2 commits into
mainfrom
claude/issue-8641-console-formpage-section-group
Sep 9, 2026
Merged

fix(console,plugin-form): render a form section that references a field group (#8641)#8727
os-justin merged 2 commits into
mainfrom
claude/issue-8641-console-formpage-section-group

Conversation

@os-justin

Copy link
Copy Markdown
Collaborator

Fixes #8641

Step one was REPRODUCTION — the card said so about itself

The card recorded, honestly, that its finding came from reading sec.fields ?? [], not from rendering anything. So it was rendered first, on origin/main at a29ae2d66, with the fixture this PR ships:

buildSections({ type:'simple', sections:[ANCHOR, {group:'billing'}, {group:'contact_info'}] }, TICKET)
  -> [ { label:'Anchor', columns:2, fields:['anchor_note'] },
       { columns:2, fields:[] },
       { columns:2, fields:[] } ]

and in the DOM, identical on both routes (internal /forms/:name and public /f/:slug):

SECTION heading="Anchor"  inputs=[anchor_note]
SECTION heading=NONE      inputs=[]
SECTION heading=NONE      inputs=[]

The card's premise re-derived against the installed @objectstack/spec 17.3.0, not quoted:

FormSectionSchema.safeParse({ group: 'contact_info' })
  -> ACCEPT  { collapsible:false, collapsed:false, columns:1, group:'contact_info' }
FormSectionSchema.safeParse({ group: 'contact_info', label: 'X' })
  -> REJECT  ("`label` cannot be combined with `group` on this form section")

⚠️ One word of the card is wrong, and it matters. "It renders nothing" understates it: the SECTION element is emitted, with rounded-md border bg-card p-4 — so the submitter sees an empty bordered card where the group's inputs belong, twice, with no diagnostic on any channel. Not an invisible omission; a visible blank.

The choice: A, and why

A — export the resolver from @object-ui/plugin-form and call it from buildSections.

The dispatch put the trade honestly, so here is the reasoning against both named costs.

Why B is not merely worse but disqualified. The standing constraint of #7051 / objectstack#13855 is that no assembly rule may be re-implemented on the objectui side — not declared order, not the empty-group drop, not the ungrouped trailing bucket, not collapse / visibleWhen passthrough, and the dispatch's own test is "if your arm needs any of them re-spelled, it is the wrong arm." deriveFieldGroupLayout returns { key, label, description, collapse, visibleWhen, fields } where collapse is the enum 'none' | 'collapsible' | 'collapsed'. RenderableSection has no such key — it has the boolean pair { collapsible, collapsed }. So arm B cannot land its result on a section at all without re-spelling the collapse mapping and passing visibleWhen through by hand, which deriveFieldGroupSections already spells eleven lines away. That is not a judgement call about elegance; it is the prohibition, literally. B also re-spells the match-by-key, the label ?? key fallback and the unresolvable-reference diagnostic.

The cost of A, paid explicitly. One new published name (plus one type). It is the same surface decision this barrel already made for the same file: #6059 published omitServerResolvedDefaults / isRequiredInForm because FormPage is "the SECOND form renderer in this repo" and had to hand-compose the rule. This is the third consumer of the same class, and the addition is deliberately as small as that one: the resolver and the options type its signature requires (#7324's rule — a consumer must be able to name what it passes; a type adds no runtime surface). hasSectionGroupReference, resetSectionGroupReports, GROUP_OWNED_SECTION_KEYS and SECTION_LAYOUT_KEYS stay module-private, and that withheld set is pinned, not left to the reviewer's eye.

The subpath trap was checked, not assumed. @object-ui/plugin-form's exports map declares "." and nothing else. A subpath specifier would resolve in the console's dev server (a Vite alias matches by PREFIX) and then fail Build Console with TS2307 — objectui#8710, measured on PR #8668. The import is from the package root, and @object-ui/console:build (which runs tsc && vite build && tsc -p tsconfig.plugin.json) is green on this branch.

Why not C. Not mine to take — and the measurement does not point at it: the reference app is what teaches people to use the product, and it currently teaches that a spec-legal section renders as an empty box.

What changed

packages/plugin-form/src/index.tsx publish resolveSectionGroupReferences + ResolveSectionGroupsOptions
packages/plugin-form/README.md the export lists, and a "Resolving sections[].group outside this package" section
apps/console/.../FormPage.tsx buildSections resolves the reference; ObjectSchemaPayload carries fieldGroups; ObjectFieldDef carries group; the internal /meta/object/:name loader copies fieldGroups

That last line is load-bearing: loadInternalForm rebuilds the object schema key by key, so a key it does not copy is gone before the builder can see it. The public /f/:slug payload forwards the server's objectSchema whole and needed no such line — which is exactly why both routes are pinned separately rather than one standing in for the other.

formType is forwarded, so group on a formType: 'wizard' section gets the same refusal here that the spec door gives, instead of this renderer honouring a shape the spec declines to accept.

Evidence

The discriminating axis

Not "the form renders" and not "the section is non-empty" — both pass on the pre-fix builder. The pin is two sections referencing two different groups, each asserted against concrete field identifiers in order, and the one that carries the weight references billing, the SECOND declared group. That is not decoration: PR #8644's author found their own rows staying green under a constant-resolution caricature because they referenced the first group, which is what such a caricature returns. Measured below: under the caricature the contact_info assertions stay green and only the billing ones turn red.

Ablation — read sites only, from a committed tree

Every leg: trap … EXIT INT TERM with absolute paths; the mutation proven on disk in both directions (deleted-anchor count down, injected-anchor count up) plus git hash-object differing from the HEAD blob plus a line-total delta; restored by state (git checkout HEAD -- ABSOLUTE_PATH, never the bare form) and verified with git diff HEAD --quiet. Classification is per-test from vitest's JSON reporter, with harness-death strings counted separately.

Leg Read site mutated On disk Result
3 — constant-resolution caricature sectionGroups.ts: byKey.get(group) -> derived?.[0] anchors 1→0 / 0→1, hash 1888346ec807bafa, lines Δ0 7 red, 0 harness deaths
4 — drop every group section (today's behaviour) FormPage.tsx: resolver call removed anchors 1→0 / 0→1, hash c31f2ca20fca9673, lines Δ−12 8 red, 0 harness deaths
5 — un-publish the resolver plugin-form/src/index.tsx: export line removed anchors 1→0 / 0→1, hash 7e4e3040e953a2f5, lines Δ0 surface pin red
6 — export * from './sectionGroups' same file, barrel widened anchors 1→0 / 0→1, hash 7e4e304076ebce2c, lines Δ0 withheld-set pin red

Leg 3's fingerprint is unmistakable and is the whole reason the second group was chosen:

expected 'Contact Info' to be 'Billing Details'
expected [ 'email', 'phone' ] to deeply equal [ 'invoice_no', 'po_number' ]
expected [ 'Top', 'Contact Info', 'Anchor' ] to deeply equal [ 'Top', 'Billing Details', 'Anchor' ]

Leg 4 restores today's behaviour and reddens both group sections and both diagnostic pins:

expected undefined to be 'Billing Details'
expected [ 'H:Anchor', 'F:anchor_note', …(2) ] to deeply equal [ 'H:Anchor', 'F:anchor_note', …(6) ]
expected '' to contain 'no_such_group_8641'      <- the "reports nothing" half
expected '' to contain 'wizard'

Two assertions were never observed red, and are reported as such rather than counted. PREMISE: @objectstack/spec ACCEPTS a bare { group } is a premise probe against the installed package — its red condition is a spec regression, which no ablation of this diff can produce. CONTROL: a form with no group reference is built exactly as before is the control that must stay green in every leg: without it, every toEqual above would be equally satisfied by a renderer that draws nothing.

Suites and gates — commands and verdicts

Run from the repo root with paths (objectui#3378 / #3288), on 666717c69:

Command Verdict
vitest run apps/console/.../FormPage.sectionGroup.test.tsx packages/plugin-form/src/__tests__/sectionGroupResolverPublished-8641.test.ts 2 files, 12 passed, exit 0
vitest run --project @object-ui/console 94 files, 1112 passed, exit 0
vitest run packages/plugin-form/ 85 files, 859 passed / 1 skipped, exit 0
vitest run packages/plugin-view/ packages/plugin-designer/ examples/ 86 files, 2609 passed, exit 0
vitest run packages/app-shell/ 660 files, 6361 passed / 1 skipped, exit 0
turbo run build --filter='!@object-ui/site' 43/43 successful, exit 0
turbo run type-check --filter=@object-ui/console --filter=@object-ui/plugin-form 37/37 successful, exit 0
turbo run lint --filter=@object-ui/console --filter=@object-ui/plugin-form 0 errors (211 pre-existing warnings, none in the new code)
node scripts/check-readme-exports.mjs ✅ OK — on the built tree (0 unbuilt); the first run reported 36 unbuilt and was NOT MEASURED
node scripts/check-changeset-presence.mjs ✅ declares 1 changeset
check-changeset-fixed / -no-major / -overwrite ✅ / ✅ / ✅
node scripts/check-control-bytes.mjs ✅ (plus a manual grep -naP over the untracked new files: no hits)
node scripts/check-spec-symbol-derivation.mjs
node scripts/check-governed-queue-guard.mjs --test … NOT GOVERNED — ordinary PR route

Affected packages taken from TURBO_SCM_BASE=a29ae2d66 turbo ls --affected (9), not guessed from the diff.

⚠️ Both typecheck programs were verified to CONTAIN the new tests (tsc --listFiles), rather than assumed: apps/console includes FormPage.sectionGroup.test.tsx (94 test files in program), plugin-form's tsconfig.test.json includes the surface pin. A typecheck that excluded them would have been NOT MEASURED.

Changeset

Written per the gate's own verdict line, not per a label — apps/console is not private and @object-ui/console publishes, so skip-changeset would have been a phantom. .changeset/8641-console-formpage-section-group.md: @object-ui/plugin-form: minor (new export), @object-ui/console: patch (the fix), mirroring #6059's precedent.

Out of scope, filed

#8725FormSectionSpec (app-shell) re-declares fields as REQUIRED, so the spec-legal { group } shape does not compile for a TypeScript author (this PR's fixture casts around it), and SchemaForm is a fourth form-section renderer whose three s.fields reads are unguarded and above the JSX. Filed with no assignee and no labels; its reachability was not measured and the issue says so. Not fixed here: widening that type is a behaviour ruling on a different renderer, not a mechanical change.

Collisions

git ls-remote --heads origin 'gh-readonly-queue/*' at branch time: PRs 8689, 8692, 8697, 8698, 8699 queued. Each one's file list was fetched; none touches FormPage.tsx, packages/plugin-form/** or metadata-admin/**.


🤖 Generated with Claude Code

https://claude.ai/code/session_01YBWFb5YgMU5dw8p2VKj16S


Generated by Claude Code

…ld group (#8641)

`@objectstack/spec` 17.3.0 lets a `form.sections[]` entry declare its members
either way — enumerate `fields`, or point `group` at one of the object's
declared `fieldGroups` (objectstack#13855, ADR-0085 §5). `apps/console`'s
`FormPage` has its own section builder, on none of `@object-ui/plugin-form`'s
code path, and it read `sec.fields ?? []` and `sec.label` — neither of which a
`{ group }` section carries.

Reproduced in the DOM before repairing, on both routes: the `<section>` was
emitted with its border and padding and then stood empty — no heading, no
inputs, no diagnostic. "Renders nothing" was one word off; a submitter saw a
blank card where the group's fields belong.

`buildSections` now resolves the reference through `resolveSectionGroupReferences`,
newly published from `@object-ui/plugin-form` — the same function `ObjectForm`
resolves through, so all three consumers share one assembler. No assembly rule
is re-implemented on the console side: declared order, the empty-group drop, the
ungrouped trailing bucket and the collapse / `visibleWhen` passthrough all come
from `deriveFieldGroupLayout` via that package's single adapter. Reaching for
the derivation directly would have meant re-spelling the `collapse` enum onto
this renderer's boolean pair, which is that constraint's exact prohibition.

`ObjectSchemaPayload` carries `fieldGroups` and the internal `/meta/object/:name`
loader copies it: that rebuild is key by key, so an uncopied key is gone before
the builder can see it. The public `/f/:slug` payload forwards the server's
object schema whole and needed no such line.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YBWFb5YgMU5dw8p2VKj16S
@github-actions github-actions Bot added documentation Improvements or additions to documentation plugin apps tests labels Sep 9, 2026
@github-actions

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3482.0 KB 3512.7 KB
Main entry chunk (gzip) 144.0 KB 350 KB
Entry file index-DYIcVoOu.js
Status PASS

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

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
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) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 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.68KB 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) 499.42KB 114.32KB
core (index.js) 7.48KB 2.96KB
create-plugin (index.js) 10.12KB 3.28KB
data-objectstack (index.js) 198.39KB 55.29KB
fields (index.js) 244.96KB 61.76KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 6.57KB 2.76KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.84KB 10.94KB
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.75KB
mobile (index.js) 1.99KB 0.87KB
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.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.16KB 3.68KB
plugin-calendar (index.js) 49.00KB 13.91KB
plugin-charts (index.js) 71.39KB 19.92KB
plugin-chatbot (index.js) 194.53KB 46.34KB
plugin-dashboard (index.js) 131.43KB 34.44KB
plugin-designer (index.js) 215.51KB 44.29KB
plugin-detail (index.js) 251.39KB 65.04KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 134.20KB 33.48KB
plugin-gantt (index.js) 167.16KB 40.99KB
plugin-grid (index.js) 208.18KB 56.62KB
plugin-kanban (index.js) 55.44KB 15.73KB
plugin-list (index.js) 112.73KB 27.69KB
plugin-map (index.js) 20.49KB 6.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.33KB 3.25KB
plugin-view (index.js) 84.54KB 20.84KB
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.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.55KB 2.45KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 13.64KB 4.59KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
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 (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.27KB 5.47KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
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

… freezing a spec version (#8641)

Two red checks on this PR, both in the README block this PR added.

`Doc Snippet Type Check` — the block called `resolveSectionGroupReferences`
with an `authoredSections` nothing declared (TS2304). It is now declared at
the type the function actually takes: `ObjectFormSection[]`, imported from
`@object-ui/types`, which is what `packages/plugin-form/dist/sectionGroups.d.ts`
spells for that parameter. That type declares `group` and leaves `fields`
optional, so it is also the shape the surrounding prose is about. Not `any`:
a snippet that type-checks by erasing its own types teaches nothing and
leaves the gate asserting nothing.

`doc-version-claims` — the paragraph froze "`@objectstack/spec` 17.3.0" into
prose no gate can re-measure. Deleted rather than inventoried: the sentence
keeps its meaning from objectstack#13855 and ADR-0085 §5, which do not go
stale, and the version floor now points at this package's own `package.json`
entry (`^17.0.0`), which moves when the dependency moves. The literal was
TRUE at this commit — the installed spec is 17.3.0 — and that is exactly the
condition under which it would have gone silently false later.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YBWFb5YgMU5dw8p2VKj16S
@github-actions

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3482.0 KB 3512.7 KB
Main entry chunk (gzip) 144.0 KB 350 KB
Entry file index-DYIcVoOu.js
Status PASS

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

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
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) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 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.68KB 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) 499.42KB 114.32KB
core (index.js) 7.48KB 2.96KB
create-plugin (index.js) 10.12KB 3.28KB
data-objectstack (index.js) 198.39KB 55.29KB
fields (index.js) 244.96KB 61.76KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 6.57KB 2.76KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.84KB 10.94KB
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.75KB
mobile (index.js) 1.99KB 0.87KB
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.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.16KB 3.68KB
plugin-calendar (index.js) 49.00KB 13.91KB
plugin-charts (index.js) 71.39KB 19.92KB
plugin-chatbot (index.js) 194.53KB 46.34KB
plugin-dashboard (index.js) 131.43KB 34.44KB
plugin-designer (index.js) 215.51KB 44.29KB
plugin-detail (index.js) 251.39KB 65.04KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 134.20KB 33.48KB
plugin-gantt (index.js) 167.16KB 40.99KB
plugin-grid (index.js) 208.18KB 56.62KB
plugin-kanban (index.js) 55.44KB 15.73KB
plugin-list (index.js) 112.73KB 27.69KB
plugin-map (index.js) 20.49KB 6.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.33KB 3.25KB
plugin-view (index.js) 84.54KB 20.84KB
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.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.55KB 2.45KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 13.64KB 4.59KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
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 (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.27KB 5.47KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
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

@os-justin
os-justin added this pull request to the merge queue Sep 9, 2026
Merged via the queue into main with commit 6fda1a9 Sep 9, 2026
34 checks passed
@os-justin
os-justin deleted the claude/issue-8641-console-formpage-section-group branch September 9, 2026 02:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

apps documentation Improvements or additions to documentation plugin tests

Projects

None yet

2 participants