About
Accessibility
LegalPrivacy PolicyTerms of ServiceSecurity OverviewData ProtectionData Privacy AgreementSchool Data Letter
Legal

Accessibility Conformance

📅 Assessed: 1 September 2026✏️ Last revised: 14 October 2026🔄 Next review due: 1 September 2027
⚠️ This is a vendor self-assessment. It is not a VPAT and not a third-party audit. DataVot is assessed against WCAG 2.1 Level A and Level AA, and Section 508 as refreshed, which incorporates WCAG 2.0 AA by reference. All 50 criteria are below with the evidence for each.

What this is, and what it is not

A New Jersey district evaluating DataVot will have an accessibility question on its checklist. This page answers it with evidence rather than a claim.

It is not a VPAT. A VPAT is a specific document produced against an ITI template, and the ones districts trust are completed by an independent accessibility firm. DataVot has not commissioned one. Saying so plainly is deliberate — our Questions and answers page says the same thing — because a self-declared conformance statement dressed up as an audit is worse than an honest self-assessment, and a district that discovers the difference later has every reason to distrust everything else we have told it.

What it is: a criterion-by-criterion record of where DataVot stands, with the evidence named for each one, and with the difference between machine-verified, verified by inspection and not applicable stated rather than blurred.

If your procurement requires an independent attestationTell us early. That is a cost we will quote, not one we will pretend we have already paid.

Methodology, and its limits

Three automated suites run on every deploy. None of them is a person using the product with a screen reader, and that is the most important sentence on this page.

The automated suites behind this assessment
SuiteWhat it doesScope
Accessibilityaxe-core at WCAG 2.1 A/AA against the running application in headless Chrome19 surfaces, signed-out and signed-in
ContrastComputes contrast ratios and fails below the AA floor54 colour pairs — hardcoded pairs, design-token pairs in both light and dark themes, and text against every surface defined in its own scope
Static rulesBuild-time rules including alt-text presence, external-link relationships and token contrastWhole source tree

Automated testing detects roughly a third of WCAG issues, and axe's own documentation says so. It cannot judge whether alt text is meaningful, whether a heading structure matches the visual hierarchy, whether focus order is logical, or whether an error message is understandable. Every criterion below marked Inspected was assessed by a person reading the markup and operating the interface; those judgements are ours and have not been independently reviewed.

The 19 surfaces under automated test, named rather than summarised so the list is evidence you can check — including this page. The article reader (/articles/[slug]) renders from the database rather than from an API call, so it is audited against a local fixture article; a run in which that fixture is missing fails rather than auditing a not-found page in its place. Signed out: /, /about, /faq, /pricing, /contact, /privacy, /accessibility, /security, /articles, /articles/[slug], /forum. Signed in: /, /reports, /dashboard, /board-report, /help, /admin/users, /system-admin, /database.

Accepted findings are decisions, not silencersThe suite carries exactly one. The Help page's demonstrations dim rows to show them being filtered — the dimming is the meaning. Each stage carries a real label and a reduced-motion fallback that shows the finished state instead of animating. The waiver is scoped to the demo, never to the page, so a genuine contrast bug elsewhere on it still fails the build.

Level A

