Skip to content

fix(views): the five per-view-type configs speak the spec vocabulary (#2231 phase 3) - #2892

Merged
os-zhuang merged 2 commits into
mainfrom
claude/unify-object-ui-types-zod-hc6qoc
Jul 28, 2026
Merged

fix(views): the five per-view-type configs speak the spec vocabulary (#2231 phase 3)#2892
os-zhuang merged 2 commits into
mainfrom
claude/unify-object-ui-types-zod-hc6qoc

Conversation

@os-zhuang

@os-zhuang os-zhuang commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Summary

Phase 3 of #2231, after #2622/#2636 (derive ListViewSchema, retire the spec-bridge copy) and #2882 (reduce every remaining "Mirrors @objectstack/spec/ui X" sub-schema to a spec re-export).

kanban / calendar / gantt / gallery / timeline were the last hand-written forks — and this fork was not cosmetic. objectui named the same concepts differently from the protocol, and the read-sites disagreed about which dialect they spoke. Three of those disagreements were live rendering bugs, all reachable from a view created through the product's own UI: CreateViewDialog emits spec vocabulary (packages/app-shell/src/views/CreateViewDialog.tsx).

The three bugs

1. Kanban lanes ignored the spec key. ListView gated the Kanban tab on groupByField || groupField but rendered lanes off groupField alone. A spec-authored config offered the tab and then grouped by whatever detectStatusField() guessed.

The same block spread the whole config onto the component props last, so the spec's columns (the fields shown on each card) landed on ObjectKanban's columns prop — which means lanes. ObjectKanban then took its object-array branch and mapped string[] through localizeColumn, producing lanes with undefined id and title.

Fixed: read the spec key first, map columnscardFields, strip the vocabulary keys from the passthrough. plugin-view's adapter already did this correctly; the three adapters now agree.

2. The $select collector was blind to the spec vocabulary. Same root cause, one layer earlier. The collector that decides what the view asks the server for listed only groupField / groupBy / cardFields, so a spec-authored config named its lane and card fields in a vocabulary the collector could not see — the board then rendered from rows that never carried them, which reads as an empty board rather than a config error. Adds groupByField, summarizeField and columns ahead of the aliases, in both collectors.

3. Timeline lost every spec key in app-shell. ObjectView's timeline branch was a three-key whitelist while its gallery and gantt siblings had already been fixed to spread-first (their comments explain why). A stored timeline: { startDateField, endDateField, groupByField, colorField, scale } arrived with only titleField, axis pinned to the 'due_date' fallback.

Also fixed

  • plugin-view's ObjectView now reads gallery.coverField and timeline.startDateField — it understood only the legacy aliases.
  • Dead gallery.subtitleField removed. Three producers computed it; ObjectGallery declared the prop and never read it — declared ≠ delivered.
  • defaultKanbanFromObject no longer writes the legacy key alongside the spec one. That dual-write existed only to work around bug 1 (its comment said so).

Schema

The four remaining configs derive from the spec configs via .partial() — the product authors partial configs (kanban: { groupByField } with no columns) while spec marks columns / titleField / startDateField required, so requiring them would reject views the app itself creates. Same trade-off SpecListViewFields already makes. gantt needs no local schema at all and now flows in with the rest.

.passthrough() is preserved from the pre-#2231 shapes for the reason the spec itself puts it on GanttConfigSchema/TreeConfigSchema: renderers grow config knobs ahead of the protocol (calendar's allDayField), and stripping them would silently disable a shipped capability.

The pre-#2231 names stay accepted as deprecated aliases so stored view metadata keeps validating — the spec key is canonical and wins wherever both appear:

config local key why
kanban groupField, cardFields deprecated aliases for groupByField / columns
calendar defaultView no spec counterpart — promote rather than grow
gallery imageField deprecated alias for coverField
timeline dateField deprecated alias for startDateField

Tests

  • list-view-spec-parity.test.ts gains a per-config derivation guard: every spec field present, local keys exactly the sanctioned set, spec vocabulary parses without stripping, aliases still accepted, and partial configs still valid.
  • Six ListView regression tests. Five pin the kanban render bugs via a ComponentRegistry stub that captures the resolved props (spec key groups, alias still works, spec key wins over alias, columnscardFields with no lane leak, unrecognized spec fields still pass through). The sixth asserts the queried field set contains a spec-authored kanban's lane and card fields — verified to fail without the collector fix, so it is not a vacuous test.

Verification

  • @object-ui/types tsc --noEmit: 0 errors. Changed files lint-clean (0 errors).
  • Unit project (types / plugin-list / plugin-view / app-shell / react): 121 files, 1339 tests green.
  • DOM project (plugin-list / plugin-view / app-shell / plugin-kanban / plugin-timeline / plugin-gantt): 154 files, 1252 tests green.
  • Full monorepo build: 43/43 packages successful.

Follow-ups

Tracked in #2890 (phases 4–5): the top-level legacy vocabulary (show*userActions, fieldscolumns, filtersfilter, objectNamedata.provider:'object', aria/sharing → spec sub-shapes), dropping the four aliases above once stored metadata is migrated, promoting calendar.defaultView into the spec, and auditing ObjectViewSchema / DetailViewSchema.

objectstack#3761 (merged) promotes ListColumn.prefix and the { type, field } summary form into the spec; when it releases, @object-ui/types drops its last ListColumnSchema.extend().

🤖 Generated with Claude Code

…2231 phase 3)

`kanban`/`calendar`/`gantt`/`gallery`/`timeline` on `ListViewSchema` were the last
hand-written forks after #2882 — and the fork was not cosmetic. objectui named the
same concepts differently from `@objectstack/spec/ui`, and several read-sites only
understood one of the two dialects. Two of those gaps were live bugs.

Kanban lanes ignored the spec key. `ListView` gated the Kanban tab on
`groupByField || groupField` but rendered lanes off `groupField` alone, so a config
authored with the spec key — what the product's own `CreateViewDialog` emits —
offered the tab and then grouped by whatever `detectStatusField()` guessed. The
spec's `columns` (fields shown on each card) was also spread onto the board
verbatim, where `columns` means LANES, so `ObjectKanban` built lanes with undefined
id/title. `columns` now maps to `cardFields`, and the vocabulary keys are stripped
from the passthrough (matching plugin-view's adapter, which already did this).

Timeline lost every spec key in app-shell. `ObjectView`'s `timeline` branch was a
three-key whitelist while its `gallery`/`gantt` siblings had already been fixed to
spread-first, so a stored `timeline: { startDateField, endDateField, groupByField,
colorField, scale }` arrived with only `titleField` and an axis pinned to the
`'due_date'` fallback.

Also: plugin-view's `ObjectView` now reads `gallery.coverField` and
`timeline.startDateField` (it understood only the legacy aliases), the dead
`gallery.subtitleField` is removed (three producers computed it; `ObjectGallery`
never read it), and `defaultKanbanFromObject` no longer emits the legacy key
alongside the spec one — that dual-write existed only to work around the render bug.

Schema side: the four remaining configs derive from the spec via `.partial()` —
the product authors partial configs while spec marks `columns`/`titleField`/
`startDateField` required — and `gantt` needs no local schema at all. `.passthrough()`
is preserved so renderer-ahead knobs (calendar's `allDayField`) still reach the
renderer. The pre-#2231 names (`groupField`, `cardFields`, `imageField`, `dateField`)
stay accepted as deprecated aliases so stored views keep validating; the spec key
wins wherever both appear. `calendar.defaultView` stays local — no spec counterpart.

The drift guard now pins the derivation per config, and five ListView regression
tests cover the kanban bugs.

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

vercel Bot commented Jul 28, 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 Jul 28, 2026 2:53am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation package: types plugin tests labels Jul 28, 2026
… $select

Third instance of the same root cause as the kanban lane bug. The view-config
field collector — which decides what `$select`/`$expand` asks the server for —
listed only the legacy objectui keys (`groupField`, `groupBy`, `cardFields`), so
a spec-authored config named its lane and card fields in a vocabulary the
collector could not see. The board then rendered from rows that never carried
those fields, which reads as an empty board rather than a config error.

Adds the spec counterparts (`groupByField`, `summarizeField`, and `columns` — the
kanban card fields) ahead of the aliases, in both collectors.

Pinned by a test that asserts the queried field set contains the lane and card
fields of a spec-authored kanban; it fails without this change.

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

Copy link
Copy Markdown
Contributor

❌ Console Performance Budget

Metric Value Budget
Main entry (gzip) ** KB** KB
Entry file ``
Status FAIL

📦 Bundle Size Report

Package Size Gzipped
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 22.10KB 4.37KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.12KB 3.41KB
auth (LoginForm.js) 17.86KB 5.29KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.43KB 2.09KB
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) 35.76KB 9.11KB
auth (createAuthenticatedFetch.js) 4.37KB 1.69KB
auth (index.js) 1.83KB 0.79KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 4.91KB 0.87KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 18.38KB 4.49KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 3.65KB 1.42KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.25KB 0.53KB
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) 449.81KB 97.81KB
core (index.js) 2.12KB 0.77KB
create-plugin (index.js) 9.28KB 2.98KB
data-objectstack (index.js) 127.78KB 32.15KB
fields (index.js) 218.37KB 53.54KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.46KB 0.96KB
i18n (pickLocalized.js) 1.70KB 0.83KB
i18n (provider.js) 5.37KB 1.72KB
i18n (useObjectLabel.js) 25.17KB 5.80KB
i18n (useSafeTranslation.js) 3.26KB 1.44KB
layout (index.js) 38.45KB 10.67KB
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) 4.42KB 1.27KB
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) 1.77KB 0.77KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 6.84KB 2.42KB
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.00KB 1.23KB
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.71KB 3.79KB
plugin-charts (index.js) 57.26KB 16.24KB
plugin-chatbot (index.js) 179.53KB 42.79KB
plugin-dashboard (index.js) 109.60KB 28.33KB
plugin-detail (index.js) 214.86KB 52.39KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 103.47KB 25.10KB
plugin-grid (index.js) 178.13KB 46.73KB
plugin-list (index.js) 98.45KB 23.29KB
plugin-map (index.js) 16.80KB 5.24KB
plugin-markdown (index.js) 13.65KB 4.67KB
plugin-report (index.js) 37.07KB 9.81KB
plugin-timeline (index.js) 25.03KB 7.11KB
plugin-tree (index.js) 8.36KB 2.81KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.55KB 0.67KB
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) 3.19KB 1.38KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 18.70KB 6.09KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.00KB 0.55KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 2.16KB 0.94KB
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 (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) 0.77KB 0.41KB
types (disclosure.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (index.js) 1.86KB 0.91KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 0.20KB 0.18KB
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.04KB 1.93KB
types (system-fields.js) 2.39KB 1.17KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 0.75KB 0.46KB
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

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

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

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 8.20KB 2.97KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 7.57KB 2.97KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 22.10KB 4.37KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.12KB 3.41KB
auth (LoginForm.js) 17.86KB 5.29KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.43KB 2.09KB
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) 35.76KB 9.11KB
auth (createAuthenticatedFetch.js) 4.37KB 1.69KB
auth (index.js) 1.83KB 0.79KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 4.91KB 0.87KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 18.38KB 4.49KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 3.65KB 1.42KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.25KB 0.53KB
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) 449.81KB 97.81KB
core (index.js) 2.12KB 0.77KB
create-plugin (index.js) 9.28KB 2.98KB
data-objectstack (index.js) 127.78KB 32.15KB
fields (index.js) 218.37KB 53.54KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.46KB 0.96KB
i18n (pickLocalized.js) 1.70KB 0.83KB
i18n (provider.js) 5.37KB 1.72KB
i18n (useObjectLabel.js) 25.17KB 5.80KB
i18n (useSafeTranslation.js) 3.26KB 1.44KB
layout (index.js) 38.45KB 10.67KB
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) 4.42KB 1.27KB
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) 1.77KB 0.77KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 6.84KB 2.42KB
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.00KB 1.23KB
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.71KB 3.79KB
plugin-calendar (index.js) 44.90KB 12.35KB
plugin-charts (index.js) 57.26KB 16.24KB
plugin-chatbot (index.js) 179.53KB 42.79KB
plugin-dashboard (index.js) 109.60KB 28.33KB
plugin-designer (index.js) 210.56KB 42.56KB
plugin-detail (index.js) 214.86KB 52.39KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 103.47KB 25.10KB
plugin-gantt (index.js) 162.26KB 39.53KB
plugin-grid (index.js) 178.13KB 46.73KB
plugin-kanban (index.js) 47.82KB 13.18KB
plugin-list (index.js) 98.64KB 23.33KB
plugin-map (index.js) 16.80KB 5.24KB
plugin-markdown (index.js) 13.65KB 4.67KB
plugin-report (index.js) 37.07KB 9.81KB
plugin-timeline (index.js) 25.03KB 7.11KB
plugin-tree (index.js) 8.36KB 2.81KB
plugin-view (index.js) 85.68KB 20.85KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.55KB 0.67KB
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) 3.19KB 1.38KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 18.70KB 6.09KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.00KB 0.55KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 2.16KB 0.94KB
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 (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) 0.77KB 0.41KB
types (disclosure.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (index.js) 1.86KB 0.91KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 0.20KB 0.18KB
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.04KB 1.93KB
types (system-fields.js) 2.39KB 1.17KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 0.75KB 0.46KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@os-zhuang
os-zhuang marked this pull request as ready for review July 28, 2026 03:00
@os-zhuang
os-zhuang merged commit 8aae006 into main Jul 28, 2026
14 checks passed
@os-zhuang
os-zhuang deleted the claude/unify-object-ui-types-zod-hc6qoc branch July 28, 2026 03:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation package: types plugin tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants