01 / action
Buttons and links
A button changes this page. A link goes somewhere. The label names the result, not the shape.
Nothing saved yet.
Interface standard
A component is a behavior rule with a visual form. It has one job, plain words, every necessary condition, and no surprises between mouse, keyboard, and touch.
01
Start with the correct HTML element.
02
Split parts that ask for two decisions.
03
The uncommon cases are part of the component.
04
Never shrink type to rescue a box.
These are recipes, not a software package. Reuse the HTML and token roles; extract code only after the same part appears twice.
01 / action
A button changes this page. A link goes somewhere. The label names the result, not the shape.
Nothing saved yet.
02 / status
A category is a quiet pill. A result uses a glyph, a word, and color together.
03 / field
Use the name readers will recognize.
Use YYYY-MM-DD.
04 / content
code or evidence
status = 'complete'05 / feedback
Put the result beside the action that caused it. Preserve context and give the next useful step.
busy
Checking 8 sources…
empty
No saved drafts. Start a new draft.
✓ complete
Published. View the live page.
The happy path is one row, not the whole specification.
Composed example
One shared component combines month controls, a true calendar, linked editions, today, the next scheduled item, and a legend. Its parts stay quiet so the schedule remains the focal object.
August 2026
next: the 1st
links to that month's edition · series page
structureReal weekday layout and month length.
meaningGlyph, label, position, and color work together.
motion220ms month turn; fade when reduced motion is preferred.
× don't
A red dot, unlabeled icon, or green border asks people to guess. A fifth hue also breaks the four-board palette.
✓ do
Use a glyph, plain label, and palette color together: “× needs correction” or “✓ complete.”
× don't
It disappears as soon as someone types and cannot carry the field’s meaning.
✓ do
The field keeps its name before, during, and after input; any correction sits beside it.
The native element does the job before custom JavaScript is added.
Every button works; every link goes somewhere; every field has a visible label.
Rest, hover, focus, busy, empty, error, success, and disabled behavior are accounted for.
Keyboard order follows reading order, focus is visible, and status never depends on color alone.
Targets are at least 44 by 44 pixels and rendered text is at least 12 pixels.
The component fits at 390 pixels without clipping, overlap, or horizontal scrolling.
Motion explains a change, honors reduced motion, and stops when the change is understood.
The page and matching Markdown were inspected after the production build.