Accessibility

trap()#

focus trap with restore

roving()#

arrow-key navigation for composite widgets

announce()#

live region announcements

A11y#

trap(el, { escape, outside, inert }), modal(dialog, open) on native <dialog>; an unregistered island prints a ready-to-paste register() scaffold

Focus and announcements in depth#

trap() stacks, recaptures and sees into shadow roots, roving() covers grids, trees, typeahead, RTL and the combobox aria-activedescendant pattern. Screen readers hear the app: two permanent live regions with a lossless queue, a route announcer with focus reset, focus that moves to a neighbour instead of <body> when a row disappears, audible loading / error / saved states and dialogs that name themselves.