@@ -20,12 +20,8 @@ import FormControlLeadingVisual from './FormControlLeadingVisual'
20
20
import FormControlValidation from './_FormControlValidation'
21
21
import { FormControlContextProvider } from './_FormControlContext'
22
22
import { warning } from '../utils/warning'
23
- import styled from 'styled-components'
24
- import sx from '../sx'
25
- import { toggleStyledComponent } from '../internal/utils/toggleStyledComponent'
26
- import { cssModulesFlag } from './feature-flags'
27
- import { useFeatureFlag } from '../FeatureFlags'
28
23
import classes from './FormControl.module.css'
24
+ import { defaultSxProp } from '../utils/defaultSxProp'
29
25
30
26
export type FormControlProps = {
31
27
children ?: React . ReactNode
@@ -51,7 +47,6 @@ export type FormControlProps = {
51
47
52
48
const FormControl = React . forwardRef < HTMLDivElement , FormControlProps > (
53
49
( { children, disabled : disabledProp , layout = 'vertical' , id : idProp , required, sx, className} , ref ) => {
54
- const enabled = useFeatureFlag ( cssModulesFlag )
55
50
const [ slots , childrenWithoutSlots ] = useSlots ( children , {
56
51
caption : FormControlCaption ,
57
52
label : FormControlLabel ,
@@ -122,6 +117,46 @@ const FormControl = React.forwardRef<HTMLDivElement, FormControlProps>(
122
117
}
123
118
124
119
const isLabelHidden = slots . label ?. props . visuallyHidden
120
+ const InputChildren = (
121
+ < >
122
+ < div className = { classes . ControlChoiceInputs } >
123
+ { React . isValidElement ( InputComponent )
124
+ ? React . cloneElement (
125
+ InputComponent as React . ReactElement < {
126
+ id : string
127
+ disabled : boolean
128
+ required : boolean
129
+ [ 'aria-describedby' ] : string
130
+ } > ,
131
+ {
132
+ id,
133
+ disabled,
134
+ // allow checkboxes to be required
135
+ required : required && ! isRadioInput ,
136
+ [ 'aria-describedby' ] : captionId as string ,
137
+ } ,
138
+ )
139
+ : null }
140
+ { childrenWithoutSlots . filter (
141
+ child =>
142
+ React . isValidElement ( child ) && ! [ Checkbox , Radio ] . some ( inputComponent => child . type === inputComponent ) ,
143
+ ) }
144
+ </ div >
145
+ { slots . leadingVisual ? (
146
+ < div
147
+ className = { classes . LeadingVisual }
148
+ data-disabled = { disabled ? '' : undefined }
149
+ data-has-caption = { slots . caption ? '' : undefined }
150
+ >
151
+ { slots . leadingVisual }
152
+ </ div >
153
+ ) : null }
154
+ < div className = { classes . LabelContainer } >
155
+ { slots . label }
156
+ { slots . caption }
157
+ </ div >
158
+ </ >
159
+ )
125
160
126
161
return (
127
162
< FormControlContextProvider
@@ -134,69 +169,33 @@ const FormControl = React.forwardRef<HTMLDivElement, FormControlProps>(
134
169
} }
135
170
>
136
171
{ isChoiceInput || layout === 'horizontal' ? (
137
- < StyledHorizontalLayout
138
- ref = { ref }
139
- data-has-leading-visual = { slots . leadingVisual ? '' : undefined }
140
- sx = { sx }
141
- className = { clsx ( className , {
142
- [ classes . ControlHorizontalLayout ] : enabled ,
143
- } ) }
144
- >
145
- < StyledChoiceInputs className = { classes . ControlChoiceInputs } >
146
- { React . isValidElement ( InputComponent )
147
- ? React . cloneElement (
148
- InputComponent as React . ReactElement < {
149
- id : string
150
- disabled : boolean
151
- required : boolean
152
- [ 'aria-describedby' ] : string
153
- } > ,
154
- {
155
- id,
156
- disabled,
157
- // allow checkboxes to be required
158
- required : required && ! isRadioInput ,
159
- [ 'aria-describedby' ] : captionId as string ,
160
- } ,
161
- )
162
- : null }
163
- { childrenWithoutSlots . filter (
164
- child =>
165
- React . isValidElement ( child ) &&
166
- ! [ Checkbox , Radio ] . some ( inputComponent => child . type === inputComponent ) ,
167
- ) }
168
- </ StyledChoiceInputs >
169
- { slots . leadingVisual ? (
170
- < StyledLeadingVisual
171
- className = { clsx ( {
172
- [ classes . LeadingVisual ] : enabled ,
173
- } ) }
174
- data-disabled = { disabled ? '' : undefined }
175
- data-has-caption = { slots . caption ? '' : undefined }
176
- >
177
- { slots . leadingVisual }
178
- </ StyledLeadingVisual >
179
- ) : null }
180
- < StyledLabelContainer className = { classes . LabelContainer } >
181
- { slots . label }
182
- { slots . caption }
183
- </ StyledLabelContainer >
184
- </ StyledHorizontalLayout >
172
+ sx !== defaultSxProp ? (
173
+ < Box
174
+ ref = { ref }
175
+ data-has-leading-visual = { slots . leadingVisual ? '' : undefined }
176
+ sx = { sx }
177
+ className = { clsx ( className , classes . ControlHorizontalLayout ) }
178
+ >
179
+ { InputChildren }
180
+ </ Box >
181
+ ) : (
182
+ < div
183
+ ref = { ref }
184
+ data-has-leading-visual = { slots . leadingVisual ? '' : undefined }
185
+ className = { clsx ( className , classes . ControlHorizontalLayout ) }
186
+ >
187
+ { InputChildren }
188
+ </ div >
189
+ )
185
190
) : (
186
191
< Box
187
192
ref = { ref }
188
193
data-has-label = { ! isLabelHidden ? '' : undefined }
189
194
display = "flex"
190
195
flexDirection = "column"
191
196
alignItems = "flex-start"
192
- sx = {
193
- enabled
194
- ? sx
195
- : { ...( isLabelHidden ? { '> *:not(label) + *' : { marginTop : 1 } } : { '> * + *' : { marginTop : 1 } } ) , ...sx }
196
- }
197
- className = { clsx ( className , {
198
- [ classes . ControlVerticalLayout ] : enabled ,
199
- } ) }
197
+ sx = { sx }
198
+ className = { clsx ( className , classes . ControlVerticalLayout ) }
200
199
>
201
200
{ slots . label }
202
201
{ React . isValidElement ( InputComponent ) &&
@@ -229,69 +228,6 @@ const FormControl = React.forwardRef<HTMLDivElement, FormControlProps>(
229
228
} ,
230
229
)
231
230
232
- const StyledHorizontalLayout = toggleStyledComponent (
233
- cssModulesFlag ,
234
- 'div' ,
235
- styled . div `
236
- display: flex;
237
-
238
- &:where([data-has-leading-visual]) {
239
- align-items: center;
240
- }
241
-
242
- ${ sx }
243
- ` ,
244
- )
245
-
246
- const StyledChoiceInputs = toggleStyledComponent (
247
- cssModulesFlag ,
248
- 'div' ,
249
- styled . div `
250
- > input {
251
- margin-left: 0;
252
- margin-right: 0;
253
- }
254
- ` ,
255
- )
256
-
257
- const StyledLabelContainer = toggleStyledComponent (
258
- cssModulesFlag ,
259
- 'div' ,
260
- styled . div `
261
- > * {
262
- padding-left: var(--stack-gap-condensed);
263
- }
264
-
265
- > label {
266
- font-weight: var(--base-text-weight-normal);
267
- }
268
- ` ,
269
- )
270
-
271
- const StyledLeadingVisual = toggleStyledComponent (
272
- cssModulesFlag ,
273
- 'div' ,
274
- styled . div `
275
- color: var(--fgColor-default);
276
- margin-left: var(--base-size-8);
277
-
278
- &:where([data-disabled]) {
279
- color: var(--fgColor-muted);
280
- }
281
-
282
- > * {
283
- fill: currentColor;
284
- min-width: var(--text-body-size-large);
285
- min-height: var(--text-body-size-large);
286
- }
287
-
288
- > *:where([data-has-caption]) {
289
- min-width: var(--base-size-24);
290
- min-height: var(--base-size-24);
291
- }
292
- ` ,
293
- )
294
-
295
231
export default Object . assign ( FormControl , {
296
232
Caption : FormControlCaption ,
297
233
Label : FormControlLabel ,
0 commit comments