import { register } from '@elementor/frontend-handlers'; import { Alpine } from '@elementor/alpinejs'; import { TAB_ELEMENT_TYPE, TAB_CONTENT_ELEMENT_TYPE, getTabId, getTabContentId, getIndex, getNextTab } from './utils'; const SELECTED_CLASS = 'e--selected'; register( { elementType: 'e-tabs', id: 'e-tabs-handler', callback: ( { element, settings } ) => { const tabsId = element.dataset.id; Alpine.data( `eTabs${ tabsId }`, () => ( { activeTab: settings[ 'default-active-tab' ], navigateTabs( { key, target: tab } ) { const nextTab = getNextTab( key, tab ); nextTab.focus(); }, tab: { ':id'() { const index = getIndex( this.$el, TAB_ELEMENT_TYPE ); return getTabId( tabsId, index ); }, '@click'() { const id = this.$el.id; this.activeTab = id; }, '@keydown.arrow-right.prevent'( event ) { this.navigateTabs( event ); }, '@keydown.arrow-left.prevent'( event ) { this.navigateTabs( event ); }, ':class'() { const id = this.$el.id; return { [ SELECTED_CLASS ]: this.activeTab === id }; }, ':aria-selected'() { const id = this.$el.id; return this.activeTab === id ? 'true' : 'false'; }, ':tabindex'() { const id = this.$el.id; return this.activeTab === id ? '0' : '-1'; }, ':aria-controls'() { const index = getIndex( this.$el, TAB_ELEMENT_TYPE ); return getTabContentId( tabsId, index ); }, }, tabContent: { ':aria-labelledby'() { const index = getIndex( this.$el, TAB_CONTENT_ELEMENT_TYPE ); return getTabId( tabsId, index ); }, 'x-show'() { const index = getIndex( this.$el, TAB_CONTENT_ELEMENT_TYPE ); const tabId = getTabId( tabsId, index ); const isActive = this.activeTab === tabId; this.$nextTick( () => { this.$el.classList.toggle( SELECTED_CLASS, isActive ); } ); return isActive; }, ':id'() { const index = getIndex( this.$el, TAB_CONTENT_ELEMENT_TYPE ); return getTabContentId( tabsId, index ); }, }, } ) ); }, } );