Semantic Density and Coupling Tokens (CEM) — Canonical Spec

Status: Canonical (v1.0)

Last updated: August 10, 2026

Audience: Design Systems, Product Design, Front-End Engineering

Applies to: Modality-neutral interactive operability (pointer, touch, stylus, gaze, switch, remote)

Companion specs:


1. Why "Coupling"

In CEM terms, coupling names the moment when user intent successfully binds to an interactive affordance—independent of input modality:

This supports the UI-space meaning you called out: proximity implies relationship/coupling between controls, and insufficient distancing causes interference.


2. Taxonomy placement

Boundary heuristic:


3. Coupling vocabulary (semantic + dimensional)

To keep the naming dimensional and unambiguous, use three core nouns:


4. Canonical D2 coupling tokens

4.1 Hard safety minimums (policy anchors)

These values are mode-invariant — density modes MUST NOT change zone-min or guard-min.

cem-coupling-minimums
TokenValueDescriptiontier
--cem-coupling-zone-min3remMinimum operable zone in both dimensions; nominally 48 px @ 16 px rootrequired
--cem-coupling-guard-min0.5remMinimum distancing between adjacent operable zones; nominally 8 pxrequired
--cem-coupling-halo0.25remInvisible expansion beyond visuals; may vary by mode (nominally 4 px)required

Interpretation:

Accessibility baseline:

4.1.1 D2/D5 compatibility: guard must cover indicator outset (normative)

When D5 indicators render outside the control edge (e.g., outline-offset, zebra rings), --cem-coupling-guard-min SHOULD be large enough to prevent indicator collisions between adjacent controls.

Define the worst-case outward indicator extent as:

Compatibility guideline:

--cem-coupling-guard-min SHOULD be ≥ max(4 * --cem-zebra-strip-size, --cem-stroke-indicator-offset + --cem-stroke-focus)

Default CEM values satisfy this (8px guard vs 8px zebra extent when --cem-zebra-strip-size = 2px).

A divider may provide this distancing only as a complete divider track: the D5 line plus its cross-axis margins. The track's total cross-axis extent MUST be at least --cem-coupling-guard-min when it separates adjacent interactive operable zones. A --cem-stroke-divider hairline without those margins does not satisfy the guard contract. D1 chooses the relationship-space target; D2 supplies its invariant floor:

margin-block: calc(
  (max(var(--cem-gap-group), var(--cem-coupling-guard-min)) - var(--cem-stroke-divider)) / 2
);

4.2 Control geometry endpoints (visual sizing — D2c Controls)

Visual control geometry — --cem-control-height, --cem-control-padding-x, --cem-control-padding-y, --cem-icon-button-size, --cem-icon-button-icon-size, and the list/menu/table row heights — is defined and governed in D2c Controls (cem-controls.md).

D2 references this geometry only as a normative constraint: visual sizes MUST NOT shrink the operable zone below --cem-coupling-zone-min, and adjacent layouts MUST NOT shrink distancing below --cem-coupling-guard-min, regardless of how Controls geometry varies across coupling modes. When visuals fall below the zone, components MUST use halo expansion (see §6.1).

Coupling-mode overrides for visual geometry live in D2c Controls; D2 owns only the operability portions of mode behavior (halo policy, see §5).


5. Coupling modes (consumer semantics)

5.1 Mode meanings

5.2 Mode switch (halo policy)

D2 owns only the halo portion of mode behavior. Visual geometry overrides live in D2c Controls (see cem-controls.md §3.2).

:root { --cem-coupling: balanced; }

:root[data-cem-coupling="balanced"] { /* baseline halo */ }

:root[data-cem-coupling="forgiving"] {
  /* Visuals are larger (D2c); halo can be smaller because visuals already meet the zone */
  --cem-coupling-halo: 0.125rem;
}

:root[data-cem-coupling="compact"] {
  /* Visuals shrink (D2c); halo grows to preserve the operable zone */
  --cem-coupling-halo: 0.375rem;
}
cem-coupling-halo-overrides
Tokenforgivingcompact
--cem-coupling-halo0.125rem0.375rem

Governance rule: do not reduce --cem-coupling-zone-min or --cem-coupling-guard-min per mode. Visual geometry overrides are governed in D2c Controls.


6. Implementation patterns

6.1 Halo-based operability (compact visuals, safe coupling)

--cem-control-padding-* come from D2c Controls; the safety floor (min-block-size: --cem-coupling-zone-min) is the D2 contribution.

Token generation is necessary but not sufficient. A component is only coupling-safe when its rendered implementation preserves the zone, guard, and halo contract:

.cem-control {
  min-inline-size: var(--cem-coupling-zone-min);
  min-block-size: var(--cem-coupling-zone-min);
  padding-inline: var(--cem-control-padding-x);
  padding-block: var(--cem-control-padding-y);
}

/* Optional: halo expansion when visible chrome is smaller than the operable contract */
.cem-coupling-halo {
  position: relative;
}

