@servicensw/drop-menu
Advanced tools
Comparing version 2.4.5 to 2.4.6
@@ -1,1 +0,1 @@ | ||
!function(){"use strict";class Keyboard{constructor(){this.attachPopup=this.attachPopup.bind(this),this.detachPopup=this.detachPopup.bind(this),this.attachDialog=this.attachDialog.bind(this),this.detachDialog=this.detachDialog.bind(this),this.attachMenu=this.attachMenu.bind(this),this.detachMenu=this.detachMenu.bind(this),this.moveFocus=this.moveFocus.bind(this),this.handleGlobalKeydown=this.handleGlobalKeydown.bind(this),this.attachEventListeners=this.attachEventListeners.bind(this),this.detachEventListensers=this.detachEventListensers.bind(this),window.SNSW=window.SNSW||{},SNSW.Popups=SNSW.Popups||[],SNSW.Dialogs=SNSW.Dialogs||[],SNSW.Menu=null}attachPopup(t,e){SNSW.Popups.push({id:t,closefn:e})}detachPopup(t){SNSW.Popups=SNSW.Popups.filter(e=>e.id!==t)}attachDialog(t,e,s,i){SNSW.Dialogs.push({id:t,closefn:e,lastElement:i,firstElement:s})}detachDialog(t){SNSW.Dialogs=SNSW.Dialogs.filter(e=>e.id!==t)}attachMenu(t,e){SNSW.Menu={context:t,items:e}}detachMenu(){SNSW.Menu=null}getNextFocusableMenuItem(t,e=!1){return e?0===t?SNSW.Menu.items.length-1:t-1:SNSW.Menu.items.length>t+1?t+1:0}moveFocus(t,e=!1){const{items:s}=SNSW.Menu,i=[...s].findIndex(e=>e===t);let n=this.getNextFocusableMenuItem(i,e),a=s[n].getAttribute("tabindex");if("-1"!==a)s[n].focus();else{for(;"-1"===a;)n=this.getNextFocusableMenuItem(n,e),a=s[n].getAttribute("tabindex");s[n].focus()}SNSW.Menu.active=n}handleGlobalClick(){const t=SNSW.Popups[SNSW.Popups.length-1],e=SNSW.Dialogs[SNSW.Dialogs.length-1];t&&t.closefn(),e&&e.closefn()}handleGlobalKeydown(t){const{key:e,target:s}=t,i=SNSW.Popups[SNSW.Popups.length-1],n=SNSW.Dialogs[SNSW.Dialogs.length-1];switch(e){case"Escape":i?i.closefn():n&&n.closefn();break;case"Tab":n&&(document.activeElement!==n.lastElement||t.getModifierState("Shift")?document.activeElement===n.firstElement&&t.getModifierState("Shift")&&(t.preventDefault(),n.lastElement.focus()):(t.preventDefault(),n.firstElement.focus()));break;case"ArrowDown":case"ArrowRight":SNSW.Menu&&(t.preventDefault(),this.moveFocus(s));break;case"ArrowUp":case"ArrowLeft":SNSW.Menu&&(t.preventDefault(),this.moveFocus(s,!0))}}attachEventListeners(){SNSW.Popups&&SNSW.Menu&&SNSW.Dialogs||(window.addEventListener("click",this.handleGlobalClick),window.addEventListener("keydown",this.handleGlobalKeydown))}detachEventListensers(){window.removeEventListener("click",this.handleGlobalClick),window.removeEventListener("keydown",this.handleGlobalKeydown)}}class DropMenu{constructor(t,e){this.element=t,this.element&&this.element.nodeType&&(this.index=e,void 0===this.index&&(this.index=0),this.keyboard=new Keyboard,this.buttonClickHandler=this.buttonClickHandler.bind(this),this.buttonKeyDownHandler=this.buttonKeyDownHandler.bind(this),this.menuItemClickHandler=this.menuItemClickHandler.bind(this),this.menuItemKeyDownHandler=this.menuItemKeyDownHandler.bind(this),this.closeMenu=this.closeMenu.bind(this),this.menu=this.element.querySelector("ul"),this.menu.setAttribute("id","menuButton"+this.index),this.menu.setAttribute("role","menu"),this.menu.setAttribute("aria-hidden","true"),this.listItems=this.element.querySelectorAll("li"),this.listItems.forEach(t=>{t.setAttribute("role","none")}),this.menuItems=this.element.querySelectorAll("a"),this.menuItems.forEach((t,e)=>{t.setAttribute("role","menuitem"),t.setAttribute("tabIndex","-1"),0===e&&(t.setAttribute("aria-current","true"),this.listItems[e].classList.add("is-active")),t.addEventListener("click",this.menuItemClickHandler),t.addEventListener("keydown",this.menuItemKeyDownHandler)}),this.button=document.createElement("button"),this.button.setAttribute("aria-haspopup","true"),this.button.setAttribute("aria-controls",this.menu.getAttribute("id")),this.button.setAttribute("aria-expanded","false"),this.button.setAttribute("aria-label","Open "+this.menu.getAttribute("aria-label")),this.button.classList.add("reset--button"),this.element.insertBefore(this.button,this.menu),this.button.addEventListener("click",this.buttonClickHandler),this.button.addEventListener("keydown",this.buttonKeyDownHandler),this.keyboard&&(this.menu.addEventListener("focusin",()=>{this.keyboard.attachMenu(this,this.menuItems)}),this.menu.addEventListener("focusout",()=>{this.keyboard.detachMenu()}),this.keyboard.attachEventListeners()))}setActiveMenuItem(t){this.menuItems.forEach((e,s)=>{e!==t?(e.setAttribute("aria-current",""),this.listItems[s].classList.remove("is-active")):(e.setAttribute("aria-current","true"),this.listItems[s].classList.add("is-active"))})}openMenu(t){t=void 0!==t?t:0,this.button.setAttribute("aria-expanded","true"),this.menu.setAttribute("aria-hidden","false"),this.menuItems.forEach(t=>t.setAttribute("tabIndex","0")),this.menuItems[t].focus(),this.keyboard&&this.keyboard.attachPopup("DropMenu"+this.index,this.closeMenu)}closeMenu(){this.button.setAttribute("aria-expanded","false"),this.menu.setAttribute("aria-hidden","true"),this.menuItems.forEach(t=>t.setAttribute("tabIndex","-1")),this.button.setAttribute("tabIndex","0"),this.button.focus(),this.keyboard&&this.keyboard.detachPopup("DropMenu"+this.index)}buttonClickHandler(t){t.stopPropagation(),"false"!==this.button.getAttribute("aria-expanded")?this.closeMenu():this.openMenu()}buttonKeyDownHandler(t){switch(t.key){case"Enter":case" ":case"ArrowDown":t.preventDefault(),t.stopPropagation(),this.openMenu();break;case"ArrowUp":t.preventDefault(),t.stopPropagation(),this.openMenu(this.menuItems.length-1)}}menuItemClickHandler(t){t.stopPropagation(),this.setActiveMenuItem(t.currentTarget),this.closeMenu()}menuItemKeyDownHandler(t){switch(t.key){case"Enter":case" ":t.preventDefault(),t.currentTarget.click(),this.button.focus()}}}window.SNSW=window.SNSW||{},SNSW.DropMenu=DropMenu,window.addEventListener("DOMContentLoaded",()=>{const t=document.querySelectorAll(".drop-button:not(.is-excluded)");t&&t.forEach((t,e)=>{new DropMenu(t,e)})})}(); | ||
!function(){"use strict";class Keyboard{constructor(){this.attachPopup=this.attachPopup.bind(this),this.detachPopup=this.detachPopup.bind(this),this.attachDialog=this.attachDialog.bind(this),this.detachDialog=this.detachDialog.bind(this),this.attachMenu=this.attachMenu.bind(this),this.detachMenu=this.detachMenu.bind(this),this.moveFocus=this.moveFocus.bind(this),this.handleGlobalKeydown=this.handleGlobalKeydown.bind(this),this.attachEventListeners=this.attachEventListeners.bind(this),this.detachEventListensers=this.detachEventListensers.bind(this),window.SNSW=window.SNSW||{},SNSW.Popups=SNSW.Popups||[],SNSW.Dialogs=SNSW.Dialogs||[],SNSW.Menu=null}attachPopup(t,e){SNSW.Popups.push({id:t,closefn:e})}detachPopup(t){SNSW.Popups=SNSW.Popups.filter(e=>e.id!==t)}attachDialog(t,e,s,i){SNSW.Dialogs.push({id:t,closefn:e,lastElement:i,firstElement:s})}detachDialog(t){SNSW.Dialogs=SNSW.Dialogs.filter(e=>e.id!==t)}attachMenu(t,e){SNSW.Menu={context:t,items:e}}detachMenu(){SNSW.Menu=null}getNextFocusableMenuItem(t,e=!1){return e?0===t?SNSW.Menu.items.length-1:t-1:SNSW.Menu.items.length>t+1?t+1:0}moveFocus(t,e=!1){const{items:s}=SNSW.Menu,i=[...s].findIndex(e=>e===t);let n=this.getNextFocusableMenuItem(i,e),a=s[n].getAttribute("tabindex");if("-1"!==a)s[n].focus();else{for(;"-1"===a;)n=this.getNextFocusableMenuItem(n,e),a=s[n].getAttribute("tabindex");s[n].focus()}SNSW.Menu.active=n}handleGlobalClick(){const t=SNSW.Popups[SNSW.Popups.length-1],e=SNSW.Dialogs[SNSW.Dialogs.length-1];t&&t.closefn(),e&&e.closefn()}handleGlobalKeydown(t){const{key:e,target:s}=t,i=SNSW.Popups[SNSW.Popups.length-1],n=SNSW.Dialogs[SNSW.Dialogs.length-1];switch(e){case"Escape":i?i.closefn():n&&n.closefn();break;case"Tab":n&&(document.activeElement!==n.lastElement||t.getModifierState("Shift")?document.activeElement===n.firstElement&&t.getModifierState("Shift")&&(t.preventDefault(),n.lastElement.focus()):(t.preventDefault(),n.firstElement.focus()));break;case"ArrowDown":case"ArrowRight":SNSW.Menu&&(t.preventDefault(),this.moveFocus(s));break;case"ArrowUp":case"ArrowLeft":SNSW.Menu&&(t.preventDefault(),this.moveFocus(s,!0))}}attachEventListeners(){window.addEventListener("click",this.handleGlobalClick),window.addEventListener("keydown",this.handleGlobalKeydown)}detachEventListensers(){window.removeEventListener("click",this.handleGlobalClick),window.removeEventListener("keydown",this.handleGlobalKeydown)}}class DropMenu{constructor(t,e){this.element=t,this.element&&this.element.nodeType&&(this.index=e,void 0===this.index&&(this.index=0),this.keyboard=new Keyboard,this.buttonClickHandler=this.buttonClickHandler.bind(this),this.buttonKeyDownHandler=this.buttonKeyDownHandler.bind(this),this.menuItemClickHandler=this.menuItemClickHandler.bind(this),this.menuItemKeyDownHandler=this.menuItemKeyDownHandler.bind(this),this.closeMenu=this.closeMenu.bind(this),this.menu=this.element.querySelector("ul"),this.menu.setAttribute("id","menuButton"+this.index),this.menu.setAttribute("role","menu"),this.menu.setAttribute("aria-hidden","true"),this.listItems=this.element.querySelectorAll("li"),this.listItems.forEach(t=>{t.setAttribute("role","none")}),this.menuItems=this.element.querySelectorAll("a"),this.menuItems.forEach((t,e)=>{t.setAttribute("role","menuitem"),t.setAttribute("tabIndex","-1"),0===e&&(t.setAttribute("aria-current","true"),this.listItems[e].classList.add("is-active")),t.addEventListener("click",this.menuItemClickHandler),t.addEventListener("keydown",this.menuItemKeyDownHandler)}),this.button=document.createElement("button"),this.button.setAttribute("aria-haspopup","true"),this.button.setAttribute("aria-controls",this.menu.getAttribute("id")),this.button.setAttribute("aria-expanded","false"),this.button.setAttribute("aria-label","Open "+this.menu.getAttribute("aria-label")),this.button.classList.add("reset--button"),this.element.insertBefore(this.button,this.menu),this.button.addEventListener("click",this.buttonClickHandler),this.button.addEventListener("keydown",this.buttonKeyDownHandler),this.keyboard&&(this.menu.addEventListener("focusin",()=>{this.keyboard.attachMenu(this,this.menuItems)}),this.menu.addEventListener("focusout",()=>{this.keyboard.detachMenu()}),this.keyboard.attachEventListeners()))}setActiveMenuItem(t){this.menuItems.forEach((e,s)=>{e!==t?(e.setAttribute("aria-current",""),this.listItems[s].classList.remove("is-active")):(e.setAttribute("aria-current","true"),this.listItems[s].classList.add("is-active"))})}openMenu(t){t=void 0!==t?t:0,this.button.setAttribute("aria-expanded","true"),this.menu.setAttribute("aria-hidden","false"),this.menuItems.forEach(t=>t.setAttribute("tabIndex","0")),this.menuItems[t].focus(),this.keyboard&&this.keyboard.attachPopup("DropMenu"+this.index,this.closeMenu)}closeMenu(){this.button.setAttribute("aria-expanded","false"),this.menu.setAttribute("aria-hidden","true"),this.menuItems.forEach(t=>t.setAttribute("tabIndex","-1")),this.button.setAttribute("tabIndex","0"),this.button.focus(),this.keyboard&&this.keyboard.detachPopup("DropMenu"+this.index)}buttonClickHandler(t){t.stopPropagation(),"false"!==this.button.getAttribute("aria-expanded")?this.closeMenu():this.openMenu()}buttonKeyDownHandler(t){switch(t.key){case"Enter":case" ":case"ArrowDown":t.preventDefault(),t.stopPropagation(),this.openMenu();break;case"ArrowUp":t.preventDefault(),t.stopPropagation(),this.openMenu(this.menuItems.length-1)}}menuItemClickHandler(t){t.stopPropagation(),this.setActiveMenuItem(t.currentTarget),this.closeMenu()}menuItemKeyDownHandler(t){switch(t.key){case"Enter":case" ":t.preventDefault(),t.currentTarget.click(),this.button.focus()}}}window.SNSW=window.SNSW||{},SNSW.DropMenu=DropMenu,window.addEventListener("DOMContentLoaded",()=>{const t=document.querySelectorAll(".drop-button:not(.is-excluded)");t&&t.forEach((t,e)=>{new DropMenu(t,e)})})}(); |
{ | ||
"name": "@servicensw/drop-menu", | ||
"version": "2.4.5", | ||
"version": "2.4.6", | ||
"description": "Drop menu component", | ||
@@ -46,3 +46,3 @@ "repository": { | ||
"dependencies": { | ||
"@servicensw/base": "^2.12.4", | ||
"@servicensw/base": "^2.12.5", | ||
"@servicensw/constants": "^2.0.11" | ||
@@ -60,3 +60,3 @@ }, | ||
], | ||
"gitHead": "6ef73f9db5cde8b510aea4346af25919cc883809" | ||
"gitHead": "1465cbd83ff70ebe3019bfacd8498fd4319dec30" | ||
} |
Sorry, the diff of this file is not supported yet
27232
387
Updated@servicensw/base@^2.12.5