arrowtab 0.0.2 → 0.0.3

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 (62) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +110 -3
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.js +2 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/index.test.d.ts +1 -0
  7. package/dist/index.test.js +6 -0
  8. package/dist/index.test.js.map +1 -0
  9. package/dist/lib/debugMode.d.ts +8 -0
  10. package/dist/lib/debugMode.js +68 -0
  11. package/dist/lib/debugMode.js.map +1 -0
  12. package/dist/lib/distances.d.ts +13 -0
  13. package/dist/lib/distances.js +15 -0
  14. package/dist/lib/distances.js.map +1 -0
  15. package/dist/lib/getAngle.d.ts +4 -0
  16. package/dist/lib/getAngle.js +15 -0
  17. package/dist/lib/getAngle.js.map +1 -0
  18. package/dist/lib/getFocusable.js +29 -0
  19. package/dist/lib/getFocusable.js.map +1 -0
  20. package/dist/lib/getXyDistance.d.ts +7 -0
  21. package/dist/lib/getXyDistance.js +12 -0
  22. package/dist/lib/getXyDistance.js.map +1 -0
  23. package/dist/lib/hasDisabledKeys.d.ts +4 -0
  24. package/dist/lib/hasDisabledKeys.js +26 -0
  25. package/dist/lib/hasDisabledKeys.js.map +1 -0
  26. package/dist/lib/hasTextSelection.d.ts +4 -0
  27. package/dist/lib/hasTextSelection.js +53 -0
  28. package/dist/lib/hasTextSelection.js.map +1 -0
  29. package/dist/lib/initArrowTab.d.ts +5 -0
  30. package/dist/lib/initArrowTab.js +102 -0
  31. package/dist/lib/initArrowTab.js.map +1 -0
  32. package/dist/lib/positions.js +16 -0
  33. package/dist/lib/positions.js.map +1 -0
  34. package/dist/lib/preventNativeArrowKeyPresses.d.ts +4 -0
  35. package/dist/lib/preventNativeArrowKeyPresses.js +24 -0
  36. package/dist/lib/preventNativeArrowKeyPresses.js.map +1 -0
  37. package/dist/lib/strategies.d.ts +9 -23
  38. package/dist/lib/strategies.js +111 -39
  39. package/dist/lib/strategies.js.map +1 -1
  40. package/dist/lib/{sumBy.mjs → sumBy.js} +1 -1
  41. package/dist/lib/sumBy.js.map +1 -0
  42. package/package.json +36 -10
  43. package/.prettierrc +0 -5
  44. package/.vscode/settings.json +0 -4
  45. package/dist/index.d.mts +0 -1
  46. package/dist/index.mjs +0 -177
  47. package/dist/index.mjs.map +0 -1
  48. package/dist/lib/getFocusable.mjs +0 -15
  49. package/dist/lib/getFocusable.mjs.map +0 -1
  50. package/dist/lib/positions.mjs +0 -12
  51. package/dist/lib/positions.mjs.map +0 -1
  52. package/dist/lib/sumBy.mjs.map +0 -1
  53. package/index.html +0 -142
  54. package/src/index.mts +0 -228
  55. package/src/lib/getFocusable.mts +0 -13
  56. package/src/lib/positions.mts +0 -12
  57. package/src/lib/strategies.ts +0 -62
  58. package/src/lib/sumBy.mts +0 -4
  59. package/tsconfig.json +0 -20
  60. /package/dist/lib/{getFocusable.d.mts → getFocusable.d.ts} +0 -0
  61. /package/dist/lib/{positions.d.mts → positions.d.ts} +0 -0
  62. /package/dist/lib/{sumBy.d.mts → sumBy.d.ts} +0 -0
