@@ -126,6 +126,118 @@ class TabsAutomatic {
126126 }
127127}
128128
129+ class TabsScrollHandler {
130+ constructor ( container ) {
131+ this . container = container ;
132+ this . tablist = container . querySelector ( '[role="tablist"]' ) ;
133+ this . leftArrow = container . querySelector ( '.scroll-arrow-left' ) ;
134+ this . rightArrow = container . querySelector ( '.scroll-arrow-right' ) ;
135+
136+ if ( ! this . tablist || ! this . leftArrow || ! this . rightArrow ) {
137+ return ;
138+ }
139+
140+ this . init ( ) ;
141+ }
142+
143+ init ( ) {
144+ this . updateArrowVisibility ( ) ;
145+ this . bindEvents ( ) ;
146+ this . handleResize ( ) ;
147+ }
148+
149+ bindEvents ( ) {
150+ // Scroll arrow click events
151+ this . leftArrow . addEventListener ( 'click' , ( ) => {
152+ if ( ! this . leftArrow . classList . contains ( 'hidden' ) ) {
153+ this . scrollLeft ( ) ;
154+ }
155+ } ) ;
156+
157+ this . rightArrow . addEventListener ( 'click' , ( ) => {
158+ if ( ! this . rightArrow . classList . contains ( 'hidden' ) ) {
159+ this . scrollRight ( ) ;
160+ }
161+ } ) ;
162+
163+ // Keyboard support for scroll arrows
164+ this . leftArrow . addEventListener ( 'keydown' , ( event ) => {
165+ if ( ( event . key === 'Enter' || event . key === ' ' ) && ! this . leftArrow . classList . contains ( 'hidden' ) ) {
166+ event . preventDefault ( ) ;
167+ this . scrollLeft ( ) ;
168+ }
169+ } ) ;
170+
171+ this . rightArrow . addEventListener ( 'keydown' , ( event ) => {
172+ if ( ( event . key === 'Enter' || event . key === ' ' ) && ! this . rightArrow . classList . contains ( 'hidden' ) ) {
173+ event . preventDefault ( ) ;
174+ this . scrollRight ( ) ;
175+ }
176+ } ) ;
177+
178+ // Tablist scroll event
179+ this . tablist . addEventListener ( 'scroll' , ( ) => {
180+ this . updateArrowVisibility ( ) ;
181+ } ) ;
182+
183+ // Window resize event
184+ window . addEventListener ( 'resize' , ( ) => {
185+ this . handleResize ( ) ;
186+ } ) ;
187+ }
188+
189+ scrollLeft ( ) {
190+ const scrollAmount = this . tablist . clientWidth * 0.8 ;
191+ this . tablist . scrollBy ( {
192+ left : - scrollAmount ,
193+ behavior : 'smooth'
194+ } ) ;
195+ }
196+
197+ scrollRight ( ) {
198+ const scrollAmount = this . tablist . clientWidth * 0.8 ;
199+ this . tablist . scrollBy ( {
200+ left : scrollAmount ,
201+ behavior : 'smooth'
202+ } ) ;
203+ }
204+
205+ updateArrowVisibility ( ) {
206+ const { scrollLeft, scrollWidth, clientWidth } = this . tablist ;
207+ const isScrollable = scrollWidth > clientWidth ;
208+
209+ // Show/hide arrows based on scrollability
210+ if ( ! isScrollable ) {
211+ this . leftArrow . classList . add ( 'hidden' ) ;
212+ this . rightArrow . classList . add ( 'hidden' ) ;
213+ return ;
214+ }
215+
216+ // Show/hide arrows based on scroll position
217+ // Left arrow: hide when at the beginning, show when there's content to scroll left
218+ if ( scrollLeft <= 0 ) {
219+ this . leftArrow . classList . add ( 'hidden' ) ;
220+ } else {
221+ this . leftArrow . classList . remove ( 'hidden' ) ;
222+ }
223+
224+ // Right arrow: hide when at the end, show when there's content to scroll right
225+ if ( scrollLeft >= scrollWidth - clientWidth - 1 ) {
226+ this . rightArrow . classList . add ( 'hidden' ) ;
227+ } else {
228+ this . rightArrow . classList . remove ( 'hidden' ) ;
229+ }
230+ }
231+
232+ handleResize ( ) {
233+ // Debounce resize handling
234+ clearTimeout ( this . resizeTimeout ) ;
235+ this . resizeTimeout = setTimeout ( ( ) => {
236+ this . updateArrowVisibility ( ) ;
237+ } , 100 ) ;
238+ }
239+ }
240+
129241// Initialize tablists.
130242window . addEventListener ( 'load' , function ( ) {
131243 const tablists = document . querySelectorAll (
@@ -134,4 +246,12 @@ window.addEventListener( 'load', function () {
134246 for ( let i = 0 ; i < tablists . length ; i ++ ) {
135247 new TabsAutomatic ( tablists [ i ] ) ;
136248 }
249+
250+ // Initialize scroll arrows for tabs
251+ const tabsContainers = document . querySelectorAll (
252+ '.wp-block-wpcomsp-tabs .tabs-container'
253+ ) ;
254+ for ( let i = 0 ; i < tabsContainers . length ; i ++ ) {
255+ new TabsScrollHandler ( tabsContainers [ i ] ) ;
256+ }
137257} ) ;
0 commit comments