1
1
<script lang="ts" setup>
2
+ import { computed } from ' vue'
3
+ import { useWindowScroll } from ' @vueuse/core'
2
4
import { useSidebar } from ' ../composables/sidebar.js'
3
5
import VPNavBarTitle from ' ./VPNavBarTitle.vue'
4
6
import VPNavBarSearch from ' ./VPNavBarSearch.vue'
@@ -17,11 +19,17 @@ defineEmits<{
17
19
(e : ' toggle-screen' ): void
18
20
}>()
19
21
22
+ const { y } = useWindowScroll ()
20
23
const { hasSidebar } = useSidebar ()
24
+
25
+ const classes = computed (() => ({
26
+ ' has-sidebar' : hasSidebar .value ,
27
+ fill: y .value > 0
28
+ }))
21
29
</script >
22
30
23
31
<template >
24
- <div class =" VPNavBar" :class =" { 'has-sidebar' : hasSidebar } " >
32
+ <div class =" VPNavBar" :class =" classes " >
25
33
<div class =" container" >
26
34
<div class =" title" >
27
35
<VPNavBarTitle >
@@ -32,15 +40,17 @@ const { hasSidebar } = useSidebar()
32
40
33
41
<div class =" content" >
34
42
<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 >
44
54
</div >
45
55
</div >
46
56
</div >
@@ -49,13 +59,18 @@ const { hasSidebar } = useSidebar()
49
59
<style scoped>
50
60
.VPNavBar {
51
61
position : relative ;
52
- border-bottom : 1px solid var ( --vp-c-gutter ) ;
62
+ border-bottom : 1px solid transparent ;
53
63
padding : 0 8px 0 24px ;
54
64
height : var (--vp-nav-height );
55
65
transition : border-color 0.5s , background-color 0.5s ;
56
66
pointer-events : none ;
57
67
}
58
68
69
+ .VPNavBar.has-sidebar ,
70
+ .VPNavBar.fill {
71
+ border-bottom-color : var (--vp-c-gutter );
72
+ }
73
+
59
74
@media (min-width : 768px ) {
60
75
.VPNavBar {
61
76
padding : 0 32px ;
@@ -78,6 +93,10 @@ const { hasSidebar } = useSidebar()
78
93
pointer-events : none ;
79
94
}
80
95
96
+ .container :deep(* ) {
97
+ pointer-events : auto ;
98
+ }
99
+
81
100
@media (min-width : 960px ) {
82
101
.VPNavBar.has-sidebar .container {
83
102
max-width : 100% ;
@@ -86,6 +105,12 @@ const { hasSidebar } = useSidebar()
86
105
87
106
.title {
88
107
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 );
89
114
}
90
115
91
116
@media (min-width : 960px ) {
@@ -97,7 +122,7 @@ const { hasSidebar } = useSidebar()
97
122
padding : 0 32px ;
98
123
width : var (--vp-sidebar-width );
99
124
height : var (--vp-nav-height );
100
- background-color : var ( --vp-c-bg-alt ) ;
125
+ background-color : transparent ;
101
126
}
102
127
}
103
128
@@ -108,14 +133,7 @@ const { hasSidebar } = useSidebar()
108
133
}
109
134
}
110
135
111
- .container :deep(* ) {
112
- pointer-events : auto ;
113
- }
114
-
115
136
.content {
116
- display : flex ;
117
- justify-content : flex-end ;
118
- align-items : center ;
119
137
flex-grow : 1 ;
120
138
}
121
139
@@ -135,6 +153,25 @@ const { hasSidebar } = useSidebar()
135
153
}
136
154
}
137
155
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
+
138
175
.menu + .translations ::before ,
139
176
.menu + .appearance ::before ,
140
177
.menu + .social-links ::before ,
@@ -165,7 +202,7 @@ const { hasSidebar } = useSidebar()
165
202
.VPNavBar.has-sidebar .curtain {
166
203
position : absolute ;
167
204
right : 0 ;
168
- bottom : -32 px ;
205
+ bottom : -31 px ;
169
206
width : calc (100% - var (--vp-sidebar-width ));
170
207
height : 32px ;
171
208
}
0 commit comments