Accessibility report

Wonderous

Version 2.2.0 · Flutter, iOS · 8 screens · 2026-09-14

Summary

29defects
1critical
26serious
2moderate

Each defect is one place in the product, however many screens it appeared on.

What this report is

A clean result is not a statement of conformance. It means no automated check found a violation. Conformance with the European Accessibility Act also requires testing by a person — reading the screens with a screen reader, working them with a keyboard, judging whether the wording makes sense — and someone willing to sign for it.

Automated checking finds a minority of real accessibility problems. It is good at what it covers and silent about the rest, and the clause table below says plainly which is which.

Accessibility (EN 301 549)

What the European Accessibility Act asks of an app, through the standard it points at.

RequirementWhat it asksIn forceResultDefects
WCAG 1.1.1 (A) / EN 301 549 §11.1.1.1Non-text ContentNo automated violation
WCAG 1.3.2 (A) / EN 301 549 §11.1.3.2Meaningful SequenceNot satisfied1
WCAG 1.4.3 (AA) / EN 301 549 §11.1.4.3Contrast (Minimum)Not satisfied17
WCAG 1.4.4 (AA) / EN 301 549 §11.1.4.4Resize TextNot satisfied2
WCAG 1.4.11 (AA) / EN 301 549 §11.1.4.11Non-text ContrastNot satisfied1
WCAG 2.3.3 (AAA)Animation from InteractionsNo automated violation
WCAG 2.4.7 (AA) / EN 301 549 §11.2.4.7Focus VisibleNo automated violation
WCAG 2.5.5 (AAA) / EN 301 549 §11.2.5.5Target SizeNot satisfied5
WCAG 4.1.2 (A) / EN 301 549 §11.5.2.5Name, Role, ValueNot satisfied3

“Not checked” means exactly that: nothing in this run looked at it. It is not a pass.

Google Play readiness

Requirements Google Play enforces by hiding or removing an app, rather than by asking.

RequirementWhat it asksIn forceResultDefects
Google Play target-api-levelTarget API level2026-08-31Not checked
Google Play account-deletionAccount and data deletionNot checked

“Not checked” means exactly that: nothing in this run looked at it. It is not a pass.

App Store readiness

Requirements Apple enforces at upload, where a submission is refused rather than queried.

RequirementWhat it asksIn forceResultDefects
App Store privacy-manifestPrivacy manifestNot checked
App Store guideline-4.8Login servicesNot checked
App Store guideline-5.1.1(v)Account deletionNot checked

“Not checked” means exactly that: nothing in this run looked at it. It is not a pass.

Store listing

The forms filled in once by hand — privacy label, Data safety, support URL — held against what went into the build since.

RequirementWhat it asksIn forceResultDefects
App Store app-privacy-detailsApp privacy detailsNot checked
Google Play data-safetyData safetyNot checked
App Store guideline-1.5Support URLNot checked

“Not checked” means exactly that: nothing in this run looked at it. It is not a pass.

Defects

This button has no accessible name; a screen reader announces it as an unnamed button.

criticalunlabeled-interactiveWCAG 4.1.2 (A) / EN 301 549 §11.5.2.5

lib/ui/screens/artifact/artifact_carousel/widgets/_bottom_text_content.dart:45

Wrap it in Semantics(button: true, label: ...), taking the wording from your localisations.

Seen on: Artefacts, Timeline, Collection (3 times)

This button is 17×27, below the Android minimum of 48×48, so it is hard to hit for anyone with limited dexterity.

serioustap-target-sizeWCAG 2.5.5 (AAA) / EN 301 549 §11.2.5.5

lib/ui/common/controls/buttons.dart:200

Grow the tap area without growing the icon: wrap the child in a SizedBox of 48×48, or give the button a minimumSize.

Seen on: Wonder details, Editorial, Photo gallery, Artefacts, Timeline, Collection (43 times)

This button is 42×187, below the Android minimum of 48×48, so it is hard to hit for anyone with limited dexterity.

