Skip to content

Commit 96fb0e3

Browse files
authored
chore: More internal stsn exports (#156)
1 parent 2916206 commit 96fb0e3

File tree

5 files changed

+50
-3
lines changed

5 files changed

+50
-3
lines changed

src/internal/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export { getGlobalFlag } from './global-flags';
3131
export {
3232
SingleTabStopNavigationAPI,
3333
SingleTabStopNavigationProvider,
34+
SingleTabStopNavigationReset,
3435
useSingleTabStopNavigation,
3536
} from './single-tab-stop';
3637
export { isFocusable, getAllFocusables, getFirstFocusable, getLastFocusable } from './focus-lock-utils/utils';

src/internal/single-tab-stop/__tests__/context.test.tsx

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
SingleTabStopNavigationAPI,
99
SingleTabStopNavigationContext,
1010
SingleTabStopNavigationProvider,
11+
SingleTabStopNavigationReset,
1112
useSingleTabStopNavigation,
1213
} from '../';
1314
import { renderWithSingleTabStopNavigation } from './utils';
@@ -247,4 +248,42 @@ describe('nested contexts', () => {
247248
expect(findGroupButton('inner', 0)).toHaveAttribute('tabindex', '0');
248249
expect(findGroupButton('inner', 1)).toHaveAttribute('tabindex', '-1');
249250
});
251+
252+
test('ignores parent context when reset is used', () => {
253+
const { rerender } = render(
254+
<Group id="outer-most" navigationActive={true}>
255+
<SingleTabStopNavigationReset>
256+
<Group id="outer" navigationActive={true}>
257+
<Group id="inner" navigationActive={true}>
258+
{null}
259+
</Group>
260+
</Group>
261+
</SingleTabStopNavigationReset>
262+
</Group>
263+
);
264+
expect(findGroupButton('outer-most', 0)).toHaveAttribute('tabindex', '0');
265+
expect(findGroupButton('outer-most', 1)).toHaveAttribute('tabindex', '-1');
266+
expect(findGroupButton('outer', 0)).toHaveAttribute('tabindex', '0');
267+
expect(findGroupButton('outer', 1)).toHaveAttribute('tabindex', '-1');
268+
expect(findGroupButton('inner', 0)).toHaveAttribute('tabindex', '-1');
269+
expect(findGroupButton('inner', 1)).toHaveAttribute('tabindex', '-1');
270+
271+
rerender(
272+
<Group id="outer-most" navigationActive={true}>
273+
<Group id="outer" navigationActive={true}>
274+
<SingleTabStopNavigationReset>
275+
<Group id="inner" navigationActive={true}>
276+
{null}
277+
</Group>
278+
</SingleTabStopNavigationReset>
279+
</Group>
280+
</Group>
281+
);
282+
expect(findGroupButton('outer-most', 0)).toHaveAttribute('tabindex', '0');
283+
expect(findGroupButton('outer-most', 1)).toHaveAttribute('tabindex', '-1');
284+
expect(findGroupButton('outer', 0)).toHaveAttribute('tabindex', '-1');
285+
expect(findGroupButton('outer', 1)).toHaveAttribute('tabindex', '-1');
286+
expect(findGroupButton('inner', 0)).toHaveAttribute('tabindex', '0');
287+
expect(findGroupButton('inner', 1)).toHaveAttribute('tabindex', '-1');
288+
});
250289
});

src/internal/single-tab-stop/__tests__/utils.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ const FakeSingleTabStopNavigationProvider = forwardRef(
3737

3838
return (
3939
<SingleTabStopNavigationContext.Provider
40-
value={{ registerFocusable, navigationActive, resetFocusTarget: () => {} }}
40+
value={{ navigationActive, registerFocusable, resetFocusTarget: () => {} }}
4141
>
4242
{children}
4343
</SingleTabStopNavigationContext.Provider>

src/internal/single-tab-stop/index.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import nodeBelongs from '../../dom/node-belongs';
1616

1717
export type FocusableChangeHandler = (isFocusable: boolean) => void;
1818

19-
export const defaultValue: {
19+
const defaultValue: {
2020
navigationActive: boolean;
2121
registerFocusable(focusable: HTMLElement, handler: FocusableChangeHandler): () => void;
2222
resetFocusTarget(): void;
@@ -71,6 +71,12 @@ export interface SingleTabStopNavigationAPI {
7171
isRegistered(element: Element): boolean;
7272
}
7373

74+
export function SingleTabStopNavigationReset({ children }: { children: React.ReactNode }) {
75+
return (
76+
<SingleTabStopNavigationContext.Provider value={defaultValue}>{children}</SingleTabStopNavigationContext.Provider>
77+
);
78+
}
79+
7480
export const SingleTabStopNavigationProvider = forwardRef(
7581
(
7682
{
@@ -158,7 +164,7 @@ export const SingleTabStopNavigationProvider = forwardRef(
158164
const parentContext = useContext(SingleTabStopNavigationContext);
159165
const value = parentContext.navigationActive
160166
? parentContext
161-
: { navigationActive, registerFocusable, updateFocusTarget, resetFocusTarget };
167+
: { navigationReset: false, navigationActive, registerFocusable, updateFocusTarget, resetFocusTarget };
162168

163169
// When contexts switching occurs, it is essential that the now-active one updates the focus target
164170
// to ensure the tab indices are correctly set.

src/internal/testing.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ export { clearOneTimeMetricsCache } from './base-component/metrics/metrics';
55
export { clearMessageCache } from './logging';
66
export { setGlobalFlag } from './global-flags';
77
export { clearVisualRefreshState } from './visual-mode';
8+
export { renderWithSingleTabStopNavigation } from './single-tab-stop/__tests__/utils';

0 commit comments

Comments
 (0)