Evaluation report
A self-evaluation of this site against WCAG 2.2 Level AA, following W3C’s WCAG-EM 2.0. Carried out on 2 November 2026.
The result
The site does not meet WCAG 2.2 AA. Of the 55 Level A and AA success criteria:
- 24 passed.
- 17 failed on ordinary pages.
- 3 failed only on the two planted pages, which exist to fail.
- 11 have nothing on the site to apply to.
These counts are not a score: WCAG has none, and one failure can block someone completely. This is the record of one evaluation, not a conformance claim. It covers the site as it stood at commit 1724f83, and the accessibility statement says what has changed since.
WCAG-EM allows a formal evaluation statement only when every page meets the target, and partial conformance only for third-party content or unsupported languages. The planted pages fail on purpose and are neither, so this site can publish a report like this one, but not that statement.
Scope
- Product
- All content on accessible-by-default.dev: 19 pages with their dialogs, popovers, open details and demo states. There is no third-party content. Machine-readable files such as the feed and the llms text files were not evaluated.
- Conformance target
- WCAG 2.2 Level AA.
- Accessibility support baseline
- Current Chrome, Firefox and Safari on macOS, Safari on iOS, and VoiceOver on the Mac.
- Additional requirements
- Every page rather than a sample, in all ten colour schemes of the theme picker. Failures on the planted pages are reported and marked as planted.
What the site is made of
- Technologies relied upon
- HTML, CSS, JavaScript, WAI-ARIA and SVG. Pages are prerendered from Vue 3 at build time, and their text is the same with JavaScript off.
- Essential functionality
- Reading the chapters, choosing a colour scheme that persists, trying the demos and their “Break this rule” toggles, working through the practice rooms, copying code, and reporting a barrier.
- Types of page
- The home page, chapters with live demos, reference sheets, practice rooms that frame a planted page, tool pages, the style guide and legal pages on their own frame, a static 404, and the two planted pages.
The sample
Every page was evaluated, so there was nothing to sample and no random sample to compare, as WCAG-EM allows for a site this small.
- Home
- The standard
- The craft
- CSS showcase
- The proof
- Glossary
- Agent skill
- Checks package
- Accessibility statement
- Screen reader
- DevTools
- Audit room
- Listening room
- Style guide
- Impressum
- Privacy
- Page not found
- Broken page, planted, fails on purpose
- Broken press kit, planted, fails on purpose
No series of pages forms a process that has to be completed, so that step of the method added nothing. The form, the demos and the rooms were still operated, under the criteria below.
Results by criterion
A result is the worst found on any page in any of the ten colour schemes. Each failure names one example at least, and “planted” marks one found only on the two planted pages.
Perceivable
- 1.1.1 Non-text Content (Level A)
- Failed, on the planted pages only. A photo with no alt text, another named by its filename, and a logo heading with no name. On the other 17 pages, about 550 graphics are named, or hidden beside text that says the same thing.
- 1.2.1 Audio-only and Video-only (Prerecorded) (Level A)
- Not present. No audio or video on any page.
- 1.2.2 Captions (Prerecorded) (Level A)
- Not present. No audio or video on any page.
- 1.2.3 Audio Description or Media Alternative (Prerecorded) (Level A)
- Not present. No audio or video on any page.
- 1.2.4 Captions (Live) (Level AA)
- Not present. No audio or video on any page.
- 1.2.5 Audio Description (Prerecorded) (Level AA)
- Not present. No audio or video on any page.
- 1.3.1 Info and Relationships (Level A)
- Failed. Each slider’s label on the showcase’s theme picker wraps an output element and binds to that, so neither slider is tied to its label, in all three engines (failure F111). Headings, tables, lists and groups elsewhere are marked up properly. Whether Safari keeps list semantics on lists without markers was not measured.
- 1.3.2 Meaningful Sequence (Level A)
- Passed. Reading order keeps its meaning on every page at 390, 768 and 1280 pixels wide.
- 1.3.3 Sensory Characteristics (Level A)
- Passed. Instructions were searched on every page with all details open. Any that mention position, colour or shape also name the thing itself.
- 1.3.4 Orientation (Level AA)
- Passed. Every page works in portrait and landscape in Chromium and WebKit, and nothing locks orientation in the CSS or the web app manifest.
- 1.3.5 Identify Input Purpose (Level AA)
- Failed. The craft form asks for a display name and an email address with no autocomplete tokens, although the site’s own 1.3.5 demo has them. The form sends nothing, but the criterion has no exception for that.
- 1.4.1 Use of Color (Level A)
- Failed. Two showcase demos: the service status dots differ only by colour until a checkbox adds cues, and the email fields show valid and invalid only by border colour (red against green is 1.08:1). Links in running text are all underlined.
- 1.4.2 Audio Control (Level A)
- Not present. Nothing on the site plays sound.
- 1.4.3 Contrast (Minimum) (Level AA)
- Failed. Measured across about 33,000 text nodes in ten colour schemes. In the default schemes: the current chapter’s number in the contents and the hover tint on chapter and home page links (4.36:1 light, 3.93:1 dark), white text on the scroll-snap cards in dark (3.3:1), the top row of What changed in dark (4.19:1), one dimmed sentence in the hiding matrix (4.17:1 light), and placeholders on styled fields (3.62:1 in Chromium dark, 4.06:1 in Firefox light, 2.35:1 in WebKit light). In presets: the code language tag (down to 4.01:1) and the tag above the room previews (down to 3.72:1). The CI axe sweep missed all of this: the sheet’s grid is a gradient, so axe could not decide most text.
- 1.4.4 Resize Text (Level AA)
- Failed. The theme panel cannot scroll. At 200% zoom in a 1280 by 900 window, 3 of its 11 options sit below the screen and the page moves behind the panel instead, on 13 pages in all three engines. Page text itself reaches 200% with nothing lost.
- 1.4.5 Images of Text (Level AA)
- Passed. The one image of text compares an exported label with real text. Being an image is the point of that comparison, so the essential exception applies.
- 1.4.10 Reflow (Level AA)
- Failed. The same panel: at 320 by 256 pixels, 8 of 11 options are out of reach, and at 320 by 568, one is. Everything else reflows on every page. Code blocks and the coverage table scroll in their own regions, which the criterion allows.
- 1.4.11 Non-text Contrast (Level AA)
- Failed. The service status dots (Degraded is 2.92:1 in default light, with no other cue) and the coverage table’s glyphs in six presets (down to 2.29:1). Text fields, selects and focus rings pass in all ten schemes.
- 1.4.12 Text Spacing (Level AA)
- Passed. With WCAG’s four spacing overrides, no text was lost at 320 pixels wide in three engines, or at 1280 in Chromium.
- 1.4.13 Content on Hover or Focus (Level AA)
- Failed. The showcase’s tooltip demo opens on hover and focus, covers neighbouring content and ignores Esc in all three engines, as its own note admits. Glossary cards and the interestfor demo can be dismissed.
Operable
- 2.1.1 Keyboard (Level A)
- Failed. Every control works by keyboard, but the style guide’s three motion swatches respond only to hover. The spelling demo’s resize handle takes no keyboard either, but keyboard zoom reaches the same result and the demo says so.
- 2.1.2 No Keyboard Trap (Level A)
- Passed. Tab walks left every page, forward and backward: about 11,000 stops across three engines at two widths.
- 2.1.4 Character Key Shortcuts (Level A)
- Not present. The site has no keyboard shortcuts.
- 2.2.1 Timing Adjustable (Level A)
- Passed. The only timer resets a Copied message after two seconds, which limits nothing: pressing Copy again gives the same information.
- 2.2.2 Pause, Stop, Hide (Level A)
- Failed, on the planted pages only. A badge bounces for ever on the broken page and in its preview on the audit room, even under reduced motion, with no way to stop it. The room warns about it and links past it. The loops on the craft page have working stop controls.
- 2.3.1 Three Flashes or Below Threshold (Level A)
- Passed. Every looping animation runs at 900 milliseconds or slower, on small boxes.
- 2.4.1 Bypass Blocks (Level A)
- Passed. The 13 pages on the main frame start with a working skip link. The legal pages, style guide and 404 have two links or fewer before main, and rely on landmarks and headings.
- 2.4.2 Page Titled (Level A)
- Passed. All 19 titles are unique and describe their page.
- 2.4.3 Focus Order (Level A)
- Passed. No positive tabindex anywhere. Dialogs and popovers take focus and give it back, and focus follows the reading order.
- 2.4.4 Link Purpose (In Context) (Level A)
- Passed. Repeated names such as View source on GitHub are told apart by the heading above them. The only “click here” links are planted.
- 2.4.5 Multiple Ways (Level AA)
- Passed. The home page links to every page, and each has a further route through the footer or the chapter navigation. A judgement call: the two planted pages have one inbound link each, and count here as specimens outside the site’s set of pages.
- 2.4.6 Headings and Labels (Level AA)
- Passed. All 186 unique headings and 169 unique control labels were read, and each describes its topic or purpose. Skipped heading levels are a separate gap, not a failure of this criterion.
- 2.4.7 Focus Visible (Level AA)
- Failed, on the planted pages only. One button removes its outline. On every other page, pixels changed at each of about 5,400 focus stops in three engines.
- 2.4.11 Focus Not Obscured (Minimum) (Level AA)
- Passed. No focused element was entirely hidden, over about 11,000 stops at two widths.
- 2.5.1 Pointer Gestures (Level A)
- Not present. No multipoint or path gestures: the only swiping is native scrolling.
- 2.5.2 Pointer Cancellation (Level A)
- Passed. Actions run on click, so they finish on release, and no code listens for pointer down.
- 2.5.3 Label in Name (Level A)
- Failed. The theme picker’s two sliders show labels and have no name at all. Two narrower cases: chapter bar links show 01 Standard but are named Standard, and a code block’s button shows Copied while still named Copy.
- 2.5.4 Motion Actuation (Level A)
- Not present. Nothing responds to device motion.
- 2.5.7 Dragging Movements (Level AA)
- Passed. Sliders also respond to a click on the track. The one CSS resize handle is the browser’s own, which the criterion exempts.
- 2.5.8 Target Size (Minimum) (Level AA)
- Passed. About 2,000 targets were measured at two widths. Small ones sit in sentences or have room around them, and the carousel’s dots pass because its next arrow does the same job.
Understandable
- 3.1.1 Language of Page (Level A)
- Passed. All 19 pages set lang to en, and English is their main language.
- 3.1.2 Language of Parts (Level AA)
- Failed. German phrases in the answers on both rooms have no lang attribute: “sind vier Musiker”, “roh und direkt” and “ausverkauft”.
- 3.2.1 On Focus (Level A)
- Passed. Walking every page by keyboard changed no context. Glossary cards open on focus in Chromium, but move nothing.
- 3.2.2 On Input (Level A)
- Passed. About 90 inputs were operated in each engine, with no change of context.
- 3.2.3 Consistent Navigation (Level AA)
- Failed. The legal pages and style guide differ from the rest: the back link and the brand link swap places, and Home comes first in the style guide’s footer but last on the legal pages. The 13 pages on the main frame are consistent.
- 3.2.4 Consistent Identification (Level AA)
- Failed. One destination has several names: Index on the main frame, then Back to the site and Home on the legal pages and style guide.
- 3.2.6 Consistent Help (Level A)
- Failed. A judgement call, from the same cause as 3.2.3: the footer links to the pages with contact details move relative to Home. They count as help through the criterion’s note on direct links.
- 3.3.1 Error Identification (Level A)
- Failed. The craft form is fine: the browser moves focus to the field and says what is wrong. The showcase’s two validation fields sit outside any form, so a wrong entry only turns a border red, with no text.
- 3.3.2 Labels or Instructions (Level A)
- Passed. Every input has a visible label or instructions, and radio groups have legends.
- 3.3.3 Error Suggestion (Level AA)
- Passed. The craft form’s messages and its permanent hint say what to enter, and the showcase’s caption says the field needs an email address.
- 3.3.4 Error Prevention (Legal, Financial, Data) (Level AA)
- Not present. No legal or financial data is taken, and the one form sends nothing.
- 3.3.7 Redundant Entry (Level A)
- Passed. There is no real multi-step process, and the one mock keeps its reuse option available.
- 3.3.8 Accessible Authentication (Minimum) (Level AA)
- Not present. There is no sign-in anywhere.
Robust
- 4.1.2 Name, Role, Value (Level A)
- Failed. Judged from code and accessibility trees. The theme picker’s two sliders have no name. Two showcase dialogs have none either, a weaker case: ARIA requires one, but WCAG’s wording is less clear.
- 4.1.3 Status Messages (Level AA)
- Failed. Judged from code and accessibility trees, and a judgement call on one case: ticking the more contrast simulation rewrites a line reporting the result, outside any live region. Copy, Save and the other readouts use role status.
Conformance requirements
- Conformance level
- Not reached: see the results by criterion.
- Full pages
- Failed. Every part of every page was evaluated. The audit room and the listening room show a planted page in a preview, and a page cannot leave part of itself out, so those two cannot conform while the previews stay.
- Complete processes
- Not present. No series of pages forms a process.
- Accessibility-supported ways of using technologies
- Cannot tell. The features relied on are long-established native HTML, and newer ones have working fallbacks, but no assistive technology was run, so this rests on code and accessibility trees.
- Non-interference
- Failed through planted content only: the audit room’s preview runs the bouncing badge with no way to stop it, and 2.2.2 applies to all of a page.
How it was done
- Evaluator
- Claude, an AI model made by Anthropic, working in Claude Code. A separate pass by other agents then judged every criterion without seeing the first, and a skeptic challenged each result. That pass found failures the first had missed and reversed some of its calls.
- Commissioner and owner
- Thomas Sweet
- Date
- 2 November 2026
- Method
- WCAG-EM 2.0, the W3C Group Note of 23 July 2026.
- Tools
- Playwright 1.64.1 driving Chromium 156, Firefox 157 and WebKit 27.2 on macOS, axe-core 4.14.0, pixel sampling for text on gradients, and reading the source and every page’s text.
- What was not done
- No assistive technology was run, and neither Safari nor a real iPhone was used: WebKit is not Safari. No people with disabilities took part, which WCAG-EM strongly recommends. A pass here means no failure was found, not that nobody will meet a barrier.
Check it yourself
The same report as JSON opens in W3C’s WCAG-EM Report Tool, and its results use the EARL vocabulary, so other tools can read them. Disagree with a result? File a barrier report.