Checkbox

Include this one. Each box answers for itself.

import { Checkbox } from "@dede-style/ui/checkbox", then <Checkbox checked={on} onChange={setOn} label="Accept the terms and conditions" />. It is controlled — the value lives with whoever owns it, and this renders it in a labelled row.

PropDescriptionDefaultControl
labelthe visible label and the accessible name. Required
descriptionan optional second line under the label
checkedwhether it is ticked. Controlled: pass it with onChangefalse
sizethe box: 16, 20 (default) or 24px4565
  • 4
  • 5
  • 6
indeterminateshows a mixed state, for a parent of partly selected itemsfalse
controlPositionthe box before the label (start) or after it (end)startendstart
fullWidthspread the row across its container. Off, the row fits its contentfalse
isDisableddisables the checkbox and dims the rowfalse
hideLabelhide the label visually but keep it for screen readers, such as in a table's selection columnfalse

Tokens

What a theme can move, where the props above are what an instance can move.

Checkbox has none, and that is a decision rather than an omission. Every value it renders already resolves through a foundation token or a role, so a theme moves it by moving those. A component token earns its place only when a theme needs to change one component without changing the role beneath it.

These are public and overridable — there is no private custom property, because anything on :root is reachable by any stylesheet. What replaces privacy is a stability contract: primitives may move, roles are the guarantee, and these are the per-component escape from both.