FieldsetUpdated

Group related form controls with legends, descriptions, and actions

Import

import { Fieldset } from '@heroui/react';

Usage

Profile SettingsUpdate your profile information.
Minimum 10 characters
"use client";

import {
  Button,
  Description,
  FieldError,
  FieldGroup,
  Fieldset,
  Form,
  Input,
  Label,
  TextArea,
  TextField,
} from "@heroui/react";
import {Icon} from "@iconify/react";

export function Basic() {
  const onSubmit = (e: React.FormEvent<HTMLFormElement>) => {
    e.preventDefault();
    const formData = new FormData(e.currentTarget);
    const data: Record<string, string> = {};

    // Convert FormData to plain object
    formData.forEach((value, key) => {
      data[key] = value.toString();
    });

    alert("Form submitted successfully!");
  };

  return (
    <Form className="w-full max-w-96" onSubmit={onSubmit}>
      <Fieldset.Root>
        <Fieldset.Legend>Profile Settings</Fieldset.Legend>
        <Description>Update your profile information.</Description>
        <FieldGroup>
          <TextField
            isRequired
            name="name"
            validate={(value) => {
              if (value.length < 3) {
                return "Name must be at least 3 characters";
              }

              return null;
            }}
          >
            <Label>Name</Label>
            <Input placeholder="John Doe" />
            <FieldError />
          </TextField>
          <TextField isRequired name="email" type="email">
            <Label>Email</Label>
            <Input placeholder="john@example.com" />
            <FieldError />
          </TextField>
          <TextField
            isRequired
            name="bio"
            validate={(value) => {
              if (value.length < 10) {
                return "Bio must be at least 10 characters";
              }

              return null;
            }}
          >
            <Label>Bio</Label>
            <TextArea placeholder="Tell us about yourself..." />
            <Description>Minimum 10 characters</Description>
            <FieldError />
          </TextField>
        </FieldGroup>
        <Fieldset.Actions>
          <Button type="submit">
            <Icon icon="gravity-ui:floppy-disk" />
            Save changes
          </Button>
          <Button type="reset" variant="secondary">
            Cancel
          </Button>
        </Fieldset.Actions>
      </Fieldset.Root>
    </Form>
  );
}

Anatomy

Import the Fieldset component and access all parts using dot notation.

import { Fieldset } from '@heroui/react';

export default () => (
  <Fieldset.Root>
    <Fieldset.Legend />
    <Fieldset.Group>
      {/* form fields go here */}
    </Fieldset.Group>
    <Fieldset.Actions>
      {/* action buttons go here */}
    </Fieldset.Actions>
  </Fieldset.Root>
)

Styling

Passing Tailwind CSS classes

import { Fieldset, TextField, Label, Input } from '@heroui/react';

function CustomFieldset() {
  return (
    <Fieldset.Root className="rounded-xl border border-border bg-surface-2 p-6 shadow-sm">
      <Fieldset.Legend className="text-lg font-semibold">Team members</Fieldset.Legend>
      <Fieldset.Group className="grid gap-4 md:grid-cols-2">
        <TextField>
          <Label>First name</Label>
          <Input className="rounded-full border-border/60" placeholder="Jane" />
        </TextField>
        <TextField>
          <Label>Last name</Label>
          <Input className="rounded-full border-border/60" placeholder="Doe" />
        </TextField>
      </Fieldset.Group>
      <Fieldset.Actions className="justify-end gap-3">
        {/* Action buttons */}
      </Fieldset.Actions>
    </Fieldset.Root>
  );
}

Customizing the component classes

Use the @layer components directive to target Fieldset BEM-style classes.

@layer components {
  .fieldset {
    @apply gap-5 rounded-xl border border-border/60 bg-surface-2 p-6 shadow-field;
  }

  .fieldset__legend {
    @apply text-lg font-semibold;
  }

  .fieldset_field_group {
    @apply gap-3 md:grid md:grid-cols-2;
  }

  .fieldset_actions {
    @apply flex justify-end gap-2 pt-2;
  }
}

CSS Classes

The Fieldset compound component exposes these CSS selectors:

  • .fieldset – Root container
  • .fieldset__legend – Legend element
  • .fieldset_field_group – Wrapper for grouped fields
  • .fieldset_actions – Action bar below the fields

API Reference

Fieldset.Root Props

PropTypeDefaultDescription
asChildbooleanfalseRender the fieldset as a custom component via Slot.
classNamestring-Tailwind CSS classes applied to the root element.
childrenReact.ReactNode-Fieldset content (legend, groups, descriptions, actions).
nativePropsReact.HTMLAttributes<HTMLFieldSetElement>Supports native fieldset attributes and events.

Fieldset.Legend Props

PropTypeDefaultDescription
asChildbooleanfalseRender the legend as another component with Slot.
classNamestring-Tailwind classes for the legend element.
childrenReact.ReactNode-Legend content, usually plain text.
nativePropsReact.HTMLAttributes<HTMLLegendElement>-Native legend attributes.

Fieldset.Group Props

PropTypeDefaultDescription
asChildbooleanfalseRender the group as a different component.
classNamestring-Layout and spacing classes for grouped fields.
childrenReact.ReactNode-Form controls to group inside the fieldset.
nativePropsReact.HTMLAttributes<HTMLDivElement>-Native div attributes.

Fieldset.Actions Props

PropTypeDefaultDescription
asChildbooleanfalseRender the actions container as a custom component.
classNamestring-Tailwind classes to align action buttons or text.
childrenReact.ReactNode-Action buttons or helper text.
nativePropsReact.HTMLAttributes<HTMLDivElement>-Native div attributes.