Skip to content

Commit ab3cb93

Browse files
authored
Add Vue mastery Promotion Banner (#701)
1 parent 1e772b3 commit ab3cb93

File tree

8 files changed

+389
-3
lines changed

8 files changed

+389
-3
lines changed
Loading
Loading
Lines changed: 22 additions & 0 deletions
Loading
Loading
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<template>
2+
<div id="vm-banner" class="vuemastery-banner hide" role="banner">
3+
<div class="vuemastery-planet"></div>
4+
<a class="vuemastery-banner--link" href="https://www.vuemastery.com/black-friday-2020" target="_blank">
5+
<img class="vuemastery-banner--logo" src="/images/vuemastery/logo-vuemastery.svg" alt="vuemastery" />
6+
<div class="vuemastery-banner--wrapper">
7+
<p><span>Vue Mastery's Black Friday Sale:</span>Save 50% off a year of Vue courses</p>
8+
<button class="vuemastery-button">Get discount</button>
9+
</div>
10+
</a>
11+
<div @click.prevent="$emit('close-banner')" class="vuemastery-banner--close"></div>
12+
</div>
13+
</template>
14+
15+
<script>
16+
export default {
17+
18+
}
19+
</script>

src/.vuepress/theme/layouts/Layout.vue

Lines changed: 67 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
@touchstart="onTouchStart"
66
@touchend="onTouchEnd"
77
>
8+
<VueMasteryBanner v-if="isBannerOpen" @close-banner="closeBanner" ref='vueMasteryBanner'/>
89
<Navbar v-if="shouldShowNavbar" @toggle-sidebar="toggleSidebar" />
910

1011
<div class="sidebar-mask" @click="toggleSidebar(false)" />
@@ -36,6 +37,7 @@ import Home from '@theme/components/Home.vue'
3637
import Navbar from '@theme/components/Navbar.vue'
3738
import Page from '@theme/components/Page.vue'
3839
import Sidebar from '@theme/components/Sidebar.vue'
40+
import VueMasteryBanner from '@theme/components/sponsors/VueMasteryBanner.vue'
3941
import { resolveSidebarItems } from '../util'
4042
4143
export default {
@@ -45,12 +47,17 @@ export default {
4547
Home,
4648
Page,
4749
Sidebar,
48-
Navbar
50+
Navbar,
51+
VueMasteryBanner
4952
},
5053
5154
data () {
5255
return {
53-
isSidebarOpen: false
56+
isSidebarOpen: false,
57+
isBannerOpen: true,
58+
isMenuFixed: false,
59+
nameStorage: 'vuemastery-black-firday-2020-banner',
60+
menuPosition: 0
5461
}
5562
},
5663
@@ -94,7 +101,9 @@ export default {
94101
{
95102
'no-navbar': !this.shouldShowNavbar,
96103
'sidebar-open': this.isSidebarOpen,
97-
'no-sidebar': !this.shouldShowSidebar
104+
'no-sidebar': !this.shouldShowSidebar,
105+
'vuemastery-menu-fixed': this.isMenuFixed,
106+
'vuemastery-promo': this.isBannerOpen
98107
},
99108
userPageClass
100109
]
@@ -105,6 +114,13 @@ export default {
105114
this.$router.afterEach(() => {
106115
this.isSidebarOpen = false
107116
})
117+
118+
// Load component according to user preferences
119+
if (!localStorage.getItem(this.nameStorage)) {
120+
this.initBanner()
121+
} else {
122+
this.isBannerOpen = false
123+
}
108124
},
109125
110126
methods: {
@@ -131,6 +147,54 @@ export default {
131147
this.toggleSidebar(false)
132148
}
133149
}
150+
},
151+
152+
// Vue Mastery Banner
153+
initBanner() {
154+
// Add event listeners
155+
this.toggleBannerEvents(true)
156+
// Add class to the body to push fixed elements
157+
this.isBannerOpen = true
158+
// Get the menu position
159+
this.getMenuPosition()
160+
// Check current page offset position
161+
this.isMenuFixed = this.isUnderBanner()
162+
},
163+
164+
closeBanner (e) {
165+
// Remove events
166+
this.toggleBannerEvents(false)
167+
// Hide the banner
168+
this.isBannerOpen = false
169+
// Save action in the local storage
170+
localStorage.setItem(this.nameStorage, true)
171+
},
172+
173+
getMenuPosition() {
174+
this.menuPosition = this.$refs.vueMasteryBanner.$el.clientHeight
175+
},
176+
177+
isUnderBanner() {
178+
return window.pageYOffset > this.menuPosition
179+
},
180+
181+
fixMenuAfterBanner() {
182+
if (this.isUnderBanner()) {
183+
if (!this.isMenuFixed) {
184+
// The menu will be fixed
185+
this.isMenuFixed = true
186+
}
187+
} else if (this.isMenuFixed) {
188+
// The menu stay under the banner
189+
this.isMenuFixed = false
190+
}
191+
},
192+
193+
toggleBannerEvents(on) {
194+
// Add or remove event listerners attached to the DOM
195+
let method = on ? "addEventListener" : "removeEventListener"
196+
window[method]("resize", this.getMenuPosition)
197+
window[method]("scroll", this.fixMenuAfterBanner)
134198
}
135199
}
136200
}

src/.vuepress/theme/styles/index.styl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
@require './arrow'
55
@require './wrapper'
66
@require './toc'
7+
@require './vuemastery-banner'
78

89
html, body
910
padding 0

0 commit comments

Comments
 (0)