Skip to content

Commit bd36224

Browse files
committed
fix(theme): sidebar scrollbar is cropped by nav bar
1 parent 48f0b01 commit bd36224

File tree

3 files changed

+75
-41
lines changed

3 files changed

+75
-41
lines changed

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

+2-21
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,16 @@
11
<script setup lang="ts">
2-
import { computed, provide } from 'vue'
3-
import { useWindowScroll } from '@vueuse/core'
2+
import { provide } from 'vue'
43
import { useNav } from '../composables/nav.js'
5-
import { useSidebar } from '../composables/sidebar.js'
64
import VPNavBar from './VPNavBar.vue'
75
import VPNavScreen from './VPNavScreen.vue'
86
9-
const { y } = useWindowScroll()
10-
117
const { isScreenOpen, closeScreen, toggleScreen } = useNav()
12-
const { hasSidebar } = useSidebar()
138
149
provide('close-screen', closeScreen)
15-
16-
const classes = computed(() => ({
17-
'no-sidebar': !hasSidebar.value,
18-
'fill-bg': y.value > 0
19-
}))
2010
</script>
2111

2212
<template>
23-
<header class="VPNav" :class="classes">
13+
<header class="VPNav">
2414
<VPNavBar :is-screen-open="isScreenOpen" @toggle-screen="toggleScreen">
2515
<template #nav-bar-title-before><slot name="nav-bar-title-before" /></template>
2616
<template #nav-bar-title-after><slot name="nav-bar-title-after" /></template>
@@ -42,19 +32,10 @@ const classes = computed(() => ({
4232
left: 0;
4333
z-index: var(--vp-z-index-nav);
4434
width: 100%;
45-
background-color: var(--vp-nav-bg-color);
4635
pointer-events: none;
4736
transition: background-color 0.5s;
4837
}
4938
50-
.VPNav.no-sidebar {
51-
background-color: transparent;
52-
}
53-
54-
.VPNav.fill-bg {
55-
background-color: var(--vp-nav-bg-color);
56-
}
57-
5839
@media (min-width: 960px) {
5940
.VPNav {
6041
position: fixed;

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

+57-20
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
<script lang="ts" setup>
2+
import { computed } from 'vue'
3+
import { useWindowScroll } from '@vueuse/core'
24
import { useSidebar } from '../composables/sidebar.js'
35
import VPNavBarTitle from './VPNavBarTitle.vue'
46
import VPNavBarSearch from './VPNavBarSearch.vue'
@@ -17,11 +19,17 @@ defineEmits<{
1719
(e: 'toggle-screen'): void
1820
}>()
1921
22+
const { y } = useWindowScroll()
2023
const { hasSidebar } = useSidebar()
24+
25+
const classes = computed(() => ({
26+
'has-sidebar': hasSidebar.value,
27+
fill: y.value > 0
28+
}))
2129
</script>
2230

2331
<template>
24-
<div class="VPNavBar" :class="{ 'has-sidebar' : hasSidebar }">
32+
<div class="VPNavBar" :class="classes">
2533
<div class="container">
2634
<div class="title">
2735
<VPNavBarTitle>
@@ -32,15 +40,17 @@ const { hasSidebar } = useSidebar()
3240

3341
<div class="content">
3442
<div class="curtain" />
35-
<slot name="nav-bar-content-before" />
36-
<VPNavBarSearch class="search" />
37-
<VPNavBarMenu class="menu" />
38-
<VPNavBarTranslations class="translations" />
39-
<VPNavBarAppearance class="appearance" />
40-
<VPNavBarSocialLinks class="social-links" />
41-
<VPNavBarExtra class="extra" />
42-
<slot name="nav-bar-content-after" />
43-
<VPNavBarHamburger class="hamburger" :active="isScreenOpen" @click="$emit('toggle-screen')" />
43+
<div class="content-body">
44+
<slot name="nav-bar-content-before" />
45+
<VPNavBarSearch class="search" />
46+
<VPNavBarMenu class="menu" />
47+
<VPNavBarTranslations class="translations" />
48+
<VPNavBarAppearance class="appearance" />
49+
<VPNavBarSocialLinks class="social-links" />
50+
<VPNavBarExtra class="extra" />
51+
<slot name="nav-bar-content-after" />
52+
<VPNavBarHamburger class="hamburger" :active="isScreenOpen" @click="$emit('toggle-screen')" />
53+
</div>
4454
</div>
4555
</div>
4656
</div>
@@ -49,13 +59,18 @@ const { hasSidebar } = useSidebar()
4959
<style scoped>
5060
.VPNavBar {
5161
position: relative;
52-
border-bottom: 1px solid var(--vp-c-gutter);
62+
border-bottom: 1px solid transparent;
5363
padding: 0 8px 0 24px;
5464
height: var(--vp-nav-height);
5565
transition: border-color 0.5s, background-color 0.5s;
5666
pointer-events: none;
5767
}
5868
69+
.VPNavBar.has-sidebar,
70+
.VPNavBar.fill {
71+
border-bottom-color: var(--vp-c-gutter);
72+
}
73+
5974
@media (min-width: 768px) {
6075
.VPNavBar {
6176
padding: 0 32px;
@@ -78,6 +93,10 @@ const { hasSidebar } = useSidebar()
7893
pointer-events: none;
7994
}
8095
96+
.container :deep(*) {
97+
pointer-events: auto;
98+
}
99+
81100
@media (min-width: 960px) {
82101
.VPNavBar.has-sidebar .container {
83102
max-width: 100%;
@@ -86,6 +105,12 @@ const { hasSidebar } = useSidebar()
86105
87106
.title {
88107
flex-shrink: 0;
108+
height: calc(var(--vp-nav-height) - 1px);
109+
transition: background-color 0.5s;
110+
}
111+
112+
.VPNavBar.fill .title {
113+
background-color: var(--vp-nav-bg-color);
89114
}
90115
91116
@media (min-width: 960px) {
@@ -97,7 +122,7 @@ const { hasSidebar } = useSidebar()
97122
padding: 0 32px;
98123
width: var(--vp-sidebar-width);
99124
height: var(--vp-nav-height);
100-
background-color: var(--vp-c-bg-alt);
125+
background-color: transparent;
101126
}
102127
}
103128
@@ -108,14 +133,7 @@ const { hasSidebar } = useSidebar()
108133
}
109134
}
110135
111-
.container :deep(*) {
112-
pointer-events: auto;
113-
}
114-
115136
.content {
116-
display: flex;
117-
justify-content: flex-end;
118-
align-items: center;
119137
flex-grow: 1;
120138
}
121139
@@ -135,6 +153,25 @@ const { hasSidebar } = useSidebar()
135153
}
136154
}
137155
156+
.content-body {
157+
display: flex;
158+
justify-content: flex-end;
159+
align-items: center;
160+
height: calc(var(--vp-nav-height) - 1px);
161+
transition: background-color 0.5s;
162+
}
163+
164+
.VPNavBar.fill .content-body {
165+
background-color: var(--vp-nav-bg-color);
166+
}
167+
168+
@media (min-width: 960px) {
169+
.VPNavBar.has-sidebar .content-body {
170+
position: relative;
171+
background-color: var(--vp-nav-bg-color);
172+
}
173+
}
174+
138175
.menu + .translations::before,
139176
.menu + .appearance::before,
140177
.menu + .social-links::before,
@@ -165,7 +202,7 @@ const { hasSidebar } = useSidebar()
165202
.VPNavBar.has-sidebar .curtain {
166203
position: absolute;
167204
right: 0;
168-
bottom: -32px;
205+
bottom: -31px;
169206
width: calc(100% - var(--vp-sidebar-width));
170207
height: 32px;
171208
}

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

+16
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ watchPostEffect(async () => {
3939
ref="navEl"
4040
@click.stop
4141
>
42+
<div class="curtain" />
43+
4244
<nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1">
4345
<span class="visually-hidden" id="sidebar-aria-label">
4446
Sidebar Navigation
@@ -113,6 +115,20 @@ watchPostEffect(async () => {
113115
}
114116
}
115117
118+
@media (min-width: 960px) {
119+
.curtain {
120+
position: sticky;
121+
top: -64px;
122+
left: 0;
123+
z-index: 1;
124+
margin-top: calc(var(--vp-nav-height) * -1);
125+
margin-right: -32px;
126+
margin-left: -32px;
127+
height: var(--vp-nav-height);
128+
background-color: var(--vp-sidebar-bg-color);
129+
}
130+
}
131+
116132
.nav {
117133
outline: 0;
118134
}

0 commit comments

Comments
 (0)