Fix active tab selection on mount
When this runs, $api.tabs has not been updated yet, so the calculation was not correct. This caused various bugs like defaultIndex not working and aria-selected not being set, etc.
This commit is contained in:
@@ -104,34 +104,38 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
if ($api.tabs.length <= 0) return;
|
if (tabs.length <= 0) return;
|
||||||
if (selectedIndex !== null) return;
|
if (selectedIndex !== null) return;
|
||||||
|
|
||||||
let tabs = $api.tabs.filter(Boolean) as HTMLElement[];
|
let mountedTabs = tabs.filter(Boolean) as HTMLElement[];
|
||||||
let focusableTabs = tabs.filter((tab) => !tab.hasAttribute("disabled"));
|
let focusableTabs = mountedTabs.filter(
|
||||||
|
(tab) => !tab.hasAttribute("disabled")
|
||||||
|
);
|
||||||
if (focusableTabs.length <= 0) return;
|
if (focusableTabs.length <= 0) return;
|
||||||
|
|
||||||
// Underflow
|
// Underflow
|
||||||
if (defaultIndex < 0) {
|
if (defaultIndex < 0) {
|
||||||
selectedIndex = tabs.indexOf(focusableTabs[0]);
|
selectedIndex = mountedTabs.indexOf(focusableTabs[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Overflow
|
// Overflow
|
||||||
else if (defaultIndex > $api.tabs.length) {
|
else if (defaultIndex > mountedTabs.length) {
|
||||||
selectedIndex = tabs.indexOf(focusableTabs[focusableTabs.length - 1]);
|
selectedIndex = mountedTabs.indexOf(
|
||||||
|
focusableTabs[focusableTabs.length - 1]
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Middle
|
// Middle
|
||||||
else {
|
else {
|
||||||
let before = tabs.slice(0, defaultIndex);
|
let before = mountedTabs.slice(0, defaultIndex);
|
||||||
let after = tabs.slice(defaultIndex);
|
let after = mountedTabs.slice(defaultIndex);
|
||||||
|
|
||||||
let next = [...after, ...before].find((tab) =>
|
let next = [...after, ...before].find((tab) =>
|
||||||
focusableTabs.includes(tab)
|
focusableTabs.includes(tab)
|
||||||
);
|
);
|
||||||
if (!next) return;
|
if (!next) return;
|
||||||
|
|
||||||
selectedIndex = tabs.indexOf(next);
|
selectedIndex = mountedTabs.indexOf(next);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user