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

@yinlianghuiyinlianghui 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):

candidateresult in the gallery context
static options.data array (+ xField/yField)chart mounts[data-chart]=1, .recharts-responsive-container=1, 0 alerts
static options.value metricrenders 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 stubstill This data source does not support dataset queries.
dataset + … , stub passed as a propchart 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.

entrysurface chosen
filtered-dashboardstatic options.data (bar, line) + options.value (metric)
filtered-dashboard-date-presetsstatic options.data (line, area) + options.value
filtered-dashboard-dynamic-optionsstatic options.data (bar, donut)
filtered-dashboard-filter-typesstatic options.data (bar, line) + options.value
filtered-dashboard-target-widgetsstatic options.data (bar, line) + options.value
filtered-dashboard-dataset-widgetswidgets 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/siteSchemaRenderer host and reads its imports for registerLayoutBlocksby 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

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 2:11am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)24.7 KB350 KB
Entry fileindex-Dd2P5NKg.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.23KB31.62KB
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

…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

MetricValueBudget
Main entry (gzip)24.7 KB350 KB
Entry fileindex-Dd2P5NKg.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.23KB31.62KB
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

…lery-truth
# Conflicts:
#	apps/site/app/components/SchemaThumbnail.tsx
@yinlianghui
yinlianghui added this pull request to the merge queueAug 14, 2026
Merged via the queue into main with commit e028dfcAug 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

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

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

appsdependenciesdocumentationImprovements or additions to documentationexamplespluginskip-changesettests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@yinlianghui@claude