.cem-coupling-halo::after {
  content: "";
  position: absolute;
  inset: calc(-1 * var(--cem-coupling-halo));
  background: transparent;
  pointer-events: auto;
}

6.2 D1/D2 enforcement: spacing must not violate coupling guard

.cem-actions {
  display: flex;
  gap: max(var(--cem-gap-related, 0px), var(--cem-coupling-guard-min));
}

7. Optional: coupling semantics between controls (proximity implies relatedness)

If you want proximity to intentionally communicate relationship, add an optional D1/D2 bridge token set:

:root {
  /* Within this distance, controls are perceived as a group (segmented, paired actions). */
  --cem-coupling-affinity-max: 0.375rem;

  /* Beyond this distance, controls read as independent. */
  --cem-coupling-decouple-min: 0.75rem;
}

Guidance:



8. Material / Angular Material mapping (implementation layer)

Example mapping guidance:

(Exact numeric mapping remains an implementation choice per Angular Material version.)


9. Finalization checklist (what “done” means)

9.1 Canonical decisions to lock

9.2 Token set acceptance criteria

A draft becomes “canonical” when all of the following are true:

  1. Minimal core: only these coupling policy anchors are required:

  2. Invariants are explicit:

  3. Orthogonality is enforceable:

  4. Component mapping is possible without special cases:

  5. Accessibility posture is documented:

9.3 Mode matrix (canonical)

ModeProduct intentVisual geometryHalo (--cem-coupling-halo)Typical surfaces
forgivingMinimize mis-coupling for imprecise inputLarger controls/rows; more internal paddingSmaller (visuals already meet zone)mobile-first, kiosks, accessibility-first, gaze/dwell
balancedGeneral default across modalitiesBaseline control heights/rowsBaselinemixed pointer + touch, general app UI
compactIncrease information density without breaking operabilitySmaller visual heights/rows; reduced chromeLarger (use halo to preserve zone)data grids, admin tools, scan-heavy panels

Normative rule:

9.4 Component mapping checklist (how to apply)

Use this checklist to implement Coupling consistently. The same rules apply whether input is pointer, touch, stylus, gaze, switch scanning, or remote focus.

Common rules (apply to all components)

Buttons

Icon buttons

Chips / tags

List rows / menu rows

Table rows / data grids

9.5 Implementation proof points (required)

Validate each mode on at least one representative surface:

Pass criteria:

Proof surface A: form trio

Use a text field, primary action, and icon action in one row. This validates mixed-width controls and compact visual chrome.

.cem-proof-form-trio {
  display: flex;
  align-items: center;
  gap: max(var(--cem-gap-related, 0px), var(--cem-coupling-guard-min));
}

.cem-proof-form-trio :is(input, button) {
  min-block-size: var(--cem-coupling-zone-min);
}

.cem-proof-form-trio .cem-icon-button {
  min-inline-size: var(--cem-coupling-zone-min);
  min-block-size: var(--cem-coupling-zone-min);
}

Checks:

Proof surface B: navigation list with trailing actions

Use interactive rows with a trailing action cluster. This validates row affordances plus nested controls.

.cem-proof-nav-list {
  display: grid;
  gap: max(var(--cem-gap-related, 0px), var(--cem-coupling-guard-min));
}

.cem-proof-nav-row {
  min-block-size: var(--cem-coupling-zone-min);
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: center;
  column-gap: max(var(--cem-gap-related, 0px), var(--cem-coupling-guard-min));
}

.cem-proof-nav-actions {
  display: flex;
  gap: max(var(--cem-gap-related, 0px), var(--cem-coupling-guard-min));
}

Checks:

Proof surface C: data table row actions + selection

Use a dense data row with selection and inline row actions. This validates the hardest scan-heavy layout.

.cem-proof-data-row {
  min-block-size: var(--cem-table-row-height);
}

.cem-proof-data-row :is(input[type="checkbox"], button, a) {
  min-inline-size: var(--cem-coupling-zone-min);
  min-block-size: var(--cem-coupling-zone-min);
}

.cem-proof-data-actions {
  display: flex;
  gap: max(var(--cem-gap-related, 0px), var(--cem-coupling-guard-min));
}

Checks:


10. Change management (canonical governance)

11. Token manifest index

Source tableSectionDescription
cem-coupling-minimums§4.1Hard safety minimums: --cem-coupling-zone-min, --cem-coupling-guard-min, --cem-coupling-halo (mode-invariant safety contract)
cem-coupling-halo-overrides§5.2Forgiving/compact override values for --cem-coupling-halo only (generator-only; no new tokens)

Generator derivation rules:

Compact action implementation

Action uses its native button for the whole operable zone. A transparent border reserves hit space when the requested visible height is below zone-min; CSS clips paint to the padding box. The border becomes zero for geometry at or above the minimum. Focus surrounds the target, disabled applies to all of it, and adjacent targets must retain guard-min spacing. Prefer this layout-reserved approach to an absolute halo that overlaps neighboring controls. See the dimensions decision.