Skip to content

feat(types): a form field of type grid declares the grid widget's field-level keys (objectui#11070 round 10) - #11381

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-11070-grid-form-face-round10
Oct 1, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-11070-grid-form-face-round10

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Refs #11070
Clause-②: yes (widening). FormFieldSchema, a published accept set, accepts eight more keys on a form field entry, each one a key the grid widget already reads and grid.mdx teaches. The tolerant face now also judges their values, so a wrong-typed value it used to strip is refused. Both halves are priced in the changeset.

Round 10 of objectui#11070, under claim 5930921428 (domain:devx seat 2, maintainer direct dispatch R5). It has three items:

(i) The form-field face mirror

Measured first, at base 0a3e5409

  • GridFieldMetadata declares, beyond BaseFieldMetadata, columns (round 7) and exactly the eight keys in the table below.
  • Neither form-field face declared any of the eight. FormField resolved each one through its [key: string]: any index signature. FormFieldSchema, a plain z.object, stripped each one.
  • The face is flat, not discriminated by type. FormField is one interface with type?: string, and FormFieldSchema is one z.object(...).superRefine(...). Round 7 added columns to it the same way.
  • No collision:
    • no FormField member has any of the eight names;
    • @objectstack/spec 17.5.0's FieldSchema declares none of them, so no spec change is involved;
    • in @object-ui/fields, GridField is the only reader. MasterDetailForm and LineItemsPanel write the same keys into the grid's config with the same meaning, and the form renderer reads none of them.
  • Reach through the public door, by a scratch render probe (never committed) of the new fixture through SchemaRenderer, the real form renderer and GridField:
    • with the keys, the Add button reads "Add line item" and the footer shows the total 109.97;
    • the control, the same fixture without the keys, reads "Add line" and shows no total;
    • with allow_add: false, there is no Add button and no Duplicate action.

Per key, both faces, before and after

key GridFieldMetadata FormField: base → head FormFieldSchema: base → head strict face, fields[] grid entry: base → head tolerant face: base → head
min_rows number index signature (any) → GridFieldMetadata['min_rows'] undeclared → z.number().optional() refused by name at fields.0.min_rows → accepted value stripped → value kept; "1" refused
max_rows number index signature (any) → GridFieldMetadata['max_rows'] undeclared → z.number().optional() refused by name at fields.0.max_rows → accepted value stripped → value kept; "20" refused
allow_add boolean index signature (any) → GridFieldMetadata['allow_add'] undeclared → z.boolean().optional() refused by name at fields.0.allow_add → accepted value stripped → value kept; "false" refused
allow_delete boolean index signature (any) → GridFieldMetadata['allow_delete'] undeclared → z.boolean().optional() refused by name at fields.0.allow_delete → accepted value stripped → value kept; "false" refused
allow_reorder boolean index signature (any) → GridFieldMetadata['allow_reorder'] undeclared → z.boolean().optional() refused by name at fields.0.allow_reorder → accepted value stripped → value kept; "false" refused
total_field string index signature (any) → GridFieldMetadata['total_field'] undeclared → z.string().optional() refused by name at fields.0.total_field → accepted value stripped → value kept; 3 refused
add_label string index signature (any) → GridFieldMetadata['add_label'] undeclared → z.string().optional() refused by name at fields.0.add_label → accepted value stripped → value kept; 1 refused
sort_field string index signature (any) → GridFieldMetadata['sort_field'] undeclared → z.string().optional() refused by name at fields.0.sort_field → accepted value stripped → value kept; 0 refused

The base column was read by a scratch probe on the built @object-ui/types dist at 0a3e5409, with a lit control: the same entry without the keys parses on both faces. Each .describe() on the zod side says that only the grid widget reads the key.

Pins

  • strict-face-read-keys-11070.test.ts:
    • block 1 gains one fields[] grid-entry row per key, each with a misspelled sibling still refused by name, plus an all-eight row whose tolerant output keeps every value;
    • block 2 gains one wrong-type row per key, refused on both faces;
    • block 4 gains assertionGridFieldKeysOnTheFormFieldFace. Every member GridFieldMetadata declares beyond BaseFieldMetadata must be a DECLARED FormField member (not the index signature) with the same type, so a key added to the grid's type and left unmirrored fails to compile. A lit control shows the key set it ranges over is non-empty.
  • form-field-zod-coverage.test.ts: the eight keys join DECLARED_KEYS.
  • zod-mirror-parity.test.ts: FormFieldSchema was already a registered pair. The eight keys are LOCAL on both sides, so no ledger total moves. Its SPEC_DERIVED_PAIRS note now says so.

The refusal flip and the ablations