@@ -0,0 +1,24 @@
1
+ const inputTypesWithAllowedNativeArrowKeyPresses = {
2
+ text: ['ArrowLeft', 'ArrowRight'],
3
+ date: ['ArrowLeft', 'ArrowRight'],
4
+ time: ['ArrowLeft', 'ArrowRight'],
5
+ datetime: ['ArrowLeft', 'ArrowRight'],
6
+ 'datetime-local': ['ArrowLeft', 'ArrowRight'],
7
+ month: ['ArrowLeft', 'ArrowRight'],
8
+ week: ['ArrowLeft', 'ArrowRight'],
9
+ number: ['ArrowLeft', 'ArrowRight'],
10
+ };
11
+ export const preventNativeArrowKeyPresses = ({ event, activeElement, }) => {
12
+ if (activeElement instanceof HTMLInputElement) {
13
+ const inputType = activeElement.type;
14
+ const allowedKeys = inputTypesWithAllowedNativeArrowKeyPresses[inputType];
15
+ if (allowedKeys && allowedKeys.includes(event.key)) {
16
+ return;
17
+ }
18
+ }
19
+ if (activeElement instanceof HTMLTextAreaElement) {
20
+ return;
21
+ }
22
+ event.preventDefault();
23
+ };
24
+ //# sourceMappingURL=preventNativeArrowKeyPresses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preventNativeArrowKeyPresses.js","sourceRoot":"","sources":["../../src/lib/preventNativeArrowKeyPresses.ts"],"names":[],"mappings":"AAAA,MAAM,0CAA0C,GAA6B;IAC3E,IAAI,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;IACjC,IAAI,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;IACjC,IAAI,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;IACjC,QAAQ,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;IACrC,gBAAgB,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;IAC7C,KAAK,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;IAClC,IAAI,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;IACjC,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;CACpC,CAAA;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,EAC3C,KAAK,EACL,aAAa,GAId,EAAE,EAAE;IACH,IAAI,aAAa,YAAY,gBAAgB,EAAE,CAAC;QAC9C,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAA;QACpC,MAAM,WAAW,GAAG,0CAA0C,CAAC,SAAS,CAAC,CAAA;QACzE,IAAI,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACnD,OAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,aAAa,YAAY,mBAAmB,EAAE,CAAC;QACjD,OAAM;IACR,CAAC;IAED,KAAK,CAAC,cAAc,EAAE,CAAA;AACxB,CAAC,CAAA"}
@@ -1,26 +1,12 @@
1
- type StrategyInput = {
2
- event: KeyboardEvent;
3
- xDistance: number;
4
- yDistance: number;
1
+ type StrategyItem = {
5
2
  element: Element;
6
- angle: number;
7
- position: {
8
- x: number;
9
- y: number;
10
- };
11
- };
12
- export declare const strategy: {
13
- XWalkEuclidean: {
14
- withinReachMetric: ({ angle, event }: StrategyInput) => boolean;
15
- distanceMetric: ({ xDistance, yDistance }: StrategyInput) => number;
16
- };
17
- XWalkManhattan: {
18
- withinReachMetric: ({ angle, event }: StrategyInput) => boolean;
19
- distanceMetric: ({ xDistance, yDistance }: StrategyInput) => number;
20
- };
21
- XWalkManhattanWeighted: {
22
- withinReachMetric: ({ angle, event }: StrategyInput) => boolean;
23
- distanceMetric: ({ xDistance, yDistance, event }: StrategyInput) => number | undefined;
24
- };
3
+ withinReach: boolean;
25
4
  };
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;
26
12
  export {};
@@ -1,48 +1,120 @@
1
- const withinReachMetrics = {
2
- XWalk: ({ angle, event }) => {
3
- if (event.key === 'ArrowDown' && (angle >= 315 || angle <= 45)) {
4
- return true;
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)) {
6
+ return true;
7
+ }
8
+ if (event.key === 'ArrowLeft' && angle > 45 && angle < 135) {
9
+ 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;
18
+ };
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;
36
+ };
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
+ };
5
50
  }
6
- if (event.key === 'ArrowLeft' && angle > 45 && angle < 135) {
7
- return true;
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
+ };
8
63
  }
9
- if (event.key === 'ArrowUp' && angle >= 135 && angle <= 225) {
10
- return true;
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;
11
82
  }
12
- if (event.key === 'ArrowRight' && angle > 225 && angle < 315) {
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;
13
90
  return true;
91
+ });
92
+ if (!anyOtherItemWithinReach) {
93
+ return {
94
+ ...item,
95
+ anyOtherItemWithinReach,
96
+ };
14
97
  }
