1
+ function getTabs ( el : TabContainerElement ) : HTMLElement [ ] {
2
+ return Array . from ( el . querySelectorAll < HTMLElement > ( '[role="tablist"] [role="tab"]' ) ) . filter (
3
+ tab => tab instanceof HTMLElement && tab . closest ( el . tagName ) === el
4
+ )
5
+ }
6
+
1
7
export default class TabContainerElement extends HTMLElement {
2
8
constructor ( ) {
3
9
super ( )
@@ -7,9 +13,7 @@ export default class TabContainerElement extends HTMLElement {
7
13
if ( ! ( target instanceof HTMLElement ) ) return
8
14
if ( target . closest ( this . tagName ) !== this ) return
9
15
if ( target . getAttribute ( 'role' ) !== 'tab' && ! target . closest ( '[role="tablist"]' ) ) return
10
- const tabs = Array . from ( this . querySelectorAll ( '[role="tablist"] [role="tab"]' ) ) . filter (
11
- tab => tab . closest ( this . tagName ) === this
12
- )
16
+ const tabs = getTabs ( this )
13
17
const currentIndex = tabs . indexOf ( tabs . find ( tab => tab . matches ( '[aria-selected="true"]' ) ) ! )
14
18
15
19
if ( event . code === 'ArrowRight' ) {
@@ -30,21 +34,21 @@ export default class TabContainerElement extends HTMLElement {
30
34
} )
31
35
32
36
this . addEventListener ( 'click' , ( event : MouseEvent ) => {
33
- const tabs = Array . from ( this . querySelectorAll ( '[role="tablist"] [role="tab"]' ) )
37
+ const tabs = getTabs ( this )
34
38
35
39
if ( ! ( event . target instanceof Element ) ) return
36
40
if ( event . target . closest ( this . tagName ) !== this ) return
37
41
38
42
const tab = event . target . closest ( '[role="tab"]' )
39
- if ( ! tab || ! tab . closest ( '[role="tablist"]' ) ) return
43
+ if ( ! ( tab instanceof HTMLElement ) || ! tab . closest ( '[role="tablist"]' ) ) return
40
44
41
45
const index = tabs . indexOf ( tab )
42
46
selectTab ( this , index )
43
47
} )
44
48
}
45
49
46
50
connectedCallback ( ) : void {
47
- for ( const tab of this . querySelectorAll ( '[role="tablist"] [role="tab"]' ) ) {
51
+ for ( const tab of getTabs ( this ) ) {
48
52
if ( ! tab . hasAttribute ( 'aria-selected' ) ) {
49
53
tab . setAttribute ( 'aria-selected' , 'false' )
50
54
}
@@ -60,9 +64,7 @@ export default class TabContainerElement extends HTMLElement {
60
64
}
61
65
62
66
function selectTab ( tabContainer : TabContainerElement , index : number ) {
63
- const tabs = Array . from ( tabContainer . querySelectorAll < HTMLElement > ( '[role="tablist"] [role="tab"]' ) ) . filter (
64
- tab => tab . closest ( tabContainer . tagName ) === tabContainer
65
- )
67
+ const tabs = getTabs ( tabContainer )
66
68
const panels = Array . from ( tabContainer . querySelectorAll < HTMLElement > ( '[role="tabpanel"]' ) ) . filter (
67
69
panel => panel . closest ( tabContainer . tagName ) === tabContainer
68
70
)
0 commit comments