From 0f621c254521a9216df9bd3ea38100053122a8a2 Mon Sep 17 00:00:00 2001 From: metonym Date: Sun, 29 May 2022 10:12:55 -0700 Subject: [PATCH] fix(tabs): selected tab should not steal focus if updated programmatically (#1320) Fixes #572 --- src/Tabs/Tab.svelte | 16 +--------------- src/Tabs/Tabs.svelte | 12 ++++++++++-- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/Tabs/Tab.svelte b/src/Tabs/Tab.svelte index c276e17e..b99e50f9 100644 --- a/src/Tabs/Tab.svelte +++ b/src/Tabs/Tab.svelte @@ -20,27 +20,13 @@ /** Obtain a reference to the anchor HTML element */ export let ref = null; - import { onMount, afterUpdate, getContext, tick } from "svelte"; + import { getContext } from "svelte"; const { selectedTab, useAutoWidth, add, update, change } = getContext("Tabs"); add({ id, label, disabled }); - let didMount = false; - $: selected = $selectedTab === id; - - onMount(() => { - tick().then(() => { - didMount = true; - }); - }); - - afterUpdate(() => { - if (didMount && selected && ref) { - ref.focus(); - } - }); diff --git a/src/Tabs/Tabs.svelte b/src/Tabs/Tabs.svelte index 282d5fb8..73564a40 100644 --- a/src/Tabs/Tabs.svelte +++ b/src/Tabs/Tabs.svelte @@ -20,7 +20,7 @@ /** Specify the tab trigger href attribute */ export let triggerHref = "#"; - import { createEventDispatcher, afterUpdate, setContext } from "svelte"; + import { createEventDispatcher, afterUpdate, setContext, tick } from "svelte"; import { writable, derived } from "svelte/store"; import ChevronDown from "../icons/ChevronDown.svelte"; @@ -38,6 +38,8 @@ ); const selectedContent = writable(undefined); + let refTabList = null; + setContext("Tabs", { tabs, contentById, @@ -53,7 +55,7 @@ update: (id) => { currentIndex = $tabsById[id].index; }, - change: (direction) => { + change: async (direction) => { let index = currentIndex + direction; if (index < 0) { @@ -77,6 +79,11 @@ } currentIndex = index; + + await tick(); + const activeTab = + refTabList?.querySelectorAll("[role='tab']")[currentIndex]; + activeTab?.focus(); }, }); @@ -145,6 +152,7 @@