Agents Playbook
Pillars/Ui ux

Pillar — UI / UX

How to keep a multi-screen product visually coherent, intl-ready, and accessible when agents are writing screens in parallel.

Pillar — UI / UX

How to keep a multi-screen product visually coherent, intl-ready, and accessible when agents are writing screens in parallel.

Status

◐ Scoped, not yet detailed.

Scope

ConcernUniversal principleConcrete pattern
Design tokensAll color / spacing / typography come from named tokens; no hex / rgb / arbitrary classCSS variables resolved through a whitelabel runtime; lint blocks raw color literals
PrimitivesShared Button, Input, Select, Dialog, Table, Badge — never bare HTMLOne UI package; lint blocks native \<button\>, \<input\>, \<select\>, \<dialog\>, \<form\>, \<table\>, \<a href\> in shipped surfaces
IntlEvery user-visible string is keyeduseT() hook + locale JSON files; lint blocks JSX string literals + hardcoded aria-label / title / placeholder / alt
A11yKeyboard-first; screen-reader pass before each releaseA11y checklist + screen-reader checklist run in CI for changed screens
Motionprefers-reduced-motion respected; durations from tokensmotion-tokens.css; useReducedMotion() hook
LoadingSkeletons over spinners for content-bearing surfaces\<Skeleton\> primitive; spinners only for explicit in-flight actions
Empty statesAlways-on; explain what to do next; honest about why empty\<EmptyState\> primitive; lint blocks \<div\>No results\</div\>
Brand kitOne product name token; logos / colors swap at build per tenantWhitelabel runtime resolves productName, logoSrc, paletteRef
CompletenessNo disabled: true tabs; no throw new Error('not implemented') in shipped surfacesPer-screen completeness contract gate
Status languageUse human verbs ("Saved", "Running", "Awaiting approval") not enum codesIntl + lint for known jargon ("upserted", "succeeded")

Non-negotiables

  1. No raw HTML primitives in shipped surfaces. Escape hatch: // allow-native: \<reason\>.
  2. No raw color values. Tokens only.
  3. No hardcoded user-facing strings. Intl keys only; brand tokens excepted via an explicit allow-list.
  4. No spinners replacing content. Skeletons for loading; spinners only for inline actions.
  5. Every screen ships complete. If a tab is not built, it does not appear in the nav.

See also

Roadmap for this pillar

DocRead when
universal.mdFirst read; the 10 non-negotiables
design-tokens-pattern.mdColor / spacing / motion as named variables
primitives-pattern.mdShared UI catalog; ban native HTML
intl-pattern.mdEvery visible string keyed
i18n-deep-pattern.mdICU MessageFormat; plurals/gender; Intl.* APIs; RTL; pseudo-locale
empty-states-pattern.mdCause-typed empty states with next-step CTA
a11y-checklist.mdPer-PR a11y checklist
accessibility-deep-pattern.mdWCAG-AA substance; 5 surfaces; ARIA discipline
whitelabel-pattern.mdPer-tenant brand kit + plan presets
design-system-governance-pattern.mdTier model; contribution path; deprecation; visual regression