@@ -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
7689const 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}
8599export 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}
0 commit comments