15
- return false;
16
- },
17
- };
18
- const distanceMetrics = {
19
- euclidean: ({ xDistance, yDistance }) => {
20
- return Math.sqrt(xDistance ** 2 + yDistance ** 2);
21
- },
22
- manhattan: ({ xDistance, yDistance }) => {
23
- return Math.abs(xDistance) + Math.abs(yDistance);
24
- },
25
- manhattanWeighted: ({ xDistance, yDistance, event }) => {
26
- if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
27
- return Math.abs(xDistance) + Math.abs(yDistance) * 0.1;
98
+ // if there is another item within reach, then the parent is not focusable
99
+ return {
100
+ ...item,
101
+ withinReach: false,
102
+ anyOtherItemWithinReach,
103
+ };
104
+ });
105
+ const minPrimaryDistance = Math.min(...items.map((item) => {
106
+ if (!item.withinReach) {
107
+ return Infinity;
28
108
  }
29
- if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {
30
- return Math.abs(xDistance) * 0.1 + Math.abs(yDistance);
109
+ return item.primaryDistance;
110
+ }));
111
+ const sorted = items.sort((a, b) => {
112
+ if (a.primaryDistance === minPrimaryDistance &&
113
+ b.primaryDistance === minPrimaryDistance) {
114
+ return a.secondaryDistance - b.secondaryDistance;
31
115
  }
32
- },
33
- };
34
- export const strategy = {
35
- XWalkEuclidean: {
36
- withinReachMetric: withinReachMetrics.XWalk,
37
- distanceMetric: distanceMetrics.euclidean,
38
- },
39
- XWalkManhattan: {
40
- withinReachMetric: withinReachMetrics.XWalk,
41
- distanceMetric: distanceMetrics.manhattan,
42
- },
43
- XWalkManhattanWeighted: {
44
- withinReachMetric: withinReachMetrics.XWalk,
45
- distanceMetric: distanceMetrics.manhattanWeighted,
46
- },
116
+ return a.primaryDistance - b.primaryDistance;
117
+ });
118
+ return sorted;
47
119
  };
48
120
  //# sourceMappingURL=strategies.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"strategies.js","sourceRoot":"","sources":["../../src/lib/strategies.ts"],"names":[],"mappings":"AASA,MAAM,kBAAkB,GAAG;IACzB,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAiB,EAAE,EAAE;QACzC,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;YAC/D,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;YAC3D,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;YAC5D,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;CACF,CAAA;AAED,MAAM,eAAe,GAAG;IACtB,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,EAAiB,EAAE,EAAE;QACrD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,SAAS,IAAI,CAAC,CAAC,CAAA;IACnD,CAAC;IACD,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,EAAiB,EAAE,EAAE;QACrD,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAClD,CAAC;IACD,iBAAiB,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAiB,EAAE,EAAE;QACpE,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YACzD,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,GAAG,CAAA;QACxD,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,EAAE,CAAC;YAC5D,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACxD,CAAC;IACH,CAAC;CACF,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,cAAc,EAAE;QACd,iBAAiB,EAAE,kBAAkB,CAAC,KAAK;QAC3C,cAAc,EAAE,eAAe,CAAC,SAAS;KAC1C;IACD,cAAc,EAAE;QACd,iBAAiB,EAAE,kBAAkB,CAAC,KAAK;QAC3C,cAAc,EAAE,eAAe,CAAC,SAAS;KAC1C;IACD,sBAAsB,EAAE;QACtB,iBAAiB,EAAE,kBAAkB,CAAC,KAAK;QAC3C,cAAc,EAAE,eAAe,CAAC,iBAAiB;KAClD;CACF,CAAA"}