Predictions were written before each run. Every mutation was committed first and restored to HEAD, with blob == HEAD and git diff HEAD empty. A1 and A2 went through objectstack's scripts/ablation-replace.mjs (anchor 1 → 0, blob changed). The subjects resolve from source, since the tests import ../zod relatively, so no dist is on the path.

  • R0, the refusal flip: form.zod.ts and form.ts were set to base 0a3e5409, and this head's pins were run against them.
    • Predicted: 18 red in vitest (8 per-key rows, the all-eight row, 8 wrong-type rows, the coverage key set) and tsc red only in the pin file.
    • Measured: Tests 18 failed | 68 passed (86), and tsc -p tsconfig.test.json gave 10 errors, all in assertionGridFieldKeysOnTheFormFieldFace (completeness, the mapped equality, the 8 per-key rows). zod-mirror-parity compiled.
  • A1, zod ablation: the allow_add member was deleted from FormFieldSchema.
    • Predicted: 4 red (the allow_add row, the all-eight row, the wrong-type allow_add row, the coverage key set) and the parity file red at tsc.
    • Measured: Tests 4 failed | 119 passed (123) over the pin, coverage and parity files. tsc gave 1 error, in zod-mirror-parity.test.ts at assertionUnmirroredMatchesLedger ("form.zod.ts#FormFieldSchema" is not assignable to never).
  • A2, TS ablation: the allow_add member was deleted from FormField.
    • Predicted: vitest green, the type-level pin red, and the parity file red on the fourth direction.
    • Measured: Tests 123 passed (123). tsc gave 5 errors: the pin file's completeness, mapped-equality and per-key allow_add rows, and zod-mirror-parity.test.ts's MirroredUndeclared reconciliation, by pair and by key ("allow_add" is not assignable to never).

Fixture and docs

  • examples/schema-catalog/src/schemas/fields-grid/line-items-grid.json writes all eight keys, with columns and seeded rows, so the corpus exercises the declared set. The catalog index is regenerated.
  • The three catalog DOM-leak census pins count the new entry, as their own text asks of an added example: grid goes from 26 to 27 in all three, and in the layout pin text goes from 698 to 699 rendered and from 154 to 155 with no element.
  • grid.mdx embeds the fixture and says that the keys are accepted on a form field entry of type: 'grid', and that only the grid widget reads them.

(ii) The app-crm strict-face run (measure only)

The instrument, and why it is the real one. The run uses StrictAnyComponentSchema, exported by @object-ui/types/zod (the built packages/types/dist/zod/index.zod.js), called with .safeParse. That is the call PR #11069's validateAuthoredDocument makes for objectui validate and objectui check.

Command and shas.

  • objectui 0a3e5409, the base, which is main. The types dist was built with pnpm --filter @object-ui/types build. The run was repeated on head be58a328 with byte-identical output.
  • objectstack f0cc16e8d, origin/main. 399e3aa97b is its ancestor (merge-base --is-ancestor exits 0), and git diff 399e3aa97b f0cc16e8d -- examples/app-crm is empty.
  • app-crm was extracted with git archive f0cc16e8d examples/app-crm, and the run was pnpm exec tsx appcrm-strict-run.mts OBJECTUI_WORKTREE APP_CRM_EXTRACT BEFORE_DASHBOARD.
