Checkbox
canonOne 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 …
@acrm/ui <Checkbox>.acrm-checkfield .acrm-check-input .acrm-checkbox .acrm-check-label +4SourceStoryLegacy card Inputs.htmlKeyboard
<Checkbox>: the keyboard target is the nativeinput.acrm-check-inputlying transparently over the box — Tab moves focus, Space toggles,disabledremoves 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(labelprop) or fromaria-labelwhen bare (row selection). indeterminateis a prop; the component sets the DOM property, browsers expose it asaria-checked="mixed". Do not addaria-checkedto 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-onalone carries no state. - Inside
<Field>the group takes its name from the field label.
Focus
.acrm-check-input:focus-visible + .acrm-checkboxdrawsbox-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-strong1.38:1). - On / mixed
--accent#0072f5 on white = 4.44:1; white check on--accent= 4.44:1 (mixed was--fg-muted2.85:1). - Disabled
--ink-400on--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-secondary12px = 3.93:1 — below AA 4.5:1 for small text (Known limits).
Known limits
.acrm-check-labeltext uses--fg-secondaryat 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