Accessibility
Built for the whole sideline.
School and community sports are for everyone — including the grandparent following a game on VoiceOver, the parent who’s cranked Dynamic Type to its largest setting, the user navigating with a keyboard, and anyone who’s asked their phone to Reduce Motion. Here’s where we stand and what we’re still working on.
What works today
VoiceOver on iPhone
Score columns, RSVP chips, share-code displays, QR codes, chat reactions, and the Live Activity scoring callout all speak labeled phrases to VoiceOver — “Pioneers, 14, just scored” rather than three disjoint syllables. Decorative dots, emoji glyphs, and chevrons are hidden so they don’t add noise. Six-character share codes are read with speechSpellsOutCharacters so a parent can write them down letter-by-letter.
Dynamic Type on iPhone
Almost every text element uses semantic SwiftUI fonts (.body, .headline, .caption), which scale automatically with the system text-size slider. The app caps in-app type at .accessibility3 so the score and stat grids don’t blow past their containers; iOS Settings can still go higher for the rest of the OS.
Reduce Motion
The trading-card flip on the Family tab and the chat auto-scroll both check accessibilityReduceMotion and skip the animation when it’s on. The web app honors prefers-reduced-motion with a global rule that collapses any author-added transitions or animations to near-zero — vestibular sensitivity is one tap on the OS away.
Keyboard navigation on the web
Every page has a “Skip to main content” link that appears on the first Tab press. Form fields are correctly associated with their labels; required fields expose aria-required; validation errors are announced with role="alert" and linked to their input via aria-describedby. Keyboard-only focus is always visible thanks to a global :focus-visible ring; mouse users don’t see it on click. Modal dialogs (chat reactions tally, photo lightbox, identity card) close on Escape and restore focus to the trigger.
Color contrast
The brand palette tests at AAA against white. Where a team uploads its own brand color (used for hero backgrounds, Season Card front, lock-screen Live Activity wrapper) we compute the WCAG relative luminance and auto-pick white or dark text — a coach picking a yellow-green hex doesn’t paint unreadable white-on-pastel body copy.
No tracking, no third-party ad SDKs
Accessibility includes notbeing followed around the web. We don’t embed third-party advertising, analytics, or tracking SDKs in the iPhone app or on this website. Pages stay light, screen readers stay focused, and your phone’s “reduce data usage” setting actually means something.
What we’re still working on
We launched v1.0 with a focused accessibility audit — the items below are honest gaps that we’re tracking and aim to ship in the 1.0.x range.
- Switch Control + Voice Control. Tested for VoiceOver, not yet exercised end- to-end with the other iOS assistive-tech surfaces. Reports welcome.
- Carpool + snack signup flows.These have lots of context-sensitive buttons (offer / claim / cancel / release). The labels are present but we haven’t done a full screen-reader pass on the order they’re read.
- Per-locale formatting beyond US-English.Dates, times, and currency are English-only today. The UI accepts non-Latin characters in names and team labels, but layouts haven’t been pseudo-localized.
- Photo gallery screen-reader pass.The lightbox is keyboard- and Escape-friendly, but the moderation queue (coach view) hasn’t been audited for VoiceOver order.
Found a problem?
We treat accessibility regressions like security regressions — email support@thefieldhouse.app with the page or screen you’re on, which assistive tech you’re using, and what you expected to happen. A real person reads every message and you’ll hear back.
On the iPhone, you can also tap More → Get support → Send logs to support — the email opens prefilled with your app version and a redacted context dump, so we can reproduce faster.
The Fieldhouse aims for WCAG 2.1 AA compliance on the web app and the iPhone companion. We’ll refresh this page as the audit catches up to the code.