Skip to content

fix(site): the catalog gallery registers every plugin its entries need (#4616) - #4628

Merged
yinlianghui merged 3 commits into
mainfrom
claude/issue-4616-gallery-full-registration
Aug 14, 2026
Merged

fix(site): the catalog gallery registers every plugin its entries need (#4616)#4628
yinlianghui merged 3 commits into
mainfrom
claude/issue-4616-gallery-full-registration

Conversation

@yinlianghui

@yinlianghuiyinlianghui commented Aug 14, 2026

Copy link
Copy Markdown
Collaborator

Fixes#4616

/docs/guide/schema-catalog renders every catalog entry through a real SchemaRenderer, but ComponentRegistry only knows a type once the package owning it has loaded. #4600 (PR #4615) registered the two packages its own category needed. This registers the rest of the census, after measuring what that costs.

1. Cost measurement (ruling 1) — the gate, run before deciding

The named instrument does not exist in this toolchain, so this substitutes the same quantity rather than inventing a table. Next 16.3 + Turbopack prints no Size / First Load JS columns in next build — its route output is the tree of route paths only. The figure below is reconstructed from the build on disk the way Next computes it: the script src set of the route's prerendered HTML, summed. All three counting tiers (script src, + preload, every chunk referenced anywhere in the document) agree exactly, so the number is not sensitive to which refs you count.

pnpm turbo run build --filter='@object-ui/site' --concurrency=2, before and after:

beforeafterdelta
gallery /docs/guide/schema-catalog first-load JS7738.7 kB / 29 chunks9542.6 kB / 40 chunks+1803.9 kB, +23.3%
gallery prerendered HTML572.1 kB580.7 kB+8.6 kB
control /docs/guide/architecture first-load JS7738.7 kB / 299542.6 kB / 40+23.3%
control /playground first-load JS6872.8 kB / 236872.8 kB / 230
whole-app static/chunks27582.2 kB / 472 files27517.2 kB / 463 files−65.0 kB
static pages generated556/556556/556
thumbnail frames in prerendered gallery HTML440440

Verdict: within budget. +23.3% against the ruling's ~50% stop condition, and the prerender does not break — so the eager default stands and the lazy registerLazy fallback does not become a decision. Re-measured after the second commit; identical.

Three measured facts the table makes visible, all worth knowing before reviewing the trade:

  • The docs route is shared./docs/guide/architecture moves identically to the gallery, because all 181 docs pages are one /docs/[[...slug]] route entry and SchemaThumbnail's own code sits in a chunk they all load. The cost is paid by every docs page, not just the gallery. /playground is byte-identical, so the widening is confined to that route.
  • Whole-app chunk bytes did not grow — they fell slightly. This plugin code was already emitted for the docs pages that load it through PluginLoader; what changed is which chunks the docs route pulls in up front.
  • The thumbnails were never in the prerendered HTML.SchemaThumbnail gates its mount behind an IntersectionObserver, so the OBJUI-001 panels appeared on the client after hydration, and both builds prerender 440 empty frames. The eagerness still matters — it is what makes registration precede a tile's first client render — but not for the reason the module header previously implied. Corrected there.

2. Bucket census (ruling 2) — the true mapping, measured here

The issue's buckets were a root-type census against @object-ui/components + registerLayout(). Re-measured by rendering all 423 entries the way SchemaThumbnail renders them, against the registration set as it actually stood after #4615:

Measured: 33 entries, 33 panels — not 35. The issue's 35 counted the pre-#4615 state for dashboard / chart. The full root census reproduces the issue's 44 exactly; 12 of those (9 dashboard, 2 chart, 1 bar-chart) were already fixed by #4615, and one entry (components-form-calendar/form-integration) is a div whose nested node is unresolved, so it is absent from a root census and present in a rendered one.

categorynroot typeresolves to
components-form-calendar6calendarplugin-calendar
plugin-chatbot3chatbotplugin-chatbot
plugin-editor3code-editorplugin-editor
plugin-gantt3object-ganttplugin-gantt
plugin-map3object-mapplugin-map
plugin-markdown3markdownplugin-markdown
plugin-timeline3timelineplugin-timeline
plugin-calendar2calendar-viewplugin-calendar
plugin-kanban2kanbanplugin-kanban
components-complex-filter-ui1filter-uiplugin-view
components-complex-sort-ui1sort-uiplugin-view
components-complex-view-switcher1view-switcherplugin-view
components-disclosure-toggle-group1singlenothing — see #4624
core-schema-renderer1unknown-componentnothing, deliberately

Nine packages, appended to registerCatalogBlocks after #4600's two: plugin-calendar, plugin-chatbot, plugin-editor, plugin-gantt, plugin-kanban, plugin-map, plugin-markdown, plugin-timeline, plugin-view. All nine were already dependencies and transpilePackages entries of apps/site, so neither its package.json nor next.config.mjs changed. Import order is preserved as contract and documented: several packages claim the same bare keyword (chart, calendar) and the last registration wins.

Result: 31 of the 33 tiles go from the red panel to a drawn component.

3. Red-first, verbatim

Same harness, run against the two registration sets. Before (the set on origin/main @ e028dfcd8):

entries showing OBJUI-001: 33 panels: 33
components-form-calendar: 6
components-form-calendar/custom-style x1 [calendar]
components-form-calendar/date-range x1 [calendar]
components-form-calendar/form-integration x1 [calendar]
...
plugin-chatbot: 3
plugin-chatbot/basic-chatbot x1 [chatbot]
...

After (this branch's set):

entries showing OBJUI-001: 2 panels: 2
components-disclosure-toggle-group | components-disclosure-toggle-group/with-labels x1 [single]
core-schema-renderer | core-schema-renderer/unknown-component-type x1 [unknown-component]
== "failed to render" error tiles (0) ==
== RENDER THREW (0) ==

4. The generalized pin (ruling 3)

examples/schema-catalog/test/catalog-gallery-render.test.tsx — all 423 entries, every category, rendered exactly as SchemaThumbnail renders them (same registration set in the same order, SidebarProvider, toRenderableSchema, the dataset stub as both context and prop).

It asserts three diagnostics, not one. Naming only OBJUI-001 would have reported #4625's six entries as fixed: registering plugin-calendar trades their red panel for ObjectCalendar's inline DataSource required for object/api providers. That string is asserted corpus-wide alongside the panel and the SchemaRenderer error boundary.

Two deliberate departures from #4600's pin, both measured:

  • role=alert is not asserted category-wide.components-data-display-alert's two entries carry it because that is what an Alert is. Correct for a dashboard tile, wrong for the corpus.
  • The non-vacuity control is "drew DOM or text".components-basic-text/* render a bare text node with no element around it, so an element-count-only control reads nine correct tiles as empty.

That control earned its place immediately: it found two entries that render a completely blank tile — invisible to any red-tile sweep — now filed as #4626.

5. Named exclusions, with reasons (ruling 4)

Censused, not silently skipped; a dedicated case fails if an excluded id stops existing. Nothing here had its semantics rewritten.

Not rendered by the pin (7)

entrywhyfiled
core-schema-renderer/unknown-component-typedemonstrates the panel on purpose — the panel IS the example
components-disclosure-toggle-group/with-labelsnames root type single; its two siblings spell it toggle-group + selectionType: single#4624
components-overlay-tooltip/basic-tooltipblank tile: authors its trigger under children, which the renderer never reads#4626
components-overlay-hover-card/basic-hover-cardblank tile: both slots author value where the text renderer reads content#4626
plugin-editor/* (3)environment: mounting code-editor makes @monaco-editor/react append a CDN loader script happy-dom cannot fetch. The resource-load error event makes vitest exit 1 with every assertion passing (measured: 2534/2534 green, 4 unhandled errors, exit 1). packages/plugin-editor/src/index.test.ts settled the same cost the same way — it asserts registration and never renders. ComponentRegistry.get('code-editor') stays pinned in the control case, which IS what this PR changed for that bucket

One named diagnostic exempted, every other assertion still applied (6) — the six components-form-calendar/*, for DataSource required for object/api providers. They author the bare calendar keyword, which @object-ui/components deliberately registers as ui:calendar only (skipFallback: true, "collides with the plugin-calendar full CRUD calendar VIEW"), so it reaches ObjectCalendar. Filed as #4625.

OBJUI-001 half only (3)plugin-map/*. maplibre refuses to initialise without WebGL2 (GPUInitializationError: WebGL2 is required to display this map) and then trips the error boundary tearing its own painter down. A happy-dom property; what stays pinned is exactly what this PR fixed — the type resolves.

Authored-title control lifted, everything else applied (2) — the two plugin-calendar/*. Both draw a real calendar (163 and 421 elements); calendar-view paints the window around today and both author fixed 2024 dates, so no event title is in range. Filed as #4627.

6. Reverse verification (directions predicted before running; git checkout, never git stash)

Two links, and they fail in different places on purpose — the pin registers its own packages and cannot import from apps/**, so reverting the host does not and cannot red the sweep. That is precisely why the source-text parity case exists.

(a) Host registrar reverted to origin/main — predicted: the parity case alone, sweep untouched.

× loads every package this pin loads, in this pin's order 5ms
Test Files 1 failed (1) Tests 1 failed | 439 passed (440)

(b) The pin's own nine imports removed — predicted: plain red across the sweep.

Test Files 1 failed (1) Tests 30 failed | 410 passed (440)
× the corpus is populated and every package the census needs is loaded
AssertionError: expected { 'Unknown component type': 28, …(3) } to deeply equal { 'Unknown component type': +0, …(3) }

28 rather than 31 because the three plugin-editor entries are not rendered at all — consistent with the exclusion above.

7. Non-registration failures found and filed

All searched first (keyword + path); none had an open issue. All unassigned.

8. Verification

pnpm exec vitest run --maxWorkers=2 scripts/ examples/schema-catalog
Test Files 50 passed (50) Tests 2531 passed (2531) exit 0
pnpm --filter @object-ui/site type-check exit 0
pnpm --filter @object-ui/example-schema-catalog type-check exit 0
pnpm turbo run build --filter='@object-ui/site' --concurrency=2 exit 0, 556/556 static pages
pnpm exec eslint (the two changed source files) exit 0, no output
check-{control-bytes,phantom-dependencies,changeset-presence,changeset-no-major,
changeset-fixed,type-check-coverage,lint-coverage,doc-links} all PASS

One lap's worth of that was earned rather than free, and is recorded because it is the kind of gap a test run cannot see: examples/schema-catalog did not declare the nine plugin packages the pin imports. Vitest resolved them through the workspace root and was green, while tsc -p tsconfig.test.json failed with nine TS2882s. Declared as devDependencies in the second commit — which is the only reason package.json and the lockfile appear in this diff.

9. Surface respected


Generated by Claude Code

#4616)
The gallery page renders every catalog entry through a real SchemaRenderer,
but ComponentRegistry only knows a type once the package owning it has loaded.
#4600 registered the two packages its own category needed; measured on
e028dfc, that left 33 of the 423 entries painting the red OBJUI-001 panel
across 14 categories.
registerCatalogBlocks now loads the nine further packages that census resolves
to. Cost measured first, per the ruling: the docs route's first-load JS goes
7738.7 kB -> 9542.6 kB (+23.3%), against a +50% stop condition, with the
prerender unaffected (556/556 static pages, all 440 thumbnail frames).
A new category-wide render pin generalizes #4600's dashboard-only one to all
423 entries and three diagnostics, with every entry registration cannot reach
named as an exclusion rather than skipped: #4624, #4625, #4626, #4627.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qqyix2QcnpUC9XeYVDzx3
@vercel

vercelBot commented Aug 14, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectuiIgnoredIgnoredAug 14, 2026 3:20am

Request Review

…ips Monaco
Three follow-ups measured after the first commit:
- examples/schema-catalog did not declare the nine plugin packages the new pin
imports. Vitest resolved them through the workspace root, so the suite was
green while `tsc -p tsconfig.test.json` failed with nine TS2882s — a gate the
test run cannot see. Declared as devDependencies.
- Rendering `code-editor` mounts Monaco, whose CDN loader script happy-dom
cannot fetch; the resource-load error event made vitest exit 1 with all 2534
tests passing. The three plugin-editor entries are now named exclusions, the
way packages/plugin-editor/src/index.test.ts already handles the same cost;
`code-editor` being registered stays pinned in the control case.
- Header corrections so the exclusion tables and the prose agree.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qqyix2QcnpUC9XeYVDzx3
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)24.7 KB350 KB
Entry fileindex-DVD0qlH0.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)9.56KB3.59KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)8.92KB3.41KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)25.13KB5.40KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.13KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.64KB2.21KB
auth (SocialSignInButtons.js)9.60KB3.89KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)38.46KB10.17KB
auth (createAuthenticatedFetch.js)6.34KB2.43KB
auth (index.js)2.35KB1.07KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.02KB0.88KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)26.07KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.65KB0.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)489.48KB108.55KB
core (index.js)3.79KB1.52KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)163.56KB44.83KB
fields (index.js)230.37KB57.17KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)3.35KB1.38KB
i18n (pickLocalized.js)3.69KB1.73KB
i18n (provider.js)23.12KB7.62KB
i18n (useDisplayLocale.js)2.84KB1.45KB
i18n (useObjectLabel.js)27.59KB6.63KB
i18n (useSafeTranslation.js)7.77KB3.13KB
layout (index.js)38.98KB10.85KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.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.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)8.75KB3.06KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)3.67KB1.12KB
permissions (evaluator.js)4.41KB1.44KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.55KB0.71KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.86KB12.91KB
plugin-charts (index.js)62.10KB17.67KB
plugin-chatbot (index.js)181.21KB43.14KB
plugin-dashboard (index.js)121.35KB31.64KB
plugin-designer (index.js)212.58KB42.83KB
plugin-detail (index.js)239.93KB60.01KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)114.72KB27.70KB
plugin-gantt (index.js)164.30KB40.02KB
plugin-grid (index.js)190.02KB50.48KB
plugin-kanban (index.js)52.74KB14.53KB
plugin-list (index.js)112.01KB27.27KB
plugin-map (index.js)18.16KB5.81KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)41.38KB11.09KB
plugin-timeline (index.js)26.68KB7.66KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.09KB20.56KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.67KB2.37KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)27.64KB9.44KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.26KB0.67KB
react (schema-input.js)1.45KB0.83KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)4.47KB2.03KB
sdui-parser (parse.js)10.04KB2.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)4.69KB1.48KB
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)0.20KB0.18KB
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-retry.js)4.32KB2.02KB
types (index.js)3.05KB1.52KB
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 (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
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

Rendering the three plugin-map entries mounted maplibre for real. Two problems,
the second decisive:
- it refuses to initialise without WebGL2 ("WebGL2 is required to display this
map") and then trips SchemaRenderer's error boundary tearing its own painter
down, so the pin already had to lift every assertion but one for them;
- it fetches its style from https://demotiles.maplibre.org over the real
network. A unit test that reaches a third-party host is nondeterministic and
makes CI depend on that host being up, whatever it asserts.
All five of packages/plugin-map's own test files mock 'react-map-gl/maplibre'
for this reason. This pin renders the gallery's real stack so it cannot mock,
and abstains instead: the three entries join plugin-editor's in EXCLUSIONS, and
ComponentRegistry.get('object-map') in the control case is what stays pinned —
which is what #4616 changed for that bucket. Drops the UNKNOWN_PANEL_ONLY tier,
now empty.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qqyix2QcnpUC9XeYVDzx3
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)24.7 KB350 KB
Entry fileindex-DVD0qlH0.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)9.56KB3.59KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)8.92KB3.41KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)25.13KB5.40KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.13KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.64KB2.21KB
auth (SocialSignInButtons.js)9.60KB3.89KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)38.46KB10.17KB
auth (createAuthenticatedFetch.js)6.34KB2.43KB
auth (index.js)2.35KB1.07KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.02KB0.88KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)26.07KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.65KB0.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)489.48KB108.55KB
core (index.js)3.79KB1.52KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)163.56KB44.83KB
fields (index.js)230.37KB57.17KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)3.35KB1.38KB
i18n (pickLocalized.js)3.69KB1.73KB
i18n (provider.js)23.12KB7.62KB
i18n (useDisplayLocale.js)2.84KB1.45KB
i18n (useObjectLabel.js)27.59KB6.63KB
i18n (useSafeTranslation.js)7.77KB3.13KB
layout (index.js)38.98KB10.85KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.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.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)8.75KB3.06KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)3.67KB1.12KB
permissions (evaluator.js)4.41KB1.44KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.55KB0.71KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.86KB12.91KB
plugin-charts (index.js)62.10KB17.67KB
plugin-chatbot (index.js)181.21KB43.14KB
plugin-dashboard (index.js)121.35KB31.64KB
plugin-designer (index.js)212.58KB42.83KB
plugin-detail (index.js)239.93KB60.01KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)114.72KB27.70KB
plugin-gantt (index.js)164.30KB40.02KB
plugin-grid (index.js)190.02KB50.48KB
plugin-kanban (index.js)52.74KB14.53KB
plugin-list (index.js)112.01KB27.27KB
plugin-map (index.js)18.16KB5.81KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)41.38KB11.09KB
plugin-timeline (index.js)26.68KB7.66KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.09KB20.56KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.67KB2.37KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)27.64KB9.44KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.26KB0.67KB
react (schema-input.js)1.45KB0.83KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)4.47KB2.03KB
sdui-parser (parse.js)10.04KB2.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)4.69KB1.48KB
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)0.20KB0.18KB
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-retry.js)4.32KB2.02KB
types (index.js)3.05KB1.52KB
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 (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
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

@yinlianghui
yinlianghui marked this pull request as ready for review August 14, 2026 03:31
@yinlianghui
yinlianghui added this pull request to the merge queueAug 14, 2026
Merged via the queue into main with commit 69eb6b2Aug 14, 2026
20 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-4616-gallery-full-registration branch August 14, 2026 03:31
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Docs gallery: 35 catalog entries render the red "Unknown component type" panel because their plugin package is never loaded on that page

2 participants

@yinlianghui@claude