arrowtab 0.0.4 → 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.
Files changed (86) hide show
  1. package/README.md +129 -1
  2. package/dist/index.d.ts +5 -1
  3. package/dist/index.js +2 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/caret.d.ts +5 -0
  6. package/dist/lib/caret.js +136 -0
  7. package/dist/lib/caret.js.map +1 -0
  8. package/dist/lib/changesValueOnArrowKeys.d.ts +3 -0
  9. package/dist/lib/changesValueOnArrowKeys.js +15 -0
  10. package/dist/lib/changesValueOnArrowKeys.js.map +1 -0
  11. package/dist/lib/debugMode.d.ts +5 -5
  12. package/dist/lib/debugMode.js +28 -32
  13. package/dist/lib/debugMode.js.map +1 -1
  14. package/dist/lib/directions.d.ts +13 -0
  15. package/dist/lib/directions.js +17 -0
  16. package/dist/lib/directions.js.map +1 -0
  17. package/dist/lib/dom.d.ts +16 -0
  18. package/dist/lib/dom.js +62 -0
  19. package/dist/lib/dom.js.map +1 -0
  20. package/dist/lib/focusHistory.d.ts +11 -0
  21. package/dist/lib/focusHistory.js +72 -0
  22. package/dist/lib/focusHistory.js.map +1 -0
  23. package/dist/lib/focusTracker.d.ts +12 -0
  24. package/dist/lib/focusTracker.js +43 -0
  25. package/dist/lib/focusTracker.js.map +1 -0
  26. package/dist/lib/focusable.d.ts +8 -0
  27. package/dist/lib/focusable.js +135 -0
  28. package/dist/lib/focusable.js.map +1 -0
  29. package/dist/lib/geometry.d.ts +35 -0
  30. package/dist/lib/geometry.js +70 -0
  31. package/dist/lib/geometry.js.map +1 -0
  32. package/dist/lib/hasDisabledKeys.d.ts +4 -3
  33. package/dist/lib/hasDisabledKeys.js +5 -25
  34. package/dist/lib/hasDisabledKeys.js.map +1 -1
  35. package/dist/lib/initArrowTab.d.ts +12 -2
  36. package/dist/lib/initArrowTab.js +133 -70
  37. package/dist/lib/initArrowTab.js.map +1 -1
  38. package/dist/lib/initArrowTab.test.d.ts +1 -0
  39. package/dist/lib/initArrowTab.test.js +689 -0
  40. package/dist/lib/initArrowTab.test.js.map +1 -0
  41. package/dist/lib/navigateEvent.d.ts +16 -0
  42. package/dist/lib/navigateEvent.js +9 -0
  43. package/dist/lib/navigateEvent.js.map +1 -0
  44. package/dist/lib/rankCandidates.d.ts +11 -0
  45. package/dist/lib/rankCandidates.js +31 -0
  46. package/dist/lib/rankCandidates.js.map +1 -0
  47. package/dist/lib/scope.d.ts +11 -0
  48. package/dist/lib/scope.js +60 -0
  49. package/dist/lib/scope.js.map +1 -0
  50. package/dist/lib/strategies.d.ts +21 -10
  51. package/dist/lib/strategies.js +63 -106
  52. package/dist/lib/strategies.js.map +1 -1
  53. package/dist/lib/strategies.test.d.ts +1 -0
  54. package/dist/lib/strategies.test.js +88 -0
  55. package/dist/lib/strategies.test.js.map +1 -0
  56. package/dist/lib/widgets.d.ts +5 -0
  57. package/dist/lib/widgets.js +50 -0
  58. package/dist/lib/widgets.js.map +1 -0
  59. package/dist/lib/wrap.d.ts +12 -0
  60. package/dist/lib/wrap.js +21 -0
  61. package/dist/lib/wrap.js.map +1 -0
  62. package/package.json +2 -1
  63. package/dist/lib/distances.d.ts +0 -13
  64. package/dist/lib/distances.js +0 -15
  65. package/dist/lib/distances.js.map +0 -1
  66. package/dist/lib/getAngle.d.ts +0 -4
  67. package/dist/lib/getAngle.js +0 -15
  68. package/dist/lib/getAngle.js.map +0 -1
  69. package/dist/lib/getFocusable.d.ts +0 -1
  70. package/dist/lib/getFocusable.js +0 -29
  71. package/dist/lib/getFocusable.js.map +0 -1
  72. package/dist/lib/getXyDistance.d.ts +0 -7
  73. package/dist/lib/getXyDistance.js +0 -12
  74. package/dist/lib/getXyDistance.js.map +0 -1
  75. package/dist/lib/hasTextSelection.d.ts +0 -4
  76. package/dist/lib/hasTextSelection.js +0 -53
  77. package/dist/lib/hasTextSelection.js.map +0 -1
  78. package/dist/lib/positions.d.ts +0 -8
  79. package/dist/lib/positions.js +0 -16
  80. package/dist/lib/positions.js.map +0 -1
  81. package/dist/lib/preventNativeArrowKeyPresses.d.ts +0 -4
  82. package/dist/lib/preventNativeArrowKeyPresses.js +0 -24
  83. package/dist/lib/preventNativeArrowKeyPresses.js.map +0 -1
  84. package/dist/lib/sumBy.d.ts +0 -1
  85. package/dist/lib/sumBy.js +0 -2
  86. 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"}
