plugins/aem/edge-delivery-services-content-ops/skills/accessibility-fix/SKILL.md
Scan an AEM Edge Delivery Services page for WCAG 2.1 AA accessibility violations and generate specific fixes. Identifies missing alt text, heading hierarchy issues, link text problems, color contrast concerns, and EDS-specific accessibility patterns. Use when fixing accessibility issues, preparing for compliance audits, or remediating WCAG violations.
npx skillsauth add adobe/skills accessibility-fixInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Scan published AEM Edge Delivery Services pages for WCAG 2.1 AA violations, identify fixable issues, and generate specific fixes applicable in the source document (Google Docs / Word / da.live) or in block code. Produces a structured fix report separating document-level fixes from code-level fixes so content authors and developers each get a clear action list.
This skill fetches external web pages for analysis. When fetching:
content-audit when accessibility items need deeper investigation..js file. This skill identifies what needs fixing in code but does not write the code.accessibility-fix when you need deeper remediation detail.The European Accessibility Act (EAA) enforcement began June 28, 2025. WCAG 2.1 AA compliance is now a legal requirement for sites serving EU users. Non-compliance carries legal and financial risk.
EDS sites have specific accessibility patterns because content is authored in documents (Google Docs, Microsoft Word, or da.live) and rendered through the helix-html-pipeline. This means:
styles.css.head.html.Fixes must always specify WHERE the change is made: document, block code, or site config.
Refer to references/wcag-quick-reference.md for EDS-specific guidance on each WCAG criterion.
Before starting, create a checklist of all audit steps to track progress:
Fetch the target URL the user provides (e.g., https://example.com/about).
Important: EDS loads header and footer content via JavaScript. The initial HTML has empty <header> and <footer> elements. To audit these, also fetch:
/nav.plain.html (e.g., https://example.com/nav.plain.html)/footer.plain.html (e.g., https://example.com/footer.plain.html)For root paths (/), use /index.plain.html for the plain content variant.
Note: Some fetch tools convert HTML to markdown, losing attributes like alt, aria-*, and role. Use curl or a tool that preserves raw HTML when auditing attributes.
Parse the HTML and identify all EDS-specific elements:
<div> wrappers created by horizontal rules in the source document. Look for div.section or top-level <div> children of <main>.<div> elements with block class names (e.g., div.cards, div.columns, div.hero). Each block has a wrapper div and content divs inside.<header>. Content comes from /nav.plain.html.<footer>. Content comes from /footer.plain.html.Also fetch the page's CSS (typically styles.css at the site root) to check color contrast values.
For every <img> and <picture> element on the page:
Check: alt text exists.
<img> must have an alt attribute. A missing alt attribute entirely is a Critical violation (WCAG 1.1.1).Check: alt text is meaningful.
IMG_1234.jpg, hero-banner.png), a single generic word (image, photo, picture, icon, logo), or identical to adjacent text.Check: decorative images.
alt="" (empty alt), not descriptive alt text. Over-describing decorative images adds noise for screen reader users.Fix: generate specific alt text.
Add alt text in Google Docs image properties: "Warehouse team scanning inventory with handheld devices" — not Add alt text to image.EDS-specific fix location:
Check the full heading structure of the page:
Check: exactly one H1.
<h1>. Zero H1s is Critical. Multiple H1s is Critical.Check: logical heading order.
Check: headings used for structure, not styling.
Fix: specify heading level changes in the source document.
Change "Our Services" from Heading 3 to Heading 2 in Google Docs (using the Styles dropdown).For every <a> element on the page:
Check: descriptive link text.
click here, here, read more, learn more, more, link, this, a bare URL, or a single word that does not describe the destination.Check: distinguishable link text.
Check: adjacent duplicate links.
Check: external link indication.
Fix: suggest replacement link text.
Click here to view our services with a link on view our services or better, staffing and recruitment services.Analyze the page's CSS custom properties (typically in styles.css at the site root):
Extract key color variables:
--text-color (or --color-text)--background-color (or --color-background)--link-color (or --color-link)--light-color, --dark-colorCalculate contrast ratios for key pairs:
Check WCAG AA minimums:
Fix: suggest CSS custom property value changes.
styles.css, not in the source document. Example: In styles.css, change --link-color from #999999 to #1a6fb5 to achieve 4.5:1 contrast against the white background.EDS uses a specific pattern for buttons:
<p><strong><a href="...">Button Text</a></strong></p> = primary button<p><em><a href="...">Button Text</a></em></p> = secondary buttonCheck: buttons have accessible names.
Check: button text describes the action.
Submit, Go, or Click without context is Major. Prefer Submit application, View pricing, Download the report.Check: adjacent buttons are visually distinguishable.
Fix location:
styles.css.Check: language attribute.
<html> element must have a lang attribute matching the page language (e.g., lang="en"). WCAG 3.1.1.head.html or site configuration. Missing is Major.lang="en" to the <html> tag in head.html.Check: page title.
<title> must exist and be descriptive of the page content. WCAG 2.4.2.Check: landmarks.
<header>, <main>, and <footer> elements. EDS provides these by default through the boilerplate.<main> do not need ARIA landmarks unless they serve a distinct navigational purpose.Check: list markup.
<ul>, <ol>, or <dl> — not paragraphs with dashes or asterisks. WCAG 1.3.1.Check: skip navigation.
For common EDS blocks, check accessibility patterns. Clearly distinguish document-level fixes from code-level fixes.
Important: Interactive behavior checks (keyboard navigation, focus trapping, ARIA state changes) cannot be verified from static HTML alone. For these checks, flag them as "Requires manual testing" and describe what to test. Only report as a confirmed issue if you can see the code is missing the relevant handlers or ARIA attributes.
role="navigation" or use a <nav> element? (Code fix)aria-expanded state? (Code fix)aria-controls? (Code fix)role="tablist", role="tab", and role="tabpanel"? (Code fix)aria-selected="true"? (Code fix)Produce a structured table of all findings:
| # | WCAG Criterion | Severity | Element | Issue | Fix (Document) | Fix (Code) |
|---|---|---|---|---|---|---|
| 1 | 1.1.1 Non-text Content | Critical | img in hero block | Missing alt text | Add alt text in Google Docs image properties: "Team of engineers reviewing a whiteboard diagram" | -- |
| 2 | 1.3.1 Info and Relationships | Critical | Heading structure | H1 missing; first heading is H2 | Change the first heading to Heading 1 style in Google Docs | -- |
| 3 | 2.4.4 Link Purpose | Major | "Click here" link in paragraph 3 | Non-descriptive link text | Change link text to "view our staffing solutions" in Google Docs | -- |
| 4 | 1.4.3 Contrast Minimum | Major | Body text | Contrast ratio 3.8:1 (needs 4.5:1) | -- | In styles.css, change --text-color from #767676 to #595959 |
| 5 | 2.1.1 Keyboard | Major | Accordion block | Toggles not keyboard-operable | -- | Add keyboard event handlers for Enter/Space in accordion.js |
After the table, provide:
Summary — 2-3 sentences on overall accessibility posture. State the total number of Critical, Major, and Minor issues found.
Document Fixes — list all fixes that a content author applies in Google Docs / Word / da.live. Group by page section (hero, body, footer). Each fix must be specific enough for a non-technical author to execute without developer help.
Code Fixes — list all fixes that require a developer to modify block JavaScript, CSS, or head.html. Group by file.
Compliance Score — rate the page:
| Problem | Cause | Solution |
|---------|-------|----------|
| Cannot fetch the page | Authentication or private network | Ask the user to provide the page HTML directly |
| Cannot fetch styles.css | Non-standard CSS path | Ask the user for the CSS file location or skip contrast checks |
| Block type not recognized | Custom or site-specific block | Apply general accessibility checks (keyboard, ARIA, focus management) |
| Cannot determine image purpose | No surrounding context | Flag the image and ask the user whether it is decorative or informational |
| Contrast check inconclusive | Colors defined dynamically or in block CSS | Note the limitation and recommend manual contrast testing with a tool like axe or the browser devtools contrast picker |
Add alt text: "Warehouse team scanning inventory with handheld devices" not Add alt text to image. Write Change "Click here" link text to "view our staffing solutions" not Improve link text.alt=""), not descriptive alt. Not every section needs an ARIA landmark. Not every link needs to announce it opens externally.tools
Identifies which items (pages, campaigns, products, channels, regions) had the biggest increases or decreases for a key metric between two time periods. Use this skill when someone asks "what's up and what's down," "which campaigns moved the most," "top gainers and losers," "what pages are trending," "show me what changed by channel," or any variation of identifying the biggest movers and decliners for a metric.
tools
Compares the performance of two or more audience segments across key metrics side by side. Use this skill when someone wants to compare audiences, cohorts, or groups — for example, "how do mobile users compare to desktop users on conversion," "compare new vs. returning visitors," "show me the difference between these two segments," "compare these audiences on our KPIs," or "which segment performs better." Also trigger for "segment comparison," "audience comparison," or "cohort comparison."
business
Produces a compact KPI digest showing how key metrics changed over a period and what's driving the movement. Use this skill when someone asks for a performance summary, a weekly recap, a morning briefing, a KPI update, or any variation of "how did we do this week/month." Also trigger for requests like "give me a performance overview," "what moved in the last 7 days," "pull our KPI report," or "summarize our metrics."
testing
Analyzes a multi-step conversion funnel to find where users drop off and which steps have the worst leakage. Use this skill when someone describes a journey or funnel and asks about conversion rates, drop-off, fallout, or step completion. Trigger for phrases like "analyze our onboarding funnel," "where are users dropping off," "what's our checkout conversion rate," "funnel analysis," "show me fallout between these steps," or "which step loses the most users."