/**
 * @accede-web/tablist - WAI-ARIA tablist plugin based on AcceDe Web accessibility guidelines
 * @version v2.0.1
 * @link http://a11y.switch.paris/
 * @license ISC
 **/
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.Tablist=e()}(this,function(){"use strict";const t=["hide","show"];return class{constructor(t){if(!t||!t.nodeName)throw new Error("No DOM node provided. Abort.");this.el=t,this._tablist={},this._callbacks={},this._handleDisplay=this._handleDisplay.bind(this),this._handleFocus=this._handleFocus.bind(this),this._handleTab=this._handleTab.bind(this),this._handlePanelFocus=this._handlePanelFocus.bind(this),this._handlePanel=this._handlePanel.bind(this)}_firstActiveTab(){let t;for(let e=0;e<this._tablist.tabs.length;e++)if(!this._tablist.tabs[e].disabled){t=e;break}return t}_handleDisplay(t){t.preventDefault();const e=t.currentTarget;e.disabled||(e!==document.activeElement&&e.focus(),this._toggleDisplay(this._tablist.tabs.indexOf(e)))}_handleFocus(t){const e=t.currentTarget;e.disabled||(this._tablist.currentTabIndex=this._tablist.tabs.indexOf(e),this._select(this._tablist.tabs[this._tablist.currentTabIndex]))}_handlePanel(t){switch(void 0===this._tablist.currentTabIndex&&this._handlePanelFocus(t),t.keyCode){case 33:t.ctrlKey&&(t.preventDefault(),this._switchTab(this._tablist.currentTabIndex-1));break;case 34:t.ctrlKey&&(t.preventDefault(),this._switchTab(this._tablist.currentTabIndex+1));break;case 38:t.ctrlKey&&(t.preventDefault(),this._switchTab(this._tablist.currentTabIndex))}}_handlePanelFocus(t){if(t.target.doubleFocus)return t.preventDefault(),void delete t.target.doubleFocus;const e=t.currentTarget;this._tablist.currentTabIndex=this._tablist.tabPanels.indexOf(e),["radio","checkbox"].indexOf(t.target.type)>=0&&(t.target.doubleFocus=!0)}_handleTab(t){switch(void 0===this._tablist.currentTabIndex&&this._handleFocus(t),t.keyCode){case 32:case 13:this._handleDisplay(t);break;case 35:t.preventDefault(),this._switchTab(this._tablist.tabs.length-1);break;case 36:t.preventDefault(),this._switchTab(this._firstActiveTab());break;case 37:case 38:t.preventDefault(),this._switchTab(this._tablist.currentTabIndex-1);break;case 39:case 40:t.preventDefault(),this._switchTab(this._tablist.currentTabIndex+1)}}_noop(){}_select(t){this._tablist.tabs.forEach((e,s)=>{const i=t===e;e.setAttribute("aria-selected",i),e.setAttribute("tabindex",i?0:-1),i&&this._toggleDisplay(s)})}_switchTab(t){if(this._tablist.tabs[t]&&this._tablist.tabs[t].disabled){const e=t>this._tablist.currentTabIndex?t+1:t-1;this._switchTab(e)}else this._tablist.currentTabIndex=t,this._tablist.currentTabIndex<this._firstActiveTab()?this._tablist.currentTabIndex=this._tablist.tabsLength-1:this._tablist.currentTabIndex>=this._tablist.tabsLength&&(this._tablist.currentTabIndex=this._firstActiveTab()),this._tablist.tabs[this._tablist.currentTabIndex].focus()}_toggleDisplay(t,e=!0){if(e&&t===this._tablist.openedIndex)return;const s=this._tablist.tabs[t],i=this._tablist.tabPanels[t];e&&void 0!==this._tablist.openedIndex&&this._toggleDisplay(this._tablist.openedIndex,!1),i.setAttribute("aria-hidden",!e),e?(this._tablist.openedIndex=t,void 0!==this._tablist.openedIndex&&this._trigger("show",[s,i])):void 0!==this._tablist.openedIndex&&this._trigger("hide",[s,i])}_trigger(t,e){this._callbacks[t]&&this._callbacks[t].forEach(t=>{t.apply(this,e)})}mount(){let t;this._tablist.tabs=[],this._tablist.tabPanels=[],Array.prototype.slice.call(this.el.querySelectorAll("[role=tab]")).forEach((e,s)=>{const i=e.getAttribute("aria-controls");let a,n=!1;if(i?a=document.getElementById(i):e.nextElementSibling&&e.nextElementSibling.getAttribute("aria-labelledby")===e.id&&(a=e.nextElementSibling),!a)throw new Error(`Could not find associated tabpanel for tab ${e.id}. Use [aria-controls="tabpanelId"] on the [role="tab"] element to link them together`);this._tablist.tabs.push(e),this._tablist.tabPanels.push(a),e.disabled=e.hasAttribute("disabled")||"true"===e.getAttribute("aria-disabled"),"true"!==e.getAttribute("data-open")||e.disabled||void 0===this._tablist.openedIndex&&(this._toggleDisplay(s,!0),n=!0),e.removeAttribute("data-open"),void 0!==t||e.disabled||(t=s),e.setAttribute("tabindex",-1),a.setAttribute("aria-hidden",!n),e.addEventListener("click",this._handleDisplay),e.addEventListener("focus",this._handleFocus),e.addEventListener("keydown",this._handleTab),a.addEventListener("focus",this._handlePanelFocus,!0),a.addEventListener("keydown",this._handlePanel)}),this._tablist.tabsLength=this._tablist.tabs.length,this._tablist.tabPanelsLength=this._tablist.tabPanels.length,void 0!==this._tablist.openedIndex?(this._tablist.tabs[this._tablist.openedIndex].setAttribute("tabindex",0),this._tablist.tabs[this._tablist.openedIndex].setAttribute("aria-selected","true")):(this._toggleDisplay(t,!0),this._tablist.tabs[t].setAttribute("tabindex",0),this._tablist.tabs[t].setAttribute("aria-selected","true"))}off(t,e){if(!this._callbacks[t])return;const s=this._callbacks[t].indexOf(e);s<0||this._callbacks[t].splice(s,1)}on(e,s){t.indexOf(e)<0||(this._callbacks[e]||(this._callbacks[e]=[]),this._callbacks[e].push(s))}get current(){return{tab:this._tablist.tabs[this._tablist.openedIndex],tabPanel:this._tablist.tabPanels[this._tablist.openedIndex]}}unmount(){this._tablist.tabs.forEach((t,e)=>{const s=this._tablist.tabPanels[e];t.removeEventListener("click",this._handleDisplay),t.removeEventListener("focus",this._handleFocus),t.removeEventListener("keydown",this._handleTab),t.removeAttribute("tabindex"),t.removeAttribute("aria-selected"),s.removeEventListener("focus",this._handlePanelFocus,!0),s.removeEventListener("keydown",this._handlePanel),s.setAttribute("aria-hidden","false")}),this._tablist={}}}});