app-crm document projection tolerant strict refusals
dashboards/pipeline.dashboard.ts · PipelineDashboard { type: 'dashboard', ...doc }: DashboardView hands the stored document to DashboardRenderer, and objectui's node face for it is the dashboard arm PASS PASS none
pages/welcome.page.ts · CrmWelcomePage { ...page, type: 'page', pageType: page.type }: the page arm, with the kind on pageType PASS PASS none
the same page, as PageView writes it { ...page, type: page.type, pageType: page.type }, so type: 'home' FAIL FAIL invalid_union at type (no matching discriminator) on both faces. This is the page-kind / node-type collision documented in layout.zod.ts's PAGE_SPEC_EXCLUDED note (objectui#9642), not an unknown key.
apps/crm.app.ts · CrmApp { type: 'app', ...doc } PASS PASS none
lit control: pipeline.dashboard.ts at 399e3aa97b^ (39ab2940e) { type: 'dashboard', ...doc } PASS FAIL unrecognized_keys [format, currency] at widgets.0.options, widgets.1.options and widgets.2.options (plus the non-viable metric-card slot arm's own issues)
  • The dashboard pair objectstack#20960 removed (options.format / options.currency) does not appear at f0cc16e8d, and the control shows that the face refuses exactly that pair before the removal.
  • Nothing in app-crm's UI documents is refused by an unknown key.
  • Not judged: objects, views, actions, flows, datasets, datasources, hooks, security, translations and seed data. These are server metadata, not objectui node documents, and the console builds its list and form nodes from views in code, so there is no single stored-document projection to judge.

(iii) grid.mdx — "Integration with Advanced Grid"

The section offered seven features as @object-ui/plugin-grid's. The basic grid field has five of them too: inline editing, add and remove, row drag-reorder, computed columns, and a one-column footer total. object-grid has no computed columns, and it reorders columns, not rows. It is now a table of what each widget reads, feature by feature, each cell checked against the reader:

  • inline editing: GridField's cell controls versus object-grid's editable, ANDed with the principal's write verdict;
  • add and remove: allow_add / allow_delete versus operations.create and operations.delete with the host's onDelete;
  • sorting and filtering: none in the grid field, versus header sort, sortable: false, filter / sort and searchableFields;
  • drag reorder: rows through allow_reorder and sort_field, versus columns only through reorderableColumns;
  • export: none, versus exportOptions;
  • computed columns: computed with expr in the grid field, versus none in object-grid (a formula field is shown as served);
  • totals: total_field, versus columns[].summary and group aggregations.

M3 (scripts/measure-strict-authoring-face.mjs --json, the types dist built at each ref)

reading base 0a3e5409 head be58a328
documents 601 602
nodes 2229 2230
nodes strict-refused 77 77
strict-only 46 46
red today 31 31
documents refused, whole tree 72 72
documents red today 24 24
form: documents / refused / strict-only / red today 97 / 13 / 9 / 4 98 / 13 / 9 / 4
  • The only move is the new fixture, one strict-clean form document in the catalog corpus.
  • The per-component refusal rows, the undeclared-key occurrences and rendererMentionsOfUndeclaredKeys are identical. unloadableModules moved for an environmental reason: app-shell was unbuilt at base.
  • corpusMatchesMain is false at head because the corpus gains that fixture.

Local verification

Every heavy command went through os-verify-lock (slot issue-11070), with NODE_OPTIONS=--max-old-space-size=4096, vitest --maxWorkers=2, turbo --concurrency=2, and a memory watchdog that kills its own process group below 2500 MB MemAvailable. It never fired.

  • Closure build: turbo run build over check-doc-snippet-types --build-filter ran 35 of 35 tasks at be58a328.
  • Type-check census: turbo run type-check ran 48 tasks, with 13 of 13 type-checks green. The set is every package whose sources or tests reference FormField / FormFieldSchema (a git grep census), plus @object-ui/types and @object-ui/example-schema-catalog: types, fields, components, core, plugin-form, app-shell, cli, plugin-calendar, plugin-detail, plugin-grid, plugin-kanban, console and example-schema-catalog.
  • vitest at be58a328: packages/types/, examples/schema-catalog/ and the two GridField pins ran 351 files, with 348 passed and 3 failed. The three failures were the catalog DOM-leak census pins, and 261d9c9e records them.
  • vitest at 261d9c9e: examples/schema-catalog/ plus the eight catalog- and docs-reading scripts/__tests__ ran 45 of 45 files and 2601 tests passed. The types sources did not change between the two heads.
  • Docs and changeset gates, green: check:doc-snippets (769 of 769 blocks, 0 failed), check:doc-fences, docs:check-links, check:doc-example-ids, check:doc-types, check:doc-examples, check:spec-symbols, check:test-path-roots, check-type-check-coverage, check:control-bytes, check:new-line-citations (0 new), the catalog regenerate:check, check:changeset-claims, check:pending-changeset-literals, check-changeset-presence, changeset:check, check-changeset-overwrite, and check-governed-queue-guard --test (NOT GOVERNED).
  • Pending changesets: check:changeset-claims names 31 pending changesets that describe a touched file. Each paragraph was read, and none is made false by this round, so no dated note is owed.
  • Narrowed lint: eslint --no-inline-config --format json over the 10 changed .ts / .tsx files gave 0 errors, with warnings per file equal to the base blobs.
    • The population is the config's **/*.{ts,tsx} blocks. The JSON, MDX and MD files match none.
    • The config has no parserOptions.project and no projectService, and no rule in eslint-rules/ reads another file, so this diff cannot move an untouched file's verdict.
  • Not run locally: repository-wide pnpm lint and pnpm test, which CI runs.

main did not move after the base (0a3e5409), so there was nothing to merge before opening.

Changeset: @object-ui/types minor. A published accept set widens by eight keys, and the tolerant face narrows on their values. The breaking half is stated in the changeset and priced minor under the fixed group's policy. Nothing else ships: the @object-ui/fields edit is a test docblock, and the catalog is private.

Acceptance notes

  • The flat-face boundary. The eight keys are accepted on every fields[] entry, and only the grid widget reads them, exactly as with columns. Moving them to a type-discriminated arm would be a ruling, not this round's work.
  • Value rules. min_rows and max_rows are typed number on both faces, as GridFieldMetadata types them. No integer or range rule was added: that would tighten GridFieldMetadata too, which is a contract decision.
  • Two edits beyond the named surface:
    • the docblock of packages/fields/src/widgets/GridField.declaredSpelling.test.tsx said "the three fields-grid catalog examples", which the new fixture made stale; it now says "every";
    • the three DOM-leak census pins, as above.
  • The as-served page projection. type: 'home' has no arm on either face, which is the collision objectui#9642 documents. It is an observation and is not filed.

Generated by Claude Code

claude added 2 commits October 1, 2026 12:18
…ld-level keys (objectui#11070 round 10)

FormField declares min_rows, max_rows, allow_add, allow_delete,
allow_reorder, total_field, add_label and sort_field, each as
GridFieldMetadata's own member by reference, and FormFieldSchema mirrors
them with the same value types. A form fields[] entry of type grid is the
authored path to the grid widget, which reads these keys off the entry,
while the strict authoring face refused each one by name there.

- coverage row and parity note for the eight keys; the refusal-flip pin
  (strict-face-read-keys-11070) accepts each on a grid entry, judges each
  by its declared type on both faces, and holds the form-field face to
  every member GridFieldMetadata declares beyond BaseFieldMetadata;
- a fields-grid catalog fixture writes the full declared set;
- grid.mdx states the keys are accepted on a form field, and its
  "Integration with Advanced Grid" section now says what the grid field
  and object-grid each read, feature by feature.

Claude-Session: https://claude.ai/code/session_01TdiauJaVCHuj45EzZGUxHh
Co-authored-by: Claude <noreply@anthropic.com>
…DOM-leak node censuses (objectui#11070 round 10)

The new fields-grid/line-items-grid fixture adds one `type: 'grid'` form
field entry and one `type: 'text'` grid column, which the structural walks
of the form-control, svg-host and layout DOM-leak pins collect. Each pin
says a census move with no renderer change is an example being added, to
be recorded: grid 26 -> 27 in all three, text 698 -> 699 rendered and
154 -> 155 with no element in the layout pin.

Claude-Session: https://claude.ai/code/session_01TdiauJaVCHuj45EzZGUxHh
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 31 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/5903-objectgantt-declared-keys.md

  • names packages/types/src/__tests__/zod-mirror-parity.test.ts → packages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    ⚠️ The JUSTIFICATION for that parity clause was retired (objectui#9743); the clause itself stands and did not move. As first written it credited the zod-mirror-parity ratchet with a zero-drift reading for this pair — but at that time the ratchet measured three directions and was structurally blind to the MIRRORED-but-undeclared one (objectui#9711), so a zero from it recorded that it had not looked in that direction, not that nothing was there. objectui#9725 landed the fourth direction, and it covers this pair BY NAME: packages/types/src/__tests__/zod-mirror-parity.test.ts registers objectql.zod.ts#ObjectGanttSchema in both its mirror map and its declaration map; assertionMirroredUndeclaredMatchesLedger requires every registered pair's mirrored-but-undeclared key set to equal that pair's MirroredUndeclared ledger entry — never for a pair the ledger does not name — and assertionNoVacuousMirroredUndeclaredMeasurement refuses a measurement that has degenerated to any. ⛔ Read this pair's verdict off that reconciliation, which re-derives it on every run, rather than off any figure written here; when this paragraph was authored, on 2026-09-18, it required no MirroredUndeclared entry for the pair.

.changeset/5905-componentinput-inputtype-tombstone.md

  • names zod/form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    The write was measured as a no-op before it was deleted, and re-measured on this branch's base rather than inherited from the card. A structural census over every inputs: array in the repository (211 regions, all tracked TS/TSX/JS sources) scores inputType at exactly ONE authoring site — the plugin-markdown registration — against name 953, type 969, label 966, description 194, enum 119, required 86 and binding 4 in the same pass over the same regions, so the instrument was not blind. The other 192 in-repo inputType hits are a DIFFERENT face: FormField.inputType (zod/form.zod.ts), the text-input renderer's prop, and SchemaBuilder.inputType, none of which sit on a ComponentInput. The publication path is unchanged and was re-confirmed: packages/sdui-parser/src/index.ts forwards exactly seven keys per input — name, type, of, required, enum, binding, description — so an authored inputType could not reach the published sdui.manifest.json even in principle.

.changeset/5928-classname-style-props-rename.md

  • names zod-mirror-parity.test.ts → packages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    Where the non-pair is recorded now. zod-mirror-parity.test.ts keys its existing EXCLUSIONS entry — the mechanism that accounts for every exported const with no TypeScript declaration to mirror, each with its stated reason — to ClassNameStylePropsSchema. Named for its own two keys, the const leaves no like-named declaration for a name-derived pairing to reach for.

.changeset/6051-gantt-flat-config-declared-keys.md

  • names packages/types/src/__tests__/zod-mirror-parity.test.ts → packages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    ⚠️ The JUSTIFICATION for that parity clause was retired (objectui#9743) — the same retirement objectui#5903's entry carries, for the same clause and the same reason; the clause itself stands and did not move. As first written it credited the zod-mirror-parity ratchet with a zero-drift reading for this pair, at a time when that ratchet measured three directions and was structurally blind to the MIRRORED-but-undeclared one (objectui#9711), so a zero from it recorded that it had not looked in that direction. objectui#9725 landed the fourth direction, and it covers this pair BY NAME: packages/types/src/__tests__/zod-mirror-parity.test.ts registers objectql.zod.ts#ObjectGanttSchema in both its mirror map and its declaration map; assertionMirroredUndeclaredMatchesLedger reconciles every registered pair's mirrored-but-undeclared key set against that pair's MirroredUndeclared ledger entry — never for a pair the ledger does not name — and assertionNoVacuousMirroredUndeclaredMeasurement refuses a measurement that has degenerated to any. ⛔ Read this pair's verdict off that reconciliation, which re-derives it on every run, rather than off any figure written here; when this paragraph was authored, on 2026-09-18, it required no MirroredUndeclared entry for the pair.

.changeset/6150-undeclared-but-consumed-keys.md

  • names zod-mirror-parity.test.ts → packages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    ⭐ AMENDED, and the amendment ships in this same release. The TreeViewSchema slice (604476d97) gave the key a zod arm after all — a NAMED REFUSAL (handlerKeyRefusal(key, 'runtime-slot', label)), never a shape — because "no mirror entry" is not neutral under BaseSchema.passthrough(): it meant an authored { "type": "tree-view", "onNodeClick": { "action": "toast" } } parsed GREEN, survived the parse, and reached a call site that expects a function. ⇒ the three clauses this bullet used to carry are no longer true of the code shipping beside it. The key is now a MEMBER of TreeViewSchema.shape and an authored value is refused BY NAME at path onNodeClick; it has LEFT zod-mirror-parity.test.ts's RuntimeOnlyDeclared for that file's KnownDrift; and it is no longer "the first pair to sit there without also sitting in UnmirroredDeclared" — draining it emptied that difference, so RuntimeOnlyDeclared is now a SUBSET of UnmirroredDeclared and the union of the two equals UnmirroredDeclared itself. ⛔ objectui#6152's ruling is untouched by any of this: what the key still does not have, and never will, is a z.function() shape — no serialized document could satisfy one.

.changeset/6175-column-state-persistence.md

  • names zod-mirror-parity.test.ts → packages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    Nothing is retired. Both spellings remain declared on DataTableSchema; onColumnReorder stays declared and stays unwired, exactly as the RuntimeOnlyDeclared ledger in zod-mirror-parity.test.ts records it. Which of the two survives is a declared-surface ruling that stays open and is deliberately not settled here.

.changeset/6349-name-authority-batch-3.md

  • names form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    @object-ui/components — ComboboxOption now IS @object-ui/types' declaration. The component declared its own { value, label }, a strict subset of the ComboboxOption that @object-ui/types declares for ComboboxSchema.options and mirrors in form.zod.ts ({ value, label, disabled? }). The component now re-exports the types declaration (through the @object-ui/types/form subpath — the root barrel does not publish the name), so the name ComboboxOption exported from @object-ui/components gains the optional disabled?: boolean member. Every value that type-checked before still does — nothing narrows and no key changes type; the one thing that moves is keyof ComboboxOption, so a consumer that EXHAUSTS the type (a Record over its keys) will need the new key. Note that the Combobox component itself does not read option.disabled — that member was already declared on the @object-ui/types face and is now visible on this one too; it is recorded as a separate finding, not changed here.

.changeset/6357-basechema-bind-declaration.md

  • names content/docs/fields/grid.mdx → content/docs/fields/grid.mdx — edited by this change

    bind was read by ten production sites and declared by no schema shape. It resolved as any through BaseSchema's index signature and rode .passthrough() on the validator, while three separate documents taught it as an authorable key of every node: this repo's own AGENTS.md §4 ("Every node in the UI tree follows this shape (@object-ui/types)"), the published agent-facing skills/objectui/rules/protocol.md ("Every UI component node MUST follow this shape"), and content/docs/fields/grid.mdx. So the agent-facing protocol told authors to write a key the published types did not know existed.

.changeset/6396-previous-values-dom-leak.md

  • names packages/types/src/form.ts → packages/types/src/form.ts — edited by this change

    Scope is the runtime leak only. The declared key stays exactly as declared (packages/types/src/form.ts, packages/types/src/zod/form.zod.ts are untouched): it has a live consumer, so there is nothing here for the enforce-or-remove channel.

  • names packages/types/src/zod/form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    Scope is the runtime leak only. The declared key stays exactly as declared (packages/types/src/form.ts, packages/types/src/zod/form.zod.ts are untouched): it has a live consumer, so there is nothing here for the enforce-or-remove channel.

.changeset/6397-partial-schema-collapse-pin.md

  • names packages/types/src/form.ts → packages/types/src/form.ts — edited by this change

    ⚠️ Dated note, 2026-09-28 — a generic re-spelling of this Omit does not collapse — objectui#9256. Later in this same release objectui#9256 declared a key-remapping OmitDeclared ({ [P in keyof T as P extends K ? never : P]: T[P] }, in packages/types/src/form.ts) and re-spelled the heritage of InputShorthandSchema and UiCalendarSchema with it. Such a mapped type iterates the named members and the index signature separately, so it drops exactly K, keeps every other named member with its modifiers, and keeps the index signature. The same spelling of this alias declares 28 properties at ButtonSchema and 62 at ObjectGridSchema in this release, where the shipped alias declares 1 at each; at this change's own commit, under the same TypeScript, it declares 27 and 61, the source counts in the table above. So "every generic re-spelling collapses" was not true when it was written. The alias is still left as written: re-spelling it would narrow what every instantiation accepts, a contract change and not a pin's business. The PartialSchema docblock and partial-schema-collapse-pin.test.ts carry the correction. The rest of this entry is kept as the reading of this change.

.changeset/6639-objectgrid-title-mirrored.md

  • names zod-mirror-parity.test.ts → packages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    The gain is the typed refusal: the mirror's .passthrough() base was already admitting any title unexamined, and it now enforces the declared string. zod-mirror-parity.test.ts's UnmirroredDeclared ledger records the key as worked off — the ledger's first shrink by repair (97 + 1 mirrored + 23 reclassified is what the seeded "121" now means).

.changeset/6938-checkbox-wrapper-class.md

  • names packages/types/src/form.ts → packages/types/src/form.ts — edited by this change

    packages/components/src/renderers/form/checkbox.tsx:36 reads cn("flex items-center space-x-2", schema.wrapperClass) — classes on the wrapper div around the box and its label — and neither the TypeScript interface in packages/types/src/form.ts nor the zod mirror in zod/form.zod.ts declared the key. It compiled through BaseSchema's index signature and parsed through .passthrough(), admitted unexamined. The same key, on the same class of read, is declared on FileUploadSchema and FilterBuilderSchema (objectui#6150); the checkbox was left out only because its doc page's schema block is a six-line summary.

  • names zod/form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    packages/components/src/renderers/form/checkbox.tsx:36 reads cn("flex items-center space-x-2", schema.wrapperClass) — classes on the wrapper div around the box and its label — and neither the TypeScript interface in packages/types/src/form.ts nor the zod mirror in zod/form.zod.ts declared the key. It compiled through BaseSchema's index signature and parsed through .passthrough(), admitted unexamined. The same key, on the same class of read, is declared on FileUploadSchema and FilterBuilderSchema (objectui#6150); the checkbox was left out only because its doc page's schema block is a six-line summary.

.changeset/7113-chart-data-model.md

  • names form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    .extend() with a NEW key still works and preserves the fold and the refinement; .optional(), z.discriminatedUnion, z.toJSONSchema and safeValidateSchema are all unaffected. Nothing in this repository calls the throwing combinators on either const, and the published surface already ships refined mirrors (objectql.zod.ts, complex.zod.ts, form.zod.ts, app.zod.ts), so the class is not new — but it is a real behaviour change on a published export and it belongs in the release note rather than in a reviewer's file.

.changeset/7344-handler-string-any-mirrors.md

.changeset/7530-predicate-envelope-declared.md

  • names zod/form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    • ExpressionWire (type, main entry) — the TypeScript wire union, in packages/types/src/expression.ts. - ExpressionWireSchema (@object-ui/types/zod) — its runtime twin, hoisted out of zod/form.zod.ts (where it was module-private) into zod/expression.zod.ts and imported by both base.zod.ts and form.zod.ts. One envelope type, reused by reference; no second spelling.
  • names form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    • ExpressionWire (type, main entry) — the TypeScript wire union, in packages/types/src/expression.ts. - ExpressionWireSchema (@object-ui/types/zod) — its runtime twin, hoisted out of zod/form.zod.ts (where it was module-private) into zod/expression.zod.ts and imported by both base.zod.ts and form.zod.ts. One envelope type, reused by reference; no second spelling.

.changeset/7654-floating-chatbot-trigger-icon-tombstone.md

  • names zod-mirror-parity.test.ts → packages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    Every other tombstone in this package pairs ?: never with a retirementTombstone() refusal on the Zod twin. There is no twin here to carry one: FloatingChatbotConfig has no Zod mirror at all, and floatingConfig sits in the UnmirroredDeclared ledger (zod-mirror-parity.test.ts, complex.zod.ts#ChatbotSchema). BaseSchema is .passthrough(), so the whole floatingConfig object rides through unvalidated — before this change and after it. Minting a mirror to host a refusal would be the declared-but-UNMIRRORED axis (objectui#6152), a different defect: a key can be mirrored and inert, or unmirrored and live, and fixing one says nothing about the other. This change does not widen into it.

.changeset/7697-combobox-option-root-barrel.md

  • names src/form.ts → packages/types/src/form.ts — edited by this change

    Additive only. ComboboxOption is added to the root barrel's existing named re-export list from ./form.js, next to the sibling option types that were already there (SelectOption, RadioOption). Nothing is removed, retyped or narrowed: the declaration stays in src/form.ts, its three members (value, label, disabled?) are unchanged, and the @object-ui/types/form subpath spelling keeps working exactly as before. Both spellings now resolve to the same declaration.

.changeset/7722-wrapper-class-five-more.md

  • names form.ts → packages/types/src/form.ts — edited by this change

    Each of renderers/form/switch.tsx, textarea.tsx, date-picker.tsx, select.tsx and renderers/data-display/list.tsx reads schema.wrapperClass onto its wrapper element, and neither the TypeScript interface (form.ts, data-display.ts) nor the zod mirror (zod/form.zod.ts, zod/data-display.zod.ts) declared the key. The reads compiled through BaseSchema's index signature (objectui#5155) and the values parsed through .passthrough(), admitted unexamined. The same key, on the same class of read, is declared on CheckboxSchema (b74a8598d), FileUploadSchema and FilterBuilderSchema (objectui#6150); these five were left out only because their doc pages never listed it.

  • names zod/form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    Each of renderers/form/switch.tsx, textarea.tsx, date-picker.tsx, select.tsx and renderers/data-display/list.tsx reads schema.wrapperClass onto its wrapper element, and neither the TypeScript interface (form.ts, data-display.ts) nor the zod mirror (zod/form.zod.ts, zod/data-display.zod.ts) declared the key. The reads compiled through BaseSchema's index signature (objectui#5155) and the values parsed through .passthrough(), admitted unexamined. The same key, on the same class of read, is declared on CheckboxSchema (b74a8598d), FileUploadSchema and FilterBuilderSchema (objectui#6150); these five were left out only because their doc pages never listed it.

.changeset/7735-zod-mirrors-stop-authoring-defaults.md

  • names form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    What changed. All 41 .default() call sites under packages/types/src/zod/ are removed — layout.zod.ts 22, crud.zod.ts 11, form.zod.ts 5, views.zod.ts 2, app.zod.ts 1. @object-ui/components reconciles the third face a separate finding found: flex's registration defaultProps.align seeded 'center', the value its own renderer never applies, so a designer-made node laid out differently from a hand-authored one; it now seeds 'start'.

.changeset/7804-tree-view-handler-slot.md

  • names zod-mirror-parity.test.ts → packages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    The pair moves from zod-mirror-parity.test.ts's RuntimeOnlyDeclared to its KnownDrift, which empties the former of the one entry the latter did not also hold — so the two unmirrored ledgers are now in a containment relation, and the cross-ledger figure that recorded their difference states the containment instead.

.changeset/8072-input-wrapper-class-mirrored.md

  • names form.ts → packages/types/src/form.ts — edited by this change

    packages/components/src/renderers/form/input.tsx reads cn("grid w-full items-center gap-1.5", schema.wrapperClass) onto the wrapper div around the input and its label. The TypeScript face has declared the key all along (form.ts, docblock "Input wrapper CSS class"); the zod mirror never did, so the value rode through .passthrough() and { type: 'input', wrapperClass: 42 } validated GREEN — while the identical document on any of the other eight schema.wrapperClass readers (checkbox, file-upload, filter-builder — objectui#6150 / b74a8598d; switch, textarea, date-picker, select, list — objectui#7722) was refused at the key.

.changeset/8338-retire-toast-action.md

  • names zod-mirror-parity.test.ts → packages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    The parity ledgers drain with it, every figure re-derived by zod-mirror-parity.test.ts's own AST and mirror instruments rather than stepped by hand: KnownDrift 42 entries / 64 keys → 41 / 63 (the entry's whole content, so the entry went too — the ledger's first loss by RETIRING a key rather than by moving either face toward the other), and WiderThanDeclared 23 / 36 / 47 arms, split 6 / 30 / 0 / 11 → 22 / 35 / 45, split 6 / 29 / 0 / 10. The pair itself stays registered, so EXPECTED_MIRROR_PAIRS does not move.

.changeset/8478-describe-line-addresses.md

.changeset/8478-zod-pins-form-layout.md

.changeset/8499-node-slot-registered-arms.md

  • names zod/form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    • SemanticElementSchema (zod/layout.zod.ts) — the seven HTML sectioning tags renderers/layout/semantic.tsx registers: aside main header nav footer section article. - HtmlElementSchema (zod/layout.zod.ts) — the 37 safe flow/inline tags renderers/basic/html-elements.tsx registers (h1…h6, p, a, ul, img, …), plus the per-tag keys that module forwards to the DOM (href, target, rel, title, src, alt, width, height, dateTime, cite). ⚠️ Dated note, 2026-09-27 — that set has since gained code — objectui#10756. At this change TAGS and this arm both named 37 tags; both now name 38, and the parity pin counts 38. The rest of this entry is kept as the reading of this change. - InputShorthandSchema (zod/form.zod.ts) — email / password, the two aliases renderers/form/input.tsx registers onto the input renderer with inputType pinned. inputType is deliberately NOT declared on this arm: the wrapper spreads its own value last, so an authored one is overwritten. ⚠️ Dated note, 2026-09-28 — inputType is now declared on this arm, as a refusal — objectui#8762. Later in this same release the arm declares inputType on both faces and refuses it by name (?: never on the TypeScript face, a retirementTombstone on the zod mirror, at path inputType), with guidance pointing at { "type": "input", "inputType": "email" }. So "inputType is deliberately NOT declared on this arm" no longer holds; the reason does, since the wrapper still spreads its own value last. The rest of this entry is kept as the reading of this change. - UiCalendarSchema (zod/form.zod.ts) — ui:calendar, the date-picker primitive renderers/form/calendar.tsx registers under exactly that key (skipFallback, because bare calendar belongs to the plugin-calendar view).

.changeset/8572-chatbot-body-retired.md

  • names zod-mirror-parity.test.ts → packages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    Why this key and not another. It was the ONE place in this vocabulary where body did not mean "what goes inside this component": zod-mirror-parity.test.ts carried the pair under KnownDrift as "two different meanings of one key", and the same collision was the whole reason chatbot was the single arm of the component union whose output was not assignable to SchemaNode. Both ledger rows move with this change, and the two pins that recorded the old state are INVERTED rather than deleted (see below).

.changeset/9067-zod-barrel-named-arms.md

  • names zod/form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    • InputShorthandSchema (zod/form.zod.ts) — the email / password shorthand arm. - UiCalendarSchema (zod/form.zod.ts) — ui:calendar, the date-picker primitive renderers/form/calendar.tsx registers, a different component from the calendar plugin view that owns the bare literal.

.changeset/9406-types-root-barrel-two-names.md

  • names form.ts → packages/types/src/form.ts — edited by this change

    form-barrel-mirror-9406.test.ts keeps it closed, and it is DERIVED rather than a pair of presence assertions: it reads form.ts's export list and the root barrel's ./form.js re-export list on every run and names whatever is in the first and not the second. A pin asserting "these two names are present" would pass on the day the next declaration lands in form.ts and is forgotten, which is this class reopening yet again. Names deliberately left off the list get a ledger row carrying the reason instead, and a row goes red once its name reaches the barrel or stops being declared.

.changeset/9511-record-id-is-a-string.md

  • names zod-mirror-parity.test.ts → packages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    ⭐ The declaration alone would not have been enough, and this is the reusable part. A TypeScript declaration does not run at parse time. The hand-written zod mirror is the only face in this repository that can refuse an authored number, so narrowing the declaration without the mirror would have shipped declared !== enforced on a published surface — and zod-mirror-parity.test.ts would have stayed GREEN through it, because that instrument asserts a mirror accepts everything its declaration declares and a mirror left WIDER passes. Both faces moved together for that reason.

.changeset/9526-types-root-barrel-command-element-types.md

  • names form.ts → packages/types/src/form.ts — edited by this change

    The change is purely additive: the two names join the root barrel's existing named re-export list from ./form.js, beside CommandSchema. Nothing is removed, renamed or narrowed, the declarations stay in form.ts, and the /form subpath keeps working. It is the third instance of one class, repaired by the same route each time: objectui#7697 for ComboboxOption, and objectui#9406 (director decision batch 133, item 2, letter (a)) for InputShorthandSchema and UiCalendarSchema.

.changeset/object-view-unmirrored-keys-7779.md

  • names zod-mirror-parity.test.ts → packages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    Who is NOT affected: every correctly typed document, and every document that never wrote these keys — absent stays valid on all nine. No renderer changed. The parity ledger (zod-mirror-parity.test.ts) records the move: UnmirroredDeclared 14 entries / 96 keys to 14 / 87, the ObjectViewSchema entry re-derived into the SPEC-DERIVED half because the mirror now references the spec in code.

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 0a3e5409f (merge-base with origin/main): 12 file(s) changed outside .changeset/, read against 1935 pending declaration(s) that publish a body (2554 pending in total). · run

@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 330 chunks) 3552.3 KB 3574.6 KB
Main entry chunk (gzip) 150.3 KB 350 KB
Entry file index-BM9y9qLw.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.88KB 6.25KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.22KB 10.61KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.17KB 5.40KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.70KB 3.93KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.70KB 10.94KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
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) 27.13KB 7.95KB
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) 570.62KB 136.73KB
core (index.js) 10.00KB 3.96KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 230.46KB 63.94KB
fields (index.js) 260.89KB 66.19KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.49KB 9.23KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.93KB 11.29KB
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) 6.62KB 2.45KB
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.86KB 5.00KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.52KB 2.26KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
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) 16.01KB 3.93KB
plugin-calendar (index.js) 53.15KB 15.45KB
plugin-charts (index.js) 84.07KB 22.93KB
plugin-chatbot (index.js) 198.22KB 46.97KB
plugin-dashboard (index.js) 139.70KB 37.42KB
plugin-designer (index.js) 216.49KB 44.65KB
plugin-detail (index.js) 245.45KB 64.47KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 173.14KB 44.58KB
plugin-gantt (index.js) 173.23KB 43.13KB
plugin-grid (index.js) 231.72KB 63.65KB
plugin-kanban (index.js) 49.49KB 15.54KB
plugin-list (index.js) 116.63KB 28.97KB
plugin-map (index.js) 25.60KB 8.62KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.04KB 12.21KB
plugin-timeline (index.js) 34.29KB 10.13KB
plugin-tree (index.js) 14.58KB 5.17KB
plugin-view (index.js) 90.32KB 22.76KB
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.81KB 3.58KB
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) 120.63KB 39.56KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 6.06KB 2.68KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 21.42KB 7.05KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 3.19KB 1.62KB
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.26KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
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) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 21.59KB 7.71KB
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

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants