aria-ease 1.2.4 → 1.2.6

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/aria-ease.d.ts CHANGED
@@ -22,7 +22,14 @@ declare module 'aria-ease' {
22
22
  * @param {string} ariaLabel The aria-label to be updated.
23
23
  */
24
24
  function updateMenuTriggerAriaAttributes(triggerId: string, ariaLabel: string): void;
25
+
26
+ /**
27
+ * Cleans up the event listeners that were added to childen items of the menu, to prevent memory leak.
28
+ * @param {string} menuId The id of the menu
29
+ * @param {string} menuItemClass The class of the items that are children of the menu
30
+ */
31
+ function cleanUpMenuEventListeners(menuId: string, menuItemClass: string): void;
25
32
 
26
- export { makeMenuAccessible, makeBlockAccessible, updateMenuTriggerAriaAttributes };
33
+ export { makeMenuAccessible, makeBlockAccessible, updateMenuTriggerAriaAttributes, cleanUpMenuEventListeners };
27
34
  }
28
35
 
package/index.js CHANGED
@@ -1,9 +1,11 @@
1
1
  import { makeMenuAccessible } from './src/menu/makeMenuAccessible.js'
2
2
  import { makeBlockAccessible } from './src/block/makeBlockAccessible.js'
3
3
  import { updateMenuTriggerAriaAttributes } from './src/menu/updateMenuTriggerAriaAttributes.js'
4
+ import { cleanUpMenuEventListeners } from './src/menu/cleanUpMenuEventListeners.js'
4
5
 
5
6
  export {
6
7
  makeMenuAccessible,
7
8
  makeBlockAccessible,
8
- updateMenuTriggerAriaAttributes
9
+ updateMenuTriggerAriaAttributes,
10
+ cleanUpMenuEventListeners
9
11
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aria-ease",
3
- "version": "1.2.4",
3
+ "version": "1.2.6",
4
4
  "description": "Out of the box utility accessibility package to develop production ready applications.",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -3,6 +3,7 @@
3
3
  * @param {string} blockId The id of the block
4
4
  * @param {string} blockItemClass The class of the items that are children of the block
5
5
  */
6
+ import { handleKeyPress } from '../handleKeyPress';
6
7
  var eventListenersAdded = new Set();
7
8
  export function makeBlockAccessible(blockId, blockItemClass) {
8
9
  var blockDiv = document.querySelector("#".concat(blockId));
@@ -13,50 +14,4 @@ export function makeBlockAccessible(blockId, blockItemClass) {
13
14
  blockItem.addEventListener('keydown', function (event) { return handleKeyPress(event, blockItems, blockItemIndex); });
14
15
  }
15
16
  });
16
- function handleKeyPress(event, blockItems, blockItemIndex) {
17
- switch (event.key) {
18
- case 'ArrowUp':
19
- case 'ArrowLeft':
20
- event.preventDefault();
21
- if (blockItemIndex === 0) {
22
- blockItems.item(blockItems.length - 1).focus();
23
- }
24
- else {
25
- blockItems.item(blockItemIndex - 1).focus();
26
- }
27
- break;
28
- case 'ArrowDown':
29
- case 'ArrowRight':
30
- event.preventDefault();
31
- if (blockItemIndex === blockItems.length - 1) {
32
- blockItems.item(0).focus();
33
- }
34
- else {
35
- blockItems.item(blockItemIndex + 1).focus();
36
- }
37
- break;
38
- case 'Enter':
39
- case ' ':
40
- event.preventDefault();
41
- if (blockItems.item(blockItemIndex).type === 'radio') {
42
- blockItems.item(blockItemIndex).checked = true;
43
- break;
44
- }
45
- else if (blockItems.item(blockItemIndex).type === 'checkbox') {
46
- blockItems.item(blockItemIndex).checked = !blockItems.item(blockItemIndex).checked;
47
- break;
48
- }
49
- else if (blockItems.item(blockItemIndex).tagName === 'BUTTON') {
50
- blockItems.item(blockItemIndex).click();
51
- break;
52
- }
53
- else if (blockItems.item(blockItemIndex).tagName === 'A') {
54
- window.location.href = blockItems.item(blockItemIndex).href;
55
- break;
56
- }
57
- break;
58
- default:
59
- break;
60
- }
61
- }
62
17
  }
