feat: structural accessibility for data table - #5082
Open
oleksandrzavarzin-callstack wants to merge 5 commits into
Open
feat: structural accessibility for data table#5082oleksandrzavarzin-callstack wants to merge 5 commits into
oleksandrzavarzin-callstack wants to merge 5 commits into
Conversation
oleksandrzavarzin-callstack
marked this pull request as ready for review
August 28, 2026 13:52
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Motivation
DataTable's structure was purely visual: bareViews andTouchableRipples with no roles, indices or header relationships, so a screen reader conveyed no table context at all. A user heard"159"with no way to know it was the Calories column of row 3.Changes
role="table"witharia-rowcount/aria-colcount,role="row"witharia-rowindex,role="columnheader"witharia-sort,role="cell"witharia-colindex."Dessert, Frozen yogurt, Calories, 159, row 3 of 6". It falls back to per-cell focus when a row holds interactive or non-text content, so nothing becomes unreachable.nativeFocusModeoverrides the choice.View.aria-sorton web, folded into the accessible name on native, with an announcement on change since focus stays on the header. NewsortAccessibilityLabelslocalizes the wording.Animated, matchingSwitchandCheckbox. Reduced motion is suppressed viaReduceMotion.Alwaysinstead of a manual snap, and150msbecomestheme.motion.duration.short3(same value).labelsprop. Data-dependent values are functions, so pluralization stays with the app's own i18n.columnsdescribes width and alignment once instead of repeatingstyleon a title and every cell. Newaligncomposes withnumeric, which is unchanged and not deprecated.numberOfLinesis honoured exactly at every font scale; the default is one line at the default scale and unclamped above it.surfaceVarianttooutlineVariant, matchingDivider.Buttongainsaria-expanded, needed by the rows-per-page anchor which never reported that it opens a menu.Breaking changes
Rows, cells and titles without a touch handler render a plain
View. They lose the ripple, the web hover background and keyboard focus, and no longer report a disabled state.Other important changes:
rowCountandfirstRowIndexfor correct positions when paginating.numericnow applies tabular figures, the one visual change to existing tables.Related issue
Child of the "Modernize non-standard components" effort; no issue exists yet.
Test plan
yarn typescript,yarn lintcleanyarn test806 passed, 167 snapshots. The 2828-line snapshot is replaced with 8 small per-component snapshots plus named contract assertions, since the old blob is where thearia-disabledregression sat unnoticed.aria-sortcycling, and noaria-disabledon any row, cell or title.adb shell uiautomator dump. Tapping a row focuses that row, each header is its own stop, and a row containing an interactive element (e.g. Checkbox) falls back to per-cell focus.Screenshots: