Accessibility
For the Times Tables Games app. The goal is that every child can use it: with a mouse, a touch screen, a keyboard, or a screen reader, at any text size.
The short version
- The standard is WCAG 2.1 Level AA, the one the ADA Title II rule asks schools to meet.
- The app partially conforms: it meets every Level A and AA criterion that applies, except the criteria marked "Partially supports" in the table below, each with the reason.
- Everything works with a keyboard. Questions are said with "times" and "divided by" in words, never a symbol. Questions, right or wrong answers, Balloon pop's answers, the dog game's steps, each card turned in Memory match, and who scored in a two-player game are said in whole sentences to a screen reader.
- Nothing is timed unless a child picks it: a timed test, or in Balloon pop Steady, Quick, or the stopwatch. Every activity has an untimed way to practice.
- Hands-on testing with screen readers is still to come (see How it was checked).
How it was checked
- Version checked: the release of October 23, 2026, and two players on October 24, 2026.
- On October 23, 2026: automated testing with axe-core 4.10.2 on all 17 screens of the app, with no violations of WCAG 2.1 A or AA, plus this page and the privacy page. The script that visits each screen and the results are kept with the source code and can be shared with a district that asks. Where axe could not decide (text drawn on the map, the delete key's symbol), the contrast was checked by hand.
- Also checked by hand: every screen with a keyboard alone; every screen at 320 pixels wide; text at 200%; reduced motion; and a review of the code against each criterion below.
- Later the same day, after Balloon pop and the doghouse were added, axe-core 4.10.2 ran again on all 20 screens, and on Balloon pop's round while moving, paused, after a wrong tap, after the balloons floated away, at 320 pixels wide, and on its results: no violations of WCAG 2.1 A or AA. Where axe could not decide (text drawn on the map, the delete key's symbol, the stars, the numbers under the Paused panel), it was checked by hand. Balloon pop was also checked by hand: a keyboard alone, 320 pixels wide, the two-by-two layout used for text at 200%, the system's reduced-motion setting and Less motion, a hidden tab, and every sentence the status line says.
- Then, after Memory match was added, axe-core 4.10.2 ran on all 21 screens, and on Memory match's board mid-game and finished: no violations of WCAG 2.1 A or AA. axe does not measure the one-character letters on Memory match's cards, so their contrast was checked by hand (6.66:1 and 9.46:1). Memory match was also checked by hand: a keyboard alone, 320 to 1366 pixels wide, text at 200%, the system's reduced-motion setting and Less motion, and every sentence the status line says.
- On October 24, 2026, after two players was added: axe-core 4.10.2 ran in headless Chromium on the home screen and on two players' Ready, a question, one side in, the reveal, and the end, at 1366 by 768 pixels, 667 by 320 (a phone sideways), and 320 pixels wide: no violations of WCAG 2.1 A or AA. axe does not judge one-character marks, so the contrast of ★ (5.59:1), ● (13.97:1), and the key letters and arrows (5.66:1 or more) was checked by hand. Two players was also checked by hand and by script: whole rounds by keyboard, mouse, and touch, with two fingers at once; a touch that slides off its answer or onto the next one; a press held while the answer shows and let go on the next question; focus at Ready, after a choice, and at the end; the heights a phone shows sideways (280 to 340 pixels), 1366 by 580, upright at 375 pixels, 320 pixels wide, and text at 200%.
- On October 25, 2026, every place a fact's sign reached a screen reader as a symbol was changed to words ("7 times 8 is 56"), with the drawn "7 × 8 = 56" kept for sighted children: the line after a miss, the Learn path's table and its Match buttons and announcements, the lists of facts on results screens and at the end of Memory match and two players, Memory match's lines, two players' reveal, the Mixed order hint, and the chart's corner and its cells' tooltips (removed). Screen readers say × differently (NVDA: "times"; others vary), and the app no longer depends on any of them. Balloon pop's question is now said as "7 times 5. Is it 30, 35, 40, or 45?", so the question's numbers stay apart from the answers. A headless check (
tools/screen-check.js, kept with the source code) reads the accessibility tree of every screen, mid-game where the lines only exist mid-game (a miss, a found and a wrong pair, two players' reveal), and fails on a × in any name, description, or the status line; it also checks that the answer box shows a whole three- or four-digit answer at 320 pixels wide in Practice, Balloon pop, and Review, which it had clipped before. - On October 25, 2026, after division was added (a times tables or division choice on the home screen, with every activity carried over):
tools/screen-check.jsran 125 checks in headless Chromium in both operations. In division it reads every screen's accessibility tree mid-game and fails on a × or ÷ in any name, description, or the status line, and on any fact a reader meets said as "times" where it should be "divided by" (the two places it should are the miss line's times fact and the See it table's); it checks the toggle (focus stays on the chosen radio, the status line says the change, the address, storage, and the top bar agree, Back and a reload keep the choice), that a link naming tables but no operation opens times tables, the links from a division screen, the record (a division round writes only division keys and leaves the times record as it was), the chart's example, and 320 pixels wide. The same day axe-core 4.10.2 ran in headless Chromium on 66 division screens, mid-game where it matters (a miss and its times fact, a wrong pair, the two-player reveal, a results screen), at 1366 by 768 and 320 pixels wide: no violations of WCAG 2.1 A or AA. Where axe could not decide, it was color contrast over drawn scenes, as in the earlier runs, and division changes no colors. Still to do for division: listening with VoiceOver on an iPad and a Mac to the division sentences, which the owner does on the branch before this goes live. - On October 26, 2026, Balloon pop's clock for the whole round, live for part of the day, was replaced by a stopwatch, off unless a child turns it on at setup, which counts up from the first question to the twentieth answer and never limits or ends anything. axe-core 4.10.2 ran in headless Chromium on 48 screens: the setup screen with the stopwatch on and with a best time, a stopwatch round (a question, paused, after a miss, the end), and Quick with the stopwatch (a question, after the balloons floated away), at 1366 by 768, 320 by 568, and 375 by 667 with text at 200%, in times tables and in division: no violations of WCAG 2.1 A or AA, nothing scrolling sideways, and the head row inside the card. By script: the stopwatch counts up, stands still while the tab is hidden and while paused, stops at the twentieth answer, gives a screen reader its time in words ("1 minute 20 seconds") wherever it shows as digits, and starts only from the setup screen's Start; a keyboard alone turns it on and plays a round with Less motion on (
tools/balloon-check.js,tools/screen-check.js). - Not yet done: hands-on testing with NVDA and JAWS on Windows, VoiceOver on iPad, and ChromeVox on a Chromebook. Until it is, problems that only real screen readers show may remain. This page will be updated with the versions tested and the results.
Known limitations
- Division has not yet been heard on NVDA, JAWS, ChromeVox, or TalkBack, nor yet on VoiceOver on an iPad or a Mac. The ÷ sign is hidden from every reader and the words said are "divided by", so what differs between readers is only how they say the words.
- A typed answer goes in as soon as it has enough digits. That is how the app keeps practice fast, and Enter or Go also work.
- A shared link can turn on "ten seconds a question" for the speed test before the child sees the switch. The test is optional, and the setup screen shows the switch.
- The diplomas have a fixed time (6 and 8 minutes) and no extended-time option yet. They are optional; practice and the Learn path are untimed.
- In the dog game, the street scene is a picture for sighted children; a screen reader hears the same story in words, one step at a time.
- There is no setting yet to make the app wait for a key press before the next question. After a miss in division in Practice, Review, and Learn's In order and Mixed up stages, the times fact shows while its sentence is said (about three seconds), then the next question comes on its own. In two players, once both children have answered, the answer shows for as long as its sentence takes to say, and at least 2.5 seconds, before the next question.
- In two players, a running screen reader takes the keys and taps for both children: NVDA and JAWS keep W A S D and the arrow keys for themselves in browse mode, and VoiceOver on an iPhone or iPad turns every tap into select and speak. A screen reader player answers by moving to their side's buttons; they will rarely answer first, but their right answers still count on the end screen.
- In Balloon pop at Steady or Quick, the balloons float away after 5 to 12 seconds, and a screen reader takes part of that time to read the question and its four answers. Calm, the default, has no clock. In division the question takes a moment longer to say.
- After a round of Balloon pop at Steady or Quick, or with the stopwatch, Again starts another the same way without showing the setup screen, since the choice was made there a moment before. Back, a link, a bookmark, or a reload shows the setup screen first.
Conformance with WCAG 2.1 Level A and AA
"Supports" means the app meets the criterion; "Partially supports" means it meets it in most places, with the exception noted; "Not applicable" means the app has nothing the criterion covers.
| Criterion | Level | Status | Notes |
|---|---|---|---|
| 1.1.1 Non-text Content | A | Supports | Stars, paw prints, and the progress bars have text names. The animated dog scene is hidden from screen readers, and everything it shows is also said in words. In Balloon pop, each balloon is a button named by its number; its string and the pop are decoration, hidden from screen readers. |
| 1.2.1 Audio-only and Video-only (Prerecorded) | A | Not applicable | No audio or video. |
| 1.2.2 Captions (Prerecorded) | A | Not applicable | No audio or video. |
| 1.2.3 Audio Description or Media Alternative (Prerecorded) | A | Not applicable | No audio or video. |
| 1.2.4 Captions (Live) | AA | Not applicable | No audio or video. |
| 1.2.5 Audio Description (Prerecorded) | AA | Not applicable | No audio or video. |
| 1.3.1 Info and Relationships | A | Supports | Headings, lists, labeled groups, a data table with row and column headers, and labeled form fields. In division the chart's rows are the numbers to divide by and its columns the answers, with the same row and column headers; its caption says so. |
| 1.3.2 Meaningful Sequence | A | Supports | Reading order follows the visual order. In Match, the questions are read as one group, then the answers. In Balloon pop, the question comes first, then the four balloons left to right, the order keys 1 to 4 pick them. In Memory match, the question cards (lettered A to F) are read as one group, then the answer cards (G to L). |
| 1.3.3 Sensory Characteristics | A | Supports | Instructions do not depend on shape, position, or sound. |
| 1.3.4 Orientation | AA | Supports | Works upright and sideways. In two players, the two halves sit side by side when the screen is wide enough, and one above the other when it is not. |
| 1.3.5 Identify Input Purpose | AA | Partially supports | The certificate's name field turns off autofill on purpose, so a parent's saved name is not filled in for the child. The range boxes are numbers, not personal data. |
| 1.4.1 Use of Color | A | Supports | Chart levels have an underline style as well as a color, stars are filled or hollow, chosen controls have an outline, finished steps have a tick, and right or wrong answers are said in words. In two players, each side has a name and a shape (★ Blue, ● Yellow) as well as a color, and a pick is marked by its border and a tick. Balloon colors mean nothing: each place always has the same color, and the right balloon also gets a tick. |
| 1.4.2 Audio Control | A | Not applicable | No sound. |
| 1.4.3 Contrast (Minimum) | AA | Supports | Text is at least 4.5:1 on every background it sits on, including green on the chart's highlight (4.97:1). The app has one light color scheme. |
| 1.4.4 Resize Text | AA | Supports | Text sizes are set in rem, so they follow the browser's text size, and the page zooms to 200%. The street names drawn on the dog's map grow with the map, not with the text size, so the same streets, with their walks and stars, are also listed in text under it ("The streets as a list"). |
| 1.4.5 Images of Text | AA | Supports | All text is real text. The street names on the map are drawn text, not pictures, and are listed as text under the map too. |
| 1.4.10 Reflow | AA | Supports | Every screen fits 320 CSS pixels wide without the page scrolling sideways. The chart table scrolls inside its own box, which the criterion allows for two-dimensional content. A session with long lines, such as 1188 ÷ 12 in division, is drawn smaller on a phone so it stays inside the card at 320 pixels. |
| 1.4.11 Non-text Contrast | AA | Supports | Switches, field and list borders, progress bars, the timer bars, the best-run bar, balloon outlines, and focus outlines are at least 3:1 against what is next to them. |
| 1.4.12 Text Spacing | AA | Supports | Labels wrap rather than being cut off. |
| 1.4.13 Content on Hover or Focus | AA | Supports | Nothing appears on hover or focus. The chart highlights a number's row and column on hover, tap, and focus alike, and each cell's level is in its own text (the chart cells' tooltips were removed on October 25, 2026, so a screen reader no longer meets the × sign in them). |
| 2.1.1 Keyboard | A | Supports | Everything works with a keyboard, including the chart (arrow keys), the map's streets, empty lot, and Splash Pond, the balloons, the Memory match cards (Tab or the arrow keys, then Enter or Space), and two players, where one side uses W A S D and Q and the other the arrow keys and /. Answer keys never take over Enter or Space on links and buttons. |
| 2.1.2 No Keyboard Trap | A | Supports | |
| 2.1.4 Character Key Shortcuts | A | Supports | Digits type an answer, and keys 1 to 4 pick a choice, only while focus is on the answer field, the number pad, the answers themselves, or the balloons. In two players, W A S D, Q, the arrow keys, and / work only while focus is on the game. |
| 2.2.1 Timing Adjustable | A | Partially supports | Practice, review, Learn, Memory match, Balloon pop at Calm (the default), and the 40-question speed test have no clock. In Memory match, two cards that are not a pair stay up until the child turns a new card. In two players, each question waits for both children with no clock; once both have answered, the answer shows for as long as its sentence takes to say (at least 2.5 seconds), then the next question comes on its own. In Balloon pop, Steady and Quick, where the balloons float away, are picked only on its setup screen: no link can pick them, a round that floats away starts only from that screen's Start (or from Again, right after one), and it has a Pause button and pauses when the tab is hidden. Balloon pop's stopwatch, off unless chosen there in the same way, only measures how long a round takes: it never limits a question or ends a round, and it stops with Pause and while the tab is hidden. The timed speed test and the diplomas are optional tests where the time is the point. The ten-second-a-question setting is off unless chosen, but a shared link can turn it on before the child sees the switch. In division, hearing a question takes a moment longer from the same clock. |
| 2.2.2 Pause, Stop, Hide | A | Supports | The dog's movements last a few seconds at most, and some pauses on a walk can be skipped with a tap or the Enter key. In Balloon pop, Calm balloons rise for a second and a half and then stay still; at Steady and Quick they rise until one is picked or they float away, and the Pause button stops them. With the stopwatch on, it counts up in whole seconds, and Pause stops it too. In two players, only the score moves, with one small bump on a point. Movement turns off with the Less motion switch, on the dog's map screen, the Balloon pop setup screen, and the two-player Ready screen, or with the system's reduced-motion setting: the balloons then sit still, and a thin bar shows any time limit. Nothing scrolls or blinks on its own. |
| 2.3.1 Three Flashes or Below Threshold | A | Supports | No flashing. A wrong pair in Match turns red once, a popped balloon swells and fades once, and a wrong pair in Memory match is never red. |
| 2.4.1 Bypass Blocks | A | Supports | Each screen has a short header, one main region, and one top-level heading. |
| 2.4.2 Page Titled | A | Supports | The tab title names the screen, and each Learn stage. |
| 2.4.3 Focus Order | A | Supports | Moving to a new screen puts focus on its heading; a new question puts it on the answer; finishing a stage puts it on Next. In Balloon pop, the first question puts focus on the first balloon, and after that it stays on the balloon last used, since the balloons never move; pausing moves it from a covered balloon to Go on, and Go on brings it back. In Memory match, focus stays on the card just turned, and moves to the heading at the end. In two players, focus goes to the game at Ready and stays there through the round (a tap or click never moves it onto an answer), and moves to the heading at the end. |
| 2.4.4 Link Purpose (In Context) | A | Supports | |
| 2.4.5 Multiple Ways | AA | Supports | Every screen is reachable from the home screen, and the main ones from the header as well. |
| 2.4.6 Headings and Labels | AA | Supports | |
| 2.4.7 Focus Visible | AA | Supports | A 3-pixel outline, or a thick underline on the answer field. |
| 2.5.1 Pointer Gestures | A | Supports | Single taps only. In Balloon pop, a balloon's whole column takes the tap, so nobody has to chase a moving target. |
| 2.5.2 Pointer Cancellation | A | Supports | Actions happen on release. In two players, a touch counts only if it lifts on the button it went down on. |
| 2.5.3 Label in Name | A | Partially supports | Three kinds of control show a fact with its sign but are named in words, so every screen reader says the same thing: the answer field (named by its question, "7 times 8"), the Learn path's question buttons in Match ("7 × 3" is named "7 times 3"), and Memory match's question cards. The name holds the same numbers in the same order, so saying them finds the control; a speech-input user says the words, or uses their tool's numbers or grid command. In division a button showing "28 ÷ 4" is named "28 divided by 4". |
| 2.5.4 Motion Actuation | A | Not applicable | Nothing responds to device motion. |
| 3.1.1 Language of Page | A | Supports | |
| 3.1.2 Language of Parts | AA | Supports | Everything is in English. |
| 3.2.1 On Focus | A | Supports | |
| 3.2.2 On Input | A | Partially supports | A typed answer goes in on its own as soon as it has as many digits as the answer, which is the app's design for speed. The answer field's description says so for screen readers, and Enter or Go also works. |
| 3.2.3 Consistent Navigation | AA | Supports | |
| 3.2.4 Consistent Identification | AA | Supports | |
| 3.3.1 Error Identification | A | Supports | A wrong answer, a timeout, balloons that float away, and a wrong range are described in words. |
| 3.3.2 Labels or Instructions | A | Supports | |
| 3.3.3 Error Suggestion | AA | Supports | The range boxes say what is allowed; a wrong answer shows the right one. |
| 3.3.4 Error Prevention (Legal, Financial, Data) | AA | Not applicable | No legal or financial transactions. |
| 4.1.1 Parsing | A | Supports | |
| 4.1.2 Name, Role, Value | A | Supports | Native buttons, links, and fields; switches, radio groups, pressed and disabled states, and progress bars are exposed to assistive technology. In two players, each answer's name gives its number and its side, and a side's buttons are marked unavailable once it has answered. The home screen's times tables or division choice is a radio group of two, never a switch, so a reader says which one is chosen. |
| 4.1.3 Status Messages | AA | Supports | Each question (in Balloon pop, with its four answers, and, with the stopwatch on, "The stopwatch is on" at the start), right or not quite, out of time, floated away, paused, a new best, and in two players who scored or answered and the answer once both are in, are said through one status line, in whole sentences. A stopwatch time is shown as digits ("1:20") and given to screen readers in words ("1 minute 20 seconds"). A division question is said as "28 divided by 4", and after a miss in Practice, Review, and Learn's In order and Mixed up stages the status line says the times fact ("Not quite. 4 times 7 is 28.") and the next question waits for the sentence. |
Report a problem
- If something in the app does not work for you or a child you teach, please say what you were doing and what happened, and which device, browser, and any assistive technology you use.
- Email amceachin@gmail.com, or call (949) 436-9921. You will get a reply within five school days.
- By mail: Andrew McEachin, 250 El Camino Real, Ste 108, Tustin, CA 92780.