1
1
<script setup lang="ts">
2
- import { Transition } from ' vue' ;
3
- import { RouterView } from ' vue-router' ;
2
+ import { NDrawer , NDrawerContent } from ' naive-ui' ;
3
+ import { ref , Transition , watch } from ' vue' ;
4
+ import { RouterView , useRouter } from ' vue-router' ;
4
5
5
6
import { NavbarComponent } from ' ~/components/common' ;
6
7
import GridBackground from ' ~/components/common/background/GridBackground.vue' ;
7
8
import PageLoading from ' ~/components/common/loading/PageLoading.vue' ;
9
+ import DrawerHeader from ' ~/components/views/drawer/DrawerHeader.vue' ;
8
10
import { useAuthSettingsStoreRefs } from ' ~/stores/settings/auth.store' ;
9
11
10
12
const { isAuthenticated } = useAuthSettingsStoreRefs ();
13
+ const { currentRoute, push } = useRouter ();
14
+
15
+ const origin = ref ();
16
+ const drawer = ref (false );
17
+
18
+ watch (
19
+ currentRoute ,
20
+ (_next , _prev ) => {
21
+ const isDrawer = !! _next .meta ?.drawer ;
22
+ drawer .value = isDrawer ;
23
+ origin .value = isDrawer ? _prev : undefined ;
24
+ },
25
+ {
26
+ immediate: true ,
27
+ },
28
+ );
29
+
30
+ const asideRef = ref ();
31
+
32
+ const onClose = () => {
33
+ if (! origin .value ) return ;
34
+ push (origin .value );
35
+ origin .value = undefined ;
36
+ };
11
37
</script >
12
38
13
39
<template >
14
- <header >
15
- <RouterView v-slot =" { Component, route }" name =" navbar" >
40
+ <header :class = " { open: drawer } " >
41
+ <RouterView v-slot =" { Component }" name =" navbar" >
16
42
<NavbarComponent v-if =" isAuthenticated" >
17
43
<template v-if =" Component " #drawer =" { parentElement } " >
18
44
<Transition name =" scale" mode =" out-in" >
19
45
<KeepAlive >
20
- <component
21
- :is =" Component"
22
- :key =" route.path"
23
- :parent-element =" parentElement"
24
- />
46
+ <component :is =" Component" :parent-element =" parentElement" />
25
47
</KeepAlive >
26
48
</Transition >
27
49
</template >
28
50
</NavbarComponent >
29
51
</RouterView >
30
52
</header >
31
- <main >
32
- <RouterView v-slot = " { Component, route } " >
53
+ <RouterView v-slot = " { Component } " >
54
+ <main ref = " asideRef " style = " position : relative " >
33
55
<GridBackground v-if =" !Component" :size =" 20" />
34
56
<Transition name =" scale" mode =" out-in" >
35
57
<KeepAlive >
36
- <component :is =" Component ?? PageLoading" :key = " route.path " />
58
+ <component :is =" Component ?? PageLoading" />
37
59
</KeepAlive >
38
60
</Transition >
39
- </RouterView >
40
- </main >
61
+ </main >
62
+ <aside >
63
+ <RouterView v-slot =" { Component: DrawerComponent }" >
64
+ <NDrawer
65
+ v-model:show =" drawer"
66
+ :to =" asideRef"
67
+ width =" 100%"
68
+ close-on-esc
69
+ :on-after-leave =" onClose"
70
+ auto-focus
71
+ >
72
+ <NDrawerContent closable >
73
+ <template #header > <DrawerHeader /> </template >
74
+ <template #default >
75
+ <KeepAlive >
76
+ <component :is =" DrawerComponent" />
77
+ </KeepAlive >
78
+ </template >
79
+ </NDrawerContent >
80
+ </NDrawer >
81
+ </RouterView >
82
+ </aside >
83
+ </RouterView >
41
84
</template >
42
85
43
86
<style lang="scss" scoped>
@@ -60,6 +103,10 @@ header {
60
103
> :first-child {
61
104
@include mixin .hover-background ;
62
105
}
106
+
107
+ & .open > :first-child {
108
+ background : var (--bg-color-hover );
109
+ }
63
110
}
64
111
65
112
main {
0 commit comments