UNPKG

@ussebastian/kitdigital

Version:

Kit Digital de la Universidad San Sebastián

3 lines (2 loc) 3.47 kB
/*! @ussebastian/kitdigital v0.21.0 | MIT (c) Asimov Consultores SpA - 2025 */ class t{constructor(t,e){this.key=e,this.element=t,this.triggerElement=null,this.contentElement=null,this.collapsableId=null,this.contentElementHeight=null,this.groupId=null,this.animationDuration=250,this.isOpen=!1,this.element=t,this.triggerElement=this.element}setKeyboardNavigation(){if(this.groupId){const t=window.USSKitDigital.componentsSharedState.Collapsable.groups[this.groupId];this.element.addEventListener("keydown",(e=>{if("ArrowUp"===e.key||"ArrowLeft"===e.key){e.preventDefault();const s=t.indexOf(this);s>0?t[s-1].triggerElement.focus():t[t.length-1].triggerElement.focus()}if("ArrowDown"===e.key||"ArrowRight"===e.key){e.preventDefault();const s=t.indexOf(this);s<t.length-1?t[s+1].triggerElement.focus():t[0].triggerElement.focus()}"Home"!==e.key&&36!==e.keyCode||(e.preventDefault(),t[0].triggerElement.focus()),"End"!==e.key&&35!==e.keyCode||(e.preventDefault(),t[t.length-1].triggerElement.focus())}))}}closeGroup(){void 0===window.USSKitDigital?.componentsSharedState?.Collapsable?.groups[this.groupId]&&(window.USSKitDigital.componentsSharedState={Collapsable:{groups:{[this.groupId]:[]}}}),window.USSKitDigital.componentsSharedState.Collapsable.groups[this.groupId].push(this)}closeAllGroupCollapsables(){window.USSKitDigital.componentsSharedState.Collapsable.groups[this.groupId].forEach((t=>{t!==this&&t.close()}))}mount(){if(this.collapsableId=this.triggerElement.dataset.ussCollapsableTriggerFor,this.animationDuration=this.triggerElement.dataset.ussCollapsableAnimationDuration||250,this.groupId=this.triggerElement.dataset.ussCollapsableCloseGroup,this.groupId&&this.closeGroup(),this.contentElement=document.querySelector(`[data-uss-collapsable-id="${this.collapsableId}"]`),this.contentElement.setAttribute("id",this.element.id||this.collapsableId),this.contentElement.style.setProperty("--animation-duration",`${this.animationDuration}ms`),!this.contentElement)throw new Error("Collapsable: Content element not found.");this.contentElementHeight=this.contentElement.offsetHeight,this.contentElement.style.setProperty("--uss-collapsable-height",`${this.contentElementHeight}px`),this.contentElement.dataset.ussCollapsableOpen="false",this.contentElement.setAttribute("aria-labelledby",`trigger-of-${this.collapsableId}`),this.triggerElement.setAttribute("aria-expanded","false"),this.triggerElement.setAttribute("aria-controls",this.element.id||this.collapsableId),this.triggerElement.setAttribute("id",`trigger-of-${this.collapsableId}`),this.toggleTabIndexes(),this.triggerElement.addEventListener("click",(()=>this.toggleOpenState())),this.setKeyboardNavigation()}toggleOpenState(){this.contentElement.dataset.ussCollapsableOpen=String(!this.isOpen),this.triggerElement.setAttribute("aria-expanded",!this.isOpen),this.isOpen?this.contentElement.style.overflow="hidden":(this.groupId&&this.closeAllGroupCollapsables(),setTimeout((()=>{this.isOpen&&(this.contentElement.style.overflow="visible")}),this.animationDuration)),this.isOpen=!this.isOpen,this.toggleTabIndexes()}close(){this.contentElement.dataset.ussCollapsableOpen="false",this.triggerElement.setAttribute("aria-expanded","false"),this.contentElement.style.overflow="hidden",this.isOpen=!1,this.toggleTabIndexes()}toggleTabIndexes(){this.contentElement.querySelectorAll("a, button, input, select, textarea").forEach((t=>{t.setAttribute("tabindex",this.isOpen?"0":"-1")}))}}export{t as Collapsable};