Specification · Section 9 of 14
Rendering and interaction rules
Twelve interaction rules, each of which has cost someone a bug: focus, height, motion, keyboard, semantics, mobile.
Each of these has cost someone a bug.
- Never autofocus. The composer owns the caret. An inline block that grabs focus eats the sentence the human was typing.
- Height must not change on stamp. Reserve the space. A block shrinking three screens up yanks the scroll position out from under the reader.
- No layout animation. Opacity and colour only; drop even those under
prefers-reduced-motion. - Reserve image space before load. A gallery that pops in at natural height reflows the whole page.
- Icons are vectors, never glyphs. A text icon falls out of the host’s font stack into a fallback and draws a tofu box.
- Number keys 1-9 select when focused;
Entersubmits; arrows drive@scale;Escapedoes nothing — there is nothing to dismiss, and people press it reflexively. - Real
<button>elements.select=oneis arole="radiogroup",select=manya<fieldset>of checkboxes. - Stamped leaves the tab order but stays readable to a screen reader.
- Full width of the message, not the viewport. A block is part of a message.
- Mobile: 44px hit targets, hints wrap rather than truncate, galleries go
two-up,
@uploadoffers the camera. - Drag is never the only path.
- Single-select never gets a submit button. The click is the answer; a button would be a second, meaningless step.