serioustap-target-sizeWCAG 2.5.5 (AAA) / EN 301 549 §11.2.5.5

lib/ui/screens/photo_gallery/photo_gallery.dart:277

Grow the tap area without growing the icon: wrap the child in a SizedBox of 48×48, or give the button a minimumSize.

Seen on: Editorial, Photo gallery, Artefacts, Timeline, Collection (30 times)

This button is 113×25, below the Android minimum of 48×48, so it is hard to hit for anyone with limited dexterity.

serioustap-target-sizeWCAG 2.5.5 (AAA) / EN 301 549 §11.2.5.5

lib/ui/screens/home/wonders_home_screen.dart:318

Grow the tap area without growing the icon: wrap the child in a SizedBox of 48×48, or give the button a minimumSize.

Seen on: Wonder details, Editorial, Photo gallery, Artefacts, Timeline, Collection (6 times)

"the Great Wall" has a contrast ratio of 2.29:1 against its background, below the 3.0:1 required at 64pt.

serioustext-contrastWCAG 1.4.3 (AA) / EN 301 549 §11.1.4.3

lib/ui/wonder_illustrations/common/wonder_title_text.dart:50

Darken the text or lighten what is behind it. Measured #164F2A against #5B8474.

Seen on: Wonder details, Artefacts, Collection (6 times)

"Last known date recorded in the Osari..." has a contrast ratio of 2.43:1 against its background, below the 4.5:1 required at 16pt.

serioustext-contrastWCAG 1.4.3 (AA) / EN 301 549 §11.1.4.3

lib/ui/common/timeline_event_card.dart:51

Darken the text or lighten what is behind it. Measured #E4935D against #FFFFFF.

Seen on: Artefacts, Timeline, Collection (5 times)

"100" has a contrast ratio of 1.00:1 against its background, below the 4.5:1 required at 16pt.

serioustext-contrastWCAG 1.4.3 (AA) / EN 301 549 §11.1.4.3

lib/ui/screens/timeline/widgets/_year_markers.dart:72

Darken the text or lighten what is behind it. Measured #1E1B18 against #1E1B18.

Seen on: Timeline (5 times)

This button is 114×23, below the Android minimum of 48×48, so it is hard to hit for anyone with limited dexterity.

serioustap-target-sizeWCAG 2.5.5 (AAA) / EN 301 549 §11.2.5.5

lib/ui/screens/artifact/artifact_carousel/widgets/_bottom_text_content.dart:45

Grow the tap area without growing the icon: wrap the child in a SizedBox of 48×48, or give the button a minimumSize.

Seen on: Artefacts, Timeline, Collection (3 times)

"9th–10th century" has a contrast ratio of 1.94:1 against its background, below the 4.5:1 required at 16pt.

serioustext-contrastWCAG 1.4.3 (AA) / EN 301 549 §11.1.4.3

lib/ui/screens/artifact/artifact_carousel/widgets/_bottom_text_content.dart:71

Darken the text or lighten what is behind it. Measured #272625 against #535251.

Seen on: Artefacts, Timeline, Collection (3 times)

This icon is #FFFFFF on #FFFFFF, a contrast ratio of 1.00:1, below the 3.0:1 an icon needs to be made out.

seriousicon-contrastWCAG 1.4.11 (AA) / EN 301 549 §11.1.4.11

lib/ui/screens/home/widgets/_animated_arrow_button.dart:39

Darken or lighten the icon colour. If it is purely decorative and a label beside it already says the same thing, wrap it in ExcludeSemantics so it is not treated as meaningful.

Seen on: Wonder details, Photo gallery, Artefacts (3 times)

A screen reader reaches "back" right after "Facts and History", but it sits 567 pixels higher up the screen, so the reading order jumps backwards.

seriousreading-orderWCAG 1.3.2 (A) / EN 301 549 §11.1.3.2

lib/ui/common/controls/buttons.dart:200

Reorder the widgets, or set an explicit order with Semantics(sortKey: OrdinalSortKey(...)) on this subtree.

