Routine
Be compact. Labels and actions should feel almost invisible.
Voice, interface language, formatting, localization, and accessible naming rules for product content.
People understand the next action without interpreting system jargon.
Errors explain the problem, consequence, and recovery.
Layouts survive translation, bidirectional text, and user-generated content.
The voice is direct, calm, specific, and human. Tone adjusts to consequence without changing personality.
| Prefer | Avoid | Example |
|---|---|---|
| Specific | Vague | “Export failed because the file is read-only.” |
| Direct | Ceremonial | “Save changes” instead of “Proceed with saving.” |
| Calm | Alarmist | “Connection lost. Your draft is saved locally.” |
| Human | Cute or robotic | “We could not verify that address.” |
Be compact. Labels and actions should feel almost invisible.
Explain the concept and next step without front-loading every exception.
State what happened, whether work is safe, and the most useful recovery.
Slow the interaction down. Name the affected object, consequence, and permanence.
Labels describe objects. Actions begin with verbs. Supporting text earns its space.
| Element | Pattern | Example |
|---|---|---|
| Button | Verb + object when context is not obvious | Create project |
| Field label | Stable noun phrase | Billing address |
| Helper text | Format, consequence, or reason | Used only for account recovery. |
| Validation | Problem + correction | Enter an email address in name@example.com format. |
| Dialog title | Decision or consequence | Delete “Quarterly plan”? |
| Empty state | Situation + value + next action | No saved views yet. Save this filter to reuse it. |
| Success | Completed result | Project created |
Locale-aware formatting is part of the content contract, not post-production cleanup.
| Content | Display rule | Implementation |
|---|---|---|
| Dates | Use unambiguous localized forms. Include year when context can cross years. | Intl.DateTimeFormat |
| Times | Use the user locale and show the time zone when participants differ. | Intl.DateTimeFormat with timeZoneName |
| Numbers | Respect grouping and decimal conventions. Keep raw precision only where meaningful. | Intl.NumberFormat |
| Currency | Always bind amount to ISO currency. Never infer from symbol alone. | Intl.NumberFormat with currency |
| Names | Store and display as entered. Do not require first/last assumptions. | One full-name field unless domain needs parts |
| File size | Use consistent decimal or binary units within a product. | Shared formatter |
| Truncation | Preserve distinguishing start and end where useful. Reveal the full value. | CSS ellipsis plus accessible full text |
Components expand, mirror, and reflow without asking translators to fit English-shaped boxes.