AccessPoint Accessibility Conformance Report
WCAG 2.1 Level A / AA — self-assessment. This report covers the AccessPoint application. The accessibility statement for this website is at realizer.io/accessibility.
| Product | AccessPoint — the Microsoft 365-native platform for public-sector access, privacy, and responsible AI |
|---|---|
| Version evaluated | 2.1.0 |
| Report date | 2026-09-03 |
| Vendor | Realizer Services Inc. |
| Contact | realizer.io/support/contact |
| Standard applied | Web Content Accessibility Guidelines (WCAG) 2.1, Levels A and AA (w3.org/TR/WCAG21) |
| Report format | Modeled on the ITI VPAT® 2.5 WCAG edition (self-assessed; not an ITI-certified VPAT) |
| Evaluation type | Vendor self-assessment. No third-party audit has been performed. |
Product description and scope
AccessPoint is an enterprise access-to-information / privacy case-management application. The user interface is a SharePoint Framework (SPFx) web part (React 17 + Fluent UI 8, ≈416 components) hosted inside SharePoint pages and as a Microsoft Teams personal tab, backed by an ASP.NET Core API in the customer's Azure tenant. This report covers:
- The application UI — dashboards and data grids for five case registers (requests, assessments, incidents, complaints, risks), case detail panels, work-item panels, forms, the document workspace, settings, and reports.
- The document viewer — an API-served page embedding the Syncfusion EJ2 PDF Viewer in an iframe, with AccessPoint's own redaction-overlay layer (client-composed: one base PDF, redaction marks painted as focusable overlays, Original / Redline / Redacted-preview as overlay styles).
- The media viewer — video and audio records are first-class documents in every document workspace (request, assessment, incident, complaint). The viewer is AccessPoint's own: a custom player control bar, a two-lane timeline that shows redaction marks, a canvas overlay that paints region marks over the frame, a mark editor, a transcript drawer with find-in-transcript and closed captions, and the shared redaction side panel. Large-file uploads run through a chunked upload queue.
- Structured editors — the assessment diagram editor (canvas and List view), the repeating-row table editor, and the working-document editor that hosts both for diagram / list working files.
- Generated outputs — PDFs (correspondence letters, certificates, response and evidence packages, converted uploads), released media files (burned MP4 / MP3), Excel and CSV exports, reported in their own section because they are consumed outside the application.
Host and third-party reliance. The SharePoint page / Teams client owns the page <title>, <html lang>, and page-level skip navigation; conformance for that chrome is Microsoft's (see Microsoft's published ACRs for SharePoint Online and Teams). UI primitives (buttons, panels, dialogs, grids, tooltips, sliders) are Fluent UI 8; PDF rendering, the viewer toolbar, and Office / HTML-to-PDF conversion are Syncfusion EJ2. Where a behavior is entirely internal to a vendor component the remarks say so — refer to the vendor's accessibility documentation for those internals. This report covers how AccessPoint uses those components and everything AccessPoint builds itself.
Authored content caveat. Tenants configure their own tag and exemption colours, choice labels, and correspondence templates, and users upload arbitrary documents and recordings. Conformance of tenant-authored or uploaded content (a low-contrast custom exemption colour, an inaccessible uploaded PDF, a recording without intelligible speech) is outside the product's control; the product's own defaults and mechanisms are what is assessed here.
Exclusions. Syncfusion viewer internals (canvas rendering, text layer, toolbar semantics), Fluent UI internals, the SharePoint / Teams host chrome, the Realizer-hosted setup / launch pages, and Microsoft Graph pickers surfaced through the host are out of scope.
Evaluation methods
This is a self-assessment against version 2.1.0. Evidence sources:
- Static code review of the full frontend source (per-element JSX analysis of every component; label and ARIA coverage counted per control type rather than sampled — 482 loading spinners, 330 icon buttons, 176 live regions), the server-generated viewer page (HTML / JS), and every document- and media-generation path. Contrast ratios were computed from source values with the WCAG relative-luminance formula for both the light theme and the product's dark-theme token set. Fluent UI behavior (focus traps, focus restoration, live regions, spinner announcement conditions, slider and focus-zone key handling) was verified against the shipped library source rather than assumed. The media viewer, timeline, marks overlay, transcript drawer, mark editor, upload queue, diagram / table / working-document editors, release-variants panel, and the client-composed PDF viewer were each reviewed line by line for keyboard operability, focus management, ARIA names / roles / states, colour and contrast, reflow, timing, and status messaging.
- Runtime browser verification of the shell surfaces on a live SharePoint deployment: keyboard walkthroughs (grid row-open via Enter, Escape dismissal, focus restoration after panel close), live ARIA-state inspection (combobox
aria-expanded/aria-activedescendant/aria-selectedtracking arrow keys;langattributes; heading levels; reorder hints), tooltip Escape dismissal, the report-workspace viewport clamp, and a walk of the Chromium accessibility tree — the tree NVDA / JAWS consume on Chrome — across the dashboard, data grid, search, pickers, and pinned-tile surfaces (role, name, state, reading order at every node; page-wide sweep of focusables for missing accessible names). This pass was executed on the 2.0.7x line of the same shell (2026-08-20). No runtime pass has yet been executed on the surfaces added or rebuilt for 2.1.0 — the media viewer, the client-composed PDF viewer, the diagram / table / working-document editors, the upload queue, and release variants — which rest on code-review evidence only. - Ongoing enforcement: the SPFx lint gate runs a curated
eslint-plugin-jsx-a11yrule set (valid ARIA props / roles, alt text, required role attributes, no positive tabindex,aria-activedescendantfocusability, validlang) plus an in-house rule requiringariaLabelon every Spinner — all at error severity, so violations fail the build in CI.
Not performed: live screen-reader interoperability sessions (NVDA / JAWS / VoiceOver), automated runtime scans (axe), a dedicated 320 px / 400 % zoom pass (reflow is code-verified; minimum widths are computed from source), and any runtime check of the media viewer with assistive technology.
Applicable standards
| Standard / guideline | Included in report |
|---|---|
| WCAG 2.1 Level A | Yes (Table 1) |
| WCAG 2.1 Level AA | Yes (Table 2) |
| WCAG 2.1 Level AAA | No |
| Revised Section 508 / EN 301 549 | Not covered by this WCAG-edition report |
Terms
| Term | Definition |
|---|---|
| Supports | The functionality of the product has at least one method that meets the criterion without known defects or meets with equivalent facilitation. |
| Partially Supports | Some functionality of the product does not meet the criterion. |
| Does Not Support | The majority of product functionality does not meet the criterion. |
| Not Applicable | The criterion is not relevant to the product. |
| Not Evaluated | The product has not been evaluated against the criterion. (Not used in this report — every criterion was evaluated.) |
Summary of results
| Level | Supports | Partially Supports | Does Not Support | Not Applicable |
|---|---|---|---|---|
| A (30 criteria) | 21 | 8 | 0 | 1 |
| AA (20 criteria) | 14 | 4 | 1 | 1 |
How the product meets the guidelines. Every form control carries a programmatic name sourced from the same localized strings as its visible label; every icon-only button and per-row switch carries an explicit label; every loading spinner announces via role="status" (lint-enforced); save / validation outcomes announce through deliberate live regions plus Fluent MessageBar semantics. Keyboard operation is systematic: clickable cards and rows implement the role / tabIndex / Enter-Space pattern, grids open rows on Enter, every reorder surface has a keyboard alternative (Alt+Arrow with focus restoration, or menu items), document-viewer redaction marks are focusable, labeled, activatable, and geometry-adjustable by keyboard (Alt+Arrow move, Alt+Shift+Arrow resize, a "Place redaction box" command for free-form marks), and single-character shortcuts are active only while their surface holds focus. The media viewer is keyboard-operable for playback (Space, arrows, , . frame step, J / K / L, Home / End, F), view switching (1 / 2 / 3), mark navigation ([ ]), captions (C), transcript find (/), and time-span marks (I / O in-out points, M opens the mark editor with typed timecodes, Alt+Arrow nudges and Alt+Shift+Arrow trims a focused timeline bar); the timeline is an ARIA slider with value text; every processing, transcription, upload, and scan state is a role="status" chip or live region; captions ride a native <track> so browser / OS caption preferences apply; the transcript drawer is the text alternative for spoken content, with click / Enter-to-seek segments, aria-current on the segment under the playhead, and a polite match counter. Mixed-language content carries lang markup on the app root, translated fields, and correspondence rendered in the requestor's language. The status / state colour system is centrally engineered with computed AA ratios in both themes, and both type-ahead search controls implement the ARIA 1.1 combobox pattern (runtime-verified).
Known remaining gaps (each detailed in its criterion row): the media viewer's video region geometry (draw, move, track) is pointer-only — the keyboard path covers the span and effect but not a sub-frame rectangle; the media workspace's Space shortcut intercepts Space on focused buttons (Enter still activates them); captions and the transcript are withheld from users who lack the requestor-PII permission while the audio still plays; no audio description of visual-only content is produced (1.2.5); Proposed marks on the media timeline use an amber that measures 2.05:1 on the light lane; three focus indicators are suppressed (the selected timeline bar, the media workspace body tab stop, diagram shapes); transcript segments are not tagged with the recording's language; the working-document editor dialog has no programmatic name; the media control bar does not reflow below ≈450 px; and the small-tile chart, silent-secondary-error and placeholder-label items carried by the shell remain. The most significant open assessment task is a live assistive-technology pass over the media viewer.
Table 1: WCAG 2.1 Level A
| Criterion | Conformance | Remarks and explanations |
|---|---|---|
| 1.1.1 Non-text Content | Supports | Images carry alt text and decorative icons are hidden from AT (Fluent Icon defaults to aria-hidden). Meaningful indicators carry text / ARIA equivalents: the document unread dot is role="img" with a localized label; media row chips (Preparing preview, Transcribing, Transcript, Scanning for faces & text, malware / content-type hygiene) are text pills with role="status" (MediaRowChips); every spinner (482) announces via ariaLabel (lint-enforced); the media poster is alt="", sprite hover thumbnails are aria-hidden, the audio waveform canvas is role="img" with a localized name, and the marks overlay canvas is aria-hidden because every mark it paints is also a named row in the redaction side panel (span, effect, exemption, status). In-viewer redaction overlays are labeled focusable controls; charts expose data-bearing accessible names (chart type + measure + total + top values, locale-formatted). |
| 1.2.1 Audio-only / Video-only (Prerecorded) | Partially Supports | The product authors no time-based media; the media it plays is user-uploaded evidence. For audio-only records the transcript drawer (MediaTranscriptDrawer) is the text alternative — time-coded, speaker-labelled segments that seek the player — produced by Azure AI Speech, imported from Teams, or imported as WebVTT. Gaps: the alternative exists only when transcription is deployed and enabled, and the transcript text is served only to users holding the requestor-PII permission (DocumentMediaController: the transcript endpoint returns counts, not words, to others) while the audio itself plays for anyone with document access; and no alternative is presented for video-only (silent) content — on-screen text detected by the frame scan is indexed for search but is not surfaced in the viewer as a description. Captured records (chats, mail, OneNote, calendar) replace embedded media with text placeholders. |
| 1.2.2 Captions (Prerecorded) | Partially Supports | Uploaded video plays with closed captions: a native <track kind="captions" default> with srclang set from the transcript language (MediaViewerModal), rendered by the browser so OS / browser caption preferences (size, colour, background) apply, toggled with a labeled Captions button (aria-pressed) or the C key, and retained in full screen. Teams meeting recordings import their Teams transcript directly; the transcript-import endpoint accepts a corrected WebVTT (there is no in-app control for a manual import). Gaps: (1) the captions URL is issued only to users with the requestor-PII permission (DocumentMediaController lines 90–138), so a user who may play the recording but may not see requestor PII gets audio with no captions; (2) captions are speech-recognition output unless a Teams or imported transcript exists, and their accuracy is not verified by the product; (3) audio-only records have no caption rendering (the <audio> element carries no track) — the transcript drawer is the alternative; (4) in Redacted preview a region mark that covers the lower part of the frame is painted over the native caption area. |
| 1.2.3 Audio Description or Media Alternative (Prerecorded) | Partially Supports | The transcript drawer is the media alternative for the spoken content of an uploaded recording (find-in-transcript with previous / next seeks the player; segments read as a document; the playhead-following segment is aria-current). No audio description or description of visual-only content is produced — the product reviews third-party evidence and does not author descriptions of it — and the on-screen text the frame scan detects is not presented in the drawer. See 1.2.5 (AA). |
| 1.3.1 Info and Relationships | Supports | Every form control carries a programmatic label (custom-field editors expose required state). Panels and dialogs expose programmatic titles; detail and settings surfaces use real headings, semantic lists and tables, and labeled nav / region landmarks; data grids ride Fluent DetailsList semantics; the risk heat map is a semantically correct table. Media viewer: the redaction side panel is a labeled <aside>, the table editor renders a real <table> with header cells and required markers, the diagram List view exposes swimlanes / nodes / connectors as three labeled tables, and the required-row hint is role="alert". Advisory, not a failure: the app relies on the SharePoint / Teams host for page-level landmarks; the transcript list and the keyboard-shortcuts callout are div-based rather than list / table markup; the timeline's mark bars sit inside the role="slider" element (see 4.1.2). |
| 1.3.2 Meaningful Sequence | Supports | Content order in the DOM matches the visual reading order; no CSS-based reordering is used. In the media viewer the DOM order is header actions → player stage → control bar (play, readout, timeline, captions, mute, volume, full screen) → in / out strip → side panel (Redact menu, marks list, transcript). |
| 1.3.3 Sensory Characteristics | Supports | Instructions reference controls by their visible labels and key names (the shortcuts callout lists key → action pairs; the in / out strip names the M key and the Mark span button). The one colour-worded instruction ("Amber / Red thresholds") names on-screen field labels. |
| 1.4.1 Use of Color | Partially Supports | The dominant pattern is colour + icon + text: status chips carry glyph and text, overdue / due-soon dates pair an icon with the tinted pill and the date, tag chips always carry label text. Media viewer: timeline bars carry the exemption label and span as accessible name and tooltip; Proposed marks are distinguished by a dashed border and diagonal hatch as well as amber; the selected bar gets a thicker dark border and outline; region overlays carry the exemption caption inside or above the box; muted spans in the waveform are gapped (not only recoloured) in Redacted preview; the side panel shows status, origin badge and effect as text. Remaining gap: multi-series charts on small dashboard tiles distinguish series by hue alone for sighted users (full-size charts include legends and per-point callouts; report sections render data tables; every chart exposes a data-bearing accessible name). |
| 1.4.2 Audio Control | Supports | Nothing plays automatically: <video> / <audio> carry preload="metadata" and no autoplay; playback starts only from the Play button, Space / K, or a scrub release that resumes a recording the user had already started. The control bar exposes labeled Play / Pause, Mute / Unmute and a volume slider (Fluent Slider, keyboard-operable), plus J / K / L speed keys; in Redacted preview muted spans force silence while the user's own mute survives. |
| 2.1.1 Keyboard | Partially Supports | Shell: clickable cards / rows implement role / tabIndex / Enter-Space, grids open rows on Enter (runtime-verified), upload drop zones have a keyboard path, every reorder surface has a keyboard alternative (Alt+Arrow with focus restoration or menu items — including grid column reorder and Alt+Shift+Arrow resize) persisting through the same handlers dragging uses. PDF viewer: overlay marks are focusable and activatable, with Alt+Arrow move / Alt+Shift+Arrow resize on editable marks through the pointer commit path; "Place redaction box" drops a default-sized box into the same confirm flow as a pointer drag; the side panel's review lifecycle (accept, dismiss, flag, withdraw, approve, bulk) is fully keyboard-operable. Media viewer: playback, view mode, captions, find, mark navigation and time-span marks are keyboard-operable (I / O set in-out points, M opens the editor whose In / Out fields accept typed hh:mm:ss.f and a "Playhead" button, Alt+Arrow / Alt+Shift+Arrow nudge / trim a focused bar). Diagram editor: shapes are focusable buttons — arrows move, Alt+Arrow resizes, Enter / Space selects, F2 renames, Delete removes, Alt+Up / Down reorders swimlanes; connectors, properties and everything else are editable in the List view (three tables). Gaps: (1) a video region (the rectangle a Box / Blur / Pixelate covers) can only be drawn, moved and keyframed with a pointer on the canvas overlay (MediaMarksOverlay); the mark editor offers no x / y / width / height fields, so the keyboard equivalent is a full-frame region for the span (over-redaction) or automatic tracking / detection; (2) the media workspace's Space shortcut is bound on the workspace container and skips only text inputs, so pressing Space on a focused button, switch, tab or menu item inside the viewer (control bar, side panel, transcript, portaled dialogs and menus) toggles playback instead of activating the control — Enter still activates every one of them (MediaViewerModal key handler). |
| 2.1.2 No Keyboard Trap | Supports | Fluent focus-trap defaults are used for modals and dialogs; panels and dialogs dismiss with Escape and restore focus (runtime-verified). The media viewer is a non-blocking Fluent Modal (Escape closes and saves the playhead); full screen is exited with Escape or the labeled button; the mark editor and re-scan prompt are Fluent Dialogs. The viewer iframe is exitable with Shift+Tab (Escape inside the iframe does not close the hosting modal; the close button remains reachable). Six detail panels set forceFocusInsideTrap: false so window re-focus does not yank focus to the panel's first element. |
| 2.1.4 Character Key Shortcuts | Supports | Every single-character shortcut set is active only while keyboard focus is within its owning surface — the criterion's focus-scoping condition — and suppressed during text entry: the PDF viewer's R / H / C / F / [ / ] (useRedactionKeyboard, explicit containment check), the Documents tab's / and f, and the media viewer's Space, , ., J / K / L, F, /, C, 1 / 2 / 3, [ ], I / O / M (bound on the workspace container, skipped on inputs, textareas, selects, comboboxes and contenteditable). All other shortcuts are chorded (Alt+Arrow, Ctrl+A / D / F). |
| 2.2.1 Timing Adjustable | Supports | No session or inactivity limits exist; authentication renews silently. The media playback token (4 h) and the viewer ticket (60 min) self-heal — a media error or viewer load failure re-mints the link and restores the playhead / page position — so nothing is lost. Chunked upload sessions pause on a dropped connection and resume automatically; an abandoned session is swept only after 24 h idle (beyond the 20-hour exception). Success / informational toasts auto-dismiss after 3–6 s but pause while hovered or focused; errors persist until dismissed. |
| 2.2.2 Pause, Stop, Hide | Supports | No moving, blinking, scrolling, or auto-advancing content. Recordings are user-started and pausable; the marks overlay repaints on animation frames only to follow the user-controlled playhead; background polls (3–5 s) update processing / transcription / scan status text and self-stop; a global prefers-reduced-motion rule disables all transitions and animations. |
| 2.3.1 Three Flashes or Below Threshold | Supports | No flashing content; the only animation is standard spinners / fades. Redacted-preview effects (box, blur, pixelate, slate) are static per frame. |
| 2.4.1 Bypass Blocks | Supports | The host (SharePoint / Teams) supplies page-level skip mechanisms. In-app primary navigation is a single-tab-stop tablist followed directly by content; headings and labeled landmarks (including the redaction side panel <aside>) support AT navigation; the media viewer's Hide panel button removes the side rail from the tab sequence. |
| 2.4.2 Page Titled | Supports | Page titles are owned by the hosting SharePoint page / Teams tab; in-app panels and modals carry programmatic titles (the media viewer's title is the recording's file name, titleAriaId), and the document-viewer pages emit localized titles. (Observation: in-app SPA navigation does not update the host title.) |
| 2.4.3 Focus Order | Supports | Focus follows DOM order (no positive tabindex anywhere, lint-enforced); modal surfaces use Fluent's initial-focus / trap / restore behavior; keyboard reordering preserves focus (runtime-verified); PDF-viewer overlays survive a rebuild with focus restored to the same mark (captureOverlayFocus, guarded so the iframe never steals focus from the side panel). Media viewer: opening lands on the header; the mark editor and callouts set initial focus and restore it on dismiss. Advisory: [ / ] select the previous / next mark and seek without moving focus to the bar, so a keyboard user Tabs to the (now tabbable) selected bar to nudge it. |
| 2.4.4 Link Purpose (In Context) | Supports | Links and row actions are contextualized by their accessible name or the enclosing row / card; "Download original" is a labeled button-link; transcript segments are named by their timecode, speaker and text. |
| 2.5.1 Pointer Gestures | Supports | Only single-pointer clicks and drags are used; no multipoint or path-based gestures. Drawing a region, moving a mark, scrubbing, range-selecting on the ruler, trimming a bar and dragging a diagram shape are start / end-point drags (not path-dependent). Each has a non-drag equivalent except region geometry, which is recorded under 2.1.1. |
| 2.5.2 Pointer Cancellation | Supports | Activations complete on the up-event. Down-event listeners initiate drags (essential) or manage focus; the timeline's pointer-down starts a live scrub whose frame follows the pointer (essential to scrubbing) and a bar drag commits only on release, with a plain click reverting to a seek. The marks overlay commits a draw or move on mouse-up and discards drags below a size / distance threshold. |
| 2.5.3 Label in Name | Supports | Accessible names and visible labels are sourced from the same localized strings; controls that add context (status chips, per-row toggles, timeline bars: "exemption · span") contain the visible text within the accessible name. |
| 2.5.4 Motion Actuation | Not Applicable | No motion-actuated functionality. |
| 3.1.1 Language of Page | Supports | The host page declares the document language; the product defaults its UI locale to the host culture and tags its own root when the user selects a different language (see 3.1.2). Viewer iframe pages declare their own <html lang>. All media-viewer strings exist in the 11 supported locales. |
| 3.2.1 On Focus | Supports | The only onFocus handlers re-open a combobox suggestion list and pause a toast's dismiss timer; no context changes on focus. |
| 3.2.2 On Input | Supports | No input auto-submits or navigates; all commits are explicit button activations. Changing the playback-speed dropdown, the view-mode tabs or the volume slider changes a setting of the same surface, not the context. |
| 3.3.1 Error Identification | Partially Supports | Validation and save errors are identified in text via Fluent errorMessage (programmatically associated, announced) and MessageBars inside always-mounted aria-live regions; the reasons a submit button is disabled are rendered as inline text in polite live regions. Media viewer: the mark editor reports an unparseable or inverted timecode as an alert MessageBar naming the expected format; a failed save, retry, scan or track surfaces the server's reason; the table editor flags an incomplete row with role="alert" naming the missing columns; the working-document editor shows a Saving / Unsaved / Saved / Error status. Remaining gap: secondary background fetches (e.g. sprite index, waveform peaks, position save, ~160 shell-wide) fail silently. |
| 3.3.2 Labels or Instructions | Partially Supports | Visible persistent labels are the norm; required fields use Fluent required (asterisk + aria-required); complex flows carry instructions (the in / out strip, tracking-mode banner, draw-region prompt, shortcuts callout); every control has a programmatic name. Remaining gaps: a minority of search / filter boxes present placeholder-only visible labeling, and the mark editor's In / Out fields state their hh:mm:ss.f format only in the error message. |
| 4.1.1 Parsing | Supports | All markup is TSX (duplicate attributes / malformed nesting are compile errors); a single dangerouslySetInnerHTML renders the held sign-off letter's stored HTML (composed in-tenant); generated ids use Fluent's unique-id utilities; the viewer page is server-templated HTML whose overlay elements are created through the DOM API (no string-concatenated markup). |
| 4.1.2 Name, Role, Value | Partially Supports | Fluent components expose correct roles / values; icon-only buttons and per-row toggles carry explicit ariaLabels; custom picker rows expose checkbox state; both type-ahead search controls implement the ARIA 1.1 combobox pattern (runtime-verified). PDF viewer: overlays are labeled, focusable role="button" controls (Proposed marks announce as suggestions with their exemption). Media viewer: the timeline is role="slider" with aria-valuemin / max / now / valuetext; bars are role="button" with aria-pressed selection and an "exemption · span" name; the Captions toggle exposes aria-pressed; the speed dropdown, volume slider, transcript search and every icon button are named; the details and shortcuts buttons expose aria-expanded; the shortcuts callout is a named dialog. Gaps: (1) the working-document editor Modal sets no titleAriaId / label, so that dialog has no accessible name (WorkingDataEditorModal); (2) the timeline's mark bars are nested inside the role="slider" element, whose children ARIA treats as presentational, so some AT may not expose them — the side panel remains the authoritative, fully named mark list; (3) the upload queue's Pause / Resume / Cancel / Dismiss buttons are named but do not include the file name, so repeated rows read identically (UploadQueuePanel). |
Table 2: WCAG 2.1 Level AA
| Criterion | Conformance | Remarks and explanations |
|---|---|---|
| 1.2.4 Captions (Live) | Not Applicable | The product presents no live time-based media. |
| 1.2.5 Audio Description (Prerecorded) | Does Not Support | The media viewer has no facility to attach or play an audio-description track, and the product produces no description of visual-only content in uploaded recordings (the frame scan's on-screen-text detections feed search and redaction proposals, not a description). The transcript covers spoken content only (see 1.2.3). The product does not author the recordings it plays; organizations that must supply audio description for released records should treat it as a downstream step. |
| 1.3.4 Orientation | Supports | Nothing restricts display orientation (no orientation locks or restricting media queries in the app or Teams manifest; full-screen video follows the device). |
| 1.3.5 Identify Input Purpose | Supports | Nearly all data-entry fields concern third-party requestors (out of this criterion's scope). The fields that collect the signed-in user's own information — the attestation signature name and title — carry autocomplete="name" and autocomplete="organization-title". |
| 1.4.3 Contrast (Minimum) | Supports | Text colour is engineered to AA with computed ratios in both themes: the central status-badge palette measures 5.77–8.23:1 (light) and 6.94–8.21:1 (dark); theme status-token pairs (--apWarningText 4.75:1 on tint / 5.23:1 on white, --apSevereText 5.52:1, dark ≥6.5:1) are used by the media chips and hygiene pills; body text uses theme slots (≥6.4:1); informative secondary text uses neutralSecondary (6.0:1 on the timeline lane); timeline hover readouts are white on 80 % black; user-configured exemption / tag colours are never used as text colour. Observation: the exemption caption painted inside a blurred / pixelated region sits on a 65 % black pill over the live frame (mirroring the release burn), which can fall to ≈2.6:1 on an all-white frame; the same citation is always readable in the side panel and the Redaction Index. Tenant-configured colours and uploaded content remain authored content outside product control. |
| 1.4.4 Resize Text | Supports | Typography scales with browser / OS zoom; no fixed-height text clipping was found; truncation is ellipsis / line-clamp with the full content available elsewhere; tab bars collapse into an overflow menu on resize; the document preview header hides action text (icons + tooltips remain) at narrow widths. |
| 1.4.5 Images of Text | Supports | No images of text in the UI; the only text-bearing images are exempt brand logotypes (SVG). Captions painted on the redacted-preview canvas mirror what the release burn writes into the file (essential to previewing the release) and the same text is available as real text in the side panel. |
| 1.4.10 Reflow | Partially Supports | Detail panels open full-viewport; ~19 breakpoint rules collapse toolbars; shell containers set min-width: 320px; wide report matrices scroll in their own containers; data grids scroll horizontally (permitted for data tables); the report-builder workspace clamps to min(1180px, 100vw) (runtime-verified). Two-dimensional content is exempt by design: the PDF canvas and the video stage, each paired with a user-togglable side rail (min 320 px, hidden with "Hide panel"). Gap: the media viewer's control bar is a non-wrapping flex row (play, 120 px readout, timeline ≥120 px, captions, mute, 84 px volume, full screen) needing ≈450 px, so at 320 px CSS width it overflows the modal rather than reflowing (MediaPlayerControls). A dedicated 320 px / 400 % zoom pass remains on the assessment backlog. |
| 1.4.11 Non-text Contrast | Partially Supports | Meaningful graphics meet 3:1 in both themes: unread dot 4.53:1, heat-map marks, decision-chip borders, stock Fluent control borders 6.46:1, the catalogue default-star token 4.55 / 9.55:1, state icons 6.46:1, the combobox active-option indicator (2 px theme-primary outline, 4.5:1), PDF-viewer Proposed overlays (2 px dashed #986F0B, 4.55:1 on white) and the 3 px #0078D4 focus ring; the media playhead (themePrimary, 4.5:1 on the lane) and the default mark colour (#d13438, 4.7:1). Gap: on the media timeline a Proposed mark's dashed border and hatch use #e8a33d, which measures 2.05:1 against the light-theme marks lane (dark theme ≈8:1) — the hatch pattern and the side-panel origin badge still identify it, and the same amber is used for the redline outline of a Proposed region over video (content-dependent). Tenant exemption colours on bars are authored content. |
| 1.4.12 Text Spacing | Supports | Layouts are content-height driven; applying the 1.4.12 spacing overrides expands pills, cards, chips and rows without clipping or overlap (media chips sit on their own wrapping row; the transcript list and the shortcuts table are flow content). |
| 1.4.13 Content on Hover or Focus | Supports | Hover-triggered content routes through Fluent tooltips — hoverable and persistent by design, and dismissable with Escape (runtime-verified). Timeline bars carry tooltips; transcript match state is inline text. Observation: the timeline's scrub-lane hover preview (sprite thumbnail + timecode) is pointer-only and disappears when the pointer leaves the lane; it floats above the lane over the lower edge of the stage, never over a control, and its timecode duplicates the readout. Some tooltip hosts are non-focusable text spans, so their content appears on pointer hover only; the underlying information remains available through the element's accessible name. |
| 2.4.5 Multiple Ways | Supports | Records and views are reachable via persistent tab navigation, a global cross-entity search, notification-feed links, and shareable deep links; a workspace content-search hit opens a recording at the matching spoken moment; site-level navigation is host-provided. |
| 2.4.6 Headings and Labels | Supports | Headings and labels are descriptive and localized; panel titles name the record or task; the media viewer is titled with the recording's file name and its dialogs are "New mark" / "Edit mark" / "Scan again?"; timeline bars and side-panel rows are labeled with exemption, span and effect. |
| 2.4.7 Focus Visible | Partially Supports | Fluent components keep default focus rectangles; class-styled custom interactive rows carry explicit 2 px :focus-visible outlines; PDF-viewer overlay marks carry an explicit 3 px :focus-visible outline; transcript segments, table cells and the timeline slider itself rely on the browser-default indicator (nothing suppresses it). Gaps: (1) the selected timeline bar — the only bar in the tab sequence — sets an inline 1 px white outline that replaces the browser focus ring, so on the light lane focus on it is not visibly distinguishable from mere selection (MediaTimeline); (2) the media workspace body is a tabIndex="0" container styled outline: none, an invisible tab stop between the header and the player controls (MediaViewerModal); (3) diagram shapes and swimlane headers are focusable <g> elements styled outline: none whose only indicator is the thicker selection stroke, which appears after Enter / Space rather than on focus (DiagramAnswerEditor). |
| 3.1.2 Language of Parts | Partially Supports | Mixed-language content carries lang markup: the web part root is tagged with the active UI language (covering a user-selected language that differs from the host page's declaration — runtime-verified), translated-field display and editing surfaces are tagged with each content's language, letters composed in the requestor's language are tagged with the merge language, language names carry their own lang, and full-page fallback views are tagged; the caption track declares srclang. Gap: transcript segments in the drawer are rendered without a lang attribute even though the recording's language is known and displayed (MediaTranscriptDrawer), so a French recording reviewed in an English UI is read with English pronunciation rules. Letters submitted for sign-off by product versions predating the stored merge language render untagged. |
| 3.2.3 Consistent Navigation | Supports | Navigation is rendered from single shared components (app shell, panel navigation header, shared catalogue list, WorkItemHeader), so ordering and placement are consistent by construction; the media viewer mirrors the document viewer's header (view-mode tabs, download, Hide / Show panel, close) and reuses its side panel. |
| 3.2.4 Consistent Identification | Supports | Same-function controls are implemented once and reused with centralized localized labels and a documented verb convention; media marks use the same accept / dismiss / flag / withdraw / approve controls as page redactions. |
| 3.3.3 Error Suggestion | Supports | Error messages state the correction (date-range, over-length with limit and count, URL format, timecode format and order, incomplete-row column names); missing required fields are enumerated by name; the bulk data importer returns a downloadable per-row error report; a rejected region track names the server's reason (tracker unavailable, track not ready). |
| 3.3.4 Error Prevention (Legal, Financial, Data) | Supports | Destructive operations (bulk delete, retention purge, remove-from-response, withdraw with reason, delete a release variant) require explicit confirmations, and the server independently re-checks purge eligibility; a re-scan that would discard unreviewed proposals asks Replace / Keep both / Cancel; data import is gated behind a reviewable validation report; e-signed attestations present the full signed text and pass through second-party approval; fee payments are recorded via an explicit confirm dialog; response packages can be blocked while unreviewed proposals exist; working-document edits autosave to a draft so nothing is lost on close. |
| 4.1.3 Status Messages | Supports | Save / validation outcomes, toasts, and long-running states announce through a deliberate live-region pattern (176 aria-live regions) plus MessageBar's native status / alert semantics; every Spinner sets ariaLabel (lint-enforced). Media: "Preparing preview", "Transcribing", "Scanning frames", "Tracking a mark" and hygiene pills are role="status" chips; the viewer's Mark saved / Span updated / Tracking point added / scan-progress notices are MessageBars; the transcript match counter is aria-live="polite"; the timecode readout is deliberately aria-live="off"; the upload queue is a polite live region reporting Waiting / Uploading (bytes and percent) / Paused / Uploaded / Failed. Refinement, not a failure: the upload region announces every progress tick during a chunked upload, which is verbose for long files; and the global search conveys result availability through combobox state rather than an explicit result-count announcement. |
Accessibility features and known limitations — media records
What the media viewer provides.
- Keyboard playback and navigation: Space / K play-pause; ← → seek 5 s (Shift for 10 s);
,.frame step; J / L slower / faster; Home / End; F full screen;/focuses find-in-transcript; C toggles captions; 1 / 2 / 3 switch Original / Redline / Redacted preview;[]previous / next mark. A "Keyboard shortcuts" link opens a named dialog listing only the shortcuts that apply to the user's permissions and view. - Timeline: an ARIA slider with
aria-valuetexttimecode; each mark is a named button ("exemption · span"); a focused editable bar moves with Alt+← / → (100 ms) and trims with Alt+Shift+← / →, committing through the same PUT as pointer drag; Proposed marks are dashed and hatched; tracking keyframes are pips. - Time-span marks by keyboard: I / O set in / out points at the playhead (the in / out strip shows them and how to finish), M or the Redact menu opens the mark editor, whose In / Out fields accept typed
hh:mm:ss.for a "Playhead" button; effect, exemption and notes are labeled fields; errors announce as alerts. - Captions and transcript: native
<track>captions withsrclang(browser / OS caption styling and full-screen retention apply); a transcript drawer with speaker and timecode per segment, click / Enter to seek,aria-currenton the playing segment, find with previous / next and a polite match count, an on-demand AI summary, and Transcribe / import states. - Audio-only records: a waveform lane (
role="img") plus the transcript as the text alternative; the timeline and controls are identical to video. - Status: every processing, transcription, scan, tracking, malware and upload state is a text chip or live region; a "Resume at hh:mm:ss" offer restores a previous session; long uploads pause and resume automatically with pause / resume / cancel controls.
- Redaction review: the shared side panel lists every mark with span, effect, exemption, status, origin, flags, comments and the full action set, all keyboard-operable; accept / dismiss of machine proposals and Preview-with-proposals are one click away and announced.
Known limitations (scheduled — see Roadmap).
- Region geometry (draw / move / keyframe a rectangle on the frame) is pointer-only; the keyboard equivalent is a full-frame region, automatic tracking, or the face / text scan (2.1.1).
- Space on a focused button inside the media workspace toggles playback instead of activating the button; Enter works (2.1.1).
- Captions and transcript text are withheld from users without the requestor-PII permission although the audio plays for them (1.2.1, 1.2.2).
- No audio description; no description of visual-only content (1.2.3, 1.2.5).
- Proposed timeline bars use
#e8a33d(2.05:1 on the light lane) (1.4.11). - The focused selected bar and the workspace-body tab stop lack a visible focus indicator (2.4.7).
- Transcript segments carry no
lang(3.1.2). - The control bar needs ≈450 px (1.4.10).
- Timeline bars are nested inside the
role="slider"element (4.1.2);[/]select without moving focus (2.4.3 advisory). - Beyond AA (recorded for planning): mark bars are 9 px tall and trim handles 7 px wide (WCAG 2.2 target-size guidance is not met on the timeline; the side panel and keyboard nudges are the alternative); the redacted-preview caption pill can drop below 4.5:1 on a very bright frame.
Generated outputs (PDF, media, Excel, CSV)
Documents the product generates are consumed outside the application, so they are reported separately rather than folded into the tables above.
| Output | Status | Remarks |
|---|---|---|
| Generated PDFs (correspondence letters, attestation certificates, response packages, evidence packages, ROPA exports, converted uploads, "Other records" and delivery-note pages) | Partially Supports (opt-in) | An administrator-controlled setting (Documents:TaggedPdf, default off) enables tagged (accessible-structure) output for Word-sourced PDFs (correspondence / letterhead letters, incident letters, converted Word uploads) and HTML-sourced PDFs (converted emails, record captures, certificates) via the PDF library's auto-tagging. Tag quality depends on source structure and has not been validated with PAC / veraPDF, so no PDF/UA conformance is claimed. Merged export packages (response packages, evidence exports) and the library-drawn package pages remain untagged regardless of the setting — the merge path drops structure tags; adopting the library's tag-preserving merge API is a scoped roadmap item. Redacted response PDFs intentionally remove withheld content (essential by function); scanned inputs pass through as image-plus-OCR-text-layer at best. |
| Released recordings (burned MP4 / MP3 in response packages) | Does Not Support | The released file carries the redaction captions as burned pixels only; no caption track, transcript or audio description accompanies the recording in the package (the transcript is deliberately not released because it would need its own redaction). The Redaction Index and "Other records" page list every span, effect and citation as text, and the delivery note lists formats, durations and hashes. Organizations releasing recordings to requesters who need captions should supply a caption file as a downstream step. |
| Excel exports (report builder, statistical returns, data-transfer workbook with 17 tabs) | Partially Supports | Named, localized worksheets (including the statistical-return sheet name in all 11 languages), styled header rows, typed and localized cell data; the data-transfer workbook opens on a "Read me" instructions tab and uses in-cell dropdowns. Remaining: no defined tables / named ranges, and a few fixed in-sheet labels ("Total", period captions) are English-only. |
| CSV exports (redaction log) | Supports | Plain UTF-8 CSV with a header row; one row per mark (page or span, effect, exemptions, status, origin, reviewer, timestamps); never detected text. |
Organizations with PDF/UA obligations for outbound correspondence should account for this in their own remediation processes (e.g., post-processing) until tagged output is validated and the export-merge item on the roadmap lands.
Known limitations of this assessment
- No live screen-reader sessions, and none at all on the media viewer. The evidence base includes a simulated screen-reader pass over the Chromium accessibility tree for the shell surfaces, but not live NVDA / JAWS / VoiceOver sessions, and the media viewer, client-composed PDF viewer, diagram / table / working-document editors and upload queue have been verified by code review only. The items most worth a live AT pass: the timeline slider with nested bar buttons, caption and transcript reading under NVDA / JAWS, the ARIA 1.1 combobox shape across screen readers, chart data-point tab order, and focus restoration after server-reloading lists.
- No automated runtime scans (axe) and no dedicated 320 px / 400 % zoom pass. Reflow mechanisms are code-verified; the media control-bar minimum width is computed from source, not measured.
- Vendor internals not re-audited. Syncfusion EJ2 PDF Viewer internals and Fluent UI internals are assessed only as used.
- Point in time. This report describes version 2.1.0 as of 2026-09-03 and should be revised when the product changes materially.
Roadmap (open items)
| # | Item | Criteria | Target |
|---|---|---|---|
| 1 | Media viewer keyboard fixes: exclude button-like targets from the Space / letter shortcuts; add x / y / width / height fields to the mark editor (create and edit) and Alt+Arrow nudge / resize for a selected region; move focus to the bar on [ / ] | 2.1.1, 2.4.3 | 2.1.1 |
| 2 | Timeline semantics and contrast: place role="slider" on the scrub lane and expose the marks lane as a labeled group; darken Proposed to the PDF viewer's #986F0B; replace the inline white outline with a :focus-visible ring; remove the invisible workspace tab stop | 4.1.2, 1.4.11, 2.4.7 | 2.1.1 |
| 3 | Tag transcript segments with the recording's language; name the working-document editor dialog; include the file name in upload-queue button names and throttle progress announcements | 3.1.2, 4.1.2, 4.1.3 | 2.1.1 |
| 4 | Diagram editor: visible focus indicator on focused shapes and swimlanes (independent of selection) | 2.4.7 | 2.1.1 |
| 5 | Captions policy: serve the caption track under the same gate as the audio it transcribes, or withhold both, so a deaf reviewer is never given audio without captions | 1.2.1, 1.2.2 | 2.1.2 (owner decision) |
| 6 | Reflow the media control bar (wrap the volume / full-screen group under 480 px) and run the 320 px / 400 % pass | 1.4.10 | 2.1.2 |
| 7 | Live screen-reader sessions (NVDA / JAWS) on the media viewer, the client-composed PDF viewer and the shell | Assessment | 2.1.2 |
| 8 | Raise the on-frame caption pill opacity (preview and burn together, so they stay identical) | 1.4.3 | 2.1.2 |
| 9 | Non-colour series differentiation for multi-series charts on small dashboard tiles | 1.4.1 | 2.2 |
| 10 | Surface silently-swallowed secondary errors (~160 background fetches) | 3.3.1 | 2.2 |
| 11 | Tagged-PDF program: validate opt-in tagged output with PAC / veraPDF before enabling by default; refactor merged export packages to the tag-preserving merge API; consider an optional caption file beside released recordings | Outputs | 2.2 |
| 12 | Minor polish: persistent visible labels for placeholder-only fields; format hint on the mark editor's In / Out fields; localized strings for the Fluent ColorPicker's internal inputs; localize the remaining fixed Excel labels; audio description remains out of scope unless a customer requirement emerges | 3.3.2, 1.2.5 | 2.2 |
Legal disclaimer
This document is a good-faith self-assessment provided for information purposes; it is not a certification, guarantee, or legally binding commitment of conformance. Realizer Services Inc. will update this report as the product evolves. "VPAT" is a registered trademark of the Information Technology Industry Council (ITI); this report follows the structure of the VPAT WCAG edition but was not prepared or reviewed by ITI.