Seen on: Wonder details, Timeline (2 times)

"BROWSE ALL ARTIFACTS" has a contrast ratio of 1.13:1 against its background, below the 4.5:1 required at 14pt.

serioustext-contrastWCAG 1.4.3 (AA) / EN 301 549 §11.1.4.3

lib/ui/common/controls/buttons.dart:68

Darken the text or lighten what is behind it. Measured #1E1B18 against #272625.

Seen on: Collection (2 times)

"THE GREAT MAYAN CITY" has a contrast ratio of 4.22:1 against its background, below the 4.5:1 required at 14pt.

serioustext-contrastWCAG 1.4.3 (AA) / EN 301 549 §11.1.4.3

lib/ui/screens/editorial/widgets/_title_text.dart:35

Darken the text or lighten what is behind it. Measured #1E1B18 against #688750.

Seen on: Timeline, Collection (2 times)

"YUCATAN, MEXICO" has a contrast ratio of 4.22:1 against its background, below the 4.5:1 required at 16pt.

serioustext-contrastWCAG 1.4.3 (AA) / EN 301 549 §11.1.4.3

lib/ui/screens/editorial/widgets/_title_text.dart:64

Darken the text or lighten what is behind it. Measured #1E1B18 against #688750.

Seen on: Timeline, Collection (2 times)

"550 CE to 1550 CE" has a contrast ratio of 1.13:1 against its background, below the 4.5:1 required at 14pt.

serioustext-contrastWCAG 1.4.3 (AA) / EN 301 549 §11.1.4.3

lib/ui/screens/editorial/widgets/_title_text.dart:88

Darken the text or lighten what is behind it. Measured #1E1B18 against #272625.

Seen on: Artefacts, Collection (2 times)

"ARTIFACTS" has a contrast ratio of 1.13:1 against its background, below the 4.5:1 required at 14pt.

serioustext-contrastWCAG 1.4.3 (AA) / EN 301 549 §11.1.4.3

lib/ui/common/controls/app_header.dart:43

Darken the text or lighten what is behind it. Measured #1E1B18 against #272625.

Seen on: Timeline

"832" has a contrast ratio of 1.13:1 against its background, below the 3.0:1 required at 24pt.

serioustext-contrastWCAG 1.4.3 (AA) / EN 301 549 §11.1.4.3

lib/ui/common/timeline_event_card.dart:35

Darken the text or lighten what is behind it. Measured #1E1B18 against #272625.

Seen on: Artefacts

"CE" has a contrast ratio of 1.00:1 against its background, below the 4.5:1 required at 14pt.

serioustext-contrastWCAG 1.4.3 (AA) / EN 301 549 §11.1.4.3

lib/ui/common/timeline_event_card.dart:39

Darken the text or lighten what is behind it. Measured #272625 against #272625.

Seen on: Artefacts

"Tripod Plate" has a contrast ratio of 1.00:1 against its background, below the 3.0:1 required at 32pt.

serioustext-contrastWCAG 1.4.3 (AA) / EN 301 549 §11.1.4.3

lib/ui/screens/artifact/artifact_carousel/widgets/_bottom_text_content.dart:22

Darken the text or lighten what is behind it. Measured #272625 against #272625.

Seen on: Collection

At 200% text size the layout breaks: RenderFlex overflows by 19 pixels on the bottom

seriouslayout-overflow-at-scaleWCAG 1.4.4 (AA) / EN 301 549 §11.1.4.4

lib/ui/screens/artifact/artifact_carousel/widgets/_bottom_text_content.dart:38

Let the row wrap, make the column scroll, or give the text room to grow instead of a fixed height.

Seen on: Photo gallery

"0% discovered" has a contrast ratio of 1.55:1 against its background, below the 4.5:1 required at 16pt.

serioustext-contrastWCAG 1.4.3 (AA) / EN 301 549 §11.1.4.3

lib/ui/screens/collection/widgets/_collection_footer.dart:50

