aria-ease 1.4.4 → 1.4.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aria-ease",
3
- "version": "1.4.4",
3
+ "version": "1.4.6",
4
4
  "description": "Out-of-the-box accessibility utility package to develop production ready applications.",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -11,14 +11,20 @@
11
11
  "url": "git+https://github.com/aria-ease/aria-ease.git"
12
12
  },
13
13
  "keywords": [
14
+ "a11y",
14
15
  "ARIA",
15
- "Accessibility"
16
+ "Accessibility",
17
+ "Assistive Technology",
18
+ "Keyboard Navigation",
19
+ "Focus Management",
20
+ "WCAG Guidelines",
21
+ "Inclusive Design"
16
22
  ],
17
23
  "author": "Isaac Akinduyile",
18
24
  "license": "ISC",
19
25
  "bugs": {
20
26
  "url": "https://github.com/aria-ease/aria-ease/issues"
21
27
  },
22
- "homepage": "https://aria-ease.vercel.app/",
28
+ "homepage": "https://aria-ease.vercel.app/docs",
23
29
  "types": "./aria-ease.d.ts"
24
30
  }
@@ -7,7 +7,13 @@ import { handleKeyPress } from '../handleKeyPress';
7
7
  var eventListenersAdded = new Set();
8
8
  export function makeBlockAccessible(blockId, blockItemsClass) {
9
9
  var blockDiv = document.querySelector("#".concat(blockId));
10
+ if (!blockDiv) {
11
+ throw new Error('Invalid block main div id provided.');
12
+ }
10
13
  var blockItems = blockDiv.querySelectorAll(".".concat(blockItemsClass));
14
+ if (!blockItems) {
15
+ throw new Error('Invalid block items class provided.');
16
+ }
11
17
  blockItems.forEach(function (blockItem, blockItemIndex) {
12
18
  if (!eventListenersAdded.has(blockItem)) {
13
19
  eventListenersAdded.add(blockItem);
@@ -11,7 +11,14 @@ let eventListenersAdded: Set<HTMLElement> = new Set();
11
11
 
12
12
  export function makeBlockAccessible(blockId: string, blockItemsClass: string) {
13
13
  const blockDiv: HTMLElement = document.querySelector(`#${blockId}`) as HTMLElement
14
- const blockItems: NodeListOfHTMLElement = blockDiv.querySelectorAll(`.${blockItemsClass}`)
14
+ if(!blockDiv) {
15
+ throw new Error('Invalid block main div id provided.');
16
+ }
17
+
18
+ const blockItems: NodeListOfHTMLElement = blockDiv.querySelectorAll(`.${blockItemsClass}`);
19
+ if(!blockItems) {
20
+ throw new Error('Invalid block items class provided.');
21
+ }
15
22
 
16
23
  blockItems.forEach((blockItem: HTMLElement, blockItemIndex: number): void => {
17
24
  if (!eventListenersAdded.has(blockItem)) {
@@ -2,6 +2,9 @@ import { updateMenuTriggerAriaAttributes } from "./menu/updateMenuTriggerAriaAtt
2
2
  function handleMenuEscapeKeyPress(menuElement, menuTriggerButton, menuClosedStateAriaLabel) {
3
3
  menuElement.style.display = 'none';
4
4
  var menuTriggerButtonId = menuTriggerButton.getAttribute('id');
5
+ if (!menuTriggerButtonId) {
6
+ throw new Error("Menu trigger button does not have id attribute");
7
+ }
5
8
  updateMenuTriggerAriaAttributes("".concat(menuTriggerButtonId), "".concat(menuClosedStateAriaLabel));
6
9
  }
7
10
  export function handleKeyPress(event, elementItems, elementItemIndex, menuElementDiv, triggerButton, menuClosedStateAriaLabel) {
@@ -37,12 +40,13 @@ export function handleKeyPress(event, elementItems, elementItemIndex, menuElemen
37
40
  break;
38
41
  case 'Enter':
39
42
  case ' ':
40
- event.preventDefault();
41
43
  if (elementItems.item(elementItemIndex).tagName === 'BUTTON') {
44
+ event.preventDefault();
42
45
  elementItems.item(elementItemIndex).click();
43
46
  break;
44
47
  }
45
48
  else if (elementItems.item(elementItemIndex).tagName === 'A') {
49
+ event.preventDefault();
46
50
  window.location.href = elementItems.item(elementItemIndex).href;
47
51
  break;
48
52
  }
@@ -4,6 +4,10 @@ import { updateMenuTriggerAriaAttributes } from "./menu/updateMenuTriggerAriaAtt
4
4
  function handleMenuEscapeKeyPress(menuElement: HTMLElement, menuTriggerButton: HTMLElement, menuClosedStateAriaLabel: string) {
5
5
  menuElement.style.display = 'none';
6
6
  const menuTriggerButtonId = menuTriggerButton.getAttribute('id');
7
+ if(!menuTriggerButtonId) {
8
+ throw new Error("Menu trigger button does not have id attribute")
9
+ }
10
+
7
11
  updateMenuTriggerAriaAttributes(`${menuTriggerButtonId}`, `${menuClosedStateAriaLabel}`)
8
12
  }
9
13
 
@@ -38,11 +42,12 @@ export function handleKeyPress(event: KeyboardEvent, elementItems: NodeListOfHTM
38
42
  break;
39
43
  case 'Enter':
40
44
  case ' ':
41
- event.preventDefault()
42
45
  if(elementItems.item(elementItemIndex).tagName === 'BUTTON') {
46
+ event.preventDefault()
43
47
  elementItems.item(elementItemIndex).click();
44
48
  break;
45
49
  } else if (elementItems.item(elementItemIndex).tagName === 'A') {
50
+ event.preventDefault()
46
51
  window.location.href = elementItems.item(elementItemIndex).href;
47
52
  break;
48
53
  }
@@ -1,9 +1,21 @@
1
1
  import { handleKeyPress } from "../handleKeyPress";
2
2
  export function cleanUpMenuEventListeners(menuId, menuItemsClass) {
3
3
  var menuDiv = document.querySelector("#".concat(menuId));
4
+ if (!menuDiv) {
5
+ throw new Error("Invalid menu div id provided");
6
+ }
4
7
  var menuItems = menuDiv.querySelectorAll(".".concat(menuItemsClass));
8
+ if (!menuItems) {
9
+ throw new Error("Invalid menu items class provided");
10
+ }
5
11
  var triggerId = menuDiv.getAttribute('aria-labelledby');
12
+ if (!triggerId) {
13
+ throw new Error("Menu div doesn't contain aria-labelledby attribute");
14
+ }
6
15
  var triggerButton = document.querySelector("#".concat(triggerId));
16
+ if (!triggerButton) {
17
+ throw new Error("Menu trigger button id does not match menu div aria-labelledby attribute");
18
+ }
7
19
  menuItems.forEach(function (menuItem, menuItemIndex) {
8
20
  menuItem.removeEventListener('keydown', function (event) { return handleKeyPress(event, menuItems, menuItemIndex, menuDiv, triggerButton); });
9
21
  });
@@ -4,10 +4,24 @@ import { handleKeyPress } from "../handleKeyPress"
4
4
 
5
5
  export function cleanUpMenuEventListeners(menuId: string, menuItemsClass: string): void {
6
6
  const menuDiv: HTMLElement = document.querySelector(`#${menuId}`) as HTMLElement
7
+ if(!menuDiv) {
8
+ throw new Error("Invalid menu div id provided")
9
+ }
10
+
7
11
  const menuItems: NodeListOfHTMLElement = menuDiv.querySelectorAll(`.${menuItemsClass}`)
12
+ if(!menuItems) {
13
+ throw new Error("Invalid menu items class provided")
14
+ }
8
15
 
9
16
  const triggerId: string = menuDiv.getAttribute('aria-labelledby') as string
17
+ if(!triggerId) {
18
+ throw new Error("Menu div doesn't contain aria-labelledby attribute")
19
+ }
20
+
10
21
  const triggerButton: HTMLElement = document.querySelector(`#${triggerId}`) as HTMLElement
22
+ if(!triggerButton) {
23
+ throw new Error("Menu trigger button id does not match menu div aria-labelledby attribute")
24
+ }
11
25
 
12
26
  menuItems.forEach((menuItem: HTMLElement, menuItemIndex: number): void => {
13
27
  menuItem.removeEventListener('keydown', (event: KeyboardEvent): void => handleKeyPress(event, menuItems, menuItemIndex, menuDiv, triggerButton));
@@ -7,15 +7,32 @@ import { handleKeyPress } from '../handleKeyPress';
7
7
  var eventListenersAdded = new Set();
8
8
  export function makeMenuAccessible(menuId, menuItemsClass) {
9
9
  var menuDiv = document.querySelector("#".concat(menuId));
10
+ if (!menuDiv) {
11
+ throw new Error("Invalid menu div id provided");
12
+ }
10
13
  var menuItems = menuDiv.querySelectorAll(".".concat(menuItemsClass));
11
14
  var triggerId = menuDiv.getAttribute('aria-labelledby');
15
+ if (!triggerId) {
16
+ throw new Error("Menu div doesn't contain aria-labelledby attribute");
17
+ }
12
18
  var triggerButton = document.querySelector("#".concat(triggerId));
19
+ if (!triggerButton) {
20
+ throw new Error("Menu trigger button id does not match menu div aria-labelledby attribute");
21
+ }
13
22
  var menuClosedStateAriaLabel = triggerButton.getAttribute('aria-label');
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, menuClosedStateAriaLabel); });
19
- }
20
- });
23
+ if (!menuClosedStateAriaLabel) {
24
+ throw new Error("Menu trigger button does not have initial aria-label");
25
+ }
26
+ if (menuItems && menuItems.length > 0) {
27
+ menuItems.item(0).focus();
28
+ menuItems.forEach(function (menuItem, menuItemIndex) {
29
+ if (!eventListenersAdded.has(menuItem)) {
30
+ eventListenersAdded.add(menuItem);
31
+ menuItem.addEventListener('keydown', function (event) { return handleKeyPress(event, menuItems, menuItemIndex, menuDiv, triggerButton, menuClosedStateAriaLabel); });
32
+ }
33
+ });
34
+ }
35
+ else {
36
+ throw new Error("Invalid menu items class provided");
37
+ }
21
38
  }
@@ -11,18 +11,36 @@ let eventListenersAdded: Set<HTMLElement> = new Set();
11
11
 
12
12
  export function makeMenuAccessible(menuId: string, menuItemsClass: string): void {
13
13
  const menuDiv: HTMLElement = document.querySelector(`#${menuId}`) as HTMLElement;
14
- const menuItems: NodeListOfHTMLElement = menuDiv.querySelectorAll(`.${menuItemsClass}`);
14
+ if(!menuDiv) {
15
+ throw new Error("Invalid menu div id provided")
16
+ }
15
17
 
18
+ const menuItems: NodeListOfHTMLElement = menuDiv.querySelectorAll(`.${menuItemsClass}`);
19
+
16
20
  const triggerId: string = menuDiv.getAttribute('aria-labelledby') as string;
21
+ if(!triggerId) {
22
+ throw new Error("Menu div doesn't contain aria-labelledby attribute")
23
+ }
24
+
17
25
  const triggerButton: HTMLElement = document.querySelector(`#${triggerId}`) as HTMLElement;
26
+ if(!triggerButton) {
27
+ throw new Error("Menu trigger button id does not match menu div aria-labelledby attribute")
28
+ }
18
29
 
19
30
  const menuClosedStateAriaLabel: string = triggerButton.getAttribute('aria-label') as string;
31
+ if(!menuClosedStateAriaLabel) {
32
+ throw new Error("Menu trigger button does not have initial aria-label")
33
+ }
20
34
 
21
- menuItems.item(0).focus();
22
- menuItems.forEach((menuItem: HTMLElement, menuItemIndex: number): void => {
23
- if (!eventListenersAdded.has(menuItem)) {
24
- eventListenersAdded.add(menuItem);
25
- menuItem.addEventListener('keydown', (event: KeyboardEvent): void => handleKeyPress(event, menuItems, menuItemIndex, menuDiv, triggerButton, menuClosedStateAriaLabel));
26
- }
27
- })
35
+ if(menuItems && menuItems.length > 0) {
36
+ menuItems.item(0).focus();
37
+ menuItems.forEach((menuItem: HTMLElement, menuItemIndex: number): void => {
38
+ if (!eventListenersAdded.has(menuItem)) {
39
+ eventListenersAdded.add(menuItem);
40
+ menuItem.addEventListener('keydown', (event: KeyboardEvent): void => handleKeyPress(event, menuItems, menuItemIndex, menuDiv, triggerButton, menuClosedStateAriaLabel));
41
+ }
42
+ })
43
+ } else {
44
+ throw new Error("Invalid menu items class provided")
45
+ }
28
46
  }
@@ -5,7 +5,13 @@
5
5
  */
6
6
  export function updateMenuTriggerAriaAttributes(triggerId, ariaLabel) {
7
7
  var triggerButton = document.querySelector("#".concat(triggerId));
8
+ if (!triggerButton) {
9
+ throw new Error("Invalid menu trigger button id provided");
10
+ }
8
11
  var currentAriaExpandedState = triggerButton.getAttribute('aria-expanded');
12
+ if (!currentAriaExpandedState) {
13
+ throw new Error("Menu trigger button does not have aria-expanded attribute");
14
+ }
9
15
  function triggerOpen(ariaLabel) {
10
16
  triggerButton.setAttribute('aria-expanded', 'true');
11
17
  triggerButton.setAttribute('aria-label', ariaLabel);
@@ -8,8 +8,14 @@ import { HTMLElement } from "../../Types";
8
8
 
9
9
  export function updateMenuTriggerAriaAttributes(triggerId: string, ariaLabel: string): void {
10
10
  const triggerButton: HTMLElement = document.querySelector(`#${triggerId}`) as HTMLElement
11
+ if(!triggerButton) {
12
+ throw new Error("Invalid menu trigger button id provided")
13
+ }
11
14
 
12
15
  const currentAriaExpandedState: string = triggerButton.getAttribute('aria-expanded') as string
16
+ if(!currentAriaExpandedState) {
17
+ throw new Error("Menu trigger button does not have aria-expanded attribute")
18
+ }
13
19
 
14
20
  function triggerOpen(ariaLabel: string): void {
15
21
  triggerButton.setAttribute('aria-expanded', 'true')