Checkbox

Native checkbox. Children are the visible label. There is no indeterminate state.

Controlled when checked is defined. Uncontrolled when you pass defaultChecked or omit both. useControlledState does not fire onCheckedChange. The component does.

<Checkbox defaultChecked>Product updates</Checkbox>
<Checkbox checked={accepted} onCheckedChange={setAccepted} invalid={invalid} aria-describedby={errorId}>
	I accept the terms
</Checkbox>
Accept the terms to continue.

Do not put Checkbox inside Field.Root. The shell is for text and chip inputs. Wire aria-describedby on the checkbox when a Description or ErrorMessage sits under it.

For a permanent exclusive choice, use Radio. For an overlay list, use OptionList.

When to use

When: Independent on/off that stays on the page. Children = visible label.

When not: Exclusive one-of → Radio. Instant setting toggle look → Switch. Overlay multi-select → OptionList selectionMode="multiple". Inside Field.Root.

Props

Checkbox props
NameTypeRequiredDefaultDescription
childrenReact.ReactNodeyes—Visible label. Clicking the text toggles the input.
checkedbooleanno—Controlled checked state. Defined means controlled.
defaultCheckedbooleanno—Initial checked state when uncontrolled.
onCheckedChange(checked: boolean) => voidno—Fires after the checked state changes.
disabledbooleanno—Disables the input.
invalidbooleanno—Marks the control invalid and sets aria-invalid.
namestringno—Native input name.
valuestringno—Native input value.
classNamestringno—Optional class on the wrapping label.