From d453d97a1b1eb2de9be57a5b7df87c2b0ae218cb Mon Sep 17 00:00:00 2001 From: namangoyal176-10 Date: Tue, 6 Oct 2026 23:07:29 +0530 Subject: [PATCH] fix(FormControl): prevent duplicate input rendering in horizontal layout --- .../fix-formcontrol-horizontal-input-duplicate.md | 5 +++++ packages/react/src/FormControl/FormControl.tsx | 4 +++- .../src/FormControl/__tests__/FormControl.test.tsx | 13 +++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 .changeset/fix-formcontrol-horizontal-input-duplicate.md diff --git a/.changeset/fix-formcontrol-horizontal-input-duplicate.md b/.changeset/fix-formcontrol-horizontal-input-duplicate.md new file mode 100644 index 00000000000..be7ebc77ab3 --- /dev/null +++ b/.changeset/fix-formcontrol-horizontal-input-duplicate.md @@ -0,0 +1,5 @@ +--- +'@primer/react': patch +--- + +FormControl: Prevent duplicate input rendering when layout is horizontal with non-choice inputs diff --git a/packages/react/src/FormControl/FormControl.tsx b/packages/react/src/FormControl/FormControl.tsx index 27b905dd7aa..2b4b597e865 100644 --- a/packages/react/src/FormControl/FormControl.tsx +++ b/packages/react/src/FormControl/FormControl.tsx @@ -155,7 +155,9 @@ const FormControl = React.forwardRef( {childrenWithoutSlots.filter( child => React.isValidElement(child) && - ![Checkbox, Radio].some(inputComponent => child.type === inputComponent || isSlot(child, inputComponent)), + !expectedInputComponents.some( + inputComponent => child.type === inputComponent || isSlot(child, inputComponent), + ), )} {slots.leadingVisual ? ( diff --git a/packages/react/src/FormControl/__tests__/FormControl.test.tsx b/packages/react/src/FormControl/__tests__/FormControl.test.tsx index 7032dd6952d..6768f9961fa 100644 --- a/packages/react/src/FormControl/__tests__/FormControl.test.tsx +++ b/packages/react/src/FormControl/__tests__/FormControl.test.tsx @@ -686,4 +686,17 @@ describe('FormControl', () => { }) }) }) + + describe('horizontal layout', () => { + it('renders only one input when layout is horizontal with a non-choice input', () => { + const {getAllByRole} = render( + + {LABEL_TEXT} + + , + ) + + expect(getAllByRole('textbox')).toHaveLength(1) + }) + }) })