@@ -2,10 +2,68 @@ import { HTML } from "./tab-sheet.html.js";
22export class TabSheet extends HTMLElement {
33 static name = Object . freeze ( "tab-sheet" ) ;
44
5+ #clickHandler = this . #click. bind ( this ) ;
6+
57 constructor ( ) {
68 super ( ) ;
79 this . attachShadow ( { mode : "open" } ) ;
810 this . shadowRoot . innerHTML = HTML ;
11+ this . style . display = "none" ;
12+ }
13+
14+ connectedCallback ( ) {
15+ // 1. get all elements in the <slot> element.
16+ const slot = this . shadowRoot . querySelector ( ".content slot" ) ;
17+ const elements = slot . assignedElements ( ) ;
18+
19+ // 2. for each element, set aria-hidden to true
20+ for ( const element of elements ) {
21+ element . setAttribute ( "aria-hidden" , "true" ) ;
22+ }
23+
24+ requestAnimationFrame ( ( ) => {
25+ this . #selectFirstTab( ) ;
26+ this . style . display = "flex" ;
27+
28+ this . shadowRoot . querySelector ( ".header" ) . addEventListener ( "click" , this . #clickHandler) ;
29+ } )
30+ }
31+
32+ disconnectedCallback ( ) {
33+ this . shadowRoot . querySelector ( ".header" ) . removeEventListener ( "click" , this . #clickHandler) ;
34+ }
35+
36+ #click( event ) {
37+ const target = event . composedPath ( ) [ 0 ] ;
38+ const id = target . getAttribute ( "for" ) ;
39+ if ( id == null ) return ;
40+
41+ this . selectTab ( id ) ;
42+ }
43+
44+ #selectFirstTab( ) {
45+ const slot = this . shadowRoot . querySelector ( ".header slot" ) ;
46+ const elements = slot . assignedElements ( ) ;
47+ if ( elements . length === 0 ) return ;
48+
49+ const firstTab = elements [ 0 ] ;
50+ const id = firstTab . getAttribute ( "for" ) ;
51+ this . selectTab ( id ) ;
52+ }
53+
54+ selectTab ( id ) {
55+ const currentTab = this . querySelector ( "[aria-selected]" ) ;
56+ if ( currentTab != null ) {
57+ currentTab . removeAttribute ( "aria-selected" ) ;
58+ const currentId = currentTab . getAttribute ( "for" ) ;
59+ const currentContent = this . querySelector ( `#${ currentId } ` ) ;
60+ currentContent . setAttribute ( "aria-hidden" , "true" ) ;
61+ }
62+
63+ const newTab = this . querySelector ( `[for="${ id } "]` ) ;
64+ newTab . setAttribute ( "aria-selected" , "true" ) ;
65+ const newContent = this . querySelector ( `#${ id } ` ) ;
66+ newContent . removeAttribute ( "aria-hidden" ) ;
967 }
1068}
1169
0 commit comments