Skip to content

fix(examples,docs): the dashboard gallery renders working charts again — filtered-* entries leave the retired shape (#4600) - #4615

Merged
yinlianghui merged 3 commits into
mainfrom
claude/issue-4600-gallery-truth
Aug 14, 2026
Merged

fix(examples,docs): the dashboard gallery renders working charts again — filtered-* entries leave the retired shape (#4600)#4615
yinlianghui merged 3 commits into
mainfrom
claude/issue-4600-gallery-truth

Conversation

@yinlianghui

@yinlianghui yinlianghui commented Aug 14, 2026

Copy link
Copy Markdown
Collaborator

Implements (d1) of #4600's ruling (comment 5287965650). Not Fixes — the card also tracks (d2), routed upstream to objectstack#8593; the PM decides closure.

What was broken, measured on origin/main @ c1d939f7f

The measurement seat found 15 "retired data format" placeholder widgets and 2 dataset-error widgets across the plugin-dashboard catalog entries. Rendering them through the gallery's own registration set found one more layer:

PROBE A — exactly what apps/site/app/components/SchemaThumbnail.tsx loads
(@object-ui/react + @object-ui/components + registerLayoutBlocks, nothing else)

=== plugin-dashboard/filtered-dashboard ===
Unknown component type: dashboard 💡 Ensure the component is registered via
registry.register() before rendering. (OBJUI-001)
... 9 of 9 entries, identical

/docs/guide/schema-catalog loads no plugin at allPluginLoader is opt-in per docs page and the gallery never wraps anything in one — so every dashboard tile was the registry's red OBJUI-001 panel. The 15 placeholders are what those entries produce once the plugin is loaded (PROBE B, same commit, plugin registered):

filtered-dashboard                  retired=3   filtered-dashboard-dynamic-options  retired=2
filtered-dashboard-date-presets     retired=3   filtered-dashboard-filter-types     retired=3
filtered-dashboard-target-widgets   retired=3   filtered-dashboard-dataset-widgets  retired=1 datasetErr=2
TOTAL: 15 retired placeholders, 2 dataset errors

Both had to be fixed for the gallery to draw a chart, so this PR does both.

Per-entry surface choice, with the probe evidence

Three candidate live surfaces were rendered in the gallery context before choosing (PROBE C, real DOM markers):

candidate result in the gallery context
static options.data array (+ xField/yField) chart mounts[data-chart]=1, .recharts-responsive-container=1, 0 alerts
static options.value metric renders the valueTotal Invoices 1,284
options.data = { provider: 'object', … } chart container mounts, but there is no data-source adapter behind the gallery, so nothing is ever fetched
dataset + dimensions + values, context-only stub still This data source does not support dataset queries.
dataset + … , stub passed as a prop chart mounts; metric renders Revenue 69 revenue

That fourth row is the load-bearing measurement: DashboardRenderer takes dataSource as a React prop, and SchemaRendererContext alone never reaches it — so the stub is passed both ways.

entry surface chosen
filtered-dashboard static options.data (bar, line) + options.value (metric)
filtered-dashboard-date-presets static options.data (line, area) + options.value
filtered-dashboard-dynamic-options static options.data (bar, donut)
filtered-dashboard-filter-types static options.data (bar, line) + options.value
filtered-dashboard-target-widgets static options.data (bar, line) + options.value
filtered-dashboard-dataset-widgets widgets 0/1 stay dataset-bound (they exist to demonstrate that binding, and now render through the stub); widget 2 becomes static options.data, keeping the "dataset + inline" mix the entry's title promises

Every globalFilters, filterBindings, targetWidgets and dateRange declaration is byte-identical — the filter pedagogy is what these entries teach — and the #4356 pair-form options stay pair-form (its guardrail is green on both sides, below). The 3 metric-card entries are untouched: they render fine, and their spec-validity is objectstack#8593's question.

The gallery stub and the registration

  • apps/site/app/components/galleryDataSource.ts — canned queryDataset rows shaped from the query's own dimensions/measures, so any dataset-bound widget gets a two-bucket series (or a single value with no dimension). A demo fixture: it does not filter or aggregate. Gallery-only; apps/site is private, so this is not a published package surface.
  • apps/site/app/components/registerCatalogBlocks.ts — the @object-ui/plugin-dashboard + @object-ui/plugin-charts side-effect imports the gallery never had. SchemaThumbnail imports it alongside ./registerLayoutBlocks rather than through it — see the CI-lap note below for why that separation is load-bearing. Eager, for the same reason registerLayoutBlocks is eager (the thumbnails stay in the prerendered HTML). Deliberately not wired into InteractiveDemo/LiveSplitDemo, so ordinary docs pages keep their PluginLoader-governed lazy loading; the gallery page's own modal preview is unaffected because SchemaThumbnail has already registered them on that page.

Docs truth

  • content/docs/guide/dashboard-filters.md — Step 1 and Step 4 move off the retired top-level object/categoryField/aggregate shape to dataset binding; a new "Where a widget's data comes from" table names the three surfaces and which of them filters can reach; a retirement note tells legacy authors what the placeholder means and how to rebind. The "Working examples" claim now says what those examples actually are. "Inline (object-based) and dataset-bound widgets can mix freely" is corrected — the mix is real, but it is dataset + inline object query / static array, which behave differently under filters. The Known-limitations metadata-check bullet was false: buildWidgetScopedFilter takes knownFields, and no renderer passes it (DashboardRenderer.tsx:749 is the only call site) — the bullet now describes what actually happens.
  • content/docs/plugins/plugin-dashboard.mdx and packages/plugin-dashboard/README.md — the same widget examples move to dataset binding, each with a short note on the retired shape and on options.data.

The render pin (the CI blind spot this closes)

examples/schema-catalog/test/plugin-dashboard-gallery-render.test.tsx renders every entry in the category through the real SchemaRenderer with the gallery's context and asserts no tile shows the retired placeholder, the dataset error, or OBJUI-001 — plus every authored widget title, so an entry cannot pass by rendering nothing. smoke.test.tsx contains no render( call at all, which is why none of this was visible to CI.

RED against origin/main's entries (predictions written before the run; entries reverted with git checkout origin/main --, never git stash):

- "broken": [],
+ "broken": [
+   "plugin-dashboard/filtered-dashboard: retired=3 datasetError=0",
+   "plugin-dashboard/filtered-dashboard-dataset-widgets: retired=1 datasetError=0",
+   "plugin-dashboard/filtered-dashboard-date-presets: retired=3 datasetError=0",
+   "plugin-dashboard/filtered-dashboard-dynamic-options: retired=2 datasetError=0",
+   "plugin-dashboard/filtered-dashboard-filter-types: retired=3 datasetError=0",
+   "plugin-dashboard/filtered-dashboard-target-widgets: retired=3 datasetError=0",
+ ],
    "datasetErrors": 0,
-   "retired": 0,
+   "retired": 15,

Test Files  1 failed (1)     Tests  7 failed | 5 passed (12)

datasetErrors reads 0 there rather than the measured 2 because the pin already supplies the stub — the 2 dataset errors belong to the old gallery dataSource: {}, and are reproduced verbatim in the PROBE B table above. Reported as measured rather than as predicted.

GREEN after — and a second reverse check with the entries kept but the gallery wiring removed fails exactly one case, the parity guard, which is what gives that guard teeth:

after the rewrite:            Test Files  1 passed (1)   Tests  12 passed (12)
gallery wiring removed:       Tests  1 failed | 11 passed (12)   <- the parity case only
whole catalog suite:          Test Files  7 passed (7)   Tests  1134 passed (1134)

The #4356 guardrail (plugin-dashboard-global-filters-spec.test.ts) is inside that 1134 and green on both sides.

Verification

pnpm exec vitest run examples/schema-catalog --maxWorkers=2      7 files, 1134 tests, all passed
pnpm exec vitest run scripts --maxWorkers=2                      42 files, 957 tests, all passed
pnpm exec vitest run packages/plugin-dashboard --maxWorkers=2    52 files, 415 tests, all passed
pnpm exec vitest run packages/plugin-charts examples             33 files, 1326 tests, all passed
pnpm --filter @object-ui/example-schema-catalog type-check       clean (after the ^... build closure)
pnpm --filter @object-ui/site lint                               0 errors, 7 warnings (all pre-existing, playground)
node scripts/check-doc-links.mjs                                 Links are valid across 13 scan roots.
check-{control-bytes,phantom-dependencies,changeset-presence,changeset-no-major,
       changeset-fixed,type-check-coverage,lint-coverage,i18n-call-site-keys,i18n-en-drift}   all PASS

check-changeset-presence reports "0 of them under the src/ of a package the release covers … no changeset is owed"examples/schema-catalog and apps/site are changeset-ignored and the plugin-dashboard edit is its README. Hence skip-changeset, applied to this PR.

CI laps on this PR, recorded

1. Test (shard 1/4) went red on the first push, correctly, and it was mine. scripts/__tests__/site-playground-layout-registration-3904.test.ts discovers every apps/site SchemaRenderer host and reads its imports for registerLayoutBlocks by name. Reaching that registrar through the new registerCatalogBlocks module put it in the host's module graph but not in the guard's source-text view, so SchemaThumbnail read as a host that registers nothing:

FAIL scripts/__tests__/site-playground-layout-registration-3904.test.ts
  apps/site/app/components/SchemaThumbnail.tsx renders SchemaRenderer but never imports
  registerLayoutBlocks ... expected false to be true

Fixed in the second commit by naming both registrars in the host, one per responsibility, and dropping the re-export from registerCatalogBlocks so #3904's discovery property stays literally true for any host added later.

2. Build Docs is red, and it is red on main at this branch's base commit. Not introduced here:

run 31740683664   main   push   c1d939f7f   conclusion: failure
  Build Docs -> step "Build Site" -> failure       (the preceding main run was success)

c1d939f7f is the merge of PR #4608 (#4580, "the union wins"), and the failing step is next build's TypeScript pass with five TS2322s — SchemaNode not assignable to SchemaRenderer's schema prop, in InteractiveDemo ×2, LiveSplitDemo, playground/page.tsx and SchemaThumbnail. Four of those five files are untouched by this PR, and the error is on the schema={…} attribute, not the dataSource one added here. Evidence and the two contract options are on #4617. Deliberately not patched here: the honest fix is a published prop-type decision in @object-ui/react, and casting at the call sites is exactly the consumer-side tolerance contract-first forbids.


Generated by Claude Code

…n — filtered-* entries leave the retired shape (#4600)

Implements (d1) of #4600's ruling. The 6 `filtered-*` catalog entries taught
and rendered the pre-ADR-0021 inline analytics shape, which the renderer
retired in framework#3320: 15 of the category's 28 widgets drew the "retired
data format" placeholder and 2 more drew DatasetWidget's unsupported-source
error.

- The 6 entries now bind live surfaces: inline `options.data` (static series /
  `options.value` metrics) for the five inline examples, and the dataset
  variant keeps its two `dataset`-bound widgets, which now render through a
  gallery stub. Every `globalFilters` / `filterBindings` / `targetWidgets` /
  `dateRange` declaration is unchanged — the filter pedagogy is the point of
  these entries — and the #4356 pair-form options stay pair-form.
- `apps/site` gains `galleryDataSource` (canned `queryDataset` rows) and
  `registerCatalogBlocks` (the dashboard + chart registrations the gallery
  page never loaded). Measured: before this change every dashboard tile in the
  gallery was the registry's "Unknown component type: dashboard" panel.
- The 3 teaching locations move off the retired shape and the false prose is
  corrected ("Working examples", "mix freely", the metadata-check claim).
- New render pin: every entry is rendered through the real SchemaRenderer and
  may show none of the three diagnostics. Red before this change (retired=15
  across 5 entries), green after.

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

vercel Bot commented Aug 14, 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 14, 2026 2:11am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

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

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 9.56KB 3.59KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 8.92KB 3.41KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 25.13KB 5.40KB
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) 38.46KB 10.17KB
auth (createAuthenticatedFetch.js) 6.34KB 2.43KB
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) 5.02KB 0.88KB
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) 489.48KB 108.55KB
core (index.js) 3.79KB 1.52KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 163.56KB 44.83KB
fields (index.js) 230.37KB 57.17KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 3.35KB 1.38KB
i18n (pickLocalized.js) 3.69KB 1.73KB
i18n (provider.js) 23.12KB 7.62KB
i18n (useDisplayLocale.js) 2.84KB 1.45KB
i18n (useObjectLabel.js) 27.59KB 6.63KB
i18n (useSafeTranslation.js) 7.77KB 3.13KB
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.75KB 3.80KB
plugin-calendar (index.js) 46.86KB 12.91KB
plugin-charts (index.js) 62.10KB 17.67KB
plugin-chatbot (index.js) 181.21KB 43.14KB
plugin-dashboard (index.js) 121.23KB 31.62KB
plugin-designer (index.js) 212.58KB 42.83KB
plugin-detail (index.js) 239.93KB 60.01KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 114.72KB 27.70KB
plugin-gantt (index.js) 164.30KB 40.02KB
plugin-grid (index.js) 190.02KB 50.48KB
plugin-kanban (index.js) 52.74KB 14.53KB
plugin-list (index.js) 112.01KB 27.27KB
plugin-map (index.js) 18.16KB 5.81KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 41.38KB 11.09KB
plugin-timeline (index.js) 26.68KB 7.66KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 84.09KB 20.56KB
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) 27.64KB 9.44KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.26KB 0.67KB
react (schema-input.js) 1.45KB 0.83KB
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

