Field
Combine labels, controls, and help text to compose accessible form fields and grouped inputs.
Installation
pnpm dlx shadcn-vue@latest add field
Usage
import {
Field,
FieldContent,
FieldDescription,
FieldError,
FieldGroup,
FieldLabel,
FieldLegend,
FieldSeparator,
FieldSet,
FieldTitle,
} from "@/components/ui/field"
</script>
<template>
<FieldSet>
<FieldLegend>Profile</FieldLegend>
<FieldDescription>This appears on invoices and emails.</FieldDescription>
<FieldGroup>
<Field>
<FieldLabel for="name">Full name</FieldLabel>
<Input id="name" autoComplete="off" placeholder="Evil Rabbit" />
<FieldDescription>This appears on invoices and emails.</FieldDescription>
</Field>
<Field>
<FieldLabel for="username">Username</FieldLabel>
<Input id="username" autoComplete="off" aria-invalid />
<FieldError>Choose another username.</FieldError>
</Field>
<Field orientation="horizontal">
<Switch id="newsletter" />
<FieldLabel for="newsletter">Subscribe to the newsletter</FieldLabel>
</Field>
</FieldGroup>
</FieldSet>
Anatomy
The Field
family is designed for composing accessible forms. A typical field is structured as follows:
<template>
<Field>
<FieldLabel for="input-id">Label</FieldLabel>
<!-- Input, Select, Switch, etc. -->
<FieldDescription>Optional helper text.</FieldDescription>
<FieldError>Validation message.</FieldError>
</Field>
</template>
Field
is the core wrapper for a single field.FieldContent
is a flex column that groups label and description. Not required if you have no description.- Wrap related fields with
FieldGroup
, and useFieldSet
withFieldLegend
for semantic grouping.
Examples
Input
Textarea
Select
Select your department or area of work.
Slider
Set your budget range ($ 200 - 800).
Fieldset
Checkbox
Your Desktop & Documents folders are being synced with iCloud Drive. You can access them from other devices.
Radio
Switch
Enable multi-factor authentication. If you do not have a two-factor device, you can use a one-time code sent to your email.
Choice Card
Wrap Field
components inside FieldLabel
to create selectable field groups. This works with RadioItem
, Checkbox
and Switch
components.
Field Group
Stack Field
components with FieldGroup
. Add FieldSeparator
to divide them.
Responsive Layout
If you are in tailwindcss v3 you need to install @tailwindcss/container-queries
- Vertical fields: Default orientation stacks label, control, and helper text—ideal for mobile-first layouts.
- Horizontal fields: Set
orientation="horizontal"
onField
to align the label and control side-by-side. Pair withFieldContent
to keep descriptions aligned. - Responsive fields: Set
orientation="responsive"
for automatic column layouts inside container-aware parents. Apply@container/field-group
classes onFieldGroup
to switch orientations at specific breakpoints.
Validation and Errors
- Add
data-invalid
toField
to switch the entire block into an error state. - Add
aria-invalid
on the input itself for assistive technologies. - Render
FieldError
immediately after the control or insideFieldContent
to keep error messages aligned with the field.
<template>
<Field data-invalid>
<FieldLabel for="email">Email</FieldLabel>
<Input id="email" type="email" aria-invalid />
<FieldError>Enter a valid email address.</FieldError>
</Field>
<template>
Accessibility
FieldSet
andFieldLegend
keep related controls grouped for keyboard and assistive tech users.Field
outputsrole="group"
so nested controls inherit labeling fromFieldLabel
andFieldLegend
when combined.- Apply
FieldSeparator
sparingly to ensure screen readers encounter clear section boundaries.
API Reference
FieldSet
Container that renders a semantic fieldset
with spacing presets.
Prop | Type | Default |
---|---|---|
class | string |
<template>
<FieldSet>
<FieldLegend>Delivery</FieldLegend>
<FieldGroup>
<!-- Fields -->
</FieldGroup>
</FieldSet>
</template>
FieldLegend
Legend element for a FieldSet
. Switch to the label
variant to align with label sizing.
Prop | Type | Default |
---|---|---|
variant | "legend" | "label" | "legend" |
class | string |
<FieldLegend variant="label">Notification Preferences</FieldLegend>
The FieldLegend
has two variants: legend
and label
. The label
variant applies label sizing and alignment. Handy if you have nested FieldSet
.
FieldGroup
Layout wrapper that stacks Field
components and enables container queries for responsive orientations.
Prop | Type | Default |
---|---|---|
class | string |
<template>
<FieldGroup class="@container/field-group flex flex-col gap-6">
<Field><!-- Fields --></Field>
<Field><!-- Fields --></Field>
</FieldGroup>
</template>
Field
The core wrapper for a single field. Provides orientation control, invalid state styling, and spacing.
Prop | Type | Default |
---|---|---|
orientation | "vertical" | "horizontal" | "responsive" | "vertical" |
class | string | |
data-invalid | boolean |
<Field orientation="horizontal">
<FieldLabel for="remember">Remember me</FieldLabel>
<Switch id="remember" />
</Field>
FieldContent
Flex column that groups control and descriptions when the label sits beside the control. Not required if you have no description.
Prop | Type | Default |
---|---|---|
class | string |
<Field>
<Checkbox id="notifications" />
<FieldContent>
<FieldLabel for="notifications">Notifications</FieldLabel>
<FieldDescription>Email, SMS, and push options.</FieldDescription>
</FieldContent>
</Field>
FieldLabel
Label styled for both direct inputs and nested Field
children.
Prop | Type | Default |
---|---|---|
class | string | |
asChild | boolean | false |
<FieldLabel for="email">Email</FieldLabel>
FieldTitle
Renders a title with label styling inside FieldContent
.
Prop | Type | Default |
---|---|---|
class | string |
<FieldContent>
<FieldTitle>Enable Touch ID</FieldTitle>
<FieldDescription>Unlock your device faster.</FieldDescription>
</FieldContent>
FieldDescription
Helper text slot that automatically balances long lines in horizontal layouts.
Prop | Type | Default |
---|---|---|
class | string |
<FieldDescription>We never share your email with anyone.</FieldDescription>
FieldSeparator
Visual divider to separate sections inside a FieldGroup
. Accepts optional inline content.
Prop | Type | Default |
---|---|---|
class | string |
<FieldSeparator>Or continue with</FieldSeparator>
FieldError
Accessible error container that accepts children or an errors
array (e.g., from vee-validate
).
Prop | Type | Default |
---|---|---|
errors | Array<{ message?: string } | undefined> | |
class | string |
<FieldError :errors="errors.username" />
When the errors
array contains multiple messages, the component renders a list automatically.
FieldError
also accepts issues produced by any validator that implements Standard Schema, including Zod, Valibot, and ArkType. Pass the issues
array from the schema result directly to render a unified error list across libraries.