Reachable · website accessibility audit · 2026-11-09

Accessibility audit report

2 pages tested against WCAG 2.2 level AA on 2026-11-09, using a real browser (Chromium) with automated rules, measured keyboard and layout behaviour, and an AI review of the evidence. This report lists findings with evidence and fixes. It is not a certification of compliance.

Summary

ClassCriticalSeriousModerateMinorTotal
Findings (detected by rules and measurements)51311029
Likely issues to verify (AI review of the evidence)3106120
Advisory notes3
How to read this report. A finding was detected by a rule or a direct browser measurement and can be reproduced from the evidence shown. A likely issue was identified by an AI reviewer reading the page's structure and screenshots; each one carries its evidence and a confidence label, and should be verified by the person fixing it. Advisory notes are not failures. Severity follows the effect on users: critical blocks a task, serious makes it hard, moderate causes friction, minor is a polish item.

Pages tested

#PageFindingsLikely issuesTab stopsRules passed
1Welcome to CityLights! [Inaccessible Home Page]
https://www.w3.org/WAI/demos/bad/before/home.html
15111414
2Welcome to CityLights! [Inaccessible Survey Page]
https://www.w3.org/WAI/demos/bad/before/survey.html
1491416

Page 1: Welcome to CityLights! [Inaccessible Home Page]

https://www.w3.org/WAI/demos/bad/before/home.html · captured 2026-11-09T01:56:23.844Z

Desktop view at 1280 px wide
Desktop, 1280 px
Mobile view at 320 px wide
320 px (reflow test)

Findings

critical Images must have alternative text 33 instances

1.1.1 Non-text Content (A) · axe-core rule image-alt

To pass, fix one of: Element does not have an alt attribute aria-label attribute does not exist or is empty aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty Element has no title attribute Element's default semantics were not overridden with role="none" or role="presentation"

Evidence

33 elements affected (first 5 shown):

  • img[src$="border_left_top.gif"]
    <img src="./img/border_left_top.gif" width="10px" height="10px">
  • img[src$="border_top.gif"]
    <img src="./img/border_top.gif" height="10px">
  • img[src$="border_right_top.gif"]
    <img src="./img/border_right_top.gif" width="10px" height="10px">
  • img[src$="border_left.gif"]
    <img src="./img/border_left.gif" width="10px">
  • img[src$="top_logo_next_end.gif"]
    <img src="./img/top_logo_next_end.gif" width="24px" height="86px">

Fix: see the rule guidance at https://dequeuniversity.com/rules/axe/4.14/image-alt.

critical Select element must have an accessible name

4.1.2 Name, Role, Value (A) · axe-core rule select-name

To pass, fix one of: Element does not have an implicit (wrapped) <label> Element does not have an explicit <label> aria-label attribute does not exist or is empty aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty Element has no title attribute Element's default semantics were not overridden with role="none" or role="presentation"

Evidence

1 element affected:

  • select
    <select onchange="location.href = this.value;">

Fix: see the rule guidance at https://dequeuniversity.com/rules/axe/4.14/select-name.

serious Elements must meet minimum color contrast ratio thresholds 2 instances

1.4.3 Contrast (Minimum) (AA) · axe-core rule color-contrast