1
+ {"version":3,"file":"strategies.js","sourceRoot":"","sources":["../../src/lib/strategies.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
1
  export const sumBy = (arr, func) => arr.reduce((acc, item) => acc + func(item), 0);
2
- //# sourceMappingURL=sumBy.mjs.map
2
+ //# sourceMappingURL=sumBy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sumBy.js","sourceRoot":"","sources":["../../src/lib/sumBy.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,CACnB,GAAa,EACb,IAAyB,EACzB,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,22 +1,48 @@
1
1
  {
2
2
  "name": "arrowtab",
3
- "version": "0.0.2",
4
- "description": "",
5
- "main": "dist/index.mjs",
6
- "keywords": [],
7
- "author": "",
3
+ "version": "0.0.3",
4
+ "description": "Use arrow keys to \"tab\" between focusable elements",
5
+ "keywords": [
6
+ "arrowkeys",
7
+ "tab",
8
+ "focus",
9
+ "navigation"
10
+ ],
11
+ "main": "dist/index.js",
12
+ "author": "Sean Nicholas",
8
13
  "license": "MIT",
9
14
  "type": "module",
10
15
  "devDependencies": {
16
+ "@arethetypeswrong/cli": "^0.15.4",
17
+ "@changesets/cli": "^2.27.7",
11
18
  "concurrently": "^8.2.2",
12
19
  "http-server": "^14.1.1",
13
- "typescript": "^5.5.4"
20
+ "prettier": "^3.3.3",
21
+ "prettier-ignore": "^0.1.3",
22
+ "typescript": "^5.5.4",
23
+ "vitest": "^2.0.5"
14
24
  },
25
+ "homepage": "https://github.com/sean-nicholas/arrowtab",
26
+ "bugs": {
27
+ "url": "https://github.com/sean-nicholas/arrowtab/issues"
28
+ },
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "git+https://github.com/sean-nicholas/arrowtab.git"
32
+ },
33
+ "files": [
34
+ "dist"
35
+ ],
15
36
  "scripts": {
16
- "test": "echo \"Error: no test specified\" && exit 1",
17
- "dev": "concurrently \"tsc --watch\" \"http-server -o\"",
18
- "build": "tsc",
37
+ "test": "vitest run",
38
+ "dev": "concurrently \"tsc --watch\" \"http-server -o --cors\"",
39
+ "build": "pnpm clean && tsc",
40
+ "prepublish": "pnpm clean && pnpm build",
19
41
  "clean": "rm -rf dist",
20
- "prepublish": "pnpm clean && pnpm build"
42
+ "ci": "pnpm run build && pnpm run check-format && pnpm run check-exports && pnpm run test",
43
+ "format": "prettier --ignore-path ./node_modules/prettier-ignore/prettierignore --write .",
44
+ "check-format": "prettier --ignore-path ./node_modules/prettier-ignore/prettierignore --check .",
45
+ "check-exports": "attw --pack . --ignore-rules=cjs-resolves-to-esm",
46
+ "local-release": "changeset version && changeset publish"
21
47
  }
22
48
  }
package/.prettierrc DELETED
@@ -1,5 +0,0 @@
1
- {
2
- "singleQuote": true,
3
- "semi": false,
4
- "trailingComma": "all"
5
- }
@@ -1,4 +0,0 @@
1
- {
2
- "git.branchProtection": [],
3
- "cSpell.words": ["arrowtab"]
4
- }
package/dist/index.d.mts DELETED
@@ -1 +0,0 @@
1
- export declare const initArrowTab: () => void;
package/dist/index.mjs DELETED
@@ -1,177 +0,0 @@
1
- // TODO: Options
2
- // modifierKey: 'ctrlKey',
3
- // onlyWithModifierKey: false, // TODO: Better name
4
- // strategy: arrowTab.XWalkEuclidean,
5
- // selector: undefined,
6
- // elementFilter: () => boolean,
7
- // getElementPosition: (element) => { x: number, y: number },
8
- // eventTriggerName: 'keydown' | 'keyup',
9
- // earlyReturn: (event) => boolean, // TODO: Better name
10
- import { getFocusable } from './lib/getFocusable.mjs';
11
- import { getMiddle } from './lib/positions.mjs';
12
- import { strategy } from './lib/strategies.js';
13
- import { sumBy } from './lib/sumBy.mjs';
14
- export const initArrowTab = () => {
15
- document.addEventListener('keydown', (event) => {
16
- const activeStrategy = strategy.XWalkEuclidean;
17
- const activeElement = document.activeElement === document.body
18
- ? getFocusable()?.[0]
19
- : document.activeElement;
20
- if (!activeElement) {
21
- return;
22
- }
23
- if (event.key !== 'ArrowLeft' &&
24
- event.key !== 'ArrowRight' &&
25
- event.key !== 'ArrowUp' &&
26
- event.key !== 'ArrowDown') {
27
- return;
28
- }
29
- if (activeElement instanceof HTMLInputElement ||
30
- activeElement instanceof HTMLTextAreaElement) {
31
- const selectionStart = activeElement.selectionStart;
32
- const selectionEnd = activeElement.selectionEnd;
33
- if (event.key === 'ArrowLeft' &&
34
- selectionStart !== undefined &&
35
- selectionStart !== null &&
36
- selectionStart !== 0) {
37
- return;
38
- }
39
- if (event.key === 'ArrowRight' &&
40
- selectionStart !== undefined &&
41
- selectionStart !== null &&
42
- selectionStart !== activeElement.value?.length) {
43
- return;
44
- }
45
- if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') &&
46
- selectionStart !== undefined &&
47
- selectionEnd !== undefined &&
48
- selectionStart !== null &&
49
- selectionEnd !== null &&
50
- selectionStart !== selectionEnd) {
51
- return;
52
- }
53
- if (event.key === 'ArrowUp' &&
54
- selectionStart !== undefined &&
55
- selectionStart !== null &&
56
- activeElement instanceof HTMLTextAreaElement) {
57
- const rows = activeElement.value?.split('\n');
58
- const start = selectionStart;
59
- const firstRow = rows.at(0);
60
- if (firstRow && start > firstRow.length) {
61
- return;
62
- }
63
- }
64
- if (event.key === 'ArrowDown' &&
65
- selectionStart !== undefined &&
66
- selectionStart !== null &&
67
- activeElement instanceof HTMLTextAreaElement) {
68
- const rows = activeElement.value?.split('\n');
69
- const withoutLastRow = rows.slice(0, -1);
70
- const lengthUntilLastRow = sumBy(withoutLastRow, (row) => row.length);
71
- const start = selectionStart;
72
- if (start <= lengthUntilLastRow + 1) {
73
- return;
74
- }
75
- }
76
- }
77
- const inputTypesThatNeedModifierKey = {
78
- date: ['ArrowDown', 'ArrowUp'],
79
- time: ['ArrowDown', 'ArrowUp'],
80
- datetime: ['ArrowDown', 'ArrowUp'],
81
- 'datetime-local': ['ArrowDown', 'ArrowUp'],
82
- month: ['ArrowDown', 'ArrowUp'],
83
- week: ['ArrowDown', 'ArrowUp'],
84
- number: ['ArrowDown', 'ArrowUp'],
85
- range: ['ArrowDown', 'ArrowUp', 'ArrowLeft', 'ArrowRight'],
86
- };
87
- if (activeElement instanceof HTMLInputElement) {
88
- const inputType = activeElement.type;
89
- if (inputTypesThatNeedModifierKey[inputType] &&
90
- inputTypesThatNeedModifierKey[inputType].includes(event.key)) {
91
- // TODO: Use modifierKey
92
- if (!event.shiftKey) {
93
- return;
94
- }
95
- else {
96
- event.preventDefault();
97
- }
98
- }
99
- }
100
- const activePosition = getMiddle(activeElement);
101
- const allFocusable = getFocusable();
102
- const withoutActiveElement = allFocusable.filter((element) => element !== activeElement);
103
- const withPosition = withoutActiveElement.map((element) => {
104
- const position = getMiddle(element);
105
- // Calculate angle between active element and focusable element
106
- const xDistance = position.x - activePosition.x;
107
- const yDistance = position.y - activePosition.y;
108
- let angle = Math.acos(yDistance / Math.sqrt(xDistance ** 2 + yDistance ** 2)) *
109
- (180 / Math.PI);
110
- const direction = xDistance > 0 ? 'right' : 'left';
111
- if (direction === 'right') {
112
- angle = 360 - angle;
113
- }
114
- return {
115
- xDistance,
116
- yDistance,
117
- element,
118
- angle,
119
- position,
120
- };
121
- });
122
- const withDistance = withPosition.map((focusable) => {
123
- const distance = activeStrategy.distanceMetric({ ...focusable, event });
124
- return {
125
- ...focusable,
126
- distance,
127
- };
128
- });
129
- const withWithinReach = withDistance.map((focusable) => {
130
- const withinReach = activeStrategy.withinReachMetric({
131
- ...focusable,
132
- event,
133
- });
134
- return {
135
- ...focusable,
136
- withinReach,
137
- };
138
- });
139
- const reversed = [...withWithinReach].reverse(); // Prefer down / right if same distance
140
- const sorted = reversed.sort((a, b) => {
141
- return a.distance - b.distance;
142
- });
143
- const withinReach = sorted.filter(({ withinReach }) => withinReach);
144
- let nearest = withinReach.at(0);
145
- if (!nearest) {
146
- return;
147
- }
148
- // const nearlySameDistance = _.filter(candidates, (candidate) => {
149
- // return candidate.distance - nearest.distance < 10
150
- // })
151
- // console.log('nearlySameDistance', nearlySameDistance)
152
- // if (nearlySameDistance.length > 1) {
153
- // const ordered = _.orderBy(nearlySameDistance, (candidate) => {
154
- // if (event.key === 'ArrowDown') {
155
- // console.log('ArrowDown', candidate.xDistance)
156
- // return -candidate.xDistance
157
- // }
158
- // if (event.key === 'ArrowUp') {
159
- // return candidate.xDistance
160
- // }
161
- // if (event.key === 'ArrowLeft') {
162
- // return candidate.yDistance
163
- // }
164
- // if (event.key === 'ArrowRight') {
165
- // console.log('ArrowRight', candidate.yDistance)
166
- // return -candidate.yDistance
167
- // }
168
- // })
169
- // console.log('ordered', ordered)
170
- // nearest = _.first(ordered)
171
- // }
172
- if (nearest.element instanceof HTMLElement) {
173
- nearest.element.focus();
174
- }
175
- }, { capture: true });
176
- };
177
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- export const getFocusable = () => {
2
- // Selectors from https://zellwk.com/blog/keyboard-focusable-elements/
3
- const allFocusable = document.querySelectorAll('a[href], button, input, textarea, select, details, [tabindex]:not([tabindex^="-"])');
4
- const focusable = Array.from(allFocusable).filter((element) => {
5
- if ('disabled' in element && element.disabled)
6
- return false;
7
- if ('hidden' in element && element.hidden)
8
- return false;
9
- if (element.getAttribute('aria-hidden') === 'true')
10
- return false;
11
- return true;
12
- });
13
- return focusable;
14
- };
15
- //# sourceMappingURL=getFocusable.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getFocusable.mjs","sourceRoot":"","sources":["../../src/lib/getFocusable.mts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE;IAC/B,sEAAsE;IACtE,MAAM,YAAY,GAAG,QAAQ,CAAC,gBAAgB,CAC5C,oFAAoF,CACrF,CAAA;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;QAC5D,IAAI,UAAU,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAA;QAC3D,IAAI,QAAQ,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM;YAAE,OAAO,KAAK,CAAA;QACvD,IAAI,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,MAAM;YAAE,OAAO,KAAK,CAAA;QAChE,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA"}
@@ -1,12 +0,0 @@
1
- export const getMiddle = (element) => {
2
- const { x, y, width, height } = element.getBoundingClientRect();
3
- return {
4
- x: x + width / 2,
5
- y: y + height / 2,
6
- };
7
- };
8
- export const getTopLeft = (element) => {
9
- const { x, y } = element.getBoundingClientRect();
10
- return { x, y };
11
- };
12
- //# sourceMappingURL=positions.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"positions.mjs","sourceRoot":"","sources":["../../src/lib/positions.mts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC5C,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAA;IAC/D,OAAO;QACL,CAAC,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC;QAChB,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,CAAC;KAClB,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC7C,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAA;IAChD,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;AACjB,CAAC,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"sumBy.mjs","sourceRoot":"","sources":["../../src/lib/sumBy.mts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,CACnB,GAAa,EACb,IAAyB,EACzB,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA"}