Repository navigation
refactor(plugin-designer): the designer forms pick with the shared Select (objectui#11865) - #12013
Merged
objectstack-fleet[bot] merged 4 commits intoOct 8, 2026
Merged
Conversation
…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>
Contributor
✅ Console Performance Budget
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
Size Limits
|
Claude-Session: https://claude.ai/code/session_01MgfduSkFrfM3eorB3UGfAU Co-authored-by: Claude <noreply@anthropic.com>
Contributor
✅ Console Performance Budget
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
Size Limits
|
objectstack-fleet
Bot
deleted the
claude/issue-11865-designer-forms-select
branch
October 8, 2026 23:24
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 claim6069665700and 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
CreatePickerandRulePicker:TypeFilterPicker,FieldTypePicker,FontPickerandTemplatePicker. Nothing new is exported.'') need no emptySelectItem.changecarried:''or the type;handleFieldTypeChange;fontFamily: font || undefined;{ template }.SelectGroupheaded by aSelectLabel.idtheir label'shtmlFornames, anddisabled={readOnly}now goes to the primitive.DataModelDesigner.tsxkeep what the native control did there. Without them the swap regresses.INPUT,TEXTAREAandSELECTtargets. It now also skips arole="combobox"target. Without that, Delete on the focused trigger deleted the selected entity, and Escape cleared the selection.Files
packages/plugin-designer/src/__tests__/designerForms.sharedSelect-11865.test.tsx: the new pin (98 tests).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
902fbe190drove each native select with achangeevent for every option, using the pin's fixtures.fontFamilykey asundefined, as base did. AtoStrictEqualrow pins that.changeevent 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.htmlFor, and head reads the same. Those two pins are green on base too, by design.aria-label, so the probe read''. There is no name to keep, and none is added here (see Acceptance notes).All four are pinned.
textfor a field typedgeo_point;Georgia;ghost.The trigger now shows the value itself, and it is listed first. All three are pinned.
FieldDesigner,DataModelDesignerandAppCreationWizardship in the lazysrc-*.jschunk thatindexreaches throughlazy(() => import(...)). That chunk is not among the 336 members ofapps/console/dist/eager-closure.json.BrandingEditoris 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.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.pnpm check:eager-closureprints "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.vendor-radixgrows by 199 B raw (+27 B gzip), because Radix's group and label parts now reach the eager closure.git diff HEADempty). 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)pnpm exec vitest runfrom the repo root, under the container's verify lock.packages/plugin-designer/(every suite that mounts the four components), pluspackages/core/src/utils/__tests__/column-identity.ratchet.test.tsandscripts/__tests__/one-authority-per-exported-name-6273.test.ts.Test Files 46 passed (46),Tests 423 passed (423).Tests 91 failedof its 98.SELECT, which the guard already skipped.git checkout HEAD. Each blob equals HEAD, andgit diff HEADwas empty.ablation-replace.mjs, each restore proven by blob hash:Tests 1 failed | 97 passed, and the failure is the keys pin;1 failed | 97 passed, the card pin;1 failed | 97 passed, the card pin.pnpm --filter @object-ui/plugin-designer type-check(tsc --noEmit && tsc -p tsconfig.test.json): exit 0.@object-ui/plugin-designer^...closure (16 packages built).--listFilesOnlyon the test tsconfig lists all three touched suites.pnpm exec eslinton the seven touched files: 0 errors and 15 warnings.FieldDesigner2,DataModelDesigner11,AppCreationWizard2, the rest 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/docsguide names these four controls, so the docs-driven rule has nothing to update.Acceptance notes
BrandingEditorreaches no console chunk; only the package entry exports it.packages/plugin-grid/src/__tests__/addRowCreatePermissionGate.test.tsxcites a line ofFieldDesignerby number. The citation was already off on base. This PR does not touch that file.Written by the
os-devsubagent of sessionsession_01MgfduSkFrfM3eorB3UGfAU(domain:uiseat 2, accountos-bill).Generated by Claude Code