Skip to content

Commit 34a8396

Browse files
committed
add activeTab, selectedTabIndex props
1 parent f24eac6 commit 34a8396

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

src/tab-container-element.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ export class TabContainerElement extends HTMLElement {
107107
)
108108
}
109109

110+
get activeTab() {
111+
return this.#tabs[this.selectedTabIndex]
112+
}
113+
110114
get activePanel() {
111115
return this.#panelSlot.assignedNodes()[0] as HTMLElement
112116
}
@@ -181,7 +185,7 @@ export class TabContainerElement extends HTMLElement {
181185
const tabs = this.#tabs
182186
if (!tabs.includes(tab as HTMLElement)) return
183187

184-
const currentIndex = tabs.indexOf(tabs.find(e => e.matches('[aria-selected="true"]'))!)
188+
const currentIndex = this.selectedTabIndex
185189
const vertical = tab.closest('[role="tablist"]')?.getAttribute('aria-orientation') === 'vertical'
186190
const prevTab = event.code === 'ArrowLeft' || (vertical && event.code === 'ArrowUp')
187191
const nextTab = event.code === 'ArrowRight' || (vertical && event.code === 'ArrowDown')
@@ -218,6 +222,14 @@ export class TabContainerElement extends HTMLElement {
218222
}
219223
}
220224

225+
get selectedTabIndex(): number {
226+
return this.#tabs.findIndex(el => el.matches('[aria-selected=true]'))
227+
}
228+
229+
set selectedTabIndex(i: number) {
230+
this.selectTab(i)
231+
}
232+
221233
selectTab(index: number): void {
222234
if (!this.#setupComplete) {
223235
const tabListSlot = this.#tabListSlot
@@ -276,7 +288,7 @@ export class TabContainerElement extends HTMLElement {
276288
for (const el of afterSlotted) el.setAttribute('slot', 'after-panels')
277289
}
278290
const defaultTab = Number(this.getAttribute('default-tab') || -1)
279-
const defaultIndex = defaultTab >= 0 ? defaultTab : this.#tabs.findIndex(el => el.matches('[aria-selected=true]'))
291+
const defaultIndex = defaultTab >= 0 ? defaultTab : this.selectedTabIndex
280292
index = index >= 0 ? index : Math.max(0, defaultIndex)
281293
}
282294

test/test.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,8 @@ describe('tab-container', function () {
162162
'change events point to second panel',
163163
)
164164
assert.equal(document.activeElement, tabs[1])
165+
assert.equal(tabContainer.activeTab, tabs[1])
166+
assert.equal(tabContainer.selectedTabIndex, 1)
165167
})
166168

