Accessibility Conformance Report
Based on VPATĀ® (Voluntary Product Accessibility Template) Version 2.5Rev, Web Content Accessibility Guidelines (WCAG) edition, covering WCAG 2.2 Level A and AA. The plain-language version is the accessibility statement.
Product information
- Name of product
- stevemcgarvey.me (personal website)
- Version
- Live site as of
- Report date
- (revised; first published )
- Product description
- Personal site of Steve McGarvey: essays and notes, a reading list, work history, public portfolio case studies, and site search. Built with Astro, hosted on Cloudflare Workers.
- Contact
- steve@upstreamxd.com
Notes
- Scope: all public pages on the live site, including the 404 page and the portfolio password page and its error state.
- Out of scope: the two password-protected case studies. They aren't publicly available, so they weren't evaluated.
- Third-party content: site search is Pagefind, which is part of the site and was tested. Comments are giscus, a third-party widget that loads only when a reader selects "Show comments." Where giscus affects a result, the remark says so.
- Imported writing: twelve essays were imported from Medium. They were checked for heading structure and alt text along with the rest of the site.
- Beyond this report: a review against the Working Draft of WCAG 3.0 led to abbreviations spelled out at first use (WCAG 2.2 success criterion 3.1.4, Level AAA, which this report doesn't evaluate) and dates marked up with
<time>. Abbreviations in titles carry a tooltip instead. These don't change any result below.
Evaluation methods used
- Automated: axe-core 4.10.2 (WCAG 2.0 to 2.2 A and AA, plus best-practice rules) on the live site, in light and dark themes.
- Scripted DOM (Document Object Model) checks on 21 templates: headings, landmarks, accessible names, alt text, link text, target size, title attributes, autoplay.
- Keyboard: real Tab and Enter events, with focus order, visibility, and obscuring logged.
- Reflow and spacing: 320 CSS px reflow and the WCAG 1.4.12 text-spacing override, each on 22 templates.
- Contrast: computed from the design tokens for every text and focus pairing, in both themes.
- Screen reader: a 40-case manual VoiceOver protocol on macOS 27.0.1 and Safari 27.0.1, with default verbosity and hints on. Safari's "Press Tab to highlight each item on a webpage" setting was turned on. Issues found during the pass were fixed the same day and retested.
- revision: changes to case-study tables, figure captions, dark-theme muted text, homepage series cards, abbreviations, and date markup were checked on the live site with scripted DOM checks across all public pages and with contrast math. A VoiceOver spot check of a case-study table passed. The axe-core scan and the full VoiceOver pass were not re-run for this revision.
Applicable standards
- WCAG 2.2 Level A: included
- WCAG 2.2 Level AA: included
- WCAG 2.2 Level AAA: not included
Terms
- Supports:
- the functionality meets the criterion without known defects, or meets it with equivalent facilitation.
- Partially Supports:
- some functionality doesn't meet the criterion.
- Does Not Support:
- the majority of functionality doesn't meet the criterion.
- Not Applicable:
- the criterion isn't relevant to the product.
- Not Evaluated:
- the product hasn't been evaluated against the criterion. Only used for AAA.
WCAG 2.2 report
Table 1: Success Criteria, Level A
| Criteria | Conformance level | Remarks and explanations |
|---|---|---|
| 1.1.1 Non-text Content | Supports | Content images have descriptive alt text. Decorative images (book covers next to visible titles) have empty alt. Figures read alt, then a new-tab hint, then a caption that adds to the alt rather than repeating it. The caption also says, visibly, that the full-size image opens in a new tab. |
| 1.2.1 Audio-only and Video-only (Prerecorded) | Not Applicable | No audio or video content. |
| 1.2.2 Captions (Prerecorded) | Not Applicable | No video content. |
| 1.2.3 Audio Description or Media Alternative (Prerecorded) | Not Applicable | No video content. |
| 1.3.1 Info and Relationships | Supports | Headings, lists, landmarks, description lists, tables, and form labels are coded in markup. Lists styled without bullets carry role="list" so Safari keeps list semantics. Case-study tables mark each row label as a row header, and none has an empty header row. |
| 1.3.2 Meaningful Sequence | Supports | Reading order matches visual order, including margin notes, which read beside the paragraph they annotate. |
| 1.3.3 Sensory Characteristics | Supports | Instructions don't rely on shape, size, position, or sound alone. Image descriptions that mention left and right also name what's there. |
| 1.4.1 Use of Color | Supports | Links in body text are underlined. The password error is shown as text, not only as a red border. |
| 1.4.2 Audio Control | Not Applicable | No audio plays automatically. |
| 2.1.1 Keyboard | Supports | All links, buttons, search, comments, and the password form work from the keyboard. In Safari, Tab reaches links only when "Press Tab to highlight each item" is on (Option + Tab otherwise), which is a browser setting. |
| 2.1.2 No Keyboard Trap | Supports | Tab order cycles through each page and back out without traps. |
| 2.1.4 Character Key Shortcuts | Not Applicable | The site defines no keyboard shortcuts. |
| 2.2.1 Timing Adjustable | Not Applicable | No time limits. |
| 2.2.2 Pause, Stop, Hide | Not Applicable | No moving, blinking, scrolling, or auto-updating content. |
| 2.3.1 Three Flashes or Below Threshold | Supports | No flashing content. |
| 2.4.1 Bypass Blocks | Supports | A skip link is the first focusable item and moves focus to the main content. Landmarks and headings also allow navigation. |
| 2.4.2 Page Titled | Supports | Every page has a unique, descriptive title, including the 404 page. After a failed password attempt, the title starts with "Error:". |
| 2.4.3 Focus Order | Supports | Focus follows reading order. "Show comments" moves focus to the Comments heading. A failed password attempt moves focus to the error message. |
| 2.4.4 Link Purpose (In Context) | Supports | Link names describe their destination. Repeated links such as "View case study" and "Read the series" include the item's name. |
| 2.5.1 Pointer Gestures | Not Applicable | No multipoint or path-based gestures. |
| 2.5.2 Pointer Cancellation | Supports | Controls are native links and buttons that activate on release. |
| 2.5.3 Label in Name | Supports | Accessible names begin with the visible label, e.g. writing cards read the visible type label and then the title. |
| 2.5.4 Motion Actuation | Not Applicable | No motion-triggered functions. |
| 3.1.1 Language of Page | Supports | lang="en" on every page. |
| 3.2.1 On Focus | Supports | Focus doesn't trigger a change of context. |
| 3.2.2 On Input | Supports | Typing in search updates the results on the same page, with no change of context. |
| 3.2.6 Consistent Help | Supports | The contact email and Accessibility link are in the same footer position on every page. |
| 3.3.1 Error Identification | Supports | A wrong password returns a text error ("That password didn't work. Check it and try again."), marks the field invalid, and links the error as the field's description. VoiceOver announces it on load. |
| 3.3.2 Labels or Instructions | Supports | Every field has a visible label. Remark: on the portfolio overview, VoiceOver announced only "Password" for the password field, without its type or required state. The markup has the label, type="password", and required. |
| 3.3.7 Redundant Entry | Not Applicable | No multi-step processes. |
| 4.1.1 Parsing | Supports | Obsolete in WCAG 2.2 and treated as always satisfied. Listed for VPAT 2.5 compatibility. |
| 4.1.2 Name, Role, Value | Partially Supports | Site controls expose name, role, and state. Exception: when a reader loads comments, the third-party giscus frame adds a second main landmark to the page. Comments stay readable and operable. Reported upstream as giscus/giscus#1734. Remark: see 3.3.2 on the portfolio overview password field. |
Table 2: Success Criteria, Level AA
| Criteria | Conformance level | Remarks and explanations |
|---|---|---|
| 1.2.4 Captions (Live) | Not Applicable | No live media. |
| 1.2.5 Audio Description (Prerecorded) | Not Applicable | No video content. |
| 1.3.4 Orientation | Supports | No orientation lock. |
| 1.3.5 Identify Input Purpose | Supports | The password field uses autocomplete="current-password". No other fields collect personal data. |
| 1.4.3 Contrast (Minimum) | Supports | Body text 11.2:1 or higher. Muted text 4.51:1 or higher in light theme and 7.83:1 or higher in dark. Checked in both themes. |
| 1.4.4 Resize Text | Supports | Text resizes without loss of content or function. |
| 1.4.5 Images of Text | Supports | Text is real text. Case-study figures are images of design artifacts and annotation boards, where the visual presentation is the subject. Each has full alt text and a full-size version. |
| 1.4.10 Reflow | Supports | No horizontal scrolling at 320 CSS px on any template. |
| 1.4.11 Non-text Contrast | Supports | Focus indicator 6.59:1 to 18.45:1. Password field border 5.33:1. Decorative hairline borders aren't required to meet contrast. |
| 1.4.12 Text Spacing | Supports | No clipped or overlapping text with the text-spacing override. |
| 1.4.13 Content on Hover or Focus | Not Applicable | No content appears on hover or focus. |
| 2.4.5 Multiple Ways | Supports | Main navigation, site search, and index pages for Writing, Reading, and Work. |
| 2.4.6 Headings and Labels | Supports | Headings describe their sections, including repeated subheadings within each step of an essay. Remark: VoiceOver speaks the "Read" heading on the Reading page in the present tense. |
| 2.4.7 Focus Visible | Supports | A visible outline on every focusable element, in both themes. |
| 2.4.11 Focus Not Obscured (Minimum) | Supports | The header isn't sticky, and no focused element is hidden. |
| 2.5.7 Dragging Movements | Not Applicable | No drag interactions. |
| 2.5.8 Target Size (Minimum) | Supports | Targets under 24 by 24 px (the search icon and nav and footer links) meet the spacing exception. The tightest spacing is 25.1 px. |
| 3.1.2 Language of Parts | Supports | Passages in other languages are marked with their language, e.g. a Greek word in "Wolves and Sheep; Serpents and Doves." |
| 3.2.3 Consistent Navigation | Supports | Navigation is in the same order on every page. |
| 3.2.4 Consistent Identification | Supports | Components with the same function have the same name across pages, e.g. "Search". |
| 3.3.3 Error Suggestion | Supports | The password error says what to do next. A specific correction can't be suggested without revealing the password. |
| 3.3.4 Error Prevention (Legal, Financial, Data) | Not Applicable | No legal, financial, or data submissions. |
| 3.3.8 Accessible Authentication (Minimum) | Supports | The password field allows paste and supports password managers. No cognitive function test. |
| 4.1.3 Status Messages | Supports | Search announces the result count ("46 results for accessibility") and "No results" without moving focus. |
Table 3: Success Criteria, Level AAA
Not evaluated.
Report date (revised; first published ). Found something this report gets wrong? Email steve@upstreamxd.com.