@@ -5,6 +5,7 @@
5
5
  */
6
6
 
7
7
  import { HTMLElement, NodeListOfHTMLElement } from "../../Types"
8
+ import { handleKeyPress } from '../handleKeyPress';
8
9
 
9
10
  let eventListenersAdded: Set<HTMLElement> = new Set();
10
11
 
@@ -17,47 +18,6 @@ export function makeBlockAccessible(blockId: string, blockItemClass: string): vo
17
18
  eventListenersAdded.add(blockItem);
18
19
  blockItem.addEventListener('keydown', (event: KeyboardEvent) => handleKeyPress(event, blockItems, blockItemIndex));
19
20
  }
20
- });
21
+ });
21
22
 
22
- function handleKeyPress(event: KeyboardEvent, blockItems: NodeListOfHTMLElement, blockItemIndex: number): void {
23
- switch(event.key) {
24
- case 'ArrowUp':
25
- case 'ArrowLeft':
26
- event.preventDefault()
27
- if (blockItemIndex === 0) {
28
- blockItems.item(blockItems.length - 1).focus();
29
- } else {
30
- blockItems.item(blockItemIndex - 1).focus();
31
- }
32
- break;
33
- case 'ArrowDown':
34
- case 'ArrowRight':
35
- event.preventDefault()
36
- if (blockItemIndex === blockItems.length - 1) {
37
- blockItems.item(0).focus();
38
- } else {
39
- blockItems.item(blockItemIndex + 1).focus();
40
- }
41
- break;
42
- case 'Enter':
43
- case ' ':
44
- event.preventDefault()
45
- if (blockItems.item(blockItemIndex).type === 'radio') {
46
- blockItems.item(blockItemIndex).checked = true
47
- break;
48
- } else if (blockItems.item(blockItemIndex).type === 'checkbox') {
49
- blockItems.item(blockItemIndex).checked = !blockItems.item(blockItemIndex).checked
50
- break;
51
- } else if (blockItems.item(blockItemIndex).tagName === 'BUTTON') {
52
- blockItems.item(blockItemIndex).click()
53
- break;
54
- } else if (blockItems.item(blockItemIndex).tagName === 'A') {
55
- window.location.href = blockItems.item(blockItemIndex).href
56
- break;
57
- }
58
- break;
59
- default:
60
- break;
61
- }
62
- }
63
23
  }
