FormHelperText — spec
Synthesized from MUI FormHelperText. The helper / error text below an input. Inherits error and disabled state from the parent FormControl so consumers don't conditionally style.
When to use
- Below every input that needs guidance ("회사 이메일을 입력해 주세요").
- Below every input that can show validation errors.
- Skip when an input is fully self-explanatory (rare for a sound design).
API
<FormControl error={!!emailError} required>
<FormLabel htmlFor="email">이메일</FormLabel>
<OutlinedInput id="email" />
<FormHelperText id="email-help">
{emailError ?? "회사 도메인 이메일을 입력해 주세요"}
</FormHelperText>
</FormControl>
| Prop |
Type |
Default |
Description |
children |
ReactNode |
— |
The helper / error text |
disabled |
boolean |
inherited |
Mute when disabled |
error |
boolean |
inherited |
Color as error |
filled |
boolean |
inherited |
Match Filled variant spacing |
focused |
boolean |
inherited |
Color when input focused |
margin |
'dense' \| 'normal' \| 'none' |
'normal' |
Top spacing |
required |
boolean |
inherited |
(Not visualized; from FormControl) |
States
| State |
Color |
| Default |
fg-muted |
| Focused |
fg-primary |
| Error |
fg-error |
| Disabled |
reduced opacity |
Tokens consumed
--font-size-caption /* 12px */
--color-fg-muted
--color-fg-primary
--color-fg-error
--space-xs /* margin-top */
Accessibility
- Pair with input via
aria-describedby matching this element's id.
- For error states, also set
aria-invalid="true" on the input.
- Avoid putting links inside helper text — they're hard to spot at this size and easy to miss.
Edge cases
- Switching between helper and error — keep the same
id; switch text content. Don't unmount/remount (the screen reader association breaks).
- Multi-line helper — wraps; for long text, consider moving to a Tooltip or below-block info instead.
- Korean honorific — match the form's overall register. Onboarding: 해요체 ("입력해 주세요"). Legal/contracts: 합쇼체 ("입력하시기 바랍니다").
Code example
<FormControl error={!!errors.email} fullWidth>
<FormLabel htmlFor="email">이메일</FormLabel>
<OutlinedInput
id="email"
type="email"
aria-invalid={!!errors.email}
aria-describedby="email-help"
/>
<FormHelperText id="email-help">
{errors.email ?? "회사 도메인 이메일을 입력해 주세요"}
</FormHelperText>
</FormControl>
Don't
- Don't use raw
<p> for helper text — error state won't auto-propagate.
- Don't conditionally hide the helper element when there's no error and there used to be — the layout shifts and screen readers lose the association.
- Don't pile multiple FormHelperText siblings — combine into one node.
References
Cross-reference