arrowtab 0.0.5 → 0.2.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 +134 -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 +7 -6
  21. package/dist/lib/focusHistory.js +52 -40
  22. package/dist/lib/focusHistory.js.map +1 -1
  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 +138 -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 +11 -2
  36. package/dist/lib/initArrowTab.js +129 -72
  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 +736 -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,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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgets.js","sourceRoot":"","sources":["../../src/lib/widgets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAkB,MAAM,iBAAiB,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE1C,MAAM,UAAU,GAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AACjD,MAAM,QAAQ,GAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AAC5C,MAAM,GAAG,GAAgB,CAAC,GAAG,UAAU,EAAE,GAAG,QAAQ,CAAC,CAAA;AAErD,4HAA4H;AAC5H,MAAM,gBAAgB,GAAgC;IACpD,IAAI,EAAE,GAAG;IACT,QAAQ,EAAE,GAAG;IACb,UAAU,EAAE,GAAG;IACf,OAAO,EAAE,QAAQ;IACjB,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,UAAU;IACnB,OAAO,EAAE,UAAU;IACnB,OAAO,EAAE,UAAU;CACpB,CAAA;AAED,MAAM,uBAAuB,GAAgC;IAC3D,UAAU;IACV,QAAQ;CACT,CAAA;AAED,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;KACjD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,IAAI,IAAI,CAAC;KACjC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEb,MAAM,oBAAoB,GACxB,6GAA6G,CAAA;AAE/G,MAAM,mBAAmB,GAAG,CAAC,EAAE,MAAM,EAAuB,EAAE,EAAE;IAC9D,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAA;IACxE,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,GAAG,CAAA;IAC9B,OAAO,CACL,uBAAuB,CAAC,MAAM,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;QACtE,MAAM,CACP,CAAA;AACH,CAAC,CAAA;AAED,8FAA8F;AAC9F,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAChC,aAAa,EACb,SAAS,GAIV,EAAE,EAAE;IACH,IACE,eAAe,CAAC;QACd,OAAO,EAAE,aAAa;QACtB,QAAQ,EAAE,2BAA2B;KACtC,CAAC,EACF,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,aAAa,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAChD,OAAO,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;IAClC,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC;QAC7B,OAAO,EAAE,aAAa;QACtB,QAAQ,EAAE,cAAc;KACzB,CAAC,CAAA;IACF,OAAO,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;AAC7E,CAAC,CAAA"}
@@ -0,0 +1,12 @@
1
+ import { type Direction } from './directions.js';
2
+ import type { Rect } from './geometry.js';
3
+ import type { Candidate } from './strategies.js';
4
+ /**
5
+ * Moves the origin in front of all candidates, so ranking from it in the same direction
6
+ * finds the element at the opposite edge, preferably in the same row / column.
7
+ */
8
+ export declare const getWrapOrigin: ({ origin, candidates, direction, }: {
9
+ origin: Rect;
10
+ candidates: Candidate[];
11
+ direction: Direction;
12
+ }) => Rect;
@@ -0,0 +1,21 @@
1
+ import { isVertical } from './directions.js';
2
+ /**
3
+ * Moves the origin in front of all candidates, so ranking from it in the same direction
4
+ * finds the element at the opposite edge, preferably in the same row / column.
5
+ */
6
+ export const getWrapOrigin = ({ origin, candidates, direction, }) => {
7
+ const height = origin.bottom - origin.top;
8
+ const width = origin.right - origin.left;
9
+ const rects = candidates.map(({ rect }) => rect);
10
+ if (isVertical({ direction })) {
11
+ const top = direction === 'down'
12
+ ? Math.min(...rects.map((rect) => rect.top)) - height - 1
13
+ : Math.max(...rects.map((rect) => rect.bottom)) + 1;
14
+ return { ...origin, top, bottom: top + height };
15
+ }
16
+ const left = direction === 'right'
17
+ ? Math.min(...rects.map((rect) => rect.left)) - width - 1
18
+ : Math.max(...rects.map((rect) => rect.right)) + 1;
19
+ return { ...origin, left, right: left + width };
20
+ };
21
+ //# sourceMappingURL=wrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap.js","sourceRoot":"","sources":["../../src/lib/wrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAkB,MAAM,iBAAiB,CAAA;AAI5D;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAC5B,MAAM,EACN,UAAU,EACV,SAAS,GAKV,EAAQ,EAAE;IACT,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAA;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAA;IACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;IAEhD,IAAI,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QAC9B,MAAM,GAAG,GACP,SAAS,KAAK,MAAM;YAClB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC;YACzD,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAA;QACvD,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,CAAA;IACjD,CAAC;IAED,MAAM,IAAI,GACR,SAAS,KAAK,OAAO;QACnB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;QACzD,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAA;IACtD,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,KAAK,EAAE,CAAA;AACjD,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arrowtab",
3
- "version": "0.0.5",
3
+ "version": "0.2.0",
4
4
  "description": "Use arrow keys to \"tab\" between focusable elements",
