ADR-0106 The affordance is a gap, not a corner
Supersedes the corner clause of ADR-0100. Amends ADR-0045 and ADR-0084.
#Context
ADR-0045 made a turned corner mean one thing: this component accepts input. The scale supplied the non-zero half of a binary and the absence of the token was the other half, so the 9 interactive components turned a corner and the 28 inert ones were square. ADR-0100 then pinned both densities to step 0, 0.125rem, so the set read square at a glance.
The maintainer compared r136 to Apple's Human Interface Guidelines and to current SaaS products and asked for rounded components. Held against those, a 2px radius on 9 components and nothing on the other 28 is the single clearest reason r136 looks older than the systems it is measured against.
The rule was never wrong. It was answering a real question, and it is the question that matters: in field-night hue carries nothing (ADR-0006), so whatever says "you may act on this" has to survive with no colour at all. A binary corner did that. Deleting it to get rounded corners would leave the theme where the claim is hardest to meet with no answer.
#Decision
- Everything with a ground is rounded. A second token,
radius-surface, is added for grounds nobody acts on, and 14 inert components bind it: modal, popover, tooltip, toast, tag, code snippet, presence, live feed, meter, progress indicator, SLA countdown, trend, queue item, and table row.
- The affordance becomes a gap rather than a presence. A control turns
further than the ground it sits on. Both tokens are non-zero, so having a corner says nothing and how much corner still does. This is what ADR-0045's rule becomes rather than a repeal of it: the same claim, carried by a difference instead of by a binary, and it survives in field-night for the same reason the binary did.
- The scale runs to 8 steps of 0.125rem, 2px to 16px. Comfortable
selects surface 12px and control 16px; compact selects 8px and 12px.
- The gap is machine-checked in
verify-output.js, per density and
strictly greater. Per density because the selection is per mode, and a compact control that flattened to its surface's step would leave that density with no affordance and nothing else would notice.
- Semantic geometry is untouched. The disc, ring, triangle and octagon
the status indicator draws, the radio's 50% silhouette, the checkbox's square against it: those are ADR-0028's shapes and they carry meaning. Only perimeters that draw a ground are turned.
- Five components stay square: the three shell panels, the page header
and the region. They sit flush to the edge of the viewport, and a rounded corner against the edge of a screen is a gap, not a radius.
#Consequences
Every component token and every budget baseline is regenerated. A turned corner removes pixels, so emission moves slightly and the values are re-recorded.
The check that failed an inert component for declaring a radius is replaced rather than deleted. It now fails an inert component that declares radius-control, because that is the rounder of the two and saying a reader may act on this is the whole of what it says.
radius-surface and radius-control are both selected in both densities, so the compact-may-not-exceed-comfortable rule (ADR-0012) now has two radius tokens to hold rather than one.
#Alternatives
Keep the binary and raise the step. Rounder controls, 28 components still square. It is the change the maintainer asked for applied to a quarter of the set, and the quarter that already looked most modern.
Round everything equally and drop the affordance. Simplest, and it gives up the one signal field-night has. The theme exists to prove the component set encodes meaning without hue, and this would be the first place the proof failed.
Carry the affordance on elevation instead. Rejected by ADR-0013, which replaced elevation with enumerated stacking contexts encoded structurally. Reversing that for a corner would be a large decision made for a small one.