…4600)

The #3904 guard (scripts/__tests__/site-playground-layout-registration-3904.
test.ts) discovers every apps/site SchemaRenderer host and reads its imports
for `registerLayoutBlocks` by name. Routing that import through the new
`registerCatalogBlocks` module satisfied it in the module graph but not in the
guard's source-text view, so the host read as one that registers nothing — CI
red, correctly.

Each host now names both registrars, one per responsibility: layout blocks
(#3787) and the gallery's dashboard/chart blocks (#4600). registerCatalogBlocks
no longer re-exports the layout one, so the guard's discovery property stays
literally true for any host added later.

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

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

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 9.56KB 3.59KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 8.92KB 3.41KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 25.13KB 5.40KB
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) 38.46KB 10.17KB
auth (createAuthenticatedFetch.js) 6.34KB 2.43KB
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) 5.02KB 0.88KB
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) 489.48KB 108.55KB
core (index.js) 3.79KB 1.52KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 163.56KB 44.83KB
fields (index.js) 230.37KB 57.17KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 3.35KB 1.38KB
i18n (pickLocalized.js) 3.69KB 1.73KB
i18n (provider.js) 23.12KB 7.62KB
i18n (useDisplayLocale.js) 2.84KB 1.45KB
i18n (useObjectLabel.js) 27.59KB 6.63KB
i18n (useSafeTranslation.js) 7.77KB 3.13KB
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.75KB 3.80KB
plugin-calendar (index.js) 46.86KB 12.91KB
plugin-charts (index.js) 62.10KB 17.67KB
plugin-chatbot (index.js) 181.21KB 43.14KB
plugin-dashboard (index.js) 121.23KB 31.62KB
plugin-designer (index.js) 212.58KB 42.83KB
plugin-detail (index.js) 239.93KB 60.01KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 114.72KB 27.70KB
plugin-gantt (index.js) 164.30KB 40.02KB
plugin-grid (index.js) 190.02KB 50.48KB
plugin-kanban (index.js) 52.74KB 14.53KB
plugin-list (index.js) 112.01KB 27.27KB
plugin-map (index.js) 18.16KB 5.81KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 41.38KB 11.09KB
plugin-timeline (index.js) 26.68KB 7.66KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 84.09KB 20.56KB
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) 27.64KB 9.44KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.26KB 0.67KB
react (schema-input.js) 1.45KB 0.83KB
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

