@@ -9,6 +9,30 @@ function getTabs(el: TabContainerElement): HTMLElement[] {
99 )
1010}
1111
12+ export class TabContainerChangeEvent extends Event {
13+ constructor ( type : string , { tab, panel, ...init } : EventInit & { tab ?: Element ; panel ?: Element } ) {
14+ super ( type , init )
15+ this . #tab = tab || null
16+ this . #panel = panel || null
17+ }
18+
19+ get detail ( ) {
20+ // eslint-disable-next-line no-console
21+ console . warn ( 'TabContainerElement.detail is deprecated, please use .panel instead' )
22+ return { relatedTarget : this . #panel}
23+ }
24+
25+ #panel: Element | null = null
26+ get panel ( ) : Element | null {
27+ return this . #panel
28+ }
29+
30+ #tab: Element | null = null
31+ get tab ( ) : Element | null {
32+ return this . #tab
33+ }
34+ }
35+
1236function getNavigationKeyCodes ( vertical : boolean ) : [ IncrementKeyCode [ ] , DecrementKeyCode [ ] ] {
1337 if ( vertical ) {
1438 return [
@@ -26,6 +50,42 @@ export class TabContainerElement extends HTMLElement {
2650 return this
2751 }
2852
53+ #onTabContainerChange: ( ( event : TabContainerChangeEvent ) => void ) | null = null
54+ get onTabContainerChange ( ) {
55+ return this . #onTabContainerChange
56+ }
57+
58+ set onTabContainerChange ( listener : ( ( event : TabContainerChangeEvent ) => void ) | null ) {
59+ if ( this . #onTabContainerChange) {
60+ this . removeEventListener (
61+ 'tab-container-change' ,
62+ this . #onTabContainerChange as unknown as EventListenerOrEventListenerObject ,
63+ )
64+ }
65+ this . #onTabContainerChange = typeof listener === 'object' || typeof listener === 'function' ? listener : null
66+ if ( typeof listener === 'function' ) {
67+ this . addEventListener ( 'tab-container-change' , listener as unknown as EventListenerOrEventListenerObject )
68+ }
69+ }
70+
71+ #onTabContainerChanged: ( ( event : TabContainerChangeEvent ) => void ) | null = null
72+ get onTabContainerChanged ( ) {
73+ return this . #onTabContainerChanged
74+ }
75+
76+ set onTabContainerChanged ( listener : ( ( event : TabContainerChangeEvent ) => void ) | null ) {
77+ if ( this . #onTabContainerChanged) {
78+ this . removeEventListener (
79+ 'tab-container-changed' ,
80+ this . #onTabContainerChanged as unknown as EventListenerOrEventListenerObject ,
81+ )
82+ }
83+ this . #onTabContainerChanged = typeof listener === 'object' || typeof listener === 'function' ? listener : null
84+ if ( typeof listener === 'function' ) {
85+ this . addEventListener ( 'tab-container-changed' , listener as unknown as EventListenerOrEventListenerObject )
86+ }
87+ }
88+
2989 connectedCallback ( ) : void {
3090 this . addEventListener ( 'keydown' , ( event : KeyboardEvent ) => {
3191 const target = event . target
@@ -101,10 +161,11 @@ export class TabContainerElement extends HTMLElement {
101161 const selectedPanel = panels [ index ]
102162
103163 const cancelled = ! this . dispatchEvent (
104- new CustomEvent ( 'tab-container-change' , {
164+ new TabContainerChangeEvent ( 'tab-container-change' , {
105165 bubbles : true ,
106166 cancelable : true ,
107- detail : { relatedTarget : selectedPanel } ,
167+ tab : selectedTab ,
168+ panel : selectedPanel ,
108169 } ) ,
109170 )
110171 if ( cancelled ) return
@@ -126,9 +187,10 @@ export class TabContainerElement extends HTMLElement {
126187 selectedPanel . hidden = false
127188
128189 this . dispatchEvent (
129- new CustomEvent ( 'tab-container-changed' , {
190+ new TabContainerChangeEvent ( 'tab-container-changed' , {
130191 bubbles : true ,
131- detail : { relatedTarget : selectedPanel } ,
192+ tab : selectedTab ,
193+ panel : selectedPanel ,
132194 } ) ,
133195 )
134196 }
0 commit comments