Checkbox
A checkbox allows users to select one or more options from a set.
Ready to use
The Checkbox lets a user select one or more options from a list. Unlike radio buttons, checkboxes are non-exclusive — every option toggles independently. Reach for one when more than one selection is valid, when the selection doesn’t trigger an immediate action, or when the user needs to confirm or accept conditions before moving on.
This component is fully responsive and intentionally designed across mobile, tablet, and desktop — no alternative versions required.
Anatomy
Section titled “Anatomy”-
Box — the toggleable square
-
Check mark — appears in the Selected state
-
Label — clickable text, paired to the input
-
Optional helper / error text
When to use it
Section titled “When to use it”Use a Checkbox when:
- The user can select 0, 1, or multiple options.
- The options aren’t mutually exclusive.
- You’re collecting preferences, filters, settings, or “I agree to…” confirmations.
Avoid a Checkbox when:
- Only one option in the set can be selected — that’s a Radio button.
- The action is binary and takes effect immediately — that’s a Switch (toggle).
Properties
Section titled “Properties”Box
The toggleable square itself. Carries the visible state — Default, Hover, Selected, Disabled, Disabled+Selected, Focus — each driven by its own design-token set. The Focus ring is the global focus token so it stays consistent across every form control.
Check mark
Renders inside the box in Selected and Disabled+Selected states. Decorative — the checked state is conveyed semantically via the native <input type="checkbox">.
Label
The clickable text paired to the input via for/id (or by wrapping the input in the <label>). Always visible; never hide the label or replace it with an icon-only control.
Size
Two sizes — Small and Large. Large is the default for forms and settings; Small is reserved for dense layouts (data tables, filter chips). The hit area stays ≥ 44×44 px in both sizes — the label’s clickable region extends the hit zone past the box itself.
Platform considerations
Section titled “Platform considerations”Desktop
Default Large size. Inside forms, align checkboxes with field labels on the leading edge. For lists, leave at least 8 px between checkbox and label for comfortable scanning at desktop reading distance.
Tablet
Same rules as desktop. Touch-input mode kicks in occasionally — make sure the label’s clickable area extends to the full row so a tap anywhere on the line toggles the box.
Mobile
Default Large size, full-row tap target. Stack vertically; never put checkboxes side-by-side at narrow widths. Keep helper / error text close to the box so the relationship is obvious without spatial cues.
Best practices
Section titled “Best practices”A checkbox is the user’s most low-stakes commitment. Make the option clear, and make undoing the choice just as easy as making it.
Do
Use a native <input type="checkbox"> (never recreate with <div> or <span>). Always wire a visible <label> with for/id. Make Selected, Unselected, and Disabled states visually distinct beyond colour alone. Show a focus ring on keyboard focus — the global focus token, not a checkbox-specific one.
Don't
Don’t use a checkbox when only one option can be selected (that’s a radio). Don’t use one when the toggle applies immediately (that’s a switch). Don’t rely on colour alone to signal state. Don’t suppress the focus outline unless replacing it with something equally accessible.
Content guidelines
Section titled “Content guidelines”Label each checkbox in the affirmative — “Send me product updates” not “Don’t send me product updates”. Lead with the most relevant word so the option is scannable when the form is long. Use sentence case (“Save my address”) rather than title case. For confirmation checkboxes (“I agree to…”), keep the linked policy or terms inline so the user knows what they’re agreeing to without leaving the screen.
Styles
Section titled “Styles”A checkbox allows users to select one or more options from a set.
<label class="tng-checkbox-control"> <input type="checkbox" /> <span>Unchecked</span></label><label class="tng-checkbox-control"> <input type="checkbox" checked /> <span>Checked</span></label>Elements
Section titled “Elements”Grouping
Section titled “Grouping”Group related checkboxes in a <fieldset> with a <legend> to provide a shared group label for screen readers.
<fieldset class="tng-stack"> <legend class="tng-text-title is-8 mb-xl"> Notification preferences </legend> <label class="tng-checkbox-control"> <input type="checkbox" /> <span>Email</span> </label> <label class="tng-checkbox-control"> <input type="checkbox" /> <span>SMS</span> </label></fieldset>States
Section titled “States”Disabled
Section titled “Disabled”<label class="tng-checkbox-control"> <input type="checkbox" disabled /> <span>Disabled</span></label><label class="tng-checkbox-control"> <input type="checkbox" checked disabled /> <span>Checked and disabled</span></label>For designers
Section titled “For designers”- All states (default, hover, selected, disabled, focus) must maintain accessible contrast.
- Focus styles must remain visible and meet WCAG AA contrast requirements. Focus should be clearly distinguishable from hover.
- Colour tokens used should be semantic (e.g.
foreground/neutral/default) rather than fixed values. This ensures the component adapts correctly to different themes or surfaces. - The interactive area (checkbox + label) must be large enough to support touch accessibility.
For developers
Section titled “For developers”To ensure the Checkbox meets WCAG 2.1 AA and supports assistive technologies, follow these implementation standards:
- Semantic HTML
- Use a native
<input type="checkbox">element. Do not recreate checkboxes using<div>or<span>. - The checkbox must be associated with a
<label>using theforattribute or by wrapping the input inside the label. - Avoid adding click handlers to non-semantic elements to toggle the checkbox.
- Use a native
- Keyboard Navigation
- The checkbox must be reachable using Tab navigation.
- Users must be able to toggle the checkbox using Space.
- Do not override default keyboard behaviour unless providing a fully accessible alternative.
- Focus Ring / Visible Focus
- The checkbox must display a visible focus style when focused via keyboard.
- The focus indicator must be clearly distinguishable and not rely only on colour.
- Never remove the browser default focus outline unless replacing it with an accessible equivalent.
- Focus styles must remain visible even when the checkbox is hovered or checked.
- Screen Reader Support
- The checkbox label must clearly describe the option or action it represents.
- Use
aria-describedbywhen additional helper text or error messages are present. - The checked and unchecked states must be correctly announced by assistive technologies.
- If the checkbox is disabled, ensure the disabled state is conveyed programmatically.
- Interaction Feedback
- The checked state must be communicated via the native
checkedattribute. - Visual changes (check icon, background, border) should reinforce state changes.
- Avoid relying solely on colour to indicate checked or unchecked status.
- Error states must be clearly communicated visually and programmatically.
- The checked state must be communicated via the native
- Responsive and Tap Targets
- The interactive area (checkbox + label) must be at least 44 px in height to support touch accessibility.
- Ensure sufficient spacing between checkboxes when presented in a list to avoid accidental activation.
Semantic markup
Section titled “Semantic markup”Use a native <input type="checkbox">. The <label> wrapping pattern keeps the label clickable and announced by screen readers. Do not replace checkbox behavior with non-semantic elements.
Keyboard interaction
Section titled “Keyboard interaction”- Tab moves focus to each checkbox.
- Space toggles checked/unchecked.
- Focus visibility is handled by the
tng-focus-withinutility.
| Keys | Actions |
|---|---|
| Tab | Moves focus on the element or outside |
| Space | Activate or deactivate the element |
Label and supporting text
Section titled “Label and supporting text”Each checkbox needs a clear visible label. If additional helper or error text is present, connect it with aria-describedby.
Indeterminate state
Section titled “Indeterminate state”There is no HTML attribute for the indeterminate state — set it via JavaScript (checkbox.indeterminate = true). Screen readers announce it as “mixed”.