Welcome to Vanilla Breeze
This bell pulls live notifications from /go/notify/messages — the same contract documented at /docs/concepts/service-contracts/. Static articles like this one are the no-JS / no-backend fallback.
This bell pulls live notifications from /go/notify/messages — the same contract documented at /docs/concepts/service-contracts/. Static articles like this one are the no-JS / no-backend fallback.
Copy-paste utilities for screen-reader-only content, skip links, icon-only buttons, and 'opens in new tab' hints.
Small CSS/HTML patterns that give screen reader users what sighted users already get from visual layout. All are shipped in the core bundle or trivial to copy.
A utility class that hides content from the screen while keeping it available to assistive tech. Use it for labels, headings, and helper text that are redundant for sighted users but essential for screen reader navigation. Shipped in the core CSS — no import needed.
Icon-only controls need an accessible name. Put the label in a .visually-hidden span inside the button. Both pick the label up: sighted users see the icon, screen reader users hear “Close”.
<button type="button"> <icon-wc name="x"></icon-wc> <span class="visually-hidden">Close</span></button>
Prefer aria-label for the simple case (<button aria-label="Close">). Reach for .visually-hidden when you want the label to be translatable by the same pipeline that handles the rest of your page content, or when the label needs to include formatted markup.
When a section’s purpose is obvious visually but would read as unstructured to a screen reader, add a hidden heading. Screen reader users can then jump between sections with their heading-navigation shortcut.
<section> <h2 class="visually-hidden">Recent messages</h2> <ul> <li>...</li> </ul></section>
Radio and checkbox groups need a <legend> for the <fieldset>’s accessible name. If the page already makes the group’s purpose obvious (e.g. a segmented control next to a label), hide the legend rather than leaving it off.
<fieldset data-segmented> <legend class="visually-hidden">Color mode</legend> <label><input type="radio" name="mode" value="auto" checked> Auto</label> <label><input type="radio" name="mode" value="light"> Light</label> <label><input type="radio" name="mode" value="dark"> Dark</label></fieldset>
For reference (already in the bundle — you do not need to copy this):
.visually-hidden { position: absolute; inline-size: 1px; block-size: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;}
A keyboard user tabs in from the address bar and should not have to walk through every header link before reaching the page content. A skip link — hidden until focused — gives them a one-keystroke shortcut to #main.
Place as the first focusable element in <body>. Target any element with a matching id (typically <main id="main">).
<body> <a href="#main" class="skip-link">Skip to main content</a> <header>...</header> <main id="main"> ... </main></body>
The skip link starts off-screen via the same clip technique .visually-hidden uses, then snaps into place when it receives focus. Drop this into your project CSS:
.skip-link { position: absolute; inset-block-start: 0; inset-inline-start: 0; padding: var(--size-s) var(--size-m); background: var(--color-surface); color: var(--color-text); border: var(--border-width-thin) solid var(--color-border); border-radius: var(--radius-s); box-shadow: var(--shadow-m); z-index: 1000; /* Off-screen until focused */ transform: translateY(-120%); transition: transform var(--duration-fast, 150ms) var(--ease-out);} .skip-link:focus-visible { transform: translateY(0); outline: var(--focus-ring-width, 2px) solid var(--focus-ring-color, var(--color-interactive)); outline-offset: var(--focus-ring-offset, 2px);} @media (prefers-reduced-motion: reduce) { .skip-link { transition-duration: 0s; }}
For docs pages with several large regions (sidebar, TOC, content, etc.), ship two or more skip links in a list. Sighted keyboard users tab through them in order; screen reader users find them via the heading-navigation shortcut.
<ul class="skip-links" aria-label="Skip links"> <li><a href="#main" class="skip-link">Skip to main content</a></li> <li><a href="#sidebar" class="skip-link">Skip to sidebar navigation</a></li> <li><a href="#search" class="skip-link">Skip to search</a></li></ul>
When a link opens in a new window (target="_blank") or triggers a file download, WCAG 3.2.5 says users need advance warning. Sighted users can get that from an icon; screen reader users need text.
<a href="https://example.com" target="_blank" rel="noopener"> Read the full article <icon-wc name="external-link" size="xs"></icon-wc> <span class="visually-hidden">(opens in new tab)</span></a>
Even cleaner: always append the hint. Since it’s only audible, there is no visual cost.
<a href="report.pdf" download> Download report <span class="visually-hidden">(PDF, 2.4 MB)</span></a>
Every form control needs a label. When a visible label would be redundant — a search input with a magnifying-glass icon, for instance — hide the label with .visually-hidden rather than omitting it or relying on placeholder. Placeholders vanish on input and are not a substitute.
<form role="search"> <label for="site-search" class="visually-hidden">Search documentation</label> <input type="search" id="site-search" name="q" placeholder="Search..."> <button type="submit"> <icon-wc name="search"></icon-wc> <span class="visually-hidden">Submit search</span> </button></form>
| Need | Use | Why not the alternative |
|---|---|---|
| Name an icon-only button | aria-label |
Simplest. Reach for .visually-hidden only if the label needs translation pipeline parity with body copy. |
| Describe an icon next to visible text | aria-hidden="true" on the icon |
The visible text already names the control. Avoid doubling up. |
| Section heading for screen readers only | <h2 class="visually-hidden"> |
aria-label on the wrapper works but screen readers read it as a label, not a navigable heading. |
Hide a <legend> from sighted users |
.visually-hidden |
A fieldset without a legend has no accessible name. Styling legend with display: none breaks it. |
| Let keyboard users jump past nav | Skip link | Sectioning landmarks help screen readers but not sighted keyboard users. Both need the skip link. |
<label> — native form labeling<a> — link semantics and target handlingtabindex — making non-focusable elements focusable (needed for skip-link targets).skip-link in context