@@ -3,12 +3,6 @@ const HTMLElement = globalThis.HTMLElement || (null as unknown as (typeof window
33type IncrementKeyCode = 'ArrowRight' | 'ArrowDown'
44type DecrementKeyCode = 'ArrowUp' | 'ArrowLeft'
55
6- function getTabs ( el : TabContainerElement ) : HTMLElement [ ] {
7- return Array . from ( el . querySelectorAll < HTMLElement > ( '[role="tablist"] [role="tab"]' ) ) . filter (
8- tab => tab instanceof HTMLElement && tab . closest ( el . tagName ) === el ,
9- )
10- }
11-
126export class TabContainerChangeEvent extends Event {
137 constructor ( type : string , { tab, panel, ...init } : EventInit & { tab ?: Element ; panel ?: Element } ) {
148 super ( type , init )
@@ -86,13 +80,19 @@ export class TabContainerElement extends HTMLElement {
8680 }
8781 }
8882
83+ get #tabs( ) : HTMLElement [ ] {
84+ return Array . from ( this . querySelectorAll < HTMLElement > ( '[role="tablist"] [role="tab"]' ) ) . filter (
85+ tab => tab instanceof HTMLElement && tab . closest ( this . tagName ) === this ,
86+ )
87+ }
88+
8989 connectedCallback ( ) : void {
9090 this . addEventListener ( 'keydown' , ( event : KeyboardEvent ) => {
9191 const target = event . target
9292 if ( ! ( target instanceof HTMLElement ) ) return
9393 if ( target . closest ( this . tagName ) !== this ) return
9494 if ( target . getAttribute ( 'role' ) !== 'tab' && ! target . closest ( '[role="tablist"]' ) ) return
95- const tabs = getTabs ( this )
95+ const tabs = this . #tabs
9696 const currentIndex = tabs . indexOf ( tabs . find ( tab => tab . matches ( '[aria-selected="true"]' ) ) ! )
9797 const [ incrementKeys , decrementKeys ] = getNavigationKeyCodes (
9898 target . closest ( '[role="tablist"]' ) ?. getAttribute ( 'aria-orientation' ) === 'vertical' ,
@@ -116,7 +116,7 @@ export class TabContainerElement extends HTMLElement {
116116 } )
117117
118118 this . addEventListener ( 'click' , ( event : MouseEvent ) => {
119- const tabs = getTabs ( this )
119+ const tabs = this . #tabs
120120
121121 if ( ! ( event . target instanceof Element ) ) return
122122 if ( event . target . closest ( this . tagName ) !== this ) return
@@ -130,7 +130,7 @@ export class TabContainerElement extends HTMLElement {
130130 this . selectTab ( index )
131131 } )
132132
133- for ( const tab of getTabs ( this ) ) {
133+ for ( const tab of this . #tabs ) {
134134 if ( ! tab . hasAttribute ( 'aria-selected' ) ) {
135135 tab . setAttribute ( 'aria-selected' , 'false' )
136136 }
@@ -145,7 +145,7 @@ export class TabContainerElement extends HTMLElement {
145145 }
146146
147147 selectTab ( index : number ) : void {
148- const tabs = getTabs ( this )
148+ const tabs = this . #tabs
149149 const panels = Array . from ( this . querySelectorAll < HTMLElement > ( '[role="tabpanel"]' ) ) . filter (
150150 panel => panel . closest ( this . tagName ) === this ,
151151 )
0 commit comments