1
1
<template >
2
- <div class =" body" v-bind :style =" {'height': appHeight + 'px'}" >
3
- <div class =" side-nav" v-bind :[navExpandedAttr] =" ''" >
4
- <div class =" logo" v-on:click =" triggerNavExpand " >
2
+ <div class =" body" :style =" {'height': appHeight + 'px'}" >
3
+ <div class =" side-nav" :class = " navExpandedAni ?'-side-nav-expand' :'-side-nav-expand-reverse' " :[navExpandedAttr] =" ''" >
4
+ <div class =" logo" v-on:click =" toggleNavExpand " >
5
5
<img alt =" Vue logo" src =" @/assets/logo.svg" width =" 100" height =" 100" />
6
6
</div >
7
7
<nav >
8
- <RouterLink to =" /" >
9
- < span class = " nav-text " >Index</ span >
10
- </ RouterLink >
11
- <RouterLink to =" /about " >
12
- <span class = " nav-text " >About</ span >
13
- </RouterLink >
8
+ <RouterLink to =" /" >Index</ RouterLink >
9
+ < div v-for = " item in accounts " >
10
+ < span class = ' nav-account ' >{{item.email}}</ span >
11
+ <RouterLink : to =" `/${item.email}/` " >All</ RouterLink >
12
+ <RouterLink v-for = " box in item.boxes " :to = " `/${item.email}/${box}` " >{{box}}</ RouterLink >
13
+ </div >
14
14
</nav >
15
15
</div >
16
16
<div class =" content" >
19
19
</div >
20
20
</template >
21
21
22
- <script >
22
+ <script setup>
23
+ import { ref , computed } from ' vue'
23
24
import { RouterLink , RouterView } from ' vue-router'
24
- export default {
25
- data (){
26
- return {
27
- navExpanded: true ,
28
- }
29
- },
30
- computed: {
31
- appHeight: {
32
- get (){
33
- return window .innerHeight ;
34
- }
35
- },
36
- navExpandedAttr: {
37
- get (){
38
- return this .navExpanded ? ' expanded-nav' : null ;
39
- }
40
- }
41
- },
42
- methods: {
43
- triggerNavExpand (){
44
- this .navExpanded = ! this .navExpanded ;
45
- }
46
- },
47
- components: {
48
- RouterLink,
49
- RouterView
25
+
26
+ const navExpanded = ref (true )
27
+ const navExpandedAni = ref (true )
28
+
29
+ const accounts = ref ([
30
+ {' email' : ' user@example.com' , ' boxes' : [' Inbox' , ' Sent' , ' Junk' , ' Trash' ]},
31
+ ])
32
+
33
+ const appHeight = computed (()=> window .innerHeight )
34
+ const navExpandedAttr = computed (()=> navExpanded .value ? ' expanded-nav' : null )
35
+
36
+ var toggleNavExpanding = false ;
37
+ function toggleNavExpand (){
38
+ if (toggleNavExpanding){
39
+ return ;
50
40
}
41
+ toggleNavExpanding = true ;
42
+ navExpandedAni .value = ! navExpandedAni .value ;
43
+ setTimeout (()=> {
44
+ navExpanded .value = navExpandedAni .value ;
45
+ toggleNavExpanding = false ;
46
+ }, 350 );
51
47
}
48
+
52
49
</script >
53
50
54
51
<style scoped>
@@ -58,27 +55,54 @@ export default {
58
55
}
59
56
60
57
.side-nav {
61
- width : 3 rem ;
58
+ width : 3.8 rem ;
62
59
padding : 0.5rem 0 ;
63
60
margin-right : 1rem ;
64
- box-shadow : 1px ;
65
61
display : flex ;
66
62
flex-direction : column ;
67
63
align-items : flex-start ;
64
+ overflow : hidden ;
65
+ border-right : 1px solid var (--color-border );
68
66
}
69
67
70
68
.side-nav [expanded-nav ] {
71
- /* width: fit-content;*/
72
- width : 12rem ;
73
- box-shadow : #000 0px 0px 20px 0px ;
69
+ width : 15rem ;
70
+ }
71
+
72
+ .-side-nav-expand {
73
+ animation : -side-nav-expand 0.5s ease-out ;
74
+ }
75
+
76
+ .-side-nav-expand-reverse {
77
+ animation : -side-nav-expand-reverse 0.4s ;
78
+ }
79
+
80
+ @keyframes -side-nav-expand {
81
+ from {
82
+ width : 3.8rem ;
83
+ }
84
+ to {
85
+ width : 15rem ;
86
+ }
74
87
}
75
88
76
- .logo {
89
+ @keyframes -side-nav-expand-reverse {
90
+ from {
91
+ width : 15rem ;
92
+ }
93
+ to {
94
+ width : 3.8rem ;
95
+ }
96
+ }
97
+
98
+
99
+ .side-nav .logo {
77
100
box-sizing : content-box ;
78
101
display : block ;
79
102
width : 2rem ;
80
103
height : 2rem ;
81
- padding : 0.5rem 0.7rem 0.5rem 0.8rem ;
104
+ padding : 0.5rem 0.7rem 0.5rem calc (100% - 3rem );
105
+ margin-right : 0.2rem ;
82
106
border : 1px solid var (--color-border );
83
107
border-left : none ;
84
108
border-radius : 0 1.5rem 1.5rem 0 ;
@@ -97,30 +121,36 @@ export default {
97
121
flex-direction : column ;
98
122
}
99
123
124
+ .nav-account {
125
+ display : block ;
126
+ height : 1.7rem ;
127
+ padding : 0 0.6rem ;
128
+ font-size : 1rem ;
129
+ font-weight : 300 ;
130
+ overflow-x : hidden ;
131
+ text-overflow : ellipsis ;
132
+ }
133
+
100
134
.side-nav nav a {
101
135
display : block ;
102
136
height : 1.7rem ;
103
137
padding : 0 0.5rem ;
104
- margin-left : 0.75 rem ;
138
+ margin-left : 0.5 rem ;
105
139
border-left : 1px solid var (--color-border );
106
- }
107
-
108
- .side-nav nav .nav-text {
109
- font-size : 1.1rem ;
110
- font-weight : 700 ;
111
- }
112
-
113
- .side-nav :not ([expanded-nav ]) nav .nav-text {
114
- display : none ;
140
+ display : block ;
141
+ font-size : 1rem ;
142
+ font-weight : 450 ;
143
+ overflow-x : hidden ;
144
+ text-overflow : ellipsis ;
145
+ text-decoration : none ;
146
+ color : var (--color-text );
147
+ transition : 0.4s ;
115
148
}
116
149
117
150
.side-nav nav a .router-link-exact-active {
118
151
padding-left : 0.7rem ;
119
- }
120
-
121
- .side-nav nav a .router-link-exact-active .nav-text {
122
- color : var (--color-text );
123
- font-weight : 900 ;
152
+ color : hsla (160 , 100% , 37% , 1 );
153
+ font-weight : 600 ;
124
154
}
125
155
126
156
.side-nav nav a .router-link-exact-active :hover {
0 commit comments