Skip to content
UI Elements & ComponentsPenelopepattern

Focus-Visible Contract

One ring treatment for the whole app — never removed, never replaced by colour alone, always :focus-visible.

Built here · no external address

Penelope: Long-running fidelity. Maintained excellence over years.

Exhibit case

The component itself, in every state it can hold.

Arming the exhibit…

Why it matters

Removing outlines to look "clean" is how keyboard users get lost. A single contract keeps every control honest.

Key techniques

  • :focus-visible only — mouse users stay quiet.
  • Ring colour from --color-ring, offset from background.
  • Forced states in the Athena bench for capture.

What to steal

The transferable part.

Design the ring once. Components inherit; they do not invent.

What not to copy

Context-specific or costly.

Do not use outline: none without a replacement ring.

Inclusion rationale

The quiet law underneath every Athena component.

Technical register

Performance

Pure CSS — zero JS cost.

Mobile

Coarse pointers rarely show focus-visible; tap targets still meet 44px.

Accessibility

Colour is the second signal; thickness and offset remain under forced colours.