Summit
Foundations

Sizing

Sizing sets the height of a control, the size of each small part, and the minimum hit area.

Control Heights

A control has one of four heights, set by its size prop. By default, it is 32px.

xsInside a table row or another control
smA dense toolbar with no input
defaultEverywhere else
lgThe one main action of a sparse surface
SizeHeightPurpose
xs24pxInside a Table row or another control
sm28pxA dense toolbar with no Input
default32pxEverywhere else
lg36pxThe one main action of a sparse surface

Some controls don’t have every size.

ControlSizes
Buttonxs, sm, default, lg
Toggle, Toggle Group, Segmented Controlsm, default, lg
Select, Native Selectsm, default
Input, Input GroupNone; both are 32px.

Fixed Sizes

These parts have one size or a short set of their own.

Paid
Badge
K
Kbd
Checkbox
Radio
Switch
Switchsm
CR
Avatarsm
CR
Avatardefault
CR
Avatarlg

An Avatar has three sizes.

SizeWidth and HeightPlacement
sm24pxA Table row, a menu, or a field
default32pxThe Sidebar and a comment
lg40pxNext to a page title

Rows

A Table row has no fixed height. A row of text is 36px, and a row with a Badge is 40px.

Table headh-10
InvoiceAmount
Table rowp-2
INV-2026-014$4,200.00
Command itempy-1.5
RowHeight
Table head40px
Table row36px and a 1px line
Item of a Dropdown Menu, a Context Menu, a Menubar, a Select, a Combobox, or a Command list32px
Sidebar menu button32px, or 28px at sm and 48px at lg
Tabs list, and a Segmented Control at default32px

Hit Targets

A control that is drawn smaller than 24px has a larger hit area. An after: pseudo-element extends past the control’s edge, and the dashed line in the specimen shows where it ends.

Checkbox
Radio
Switch
Switch, sm
Slider thumb
Sidebar action

Rules

The components already follow the first rule. Apply the others to a row, a form, or a list that the product lays out.

Minimum Target

Make a control 24px or larger, or extend its hit area to 24px with after:absolute after:-inset-*. A Checkbox, a radio, a Switch, and a Slider thumb already have the extension, so keep it when you override their classes. Add space around an extended control: when two hit areas overlap, users who click near one control can activate the other.

Controls in a Row

An Input is 32px and has no other size, so use default for every control in a row that has one. A row of Buttons alone can use sm.

DoUse the same size for all three controls; the field and both Buttons are 32px tall.
Don’tWhen sm Buttons are next to an Input, they are 28px tall next to its 32px, so the row has two top edges and two bottom edges.

Largest Size

Use no size above lg in a product. A product screen has no touch size. Its tallest control is lg, at 36px. The marketing site’s call to action and the Input next to it are the exception: they are 48px, set with h-12 where they are used.

Widths

A Button and a Badge are as wide as their content. An Input, a Textarea, and an Input Group are w-full, so they fill the width of their container. Set the width on the column. A Select and a Native Select are the exception: a Select is as wide as its value, and a Native Select is as wide as its longest option, unless you add w-full.

DoSet the width on the column. Both fields fill it, and their edges line up.
Don’tWhen each field has its own width, their end edges no longer line up.

Stacked Options

Stack Checkboxes and radios 12px apart. RadioGroup sets gap-3. Use the same gap for a stack of Checkboxes. At 8px, each option keeps less than the 24px floor clear of its neighbors.

Accessibility

See Accessibility for the floor for a pointer target.

In Code

Set a control’s height with its size prop, not with an h-* class. The button in this example is drawn at 20px and has a hit area of 24px.

<button aria-label="Remove" className="relative size-5 after:absolute after:-inset-0.5">
    <XIcon />
</button>

On this page