@@ -1,12 +1,23 @@
1
- type StrategyItem = {
2
- element: Element;
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 = (options: {
6
- event: KeyboardEvent;
7
- focusableElements: Element[];
8
- activeElement: Element;
9
- }) => StrategyItem[];
10
- export declare const getByXWalkEuclidean: Strategy;
11
- export declare const getByGrid: Strategy;
12
- export {};
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;
@@ -1,120 +1,77 @@
1
- import { getEuclideanDistance } from './distances.js';
2
- import { getAngle } from './getAngle.js';
3
- import { getXyDistance } from './getXyDistance.js';
4
- const getIsWithinXWalk = ({ angle, event, }) => {
5
- if (event.key === 'ArrowDown' && (angle >= 315 || angle <= 45)) {
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
- if (event.key === 'ArrowUp' && angle >= 135 && angle <= 225) {
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
- export const getByXWalkEuclidean = ({ focusableElements, activeElement, event, }) => {
20
- const withData = focusableElements.map((element) => {
21
- const distances = getXyDistance({ activeElement, element });
22
- const distance = getEuclideanDistance(distances);
23
- const angle = getAngle({ activeElement, element });
24
- const withinReach = getIsWithinXWalk({ angle, event });
25
- return {
26
- element,
27
- distance,
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
- export const getByGrid = ({ focusableElements, activeElement, event, }) => {
38
- let items = focusableElements
39
- .map((element) => {
40
- const distances = getXyDistance({ activeElement, element });
41
- if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
42
- return {
43
- element,
44
- primaryDistance: Math.abs(distances.yDistance),
45
- secondaryDistance: Math.abs(distances.xDistance),
46
- withinReach: event.key === 'ArrowDown'
47
- ? distances.yDistance > 0
48
- : distances.yDistance < 0,
49
- };
50
- }
51
- if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {
52
- // TODO: Maybe not only exact matches. Maybe height of element + x% is search space. If it hits only top/left or bottom/right, then it's within reach.
53
- const correctDirection = event.key === 'ArrowRight'
54
- ? distances.xDistance > 0
55
- : distances.xDistance < 0;
56
- const isSameYAsActiveElement = distances.yDistance === 0;
57
- return {
58
- element,
59
- primaryDistance: Math.abs(distances.xDistance),
60
- secondaryDistance: 0,
61
- withinReach: correctDirection && isSameYAsActiveElement,
62
- };
63
- }
64
- return {
65
- element,
66
- primaryDistance: Infinity,
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
- ...item,
101
- withinReach: false,
102
- anyOtherItemWithinReach,
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
- if (!item.withinReach) {
107
- return Infinity;
108
- }
109
- return item.primaryDistance;
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
- return sorted;
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":"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"}
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,5 @@
1
+ import { type Direction } from './directions.js';
2
+ export declare const isHandledByWidget: ({ activeElement, direction, }: {
3
+ activeElement: Element;
4
+ direction: Direction;
5
+ }) => boolean;
@@ -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