Skip to content

refactor(plugin-designer): the designer forms pick with the shared Select (objectui#11865) - #12013

Merged
objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/issue-11865-designer-forms-select
Oct 8, 2026
Merged

objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/issue-11865-designer-forms-select

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #11865

Clause-②: no

Four plugin-designer controls were browser-native selects. They now use the shared Radix Select (packages/components/src/ui/select), the control the card's earlier slices moved the console's other pickers to (objectui#11934, objectui#11976, objectui#11990, objectui#11995, objectui#12000, objectui#12005). This PR is slice j of claim 6069665700 and converts four source files:

  • packages/plugin-designer/src/FieldDesigner.tsx: the field list's type filter;
  • packages/plugin-designer/src/DataModelDesigner.tsx: the type picker on each field row of an entity card;
  • packages/plugin-designer/src/BrandingEditor.tsx: the font family;
  • packages/plugin-designer/src/AppCreationWizard.tsx: the basic step's template.

What changed

  • Each file has one module-private picker, in the shape of CreatePicker and RulePicker: TypeFilterPicker, FieldTypePicker, FontPicker and TemplatePicker. Nothing new is exported.
  • Items carry option indexes. So "All Types", "Default (System)" and "None" (value '') need no empty SelectItem.
  • A stored value no option carries gets an item of its own, labelled with the value. Picking it writes nothing. This applies to the field type, the font and the template. The type filter is component state that only a pick sets, so it has no such value.
  • Each pick reaches the same callback with the same value the native control's change carried:
    • the filter still sets '' or the type;
    • the field type still goes through handleFieldTypeChange;
    • the font still writes fontFamily: font || undefined;
    • the template still writes { template }.
  • The type filter keeps its six category headings. Each native optgroup is now a SelectGroup headed by a SelectLabel.
  • The font and template triggers carry the id their label's htmlFor names, and disabled={readOnly} now goes to the primitive.
  • Two companions in DataModelDesigner.tsx keep what the native control did there. Without them the swap regresses.
    • Clicks. The trigger and the open list stop click propagation, so a click or a pick does not select the entity card. The native control stopped its own click, and its list sent the page no events. The Radix list renders in a portal, but React still bubbles its events through the card.
    • Keys. The canvas shortcut guard skipped INPUT, TEXTAREA and SELECT targets. It now also skips a role="combobox" target. Without that, Delete on the focused trigger deleted the selected entity, and Escape cleared the selection.

Files

  • The four source files above.
  • packages/plugin-designer/src/__tests__/designerForms.sharedSelect-11865.test.tsx: the new pin (98 tests).
  • Two suites read the type filter's native option values. They now read the open list by label:
    • FieldDesigner.choiceTypesHidden-11253.test.tsx;
    • FieldDesigner.formulaControlRetired.test.tsx.
  • .changeset/11865-j-designer-forms-shared-select.md: a patch for @object-ui/plugin-designer.

Readings against the dispatch hypotheses

  • H1, value parity: holds.
    • A scratch probe on base 902fbe190 drove each native select with a change event for every option, using the pin's fixtures.
    • The pin compares 48 write rows as JSON text: 22 field types, 20 font rows over two starting brandings, and 6 template rows. All 48 equal the probe's base reads.
    • "Default (System)" writes the fontFamily key as undefined, as base did. A toStrictEqual row pins that.
    • The type filter writes component state, so its pin compares the rows each pick shows. With one field per type, each type option shows that field alone and "All Types" shows all 27, as the probe read on base.
    • The probe's change event also fired for the current option, which a browser's native select does not do. So the re-pick rows ("writes nothing") pin the primitive.
  • H2, names, keyboard and read-only.
    • Names: base reads "Font Family" and "Template" through the label's htmlFor, and head reads the same. Those two pins are green on base too, by design.
    • The type filter and the field-type picker had no accessible name on base: no label and no aria-label, so the probe read ''. There is no name to keep, and none is added here (see Acceptance notes).
    • Keyboard: Enter opens the field-type and template pickers, and Enter on an option selects it. Pinned.
    • Read-only, as on base:
      • font and template: the trigger is disabled through the primitive;
      • type filter: stays enabled, since it filters and writes nothing;
      • data model: a read-only field row shows its type as text, with no picker.
        All four are pinned.
  • H3, a value outside the options: shown. On base the native control showed its first option:
    • text for a field typed geo_point;
    • "Default (System)" for the font Georgia;
    • "None" for the template ghost.
      The trigger now shows the value itself, and it is listed first. All three are pinned.
  • H4, first-load bytes: under the ceiling, +16 B gzip.
    • Before the first edit, on base: FieldDesigner, DataModelDesigner and AppCreationWizard ship in the lazy src-*.js chunk that index reaches through lazy(() => import(...)). That chunk is not among the 336 members of apps/console/dist/eager-closure.json. BrandingEditor is in no console chunk at all: nothing in the console imports it. The eager closure was 3,391,326 B gzip and 11,496,190 B raw.
    • On head cb7dd83aa: 3,391,342 B gzip and 11,496,424 B raw, with 336 eager chunks. The delta is +16 B gzip and +234 B raw. The designer chunk is still lazy.
    • Local pnpm check:eager-closure prints "Console eager closure is 3311.9 KB gzipped across 336 of 2458 chunks (budget: 3312.0 KB, headroom: 0.1 KB)". The headroom is 142 B against the 3,391,484 B ceiling.
    • What the 16 B is: the type filter's category headings. vendor-radix grows by 199 B raw (+27 B gzip), because Radix's group and label parts now reach the eager closure.
    • A measured variant with the headings removed (the filter as a flat list) reads 3,391,325 B gzip, which is -1 B against base, so byte-neutral. It was run once, and the file was restored to HEAD (blob proven, git diff HEAD empty). It is not on this branch. The headings were kept because the native control had them. Dropping them is the byte-neutral fallback if the seat wants every byte.

Evidence (head cb7dd83aa)

  • Tests: pnpm exec vitest run from the repo root, under the container's verify lock.
    • Scope: the whole packages/plugin-designer/ (every suite that mounts the four components), plus packages/core/src/utils/__tests__/column-identity.ratchet.test.ts and scripts/__tests__/one-authority-per-exported-name-6273.test.ts.
    • Result: Test Files 46 passed (46), Tests 423 passed (423).
  • Reverse leg, run from the committed head:
    • The four source files were put back on base's blobs, proven by hash on disk, and the new pin was run: Tests 91 failed of its 98.
    • The 7 green pins are the kept-behaviour pins: the two names, the three read-only states, the read-only type text, and the field-type picker's own keys. That last one is green on base because the native control was a SELECT, which the guard already skipped.
    • The files were restored with git checkout HEAD. Each blob equals HEAD, and git diff HEAD was empty.
  • Ablations of the two companions, each through ablation-replace.mjs, each restore proven by blob hash:
    • the guard's combobox line removed: Tests 1 failed | 97 passed, and the failure is the keys pin;
    • the list's click stop removed: 1 failed | 97 passed, the card pin;
    • the trigger's click stop removed: 1 failed | 97 passed, the card pin.
    • The first attempt at the list ablation deleted the whole opening tag. That is a syntax error, and no tests ran, so it is not a reading. It was redone as a replacement.
  • pnpm --filter @object-ui/plugin-designer type-check (tsc --noEmit && tsc -p tsconfig.test.json): exit 0.
    • It ran after building the @object-ui/plugin-designer^... closure (16 packages built).
    • --listFilesOnly on the test tsconfig lists all three touched suites.
  • pnpm exec eslint on the seven touched files: 0 errors and 15 warnings.
    • Per file, each count equals that file's base blob: FieldDesigner 2, DataModelDesigner 11, AppCreationWizard 2, the rest 0.
    • The new pin reads 0 and 0.
  • Gates, each exit 0:
    • node scripts/check-changeset-presence.mjs, node scripts/check-changeset-no-major.mjs;
    • pnpm check:new-line-citations ("0 new citation(s)"), pnpm check:control-bytes;
    • check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape, check:test-path-roots;
    • check:i18n-keys, check:changeset-claims, check:pending-changeset-literals, check:phantom-deps, check:unused-deps.

Docs

No package README or content/docs guide names these four controls, so the docs-driven rule has nothing to update.

Acceptance notes

  • One display change, described in the changeset: a value none of a picker's options carries now shows as itself (H3).
  • First-load bytes: +16 B gzip, all of it for the type filter's category headings (H4). The flat-list variant is measured at -1 B if the seat prefers it.
  • Not changed, observed: the type filter and the field-type picker have no accessible name, on base and on head. Giving them one needs a label string, and that is outside this control swap. Noted, not filed.
  • Not changed, observed: BrandingEditor reaches no console chunk; only the package entry exports it.
  • Not changed, observed: a comment in packages/plugin-grid/src/__tests__/addRowCreatePermissionGate.test.tsx cites a line of FieldDesigner by number. The citation was already off on base. This PR does not touch that file.
  • The card stays open: the other native selects on it are not touched here. Slices h and i of the same claim are separate PRs.

Written by the os-dev subagent of session session_01MgfduSkFrfM3eorB3UGfAU (domain:ui seat 2, account os-bill).


Generated by Claude Code

claude added 3 commits October 8, 2026 22:09
…lect (objectui#11865)

FieldDesigner's type filter, DataModelDesigner's field-type picker,
BrandingEditor's font family and AppCreationWizard's template were
browser-native selects. Each is now the shared Radix Select through a
module-private picker whose items carry option indexes, so an option
whose value is '' needs no empty SelectItem. A stored value none of the
options carries is shown as itself.

DataModelDesigner's shortcut guard also skips a combobox trigger, so
Delete or Escape on the field-type picker stays the picker's own key,
as it was on the native control.

Claude-Session: https://claude.ai/code/session_01MgfduSkFrfM3eorB3UGfAU
Co-authored-by: Claude <noreply@anthropic.com>
…(objectui#11865)

One suite over the four converted controls: each is the primitive,
lists the native control's options in order (the type filter under its
category headings), writes per option the JSON the native control wrote,
shows a value no option carries as itself, keeps its label's name and
its read-only state, and picks from the keyboard. The field-type picker
also keeps the card unselected and the canvas shortcuts off its keys.

Adds the patch changeset for @object-ui/plugin-designer.

Claude-Session: https://claude.ai/code/session_01MgfduSkFrfM3eorB3UGfAU
Co-authored-by: Claude <noreply@anthropic.com>
…st the native controls (objectui#11865)

The reverse leg read seven pins green on base by design (names, read-only
states, the field-type picker's own keys); the header now says so and
names the ablations that turn the keys and card pins red.

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

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 336 chunks) 3311.9 KB 3312.0 KB
Main entry chunk (gzip) 71.5 KB 350 KB
Entry file index-DmYu3LRw.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) 18.33KB 6.73KB
app-shell (runtime-config.js) 22.59KB 7.89KB
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.15KB 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) 41.19KB 11.12KB
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.11KB 7.97KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.50KB 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) 587.83KB 141.44KB
core (index.js) 10.00KB 3.96KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 240.39KB 67.09KB
fields (index.js) 268.74KB 68.04KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
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.52KB 2.39KB
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) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.50KB 11.82KB
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.04KB 3.92KB
plugin-calendar (index.js) 53.43KB 15.54KB
plugin-charts (index.js) 84.71KB 23.25KB
plugin-chatbot (index.js) 199.63KB 47.46KB
plugin-dashboard (index.js) 144.20KB 38.95KB
plugin-designer (index.js) 233.21KB 49.59KB
plugin-detail (index.js) 248.57KB 65.47KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 177.11KB 45.88KB
plugin-gantt (index.js) 179.17KB 45.07KB
plugin-grid (index.js) 249.56KB 69.16KB
plugin-kanban (index.js) 52.22KB 16.38KB
plugin-list (index.js) 117.80KB 29.42KB
plugin-map (index.js) 27.24KB 9.03KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.12KB 12.29KB
plugin-timeline (index.js) 39.10KB 11.81KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 91.09KB 22.94KB
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.31KB 2.07KB
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.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
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) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
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) 1.13KB 0.65KB
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) 5.78KB 2.70KB
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 (node-slots.js) 7.18KB 2.34KB
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) 19.93KB 7.25KB
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

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 336 chunks) 3311.9 KB 3312.0 KB
Main entry chunk (gzip) 71.5 KB 350 KB
Entry file index-Q_Mhvzfi.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) 18.33KB 6.73KB
app-shell (runtime-config.js) 22.59KB 7.89KB
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.15KB 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) 41.19KB 11.12KB
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.11KB 7.97KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.50KB 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) 587.83KB 141.44KB
core (index.js) 10.00KB 3.96KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 240.39KB 67.09KB
fields (index.js) 268.74KB 68.04KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
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.52KB 2.39KB
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) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.50KB 11.82KB
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.04KB 3.92KB
plugin-calendar (index.js) 53.43KB 15.54KB
plugin-charts (index.js) 84.71KB 23.25KB
plugin-chatbot (index.js) 199.63KB 47.46KB
plugin-dashboard (index.js) 144.20KB 38.95KB
plugin-designer (index.js) 233.53KB 49.80KB
plugin-detail (index.js) 248.57KB 65.47KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 177.11KB 45.88KB
plugin-gantt (index.js) 179.17KB 45.07KB
plugin-grid (index.js) 249.56KB 69.16KB
plugin-kanban (index.js) 52.22KB 16.38KB
plugin-list (index.js) 117.80KB 29.42KB
plugin-map (index.js) 27.24KB 9.03KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.12KB 12.29KB
plugin-timeline (index.js) 39.10KB 11.81KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 91.09KB 22.94KB
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.31KB 2.07KB
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.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
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) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
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) 1.13KB 0.65KB
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) 5.78KB 2.70KB
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 (node-slots.js) 7.18KB 2.34KB
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) 19.93KB 7.25KB
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

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 8, 2026 23:07
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 8, 2026 23:07
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 8, 2026
Merged via the queue into main with commit e8f9977 Oct 8, 2026
45 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-11865-designer-forms-select branch October 8, 2026 23:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants