@@ -71,7 +71,15 @@ export class TabContainerElement extends HTMLElement {
7171
7272 get #tabList( ) {
7373 const slot = this . #tabListSlot
74- return slot . assignedNodes ( ) [ 0 ] as HTMLElement
74+ if ( this . #tabListTabWrapper. hasAttribute ( 'role' ) ) {
75+ return this . #tabListTabWrapper
76+ } else {
77+ return slot . assignedNodes ( ) [ 0 ] as HTMLElement
78+ }
79+ }
80+
81+ get #tabListTabWrapper( ) {
82+ return this . shadowRoot ! . querySelector < HTMLSlotElement > ( 'div[part="tablist-tab-wrapper"]' ) !
7583 }
7684
7785 get #beforeTabsSlot( ) {
@@ -95,6 +103,9 @@ export class TabContainerElement extends HTMLElement {
95103 }
96104
97105 get #tabs( ) {
106+ if ( this . #tabListTabWrapper. matches ( '[role=tablist]' ) ) {
107+ return this . #tabListSlot. assignedNodes ( ) as HTMLElement [ ]
108+ }
98109 return Array . from ( this . #tabList?. querySelectorAll < HTMLElement > ( '[role="tab"]' ) || [ ] ) . filter (
99110 tab => tab instanceof HTMLElement && tab . closest ( this . tagName ) === this ,
100111 )
@@ -125,9 +136,12 @@ export class TabContainerElement extends HTMLElement {
125136 const tabListContainer = document . createElement ( 'div' )
126137 tabListContainer . style . display = 'flex'
127138 tabListContainer . setAttribute ( 'part' , 'tablist-wrapper' )
139+ const tabListTabWrapper = document . createElement ( 'div' )
140+ tabListTabWrapper . setAttribute ( 'part' , 'tablist-tab-wrapper' )
128141 const tabListSlot = document . createElement ( 'slot' )
129142 tabListSlot . setAttribute ( 'part' , 'tablist' )
130143 tabListSlot . setAttribute ( 'name' , 'tablist' )
144+ tabListTabWrapper . append ( tabListSlot )
131145 const panelSlot = document . createElement ( 'slot' )
132146 panelSlot . setAttribute ( 'part' , 'panel' )
133147 panelSlot . setAttribute ( 'name' , 'panel' )
@@ -138,7 +152,7 @@ export class TabContainerElement extends HTMLElement {
138152 const afterTabSlot = document . createElement ( 'slot' )
139153 afterTabSlot . setAttribute ( 'part' , 'after-tabs' )
140154 afterTabSlot . setAttribute ( 'name' , 'after-tabs' )
141- tabListContainer . append ( beforeTabSlot , tabListSlot , afterTabSlot )
155+ tabListContainer . append ( beforeTabSlot , tabListTabWrapper , afterTabSlot )
142156 const afterSlot = document . createElement ( 'slot' )
143157 afterSlot . setAttribute ( 'part' , 'after-panels' )
144158 afterSlot . setAttribute ( 'name' , 'after-panels' )
@@ -223,16 +237,13 @@ export class TabContainerElement extends HTMLElement {
223237 customTabList . setAttribute ( 'slot' , 'tablist' )
224238 }
225239 } else {
226- const tabListElement = document . createElement ( 'div' )
227- this . prepend ( tabListElement )
228- tabListElement . append ( ...[ ...this . children ] . filter ( e => e . matches ( '[role=tab]' ) ) )
229- tabListElement . role = 'tablist'
230- tabListElement . style . display = 'block'
231-
240+ this . #tabListTabWrapper. role = 'tablist'
232241 if ( manualSlotsSupported ) {
233- tabListSlot . assign ( tabListElement )
242+ tabListSlot . assign ( ... [ ... this . children ] . filter ( e => e . matches ( '[role=tab]' ) ) )
234243 } else {
235- tabListElement . setAttribute ( 'slot' , 'tablist' )
244+ for ( const e of this . children ) {
245+ if ( e . matches ( '[role=tab]' ) ) e . setAttribute ( 'slot' , 'tablist' )
246+ }
236247 }
237248 }
238249 const tabList = this . #tabList
@@ -246,7 +257,7 @@ export class TabContainerElement extends HTMLElement {
246257 const afterSlotted : Element [ ] = [ ]
247258 let autoSlotted = beforeSlotted
248259 for ( const child of this . children ) {
249- if ( child . getAttribute ( 'role' ) === 'tablist' ) {
260+ if ( child . getAttribute ( 'role' ) === 'tab' || child . getAttribute ( 'role' ) === ' tablist') {
250261 autoSlotted = afterTabSlotted
251262 continue
252263 }
0 commit comments