RRigdesign system
Inputs

Checkbox

Multi-selection control with a clear state hierarchy, including indeterminate for partial selections.

Examples

Notify me aboutYou must accept the terms to continue.

States

Rendered states (visual reference; the live example above is the accessible one)
DefaultHoverFocus visiblePressedDisabled
Unchecked
Checked

Anatomy

Checkbox anatomy
#PartDescriptionPresence
1Box22px, 7px radius, 1.5px borderRequired
2Check or dashChecked mark or indeterminate dashRequired
3LabelClickable text, always visibleRequired
4Helper / errorLinked with aria-describedbyOptional

Specifications

Touch target44 × 44px minimum
StrokeDual overlapping gradient vectors
Colour themesSame seven-colour semantic mapping as the rest of the system

Interaction

Keyboard
KeyResult
TabMoves focus to the checkbox
SpaceToggles checked
Tab orderFollows reading order; each box is its own stop
Pointer and touch
TriggerResponse
Click on labelToggles, since the label is part of the target (44px high)
HoverBorder strengthens
PressBox scales to 0.92

Accessibility

role · checkbox

1.3.1Info and Relationships1.4.11Non-text Contrast3.3.1Error Identification2.5.8Target Size (Minimum)4.1.2Name, Role, Value
Requirements
RequirementHow Rig meets it
Native input<input type="checkbox"> inside a <label>. Style the sibling, never replace the input.
Group<fieldset> with a <legend> names the question
IndeterminateSet input.indeterminate in script; it is a visual state, not a value
Erroraria-invalid plus a message with an icon and text, linked by aria-describedby
Boundary contrastThe 1.5px border meets 3:1 against its background (WCAG 1.4.11)

Read the matching WAI pattern ↗

Usage

Do and don’t
DoDon’t
Use for multiple selections or an opt-inDo not use for actions that apply instantly (use Switch)
Make the label a full sentence when it states consentDo not pre-check consent boxes

Notes from the Figma file

  • Nested parent and child checkboxes use Indeterminate to show a partial selection.