arrowtab 0.0.5 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +120 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/caret.d.ts +5 -0
- package/dist/lib/caret.js +136 -0
- package/dist/lib/caret.js.map +1 -0
- package/dist/lib/changesValueOnArrowKeys.d.ts +3 -0
- package/dist/lib/changesValueOnArrowKeys.js +15 -0
- package/dist/lib/changesValueOnArrowKeys.js.map +1 -0
- package/dist/lib/debugMode.d.ts +5 -5
- package/dist/lib/debugMode.js +28 -32
- package/dist/lib/debugMode.js.map +1 -1
- package/dist/lib/directions.d.ts +13 -0
- package/dist/lib/directions.js +17 -0
- package/dist/lib/directions.js.map +1 -0
- package/dist/lib/dom.d.ts +16 -0
- package/dist/lib/dom.js +62 -0
- package/dist/lib/dom.js.map +1 -0
- package/dist/lib/focusHistory.d.ts +7 -6
- package/dist/lib/focusHistory.js +52 -40
- package/dist/lib/focusHistory.js.map +1 -1
- package/dist/lib/focusTracker.d.ts +12 -0
- package/dist/lib/focusTracker.js +43 -0
- package/dist/lib/focusTracker.js.map +1 -0
- package/dist/lib/focusable.d.ts +8 -0
- package/dist/lib/focusable.js +135 -0
- package/dist/lib/focusable.js.map +1 -0
- package/dist/lib/geometry.d.ts +35 -0
- package/dist/lib/geometry.js +70 -0
- package/dist/lib/geometry.js.map +1 -0
- package/dist/lib/hasDisabledKeys.d.ts +4 -3
- package/dist/lib/hasDisabledKeys.js +5 -25
- package/dist/lib/hasDisabledKeys.js.map +1 -1
- package/dist/lib/initArrowTab.d.ts +11 -2
- package/dist/lib/initArrowTab.js +129 -72
- package/dist/lib/initArrowTab.js.map +1 -1
- package/dist/lib/initArrowTab.test.d.ts +1 -0
- package/dist/lib/initArrowTab.test.js +689 -0
- package/dist/lib/initArrowTab.test.js.map +1 -0
- package/dist/lib/navigateEvent.d.ts +16 -0
- package/dist/lib/navigateEvent.js +9 -0
- package/dist/lib/navigateEvent.js.map +1 -0
- package/dist/lib/rankCandidates.d.ts +11 -0
- package/dist/lib/rankCandidates.js +31 -0
- package/dist/lib/rankCandidates.js.map +1 -0
- package/dist/lib/scope.d.ts +11 -0
- package/dist/lib/scope.js +60 -0
- package/dist/lib/scope.js.map +1 -0
- package/dist/lib/strategies.d.ts +21 -10
- package/dist/lib/strategies.js +63 -106
- package/dist/lib/strategies.js.map +1 -1
- package/dist/lib/strategies.test.d.ts +1 -0
- package/dist/lib/strategies.test.js +88 -0
- package/dist/lib/strategies.test.js.map +1 -0
- package/dist/lib/widgets.d.ts +5 -0
- package/dist/lib/widgets.js +50 -0
- package/dist/lib/widgets.js.map +1 -0
- package/dist/lib/wrap.d.ts +12 -0
- package/dist/lib/wrap.js +21 -0
- package/dist/lib/wrap.js.map +1 -0
- package/package.json +2 -1
- package/dist/lib/distances.d.ts +0 -13
- package/dist/lib/distances.js +0 -15
- package/dist/lib/distances.js.map +0 -1
- package/dist/lib/getAngle.d.ts +0 -4
- package/dist/lib/getAngle.js +0 -15
- package/dist/lib/getAngle.js.map +0 -1
- package/dist/lib/getFocusable.d.ts +0 -1
- package/dist/lib/getFocusable.js +0 -29
- package/dist/lib/getFocusable.js.map +0 -1
- package/dist/lib/getXyDistance.d.ts +0 -7
- package/dist/lib/getXyDistance.js +0 -12
- package/dist/lib/getXyDistance.js.map +0 -1
- package/dist/lib/hasTextSelection.d.ts +0 -4
- package/dist/lib/hasTextSelection.js +0 -53
- package/dist/lib/hasTextSelection.js.map +0 -1
- package/dist/lib/positions.d.ts +0 -8
- package/dist/lib/positions.js +0 -16
- package/dist/lib/positions.js.map +0 -1
- package/dist/lib/preventNativeArrowKeyPresses.d.ts +0 -4
- package/dist/lib/preventNativeArrowKeyPresses.js +0 -24
- package/dist/lib/preventNativeArrowKeyPresses.js.map +0 -1
- package/dist/lib/sumBy.d.ts +0 -1
- package/dist/lib/sumBy.js +0 -2
- package/dist/lib/sumBy.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initArrowTab.test.js","sourceRoot":"","sources":["../../src/lib/initArrowTab.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Direction } from './directions.js';
|
|
2
|
+
export declare const navigateEventName = "arrowtab:navigate";
|
|
3
|
+
export type ArrowTabNavigateEvent = CustomEvent<{
|
|
4
|
+
from: HTMLElement | null;
|
|
5
|
+
to: HTMLElement;
|
|
6
|
+
direction: Direction;
|
|
7
|
+
}>;
|
|
8
|
+
declare global {
|
|
9
|
+
interface DocumentEventMap {
|
|
10
|
+
[navigateEventName]: ArrowTabNavigateEvent;
|
|
11
|
+
}
|
|
12
|
+
interface HTMLElementEventMap {
|
|
13
|
+
[navigateEventName]: ArrowTabNavigateEvent;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export declare const dispatchNavigate: (detail: ArrowTabNavigateEvent["detail"]) => boolean;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const navigateEventName = 'arrowtab:navigate';
|
|
2
|
+
// Dispatched on the focused element before focus moves. Returns false if a listener called preventDefault().
|
|
3
|
+
export const dispatchNavigate = (detail) => (detail.from ?? document).dispatchEvent(new CustomEvent(navigateEventName, {
|
|
4
|
+
detail,
|
|
5
|
+
bubbles: true,
|
|
6
|
+
composed: true,
|
|
7
|
+
cancelable: true,
|
|
8
|
+
}));
|
|
9
|
+
//# sourceMappingURL=navigateEvent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigateEvent.js","sourceRoot":"","sources":["../../src/lib/navigateEvent.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAG,mBAAmB,CAAA;AAiBpD,6GAA6G;AAC7G,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAuC,EAAE,EAAE,CAC1E,CAAC,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,aAAa,CACrC,IAAI,WAAW,CAAC,iBAAiB,EAAE;IACjC,MAAM;IACN,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,IAAI;IACd,UAAU,EAAE,IAAI;CACjB,CAAC,CACH,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Direction } from './directions.js';
|
|
2
|
+
import type { Rect } from './geometry.js';
|
|
3
|
+
import type { Candidate, RankedCandidate, Strategy } from './strategies.js';
|
|
4
|
+
export declare const rankCandidates: ({ origin, candidates, direction, strategy, activeElement, preferred, }: {
|
|
5
|
+
origin: Rect;
|
|
6
|
+
candidates: Candidate[];
|
|
7
|
+
direction: Direction;
|
|
8
|
+
strategy: Strategy;
|
|
9
|
+
activeElement: HTMLElement | null;
|
|
10
|
+
preferred?: HTMLElement;
|
|
11
|
+
}) => RankedCandidate[];
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { isForward } from './directions.js';
|
|
2
|
+
import { containsComposed } from './dom.js';
|
|
3
|
+
const moveToFront = ({ ranked, item, }) => [
|
|
4
|
+
{ ...item, withinReach: true },
|
|
5
|
+
...ranked.filter(({ element }) => element !== item.element),
|
|
6
|
+
];
|
|
7
|
+
export const rankCandidates = ({ origin, candidates, direction, strategy, activeElement, preferred, }) => {
|
|
8
|
+
const ranked = strategy({ origin, candidates, direction });
|
|
9
|
+
const preferredItem = ranked.find(({ element, withinReach }) => withinReach && element === preferred);
|
|
10
|
+
if (preferredItem)
|
|
11
|
+
return moveToFront({ ranked, item: preferredItem });
|
|
12
|
+
if (!activeElement)
|
|
13
|
+
return ranked;
|
|
14
|
+
// Down / right enter a focusable container (e.g. a card with tabindex) at its first focusable child.
|
|
15
|
+
// Only children the strategy kept count, so custom strategies can exclude elements.
|
|
16
|
+
const kept = new Set(ranked.map(({ element }) => element));
|
|
17
|
+
const firstChild = isForward({ direction })
|
|
18
|
+
? candidates.find(({ element }) => kept.has(element) &&
|
|
19
|
+
containsComposed({ container: activeElement, element }))
|
|
20
|
+
: undefined;
|
|
21
|
+
if (firstChild)
|
|
22
|
+
return moveToFront({ ranked, item: firstChild });
|
|
23
|
+
// A focusable ancestor is only a target if nothing else is within reach.
|
|
24
|
+
// Otherwise moving right inside a focusable container could select the container itself.
|
|
25
|
+
const isAncestor = ({ element }) => containsComposed({ container: element, element: activeElement });
|
|
26
|
+
const anyOtherWithinReach = ranked.some((item) => item.withinReach && !isAncestor(item));
|
|
27
|
+
if (!anyOtherWithinReach)
|
|
28
|
+
return ranked;
|
|
29
|
+
return ranked.map((item) => isAncestor(item) ? { ...item, withinReach: false } : item);
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=rankCandidates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rankCandidates.js","sourceRoot":"","sources":["../../src/lib/rankCandidates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAkB,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAI3C,MAAM,WAAW,GAAG,CAAC,EACnB,MAAM,EACN,IAAI,GAIL,EAAqB,EAAE,CAAC;IACvB,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;IAC9B,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC;CAC5D,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAC7B,MAAM,EACN,UAAU,EACV,SAAS,EACT,QAAQ,EACR,aAAa,EACb,SAAS,GASV,EAAqB,EAAE;IACtB,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAA;IAE1D,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAC/B,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,WAAW,IAAI,OAAO,KAAK,SAAS,CACnE,CAAA;IACD,IAAI,aAAa;QAAE,OAAO,WAAW,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAA;IAEtE,IAAI,CAAC,aAAa;QAAE,OAAO,MAAM,CAAA;IAEjC,qGAAqG;IACrG,oFAAoF;IACpF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IAC1D,MAAM,UAAU,GAAG,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC;QACzC,CAAC,CAAC,UAAU,CAAC,IAAI,CACb,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CACd,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YACjB,gBAAgB,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAC1D;QACH,CAAC,CAAC,SAAS,CAAA;IACb,IAAI,UAAU;QAAE,OAAO,WAAW,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;IAEhE,yEAAyE;IACzE,yFAAyF;IACzF,MAAM,UAAU,GAAG,CAAC,EAAE,OAAO,EAAa,EAAE,EAAE,CAC5C,gBAAgB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAA;IAClE,MAAM,mBAAmB,GAAG,MAAM,CAAC,IAAI,CACrC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAChD,CAAA;IACD,IAAI,CAAC,mBAAmB;QAAE,OAAO,MAAM,CAAA;IAEvC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACzB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAC1D,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const wrapSelector = "[data-arrowtab~=\"wrap\"]";
|
|
2
|
+
/**
|
|
3
|
+
* The element navigation is restricted to:
|
|
4
|
+
* 1. The closest `data-arrowtab="scope"` or dialog around the active element, unless it is behind an open modal
|
|
5
|
+
* 2. The top most open modal, so focus can't stay behind it
|
|
6
|
+
* 3. The root (the whole document by default)
|
|
7
|
+
*/
|
|
8
|
+
export declare const getScope: ({ activeElement, root, }: {
|
|
9
|
+
activeElement: Element | null;
|
|
10
|
+
root: Element;
|
|
11
|
+
}) => Element;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { containsComposed, getComposedParent, querySelectorAllDeep, } from './dom.js';
|
|
2
|
+
import { isVisible } from './focusable.js';
|
|
3
|
+
const modalSelector = '[aria-modal="true"], dialog[open]';
|
|
4
|
+
const isOpenModal = ({ element }) => {
|
|
5
|
+
if (!element.matches(modalSelector))
|
|
6
|
+
return false;
|
|
7
|
+
if (element.tagName === 'DIALOG') {
|
|
8
|
+
// Dialogs opened with show() instead of showModal() don't trap focus
|
|
9
|
+
try {
|
|
10
|
+
return element.matches(':modal');
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return isVisible({ element });
|
|
17
|
+
};
|
|
18
|
+
export const wrapSelector = '[data-arrowtab~="wrap"]';
|
|
19
|
+
// Arrow keys never leave a dialog, even a non-modal one. It can still be left with Tab.
|
|
20
|
+
const scopeSelector = [
|
|
21
|
+
'[data-arrowtab~="scope"]',
|
|
22
|
+
wrapSelector,
|
|
23
|
+
modalSelector,
|
|
24
|
+
'dialog',
|
|
25
|
+
'[role="dialog"]',
|
|
26
|
+
'[role="alertdialog"]',
|
|
27
|
+
].join(', ');
|
|
28
|
+
/**
|
|
29
|
+
* The element navigation is restricted to:
|
|
30
|
+
* 1. The closest `data-arrowtab="scope"` or dialog around the active element, unless it is behind an open modal
|
|
31
|
+
* 2. The top most open modal, so focus can't stay behind it
|
|
32
|
+
* 3. The root (the whole document by default)
|
|
33
|
+
*/
|
|
34
|
+
export const getScope = ({ activeElement, root, }) => {
|
|
35
|
+
const openModals = querySelectorAllDeep({
|
|
36
|
+
root,
|
|
37
|
+
selector: modalSelector,
|
|
38
|
+
}).filter((element) => isOpenModal({ element }));
|
|
39
|
+
const focusedModal = activeElement
|
|
40
|
+
? [...openModals]
|
|
41
|
+
.reverse()
|
|
42
|
+
.find((modal) => containsComposed({ container: modal, element: activeElement }))
|
|
43
|
+
: undefined;
|
|
44
|
+
// Native modal dialogs make everything else inert, so focus inside one means it is on top.
|
|
45
|
+
// Otherwise the last one in the DOM is assumed to be on top.
|
|
46
|
+
const topModal = focusedModal?.tagName === 'DIALOG' ? focusedModal : openModals.at(-1);
|
|
47
|
+
let current = activeElement;
|
|
48
|
+
while (current && current !== root) {
|
|
49
|
+
if (current.matches(scopeSelector)) {
|
|
50
|
+
if (!topModal ||
|
|
51
|
+
containsComposed({ container: topModal, element: current })) {
|
|
52
|
+
return current;
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
current = getComposedParent({ element: current });
|
|
57
|
+
}
|
|
58
|
+
return topModal ?? root;
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/lib/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,MAAM,aAAa,GAAG,mCAAmC,CAAA;AAEzD,MAAM,WAAW,GAAG,CAAC,EAAE,OAAO,EAAwB,EAAE,EAAE;IACxD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QAAE,OAAO,KAAK,CAAA;IACjD,IAAI,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjC,qEAAqE;QACrE,IAAI,CAAC;YACH,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;AAC/B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,yBAAyB,CAAA;AAErD,wFAAwF;AACxF,MAAM,aAAa,GAAG;IACpB,0BAA0B;IAC1B,YAAY;IACZ,aAAa;IACb,QAAQ;IACR,iBAAiB;IACjB,sBAAsB;CACvB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EACvB,aAAa,EACb,IAAI,GAIL,EAAW,EAAE;IACZ,MAAM,UAAU,GAAG,oBAAoB,CAAC;QACtC,IAAI;QACJ,QAAQ,EAAE,aAAa;KACxB,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;IAChD,MAAM,YAAY,GAAG,aAAa;QAChC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;aACZ,OAAO,EAAE;aACT,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACd,gBAAgB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAC/D;QACL,CAAC,CAAC,SAAS,CAAA;IACb,2FAA2F;IAC3F,6DAA6D;IAC7D,MAAM,QAAQ,GACZ,YAAY,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAEvE,IAAI,OAAO,GAAG,aAAa,CAAA;IAC3B,OAAO,OAAO,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YACnC,IACE,CAAC,QAAQ;gBACT,gBAAgB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAC3D,CAAC;gBACD,OAAO,OAAO,CAAA;YAChB,CAAC;YACD,MAAK;QACP,CAAC;QACD,OAAO,GAAG,iBAAiB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;IACnD,CAAC;IAED,OAAO,QAAQ,IAAI,IAAI,CAAA;AACzB,CAAC,CAAA"}
|
package/dist/lib/strategies.d.ts
CHANGED
|
@@ -1,12 +1,23 @@
|
|
|
1
|
-
type
|
|
2
|
-
|
|
1
|
+
import { type Direction } from './directions.js';
|
|
2
|
+
import { type Rect } from './geometry.js';
|
|
3
|
+
export type Candidate = {
|
|
4
|
+
element: HTMLElement;
|
|
5
|
+
rect: Rect;
|
|
6
|
+
};
|
|
7
|
+
export type RankedCandidate = Candidate & {
|
|
3
8
|
withinReach: boolean;
|
|
4
9
|
};
|
|
5
|
-
type Strategy = (
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}) =>
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
export type Strategy = (params: {
|
|
11
|
+
origin: Rect;
|
|
12
|
+
candidates: Candidate[];
|
|
13
|
+
direction: Direction;
|
|
14
|
+
}) => RankedCandidate[];
|
|
15
|
+
/**
|
|
16
|
+
* Edge based spatial navigation, as used by Android's FocusFinder.
|
|
17
|
+
* Prefers elements in the same row / column and handles elements of different sizes.
|
|
18
|
+
*/
|
|
19
|
+
export declare const spatial: Strategy;
|
|
20
|
+
/**
|
|
21
|
+
* Center based navigation. Up / down jump to the nearest row, left / right stay in the current row.
|
|
22
|
+
*/
|
|
23
|
+
export declare const grid: Strategy;
|
package/dist/lib/strategies.js
CHANGED
|
@@ -1,120 +1,77 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
|
|
1
|
+
import { isForward, isVertical } from './directions.js';
|
|
2
|
+
import { getCenter, getCenterDistance, getMajorAxisDistance, getMajorAxisDistanceToFarEdge, getMinorAxisDistance, isCompletelyInDirection, isInBeam, isInDirection, } from './geometry.js';
|
|
3
|
+
// A candidate in the beam wins, unless (for up / down) the other one lies completely in front of it
|
|
4
|
+
const beamBeats = ({ origin, a, b, direction }) => {
|
|
5
|
+
const aInBeam = isInBeam({ origin, rect: a, direction });
|
|
6
|
+
const bInBeam = isInBeam({ origin, rect: b, direction });
|
|
7
|
+
if (bInBeam || !aInBeam)
|
|
8
|
+
return false;
|
|
9
|
+
if (!isCompletelyInDirection({ origin, rect: b, direction }))
|
|
6
10
|
return true;
|
|
7
|
-
}
|
|
8
|
-
if (event.key === 'ArrowLeft' && angle > 45 && angle < 135) {
|
|
11
|
+
if (!isVertical({ direction }))
|
|
9
12
|
return true;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
return true;
|
|
13
|
-
}
|
|
14
|
-
if (event.key === 'ArrowRight' && angle > 225 && angle < 315) {
|
|
15
|
-
return true;
|
|
16
|
-
}
|
|
17
|
-
return false;
|
|
13
|
+
return (getMajorAxisDistance({ origin, rect: a, direction }) <
|
|
14
|
+
getMajorAxisDistanceToFarEdge({ origin, rect: b, direction }));
|
|
18
15
|
};
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
return
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
withinReach,
|
|
29
|
-
};
|
|
30
|
-
});
|
|
31
|
-
const reversed = [...withData].reverse(); // Prefer down / right if same distance
|
|
32
|
-
const sorted = reversed.sort((a, b) => {
|
|
33
|
-
return a.distance - b.distance;
|
|
34
|
-
});
|
|
35
|
-
return sorted;
|
|
16
|
+
// Distance in navigation direction weighs more than the offset to the side
|
|
17
|
+
const getWeightedDistance = (params) => 13 * getMajorAxisDistance(params) ** 2 + getMinorAxisDistance(params) ** 2;
|
|
18
|
+
const compareSpatial = ({ origin, a, b, direction }) => {
|
|
19
|
+
if (beamBeats({ origin, a, b, direction }))
|
|
20
|
+
return -1;
|
|
21
|
+
if (beamBeats({ origin, a: b, b: a, direction }))
|
|
22
|
+
return 1;
|
|
23
|
+
return (getWeightedDistance({ origin, rect: a, direction }) -
|
|
24
|
+
getWeightedDistance({ origin, rect: b, direction }));
|
|
36
25
|
};
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
secondaryDistance: Infinity,
|
|
68
|
-
withinReach: false,
|
|
69
|
-
};
|
|
70
|
-
})
|
|
71
|
-
.map((item) => {
|
|
72
|
-
return {
|
|
73
|
-
...item,
|
|
74
|
-
isParentOfActiveElement: item.element.contains(activeElement),
|
|
75
|
-
};
|
|
76
|
-
});
|
|
77
|
-
items = items.map((item) => {
|
|
78
|
-
// Filter out items that are the parent of the active element.
|
|
79
|
-
// If the parent is focusable then weird things can happen. It is possible to select the parent while going right.
|
|
80
|
-
if (!item.isParentOfActiveElement) {
|
|
81
|
-
return item;
|
|
82
|
-
}
|
|
83
|
-
const anyOtherItemWithinReach = items.some((other) => {
|
|
84
|
-
if (other === item)
|
|
85
|
-
return false;
|
|
86
|
-
if (other.isParentOfActiveElement)
|
|
87
|
-
return false;
|
|
88
|
-
if (!other.withinReach)
|
|
89
|
-
return false;
|
|
90
|
-
return true;
|
|
91
|
-
});
|
|
92
|
-
if (!anyOtherItemWithinReach) {
|
|
93
|
-
return {
|
|
94
|
-
...item,
|
|
95
|
-
anyOtherItemWithinReach,
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
// if there is another item within reach, then the parent is not focusable
|
|
26
|
+
const byCenterDistance = ({ origin }) => (a, b) => getCenterDistance({ origin, rect: a.rect }) -
|
|
27
|
+
getCenterDistance({ origin, rect: b.rect });
|
|
28
|
+
/**
|
|
29
|
+
* Edge based spatial navigation, as used by Android's FocusFinder.
|
|
30
|
+
* Prefers elements in the same row / column and handles elements of different sizes.
|
|
31
|
+
*/
|
|
32
|
+
export const spatial = ({ origin, candidates, direction }) => {
|
|
33
|
+
const inDirection = candidates.filter(({ rect }) => isInDirection({ origin, rect, direction }));
|
|
34
|
+
const others = candidates.filter((item) => !inDirection.includes(item));
|
|
35
|
+
return [
|
|
36
|
+
...inDirection
|
|
37
|
+
.sort((a, b) => compareSpatial({ origin, a: a.rect, b: b.rect, direction }))
|
|
38
|
+
.map((item) => ({ ...item, withinReach: true })),
|
|
39
|
+
...others
|
|
40
|
+
.sort(byCenterDistance({ origin }))
|
|
41
|
+
.map((item) => ({ ...item, withinReach: false })),
|
|
42
|
+
];
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Center based navigation. Up / down jump to the nearest row, left / right stay in the current row.
|
|
46
|
+
*/
|
|
47
|
+
export const grid = ({ origin, candidates, direction }) => {
|
|
48
|
+
const originCenter = getCenter({ rect: origin });
|
|
49
|
+
const vertical = isVertical({ direction });
|
|
50
|
+
const sign = isForward({ direction }) ? 1 : -1;
|
|
51
|
+
const items = candidates.map((candidate) => {
|
|
52
|
+
const center = getCenter({ rect: candidate.rect });
|
|
53
|
+
const xDistance = center.x - originCenter.x;
|
|
54
|
+
const yDistance = center.y - originCenter.y;
|
|
55
|
+
const primaryDistance = vertical ? yDistance : xDistance;
|
|
99
56
|
return {
|
|
100
|
-
...
|
|
101
|
-
|
|
102
|
-
|
|
57
|
+
...candidate,
|
|
58
|
+
primaryDistance: Math.abs(primaryDistance),
|
|
59
|
+
secondaryDistance: Math.abs(vertical ? xDistance : yDistance),
|
|
60
|
+
withinReach: primaryDistance * sign > 0 &&
|
|
61
|
+
(vertical || isInBeam({ origin, rect: candidate.rect, direction })),
|
|
103
62
|
};
|
|
104
63
|
});
|
|
105
|
-
const minPrimaryDistance = Math.min(...items.map((item) =>
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
}));
|
|
111
|
-
const sorted = items.sort((a, b) => {
|
|
64
|
+
const minPrimaryDistance = Math.min(...items.map((item) => item.withinReach ? item.primaryDistance : Infinity));
|
|
65
|
+
return items
|
|
66
|
+
.sort((a, b) => {
|
|
67
|
+
if (a.withinReach !== b.withinReach)
|
|
68
|
+
return a.withinReach ? -1 : 1;
|
|
112
69
|
if (a.primaryDistance === minPrimaryDistance &&
|
|
113
70
|
b.primaryDistance === minPrimaryDistance) {
|
|
114
71
|
return a.secondaryDistance - b.secondaryDistance;
|
|
115
72
|
}
|
|
116
73
|
return a.primaryDistance - b.primaryDistance;
|
|
117
|
-
})
|
|
118
|
-
|
|
74
|
+
})
|
|
75
|
+
.map(({ element, rect, withinReach }) => ({ element, rect, withinReach }));
|
|
119
76
|
};
|
|
120
77
|
//# sourceMappingURL=strategies.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strategies.js","sourceRoot":"","sources":["../../src/lib/strategies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"strategies.js","sourceRoot":"","sources":["../../src/lib/strategies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest';
|
|
2
|
+
import { grid, spatial } from './strategies.js';
|
|
3
|
+
const rect = ({ x, y, width = 100, height = 40, }) => ({ left: x, top: y, right: x + width, bottom: y + height });
|
|
4
|
+
const candidate = ({ name, ...position }) => ({
|
|
5
|
+
element: { name },
|
|
6
|
+
rect: rect(position),
|
|
7
|
+
});
|
|
8
|
+
const names = (items) => items.map(({ element }) => element.name);
|
|
9
|
+
const origin = rect({ x: 0, y: 0 });
|
|
10
|
+
describe('spatial', () => {
|
|
11
|
+
test('right stays in the row even if elements are not exactly aligned', () => {
|
|
12
|
+
const ranked = spatial({
|
|
13
|
+
origin,
|
|
14
|
+
direction: 'right',
|
|
15
|
+
candidates: [
|
|
16
|
+
candidate({ name: 'row above', x: 110, y: -45 }),
|
|
17
|
+
candidate({ name: 'same row', x: 120, y: 10 }),
|
|
18
|
+
],
|
|
19
|
+
});
|
|
20
|
+
expect(names(ranked)).toEqual(['same row', 'row above']);
|
|
21
|
+
expect(ranked.every(({ withinReach }) => withinReach)).toBe(true);
|
|
22
|
+
});
|
|
23
|
+
test('down prefers the element below over one that is offset to the side', () => {
|
|
24
|
+
const ranked = spatial({
|
|
25
|
+
origin,
|
|
26
|
+
direction: 'down',
|
|
27
|
+
candidates: [
|
|
28
|
+
candidate({ name: 'offset', x: 150, y: 80 }),
|
|
29
|
+
candidate({ name: 'below', x: 0, y: 100 }),
|
|
30
|
+
],
|
|
31
|
+
});
|
|
32
|
+
expect(names(ranked)).toEqual(['below', 'offset']);
|
|
33
|
+
});
|
|
34
|
+
test('down picks a closer row even if it is offset to the side', () => {
|
|
35
|
+
const ranked = spatial({
|
|
36
|
+
origin,
|
|
37
|
+
direction: 'down',
|
|
38
|
+
candidates: [
|
|
39
|
+
candidate({ name: 'far below', x: 0, y: 200 }),
|
|
40
|
+
candidate({ name: 'next row', x: 150, y: 60 }),
|
|
41
|
+
],
|
|
42
|
+
});
|
|
43
|
+
expect(names(ranked)[0]).toBe('next row');
|
|
44
|
+
});
|
|
45
|
+
test('elements in the opposite direction are not within reach', () => {
|
|
46
|
+
const ranked = spatial({
|
|
47
|
+
origin,
|
|
48
|
+
direction: 'left',
|
|
49
|
+
candidates: [candidate({ name: 'right', x: 200, y: 0 })],
|
|
50
|
+
});
|
|
51
|
+
expect(ranked).toMatchObject([{ withinReach: false }]);
|
|
52
|
+
});
|
|
53
|
+
test('wide elements below are reachable from a narrow element', () => {
|
|
54
|
+
const ranked = spatial({
|
|
55
|
+
origin: rect({ x: 300, y: 0, width: 50 }),
|
|
56
|
+
direction: 'down',
|
|
57
|
+
candidates: [candidate({ name: 'wide', x: 0, y: 60, width: 600 })],
|
|
58
|
+
});
|
|
59
|
+
expect(ranked).toMatchObject([{ withinReach: true }]);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe('grid', () => {
|
|
63
|
+
test('right stays in the row even if elements are not exactly aligned', () => {
|
|
64
|
+
const ranked = grid({
|
|
65
|
+
origin,
|
|
66
|
+
direction: 'right',
|
|
67
|
+
candidates: [
|
|
68
|
+
candidate({ name: 'row above', x: 110, y: -45 }),
|
|
69
|
+
candidate({ name: 'same row', x: 120, y: 10 }),
|
|
70
|
+
],
|
|
71
|
+
});
|
|
72
|
+
expect(ranked.filter(({ withinReach }) => withinReach)).toHaveLength(1);
|
|
73
|
+
expect(names(ranked)[0]).toBe('same row');
|
|
74
|
+
});
|
|
75
|
+
test('down jumps to the nearest row, then the nearest column', () => {
|
|
76
|
+
const ranked = grid({
|
|
77
|
+
origin,
|
|
78
|
+
direction: 'down',
|
|
79
|
+
candidates: [
|
|
80
|
+
candidate({ name: 'row 2 far', x: 400, y: 60 }),
|
|
81
|
+
candidate({ name: 'row 3', x: 0, y: 120 }),
|
|
82
|
+
candidate({ name: 'row 2 near', x: 150, y: 60 }),
|
|
83
|
+
],
|
|
84
|
+
});
|
|
85
|
+
expect(names(ranked)).toEqual(['row 2 near', 'row 2 far', 'row 3']);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=strategies.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategies.test.js","sourceRoot":"","sources":["../../src/lib/strategies.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { isVertical } from './directions.js';
|
|
2
|
+
import { closestComposed } from './dom.js';
|
|
3
|
+
const horizontal = ['left', 'right'];
|
|
4
|
+
const vertical = ['up', 'down'];
|
|
5
|
+
const all = [...horizontal, ...vertical];
|
|
6
|
+
// Composite widgets implement their own arrow key navigation: https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/
|
|
7
|
+
const directionsByRole = {
|
|
8
|
+
grid: all,
|
|
9
|
+
treegrid: all,
|
|
10
|
+
radiogroup: all,
|
|
11
|
+
listbox: vertical,
|
|
12
|
+
menu: vertical,
|
|
13
|
+
tree: vertical,
|
|
14
|
+
menubar: horizontal,
|
|
15
|
+
tablist: horizontal,
|
|
16
|
+
toolbar: horizontal,
|
|
17
|
+
};
|
|
18
|
+
const directionsByOrientation = {
|
|
19
|
+
horizontal,
|
|
20
|
+
vertical,
|
|
21
|
+
};
|
|
22
|
+
const widgetSelector = Object.keys(directionsByRole)
|
|
23
|
+
.map((role) => `[role="${role}"]`)
|
|
24
|
+
.join(', ');
|
|
25
|
+
const popupTriggerSelector = '[role="combobox"][aria-expanded="true"], [aria-haspopup]:not([aria-haspopup="false"])[aria-expanded="true"]';
|
|
26
|
+
const getWidgetDirections = ({ widget }) => {
|
|
27
|
+
const byRole = directionsByRole[widget.getAttribute('role') ?? ''] ?? [];
|
|
28
|
+
if (byRole === all)
|
|
29
|
+
return all;
|
|
30
|
+
return (directionsByOrientation[widget.getAttribute('aria-orientation') ?? ''] ??
|
|
31
|
+
byRole);
|
|
32
|
+
};
|
|
33
|
+
// Whether the arrow key belongs to an ARIA widget, e.g. an open combobox, a menu or a tablist
|
|
34
|
+
export const isHandledByWidget = ({ activeElement, direction, }) => {
|
|
35
|
+
if (closestComposed({
|
|
36
|
+
element: activeElement,
|
|
37
|
+
selector: '[data-arrowtab~="enable"]',
|
|
38
|
+
})) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
if (activeElement.matches(popupTriggerSelector)) {
|
|
42
|
+
return isVertical({ direction });
|
|
43
|
+
}
|
|
44
|
+
const widget = closestComposed({
|
|
45
|
+
element: activeElement,
|
|
46
|
+
selector: widgetSelector,
|
|
47
|
+
});
|
|
48
|
+
return widget ? getWidgetDirections({ widget }).includes(direction) : false;
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=widgets.js.map
|