Skip to content

Commit 7eb175b

Browse files
committed
accessibility
1 parent da4fe11 commit 7eb175b

2 files changed

Lines changed: 29 additions & 7 deletions

File tree

src/widgets/modals.ts

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,25 @@ window.onclick = function(event) {
2323
if (event.target == modal) {
2424
modal.style.display = "none";
2525
} */
26-
const closeClickHandler = (modal: HTMLDivElement) => {
26+
const closeClickHandler = (modal: HTMLDivElement, returnFocusTo?: Element | null) => {
2727
modal.style.display = 'none'
28+
if (returnFocusTo && returnFocusTo instanceof HTMLElement) {
29+
returnFocusTo.focus()
30+
}
2831
}
2932

30-
const createModal = (dom: HTMLDocument, options: ModalWidgetStyleOptions) => {
33+
const createModal = (dom: HTMLDocument, options: ModalWidgetStyleOptions, returnFocusTo?: Element | null) => {
3134
const modal = dom.createElement('div')
3235
modal.classList.add('modal')
36+
modal.setAttribute('role', 'dialog')
37+
modal.setAttribute('aria-modal', options.withGreyedBackground ? 'true' : 'false')
38+
modal.setAttribute('aria-label', options.ariaLabel || 'List dialog')
39+
modal.setAttribute('tabindex', '-1')
40+
modal.addEventListener('keydown', event => {
41+
if (event.key === 'Escape') {
42+
closeClickHandler(modal, returnFocusTo)
43+
}
44+
})
3345
modal.setAttribute('style', getModalStyle(options))
3446
return modal
3547
}
@@ -40,12 +52,13 @@ const createModalContent = (dom: HTMLDocument) => {
4052
return modalContent
4153
}
4254

43-
const createCloseButton = (dom: HTMLDocument, modal: HTMLDivElement) => {
55+
const createCloseButton = (dom: HTMLDocument, modal: HTMLDivElement, returnFocusTo?: Element | null) => {
4456
const closeButton: HTMLButtonElement = dom.createElement('button')
4557
closeButton.setAttribute('type', 'button')
4658
closeButton.setAttribute('aria-label', 'Close modal')
59+
closeButton.setAttribute('title', 'Close')
4760
closeButton.textContent = 'x'
48-
closeButton.addEventListener('click', () => closeClickHandler(modal))
61+
closeButton.addEventListener('click', () => closeClickHandler(modal, returnFocusTo))
4962
closeButton.addEventListener('mouseenter', () => {
5063
closeButton.setAttribute('style', style.modalCloseStyleHover)
5164
})
@@ -75,6 +88,7 @@ const createListItems = (dom: HTMLDocument, list: ListItem) => {
7588

7689
const createUnorderedList = (dom: HTMLDocument, listOfLinks: ListItem[]) => {
7790
const ul: HTMLUListElement = dom.createElement('ul')
91+
ul.setAttribute('role', 'list')
7892
ul.setAttribute('style', style.modalUnorderedListStyle)
7993
listOfLinks.forEach(list => {
8094
const li = createListItems(dom, list)
@@ -83,13 +97,20 @@ const createUnorderedList = (dom: HTMLDocument, listOfLinks: ListItem[]) => {
8397
return ul
8498
}
8599
export const createListModal = (dom: HTMLDocument, listOfLinks: ListItem[], options: ModalWidgetStyleOptions) => {
86-
const modal = createModal(dom, options)
100+
const returnFocusTo = dom.activeElement
101+
const modal = createModal(dom, options, returnFocusTo)
87102
const modalContent = createModalContent(dom)
88-
const closeButton = createCloseButton(dom, modal)
103+
const closeButton = createCloseButton(dom, modal, returnFocusTo)
89104
const ul = createUnorderedList(dom, listOfLinks)
90105
modalContent.appendChild(closeButton)
91106
modalContent.appendChild(ul)
92107
modal.appendChild(modalContent)
93108

109+
setTimeout(() => {
110+
if (closeButton.isConnected) {
111+
closeButton.focus()
112+
}
113+
}, 0)
114+
94115
return modal
95116
}

src/widgets/modalsStyle.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
export type ModalWidgetStyleOptions = {
66
topPosition?: string,
77
leftPosition?: string,
8-
withGreyedBackground?: boolean
8+
withGreyedBackground?: boolean,
9+
ariaLabel?: string
910
}
1011

1112
export const getModalStyle = (options: ModalWidgetStyleOptions = {}) => {

0 commit comments

Comments
 (0)