Skip to content

docs(plugin-form): real object-form catalog entries, and declare both plugin packages in the gallery host - #6314

Merged
os-support-ai merged 3 commits into
mainfrom
claude/issue-6167-plugin-form-catalog-entries
Aug 25, 2026
Merged

docs(plugin-form): real object-form catalog entries, and declare both plugin packages in the gallery host#6314
os-support-ai merged 3 commits into
mainfrom
claude/issue-6167-plugin-form-catalog-entries

Conversation

@os-support-ai

@os-support-aios-support-ai commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

Fixes#6167
Fixes#6025

Two cards, one branch, one commit each — they edit the same import list in
apps/site/app/components/registerCatalogBlocks.ts and the same mirrored HOST_PACKAGES
array in examples/schema-catalog/test/catalog-gallery-render.test.tsx, which a parity case
requires to move together. Split, they would conflict by construction.

Verified on 778aaf135 (every number below is from that tree unless it says otherwise).

Premise correction — read this before the rest

#6167's stated reason for widening the fix to the host is false on today's main, and
was false when the card was filed.
The card says object-form "is not in the gallery's
registration set at all" and that a rewritten entry "would paint the OBJUI-001 panel".
Measured, importing exactly the eleven packages the host carried before this PR and nothing
else: object-form, plugin-form:object-form, embeddable-form, form-analytics,
object-master-detail-form, record:line_items, view:form, object-grid and
import-wizardall resolved, and all four candidate object-form tiles rendered with
no OBJUI-001, no error boundary and no DataSource required. The reason is one line above
the one #6025 is filed on: packages/plugin-view/src/ObjectView.tsx:38 does
import { ObjectForm } from '@object-ui/plugin-form', and importing that entry runs its
ComponentRegistry.register calls. Both lines predate the card.

The defect #6167 names is real and is fixed here; what changes is why the host edit belongs
in the diff. It is not a fix for a red tile — it is #6025's fix applied to the second
package that had the same latent shape. That is the honest framing for both cards, and it
is why the judge for #6025 is not "is the type registered".

#6167 — the entries

