Refactor the tab component
This commit is contained in:
@@ -4,40 +4,24 @@
|
|||||||
export let tabs = [];
|
export let tabs = [];
|
||||||
|
|
||||||
let tabbedContent = null;
|
let tabbedContent = null;
|
||||||
|
let activeIndex = 0;
|
||||||
|
|
||||||
const selectTab = (event) => {
|
const isSelected = (index) => index === activeIndex;
|
||||||
const tab = event.target;
|
const getTabIndex = (index) => (isSelected(index) ? 0 : -1);
|
||||||
const panel = tabbedContent.querySelector(
|
|
||||||
`#${tab.getAttribute('aria-controls')}`,
|
|
||||||
);
|
|
||||||
|
|
||||||
tabbedContent.querySelectorAll('[role="tab"]').forEach((t) => {
|
|
||||||
t.setAttribute('aria-selected', 'false');
|
|
||||||
t.setAttribute('tabindex', '-1');
|
|
||||||
});
|
|
||||||
|
|
||||||
tab.setAttribute('aria-selected', 'true');
|
|
||||||
tab.setAttribute('tabindex', '0');
|
|
||||||
|
|
||||||
tabbedContent.querySelectorAll('[role="tabpanel"]').forEach((p) => {
|
|
||||||
p.hidden = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
panel.hidden = false;
|
|
||||||
};
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<section bind:this={tabbedContent}>
|
<section bind:this={tabbedContent}>
|
||||||
<div role="tablist">
|
<div role="tablist">
|
||||||
{#each tabs as tab, i}
|
{#each tabs as tab, i}
|
||||||
{@const tabId = tab.id || i}
|
{@const id = tab.id || i}
|
||||||
|
{@const selected = i === activeIndex}
|
||||||
<button
|
<button
|
||||||
role="tab"
|
role="tab"
|
||||||
id="tab-{tabId}"
|
id="tab-{id}"
|
||||||
aria-controls="panel-{tabId}"
|
aria-controls="panel-{id}"
|
||||||
aria-selected="false"
|
aria-selected={selected}
|
||||||
tabindex="-1"
|
tabindex={selected ? 0 : -1}
|
||||||
on:click={selectTab}
|
on:click={() => (activeIndex = i)}
|
||||||
>
|
>
|
||||||
{tab.title}
|
{tab.title}
|
||||||
</button>
|
</button>
|
||||||
@@ -45,8 +29,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{#each tabs as tab, i}
|
{#each tabs as tab, i}
|
||||||
{@const tabId = tab.id || i}
|
<div role="tabpanel" id="panel-{tab.id || i}" hidden={i !== activeIndex}>
|
||||||
<div role="tabpanel" id="panel-{tabId}" hidden>
|
|
||||||
<p>{tab.content}</p>
|
<p>{tab.content}</p>
|
||||||
</div>
|
</div>
|
||||||
{/each}
|
{/each}
|
||||||
|
|||||||
Reference in New Issue
Block a user