{"id":"8c3c6dd4-1428-4a32-a428-8d15f784a6a6","shortId":"bpTskf","kind":"skill","title":"accessibility","tagline":"Audit and improve web accessibility following WCAG 2.2 guidelines. Use when asked to \"improve accessibility\", \"a11y audit\", \"WCAG compliance\", \"screen reader support\", \"keyboard navigation\", or \"make accessible\".","description":"# Accessibility (a11y)\n\nComprehensive accessibility guidelines based on WCAG 2.2 and Lighthouse accessibility audits. Goal: make content usable by everyone, including people with disabilities.\n\n## WCAG Principles: POUR\n\n| Principle | Description |\n|-----------|-------------|\n| **P**erceivable | Content can be perceived through different senses |\n| **O**perable | Interface can be operated by all users |\n| **U**nderstandable | Content and interface are understandable |\n| **R**obust | Content works with assistive technologies |\n\n## Conformance levels\n\n| Level | Requirement | Target |\n|-------|-------------|--------|\n| **A** | Minimum accessibility | Must pass |\n| **AA** | Standard compliance | Should pass (legal requirement in many jurisdictions) |\n| **AAA** | Enhanced accessibility | Nice to have |\n\n---\n\n## Perceivable\n\n### Text alternatives (1.1)\n\n**Images require alt text:**\n```html\n<!-- ❌ Missing alt -->\n<img src=\"chart.png\">\n\n<!-- ✅ Descriptive alt -->\n<img src=\"chart.png\" alt=\"Bar chart showing 40% increase in Q3 sales\">\n\n<!-- ✅ Decorative image (empty alt) -->\n<img src=\"decorative-border.png\" alt=\"\" role=\"presentation\">\n\n<!-- ✅ Complex image with longer description -->\n<figure>\n  <img src=\"infographic.png\" alt=\"2024 market trends infographic\" \n       aria-describedby=\"infographic-desc\">\n  <figcaption id=\"infographic-desc\">\n    <!-- Detailed description -->\n  </figcaption>\n</figure>\n```\n\n**Icon buttons need accessible names:**\n```html\n<!-- ❌ No accessible name -->\n<button><svg><!-- menu icon --></svg></button>\n\n<!-- ✅ Using aria-label -->\n<button aria-label=\"Open menu\">\n  <svg aria-hidden=\"true\"><!-- menu icon --></svg>\n</button>\n\n<!-- ✅ Using visually hidden text -->\n<button>\n  <svg aria-hidden=\"true\"><!-- menu icon --></svg>\n  <span class=\"visually-hidden\">Open menu</span>\n</button>\n```\n\n**Visually hidden class:**\n```css\n.visually-hidden {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  border: 0;\n}\n```\n\n### Color contrast (1.4.3, 1.4.6)\n\n| Text Size | AA minimum | AAA enhanced |\n|-----------|------------|--------------|\n| Normal text (< 18px / < 14px bold) | 4.5:1 | 7:1 |\n| Large text (≥ 18px / ≥ 14px bold) | 3:1 | 4.5:1 |\n| UI components & graphics | 3:1 | 3:1 |\n\n```css\n/* ❌ Low contrast (2.5:1) */\n.low-contrast {\n  color: #999;\n  background: #fff;\n}\n\n/* ✅ Sufficient contrast (7:1) */\n.high-contrast {\n  color: #333;\n  background: #fff;\n}\n\n/* ✅ Focus states need contrast too (3:1 against background, WCAG 1.4.11) */\n:focus-visible {\n  outline: 2px solid currentColor;\n  outline-offset: 2px;\n}\n```\n\n**Don't rely on color alone:**\n```html\n<!-- ❌ Only color indicates error -->\n<input class=\"error-border\">\n<style>.error-border { border-color: red; }</style>\n\n<!-- ✅ Color + icon + text -->\n<div class=\"field-error\">\n  <input aria-invalid=\"true\" aria-describedby=\"email-error\">\n  <span id=\"email-error\" class=\"error-message\">\n    <svg aria-hidden=\"true\"><!-- error icon --></svg>\n    Please enter a valid email address\n  </span>\n</div>\n```\n\n### Media alternatives (1.2)\n\n```html\n<!-- Video with captions -->\n<video controls>\n  <source src=\"video.mp4\" type=\"video/mp4\">\n  <track kind=\"captions\" src=\"captions.vtt\" srclang=\"en\" label=\"English\" default>\n  <track kind=\"descriptions\" src=\"descriptions.vtt\" srclang=\"en\" label=\"Descriptions\">\n</video>\n\n<!-- Audio with transcript -->\n<audio controls>\n  <source src=\"podcast.mp3\" type=\"audio/mp3\">\n</audio>\n<details>\n  <summary>Transcript</summary>\n  <p>Full transcript text...</p>\n</details>\n```\n\n---\n\n## Operable\n\n### Keyboard accessible (2.1)\n\n**All functionality must be keyboard accessible.** Prefer native interactive elements — `<button>`, `<a href>`, and form controls handle Enter/Space activation, focus, and assistive-tech semantics for free. Only add manual keyboard handling when you cannot use a native element.\n\n```html\n<!-- ❌ Non-interactive element with click only: not focusable, no keyboard activation -->\n<div class=\"card\" onclick=\"handleAction()\">Open</div>\n\n<!-- ✅ Best: use a native button -->\n<button type=\"button\" onclick=\"handleAction()\">Open</button>\n```\n\n```javascript\n// ✅ When you MUST use a non-interactive element (e.g. div with role=\"button\"),\n// make it focusable AND handle keyboard activation. Do NOT add this to a native\n// <button> — Enter/Space already fire click, so you'd double-trigger.\nelement.setAttribute('role', 'button');\nelement.setAttribute('tabindex', '0');\nelement.addEventListener('click', handleAction);\nelement.addEventListener('keydown', (e) => {\n  if (e.key === 'Enter' || e.key === ' ') {\n    e.preventDefault();\n    handleAction();\n  }\n});\n```\n\n**No keyboard traps.** Users must be able to Tab into and out of every component. Use the [modal focus trap pattern](references/A11Y-PATTERNS.md#modal-focus-trap) for dialogs—the native `<dialog>` element handles this automatically.\n\n### Focus visible (2.4.7)\n\n```css\n/* ❌ Never remove focus outlines */\n*:focus { outline: none; }\n\n/* ✅ Use :focus-visible for keyboard-only focus */\n:focus {\n  outline: none;\n}\n\n:focus-visible {\n  outline: 2px solid currentColor; /* inherits text color → already contrast-checked */\n  outline-offset: 2px;\n}\n\n/* ✅ Or pick a brand color and verify ≥3:1 contrast against every background it lands on */\nbutton:focus-visible {\n  box-shadow: 0 0 0 3px rgba(0, 95, 204, 0.5);\n}\n```\n\n### Focus not obscured (2.4.11) — new in 2.2\n\nWhen an element receives keyboard focus, it must not be entirely hidden by other author-created content such as sticky headers, footers, or overlapping panels. At Level AAA (2.4.12), no part of the focused element may be hidden.\n\n```css\n/* ✅ Account for sticky headers when scrolling to focused elements */\n:target {\n  scroll-margin-top: 80px;\n}\n\n/* ✅ Ensure focused items clear fixed/sticky bars */\n:focus {\n  scroll-margin-top: 80px;\n  scroll-margin-bottom: 60px;\n}\n```\n\n### Skip links (2.4.1)\n\nProvide a skip link so keyboard users can bypass repetitive navigation. See the [skip link pattern](references/A11Y-PATTERNS.md#skip-link) for full markup and styles.\n\n### Target size (2.5.8) — new in 2.2\n\nInteractive targets must be at least **24 × 24 CSS pixels** (AA). Exceptions: inline text links, elements where the browser controls the size, and targets where a 24px circle centered on the bounding box does not overlap another target.\n\n```css\n/* ✅ Minimum target size */\nbutton,\n[role=\"button\"],\ninput[type=\"checkbox\"] + label,\ninput[type=\"radio\"] + label {\n  min-width: 24px;\n  min-height: 24px;\n}\n\n/* ✅ Comfortable target size (recommended 44×44) */\n.touch-target {\n  min-width: 44px;\n  min-height: 44px;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n}\n```\n\n### Dragging movements (2.5.7) — new in 2.2\n\nAny action that requires dragging must have a single-pointer alternative (e.g., buttons, inputs). See the [dragging movements pattern](references/A11Y-PATTERNS.md#dragging-movements) for a sortable-list example.\n\n### Timing (2.2)\n\n```javascript\n// Allow users to extend time limits\nfunction showSessionWarning() {\n  const modal = createModal({\n    title: 'Session Expiring',\n    content: 'Your session will expire in 2 minutes.',\n    actions: [\n      { label: 'Extend session', action: extendSession },\n      { label: 'Log out', action: logout }\n    ],\n    timeout: 120000\n  });\n}\n```\n\n### Motion (2.3)\n\n```css\n/* Respect reduced motion preference */\n@media (prefers-reduced-motion: reduce) {\n  *,\n  *::before,\n  *::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}\n```\n\n---\n\n## Understandable\n\n### Page language (3.1.1)\n\n```html\n<!-- ❌ No language specified -->\n<html>\n\n<!-- ✅ Language specified -->\n<html lang=\"en\">\n\n<!-- ✅ Language changes within page -->\n<p>The French word for hello is <span lang=\"fr\">bonjour</span>.</p>\n```\n\n### Consistent navigation (3.2.3)\n\n```html\n<!-- Navigation should be consistent across pages -->\n<nav aria-label=\"Main\">\n  <ul>\n    <li><a href=\"/\" aria-current=\"page\">Home</a></li>\n    <li><a href=\"/products\">Products</a></li>\n    <li><a href=\"/about\">About</a></li>\n  </ul>\n</nav>\n```\n\n### Consistent help (3.2.6) — new in 2.2\n\nIf a help mechanism (contact info, chat widget, FAQ link, self-help option) is repeated across multiple pages, it must appear in the **same relative order** each time. Users who rely on consistent placement shouldn't have to hunt for help on every page.\n\n### Form labels (3.3.2)\n\nEvery input needs a programmatically associated label. See the [form labels pattern](references/A11Y-PATTERNS.md#form-labels) for explicit, implicit, and instructional examples.\n\n### Error handling (3.3.1, 3.3.3)\n\nAnnounce errors to screen readers with `role=\"alert\"` or `aria-live`, set `aria-invalid=\"true\"` on invalid fields, and focus the first error on submit. See the [error handling pattern](references/A11Y-PATTERNS.md#error-handling) for full markup and JS.\n\n### Redundant entry (3.3.7) — new in 2.2\n\nDon't force users to re-enter information they already provided in the same session. Auto-populate from earlier steps, or let users select from previously entered values. Exceptions: security re-confirmation and content that has expired.\n\n```html\n<!-- ✅ Auto-fill shipping address from billing -->\n<fieldset>\n  <legend>Shipping address</legend>\n  <label>\n    <input type=\"checkbox\" id=\"same-as-billing\" checked>\n    Same as billing address\n  </label>\n  <!-- Fields auto-populated when checked -->\n</fieldset>\n```\n\n### Accessible authentication (3.3.8) — new in 2.2\n\nLogin flows must not rely on cognitive function tests (e.g., remembering a password, solving a puzzle) unless at least one of:\n- A copy-paste or autofill mechanism is available\n- An alternative method exists (e.g., passkey, SSO, email link)\n- The test uses object recognition or personal content (AA only; AAA removes this exception)\n\n```html\n<!-- ✅ Allow paste in password fields -->\n<input type=\"password\" id=\"password\" autocomplete=\"current-password\">\n\n<!-- ✅ Offer passwordless alternatives -->\n<button type=\"button\">Sign in with passkey</button>\n<button type=\"button\">Email me a login link</button>\n```\n\n---\n\n## Robust\n\n### ARIA usage (4.1.2)\n\n**Prefer native elements:**\n```html\n<!-- ❌ ARIA role on div -->\n<div role=\"button\" tabindex=\"0\">Click me</div>\n\n<!-- ✅ Native button -->\n<button>Click me</button>\n\n<!-- ❌ ARIA checkbox -->\n<div role=\"checkbox\" aria-checked=\"false\">Option</div>\n\n<!-- ✅ Native checkbox -->\n<label><input type=\"checkbox\"> Option</label>\n```\n\n**When ARIA is needed,** use the correct roles and states. See the [ARIA tabs pattern](references/A11Y-PATTERNS.md#aria-tabs) for a complete tablist example.\n\n### Live regions (4.1.3)\n\nUse `aria-live` regions to announce dynamic content changes without moving focus. See the [live regions pattern](references/A11Y-PATTERNS.md#live-regions-and-notifications) for markup and a `showNotification()` helper.\n\n---\n\n## Testing checklist\n\n### Automated testing\n```bash\n# Lighthouse accessibility audit\nnpx lighthouse https://example.com --only-categories=accessibility\n\n# axe-core\nnpm install @axe-core/cli -g\naxe https://example.com\n```\n\n### Manual testing\n\n- [ ] **Keyboard navigation:** Tab through entire page, use Enter/Space to activate\n- [ ] **Screen reader:** Test with VoiceOver (Mac), NVDA (Windows), or TalkBack (Android)\n- [ ] **Zoom:** Content usable at 200% zoom\n- [ ] **High contrast:** Test with Windows High Contrast Mode\n- [ ] **Reduced motion:** Test with `prefers-reduced-motion: reduce`\n- [ ] **Focus order:** Logical and follows visual order\n- [ ] **Target size:** Interactive elements meet 24×24px minimum\n\nSee the [screen reader commands reference](references/A11Y-PATTERNS.md#screen-reader-commands) for VoiceOver and NVDA shortcuts.\n\n---\n\n## Common issues by impact\n\n### Critical (fix immediately)\n1. Missing form labels\n2. Missing image alt text\n3. Insufficient color contrast\n4. Keyboard traps\n5. No focus indicators\n\n### Serious (fix before launch)\n1. Missing page language\n2. Missing heading structure\n3. Non-descriptive link text\n4. Auto-playing media\n5. Missing skip links\n\n### Moderate (fix soon)\n1. Missing ARIA labels on icons\n2. Inconsistent navigation\n3. Missing error identification\n4. Timing without controls\n5. Missing landmark regions\n\n## References\n\n- [WCAG 2.2 Quick Reference](https://www.w3.org/WAI/WCAG22/quickref/)\n- [WAI-ARIA Authoring Practices](https://www.w3.org/WAI/ARIA/apg/)\n- [Deque axe Rules](https://dequeuniversity.com/rules/axe/)\n- [Web Quality Audit](../web-quality-audit/SKILL.md)\n- [WCAG criteria reference](references/WCAG.md)\n- [Accessibility code patterns](references/A11Y-PATTERNS.md)","tags":["accessibility","web","quality","skills","addyosmani","agent-skills","claude-skills","core-web-vitals","lighthouse","testing","web-performance"],"capabilities":["skill","source-addyosmani","skill-accessibility","topic-accessibility","topic-agent-skills","topic-claude-skills","topic-core-web-vitals","topic-lighthouse","topic-skills","topic-testing","topic-web-performance"],"categories":["web-quality-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/addyosmani/web-quality-skills/accessibility","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add addyosmani/web-quality-skills","source_repo":"https://github.com/addyosmani/web-quality-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 1959 github stars · SKILL.md body (12,760 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:52:54.917Z","embedding":null,"createdAt":"2026-04-18T20:24:24.708Z","updatedAt":"2026-05-18T18:52:54.917Z","lastSeenAt":"2026-05-18T18:52:54.917Z","tsv":"'-1':148 '/cli':1143 '/rules/axe/)':1323 '/wai/aria/apg/)':1317 '/wai/wcag22/quickref/)':1309 '/web-quality-audit/skill.md':1327 '0':146,154,155,156,157,163,352,463,464,465,468 '0.01':767,779 '0.5':471 '1':180,182,189,191,196,198,203,214,228,448,774,1231,1255,1281 '1.1':118 '1.2':259 '1.4.11':232 '1.4.3':166 '1.4.6':167 '120000':748 '14px':177,186 '18px':176,185 '1px':142,144 '2':734,1235,1259,1287 '2.1':268 '2.2':9,37,478,584,680,712,811,932,985,1304 '2.3':750 '2.4.1':553 '2.4.11':475 '2.4.12':508 '2.4.7':401 '2.5':202 '2.5.7':677 '2.5.8':581 '200':1174 '204':470 '24':591,592,1205 '24px':611,641,645,1206 '2px':237,243,426,439 '3':188,195,197,227,447,1240,1263,1290 '3.1.1':790 '3.2.3':801 '3.2.6':808 '3.3.1':884 '3.3.2':859 '3.3.3':885 '3.3.7':929 '3.3.8':982 '333':219 '3px':466 '4':1244,1269,1294 '4.1.2':1052 '4.1.3':1089 '4.5':179,190 '44':650,651 '44px':658,662 '5':1247,1274,1298 '60px':550 '7':181,213 '80px':533,545 '95':469 '999':208 'a11y':17,30 'aa':99,170,595,1033 'aaa':109,172,507,1035 'abl':371 'absolut':140 'access':1,6,16,28,29,32,40,96,111,127,267,274,980,1126,1134,1332 'account':519 'across':828 'action':682,736,740,745 'activ':284,329,1158 'add':294,332 'address':256,975,979 'alert':893 'align':668 'align-item':667 'allow':714 'alon':249 'alreadi':338,432,943 'alt':121,1238 'altern':117,258,692,1017 'android':1169 'anim':765,771 'animation-dur':764 'animation-iteration-count':770 'announc':886,1096 'anoth':621 'appear':833 'aria':896,900,1050,1064,1075,1080,1092,1283,1312 'aria-invalid':899 'aria-l':895,1091 'aria-tab':1079 'ask':13 'assist':87,288 'assistive-tech':287 'associ':865 'audit':2,18,41,1127,1326 'authent':981 'author':494,1313 'author-cr':493 'auto':785,950,1271 'auto-play':1270 'auto-popul':949 'autofil':1012 'autom':1122 'automat':398 'avail':1015 'axe':1136,1141,1145,1319 'axe-cor':1135,1140 'background':209,220,230,452 'bar':539 'base':34 'bash':1124 'behavior':784 'bill':978 'bold':178,187 'bonjour':798 'border':162 'bottom':549 'bound':616 'box':461,617 'box-shadow':460 'brand':443 'browser':603 'button':125,322,349,456,627,629,694 'bypass':562 'cannot':300 'categori':1133 'center':613,670,674 'chang':1099 'chat':818 'check':435 'checkbox':632 'checklist':1121 'circl':612 'class':134 'clear':537 'click':340,354,1057,1059 'clip':152 'code':1333 'cognit':992 'color':164,207,218,248,431,444,1242 'comfort':646 'command':1212,1218 'common':1224 'complet':1084 'complianc':20,101 'compon':193,379 'comprehens':31 'confirm':967 'conform':89 'consist':799,806,845 'const':722 'contact':816 'content':44,59,77,84,496,673,728,969,1032,1098,1171 'contrast':165,201,206,212,217,225,434,449,1177,1182,1243 'contrast-check':433 'control':281,604,1297 'copi':1009 'copy-past':1008 'core':1137,1142 'correct':1069 'count':773 'creat':495 'createmod':724 'criteria':1329 'critic':1228 'css':135,199,402,518,593,623,751 'currentcolor':239,428 'd':343 'dequ':1318 'dequeuniversity.com':1322 'dequeuniversity.com/rules/axe/)':1321 'descript':56,1266 'dialog':392 'differ':64 'disabl':51 'display':663 'div':319 'doubl':345 'double-trigg':344 'drag':675,685,698,703 'dragging-mov':702 'durat':766,778 'dynam':1097 'e':358 'e.g':318,693,995,1020 'e.key':360,362 'e.preventdefault':363 'earlier':953 'element':278,304,317,395,481,514,527,600,1055,1203 'element.addeventlistener':353,356 'element.setattribute':347,350 'email':255,1023,1044 'enhanc':110,173 'ensur':534 'enter':252,361,940,961 'enter/space':283,337,1156 'entir':489,1153 'entri':928 'erceiv':58 'error':882,887,910,915,920,1292 'error-handl':919 'everi':378,451,855,860 'everyon':47 'exampl':710,881,1086 'example.com':1130,1146 'except':596,963,1038 'exist':1019 'expir':727,732,972 'explicit':877 'extend':717,738 'extendsess':741 'faq':820 'fff':210,221 'field':905 'fire':339 'first':909 'fix':1229,1252,1279 'fixed/sticky':538 'flex':666 'flow':987 'focus':222,234,285,325,383,389,399,405,407,412,418,419,423,458,472,484,513,526,535,540,907,1102,1193,1249 'focus-vis':233,411,422,457 'follow':7,1197 'footer':501 'forc':935 'form':280,857,869,874,1233 'form-label':873 'free':292 'french':793 'full':262,575,923 'function':270,720,993 'g':1144 'goal':42 'graphic':194 'guidelin':10,33 'handl':282,297,327,396,883,916,921 'handleact':355,364 'head':1261 'header':500,522 'height':143,644,661 'hello':796 'help':807,814,824,853 'helper':1119 'hidden':133,138,151,490,517 'high':216,1176,1181 'high-contrast':215 'home':803 'html':123,129,250,260,305,791,802,973,1039,1056 'hunt':851 'icon':124,1286 'identif':1293 'imag':119,1237 'immedi':1230 'impact':1227 'implicit':878 'import':769,775,781,786 'improv':4,15 'includ':48 'inconsist':1288 'indic':1250 'info':817 'inform':941 'inherit':429 'inlin':597,665 'inline-flex':664 'input':630,634,695,861 'instal':1139 'instruct':880 'insuffici':1241 'interact':277,316,585,1202 'interfac':68,79 'invalid':901,904 'issu':1225 'item':536,669 'iter':772 'javascript':308,713 'js':926 'jurisdict':108 'justifi':672 'justify-cont':671 'keyboard':24,266,273,296,328,366,416,483,559,1149,1245 'keyboard-on':415 'keydown':357 'label':633,637,737,742,858,866,870,875,1234,1284 'land':454 'landmark':1300 'languag':789,1258 'larg':183 'launch':1254 'least':590,1004 'legal':104 'let':956 'level':90,91,506 'lighthous':39,1125,1129 'limit':719 'link':552,557,568,573,599,821,1024,1048,1267,1277 'list':709 'live':897,1087,1093,1105,1110 'live-regions-and-notif':1109 'log':743 'logic':1195 'login':986,1047 'logout':746 'low':200,205 'low-contrast':204 'mac':1164 'make':27,43,323 'mani':107 'manual':295,1147 'margin':147,531,543,548 'markup':576,924,1115 'may':515 'mechan':815,1013 'media':257,756,1273 'meet':1204 'menu':131 'method':1018 'min':639,643,656,660 'min-height':642,659 'min-width':638,655 'minimum':95,171,624,1207 'minut':735 'miss':1232,1236,1256,1260,1275,1282,1291,1299 'modal':382,388,723 'modal-focus-trap':387 'mode':1183 'moder':1278 'motion':749,754,760,1185,1191 'move':1101 'movement':676,699,704 'ms':768,780 'multipl':829 'must':97,271,311,369,486,587,686,832,988 'name':128 'nativ':276,303,336,394,1054 'navig':25,564,800,1150,1289 'nderstand':76 'need':126,224,862,1066 'never':403 'new':476,582,678,809,930,983 'nice':112 'non':315,1265 'non-descript':1264 'non-interact':314 'none':409,421 'normal':174 'notif':1113 'nowrap':161 'npm':1138 'npx':1128 'nvda':1165,1222 'o':66 'object':1028 'obscur':474 'obust':83 'offset':242,438 'one':1005 'only-categori':1131 'open':130,306,307 'oper':71,265 'option':825,1061,1062 'order':838,1194,1199 'outlin':236,241,406,408,420,425,437 'outline-offset':240,436 'overflow':150 'overlap':503,620 'p':57 'pad':145 'page':788,830,856,1154,1257 'panel':504 'part':510 'pass':98,103 'passkey':1021,1043 'password':998 'past':1010 'pattern':385,569,700,871,917,1077,1107,1334 'peopl':49 'perabl':67 'perceiv':62,115 'person':1031 'pick':441 'pixel':594 'placement':846 'play':1272 'pleas':251 'pointer':691 'popul':951 'posit':139 'pour':54 'practic':1314 'prefer':275,755,758,1053,1189 'prefers-reduced-mot':757,1188 'previous':960 'principl':53,55 'product':804 'programmat':864 'provid':554,944 'puzzl':1001 'px':149 'qualiti':1325 'quick':1305 'r':82 'radio':636 're':939,966 're-confirm':965 're-ent':938 'reader':22,890,1160,1211,1217 'receiv':482 'recognit':1029 'recommend':649 'rect':153 'reduc':753,759,761,1184,1190,1192 'redund':927 'refer':1213,1302,1306,1330 'references/a11y-patterns.md':386,570,701,872,918,1078,1108,1214,1335 'references/wcag.md':1331 'region':1088,1094,1106,1111,1301 'relat':837 'reli':246,843,990 'rememb':996 'remov':404,1036 'repeat':827 'repetit':563 'requir':92,105,120,684 'respect':752 'rgba':467 'robust':1049 'role':321,348,628,892,1070 'rule':1320 'screen':21,889,1159,1210,1216 'screen-reader-command':1215 'scroll':524,530,542,547,783 'scroll-behavior':782 'scroll-margin-bottom':546 'scroll-margin-top':529,541 'secur':964 'see':565,696,867,913,1073,1103,1208 'select':958 'self':823 'self-help':822 'semant':290 'sens':65 'serious':1251 'session':726,730,739,948 'set':898 'shadow':462 'ship':974 'shortcut':1223 'shouldn':847 'shownotif':1118 'showsessionwarn':721 'sign':1040 'singl':690 'single-point':689 'size':169,580,606,626,648,1201 'skill' 'skill-accessibility' 'skip':551,556,567,572,1276 'skip-link':571 'solid':238,427 'solv':999 'soon':1280 'sortabl':708 'sortable-list':707 'source-addyosmani' 'space':160 'sso':1022 'standard':100 'state':223,1072 'step':954 'sticki':499,521 'structur':1262 'style':578 'submit':912 'suffici':211 'support':23 'tab':373,1076,1081,1151 'tabindex':351 'tablist':1085 'talkback':1168 'target':93,528,579,586,608,622,625,647,654,1200 'tech':289 'technolog':88 'test':994,1026,1120,1123,1148,1161,1178,1186 'text':116,122,168,175,184,264,430,598,1239,1268 'time':711,718,840,1295 'timeout':747 'titl':725 'top':532,544 'topic-accessibility' 'topic-agent-skills' 'topic-claude-skills' 'topic-core-web-vitals' 'topic-lighthouse' 'topic-skills' 'topic-testing' 'topic-web-performance' 'touch':653 'touch-target':652 'transcript':261,263 'transit':777 'transition-dur':776 'trap':367,384,390,1246 'trigger':346 'true':902 'type':631,635 'u':75 'ui':192 'understand':81,787 'unless':1002 'usabl':45,1172 'usag':1051 'use':11,301,312,380,410,1027,1067,1090,1155 'user':74,368,560,715,841,936,957 'valid':254 'valu':962 'verifi':446 'visibl':235,400,413,424,459 'visual':132,137,1198 'visually-hidden':136 'voiceov':1163,1220 'wai':1311 'wai-aria':1310 'wcag':8,19,36,52,231,1303,1328 'web':5,1324 'white':159 'white-spac':158 'widget':819 'width':141,640,657 'window':1166,1180 'without':1100,1296 'word':794 'work':85 'www.w3.org':1308,1316 'www.w3.org/wai/aria/apg/)':1315 'www.w3.org/wai/wcag22/quickref/)':1307 'zoom':1170,1175","prices":[{"id":"2ad340cf-c9b2-4ba6-b8d1-fa02a3bce0c3","listingId":"8c3c6dd4-1428-4a32-a428-8d15f784a6a6","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"addyosmani","category":"web-quality-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:24:24.708Z"}],"sources":[{"listingId":"8c3c6dd4-1428-4a32-a428-8d15f784a6a6","source":"github","sourceId":"addyosmani/web-quality-skills/accessibility","sourceUrl":"https://github.com/addyosmani/web-quality-skills/tree/main/skills/accessibility","isPrimary":false,"firstSeenAt":"2026-04-18T21:54:14.868Z","lastSeenAt":"2026-05-18T18:52:54.917Z"},{"listingId":"8c3c6dd4-1428-4a32-a428-8d15f784a6a6","source":"skills_sh","sourceId":"addyosmani/web-quality-skills/accessibility","sourceUrl":"https://skills.sh/addyosmani/web-quality-skills/accessibility","isPrimary":true,"firstSeenAt":"2026-04-18T20:24:24.708Z","lastSeenAt":"2026-05-07T22:40:14.434Z"}],"details":{"listingId":"8c3c6dd4-1428-4a32-a428-8d15f784a6a6","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"addyosmani","slug":"accessibility","github":{"repo":"addyosmani/web-quality-skills","stars":1959,"topics":["accessibility","agent-skills","claude-skills","core-web-vitals","lighthouse","skills","testing","web-performance"],"license":"mit","html_url":"https://github.com/addyosmani/web-quality-skills","pushed_at":"2026-05-09T22:25:48Z","description":"Agent Skills for optimizing web quality based on Lighthouse and Core Web Vitals.","skill_md_sha":"f62cdee9bf7f4da9bf8dbbd65ec1b420c1d57184","skill_md_path":"skills/accessibility/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/addyosmani/web-quality-skills/tree/main/skills/accessibility"},"layout":"multi","source":"github","category":"web-quality-skills","frontmatter":{"name":"accessibility","license":"MIT","description":"Audit and improve web accessibility following WCAG 2.2 guidelines. Use when asked to \"improve accessibility\", \"a11y audit\", \"WCAG compliance\", \"screen reader support\", \"keyboard navigation\", or \"make accessible\"."},"skills_sh_url":"https://skills.sh/addyosmani/web-quality-skills/accessibility"},"updatedAt":"2026-05-18T18:52:54.917Z"}}