Refactor the tab component

This commit is contained in:
Steve Kinney
2024-10-01 18:21:25 -05:00
parent ad6dc3b145
commit 867bc939ae

View File

@@ -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}