Section headers

Names a region of a screen: SectionHeader’s five parts over a divider, and SectionLabel, its smaller sibling for one row of a form.

Demo

Two subjects: the header’s controls are the sheet’s axes, since its parts take no props; the label’s are real props.

Team members

Manage your team members and their account permissions here.

Component
Actions
import { Button } from "@/components/base/buttons/button"; import { Dropdown } from "@/components/base/dropdown/dropdown"; import { SectionHeader } from "@/components/application/section-headers/section-headers"; <SectionHeader.Root> <SectionHeader.Group> <div className="flex flex-1 flex-col gap-0.5"> <SectionHeader.Heading>Team members</SectionHeader.Heading> <SectionHeader.Subheading> Manage your team members and their account permissions here. </SectionHeader.Subheading> </div> <SectionHeader.Actions> <Button color="secondary" size="sm">Cancel</Button> <Button size="sm">Add member</Button> </SectionHeader.Actions> <Dropdown.Root> <Dropdown.DotsButton aria-label="Team members menu" className="max-md:absolute max-md:top-0 max-md:right-0 md:mt-2" /> <Dropdown.Popover> <Dropdown.Menu> <Dropdown.Item id="rename" label="Rename section" /> <Dropdown.Item id="export" label="Export list" /> <Dropdown.Item id="archive" label="Archive" /> </Dropdown.Menu> </Dropdown.Popover> </Dropdown.Root> </SectionHeader.Group> </SectionHeader.Root>

Parts, not props

SectionHeader is five plain elements: Root, Group, Actions, Heading, and Subheading each take className and their tag’s own attributes, and nothing decides a layout for you. The copied snippet carries the whole tree, including the flex flex-1 flex-col gap-0.5 text block the kit does not ship. SectionLabel.Root is the one part with props of its own.

Contextual demo

A section header names what comes under it — that thing is most of the argument. Both families in a settings screen.

This site is also a consumer

The heading at the top of every preview is this component: preview-shell.tsx renders a SectionHeader.Root with the scenario’s title and description in a hand-written text block and no actions, as the preview’s top heading. The page-headers page stacks this family under its own PageHeader as the everything-below-the-header heading.

The family

Seven parts across two exports and two files: SectionHeader with five, SectionLabel with two.

The components in this family, with their descriptions and import paths
ComponentDescriptionImport from
SectionHeader.RootThe wrapper: a column with 20px between its children and a 1px divider 20px under the last of them.@/​components/​application/​section-headers/​section-headers
SectionHeader.GroupThe content row. A column below 768px and a row from there up, with 16px between the text block and the actions.@/​components/​application/​section-headers/​section-headers
SectionHeader.ActionsThe slot at the end of the row: a centered flex row with 12px between its children, which are yours.@/​components/​application/​section-headers/​section-headers
SectionHeader.HeadingAn h2 at 16/24 semibold in text-primary.@/​components/​application/​section-headers/​section-headers
SectionHeader.SubheadingA paragraph at 14/20 in text-tertiary, under the heading.@/​components/​application/​section-headers/​section-headers
SectionLabel.RootThe form-section label: an h3 title with an optional asterisk and help icon, a description, and a children slot, in two sizes.@/​components/​application/​section-headers/​section-label
SectionLabel.ActionsThe action row under the description, 12px below it with 8px between its children. Goes in the root’s children slot.@/​components/​application/​section-headers/​section-label

Built from

Three pieces make up the family; two have their own docs page.

Component
Where it’s used here
TooltipSectionLabel.Root’s help icon: the kit’s Tooltip with title from tooltip and description from tooltipDescription, around a TooltipTrigger named “More information”. Rendered only when one of the two is set.
@untitledui/iconsHelpCircle, the 16px help icon inside the trigger. Decorative: the icon defaults to aria-hidden and the button carries the name.

Section label

Two sizes by four carryables: an asterisk, a help icon, a description, and an action row, plus the tooltip states.

size sm

Your photo

This will be displayed on your profile.

Title and description

Your photo (required)

This will be displayed on your profile.

isRequired: a 14px asterisk at both sizes, with an sr-only “(required)”

Your photo

This will be displayed on your profile.

tooltip: a 16px help button named “More information”; hover or Tab to it

Your photo

This will be displayed on your profile.

tooltip and tooltipDescription: the two-line tooltip, a kit extra

Your photo

This will be displayed on your profile.

Actions: link buttons 12px under the description, 8px apart, 20px tall at either size

Company logo

Title only: the minimum width is the label’s only layout
size md

Your photo

This will be displayed on your profile.

Title and description

Your photo (required)

This will be displayed on your profile.

isRequired: a 14px asterisk at both sizes, with an sr-only “(required)”

Your photo

This will be displayed on your profile.

tooltip: a 16px help button named “More information”; hover or Tab to it

Your photo

This will be displayed on your profile.

tooltip and tooltipDescription: the two-line tooltip, a kit extra

Your photo

This will be displayed on your profile.

Actions: link buttons 12px under the description, 8px apart, 20px tall at either size

Company logo

Title only: the minimum width is the label’s only layout

Size moves the text and the width, not the asterisk or the actions

Read from section-label.tsx: sm is a 14/20 semibold title in text-secondary with a 2px gap to its icons, a 14/20 description, and min-w-50, 200px; md is 16/24 with a 4px gap, a 16/24 description, and min-w-60, 240px. The asterisk is text-sm at both, since 2026-08-23, and the action row is mt-3 with gap-2 at both; the link buttons in it are 20px tall whatever the label’s size. Default is sm, which is the sheet’s first symbol.

States

Neither family has states of its own. The help button has hover and focus, the asterisk a spoken form. All live.

Your photo

This will be displayed on your profile.

Hover and focus: Tab to the help icon for the 2px ring at 2px offset; the tooltip opens at once on focus, and on hover after the tooltip’s 300ms delay

Your photo (required)

This will be displayed on your profile.

Required: the asterisk is aria-hidden, and the title reads “Your photo (required)”

Your photo

This will be displayed on your profile.

A narrow flex parent, 320px: the label holds its 200px minimum and the field beside it takes what is left

The help button draws the kit’s focus ring since 2026-08-23

Read from the source: the trigger is a real button, the base TooltipTrigger sets outline-hidden on it, and the label used to add only a color change on focus: and no name. It now carries aria-label="More information" and, on focus-visible, outline-focus-ring outline-2 outline-solid outline-offset-2. The outline-solid is load-bearing: outline-hidden pins the outline style to none, so a width and color alone would draw nothing. Under forced colors the button is outline-0 at rest and outline-[Highlight] when focused.

The minimum width is new

The kit set no width on the label root, so in a flex row beside a wide field it could shrink to nothing. Since 2026-08-23 the root is min-w-50 at sm and min-w-60 at md, the sheet’s per-size minimums, read from the source. The sheet’s symbols are also 280px wide, but every one of the four is, at both sizes and with and without actions, which makes it the cell the symbol was drawn in rather than a rule; the kit sets no width and no maximum.