Skip to content

Commit 13c1812

Browse files
committed
fix: allow keyboard navigation to tabs when none are active
1 parent 0662930 commit 13c1812

File tree

2 files changed

+36
-15
lines changed

2 files changed

+36
-15
lines changed

packages/tab-bar/TabBar.svelte

+16
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,18 @@
6868
}
6969
}
7070
71+
$: if (tabs.length) {
72+
// Manually get the accessor so it is reactive.
73+
const accessor =
74+
tabs[0] instanceof Object
75+
? tabAccessorWeakMap.get(tabs[0])
76+
: tabAccessorMap[tabs[0]];
77+
78+
if (accessor) {
79+
accessor.forceAccessible(activeIndex === -1);
80+
}
81+
}
82+
7183
$: if (instance) {
7284
instance.setUseAutomaticActivation(useAutomaticActivation);
7385
}
@@ -142,16 +154,20 @@
142154
function addAccessor(tabId, accessor) {
143155
if (tabId instanceof Object) {
144156
tabAccessorWeakMap.set(tabId, accessor);
157+
tabAccessorWeakMap = tabAccessorWeakMap;
145158
} else {
146159
tabAccessorMap[tabId] = accessor;
160+
tabAccessorMap = tabAccessorMap;
147161
}
148162
}
149163
150164
function removeAccessor(tabId) {
151165
if (tabId instanceof Object) {
152166
tabAccessorWeakMap.delete(tabId);
167+
tabAccessorWeakMap = tabAccessorWeakMap;
153168
} else {
154169
delete tabAccessorMap[tabId];
170+
tabAccessorMap = tabAccessorMap;
155171
}
156172
}
157173

packages/tab/Tab.svelte

+20-15
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
})}
2626
role="tab"
2727
aria-selected={active ? 'true' : 'false'}
28-
tabindex={active ? '0' : '-1'}
28+
tabindex={active || forceAccessible ? '0' : '-1'}
2929
{href}
3030
on:click={instance && instance.handleClick()}
3131
{...internalAttrs}
@@ -109,20 +109,7 @@
109109
let internalAttrs = {};
110110
let focusOnActivate = getContext('SMUI:tab:focusOnActivate');
111111
let active = tabId === getContext('SMUI:tab:initialActive');
112-
let accessor = {
113-
tabId,
114-
get element() {
115-
return getElement();
116-
},
117-
get active() {
118-
return active;
119-
},
120-
computeIndicatorClientRect: () => tabIndicator.computeContentClientRect(),
121-
computeDimensions: () => instance.computeDimensions(),
122-
focus,
123-
activate,
124-
deactivate,
125-
};
112+
let forceAccessible = false;
126113
127114
export let component = href == null ? Button : A;
128115
@@ -157,6 +144,24 @@
157144
focus,
158145
});
159146
147+
const accessor = {
148+
tabId,
149+
get element() {
150+
return getElement();
151+
},
152+
get active() {
153+
return active;
154+
},
155+
forceAccessible(accessible) {
156+
forceAccessible = accessible;
157+
},
158+
computeIndicatorClientRect: () => tabIndicator.computeContentClientRect(),
159+
computeDimensions: () => instance.computeDimensions(),
160+
focus,
161+
activate,
162+
deactivate,
163+
};
164+
160165
dispatch(getElement(), 'SMUI:tab:mount', accessor);
161166
162167
instance.init();

0 commit comments

Comments
 (0)