…lery-truth

# Conflicts:
#	apps/site/app/components/SchemaThumbnail.tsx
@yinlianghui
yinlianghui added this pull request to the merge queue Aug 14, 2026
Merged via the queue into main with commit e028dfc Aug 14, 2026
20 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-4600-gallery-truth branch August 14, 2026 02:11
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

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

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 9.56KB 3.59KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 8.92KB 3.41KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 25.13KB 5.40KB
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) 38.46KB 10.17KB
auth (createAuthenticatedFetch.js) 6.34KB 2.43KB
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) 5.02KB 0.88KB
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) 489.48KB 108.55KB
core (index.js) 3.79KB 1.52KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 163.56KB 44.83KB
fields (index.js) 230.37KB 57.17KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 3.35KB 1.38KB
i18n (pickLocalized.js) 3.69KB 1.73KB
i18n (provider.js) 23.12KB 7.62KB
i18n (useDisplayLocale.js) 2.84KB 1.45KB
i18n (useObjectLabel.js) 27.59KB 6.63KB
i18n (useSafeTranslation.js) 7.77KB 3.13KB
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.75KB 3.80KB
plugin-calendar (index.js) 46.86KB 12.91KB
plugin-charts (index.js) 62.10KB 17.67KB
plugin-chatbot (index.js) 181.21KB 43.14KB
plugin-dashboard (index.js) 121.35KB 31.64KB
plugin-designer (index.js) 212.58KB 42.83KB
plugin-detail (index.js) 239.93KB 60.01KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 114.72KB 27.70KB
plugin-gantt (index.js) 164.30KB 40.02KB
plugin-grid (index.js) 190.02KB 50.48KB
plugin-kanban (index.js) 52.74KB 14.53KB
plugin-list (index.js) 112.01KB 27.27KB
plugin-map (index.js) 18.16KB 5.81KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 41.38KB 11.09KB
plugin-timeline (index.js) 26.68KB 7.66KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 84.09KB 20.56KB
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) 27.64KB 9.44KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.26KB 0.67KB
react (schema-input.js) 1.45KB 0.83KB
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

Sign up for free to 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.

2 participants