Components › Forms & input › Choice › Checkbox

Checkbox

canon

One checkbox shape in the whole app: a drawn 16px box (5px corners, bold check) over a transparent native input; menu rows use the same box with state classes. For selecting items — a property on/off is a Switch.

Owner approved v2 on 28 Sep 2026: ONE shape (drawn box, bold check stroke 3.5, 5px corners in the compact-button ratio, border --fg-secondary 3.93:1, mixed = accent, disabled state, indeterminate prop). Replaces D6 (22 Aug 2026: native accent-color box in forms, drawn box in menus). Properties of a record (Active, Track opens, Default for domain) moved to Switch. Validator checkbox-native-no-ds is HARD.

Used in 40 files · 20 areas · 64× — components/accounting, components/acl, components/assistant, components/clen-tymu, components/mail, components/meetings …

Keyboard

  • <Checkbox>: the keyboard target is the native input.acrm-check-input lying transparently over the box — Tab moves focus, Space toggles, disabled removes it from the tab order.
  • Menu rows (CheckMenu, Add to list, Multi-select, Record select) have no input; the row's own <button> / menu item is operated with Enter or Space.
  • No shortcut chip exists for the primitive.

ARIA

  • Native input, no role needed; the accessible name comes from label.acrm-check-label (label prop) or from aria-label when bare (row selection).
  • indeterminate is a prop; the component sets the DOM property, browsers expose it as aria-checked="mixed". Do not add aria-checked to the input yourself.
  • The drawn box is aria-hidden; state lives on the input (checked, indeterminate, disabled) or, in menus, on the host item (aria-checked / aria-selected). .is-on alone carries no state.
  • Inside <Field> the group takes its name from the field label.

Focus

  • .acrm-check-input:focus-visible + .acrm-checkbox draws box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 30%, transparent) around the box.
  • Focus does not change fill or border; only the ring is added.

Contrast

Computed from packages/ui/src/tokens/tokens.css (WCAG 2.x relative luminance):

  • Off box border --fg-secondary: #7d8184 on #ffffff = 3.93:1 (light), #9a9ca1 on #232529 = 5.59:1 (dark) — meets the 3:1 non-text minimum (was --border-strong 1.38:1).
  • On / mixed --accent #0072f5 on white = 4.44:1; white check on --accent = 4.44:1 (mixed was --fg-muted 2.85:1).
  • Disabled --ink-400 on --line-100: 2.59:1 (light), 3.27:1 (dark) — disabled controls are exempt from 1.4.11; still visibly a box.
  • Label .acrm-check-label --fg-secondary 12px = 3.93:1 — below AA 4.5:1 for small text (Known limits).

Known limits

  • .acrm-check-label text uses --fg-secondary at 12px (3.93:1).
  • Table row selection boxes are revealed on row hover (pointer); keyboard and screen readers reach the input regardless, touch users see them on the selected row.

Source: docs/choice/checkbox.a11y.md · GitLab