Skip to content

Commit e2a112f

Browse files
committed
Don't mutate the light DOM
1 parent 0f621b7 commit e2a112f

File tree

1 file changed

+22
-11
lines changed

1 file changed

+22
-11
lines changed

src/tab-container-element.ts

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)