Skip to content

Commit 070fc0a

Browse files
authored
feat(theme): use inert to avoid traverse menus and content with keyboard (#2932)
1 parent c0ce7f7 commit 070fc0a

File tree

3 files changed

+22
-17
lines changed

3 files changed

+22
-17
lines changed

src/client/theme-default/Layout.vue

+10-7
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,16 @@ import VPNav from './components/VPNav.vue'
99
import VPSidebar from './components/VPSidebar.vue'
1010
import VPSkipLink from './components/VPSkipLink.vue'
1111
import { useData } from './composables/data'
12+
import { useNav } from './composables/nav'
1213
import { useCloseSidebarOnEscape, useSidebar } from './composables/sidebar'
1314
1415
const {
1516
isOpen: isSidebarOpen,
1617
open: openSidebar,
17-
close: closeSidebar
18+
close: closeSidebar,
19+
isSidebarEnabled,
1820
} = useSidebar()
21+
const { isScreenOpen } = useNav()
1922
2023
const route = useRoute()
2124
watch(() => route.path, closeSidebar)
@@ -33,24 +36,24 @@ provide('hero-image-slot-exists', heroImageSlotExists)
3336
<template>
3437
<div v-if="frontmatter.layout !== false" class="Layout" :class="frontmatter.pageClass" >
3538
<slot name="layout-top" />
36-
<VPSkipLink />
39+
<VPSkipLink :inert="isSidebarOpen || isScreenOpen" />
3740
<VPBackdrop class="backdrop" :show="isSidebarOpen" @click="closeSidebar" />
38-
<VPNav v-if="frontmatter.navbar !== false">
41+
<VPNav v-if="frontmatter.navbar !== false" :inert="isSidebarOpen">
3942
<template #nav-bar-title-before><slot name="nav-bar-title-before" /></template>
4043
<template #nav-bar-title-after><slot name="nav-bar-title-after" /></template>
4144
<template #nav-bar-content-before><slot name="nav-bar-content-before" /></template>
4245
<template #nav-bar-content-after><slot name="nav-bar-content-after" /></template>
4346
<template #nav-screen-content-before><slot name="nav-screen-content-before" /></template>
4447
<template #nav-screen-content-after><slot name="nav-screen-content-after" /></template>
4548
</VPNav>
46-
<VPLocalNav :open="isSidebarOpen" @open-menu="openSidebar" />
49+
<VPLocalNav :inert="isSidebarOpen || isScreenOpen" :open="isSidebarOpen" @open-menu="openSidebar" />
4750

48-
<VPSidebar :open="isSidebarOpen">
51+
<VPSidebar :inert="!isSidebarEnabled && (!isSidebarOpen || isScreenOpen)" :open="isSidebarOpen">
4952
<template #sidebar-nav-before><slot name="sidebar-nav-before" /></template>
5053
<template #sidebar-nav-after><slot name="sidebar-nav-after" /></template>
5154
</VPSidebar>
5255

53-
<VPContent>
56+
<VPContent :inert="isSidebarOpen || isScreenOpen">
5457
<template #page-top><slot name="page-top" /></template>
5558
<template #page-bottom><slot name="page-bottom" /></template>
5659

@@ -76,7 +79,7 @@ provide('hero-image-slot-exists', heroImageSlotExists)
7679
<template #aside-ads-after><slot name="aside-ads-after" /></template>
7780
</VPContent>
7881

79-
<VPFooter />
82+
<VPFooter :inert="isSidebarOpen || isScreenOpen" />
8083
<slot name="layout-bottom" />
8184
</div>
8285
<Content v-else />

src/client/theme-default/components/VPSkipLink.vue

+10-8
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,16 @@ function focusOnTargetAnchor({ target }: Event) {
2727
</script>
2828

2929
<template>
30-
<span ref="backToTop" tabindex="-1" />
31-
<a
32-
href="#VPContent"
33-
class="VPSkipLink visually-hidden"
34-
@click="focusOnTargetAnchor"
35-
>
36-
Skip to content
37-
</a>
30+
<div>
31+
<span ref="backToTop" tabindex="-1" />
32+
<a
33+
href="#VPContent"
34+
class="VPSkipLink visually-hidden"
35+
@click="focusOnTargetAnchor"
36+
>
37+
Skip to content
38+
</a>
39+
</div>
3840
</template>
3941

4042
<style scoped>

src/client/theme-default/composables/nav.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { ref, watch } from 'vue'
22
import { useRoute } from 'vitepress'
33

4-
export function useNav() {
5-
const isScreenOpen = ref(false)
4+
const isScreenOpen = ref(false)
65

6+
export function useNav() {
77
function openScreen() {
88
isScreenOpen.value = true
99
window.addEventListener('resize', closeScreenOnTabletWindow)

0 commit comments

Comments
 (0)