@@ -86,50 +86,52 @@ export class TabContainerElement extends HTMLElement {
8686 }
8787 }
8888
89- connectedCallback ( ) : void {
90- this . addEventListener ( 'keydown' , ( event : KeyboardEvent ) => {
91- const target = event . target
92- if ( ! ( target instanceof HTMLElement ) ) return
93- if ( target . closest ( this . tagName ) !== this ) return
94- if ( target . getAttribute ( 'role' ) !== 'tab' && ! target . closest ( '[role="tablist"]' ) ) return
95- const tabs = getTabs ( this )
96- const currentIndex = tabs . indexOf ( tabs . find ( tab => tab . matches ( '[aria-selected="true"]' ) ) ! )
97- const [ incrementKeys , decrementKeys ] = getNavigationKeyCodes (
98- target . closest ( '[role="tablist"]' ) ?. getAttribute ( 'aria-orientation' ) === 'vertical' ,
99- )
89+ #handleKeydown( event : KeyboardEvent ) {
90+ const target = event . target
91+ if ( ! ( target instanceof HTMLElement ) ) return
92+ if ( target . closest ( this . tagName ) !== this ) return
93+ if ( target . getAttribute ( 'role' ) !== 'tab' && ! target . closest ( '[role="tablist"]' ) ) return
94+ const tabs = getTabs ( this )
95+ const currentIndex = tabs . indexOf ( tabs . find ( tab => tab . matches ( '[aria-selected="true"]' ) ) ! )
96+ const [ incrementKeys , decrementKeys ] = getNavigationKeyCodes (
97+ target . closest ( '[role="tablist"]' ) ?. getAttribute ( 'aria-orientation' ) === 'vertical' ,
98+ )
10099
101- if ( incrementKeys . some ( code => event . code === code ) ) {
102- let index = currentIndex + 1
103- if ( index >= tabs . length ) index = 0
104- this . selectTab ( index )
105- } else if ( decrementKeys . some ( code => event . code === code ) ) {
106- let index = currentIndex - 1
107- if ( index < 0 ) index = tabs . length - 1
108- this . selectTab ( index )
109- } else if ( event . code === 'Home' ) {
110- this . selectTab ( 0 )
111- event . preventDefault ( )
112- } else if ( event . code === 'End' ) {
113- this . selectTab ( tabs . length - 1 )
114- event . preventDefault ( )
115- }
116- } )
100+ if ( incrementKeys . some ( code => event . code === code ) ) {
101+ let index = currentIndex + 1
102+ if ( index >= tabs . length ) index = 0
103+ this . selectTab ( index )
104+ } else if ( decrementKeys . some ( code => event . code === code ) ) {
105+ let index = currentIndex - 1
106+ if ( index < 0 ) index = tabs . length - 1
107+ this . selectTab ( index )
108+ } else if ( event . code === 'Home' ) {
109+ this . selectTab ( 0 )
110+ event . preventDefault ( )
111+ } else if ( event . code === 'End' ) {
112+ this . selectTab ( tabs . length - 1 )
113+ event . preventDefault ( )
114+ }
115+ }
117116
118- this . addEventListener ( 'click' , ( event : MouseEvent ) => {
119- const tabs = getTabs ( this )
117+ #handleClick ( event : MouseEvent ) {
118+ const tabs = getTabs ( this )
120119
121- if ( ! ( event . target instanceof Element ) ) return
122- if ( event . target . closest ( this . tagName ) !== this ) return
120+ if ( ! ( event . target instanceof Element ) ) return
121+ if ( event . target . closest ( this . tagName ) !== this ) return
123122
124- const tab = event . target . closest ( '[role="tab"]' )
125- if ( ! ( tab instanceof HTMLElement ) || ! tab . closest ( '[role="tablist"]' ) ) {
126- return
127- }
123+ const tab = event . target . closest ( '[role="tab"]' )
124+ if ( ! ( tab instanceof HTMLElement ) || ! tab . closest ( '[role="tablist"]' ) ) {
125+ return
126+ }
128127
129- const index = tabs . indexOf ( tab )
130- this . selectTab ( index )
131- } )
128+ const index = tabs . indexOf ( tab )
129+ this . selectTab ( index )
130+ }
132131
132+ connectedCallback ( ) : void {
133+ this . addEventListener ( 'keydown' , this )
134+ this . addEventListener ( 'click' , this )
133135 for ( const tab of getTabs ( this ) ) {
134136 if ( ! tab . hasAttribute ( 'aria-selected' ) ) {
135137 tab . setAttribute ( 'aria-selected' , 'false' )
@@ -144,6 +146,11 @@ export class TabContainerElement extends HTMLElement {
144146 }
145147 }
146148
149+ handleEvent ( event : Event ) {
150+ if ( event . type === 'click' ) return this . #handleClick( event as MouseEvent )
151+ if ( event . type === 'keydown' ) return this . #handleKeydown( event as KeyboardEvent )
152+ }
153+
147154 selectTab ( index : number ) : void {
148155 const tabs = getTabs ( this )
149156 const panels = Array . from ( this . querySelectorAll < HTMLElement > ( '[role="tabpanel"]' ) ) . filter (
0 commit comments