Darken the text or lighten what is behind it. Measured #272625 against #544032.

Seen on: Collection

"0 of 24" has a contrast ratio of 2.32:1 against its background, below the 4.5:1 required at 16pt.

serioustext-contrastWCAG 1.4.3 (AA) / EN 301 549 §11.1.4.3

lib/ui/screens/collection/widgets/_collection_footer.dart:55

Darken the text or lighten what is behind it. Measured #272625 against #615D5A.

Seen on: Collection

"COLOSSEUM" has a contrast ratio of 1.00:1 against its background, below the 4.5:1 required at 16pt.

serioustext-contrastWCAG 1.4.3 (AA) / EN 301 549 §11.1.4.3

lib/ui/screens/collection/widgets/_collection_list_card.dart:36

Darken the text or lighten what is behind it. Measured #272625 against #272625.

Seen on: Collection

This button is 146×23, below the Android minimum of 48×48, so it is hard to hit for anyone with limited dexterity.

serioustap-target-sizeWCAG 2.5.5 (AAA) / EN 301 549 §11.2.5.5

lib/ui/screens/intro/intro_screen.dart:259

Grow the tap area without growing the icon: wrap the child in a SizedBox of 48×48, or give the button a minimumSize.

Seen on: Welcome

At 200% text size the layout breaks: RenderFlex overflows by 174 pixels on the right

seriouslayout-overflow-at-scaleWCAG 1.4.4 (AA) / EN 301 549 §11.1.4.4

lib/ui/screens/wonder_events/widgets/_wonder_image_with_timeline.dart:107

Let the row wrap, make the column scroll, or give the text room to grow instead of a fixed height.

Seen on: Artefacts

"550 CE to 1550 CE" has a contrast ratio of 1.13:1 against its background, below the 4.5:1 required at 16pt.

serioustext-contrastWCAG 1.4.3 (AA) / EN 301 549 §11.1.4.3

lib/ui/screens/wonder_events/widgets/_wonder_image_with_timeline.dart:112

Darken the text or lighten what is behind it. Measured #1E1B18 against #272625.

Seen on: Collection

"Early Modern Era" has a contrast ratio of 1.13:1 against its background, below the 4.5:1 required at 16pt.

serioustext-contrastWCAG 1.4.3 (AA) / EN 301 549 §11.1.4.3

lib/ui/screens/wonder_events/widgets/_wonder_image_with_timeline.dart:120

Darken the text or lighten what is behind it. Measured #1E1B18 against #272625.

Seen on: Collection

2 controls on this screen share the accessible name "collectible item", so they cannot be told apart by ear.

moderateduplicate-labelWCAG 4.1.2 (A) / EN 301 549 §11.5.2.5

lib/ui/common/controls/buttons.dart:200

Add what each one acts on, for example "More options for Basket" instead of "More".

Seen on: Photo gallery, Artefacts, Timeline, Collection (21 times)

2 controls on this screen share the accessible name "collectible item", so they cannot be told apart by ear.

moderateduplicate-labelWCAG 4.1.2 (A) / EN 301 549 §11.5.2.5

lib/ui/screens/photo_gallery/photo_gallery.dart:277

Add what each one acts on, for example "More options for Basket" instead of "More".

Seen on: Photo gallery, Artefacts, Timeline (3 times)

Method

Findings were produced by running automated checks against the running app and recording what they reported. Platforms: Flutter, iOS. Screens: Welcome, Home, Wonder details, Editorial, Photo gallery, Artefacts, Timeline, Collection.

Checks run: animates-with-reduce-motion, duplicate-label, icon-contrast, junk-label, layout-overflow-at-scale, no-visible-focus, reading-order, tap-target-size, text-contrast, text-truncated-at-scale, unlabeled-interactive, unnamed-interactive-container.

Signature

The manual testing this report depends on, and the conclusion drawn from it, are the responsibility of the person signing below.

NamecheckApp
Date2026-09-14
Signature