WCAG 2.1 Level A criteria, conformance and evidence
CriterionConformanceEvidence
1.1.1 Non-text ContentSupportsaxe image-alt across 19 surfaces; invariant img-alt fails the build on a missing alt. Decorative thumbnails in article prev/next controls carry alt="" deliberately — the enclosing button already exposes the article title, and describing them would announce every title twice
1.2.1 Audio-only / Video-onlyNot applicableNo audio or video anywhere in the product. The /help demonstrations are CSS animations, not media, and each carries a text label
1.2.2 Captions (Prerecorded)Not applicableNo prerecorded media
1.2.3 Audio Description or Media AlternativeNot applicableNo prerecorded media
1.3.1 Info and RelationshipsSupportsaxe label, form-field-multiple-labels, list, definition-list, table-* rules. Data tables use real <th scope>; the pivot output is a <table>, not a grid of <div>s
1.3.2 Meaningful SequenceInspectedDOM order matches visual order; no CSS reordering that changes reading sequence
1.3.3 Sensory CharacteristicsInspectedNo instruction depends on shape, position or colour alone
1.4.1 Use of ColourInspectedPerformance levels are labelled as well as coloured; the dashboard legend names each level in text. Form errors carry text, never colour alone. Links are now machine-checked: axe link-in-text-block runs across all 19 surfaces, and the day the article reader became one of them (2026-10-07) it found citation links in article prose distinguished from the surrounding text by colour alone at 1.38:1 — they are underlined now. The rating stays *Inspected* rather than moving to Supports, because colour use outside links is still a human read
1.4.2 Audio ControlNot applicableNothing plays automatically
2.1.1 KeyboardInspectedEvery control is a real <button>, <a> or form element. Modals route through useDialog, the single accessibility primitive — Escape to close, focus trap, focus restore
2.1.2 No Keyboard TrapSupportsThe only focus trap is the modal one, which Escape releases and which restores focus to the opener. useDialog is the sole implementation, and no page hand-rolls a second overlay
2.1.4 Character Key ShortcutsNot applicableNo single-character shortcuts
2.2.1 Timing AdjustablePartially supportsSessions expire on a 30-minute idle window (14 days with remember-me) per NIST SP 800-63B AAL2. The window is not user-adjustable; it is a security control a district asks for by name, and work is not lost silently — an expired save returns an error rather than discarding
2.2.2 Pause, Stop, HideSupportsThe only motion is the /help demos, which respect prefers-reduced-motion by showing the finished state instead of animating
2.3.1 Three FlashesSupportsNothing flashes
2.4.1 Bypass BlocksPartially supportsLandmark structure (<header>, <main>, <nav>, <footer>) lets assistive technology skip the header. A visible skip link is not implemented — see Known gaps
2.4.2 Page TitledSupportsEvery public route is a server component exporting metadata with its own title; npm run test:seo fails the build on a route that is not classified and titled
2.4.3 Focus OrderInspectedFocus order follows DOM order; useDialog restores focus to the invoking control on close
2.4.4 Link Purpose (In Context)InspectedNo bare "click here". External links open in a new tab and are marked; external-link-rel pins rel="noopener noreferrer"
2.5.1 Pointer GesturesNot applicableNo multipoint or path-based gestures
2.5.2 Pointer CancellationSupportsAll activation is on click, not mousedown
2.5.3 Label in NameSupportsaxe label-content-name-mismatch; visible labels are the accessible names
2.5.4 Motion ActuationNot applicableNothing is operated by device motion
3.1.1 Language of PageSupports<html lang> set; axe html-has-lang and html-lang-valid
3.2.1 On FocusSupportsNo context change on focus
3.2.2 On InputSupportsNo form auto-submits on input. Dashboard selectors update the URL and the chart — the same page, not a context change
3.3.1 Error IdentificationSupportsErrors are text in a role="alert" region, identified in prose
3.3.2 Labels or InstructionsSupportsaxe label; every required field carries a visible red asterisk plus required/aria-required, enforced as a house rule in CLAUDE.md
4.1.1 ParsingSupportsObsolete in WCAG 2.2; assessed here as axe duplicate-id and valid nesting
4.1.2 Name, Role, ValueSupportsaxe aria-* rule set across 19 surfaces. Current page is marked aria-current="page"; dialogs carry role="dialog" and aria-modal from useDialog

Level AA

