Skip to content

fix(core): derive the undrawable list-view kinds instead of hard-coding them (objectui#9880) - #9939

Merged
os-tesla merged 1 commit into
mainfrom
claude/issue-9880-undrawable-view-kinds-page
Sep 18, 2026
Merged

os-tesla merged 1 commit into
mainfrom
claude/issue-9880-undrawable-view-kinds-page

Conversation

@os-tesla

@os-tesla os-tesla commented Sep 18, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #9880

Clause-②: no — the exported ListViewVisualization resolves to the same nine members under either spec (compiled both ways below, and every downstream consumer re-compiled against the rebuilt declarations); no key on a published payload moves and no accept set is relaxed. What moves is how that type is DERIVED, plus a non-exported alias and table shape now visible in @object-ui/core's emitted declaration.

⭐ The judgement the card asked for first: YES, a both-legs spelling exists

The card's first deliverable was the judgement, not a delete — and triage's mechanical re-grade switch (pm:retriage → pm:on-hold) was to be tripped only if a both-legs spelling were measurably impossible. It is not impossible, so the switch is not tripped and no re-grade is asked for.

Why the old spelling could not survive the retirement. Two literals were cited on the card; only ONE of them was ever a compile error, and this is a correction to the card's framing:

site old spelling on the published leg on the main leg
ListViewVisualization Exclude<ViewType, 'list' | 'detail' | 'page'> fine silently fine — Exclude of a non-member is a no-op no compiler reads
UNDRAWABLE_VIEW_KINDS annotated Record<Exclude<ViewType, ListViewVisualization>, string | null> fine TS2353 — the page: row is an excess property

An annotated object literal is exact in BOTH directions. That is what makes the retirement unfixable under it: the addition direction wants a missing key to be an error (correct), and the retirement direction then makes a stale row an error too, whose only repair is deleting the row — which this repository cannot do while it resolves a published spec that still accepts type: 'page' views. The second literal was not a second error; it was a claim that had quietly stopped being true.

The spelling that is total against both. Keep the value constraint, drop the exactness, and derive the other half of the partition from the table's own keys intersected with the live vocabulary:

const UNDRAWABLE_VIEW_KINDS = {
  list: null,
  detail: null,
  page: 'it mounts a published page (bound through `pageName`) …',
} satisfies Record<string, string | null>;

type UndrawableViewKind = Extract<ViewType, keyof typeof UNDRAWABLE_VIEW_KINDS>;

export type ListViewVisualization = Exclude<ViewType, UndrawableViewKind>;

Extract is the load-bearing operator: a row for a kind the spec has RETIRED drops out of the type while staying live in the table at runtime, which is exactly what an author who can still write a page view against the resolved spec needs.

The guard objectui#8127 installed is unchanged, it just lands in one place instead of two. A kind the spec ADDS is classed by neither table, so it is not extracted, so it stays inside ListViewVisualization — and LIST_VIEW_KINDS is still a total Record<ListViewVisualization, true>, which goes red until the new kind is classed as drawable there or explained in the undrawable table. A MISSPELLED key in the undrawable table fails the same way, because the kind it was meant to class is not extracted either. ⛔ objectui#9860's gate is not weakened, narrowed or disabled anywhere in this diff; ⛔ the @objectstack/spec pin is untouched; ⛔ nothing here proposes reversing the upstream retirement.

The two legs, compiled — same mechanism, same command

Injection is objectui#9877's own scripts/spec-main-shape-gate.mjs inject (remove-then-copy into pnpm's virtual store, npm pack bytes, 29 consumers verified), run from that branch's copy of the script; the script itself is not part of this diff. Command on every leg: TURBO_FORCE=true pnpm exec turbo run type-check --filter=@object-ui/core --concurrency=2, serialized behind the shared verify lock.

Readings taken 2026-09-18T18:20Z–18:35Z. objectui base f5e2fcb4a (origin/main at 2026-09-18T18:15Z, which had already moved past the 02bc27b08 this card was dispatched against). Injected spec built from objectstack-ai/objectstack@07c6f822edd9c4c48a7ce34767de420c6096b9c3 (origin/main at 2026-09-18T18:19Z), packed as 2,039 files / 28,923,936 B.

leg spec resolved source verdict
control published @objectstack/spec@17.4.0 before this change exit 0
subject built from objectstack 07c6f822 before this change exit 2 — src/utils/normalize-list-view.ts(205,3): error TS2353: Object literal may only specify known properties, and 'page' does not exist in type 'Record<"list" | "detail", string | null>'
control published @objectstack/spec@17.4.0 after exit 0
subject built from objectstack 07c6f822 after the TS2353 is gone; two diagnostics remain, both in OTHER files and both pre-existing (see below)

The two vocabularies were read directly, so "both legs" is not an inference: the published spec's ListViewSchema.shape.type answers ["grid","kanban","gallery","calendar","timeline","gantt","map","chart","tree","page"] and the main-built one answers the same list without page.

⚠️ This does NOT clear objectui#9860's day-one red, and the gate under-reports

⭐ Measured, and it changes what objectui#9877 is waiting for. With the main-built spec injected, @object-ui/core alone has three diagnostics, not one. The gate reported one because each package's type-check script is tsc --noEmit && tsc -p tsconfig.test.json: the first half failed, so the TESTS project never ran. Running the tests project ALONE against the pristine (unchanged) source with main's spec injected prints all three at once —

src/utils/__tests__/normalize-list-view.pageResidual-8429.test.ts(146,13): error TS2322: Type '"page"' is not assignable to type 'ViewType'.
src/utils/normalize-list-view.ts(205,3): error TS2353: Object literal may only specify known properties, and 'page' does not exist in type 'Record<"list" | "detail", string | null>'.
src/validation/__tests__/object-validation-engine.test.ts(162,9): error TS2322: Property 'source' is missing in type '{ dialect: "cel"; ast: … }' …

— which is how the other two are proven to be pre-existing rather than introduced here (that control reverted this file by blob hash, ran, and restored by hash equality). Neither is this card's:

  • the pageResidual-8429 pin is the deliberate tripwire for objectui#8429: its own header says "narrow ViewType ⇒ the published faces stop accepting page ⇒ RED". It is red for the reason it was written to be red, and it cannot be made both-legs-total without deleting the thing it pins — its assertions (SPEC_LIST_VIEW_TYPES.length is 10, ViewTypeSchema.safeParse('page').success is true) are TRUE today on the published leg. It is a pin-bump conversion, not a repair.
  • the object-validation-engine diagnostic is an unrelated upstream shape move (an expression wire that now requires source).

⇒ landing objectui#9877 still puts a red advisory check on every pull request. This diff removes one of the three reasons.

Tests

New pin packages/core/src/utils/__tests__/normalize-list-view.undrawableBothLegs-9880.test.ts. Any single run installs only ONE spec, so the type-level half lifts the source's two operators over a SIMULATED vocabulary — published-shaped, main-shaped, and grown — and asserts the derived drawable set is the same under the first two, that a total record over it compiles under both, and that a grown vocabulary forces the new kind to be classed.

The pins fire. Ablating the two @ts-expect-error directives (mutation proven on disk by blob hash f6189d5c… → 7e392423…, restored to f6189d5c… by hash equality, trap on EXIT/INT/TERM with absolute paths) makes tsc -p packages/core/tsconfig.test.json print exactly the two diagnostics they hold down, on the published leg, where the source itself cannot produce them:

…undrawableBothLegs-9880.test.ts(109,3): error TS2353: Object literal may only specify known properties, and 'page' does not exist in type 'Record<"list" | "detail", string | null>'.
…undrawableBothLegs-9880.test.ts(116,14): error TS2741: Property 'pivot' is missing in type '{ grid: true; kanban: true; }' but required in type 'Record<"grid" | "kanban" | "pivot", true>'.

The first is the card's own diagnostic, reproduced inside ordinary CI. One runtime assertion also needed a fresh module instance (vi.resetModules() + dynamic import): the undrawable warning is once-per-kind-per-module, and the unit project runs isolate: false, so a sibling suite in the same worker had already spent it — the first draft of that test failed for exactly that reason before it was corrected.

command verdict
pnpm exec vitest run packages/core/ (published spec) 156 files / 3295 tests passed
turbo run type-check --filter=@object-ui/core (published) exit 0
turbo run type-check --filter=...@object-ui/core (published, core + every downstream consumer) exit 0 — 73 tasks
turbo run build --filter=@object-ui/core exit 0 — declarations emit the derived type and the table shape
node scripts/check-changeset-presence.mjs exit 0 — 1 published source file, 1 changeset
node scripts/check-control-bytes.mjs exit 0 — 8005 tracked text files
node scripts/check-new-cross-file-line-citations.mjs exit 0 — 0 new citations
node scripts/check-type-check-coverage.mjs exit 0 — the new test file is compiled by packages/core/tsconfig.test.json
node scripts/check-test-path-roots.mjs · node scripts/check-spec-symbol-derivation.mjs exit 0
pnpm exec eslint on both changed files exit 0 — 0 errors, 0 warnings
node scripts/check-governed-queue-guard.mjs --test on the 3 changed paths exit 0 — NOT GOVERNED, 0 of 5 surfaces matched

⚠️ MEASURED AFTER this body was written, and the sentence that stood here — 「NOT MEASURED: a repo-wide pnpm type-check on the main-built leg」 — is replaced rather than left standing. A repo-wide TURBO_FORCE=true turbo run type-check --concurrency=3 --continue against the main-built spec at objectstack 07c6f822 prints 20 unique diagnostics across 7 packages — core 2, plugin-view 3, types 6, react 1, console 1, plus 7 cascade in app-shell and example-byo-backend-console from plugin-view's failed build ⇒ 13 non-cascade across 5 packages. @object-ui/plugin-view carries three more hard-coded page rows of exactly this card's class. ⭐ Without --continue, turbo cancels the dependents and the same census collapses to 1. ⇒ this belongs to objectui#9877's decision and is carried there and on its own cards; it is recorded here because a reader of #9877 would otherwise use the replaced sentence to decide whether the gate's day-one break is cleared.

Body edited by the domain:ui#2 execution seat at 2026-09-18T19:00Z (clock read by this write), on the dev's own hand-back and its recommendation A — a dev writes its PR body once and ⛔ never PATCHes it, so a falsified NOT-MEASURED claim is the seat's to repair. ⛔ Nothing else in this body was changed.

Acceptance notes — out of scope, noted, not fixed here

  • The gate's break count is a lower bound, structurally. Every package's type-check is tsc && tsc -p tsconfig.test.json, so on a red leg the tests project never runs and its diagnostics never reach the annotation step. objectui#9877's "one file fails" is therefore an artifact of &&, not a census. Worth its own card against the gate. Dedupe words: spec-main-shape-gate short-circuit tests project, type-check && tsc -p tsconfig.test.json masks diagnostics.
  • normalize-list-view.pageResidual-8429.test.ts must be converted at the pin bump, not repaired: it is single-leg BY CONSTRUCTION and red on main today. Dedupe words: pageResidual 8429 pin ViewType narrowed, page residual conversion pin bump.
  • object-validation-engine.test.ts expression-wire drift — { dialect, ast } without source no longer satisfies the spec's expression union on main. Unrelated file, unrelated mechanism. Dedupe words: object-validation-engine dialect source expression wire, spec main expression requires source.
  • Noted, not filed: this file's LIST_VIEW_KINDS and the undrawable table are still two separate literals a reader must hold together; the partition is enforced, so this is ergonomics, and the carrier that would touch it is the pin-bump PR.

🤖 Generated with Claude Code

https://claude.ai/code/session_018HrVaotisyhgmot9o2MLRq


Generated by Claude Code


Generated by Claude Code

…ng them (objectui#9880)

`normalize-list-view`'s two view-kind tables could not be total against
both the `@objectstack/spec` this repository resolves and one built from
objectstack `main`, which retired the list-view kind `page`. The
undrawable table was annotated `Record<Exclude<ViewType,
ListViewVisualization>, string | null>`, and an annotated object literal
is exact in both directions: the retired kind's row became an excess
property (TS2353) whose only repair under that annotation is deleting
the row — which the resolved published spec forbids, because an author
can still write a `page` view against it.

The table now carries `satisfies Record<string, string | null>` and the
undrawable union is `Extract<ViewType, keyof typeof
UNDRAWABLE_VIEW_KINDS>`, so a row for a retired kind goes inert at type
level while staying live at runtime. `ListViewVisualization` subtracts
that derived union instead of the literal `'list' | 'detail' | 'page'`;
its members are unchanged under either spec.

The add-direction guard is unchanged and still mechanical: a kind
neither table classes stays inside `ListViewVisualization`, so the total
`Record<ListViewVisualization, true>` on `LIST_VIEW_KINDS` fails the
build until it is classed as drawable there or explained here.

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

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 3 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/7322-object-kanban-group-by-limit.md

  • names packages/core/src/utils/normalize-list-view.ts → packages/core/src/utils/normalize-list-view.ts — edited by this change

    Who is NOT affected. The VIEW-LEVEL kanban config is untouched: kanban.groupField there is a live legacy alias of the spec's groupByField (packages/core/src/utils/normalize-list-view.ts maps it; plugin-list's ListView and plugin-view's ObjectView still read it). groupField is dead only on the object-kanban NODE. The declarative kanban node (KanbanSchema) is untouched, BaseSchema's unknown-key policy is byte-identical (an undeclared key still passes through), and the renderer is unchanged — boards authored the documented way rendered before and render now. One in-repo fixture authored groupField on this node (packages/types/src/__tests__/kanban-conditional-formatting.test.ts); it now authors groupBy. No doc snippet, catalog entry, skill or app in this repository authored groupField on an object-kanban node.

.changeset/7772-page-block-kanban-group-by-control.md

  • names core/src/utils/normalize-list-view.ts → packages/core/src/utils/normalize-list-view.ts — edited by this change

    The view-level kanban.groupField alias (core/src/utils/normalize-list-view.ts) is live and untouched — node-level retirement and the view-level alias are different things.

.changeset/7773-kanban-adapter-groupfield-write.md

  • names normalize-list-view.ts → packages/core/src/utils/normalize-list-view.ts — edited by this change

    Who is NOT affected — the boundary is node-local. Every VIEW-LEVEL groupField read is untouched and still live: it is a legacy alias of the spec's groupByField on the kanban view config, mapped by normalize-list-view.ts, and both adapters still resolve lanes through it (ObjectView.tsx's kanbanCfg.groupField ||, ListView.tsx's groupByField || groupField). Authoring options.kanban.groupField on a list-view or object-view keeps working exactly as documented in packages/plugin-list/README.md. groupField is dead only on the generated object-kanban NODE.

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Compared the checked-out tree with 00c4df509 (merge-base with origin/main): 2 file(s) changed outside .changeset/, read against 1183 pending declaration(s) that publish a body (1732 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3051.5 KB 3104.5 KB
Main entry chunk (gzip) 145.7 KB 350 KB
Entry file index-B_bJBBqB.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.69KB 6.21KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
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.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 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.68KB 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) 545.76KB 130.74KB
core (index.js) 8.94KB 3.59KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 216.90KB 60.15KB
fields (index.js) 249.22KB 62.85KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.22KB 2.26KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 32.15KB 10.49KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.83KB 10.95KB
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.75KB
mobile (index.js) 1.99KB 0.87KB
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.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 14.81KB 3.63KB
plugin-calendar (index.js) 49.92KB 14.22KB
plugin-charts (index.js) 71.73KB 20.08KB
plugin-chatbot (index.js) 195.35KB 46.52KB
plugin-dashboard (index.js) 132.96KB 35.17KB
plugin-designer (index.js) 215.94KB 44.33KB
plugin-detail (index.js) 253.63KB 66.00KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.82KB 34.17KB
plugin-gantt (index.js) 167.62KB 41.26KB
plugin-grid (index.js) 213.44KB 58.21KB
plugin-kanban (index.js) 48.10KB 14.94KB
plugin-list (index.js) 113.42KB 27.95KB
plugin-map (index.js) 21.48KB 6.99KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.41KB 11.93KB
plugin-timeline (index.js) 30.07KB 8.74KB
plugin-tree (index.js) 10.58KB 3.72KB
plugin-view (index.js) 85.05KB 21.01KB
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.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 104.82KB 34.67KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.66KB 2.50KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 14.82KB 4.99KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.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 (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
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 (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.04KB 5.36KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
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-tesla
os-tesla marked this pull request as ready for review September 18, 2026 19:05
@os-tesla
os-tesla added this pull request to the merge queue Sep 18, 2026
Merged via the queue into main with commit 05a49f2 Sep 18, 2026
38 checks passed
@os-tesla
os-tesla deleted the claude/issue-9880-undrawable-view-kinds-page branch September 18, 2026 19:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants