Accessibility Conformance Report (WCAG 2.2 and 2.1, Level AA)
Based on the VPAT 2.5 WCAG edition. Groundskeeping and Floorkeeping share one codebase, so this report covers both.
- Product: Groundskeeping (groundskeeping.app) and Floorkeeping, progressive web app, version 3.184.0
- Report date: September 30, 2026
- Prepared by: Robert Spencer (author)
- Standards: WCAG 2.2 Level AA (W3C Recommendation, 12 December 2024). WCAG 2.1 Level AA is the standard named in the U.S. Department of Justice ADA Title II rule for public universities; every 2.1 criterion is also a 2.2 criterion, so a 2.2 AA claim covers it. Section 508 (Revised) incorporates WCAG 2.0 AA and is covered as well.
- Evaluation methods:
- Automated, on every version:
dev/axe-check.jsruns axe-core with the WCAG 2.0, 2.1 and 2.2 A and AA rules on 37 screens, dialogs and drawers, as a crew member on a 390 px phone and as a manager at 1280 px. A version does not ship with a violation. Version 3.162.0: 0 violations. - Automated, on every version:
dev/a11y-check.js(names, roles, focus and live regions),dev/mobile-check.js(reflow at 320 px),dev/spacing-check.jsand the other checks listed indev/README.txt. - Manual: code review of every control and dialog; keyboard-only walkthrough; contrast calculations on the design tokens.
- Testing with assistive technology on devices follows
docs/AT-TEST-PLAN.md(VoiceOver on iPhone and Mac, TalkBack, NVDA, JAWS, keyboard only, zoom and Voice Control; 22 tasks). A full pass runs every 6 months and before each contract, and results are logged indocs/AT-RESULTS.md. The build fails when the last pass is more than 6 months old or a blocker is open. The first full pass is scheduled before sales begin (docs/COMPLIANCE.md). - Automated, on every version:
dev/signin-check.jsruns axe on the sign-in screens and the authenticator dialog. - Automated, on every version: the public pages people reach without the app,
sms.html(text sign-up,dev/smsopt-check.js)report.html(the QR code sign's report form,dev/inboxin-check.js) andsupply.html(the restroom door sign,dev/supplies-check.js), are run through axe at 320 px and 1280 px, with their labels, errors, focus and reflow checked.
- Automated, on every version:
Terms used: Supports, Partially supports, Does not support, Not applicable.
Summary
The app supports WCAG 2.2 Level A and AA with three qualifications.
1. The satellite map and the marker layer are two-dimensional content. They are exempt from reflow, and every map object can still be reached and used with the keyboard. 2. A manager can choose colors for marker outlines, mow days, library folders and chips. On library folders and chips the app picks black or white text for whichever contrasts more. On the map it cannot guarantee contrast for a color a manager picks over the manager's own imagery, though a dark casing under every outline keeps the defaults readable. 3. How-to videos are the manager's own YouTube links, so their captions depend on how the manager uploads them. Help asks for captions.
Level A
| Criterion | Level | Conformance | Notes |
|---|---|---|---|
| 1.1.1 Non-text Content | A | Supports | Every icon button has an accessible name; decorative SVGs are aria-hidden; map markers carry names describing kind, zone, state, and assignment. |
| 1.2.1 Audio-only and Video-only | A | Not applicable | The app plays no prerecorded media of its own. |
| 1.2.2 Captions (Prerecorded) | A | Partially supports | How-to videos are manager-supplied YouTube links; captions are the uploader's responsibility (Help instructs managers to enable them). |
| 1.2.3 Audio Description or Media Alternative | A | Partially supports | As above. |
| 1.3.1 Info and Relationships | A | Supports | Native headings, lists, tables (schedule), details/summary drawers, labeled fields, dialog roles. |
| 1.3.2 Meaningful Sequence | A | Supports | DOM order matches visual order in panels and dialogs. |
| 1.3.3 Sensory Characteristics | A | Supports | Instructions refer to control names, not only shape or position. |
| 1.4.1 Use of Color | A | Supports | Done state uses fill plus date and initials; unfinished markers carry a glyph; mow days carry text labels; problem and photo pins differ in glyph; the status page's day bars differ in height as well as color, with a table of the days that were not working. |
| 1.4.2 Audio Control | A | Not applicable | No auto-playing audio. |
| 2.1.1 Keyboard | A | Supports | All controls are native buttons, inputs, and selects; map markers, pins, zones, mower areas, and mow days are focusable with Enter/Space to act and Shift+F10 for menus; shape points are focusable and moved with arrow keys. Segmented choices such as "When do you need it?" in Ask for a tool (v3.122) are radio groups with one tab stop, moved with the arrow keys. |
| 2.1.2 No Keyboard Trap | A | Supports | Dialogs trap Tab intentionally and release on Escape or any close action; menus close on Escape. |
| 2.1.4 Character Key Shortcuts | A | Supports | Single-key shortcuts (+, -, 0, arrows) are active only when focus is on the map region and not in a field, dialog, or panel. The Break time games' letter keys (W A S D, and in Sod Stack X, Z and C) work only while a game is open full screen. |
| 2.2.1 Timing Adjustable | A | Supports | No time limits on tasks; toasts are informational and announced. The optional Break time games are timed by design, the real-time exception in 2.2.1; they never hold up work. |
| 2.2.2 Pause, Stop, Hide | A | Not applicable | No moving or auto-updating content beyond user-initiated map changes. |
| 2.3.1 Three Flashes | A | Supports | Nothing flashes more than twice a second: the warnings in the Break time games (a goose about to recover, the mower after a hit) blink at most twice a second, over a small area, and not at all with reduced motion. |
| 2.4.1 Bypass Blocks | A | Supports | Skip link to the map; landmarks for the rail, map, and panels. |
| 2.4.2 Page Titled | A | Supports | The product name. |
| 2.4.3 Focus Order | A | Supports | Rail, map objects, then panels; dialogs move focus in and return it. |
| 2.4.4 Link Purpose | A | Supports | Links are named ("Open in YouTube", "Open link"). |
| 2.5.1 Pointer Gestures | A | Supports | Pinch zoom has + and - buttons; box select has tap-to-add. Every swipe, drag and flick in the Break time games has an on-screen button (the pad, and Hold in Sod Stack) and a key. |
| 2.5.2 Pointer Cancellation | A | Supports | Actions complete on release; marks can be cleared; drags can be reverted. |
| 2.5.3 Label in Name | A | Supports | Accessible names begin with the visible label. |
| 2.5.4 Motion Actuation | A | Not applicable | No motion input. |
| 3.1.1 Language of Page | A | Supports | html lang matches the language chosen in Settings ("en" by default). |
| 3.2.1 On Focus | A | Supports | Focus changes nothing. |
| 3.2.2 On Input | A | Supports | Selects and checkboxes apply settings without changing context; the effect is described beside them. |
| 3.2.6 Consistent Help | A | Supports | Help and Feedback are in the same position in the left bar on every view. |
| 3.3.1 Error Identification | A | Supports | Validation messages name the field and the fix (for example, hours format). |
| 3.3.2 Labels or Instructions | A | Supports | Every field has a visible label; formats are given as examples. |
| 3.3.7 Redundant Entry | A | Supports | Previously entered names, hours, and choices are prefilled or selectable. |
| 4.1.2 Name, Role, Value | A | Supports | Custom controls carry roles and states (pressed filters, checked stars, dialog, menu, menuitem, radio groups with aria-checked, the Me too chip with aria-pressed). |
Level AA
| Criterion | Level | Conformance | Notes |
|---|---|---|---|
| 1.2.4 Captions (Live) | AA | Not applicable | |
| 1.2.5 Audio Description | AA | Partially supports | Manager-supplied videos, see 1.2.2. |
| 1.3.4 Orientation | AA | Supports | Portrait and landscape both work. |
| 1.3.5 Identify Input Purpose | AA | Supports | Email fields use autocomplete="email"; the PIN uses current-password. |
| 1.4.3 Contrast (Minimum) | AA | Supports | Text on surfaces meets 4.5:1 (ink #1C1C1C and #46484B on light surfaces; white on navy #173D52 at 9.9:1). |
| 1.4.4 Resize Text | AA | Supports | Text resizes to 200% without loss; the rail widens and labels wrap. |
| 1.4.5 Images of Text | AA | Supports | None used. |
| 1.4.10 Reflow | AA | Supports (map exempt) | Panels reflow to 320 px; the schedule switches to a one-day list; the map is two-dimensional content. |
| 1.4.11 Non-text Contrast | AA | Partially supports | Controls and focus indicators meet 3:1; default marker outlines carry a dark casing over imagery; manager-chosen colors are outside the app's control. |
| 1.4.12 Text Spacing | AA | Supports | No fixed-height text containers that clip. |
| 1.3.1 (tables, v3.162) | A | Supports | Scrolling tables are keyboard-focusable named regions, so their content can be scrolled without a mouse. |
| 1.4.13 Content on Hover or Focus | AA | Supports | The hover pill is dismissible with Escape, hoverable, and persists while hovered. The first-run tour's card stays until Next, Back, End tour or Escape, and covers nothing it points at. |
| 2.4.5 Multiple Ways | AA | Not applicable | Single-page application; Help has search. |
| 2.4.6 Headings and Labels | AA | Supports | |
| 2.4.7 Focus Visible | AA | Supports | 2 px primary outline on controls; 4 px yellow ring on map objects. |
| 2.4.11 Focus Not Obscured (Minimum) | AA | Supports | Focused rail items scroll into view; panels do not cover focused controls. |
| 2.5.7 Dragging Movements | AA | Supports | Every drag has a non-drag alternative: arrow keys move points; taps add and select; zoom buttons replace pinch. |
| 2.5.8 Target Size (Minimum) | AA | Supports | Buttons 40 px, chips 32 px, edge dots and points 24 px, gallery buttons 32 px. |
| 3.1.2 Language of Parts | AA | Supports | The interface can be shown in another language; the page language (html lang and dir) changes with it. Text people type is shown as written. |
| 3.2.3 Consistent Navigation | AA | Supports | The left bar is the same on every view (managers may reorder it, which is a user-initiated change). |
| 3.2.4 Consistent Identification | AA | Supports | |
| 3.3.3 Error Suggestion | AA | Supports | |
| 3.3.4 Error Prevention (Legal, Financial, Data) | AA | Supports | Deletions and clears confirm; marks are reversible. |
| 3.3.8 Accessible Authentication (Minimum) | AA | Supports | The manager PIN field allows paste and password-manager fill (autocomplete="current-password") and can be kept unlocked. The two-step code field allows paste and one-time-code autofill, and accepts spaces. Campus sign-in uses the university's own sign-in page. Author and organization keys are pasted. |
| 4.1.3 Status Messages | AA | Supports | Toasts and the schedule's "in right now" line are announced through a polite live region. The status page announces a change in its headline, not each minute's refresh. |
Known limitations and roadmap
- Testing with assistive technology on devices is scheduled (
docs/AT-TEST-PLAN.md), and results will be summarized here fromdocs/AT-RESULTS.md. Until then, this report reflects code review and automated checks. - Manager-chosen colors and manager-supplied videos are outside the app's control. The defaults, automatic text color in the Library, and Help guidance address them.
- The live satellite map is context for the marker layer; its attribution control comes from the map library.
- Every new screen or dialog is added to
dev/axe-check.js, and a version with a violation does not ship.
Contact
Accessibility problems or questions: rems.byustudies@gmail.com. You will have an answer within three working days.