WCAG 2.1 Level AA criteria, conformance and evidence
CriterionConformanceEvidence
1.2.4 Captions (Live)Not applicableNo live media
1.2.5 Audio DescriptionNot applicableNo prerecorded media
1.3.4 OrientationSupportsNo orientation lock; layout is responsive
1.3.5 Identify Input PurposePartially supportsEmail and password fields carry appropriate autocomplete. Not every field in the admin screens declares a purpose token; those fields have no standard token in the WCAG list
1.4.3 Contrast (Minimum)Supportsnpm run test:contrast — 54 pairs, both themes, failing below AA. It measures a *rendered* property rather than a code property, which is why it caught defects no other check could: three token pairs failing on their own dim wash, and --text-muted at 4.31:1 on the printable document sheet. The large-text exemption is applied from each rule's own font size and weight; an unknown size is treated as normal text
1.4.4 Resize TextSupportsLayout is responsive with relative units; content reflows to 200% without loss
1.4.5 Images of TextSupportsNo images of text. The marketing screenshots on /overview are pictures of the product, which the exception permits, and each carries alt text
1.4.10 ReflowSupportsnpm run test:a11y resizes each of its 19 surfaces to 320 CSS px and fails on a document that scrolls sideways, naming the widest offending element. Content that scrolls inside its own container — tables, the pivot — is the correct pattern and is not reported. Measured rather than asserted since 2026-10-14, when the claim had been prose and five policy pages overflowed it
1.4.11 Non-text ContrastPartially supportsFocus indicators and control borders were reviewed against the 3:1 floor by inspection. test:contrast measures text pairs; it does not yet measure UI-component boundaries — see Known gaps
1.4.12 Text SpacingInspectedNo fixed line-height or letter-spacing that would clip at the WCAG spacing overrides
1.4.13 Content on Hover or FocusSupportsPopovers are dismissible with Escape and stay open while hovered
2.4.5 Multiple WaysSupportsHeader navigation, footer navigation, /about#documents, in-page search on list screens, and a sitemap
2.4.6 Headings and LabelsInspectedExactly one <h1> per page — a house rule; the admin shells render a hidden <h1> only on their gate screens so the rule holds there too
2.4.7 Focus VisibleSupportsOne global :focus-visible outline in base.css, pulled flush on inputs, plus a @media (forced-colors: active) block that keeps the system Highlight ring. Invariant focus-ring-survives-cascade fails the build if any stylesheet suppresses it — and, two-sided, if base.css stops defining it, since a no-suppression rule passes once the ring it protects is deleted
3.1.2 Language of PartsNot applicableSingle-language content (English)
3.2.3 Consistent NavigationSupportsExactly one header implementation (AppMenubar) and one footer (SiteFooter), pinned by invariants one-header and one-footer. A second header cannot be introduced without failing the build
3.2.4 Consistent IdentificationSupportsShared components for repeated functions — one clipboard button, one dialog primitive, one table viewer
3.3.3 Error SuggestionSupportsErrors say what to do next: a blocked sign-in offers resend-verification, a failed contact send names the direct email address rather than reporting a false success
3.3.4 Error Prevention (Legal, Financial, Data)SupportsDestructive actions confirm. Report saves are guarded against last-write-wins with a 409 rather than silently overwriting, and a data set can never be overwritten by a report save
4.1.3 Status MessagesPartially supportsErrors and confirmations use role="alert". Not every asynchronous status (for example a long upload) announces through a live region — see Known gaps

Known gaps

Stated here rather than buried, because a district's reviewer will find them and we would rather you learn them from us.

  1. No independent audit and no VPAT. The whole basis of this document is a vendor self-assessment.
  2. No screen-reader user testing. Markup has been assessed; the product has not been operated end to end by a person who relies on a screen reader daily. This is the largest gap and no automated suite closes it.
  3. No visible skip link (2.4.1). Landmarks are present, so assistive technology can skip the header, but a sighted keyboard user tabs through the navigation on every page.
  4. Non-text contrast (1.4.11) is inspected, not measured. The contrast suite covers text pairs; UI component boundaries are not yet computed against the 3:1 floor. The keyboard focus ring is the exception — its presence is pinned by an invariant, though its contrast against each field it lands on is still an inspection rather than a measurement.
  5. Status messages (4.1.3) are partial. Errors announce; some long-running progress states do not.
  6. Dashboard charts convey information visually. Every chart has a data table equivalent reachable in the product, and the board report exports CSV and TSV — but the chart itself is not individually described.

How to read this in a procurement review

  • Every Supports backed by a named suite is re-verified on every deploy, not on the day this page was written. The accessibility and contrast suites run before a release; a regression blocks it.
  • Every Inspected row is a human judgement of ours and carries the weight of one.
  • Every Partially supports and every entry under Known gaps is a real limitation we would rather you learn from us than from your own reviewer.

Questions, or a district checklist you need completed against this: use the security contact named in the preamble of our Data Privacy Agreement, or the contact page.

DataVot
Privacy PolicyTerms of ServiceSecurity OverviewAccessibilityData ProtectionData Privacy AgreementSchool Data LetterHelp
© 2026 Salesforce Hub LLC · makers of DataVot.