Web accessibility (a11y) — semantic HTML, ARIA, keyboard navigation, color contrast, screen reader support.
How this skill is triggered — by the user, by Claude, or both
Slash command
/claude-gentleman-native:accessibilityThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Accessibility is not a feature you add later. It's a quality of well-written HTML. If your markup is semantic, you're already 80% there.
Accessibility is not a feature you add later. It's a quality of well-written HTML. If your markup is semantic, you're already 80% there.
| Instead of... | Use... | Why |
|---|---|---|
<div onClick> | <button> | Keyboard support, focus, screen reader announce |
<div class="nav"> | <nav> | Screen readers identify navigation |
<div class="header"> | <header> | Landmark for assistive tech |
<span class="link"> | <a href> | Keyboard navigable, right-click menu |
<div class="list"> | <ul>/<ol> | Screen readers announce item count |
<div> with onClick is NOT a button. It has no keyboard support, no focus indicator, no screen reader announcement. You'd need role="button", tabIndex, onKeyDown — or just use <button>.| Attribute | When |
|---|---|
aria-label | Element has no visible text (icon button, close X) |
aria-labelledby | Label is another element on the page |
aria-describedby | Additional context beyond the label |
aria-hidden="true" | Decorative content invisible to screen readers |
aria-live="polite" | Dynamic content updates (toasts, loading states) |
aria-expanded | Collapsible sections, dropdowns |
role | Only when the element's native role is wrong |
role="button" to a <button>. It already has that role.tabIndex > 0.tabIndex values:
| Value | Meaning |
|---|---|
0 | Element is focusable in natural tab order |
-1 | Focusable programmatically but not via tab |
> 0 | NEVER USE — forces arbitrary tab order |
Enter/Space activates buttons and links.Escape closes modals, dropdowns, dialogs.:focus without providing :focus-visible:
:focus-visible {
outline: 2px solid var(--color-primary);
outline-offset: 2px;
}
<a href="#main-content" class="sr-only focus:not-sr-only">Skip to content</a>
sr-only class (visually hidden but accessible):
.sr-only {
position: absolute;
width: 1px; height: 1px;
padding: 0; margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
<img src="team.jpg" alt="Team celebrating product launch at the office" />
<img src="divider.svg" alt="" />
<label for="email">Email address</label>
<input id="email" type="email" required />
<fieldset> and <legend>.aria-describedby:
<input id="email" aria-describedby="email-error" aria-invalid="true" />
<span id="email-error" role="alert">Email format is invalid</span>
prefers-reduced-motion:
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}
tabIndex > 0. Ever.aria-label when visible text already serves as a label.<div> or <span> as interactive elements. Use <button>, <a>, <input>.h1 → h2 → h3, not h1 → h3.npx claudepluginhub juanisarmiento/ecosistema-claude --plugin claude-gentleman-nativeWeb accessibility discipline: semantic HTML first, ARIA only when needed, keyboard access always. Invoke whenever task involves any interaction with accessible web content -- writing, reviewing, refactoring, or debugging HTML/CSS/JS for WCAG compliance, ARIA usage, keyboard navigation, focus management, screen reader support, or accessible component patterns.
Enforces WCAG AA and ARIA best practices for screen readers, keyboard navigation, and focus management. Use when building or auditing user-facing interfaces for accessibility compliance.
Ensures WCAG 2.2 AA web accessibility: color contrast ratios (4.5:1 body text), keyboard navigation, ARIA attributes, focus indicators, screen reader support, color independence, and axe-core testing.