Xzero UI
Pro library

accessibility

Use the public xzero-ui MCP server at https://mcp.xzero.co.uk/mcp. The complete Free and Pro library is available through this service. No account, sign-in, token, or upstream fallback is required. If the service is unavailable, retry later; do not use upstream services.

Xzero components ship with their semantics and keyboard behavior. Keep them intact when you compose.

Focus: none for the pointer, a subtle ring for the keyboard

Xzero draws no focus ring on pointer focus (a mouse click or tap). Keyboard focus (:focus-visible) gets one subtle ring from foundation.css: a 2px softened accent outline with a 2px offset, the same on every component. Text fields show focus with their border and caret instead, and menu items and listbox options with their highlight fill.

Do not write your own outlines, ring box-shadows, or halos. Tune the shared ring with tokens, on :root or on one element:

/* Correct: adjust the shared keyboard ring */
.tab { --focus-outline-offset: -2px; }          /* inside a container that clips */
:root { --focus-outline: var(--accent); }       /* a stronger ring for the whole app */

/* Correct: highlighted items in composite widgets look like the hovered one */
.item:hover, .item[data-highlighted] { background: var(--surface-muted); }

/* Incorrect: a hand-made ring, or one that also shows on mouse clicks */
.item:focus { outline: 2px solid var(--accent); }
.item:focus-visible { box-shadow: 0 0 0 3px var(--accent); }

Radix-based Xzero menus, selects, and lists already set data-highlighted on the active item. Keep focus order logical so people can follow it.

Semantics

Keyboard

Feedback and announcements

Contrast

Check

Tab through the whole screen without a mouse: you can always tell where you are from the fills, every overlay opens and closes by keyboard, and focus returns. Then turn on reduced motion and a screen reader rotor (headings, landmarks, form controls) and confirm the structure reads correctly.