@@ -0,0 +1,55 @@
1
+ export function handleKeyPress(event, elementItems, elementItemIndex, elementDiv, triggerButton) {
2
+ switch (event.key) {
3
+ case 'ArrowUp':
4
+ case 'ArrowLeft':
5
+ event.preventDefault();
6
+ if (elementItemIndex === 0) {
7
+ elementItems.item(elementItems.length - 1).focus();
8
+ }
9
+ else {
10
+ elementItems.item(elementItemIndex - 1).focus();
11
+ }
12
+ break;
13
+ case 'ArrowDown':
14
+ case 'ArrowRight':
15
+ event.preventDefault();
16
+ if (elementItemIndex === elementItems.length - 1) {
17
+ elementItems.item(0).focus();
18
+ }
19
+ else {
20
+ elementItems.item(elementItemIndex + 1).focus();
21
+ }
22
+ break;
23
+ case 'Escape':
24
+ event.preventDefault();
25
+ if (elementDiv && triggerButton) {
26
+ (getComputedStyle(elementDiv).display === 'block') ?
27
+ triggerButton.click() :
28
+ null;
29
+ triggerButton.focus();
30
+ }
31
+ break;
32
+ case 'Enter':
33
+ case ' ':
34
+ event.preventDefault();
35
+ if (elementItems.item(elementItemIndex).tagName === 'BUTTON') {
36
+ elementItems.item(elementItemIndex).click();
37
+ break;
38
+ }
39
+ else if (elementItems.item(elementItemIndex).tagName === 'A') {
40
+ window.location.href = elementItems.item(elementItemIndex).href;
41
+ break;
42
+ }
43
+ else if (elementItems.item(elementItemIndex).type === 'radio') {
44
+ elementItems.item(elementItemIndex).checked = true;
45
+ break;
46
+ }
47
+ else if (elementItems.item(elementItemIndex).type === 'checkbox') {
48
+ elementItems.item(elementItemIndex).checked = !elementItems.item(elementItemIndex).checked;
49
+ break;
50
+ }
51
+ break;
52
+ default:
53
+ break;
54
+ }
55
+ }
@@ -0,0 +1,53 @@
1
+ import { NodeListOfHTMLElement, HTMLElement } from "../Types";
2
+
3
+ export function handleKeyPress(event: KeyboardEvent, elementItems: NodeListOfHTMLElement, elementItemIndex: number, elementDiv?: HTMLElement | undefined, triggerButton?: HTMLElement | undefined): void {
4
+ switch(event.key) {
5
+ case 'ArrowUp':
6
+ case 'ArrowLeft':
7
+ event.preventDefault()
8
+ if (elementItemIndex === 0) {
9
+ elementItems.item(elementItems.length - 1).focus();
10
+ } else {
11
+ elementItems.item(elementItemIndex - 1).focus();
12
+ }
13
+ break;
14
+ case 'ArrowDown':
15
+ case 'ArrowRight':
16
+ event.preventDefault()
17
+ if (elementItemIndex === elementItems.length - 1) {
18
+ elementItems.item(0).focus();
19
+ } else {
20
+ elementItems.item(elementItemIndex + 1).focus();
21
+ }
22
+ break;
23
+ case 'Escape':
24
+ event.preventDefault();
25
+ if(elementDiv && triggerButton) {
26
+ (getComputedStyle(elementDiv).display === 'block') ?
27
+ triggerButton.click() :
28
+ null
29
+ triggerButton.focus()
30
+ }
31
+
32
+ break;
33
+ case 'Enter':
34
+ case ' ':
35
+ event.preventDefault()
36
+ if(elementItems.item(elementItemIndex).tagName === 'BUTTON') {
37
+ elementItems.item(elementItemIndex).click()
38
+ break;
39
+ } else if (elementItems.item(elementItemIndex).tagName === 'A') {
40
+ window.location.href = elementItems.item(elementItemIndex).href;
41
+ break;
42
+ } else if (elementItems.item(elementItemIndex).type === 'radio') {
43
+ elementItems.item(elementItemIndex).checked = true
44
+ break;
45
+ } else if (elementItems.item(elementItemIndex).type === 'checkbox') {
46
+ elementItems.item(elementItemIndex).checked = !elementItems.item(elementItemIndex).checked
47
+ break;
48
+ }
49
+ break;
50
+ default:
51
+ break;
52
+ }
53
+ }
@@ -0,0 +1,10 @@
1
+ import { handleKeyPress } from "../handleKeyPress";
2
+ export function cleanUpMenuEventListeners(menuId, menuItemClass) {
3
+ var menuDiv = document.querySelector("#".concat(menuId));
4
+ var menuItems = menuDiv.querySelectorAll(".".concat(menuItemClass));
5
+ var triggerId = menuDiv.getAttribute('aria-labelledby');
6
+ var triggerButton = document.querySelector("#".concat(triggerId));
7
+ menuItems.forEach(function (menuItem, menuItemIndex) {
8
+ menuItem.removeEventListener('keydown', function (event) { return handleKeyPress(event, menuItems, menuItemIndex, menuDiv, triggerButton); });
9
+ });
10
+ }
@@ -0,0 +1,15 @@
1
+ import { NodeListOfHTMLElement } from "../../Types"
2
+ import { handleKeyPress } from "../handleKeyPress"
3
+
4
+
5
+ export function cleanUpMenuEventListeners(menuId: string, menuItemClass: string): void {
6
+ const menuDiv: HTMLElement = document.querySelector(`#${menuId}`) as HTMLElement
7
+ const menuItems: NodeListOfHTMLElement = menuDiv.querySelectorAll(`.${menuItemClass}`)
8
+
9
+ const triggerId: string = menuDiv.getAttribute('aria-labelledby') as string
10
+ const triggerButton: HTMLElement = document.querySelector(`#${triggerId}`) as HTMLElement
11
+
12
+ menuItems.forEach((menuItem: HTMLElement, menuItemIndex: number): void => {
13
+ menuItem.removeEventListener('keydown', (event: KeyboardEvent): void => handleKeyPress(event, menuItems, menuItemIndex, menuDiv, triggerButton));
14
+ })
15
+ }
@@ -3,70 +3,20 @@
3
3
  * @param {string} menuId The id of the menu