Both entries authored a root type: "form" with input / select / checkbox /
textarea fields: every one of those registered by @object-ui/components, none of them
by @object-ui/plugin-form, whose own keys are object-form, embeddable-form,
form-analytics, object-master-detail-form, record:line_items and view:form. They sat
on content/docs/plugins/plugin-form.mdx inside PluginLoader plugins={['form']}.

  • Re-seated, not deletedbasic-form and contact-form move to components-form-form
    as basic-form and demo-request-form (renames, byte-identical). They are legitimate
    @object-ui/components examples filed under the wrong plugin. Deleting them would move
    corpus-wide counters for a non-coverage reason: NODE_CENSUS in
    layout-dom-leak-5574.test.tsxand in form-control-dom-leak-5632.test.tsx (that one
    counts input / checkbox / textarea nodes across the whole catalog, which an in-place
    rewrite would have moved), plus the className-carrying layout node and stack node
    floors in layout-props-conversion.test.tsx. All are unchanged and no floor was edited —
    1798/1798 tests green across the 13 files in examples/schema-catalog/test/.
  • New entriesplugin-form/object-form-record (one users record, mode: 'edit',
    fields derived from the object's metadata, fields / columns shaping the grid) and
    plugin-form/object-form-tabbed-sections (the same record with formType: 'tabbed', so
    declared sections become tab panels of one form). Every key is declared on
    ObjectFormSchema; nothing invented. They bind users because that is the one object the
    gallery fixture serves — verified against apps/site/app/components/galleryDataSource.ts
    and its mirror, not assumed from the card. They deliberately author no select field: the
    fixture declares role / status as selects with no options, so those controls would
    render "No options available" in the docs gallery. Fixing the fixture is out of scope here.
  • Ledger deleted — both OWN_PLUGIN_DEBT lines are gone, so the entries are now held to
    STRUCTURE, MOUNT and DATA like every other one, and the coverage-split literal moves to
    structure+mount+data: { categories: ['plugin-form', 'plugin-grid', 'plugin-view'], entries: 7 }
    with ledgered-debt: [].

Two instrument defects found on the way, both fixed here

  1. The DATA half could not see a form. It read container.textContent, and a form's
    record never lands there — it lands in input.value. Measured: Alice Johnson arrives as
    input[name].value while the whole tile's text is NameEmailDepartmentCancelSave changes.
    carriesFixtureRecord now reads text or control values. The widening is a superset, so
    it relaxes nothing for the five entries that passed before, and a new control case pins
    that it still discriminates: the same renderer, same object, same mode, with a recordId
    the fixture does not serve — its controls render (asserted first, or the case would be a
    degenerate control) and hold nothing.
  2. renderEntry settled on a loading frame.ObjectForm holds its first paint behind
    Loading form..., which is 5 elements of real DOM and therefore satisfied drewSomething.
    The two new entries' provenance cases passed in a whole-file run and failed under -t
    an order-dependent green, measured in both directions. renderEntry now settles past that
    placeholder as well; both cases then pass in isolation.

#6025 — declared, not transitive

registerCatalogBlocks.ts names @object-ui/plugin-grid (and @object-ui/plugin-form), and
HOST_PACKAGES mirrors both in the host's order.

The judge is deliberately notexpect(ComponentRegistry.get('object-grid')).toBeTruthy():
per the measurement above that is truthy in the declared world and in the transitive one, so
it cannot fail in either and proves nothing about declaration — a ghost for this question. What
is asserted instead is the host's declaration: every plugin-* category with catalog entries
must be loaded by name
, derived from the categories rather than enumerated, leaning on the
existing parity case that ties HOST_PACKAGES to the host file's literal import list.

Ablation — one leg at a time, restored under trap … EXIT INT TERM

Mutation proven on disk each way by comparing git hash-object against the path's HEAD blob
(an empty hash is treated as failure), restore by git checkout HEAD -- naming the path
absolutely, and git diff HEAD --stat empty at the end.

legmutationredgreen
Aobject-form-record reverted to its old form schemaauthors a node whose type its own package registers, mounts that node where the tile actually paints, states its own coverage split (3 failed / 570 passed)#6025's judge, the parity case, plugin-grid / plugin-view
B#6025 undone: host import + mirror import + HOST_PACKAGES entry all removedonlyevery plugin category with catalog entries is loaded BY NAME by the host (1 failed / 573 passed)every "type resolves" case — object-grid still resolves transitively, which is the point
Chost import removed, HOST_PACKAGES left naming itonlyloads every package this pin loads, in this pin's order (1 failed / 573 passed)the rest

Leg A predicted four reds and produced three: the DATA case does not go red, it disappears
an entry that stops authoring objectName drops out of dataBound, and the coverage-split
literal is what catches the lost half. That is the tiering working as designed, and it is why
the split case exists.

Cost, and the #4600 separation

  • check:eager-closure cannot see this change, and the card's note that it "measures that
    budget" is stale.
    The gate reads apps/console/dist/eager-closure.json
    (scripts/check-eager-closure-budget.mjs:292) and performance-budget.yml triggers on
    packages/**, apps/console/**, pnpm-lock.yaml. This PR touches apps/site, so the gate
    measures a bundle the diff cannot move; it will run in CI (the lockfile changed) and pass
    unchanged. Running it locally would have been a green in both worlds. Reported rather than
    raised or worked around — no budget was touched.
  • The real cost is ~zero and the reason is structural: both packages were already in this
    route's eager closure through @object-ui/plugin-view (import [WIP] Update documentation for project #11), which imports
    ObjectGrid and ObjectForm at module scope. An ES module executes once, so the two new
    side-effect imports add a declaration, not a payload, and re-run no registration.
  • schema-catalog: all 9 plugin-dashboard examples are refused by the spec's DashboardSchema — the AI few-shot corpus teaches the pre-ADR-0021 widget shape #4600's separation still holds: InteractiveDemo.tsx and LiveSplitDemo.tsx still do not
    import this module — asserted by the existing case, which is unchanged and green. Per-page
    demos keep opting in through PluginLoader.

Gates run locally, at 778aaf135

examples/schema-catalog/test/ (13 files, 1798 tests) · catalog-index-regenerable-4633 +
site-playground-layout-registration-3904 (2 files, 17 tests) · type-check for
@object-ui/example-schema-catalog (tsc --noEmit && tsc -p tsconfig.test.json, with its
dependency closure built) · lint for @object-ui/example-schema-catalog and for
@object-ui/site (0 errors; 7 pre-existing warnings, none in a file this PR touches) ·
check:doc-types ("✅ Every documented component type is registered") · check-doc-links
("Links are valid across 17 scan roots") · check:doc-fences · check-control-bytes
("✅ scanned 5199 tracked text file(s)") · check:phantom-deps
("✅ Every in-scope import is declared by the package that publishes it") ·
regenerate-catalog-index.py --check ("index.ts is up to date (430 entries)") ·
check-changeset-no-major · check-changeset-presence
("✅ No source of a released package changed in this range, so no changeset is owed" — two
changesets with empty frontmatter are included anyway, releasing nothing, the way #6028 did).

Draft on purpose: not ready, not enqueued, no auto-merge.

Generated by Claude Code

os-trumpand others added 2 commits August 25, 2026 11:59
`plugin-form` was the last category still ledgered in `OWN_PLUGIN_DEBT`: both
entries authored a root `type: "form"` with `input` / `select` / `checkbox` /
`textarea` fields, every one of them registered by `@object-ui/components` and
none by `@object-ui/plugin-form`. They sat on `content/docs/plugins/
plugin-form.mdx` inside a `PluginLoader plugins={['form']}` wrapper neither of
them used.
Replaced by two entries that read the docs gallery's demo data source through
the registered `object-form` renderer, the way objectui#5113 did for
`object-view` and objectui#5856 for `object-grid`. The two hand-built forms are
re-seated into `components-form-form` rather than deleted, so none of the
corpus-wide node counters moves.
Two measurements changed how this landed, both recorded in the code:
- `object-form` already resolved in the gallery WITHOUT this change — measured
with exactly the eleven imports the host used to carry — because
`@object-ui/plugin-view` imports `ObjectForm` from `@object-ui/plugin-form`.
So declaring the package is a statement of what the gallery depends on, not
a fix for a red tile.
- the pin's DATA half read `container.textContent`, which a form's record
never reaches: it lands in `input.value`. The instrument now reads both, and
a control case pins that it still fails on a form with no record behind it.
`renderEntry` also settles past `Loading form...` now. Without it the two new
entries' provenance cases passed in a whole-file run and failed under `-t`,
because the placeholder is real DOM that satisfies `drewSomething`.
Claude-Session: https://claude.ai/code/session_011SfZeFWrhGLHmfq61xbz4q
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`object-grid` reached the gallery's registry only because
`packages/plugin-view/src/ObjectView.tsx:37` imports `ObjectGrid` — a component
import in another package, not a plugin dependency of the host. Since
objectui#5856 the two `plugin-grid` catalog entries are real `object-grid`
nodes, so the gallery genuinely depends on that path: a refactor of
`object-view` that stopped drawing a grid itself would turn two tiles into
OBJUI-001 panels, with the cause several files from the symptom.
`registerCatalogBlocks.ts` now names the package, and `HOST_PACKAGES` mirrors
it. Nothing renders differently — measured with exactly the eleven packages the
host used to carry, `object-grid` and every `@object-ui/plugin-form` key already
resolved.
That measurement is also why the judge for this is NOT
`ComponentRegistry.get('object-grid')`: it is truthy in the declared world and
in the transitive one alike, so it cannot fail in either and judges nothing
here. The case added instead reads the host's DECLARATION — every `plugin-*`
category with catalog entries must be loaded by name — and leans on the
existing parity case that ties `HOST_PACKAGES` to the host file's literal
import list. The rule is derived from the categories, so a new plugin category
with entries picks it up with no edit.
Claude-Session: https://claude.ai/code/session_011SfZeFWrhGLHmfq61xbz4q
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3222.9 KB3266.6 KB
Main entry chunk (gzip)154.1 KB350 KB
Entry fileindex-BHAA5kjr.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)10.96KB4.16KB
app-shell (runtime-config.js)18.10KB6.51KB
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)505.63KB114.68KB
core (index.js)5.30KB2.13KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)171.74KB47.48KB
fields (index.js)238.40KB59.89KB
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.95KB10.97KB
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)9.53KB3.38KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.64KB1.50KB
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)1.93KB0.88KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.62KB12.83KB
plugin-charts (index.js)64.66KB18.32KB
plugin-chatbot (index.js)188.21KB44.67KB
plugin-dashboard (index.js)133.35KB34.45KB
plugin-designer (index.js)212.33KB42.81KB
plugin-detail (index.js)245.10KB62.31KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)126.92KB30.85KB
plugin-gantt (index.js)164.17KB39.89KB
plugin-grid (index.js)201.14KB54.40KB
plugin-kanban (index.js)52.83KB14.55KB
plugin-list (index.js)111.94KB27.24KB
plugin-map (index.js)20.09KB6.62KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.49KB11.93KB
plugin-timeline (index.js)26.49KB7.59KB
plugin-tree (index.js)9.26KB3.13KB
plugin-view (index.js)84.55KB20.74KB
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)54.84KB18.43KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.35KB0.70KB
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)12.13KB3.65KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)7.54KB2.63KB
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)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.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.49KB2.14KB
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, 52 chunks)3222.9 KB3266.6 KB
Main entry chunk (gzip)154.1 KB350 KB
Entry fileindex-BHAA5kjr.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)10.96KB4.16KB
app-shell (runtime-config.js)18.10KB6.51KB
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)505.63KB114.68KB
core (index.js)5.30KB2.13KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)171.74KB47.48KB
fields (index.js)238.40KB59.89KB
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.95KB10.97KB
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)9.53KB3.38KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.64KB1.50KB
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)1.93KB0.88KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.62KB12.83KB
plugin-charts (index.js)64.66KB18.32KB
plugin-chatbot (index.js)188.21KB44.67KB
plugin-dashboard (index.js)133.35KB34.45KB
plugin-designer (index.js)212.33KB42.81KB
plugin-detail (index.js)245.10KB62.31KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)126.92KB30.85KB
plugin-gantt (index.js)164.17KB39.89KB
plugin-grid (index.js)201.14KB54.40KB
plugin-kanban (index.js)52.83KB14.55KB
plugin-list (index.js)111.94KB27.24KB
plugin-map (index.js)20.09KB6.62KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.49KB11.93KB
plugin-timeline (index.js)26.49KB7.59KB
plugin-tree (index.js)9.26KB3.13KB
plugin-view (index.js)84.55KB20.74KB
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)54.84KB18.43KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.35KB0.70KB
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)12.13KB3.65KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)7.54KB2.63KB
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)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.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.49KB2.14KB
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

@os-support-ai
os-support-ai marked this pull request as ready for review August 25, 2026 12:50
@os-support-ai
os-support-ai added this pull request to the merge queueAug 25, 2026
Merged via the queue into main with commit 2be95eeAug 25, 2026
28 checks passed
@os-support-ai
os-support-ai deleted the claude/issue-6167-plugin-form-catalog-entries branch August 25, 2026 13:06
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants

@os-support-ai@os-trump