> common-accessibility
WCAG 2.2, ARIA, semantic HTML, keyboard navigation, and color contrast standards for web UIs. Legal compliance baseline. (triggers: **/*.tsx, **/*.jsx, **/*.html, **/*.vue, **/*.component.html, accessibility, a11y, wcag, aria, screen reader, focus, alt text)
curl "https://skillshub.wtf/HoangNguyen0403/agent-skills-standard/common-accessibility?format=md"Common Accessibility (a11y) Standards
Priority: P1 (OPERATIONAL)
Accessibility is a legal requirement in the EU (Web Accessibility Directive), USA (ADA/Section 508), and many other jurisdictions. Non-compliance carries litigation risk. Target WCAG 2.2 Level AA as the minimum.
๐ Semantic HTML First
-
Use the correct HTML element before reaching for ARIA.
<button>,<a>,<nav>,<main>,<section>,<form>,<label>convey semantics natively. -
Never use
<div>or<span>for interactive elements โ they have no keyboard role by default. -
Headings (
h1โh6) must form a logical outline. Oneh1per page. -
Use
<button>not<div onClick>,<a>not<span onClick>, etc.
๐ญ ARIA โ Use Sparingly
ARIA supplements semantics when native HTML is insufficient (e.g., custom widgets). Rules:
- No ARIA > Bad ARIA: If native HTML works, use it. ARIA only adds roles, not behavior.
- Required attributes: Every
rolewith required properties must include them (e.g.,role="slider"needsaria-valuenow,aria-valuemin,aria-valuemax). - Live Regions: Use
aria-live="polite"for status messages;aria-live="assertive"only for critical alerts. - Labels: Every form control must have a programmatic label (
<label>,aria-label, oraria-labelledby). - Hidden content: Use
aria-hidden="true"on decorative icons; never on focusable elements.
โจ๏ธ Keyboard Navigation
- All interactive elements MUST be reachable and operable via keyboard.
- Tab order must follow visual reading order. Never use positive
tabindexvalues (tabindex="1"breaks natural order). - Provide visible focus indicators. Never
outline: nonewithout a custom focus style. - Modals/Dialogs: Trap focus inside when open. Return focus to trigger element on close.
- Escape key: Must close modals, dropdowns, and tooltips.
- Focus style: Never
outline: nonewithout a visible replacement (min 2px solid, 3:1 contrast).
๐จ Color & Contrast
- Normal text: โฅ 4.5:1 ratio. Large text (โฅ 18pt or 14pt bold): โฅ 3:1. UI components: โฅ 3:1.
- Never convey information through color alone โ add icon, pattern, or text label.
- Test with: axe DevTools, WAVE, Lighthouse.
๐ Touch & Pointer Targets
- Minimum interactive target size: 44ร44px (WCAG 2.5.5 AAA) / 24ร24px minimum (WCAG 2.2 AA).
- Provide sufficient spacing between adjacent targets to prevent mis-taps.
๐ผ Images & Media
- Decorative images:
alt=""(empty, not missing). - Informative images: descriptive
alttext (what the image conveys, not "image of..."). - Complex charts/graphs: provide a text summary or data table alternative.
- Video: Captions mandatory. Audio descriptions for visual-only content.
๐งช Testing Minimum
- CI gate:
axe-corezero critical violations. - Manual: keyboard-only full flow + screen reader (NVDA/VoiceOver) + 200% zoom.
Anti-Patterns
- No
onClickon<div>: Use<button>or addrole,tabindex, and keyboard handlers. - No missing
alt: Every<img>must have analtattribute (empty string if decorative). - No color-only status: Red = error must also show an icon or text.
- No
outline: nonewithout replacement focus style. - No auto-playing media: Users with vestibular disorders may be harmed.
- No dynamic content without announcement: Use
aria-livefor async status updates.
References
> related_skills --same-repo
> typescript-tooling
Development tools, linting, and build config for TypeScript. Use when configuring ESLint, Prettier, Jest, Vitest, tsconfig, or any TS build tooling. (triggers: tsconfig.json, .eslintrc.*, jest.config.*, package.json, eslint, prettier, jest, vitest, build, compile, lint)
> typescript-security
Secure coding practices for TypeScript. Use when validating input, handling auth tokens, sanitizing data, or managing secrets and sensitive configuration. (triggers: **/*.ts, **/*.tsx, validate, sanitize, xss, injection, auth, password, secret, token)
> typescript-language
Modern TypeScript standards for type safety and maintainability. Use when working with types, interfaces, generics, enums, unions, or tsconfig settings. (triggers: **/*.ts, **/*.tsx, tsconfig.json, type, interface, generic, enum, union, intersection, readonly, const, namespace)
> typescript-best-practices
Idiomatic TypeScript patterns for clean, maintainable code. Use when writing or refactoring TypeScript classes, functions, modules, or async logic. (triggers: **/*.ts, **/*.tsx, class, function, module, import, export, async, promise)