Skip to content

fix(keyboard): accept one roving tab stop shared by repeated sibling widgets (0.15.5) - #24

Merged
DuncanFaulkner merged 3 commits into
mainfrom
fix/roving-stop-shared-across-widgets
Sep 29, 2026
Merged

DuncanFaulkner merged 3 commits into
mainfrom
fix/roving-stop-shared-across-widgets

Conversation

@DuncanFaulkner

Copy link
Copy Markdown
Contributor

ngbr/unreachable-control reported every card in a board's other columns (a role=listbox per column, one tab stop for the whole board) as serious. An item is now also reachable when another widget of the same role, inside the same component and repeated alongside it (same element + same classes, ignoring ng-* and --modifiers), has a tabbable item of the same role. Key handling still required; dev builds only (needs the debug API).

Specs incl. negatives (no host, other role, outside the component, unrelated wrapper, ng-star-inserted/utility overlap); sabotage-checked. 303 tests. Docs dogfood (154 routes): 61 → 39 (board 13 → 0 with data-table 1.1.1's 9 → 0), nothing new. Three review rounds, clean.

🤖 Generated with Claude Code

DuncanFaulkner and others added 3 commits September 29, 2026 08:16
… widgets (0.15.5)

A board with a listbox per column and one tab stop for the whole board had
every card in the other columns reported unreachable. An item is also
reachable when a tabbable item of the same role, in a widget of the same role,
is inside the same component (bounded at the nearest component host; key
handling still required). Specs incl. three negatives; sabotage-checked.
Docs dogfood (154 routes): board 13 → 0, nothing new.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… cache per widget

Review follow-up: a working listbox could vouch for an unrelated broken one in
the same component. Now the two widgets must be repeated siblings (their
branches are the same element and share a class, as a @for renders — modifier
classes may differ). Result cached per widget (was O(n^2)). CHANGELOG: dev
builds only. Docs dogfood unchanged: 61 → 39 (board 13 → 0), nothing new.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d --modifiers)

Re-review: "share one class" let unrelated wrappers match (ng-star-inserted
from legacy animations on every @if/@for element; utility classes). Now the
same non-empty class set, ignoring ng-* and BEM modifiers; unclassed wrappers
never match. Cache keyed by widget and item role. Specs: ng-* and partial
overlap don't vouch; columns with differing ng-tns classes still match.
Docs dogfood unchanged: 61 → 39, nothing new.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@DuncanFaulkner
DuncanFaulkner merged commit 721166d into main Sep 29, 2026
1 check passed
@DuncanFaulkner
DuncanFaulkner deleted the fix/roving-stop-shared-across-widgets branch September 29, 2026 07:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant