-
Notifications
You must be signed in to change notification settings - Fork 16
/
app.vue
88 lines (72 loc) · 1.99 KB
/
app.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<script setup>
const route = useRoute();
const { $smoothScroll } = useNuxtApp();
const { gsap } = useGsap();
const { base } = useRuntimeConfig().public;
const overlay = shallowRef({});
const projectSlug = computed(() => route.params.slug ?? '');
const currentURL = computed(() =>
projectSlug.value ? `${base}/project/${projectSlug.value}` : base,
);
const ogImageUrl = computed(() =>
projectSlug.value
? `${base}/img/${projectSlug.value}-logo.webp`
: `${base}/logo.png`,
);
function setVh() {
const windowHeight = window.innerHeight;
gsap.set(document.documentElement, { '--vh': `${windowHeight / 100}px` });
}
function showFlagStripes() {
gsap.from('.flag-stripe__line', {
xPercent: -25,
stagger: 0.125,
ease: 'expo.out',
duration: 1.5,
delay: route.name === 'index' ? 3 : 1,
});
}
useHead({
meta: [
{ property: 'url', name: 'url', content: () => currentURL.value },
{ property: 'og:url', name: 'og:url', content: () => currentURL.value },
{ property: 'og:image', name: 'og:image', content: () => ogImageUrl.value },
],
link: [{ rel: 'canonical', href: () => currentURL.value }],
});
onMounted(() => {
setVh();
showFlagStripes();
if (route.name !== 'index') {
$smoothScroll.disable();
const pageEl = document.querySelector('div[page-content]');
overlay.value.enterPageAnim(pageEl, () => null);
}
const unregister = on(window, 'resize', setVh);
setTimeout(
() => import('~/lib/greeting').then((module) => module.logGreeting()),
250,
);
onBeforeUnmount(() => {
unregister();
});
});
</script>
<template>
<VNavbar />
<UkraineFlagStripe />
<Transition
:css="false"
mode="out-in"
@enter="overlay.enterPageAnim"
@leave="overlay.leavePageAnim"
>
<!-- NOTE: use of $route instead of just route is really important for good animation -->
<div page-content :key="$route.fullPath">
<NuxtPage />
</div>
</Transition>
<VPointer />
<VLoader />
<VOverlay ref="overlay" />
</template>