fix(ui): the reader's own use of a stand-in stops the restore; the pill's name carries its cap
Round 2 of the deep review: - A click on, or a key typed into, the focus keeper's stand-in fires no focusin, so a restore still polling for its list could take the focus from under the reader. A pointerdown or keydown now makes it the reader's own focus. - The Jump-to pill hid its "Ctrl K" from its name (the voice command "click Ctrl K" still matched nothing); the key cap's tooltip now equals its name, so it is not read twice as a description. - listNav's comment still cited DataTable's two layouts as the reason for its visibility filter.
This commit is contained in:
@@ -70,6 +70,12 @@ export function useFocusKeeper(ref: RefObject<HTMLElement | null>): void {
|
||||
if (t !== standIn) standIn = null;
|
||||
held = t && root.contains(t) && !t.closest("[data-nav-index]") ? t : null;
|
||||
};
|
||||
// Using the stand-in makes it the reader's own focus: a click on it or a key typed into it fires
|
||||
// no focusin, and a restore still polling for its list would otherwise take the focus from
|
||||
// under the reader's hands.
|
||||
const onUse = () => {
|
||||
standIn = null;
|
||||
};
|
||||
const watch = new MutationObserver((records) => {
|
||||
const lost = held;
|
||||
if (!lost || lost.isConnected) return;
|
||||
@@ -86,9 +92,13 @@ export function useFocusKeeper(ref: RefObject<HTMLElement | null>): void {
|
||||
}
|
||||
});
|
||||
document.addEventListener("focusin", onFocusIn);
|
||||
document.addEventListener("pointerdown", onUse, true);
|
||||
document.addEventListener("keydown", onUse, true);
|
||||
watch.observe(root, { childList: true, subtree: true });
|
||||
return () => {
|
||||
document.removeEventListener("focusin", onFocusIn);
|
||||
document.removeEventListener("pointerdown", onUse, true);
|
||||
document.removeEventListener("keydown", onUse, true);
|
||||
watch.disconnect();
|
||||
};
|
||||
}, [ref]);
|
||||
|
||||
Reference in New Issue
Block a user