4
4
  * @param {string} menuItemClass The class of the items that are children of the menu
5
5
  */
6
+ import { handleKeyPress } from '../handleKeyPress';
6
7
  var eventListenersAdded = new Set();
7
8
  export function makeMenuAccessible(menuId, menuItemClass) {
8
9
  var menuDiv = document.querySelector("#".concat(menuId));
9
10
  var menuItems = menuDiv.querySelectorAll(".".concat(menuItemClass));
10
11
  var triggerId = menuDiv.getAttribute('aria-labelledby');
11
12
  var triggerButton = document.querySelector("#".concat(triggerId));
12
- menuItems.item(0).focus();
13
- menuItems.forEach(function (menuItem, menuItemIndex) {
14
- if (!eventListenersAdded.has(menuItem)) {
15
- eventListenersAdded.add(menuItem);
16
- menuItem.addEventListener('keydown', function (event) { return handleKeyPress(event, menuItems, menuItemIndex); });
17
- }
18
- });
19
- function handleKeyPress(event, menuItems, menuItemIndex) {
20
- switch (event.key) {
21
- case 'ArrowUp':
22
- case 'ArrowLeft':
23
- event.preventDefault();
24
- if (menuItemIndex === 0) {
25
- menuItems.item(menuItems.length - 1).focus();
26
- }
27
- else {
28
- menuItems.item(menuItemIndex - 1).focus();
29
- }
30
- break;
31
- case 'ArrowDown':
32
- case 'ArrowRight':
33
- event.preventDefault();
34
- if (menuItemIndex === menuItems.length - 1) {
35
- menuItems.item(0).focus();
36
- }
37
- else {
38
- menuItems.item(menuItemIndex + 1).focus();
39
- }
40
- break;
41
- case 'Escape':
42
- event.preventDefault();
43
- (getComputedStyle(menuDiv).display === 'block') ?
44
- triggerButton.click() :
45
- null;
46
- triggerButton.focus();
47
- break;
48
- case 'Enter':
49
- case ' ':
50
- event.preventDefault();
51
- if (menuItems.item(menuItemIndex).tagName === 'BUTTON') {
52
- menuItems.item(menuItemIndex).click();
53
- break;
54
- }
55
- else if (menuItems.item(menuItemIndex).tagName === 'A') {
56
- window.location.href = menuItems.item(menuItemIndex).href;
57
- break;
58
- }
59
- else if (menuItems.item(menuItemIndex).type === 'radio') {
60
- menuItems.item(menuItemIndex).checked = true;
61
- break;
62
- }
63
- else if (menuItems.item(menuItemIndex).type === 'checkbox') {
64
- menuItems.item(menuItemIndex).checked = !menuItems.item(menuItemIndex).checked;
65
- break;
66
- }
67
- break;
68
- default:
69
- break;
70
- }
13
+ if (window.innerWidth >= 1025) {
14
+ menuItems.item(0).focus();
15
+ menuItems.forEach(function (menuItem, menuItemIndex) {
16
+ if (!eventListenersAdded.has(menuItem)) {
17
+ eventListenersAdded.add(menuItem);
18
+ menuItem.addEventListener('keydown', function (event) { return handleKeyPress(event, menuItems, menuItemIndex, menuDiv, triggerButton); });
19
+ }
20
+ });
71
21
  }
72
22
  }
@@ -5,6 +5,7 @@
5
5
  */
6
6
 
7
7
  import { HTMLElement, NodeListOfHTMLElement } from '../../Types'
8
+ import { handleKeyPress } from '../handleKeyPress';
8
9
 
9
10
  let eventListenersAdded: Set<HTMLElement> = new Set();
10
11
 
@@ -15,60 +16,13 @@ export function makeMenuAccessible(menuId: string, menuItemClass: string): void
15
16
  const triggerId: string = menuDiv.getAttribute('aria-labelledby') as string
16
17
  const triggerButton: HTMLElement = document.querySelector(`#${triggerId}`) as HTMLElement
17
18
 
18
- menuItems.item(0).focus();
19
- menuItems.forEach((menuItem: HTMLElement, menuItemIndex: number): void => {
20
- if (!eventListenersAdded.has(menuItem)) {
21
- eventListenersAdded.add(menuItem);
22
- menuItem.addEventListener('keydown', (event: KeyboardEvent): void => handleKeyPress(event, menuItems, menuItemIndex))
23
- }
24
- })
25
-
26
- function handleKeyPress(event: KeyboardEvent, menuItems: NodeListOfHTMLElement, menuItemIndex: number): void {
27
- switch(event.key) {
28
- case 'ArrowUp':
29
- case 'ArrowLeft':
30
- event.preventDefault()
31
- if (menuItemIndex === 0) {
32
- menuItems.item(menuItems.length - 1).focus();
33
- } else {
34
- menuItems.item(menuItemIndex - 1).focus();
35
- }
36
- break;
37
- case 'ArrowDown':
38
- case 'ArrowRight':
39
- event.preventDefault()
40
- if (menuItemIndex === menuItems.length - 1) {
41
- menuItems.item(0).focus();
42
- } else {
43
- menuItems.item(menuItemIndex + 1).focus();
44
- }
45
- break;
46
- case 'Escape':
47
- event.preventDefault();
48
- (getComputedStyle(menuDiv).display === 'block') ?
49
- triggerButton.click() :
50
- null
51
- triggerButton.focus()
52
- break;
53
- case 'Enter':
54
- case ' ':
55
- event.preventDefault()
56
- if(menuItems.item(menuItemIndex).tagName === 'BUTTON') {
57
- menuItems.item(menuItemIndex).click()
58
- break;
59
- } else if (menuItems.item(menuItemIndex).tagName === 'A') {
60
- window.location.href = menuItems.item(menuItemIndex).href;
61
- break;
62
- } else if (menuItems.item(menuItemIndex).type === 'radio') {
63
- menuItems.item(menuItemIndex).checked = true
64
- break;
65
- } else if (menuItems.item(menuItemIndex).type === 'checkbox') {
66
- menuItems.item(menuItemIndex).checked = !menuItems.item(menuItemIndex).checked
67
- break;
68
- }
69
- break;
70
- default:
71
- break;
72
- }
73
- }
19
+ if(window.innerWidth >= 1025) {
20
+ menuItems.item(0).focus();
21
+ menuItems.forEach((menuItem: HTMLElement, menuItemIndex: number): void => {
22
+ if (!eventListenersAdded.has(menuItem)) {
23
+ eventListenersAdded.add(menuItem);
24
+ menuItem.addEventListener('keydown', (event: KeyboardEvent): void => handleKeyPress(event, menuItems, menuItemIndex, menuDiv, triggerButton))
25
+ }
26
+ })
27
+ }
74
28
  }