To pass, fix one of: Element has insufficient color contrast of 3.88 (foreground color: #41545d, background color: #a9b8bf, font size: 9.8pt (13px), font weight: bold). Expected contrast ratio of 4.5:1

Evidence

2 elements affected:

  • tr[height="25px"]:nth-child(2) > td[bgcolor="#A9B8BF"][width="150px"] > font[color="#41545D"][size="2"] > b
    <b>Free Penguins</b>
  • tr[height="25px"]:nth-child(7) > td[bgcolor="#A9B8BF"][width="150px"] > font[color="#41545D"][size="2"] > b
    <b>More City Parks</b>

Fix: see the rule guidance at https://dequeuniversity.com/rules/axe/4.14/color-contrast.

serious <html> element must have a lang attribute

3.1.1 Language of Page (A) · axe-core rule html-has-lang

To pass, fix one of: The <html> element does not have a lang attribute

Evidence

1 element affected:

  • html
    <html>

Fix: see the rule guidance at https://dequeuniversity.com/rules/axe/4.14/html-has-lang.

serious Links must have discernible text 7 instances

2.4.4 Link Purpose (In Context) (A) · 4.1.2 Name, Role, Value (A) · axe-core rule link-name

To pass, fix one of: Element is in tab order and does not have accessible text Fix any of the following: Element does not have text that is visible to screen readers aria-label attribute does not exist or is empty aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty Element has no title attribute

Evidence

7 elements affected (first 5 shown):

  • #home > a[onfocus="blur();"]
    <a href="javascript:location.href='home.html';" onfocus="blur();"><img name="nav_home" src="./img/nav_home.gif" width="88" height="27" hspace="15" border="0px"></a>
  • #news > a[onfocus="blur();"]
    <a href="javascript:location.href='news.html';" onfocus="blur();"><img src="./img/nav_news.gif" name="nav_news" width="90" height="21" hspace="12" border="0px"></a>
  • #tickets > a[onfocus="blur();"]
    <a href="javascript:location.href='tickets.html';" onfocus="blur();"><img name="nav_facts" src="./img/nav_facts.gif" width="105" height="23" hspace="9" border="0px"></a>
  • #survey > a[onfocus="blur();"]
    <a href="javascript:location.href='survey.html';" onfocus="blur();"><img src="./img/nav_survey.gif" name="nav_survey" width="107" height="32" hspace="8" border="0px"></a>
  • .story:nth-child(1) > span > a[href$="news.html"][onfocus="blur();"]
    <a href="news.html" onfocus="blur();"><img src="./img/morearrow.gif" width="48" height="10" alt="" border="0" onmouseover="this.src='./img/morearrow_a.gif'" onmouseout="this.src='./img/morearrow.gif'"

Fix: see the rule guidance at https://dequeuniversity.com/rules/axe/4.14/link-name.

serious All touch targets must be 24px large, or leave sufficient space 2 instances

2.5.8 Target Size (Minimum) (AA) · axe-core rule target-size

To pass, fix one of: Target has insufficient size (94px by 20px, should be at least 24px by 24px) Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 16px instead of at least 24px.

Evidence

2 elements affected:

  • .inaccessible > .report[href$="home.html"]
    <a href="./reports/home.html" class="report"><span class="hidden">Inaccessible Home Page </span> Report</a>
  • .accessible > .report[href$="home.html"]
    <a href="../after/reports/home.html" class="report"><span class="hidden">Accessible Home Page </span> Report</a>

Fix: see the rule guidance at https://dequeuniversity.com/rules/axe/4.14/target-size.

serious The page does not declare its language

3.1.1 Language of Page (A) · browser measurement

Evidence

The html element has no lang attribute.

Fix: Add lang="en" (or the page language) to the html element.

serious Form controls submit or navigate as soon as they change

3.2.2 On Input (A) · browser measurement

Evidence

"select": an onchange/onclick handler submits the form or changes the page, so keyboard users moving through the options trigger it by accident.

Fix: Act on a submit button instead, or warn before the control.

serious Changing the drop-down "#page > table > tbody > tr > td > table > tbody > tr:nth-of-type(2) > td:nth-of-type(2) > table:nth-of-type(1) > tbody > tr:nth-of-type(1) > td:nth-of-type(5) > select" submits the form or loads another page

3.2.2 On Input (A) · interaction probe

Evidence

Selecting another option with the keyboard requested https://www.w3.org/WAI/demos/bad/offsite.html without any submit button being pressed; keyboard users stepping through the options trigger it by accident.

Fix: Act on a submit button instead, or warn before the control that it will change the page.

moderate Content does not reflow at 320 CSS px

1.4.10 Reflow (AA) · browser measurement

Evidence

At a 320 px wide viewport the page needs horizontal scrolling (scrollWidth 800 px).

Fix: Use a responsive layout (fluid widths, max-width: 100%, media queries) so content fits 320 px without two-dimensional scrolling.

moderate Layout tables are used for page structure 10 instances

1.3.1 Info and Relationships (A) · 1.3.2 Meaningful Sequence (A) · browser measurement

Evidence

10 table(s) are used for layout without role="presentation", so screen readers announce table structure (1.3.1) and the reading order follows the cells rather than the visual layout (1.3.2).

Fix: Use CSS for layout; if a layout table must stay, add role="presentation".

moderate Links with generic text

2.4.4 Link Purpose (In Context) (A) · browser measurement

Evidence

Link text: "click here".

Fix: Make link text describe the destination, or add visually hidden text.

moderate Same link text points to different destinations

2.4.4 Link Purpose (In Context) (A) · browser measurement

Evidence

"read more..." → 2 targets

Fix: Give each link text that distinguishes its destination.

moderate Mouse-only behaviour

2.1.1 Keyboard (A) · browser measurement

Evidence

7 element(s) react to mouseover/mouseout with no focus/blur equivalent.

Fix: Mirror mouse handlers with focus and blur handlers.

moderate Links with href="#" or javascript: are used as buttons

4.1.2 Name, Role, Value (A) · browser measurement

Evidence

4 link(s): "", "", "", "".

Fix: Use <button> for actions; keep <a> for navigation.

Likely issues to verify

critical The artichoke hotline telephone number is an image of text whose alt text (1234 56789) is not the number shown; a screen-reader user gets a wrong number.

1.1.1 Non-text Content (A) · 1.4.5 Images of Text (AA) · AI review (ai-high) · likely issue – verify

The artichoke hotline telephone number is an image of text whose alt text (1234 56789) is not the number shown; a screen-reader user gets a wrong number.

Evidence

alt='1234 56789' while the image shows the hotline number in stylised text

telefon_white_bg.gif

Fix: Replace the image with real text, or set alt to the exact number shown.

critical The main navigation links (Home, News, Tickets, Survey) remove focus as soon as they receive it (onfocus=blur) and use javascript: URLs, so keyboard users can neither see focus on them nor reliably activate them; the Tab trace skips them entirely (14 stops, none on the nav).

2.4.7 Focus Visible (AA) · 2.1.1 Keyboard (A) · AI review (ai-high) · likely issue – verify

The main navigation links (Home, News, Tickets, Survey) remove focus as soon as they receive it (onfocus=blur) and use javascript: URLs, so keyboard users can neither see focus on them nor reliably activate them; the Tab trace skips them entirely (14 stops, none on the nav).

Evidence

onfocus=blur(); and javascript:location.href= hrefs

a[onfocus="blur();"] on the four image navigation links

Fix: Remove onfocus=blur(); use real hrefs; add visible :focus styles.

serious The site logo is a link to the home page, but its alt text is a 300-character visual description of the artwork instead of the link's purpose.

1.1.1 Non-text Content (A) · AI review (ai-high) · likely issue – verify

The site logo is a link to the home page, but its alt text is a 300-character visual description of the artwork instead of the link's purpose.

Evidence

alt="Red dot with a white letter 'C' that symbolizes a moon crescent as well as the sun. This logo is followed by a black banner..."

top_logo.gif

Fix: alt="CityLights home" (or "CityLights: your access to the city").

serious Visible headings (Welcome to CityLights, Elsewhere on the Web, Free Penguins, More City Parks, the three news titles) are styled text, not heading elements, so there is no heading structure to navigate.

1.3.1 Info and Relationships (A) · AI review (ai-high) · likely issue – verify

Visible headings (Welcome to CityLights, Elsewhere on the Web, Free Penguins, More City Parks, the three news titles) are styled text, not heading elements, so there is no heading structure to navigate.

Evidence

the demo page has no h1-h6 of its own; headings are styled paragraphs and table cells

p 24px 'Welcome to CityLights'; p 20px 'Elsewhere on the Web'; td 'Free Penguins', 'More City Parks'

Fix: Use h1 for 'Welcome to CityLights' and h2/h3 for the section and teaser titles; style with CSS.

serious Links read 'Click here' and 'Read More...' with no indication of the destination; two 'Read More...' links go to different pages, and the three 'MORE' arrow links have empty alt so they have no name at all.

2.4.4 Link Purpose (In Context) (A) · AI review (ai-high) · likely issue – verify

Links read 'Click here' and 'Read More...' with no indication of the destination; two 'Read More...' links go to different pages, and the three 'MORE' arrow links have empty alt so they have no name at all.

Evidence

same link text, different targets; generic text

'Click here' x2 -> ../offsite.html; 'Read More...' -> tickets.html and survey.html; 'MORE' image links with alt=''

Fix: Make link text describe the target ('Read more about Free Penguins'), or add visually hidden text.

serious The QUICKMENU select navigates away as soon as a value is chosen, which keyboard users trigger by arrowing through options, and it has no accessible label.

3.2.2 On Input (A) · 3.3.2 Labels or Instructions (A) · 4.1.2 Name, Role, Value (A) · AI review (ai-high) · likely issue – verify

The QUICKMENU select navigates away as soon as a value is chosen, which keyboard users trigger by arrowing through options, and it has no accessible label.

Evidence

QUICKMENU ----> navigates on change; no Go button; no label

select[onchange="location.href = this.value;"] with no label

Fix: Add a label and a Go button; navigate on submit, not on change.

moderate The 'Elsewhere on the Web' items are a visual list made of bullet images and text, not list markup, so assistive technology cannot announce it as a list of two items.

1.3.1 Info and Relationships (A) · AI review (ai-high) · likely issue – verify

The 'Elsewhere on the Web' items are a visual list made of bullet images and text, not list markup, so assistive technology cannot announce it as a list of two items.

Evidence

two items presented with bullet images and line breaks, no ul/li

'Killer bees. Click here.' / 'Onions. Click here.'

Fix: <ul><li>Killer bees: <a href=...>...</a></li><li>Onions: ...</li></ul>

moderate The layout is nested tables; the DOM order (quick menu, spacer cells, logo, then content) does not match the visual reading order, so a linear reading is confusing.

1.3.2 Meaningful Sequence (A) · AI review (ai-low) · likely issue – verify

The layout is nested tables; the DOM order (quick menu, spacer cells, logo, then content) does not match the visual reading order, so a linear reading is confusing.

Evidence

reading order: 'QUICKMENU' select cell (x=0,y=200) and empty spacer cells precede the logo (250,210), the traffic line and the main content

nested layout tables

Fix: Replace layout tables with CSS layout in reading order: header, navigation, main content, sidebar.

moderate Several in-text links are shown by colour alone with no underline or other cue, so people who cannot perceive the colour difference cannot find them.

1.4.1 Use of Color (A) · AI review (ai-low) · likely issue – verify

Several in-text links are shown by colour alone with no underline or other cue, so people who cannot perceive the colour difference cannot find them.

Evidence

teaser links in grey boxes distinguished by colour only

in-text links: 14 of 46 not underlined (structure.linksNotUnderlined)

Fix: Underline links in running text or add a non-colour cue; keep a 3:1 contrast with surrounding text.

moderate The page itself offers no skip link or landmarks, so keyboard and screen-reader users must pass the quick menu and all navigation on every page.

2.4.1 Bypass Blocks (A) · AI review (ai-high) · likely issue – verify

The page itself offers no skip link or landmarks, so keyboard and screen-reader users must pass the quick menu and all navigation on every page.

Evidence

LANDMARKS [] ; skipLink 'Skip to inaccessible demo page' is outside the demo page

no main/nav landmarks; the only skip link belongs to the W3C wrapper

Fix: Add a 'Skip to main content' link as the first focusable element and main/nav landmarks.

minor Decorative bullet images carry alt text 'bullet', which screen readers announce before each item.

1.1.1 Non-text Content (A) · AI review (ai-high) · likely issue – verify

Decorative bullet images carry alt text 'bullet', which screen readers announce before each item.

Evidence

alt='bullet' on two purely decorative bullet images

list_bullets.gif

Fix: Use a real list (ul/li) with CSS list-style-image, or alt="".

Advisory

minor Links open a new window without warning 2 instances

3.2.5 Change on Request (AAA) · browser measurement · advisory

Evidence

"Click here", "Click here".

Fix: Say "(opens in a new tab)" in the link text or a visually hidden span.

Page 2: Welcome to CityLights! [Inaccessible Survey Page]

https://www.w3.org/WAI/demos/bad/before/survey.html · captured 2026-11-09T01:56:34.563Z

Desktop view at 1280 px wide
Desktop, 1280 px
Mobile view at 320 px wide
320 px (reflow test)

Findings

critical Images must have alternative text 24 instances

1.1.1 Non-text Content (A) · axe-core rule image-alt

To pass, fix one of: Element does not have an alt attribute aria-label attribute does not exist or is empty aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty Element has no title attribute Element's default semantics were not overridden with role="none" or role="presentation"

Evidence

24 elements affected (first 5 shown):

  • img[src$="border_left_top.gif"]
    <img src="./img/border_left_top.gif" width="10px" height="10px">
  • img[src$="border_top.gif"]
    <img src="./img/border_top.gif" height="10px">
  • img[src$="border_right_top.gif"]
    <img src="./img/border_right_top.gif" width="10px" height="10px">
  • img[src$="border_left.gif"]
    <img src="./img/border_left.gif" width="10px">
  • img[src$="top_logo_next_end.gif"]
    <img src="./img/top_logo_next_end.gif" width="24px" height="86px">

Fix: see the rule guidance at https://dequeuniversity.com/rules/axe/4.14/image-alt.

critical Form elements must have labels 11 instances

4.1.2 Name, Role, Value (A) · axe-core rule label

To pass, fix one of: Element does not have an implicit (wrapped) <label> Element does not have an explicit <label> aria-label attribute does not exist or is empty aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty Element has no title attribute Element has no placeholder attribute Element's default semantics were not overridden with role="none" or role="presentation"

Evidence

11 elements affected (first 5 shown):

  • input[value="1"]
    <input class="align" type="radio" name="res" value="1">
  • input[value="2"]
    <input class="align" type="radio" name="res" value="2">
  • input[value="3"]
    <input class="align" type="radio" name="res" value="3">
  • input[value="4"]
    <input class="align" type="radio" name="res" value="4">
  • input[value="5"]
    <input class="align" type="radio" name="res" value="5">

Fix: see the rule guidance at https://dequeuniversity.com/rules/axe/4.14/label.

critical Select element must have an accessible name 2 instances

4.1.2 Name, Role, Value (A) · axe-core rule select-name

To pass, fix one of: Element does not have an implicit (wrapped) <label> Element does not have an explicit <label> aria-label attribute does not exist or is empty aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty Element has no title attribute Element's default semantics were not overridden with role="none" or role="presentation"

Evidence

2 elements affected:

  • select[onchange="location.href = this.value;"]
    <select onchange="location.href = this.value;">
  • select[name="cc"]
    <select name="cc">

Fix: see the rule guidance at https://dequeuniversity.com/rules/axe/4.14/select-name.

serious <html> element must have a lang attribute

3.1.1 Language of Page (A) · axe-core rule html-has-lang

To pass, fix one of: The <html> element does not have a lang attribute

Evidence

1 element affected:

  • html
    <html>

Fix: see the rule guidance at https://dequeuniversity.com/rules/axe/4.14/html-has-lang.

serious Links must have discernible text 4 instances

2.4.4 Link Purpose (In Context) (A) · 4.1.2 Name, Role, Value (A) · axe-core rule link-name

To pass, fix one of: Element is in tab order and does not have accessible text Fix any of the following: Element does not have text that is visible to screen readers aria-label attribute does not exist or is empty aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty Element has no title attribute

Evidence

4 elements affected:

  • #home > a[onfocus="blur();"]
    <a href="javascript:location.href='home.html';" onfocus="blur();"><img name="nav_home" src="./img/nav_home.gif" width="88" height="27" hspace="15" border="0px"></a>
  • #news > a[onfocus="blur();"]
    <a href="javascript:location.href='news.html';" onfocus="blur();"><img src="./img/nav_news.gif" name="nav_news" width="90" height="21" hspace="12" border="0px"></a>
  • #tickets > a[onfocus="blur();"]
    <a href="javascript:location.href='tickets.html';" onfocus="blur();"><img name="nav_facts" src="./img/nav_facts.gif" width="105" height="23" hspace="9" border="0px"></a>
  • #survey > a[onfocus="blur();"]
    <a href="javascript:location.href='survey.html';" onfocus="blur();"><img src="./img/nav_survey.gif" name="nav_survey" width="107" height="32" hspace="8" border="0px"></a>

Fix: see the rule guidance at https://dequeuniversity.com/rules/axe/4.14/link-name.

serious All touch targets must be 24px large, or leave sufficient space 2 instances

2.5.8 Target Size (Minimum) (AA) · axe-core rule target-size

To pass, fix one of: Target has insufficient size (94px by 20px, should be at least 24px by 24px) Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 16px instead of at least 24px.

Evidence

2 elements affected:

  • .inaccessible > .report[href$="survey.html"]
    <a href="./reports/survey.html" class="report"><span class="hidden">Inaccessible Survey Page </span> Report</a>
  • .accessible > .report[href$="survey.html"]
    <a href="../after/reports/survey.html" class="report"><span class="hidden">Accessible Survey Page </span> Report</a>

Fix: see the rule guidance at https://dequeuniversity.com/rules/axe/4.14/target-size.

serious The page does not declare its language

3.1.1 Language of Page (A) · browser measurement

Evidence

The html element has no lang attribute.

Fix: Add lang="en" (or the page language) to the html element.

serious Form controls submit or navigate as soon as they change

3.2.2 On Input (A) · browser measurement

Evidence

"select": an onchange/onclick handler submits the form or changes the page, so keyboard users moving through the options trigger it by accident.

Fix: Act on a submit button instead, or warn before the control.

serious Changing the drop-down "#page > table > tbody > tr > td > table > tbody > tr:nth-of-type(2) > td:nth-of-type(2) > table:nth-of-type(1) > tbody > tr:nth-of-type(1) > td:nth-of-type(5) > select" submits the form or loads another page

3.2.2 On Input (A) · interaction probe

Evidence

Selecting another option with the keyboard requested https://www.w3.org/WAI/demos/bad/offsite.html without any submit button being pressed; keyboard users stepping through the options trigger it by accident.

Fix: Act on a submit button instead, or warn before the control that it will change the page.

moderate Content does not reflow at 320 CSS px

1.4.10 Reflow (AA) · browser measurement

Evidence

At a 320 px wide viewport the page needs horizontal scrolling (scrollWidth 800 px).

Fix: Use a responsive layout (fluid widths, max-width: 100%, media queries) so content fits 320 px without two-dimensional scrolling.

moderate Layout tables are used for page structure 23 instances

1.3.1 Info and Relationships (A) · 1.3.2 Meaningful Sequence (A) · browser measurement

Evidence

23 table(s) are used for layout without role="presentation", so screen readers announce table structure (1.3.1) and the reading order follows the cells rather than the visual layout (1.3.2).

Fix: Use CSS for layout; if a layout table must stay, add role="presentation".

moderate Mouse-only behaviour

2.1.1 Keyboard (A) · browser measurement

Evidence

4 element(s) react to mouseover/mouseout with no focus/blur equivalent.

Fix: Mirror mouse handlers with focus and blur handlers.

moderate Links with href="#" or javascript: are used as buttons

4.1.2 Name, Role, Value (A) · browser measurement

Evidence

4 link(s): "", "", "", "".

Fix: Use <button> for actions; keep <a> for navigation.

moderate Radio buttons are not grouped with a fieldset and legend

1.3.1 Info and Relationships (A) · browser measurement

Evidence

2 group(s) (name "res", "t"): a screen-reader user hears each option without the question it answers.

Fix: Wrap each group in <fieldset> with a <legend> that states the question, or use role="radiogroup" with aria-labelledby.

Likely issues to verify

critical Image navigation links blur on focus and use javascript: URLs.

2.4.7 Focus Visible (AA) · 2.1.1 Keyboard (A) · AI review (ai-high) · likely issue – verify

Image navigation links blur on focus and use javascript: URLs.

Evidence

image navigation not in the tab sequence

a[onfocus="blur();"] x4

Fix: Remove onfocus=blur(); real hrefs; :focus styles.

serious The newsletter form gives no instructions: nothing says which fields are required or what format is expected, and the texts 'eMail Address' and 'Retype eMail' appear under the boxes without being associated to them, so a screen-reader user hears unlabelled text fields.

3.3.2 Labels or Instructions (A) · AI review (ai-high) · likely issue – verify

The newsletter form gives no instructions: nothing says which fields are required or what format is expected, and the texts 'eMail Address' and 'Retype eMail' appear under the boxes without being associated to them, so a screen-reader user hears unlabelled text fields.

Evidence

no instructions on which fields are required, what format the e-mail needs, or that the two e-mail fields must match; 'eMail Address' and 'Retype eMail' texts sit below their boxes with no for/id

inputs em, n, ev (text), radios t (Mr./Mrs.), submit

Fix: Use label for= each input, put labels before the fields, mark required fields in text, and say the e-mail must be typed twice.

serious The radio button groups have no fieldset/legend, so the question each group answers is not announced with the buttons, and the six park options are not exposed as one group.

1.3.1 Info and Relationships (A) · 3.3.2 Labels or Instructions (A) · AI review (ai-high) · likely issue – verify

The radio button groups have no fieldset/legend, so the question each group answers is not announced with the buttons, and the six park options are not exposed as one group.

Evidence

the question 'Which is your favorite city park?' is a bold cell, not a legend; six radios share a name but no fieldset

radio groups name=res (6 options) and name=t (2 options); fieldsets: 0

Fix: <fieldset><legend>Which is your favorite city park?</legend> ... </fieldset> and the same for Mr./Mrs.

serious The city select has no label; its only hint is a placeholder option 'select a city ----->' and a bold question in a separate cell, and a list of roughly 200 cities with no grouping.

3.3.2 Labels or Instructions (A) · AI review (ai-high) · likely issue – verify

The city select has no label; its only hint is a placeholder option 'select a city ----->' and a bold question in a separate cell, and a list of roughly 200 cities with no grouping.

Evidence

the question 'Which city do you find is the greenest?' is a bold cell above, not a label

select name=cc; first option 'select a city ----->'; no label; axe select-name

Fix: Add label for= the select; group options with optgroup by region.

serious The quick menu jumps to a new page as soon as a keyboard user arrows to an option, and the city select is a single ungrouped list of about 200 entries, so both are hard or impossible to use by keyboard alone.

2.1.1 Keyboard (A) · 3.2.2 On Input (A) · AI review (ai-low) · likely issue – verify

The quick menu jumps to a new page as soon as a keyboard user arrows to an option, and the city select is a single ungrouped list of about 200 entries, so both are hard or impossible to use by keyboard alone.

Evidence

navigation on change; very long select

select[onchange="location.href = this.value;"] (QUICKMENU); select name=cc with ~200 ungrouped options

Fix: Navigate on an explicit Go button; group cities with optgroup.

serious The form is laid out with nested tables: the e-mail field names come after the boxes, and the park options read across the two columns (None, Jurassic Park, Central Park, South Park, ...) rather than down, so the sequence read by assistive technology is not the one a sighted user sees.

1.3.2 Meaningful Sequence (A) · 2.4.3 Focus Order (A) · 3.3.2 Labels or Instructions (A) · AI review (ai-high) · likely issue – verify

The form is laid out with nested tables: the e-mail field names come after the boxes, and the park options read across the two columns (None, Jurassic Park, Central Park, South Park, ...) rather than down, so the sequence read by assistive technology is not the one a sighted user sees.

Evidence

reading order of the form does not match the visual order

23 layout tables; 'eMail Address' / 'Retype eMail' texts follow their inputs in DOM order; park options in two columns of a table (DOM order None, Jurassic Park, Central Park, South Park...)

Fix: Drop the layout tables; one label-before-field per line; a single list of options.

serious The page's headings are styled paragraphs, not h1-h3.

1.3.1 Info and Relationships (A) · AI review (ai-high) · likely issue – verify

The page's headings are styled paragraphs, not h1-h3.

Evidence

no heading elements on the page itself

p 24px 'Citylights Survey', 'This Week's Survey: ...', 'Last Weeks's Survey Results'

Fix: Use h1/h2 elements.

moderate The results table's question is not its caption, the row labels 'love it'/'hate it' and column labels are bold cells rather than headers, and empty cells stand for zero, so the relationships between organs and votes are not available to assistive technology.

1.3.1 Info and Relationships (A) · AI review (ai-low) · likely issue – verify

The results table's question is not its caption, the row labels 'love it'/'hate it' and column labels are bold cells rather than headers, and empty cells stand for zero, so the relationships between organs and votes are not available to assistive technology.

Evidence

question is a bold paragraph, not a caption; empty cells carry no value

results table 'What is your favorite and least favorite organ?'; row labels 'love it' / 'hate it' bold cells; empty cells for zero

Fix: Use caption, th scope=col/row, and put 0 in empty cells.

moderate No skip link or landmarks on the page itself.

2.4.1 Bypass Blocks (A) · AI review (ai-high) · likely issue – verify

No skip link or landmarks on the page itself.

Evidence

LANDMARKS []

no landmarks or in-page skip link

Fix: Add a skip link and landmarks.

Advisory

minor Data tables without a caption or name 12 instances

1.3.1 Info and Relationships (A) · browser measurement · advisory

Evidence

12 table(s) with header cells have no <caption>, aria-label or aria-labelledby.

Fix: Add a <caption> that says what the table contains.

minor Tight line spacing 3 instances

1.4.8 Visual Presentation (AAA) · browser measurement · advisory

Evidence

3 paragraph(s) have a line height under 1.2 times the font size.

Fix: Set line-height to at least 1.5 for body text.

Method, coverage and limits

Method. Each page was loaded in headless Chromium at 1280 px, 640 px and 320 px. Automated rules: axe-core 4.14 (WCAG 2.0/2.1/2.2 A and AA tags). Measurements: Tab-order trace with computed focus styles, horizontal overflow at 320 px, heading and landmark structure, table and list structure, form labelling, link text, event handlers, document language and title. Interaction probes: drop-down menus compared on hover versus keyboard focus; buttons and pop-up triggers activated with Enter, then checked for focus movement, Tab containment, Escape and a dialog role; where ordered, forms submitted empty to observe how errors are shown and announced. AI review: a reviewer model read the extracted structure (links, images and their alt text, form fields, text blocks with font metrics, reading order, handlers) and the screenshots, and reported likely issues with evidence and a confidence label.

Interaction probes. Page 1: 0 drop-down menus tested for hover-only behaviour, 2 controls activated with Enter (0 opened a pop-up, checked for focus, Escape and role), 0 form(s) submitted empty to observe validation; 1 select, radio or check-box control(s) changed to see whether they submit or navigate. Page 2: 0 drop-down menus tested for hover-only behaviour, 5 controls activated with Enter (0 opened a pop-up, checked for focus, Escape and role), 1 form(s) submitted empty to observe validation (1 navigated to another page on submit: the server handled validation, so the error messages were not observed); 4 select, radio or check-box control(s) changed to see whether they submit or navigate.

Coverage. Automated rules alone find roughly a fifth to a half of real accessibility defects; this audit adds measured keyboard and layout checks and a structured review of the rest. It does not include testing with a screen reader or by people with disabilities, does not test content behind logins or after form submission unless listed above, and reflects the pages as captured on the date shown.

What this report is not. It is not a legal opinion and not a certification that the site conforms to WCAG or to any law. Fixing every item here will remove the defects found; it does not guarantee that no others exist.

Accessibility statement (draft)

[Organisation] is committed to making [site] accessible to everyone. We aim to meet WCAG 2.2 level AA. An audit of [N] pages on 2026-11-09 found [X] issues, which we are fixing; the items still open are listed at [link]. If you have difficulty using any part of this site, contact [email / phone] and we will provide the content in another form. This statement was updated on 2026-11-09.