5
5
  "keywords": [
6
6
  "arrowkeys",
@@ -16,6 +16,7 @@
16
16
  "@arethetypeswrong/cli": "^0.15.4",
17
17
  "@changesets/cli": "^2.27.7",
18
18
  "concurrently": "^8.2.2",
19
+ "happy-dom": "^21.0.4",
19
20
  "http-server": "^14.1.1",
20
21
  "prettier": "^3.3.3",
21
22
  "prettier-ignore": "^0.1.3",
@@ -1,13 +0,0 @@
1
- export declare const getEuclideanDistance: ({ xDistance, yDistance, }: {
2
- xDistance: number;
3
- yDistance: number;
4
- }) => number;
5
- export declare const manhattan: ({ xDistance, yDistance, }: {
6
- xDistance: number;
7
- yDistance: number;
8
- }) => number;
9
- export declare const manhattanWeighted: ({ xDistance, yDistance, event, }: {
10
- xDistance: number;
11
- yDistance: number;
12
- event: KeyboardEvent;
13
- }) => number | undefined;
@@ -1,15 +0,0 @@
1
- export const getEuclideanDistance = ({ xDistance, yDistance, }) => {
2
- return Math.sqrt(xDistance ** 2 + yDistance ** 2);
3
- };
4
- export const manhattan = ({ xDistance, yDistance, }) => {
5
- return Math.abs(xDistance) + Math.abs(yDistance);
6
- };
7
- export const manhattanWeighted = ({ xDistance, yDistance, event, }) => {
8
- if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
9
- return Math.abs(xDistance) + Math.abs(yDistance) * 0.1;
10
- }
11
- if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {
12
- return Math.abs(xDistance) * 0.1 + Math.abs(yDistance);
13
- }
14
- };
15
- //# sourceMappingURL=distances.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"distances.js","sourceRoot":"","sources":["../../src/lib/distances.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,EACnC,SAAS,EACT,SAAS,GAIV,EAAE,EAAE;IACH,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,SAAS,IAAI,CAAC,CAAC,CAAA;AACnD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EACxB,SAAS,EACT,SAAS,GAIV,EAAE,EAAE;IACH,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;AAClD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAChC,SAAS,EACT,SAAS,EACT,KAAK,GAKN,EAAE,EAAE;IACH,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QACzD,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,GAAG,CAAA;IACxD,CAAC;IACD,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACxD,CAAC;AACH,CAAC,CAAA"}
@@ -1,4 +0,0 @@
1
- export declare const getAngle: ({ activeElement, element, }: {
2
- activeElement: Element;
3
- element: Element;
4
- }) => number;
@@ -1,15 +0,0 @@
1
- import { getXyDistance } from './getXyDistance.js';
2
- export const getAngle = ({ activeElement, element, }) => {
3
- const { xDistance, yDistance } = getXyDistance({
4
- activeElement,
5
- element,
6
- });
7
- let angle = Math.acos(yDistance / Math.sqrt(xDistance ** 2 + yDistance ** 2)) *
8
- (180 / Math.PI);
9
- const direction = xDistance > 0 ? 'right' : 'left';
10
- if (direction === 'right') {
11
- angle = 360 - angle;
12
- }
13
- return angle;
14
- };
15
- //# sourceMappingURL=getAngle.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getAngle.js","sourceRoot":"","sources":["../../src/lib/getAngle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EACvB,aAAa,EACb,OAAO,GAIR,EAAE,EAAE;IACH,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC;QAC7C,aAAa;QACb,OAAO;KACR,CAAC,CAAA;IAEF,IAAI,KAAK,GACP,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC;QACjE,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;IACjB,MAAM,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAA;IAClD,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC1B,KAAK,GAAG,GAAG,GAAG,KAAK,CAAA;IACrB,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
@@ -1 +0,0 @@
1
- export declare const getFocusable: () => Element[];
@@ -1,29 +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
- let currentElement = element;
8
- while (currentElement) {
9
- if ('hidden' in currentElement && currentElement.hidden)
10
- return false;
11
- if (currentElement.getAttribute('aria-hidden') === 'true')
12
- return false;
13
- const style = window.getComputedStyle(currentElement);
14
- if (style.display === 'none' ||
15
- style.visibility === 'hidden' ||
16
- style.opacity === '0') {
17
- return false;
18
- }
19
- const rect = currentElement.getBoundingClientRect();
20
- if (rect.width === 0 && rect.height === 0) {
21
- return false;
22
- }
23
- currentElement = currentElement.parentElement;
24
- }
25
- return true;
26
- });
27
- return focusable;
28
- };
29
- //# sourceMappingURL=getFocusable.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getFocusable.js","sourceRoot":"","sources":["../../src/lib/getFocusable.ts"],"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;QAE3D,IAAI,cAAc,GAAmB,OAAO,CAAA;QAC5C,OAAO,cAAc,EAAE,CAAC;YACtB,IAAI,QAAQ,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAA;YACrE,IAAI,cAAc,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,MAAM;gBAAE,OAAO,KAAK,CAAA;YAEvE,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAA;YACrD,IACE,KAAK,CAAC,OAAO,KAAK,MAAM;gBACxB,KAAK,CAAC,UAAU,KAAK,QAAQ;gBAC7B,KAAK,CAAC,OAAO,KAAK,GAAG,EACrB,CAAC;gBACD,OAAO,KAAK,CAAA;YACd,CAAC;YAED,MAAM,IAAI,GAAG,cAAc,CAAC,qBAAqB,EAAE,CAAA;YACnD,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1C,OAAO,KAAK,CAAA;YACd,CAAC;YACD,cAAc,GAAG,cAAc,CAAC,aAAa,CAAA;QAC/C,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA"}
@@ -1,7 +0,0 @@
1
- export declare const getXyDistance: ({ activeElement, element, }: {
2
- activeElement: Element;
3
- element: Element;
4
- }) => {
5
- xDistance: number;
6
- yDistance: number;
7
- };
@@ -1,12 +0,0 @@
1
- import { getMiddle } from './positions.js';
2
- export const getXyDistance = ({ activeElement, element, }) => {
3
- const activePosition = getMiddle(activeElement);
4
- const position = getMiddle(element);
5
- const xDistance = position.x - activePosition.x;
6
- const yDistance = position.y - activePosition.y;
7
- return {
8
- xDistance,
9
- yDistance,
10
- };
11
- };
12
- //# sourceMappingURL=getXyDistance.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getXyDistance.js","sourceRoot":"","sources":["../../src/lib/getXyDistance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAC5B,aAAa,EACb,OAAO,GAIR,EAAE,EAAE;IACH,MAAM,cAAc,GAAG,SAAS,CAAC,aAAa,CAAC,CAAA;IAC/C,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;IAEnC,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAA;IAC/C,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAA;IAE/C,OAAO;QACL,SAAS;QACT,SAAS;KACV,CAAA;AACH,CAAC,CAAA"}
@@ -1,4 +0,0 @@
1
- export declare const hasTextSelection: ({ activeElement, event, }: {
2
- activeElement: Element;
3
- event: KeyboardEvent;
4
- }) => boolean;
@@ -1,53 +0,0 @@
1
- import { sumBy } from './sumBy.js';
2
- export const hasTextSelection = ({ activeElement, event, }) => {
3
- if (activeElement instanceof HTMLInputElement ||
4
- activeElement instanceof HTMLTextAreaElement) {
5
- const selectionStart = activeElement.selectionStart;
6
- const selectionEnd = activeElement.selectionEnd;
7
- if (event.key === 'ArrowLeft' &&
8
- selectionStart !== undefined &&
9
- selectionStart !== null &&
10
- selectionStart !== 0) {
11
- return true;
12
- }
13
- if (event.key === 'ArrowRight' &&
14
- selectionStart !== undefined &&
15
- selectionStart !== null &&
16
- selectionStart !== activeElement.value?.length) {
17
- return true;
18
- }
19
- if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') &&
20
- selectionStart !== undefined &&
21
- selectionEnd !== undefined &&
22
- selectionStart !== null &&
23
- selectionEnd !== null &&
24
- selectionStart !== selectionEnd) {
25
- return true;
26
- }
27
- if (event.key === 'ArrowUp' &&
28
- selectionStart !== undefined &&
29
- selectionStart !== null &&
30
- activeElement instanceof HTMLTextAreaElement) {
31
- const rows = activeElement.value?.split('\n');
32
- const start = selectionStart;
33
- const firstRow = rows.at(0);
34
- if (firstRow && start > firstRow.length) {
35
- return true;
36
- }
37
- }
38
- if (event.key === 'ArrowDown' &&
39
- selectionStart !== undefined &&
40
- selectionStart !== null &&
41
- activeElement instanceof HTMLTextAreaElement) {
42
- const rows = activeElement.value?.split('\n');
43
- const withoutLastRow = rows.slice(0, -1);
44
- const lengthUntilLastRow = sumBy(withoutLastRow, (row) => row.length);
45
- const start = selectionStart;
46
- if (start <= lengthUntilLastRow + 1) {
47
- return true;
48
- }
49
- }
50
- }
51
- return false;
52
- };
53
- //# sourceMappingURL=hasTextSelection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hasTextSelection.js","sourceRoot":"","sources":["../../src/lib/hasTextSelection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAC/B,aAAa,EACb,KAAK,GAIN,EAAE,EAAE;IACH,IACE,aAAa,YAAY,gBAAgB;QACzC,aAAa,YAAY,mBAAmB,EAC5C,CAAC;QACD,MAAM,cAAc,GAAG,aAAa,CAAC,cAAc,CAAA;QACnD,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAA;QAE/C,IACE,KAAK,CAAC,GAAG,KAAK,WAAW;YACzB,cAAc,KAAK,SAAS;YAC5B,cAAc,KAAK,IAAI;YACvB,cAAc,KAAK,CAAC,EACpB,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IACE,KAAK,CAAC,GAAG,KAAK,YAAY;YAC1B,cAAc,KAAK,SAAS;YAC5B,cAAc,KAAK,IAAI;YACvB,cAAc,KAAK,aAAa,CAAC,KAAK,EAAE,MAAM,EAC9C,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IACE,CAAC,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,CAAC;YACzD,cAAc,KAAK,SAAS;YAC5B,YAAY,KAAK,SAAS;YAC1B,cAAc,KAAK,IAAI;YACvB,YAAY,KAAK,IAAI;YACrB,cAAc,KAAK,YAAY,EAC/B,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IACE,KAAK,CAAC,GAAG,KAAK,SAAS;YACvB,cAAc,KAAK,SAAS;YAC5B,cAAc,KAAK,IAAI;YACvB,aAAa,YAAY,mBAAmB,EAC5C,CAAC;YACD,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YAC7C,MAAM,KAAK,GAAG,cAAc,CAAA;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAC3B,IAAI,QAAQ,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACxC,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QAED,IACE,KAAK,CAAC,GAAG,KAAK,WAAW;YACzB,cAAc,KAAK,SAAS;YAC5B,cAAc,KAAK,IAAI;YACvB,aAAa,YAAY,mBAAmB,EAC5C,CAAC;YACD,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACxC,MAAM,kBAAkB,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YAErE,MAAM,KAAK,GAAG,cAAc,CAAA;YAC5B,IAAI,KAAK,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBACpC,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
@@ -1,8 +0,0 @@
1
- export declare const getMiddle: (element: Element) => {
2
- x: number;
3
- y: number;
4
- };
5
- export declare const getTopLeft: (element: Element) => {
6
- x: number;
7
- y: number;
8
- };
@@ -1,16 +0,0 @@
1
- export const getMiddle = (element) => {
2
- const { x, y, width, height } = element.getBoundingClientRect();
3
- const scrollX = document.documentElement.scrollLeft;
4
- const scrollY = document.documentElement.scrollTop;
5
- return {
6
- x: x + width / 2 + scrollX,
7
- y: y + height / 2 + scrollY,
8
- };
9
- };
10
- export const getTopLeft = (element) => {
11
- const { x, y } = element.getBoundingClientRect();
12
- const scrollX = document.documentElement.scrollLeft;
13
- const scrollY = document.documentElement.scrollTop;
14
- return { x: x + scrollX, y: y + scrollY };
15
- };
16
- //# sourceMappingURL=positions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"positions.js","sourceRoot":"","sources":["../../src/lib/positions.ts"],"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,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAA;IACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAA;IAClD,OAAO;QACL,CAAC,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,OAAO;QAC1B,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,OAAO;KAC5B,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,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAA;IACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAA;IAClD,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAA;AAC3C,CAAC,CAAA"}
@@ -1,4 +0,0 @@
1
- export declare const preventNativeArrowKeyPresses: ({ event, activeElement, }: {
2
- event: KeyboardEvent;
3
- activeElement: Element;
4
- }) => void;
@@ -1,24 +0,0 @@
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
@@ -1 +0,0 @@
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 +0,0 @@
1
- export declare const sumBy: <T extends unknown>(arr: Array<T>, func: (item: T) => number) => number;
package/dist/lib/sumBy.js DELETED
@@ -1,2 +0,0 @@
1
- export const sumBy = (arr, func) => arr.reduce((acc, item) => acc + func(item), 0);
2
- //# sourceMappingURL=sumBy.js.map
@@ -1 +0,0 @@
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"}