167169
it('keyboard shortcuts work and `tab-container-changed` events are dispatched', function () {
@@ -187,6 +189,8 @@ describe('tab-container', function () {
187189
assert.deepStrictEqual(tabs.map(isSelected), [true, false, false], 'First tab is selected')
188190
assert.deepStrictEqual(panels.map(isHidden), [false, true, true], 'First panel is visible')
189191
assert.equal(document.activeElement, tabs[0])
192+
assert.equal(tabContainer.activeTab, tabs[0])
193+
assert.equal(tabContainer.selectedTabIndex, 0)
190194
assert.equal(events.length, 2, 'tab-container-change(d) called')
191195
assert.deepStrictEqual(
192196
events.map(e => e.type),
@@ -280,6 +284,8 @@ describe('tab-container', function () {
280284
'change events point to second panel',
281285
)
282286
assert.equal(document.activeElement, tabs[1])
287+
assert.equal(tabContainer.activeTab, tabs[1])
288+
assert.equal(tabContainer.selectedTabIndex, 1)
283289
})
284290

285291
it('result in noop, when selectTab receives out of bounds index', function () {
@@ -417,6 +423,8 @@ describe('tab-container', function () {
417423
assert.deepStrictEqual(tabs.map(isSelected), [false, false, true], 'Third tab is selected')
418424
assert.deepStrictEqual(panels.map(isHidden), [true, true, false], 'Third panel is visible')
419425
assert.equal(document.activeElement, tabs[2])
426+
assert.equal(tabContainer.activeTab, tabs[2])
427+
assert.equal(tabContainer.selectedTabIndex, 2)
420428
assert.equal(events.length, 2, 'tab-container-change(d) called')
421429
assert.deepStrictEqual(
422430
events.map(e => e.type),
@@ -439,6 +447,8 @@ describe('tab-container', function () {
439447
assert.deepStrictEqual(tabs.map(isSelected), [true, false, false], 'First tab is selected')
440448
assert.deepStrictEqual(panels.map(isHidden), [false, true, true], 'First panel is visible')
441449
assert.equal(document.activeElement, tabs[0])
450+
assert.equal(tabContainer.activeTab, tabs[0])
451+
assert.equal(tabContainer.selectedTabIndex, 0)
442452
assert.equal(events.length, 2, 'tab-container-change(d) called')
443453
assert.deepStrictEqual(
444454
events.map(e => e.type),
@@ -461,6 +471,8 @@ describe('tab-container', function () {
461471
assert.deepStrictEqual(tabs.map(isSelected), [false, true, false], 'Second tab is selected')
462472
assert.deepStrictEqual(panels.map(isHidden), [true, false, true], 'Second panel is visible')
463473
assert.equal(document.activeElement, tabs[1])
474+
assert.equal(tabContainer.activeTab, tabs[1])
475+
assert.equal(tabContainer.selectedTabIndex, 1)
464476
assert.equal(events.length, 2, 'tab-container-change(d) called')
465477
assert.deepStrictEqual(
466478
events.map(e => e.type),
@@ -483,6 +495,8 @@ describe('tab-container', function () {
483495
assert.deepStrictEqual(tabs.map(isSelected), [false, false, true], 'Third tab is selected')
484496
assert.deepStrictEqual(panels.map(isHidden), [true, true, false], 'Third panel is visible')
485497
assert.equal(document.activeElement, tabs[2])
498+
assert.equal(tabContainer.activeTab, tabs[2])
499+
assert.equal(tabContainer.selectedTabIndex, 2)
486500
assert.equal(events.length, 2, 'tab-container-change(d) called')
487501
assert.deepStrictEqual(
488502
events.map(e => e.type),
@@ -506,6 +520,8 @@ describe('tab-container', function () {
506520
assert.deepStrictEqual(tabs.map(isSelected), [false, false, true], 'Third tab is selected')
507521
assert.deepStrictEqual(panels.map(isHidden), [true, true, false], 'Third panel is visible')
508522
assert.equal(document.activeElement, tabs[2])
523+
assert.equal(tabContainer.activetab, tabs[2])
524+
assert.equal(tabContainer.selectedTabIndex, 2)
509525
assert.equal(events.length, 2, 'tab-container-change(d) called')
510526
assert.deepStrictEqual(
511527
events.map(e => e.type),
@@ -528,6 +544,8 @@ describe('tab-container', function () {
528544
assert.deepStrictEqual(tabs.map(isSelected), [true, false, false], 'First tab is selected')
529545
assert.deepStrictEqual(panels.map(isHidden), [false, true, true], 'First panel is visible')
530546
assert.equal(document.activeElement, tabs[0])
547+
assert.equal(tabContainer.activeTab, tabs[0])
548+
assert.equal(tabContainer.selectedTabIndex, 0)
531549
assert.equal(events.length, 2, 'tab-container-change(d) called')
532550
assert.deepStrictEqual(
533551
events.map(e => e.type),
@@ -550,6 +568,8 @@ describe('tab-container', function () {
550568
assert.deepStrictEqual(tabs.map(isSelected), [false, true, false], 'Second tab is selected')
551569
assert.deepStrictEqual(panels.map(isHidden), [true, false, true], 'Second panel is visible')
552570
assert.equal(document.activeElement, tabs[1])
571+
assert.equal(tabContainer.activetab, tabs[1])
572+
assert.equal(tabContainer.selectedTabIndex, 1)
553573
assert.equal(events.length, 2, 'tab-container-change(d) called')
554574
assert.deepStrictEqual(
555575
events.map(e => e.type),
@@ -572,6 +592,8 @@ describe('tab-container', function () {
572592
assert.deepStrictEqual(tabs.map(isSelected), [false, false, true], 'Third tab is selected')
573593
assert.deepStrictEqual(panels.map(isHidden), [true, true, false], 'Third panel is visible')
574594
assert.equal(document.activeElement, tabs[2])
595+
assert.equal(tabContainer.activetab, tabs[2])
596+
assert.equal(tabContainer.selectedTabIndex, 2)
575597
assert.equal(events.length, 2, 'tab-container-change(d) called')
576598
assert.deepStrictEqual(
577599
events.map(e => e.type),

0 commit comments

Comments
 (0)