1
+ <template >
2
+ <div class =" vuemastery-banner-wrapper" role =" banner" v-if =" isVisible" >
3
+ <div
4
+ :class =" { 'show-flash': showFlash }"
5
+ class =" vuemastery-background-dim"
6
+ ref =" vuemastery-banner-flash"
7
+ ></div >
8
+ <a id =" vm-banner" href =" https://www.vuemastery.com/holiday" target =" _blank" >
9
+ <img
10
+ id =" vm-logo-full"
11
+ src =" /vuemastery/vuemastery-white.svg"
12
+ alt =" vuemastery"
13
+ />
14
+ <img
15
+ id =" vm-logo-small"
16
+ src =" https://firebasestorage.googleapis.com/v0/b/vue-mastery.appspot.com/o/flamelink%2Fmedia%2Fvue-mastery-logo-small.png?alt=media&token=941fcc3a-2b6f-40e9-b4c8-56b3890da108"
17
+ alt =" vuemastery"
18
+ />
19
+ <div class =" vm-banner-wrapper" >
20
+ <div class =" vm-banner-content" >
21
+ <h1 class =" vm-banner-title" >Learn Vue with Evan You</h1 >
22
+ <p class =" vm-banner-sub" >Get 60% off a year of Vue courses</p >
23
+ </div >
24
+ <button id =" vm-banner-cta" >Unlock your discount</button >
25
+ </div >
26
+ <button id =" vm-banner-close" @click.prevent =" closeBanner" >
27
+ <span class =" close" >× ; </span >
28
+ </button >
29
+ </a >
30
+ </div >
31
+ </template >
32
+
33
+ <script setup lang="ts">
34
+ import { ref , onMounted } from ' vue'
35
+
36
+ const isVisible = ref (false )
37
+ const showFlash = ref (false )
38
+ const nameStorage = ' VUEMASTERY-BANNER-DECEMBER-2023'
39
+
40
+ const closeBanner = () => {
41
+ // Hide the banner
42
+ isVisible .value = false
43
+ // Save action in the local storage
44
+ localStorage .setItem (nameStorage , String (true ))
45
+ document .documentElement .classList .remove (' vuemastery-menu-fixed' )
46
+ }
47
+
48
+ onMounted (() => {
49
+ isVisible .value = ! localStorage .getItem (nameStorage )
50
+ if (isVisible .value ) {
51
+ document .documentElement .classList .add (' vuemastery-menu-fixed' )
52
+ setTimeout (() => {
53
+ showFlash .value = true
54
+ }, 2000 )
55
+ }
56
+ })
57
+ </script >
58
+ <style scoped>
59
+ .vuemastery-banner-wrapper {
60
+ position : fixed ;
61
+ top : 0 ;
62
+ bottom : 0 ;
63
+ left : 0 ;
64
+ right : 0 ;
65
+ z-index : 61 ;
66
+ width : 100% ;
67
+ height : 100% ;
68
+ max-height : 70px ;
69
+ background : linear-gradient (45deg , #0a2b4e , #835ec2 );
70
+ background-size : 110% ;
71
+ background-position : 50% 50% ;
72
+ overflow : hidden ;
73
+ padding : 12px ;
74
+ margin : 0 ;
75
+ transition : background-size 0.25s cubic-bezier (0.39 , 0.575 , 0.565 , 1 );
76
+ }
77
+
78
+ .vuemastery-banner-wrapper :hover {
79
+ background-size : 100% ;
80
+ }
81
+
82
+ .vuemastery-banner-wrapper :before {
83
+ content : ' ' ;
84
+ background : url (/vuemastery/background-bubbles-vuemastery.svg ) left center
85
+ no-repeat ;
86
+ background-size : cover ;
87
+ position : absolute ;
88
+ top : 0 ;
89
+ bottom : 0 ;
90
+ left : 0 ;
91
+ right : 0 ;
92
+ transition : all 0.3s ease-out 0.1s ;
93
+ transform : scale (1.1 );
94
+ width : 100% ;
95
+ height : 100% ;
96
+ }
97
+ .vuemastery-banner-wrapper :after {
98
+ content : ' ' ;
99
+ background : url (/vuemastery/lock-vuemastery.svg ) right center no-repeat ;
100
+ background-size : auto 100% ;
101
+ position : absolute ;
102
+ width : 100% ;
103
+ height : 100% ;
104
+ top : 0 ;
105
+ left : 0 ;
106
+ pointer-events : none ;
107
+ }
108
+
109
+ .vuemastery-banner-wrapper :hover :after {
110
+ background-image : url (/vuemastery/unlock-vuemastery.svg );
111
+ }
112
+
113
+ #vm-banner {
114
+ position : relative ;
115
+ width : 100% ;
116
+ height : 100% ;
117
+ text-decoration : none ;
118
+ color : white ;
119
+ display : flex ;
120
+ justify-content : center ;
121
+ align-items : center ;
122
+ overflow : hidden ;
123
+ }
124
+
125
+ #vm-logo-full {
126
+ position : absolute ;
127
+ left : 15px ;
128
+ width : 120px ;
129
+ }
130
+
131
+ #vm-logo-small {
132
+ display : none ;
133
+ }
134
+
135
+ .vm-banner-wrapper {
136
+ display : flex ;
137
+ align-items : center ;
138
+ }
139
+
140
+ .vm-banner-content {
141
+ display : flex ;
142
+ }
143
+
144
+ .vm-banner-title {
145
+ margin : 0 ;
146
+ padding : 0 ;
147
+ font-weight : bold ;
148
+ font-size : 24px ;
149
+ text-align : center ;
150
+ background : linear-gradient (145deg , #c3ffac , #86ec87 , #38a56a );
151
+ background-clip : text ;
152
+ -webkit-background-clip : text ;
153
+ -webkit-text-fill-color : transparent ;
154
+ }
155
+
156
+ .vm-banner-sub {
157
+ margin : 0 2em ;
158
+ padding : 0 ;
159
+ font-size : 16px ;
160
+ text-align : center ;
161
+ color : #fff ;
162
+ }
163
+
164
+ #vm-banner-cta {
165
+ position : relative ;
166
+ margin-left : 10px ;
167
+ padding : 10px 24px ;
168
+ background : linear-gradient (to top right , #41b782 , #86d169 );
169
+ border : none ;
170
+ border-radius : 30px ;
171
+ color : #fff ;
172
+ font-size : 12px ;
173
+ font-weight : bold ;
174
+ text-decoration : none ;
175
+ text-transform : uppercase ;
176
+ }
177
+
178
+ #vm-banner-cta :hover {
179
+ background : linear-gradient (to bottom right , #41b782 , #86d169 );
180
+ }
181
+
182
+ #vm-banner-close {
183
+ position : absolute ;
184
+ right : 12px ;
185
+ color : #fff ;
186
+ font-size : 20px ;
187
+ font-weight : bold ;
188
+ display : flex ;
189
+ align-items : center ;
190
+ justify-content : center ;
191
+ }
192
+
193
+ #vm-banner-close > .close {
194
+ font-size : 20px ;
195
+ font-weight : 600 ;
196
+ }
197
+
198
+ @media (max-width : 1200px ) {
199
+ #vm-banner-cta {
200
+ display : none ;
201
+ }
202
+
203
+ .vm-banner-content {
204
+ flex-direction : column ;
205
+ }
206
+
207
+ .vm-banner-sub {
208
+ margin : 0 1em ;
209
+ }
210
+ }
211
+
212
+ @media (max-width : 850px ) {
213
+ .vuemastery-banner-wrapper :after {
214
+ background : none ;
215
+ }
216
+ }
217
+ @media (max-width : 767px ) {
218
+ #vm-logo-full {
219
+ left : 10px ;
220
+ width : 100px ;
221
+ }
222
+ }
223
+ @media (max-width : 767px ) {
224
+ #vm-logo-full {
225
+ display : none ;
226
+ }
227
+ #vm-logo-small {
228
+ position : absolute ;
229
+ display : block ;
230
+ left : 10px ;
231
+ width : 40px ;
232
+ }
233
+ .vm-banner-title {
234
+ font-size : 14px ;
235
+ }
236
+ .vm-banner-sub {
237
+ font-size : 12px ;
238
+ margin : 0 ;
239
+ }
240
+ }
241
+
242
+ .vuemastery-background-dim {
243
+ position : absolute ;
244
+ width : 100% ;
245
+ height : 100% ;
246
+ top : 0 ;
247
+ left : 0 ;
248
+ }
249
+ .vuemastery-background-dim :after {
250
+ content : ' ' ;
251
+ position : absolute ;
252
+ top : 0 ;
253
+ left : -100% ;
254
+ width : 100% ;
255
+ height : 100% ;
256
+ background : linear-gradient (
257
+ 90deg ,
258
+ transparent ,
259
+ rgba (255 , 255 , 255 , 0.4 ),
260
+ transparent
261
+ );
262
+ transition : 0.5s ;
263
+ transition-delay : 0.5s ;
264
+ }
265
+ .vuemastery-background-dim.show-flash :after {
266
+ left : 100% ;
267
+ }
268
+ </style >
269
+
270
+ <style >
271
+ html .vuemastery-menu-fixed {
272
+ --vt-banner-height : 70px ;
273
+ }
274
+ html .vuemastery-menu-fixed .VPNav ,
275
+ html .vuemastery-menu-fixed .VPSidebar {
276
+ top : 70px ;
277
+ }
278
+ html .vuemastery-menu-fixed {
279
+ scroll-padding-top : 134px ;
280
+ overflow : auto ;
281
+ }
282
+ html .vuemastery-menu-fixed {
283
+ margin-top : 72px ;
284
+ }
285
+ @media (max-width : 960px ) {
286
+ html .vuemastery-menu-fixed .VPNav ,
287
+ html .vuemastery-menu-fixed .VPSidebar {
288
+ top : 0 ;
289
+ }
290
+ }
291
+ </style >
0 commit comments