Files
vaquant/src/App.vue
Julien Calixte 9d9ab393d9 🎨 (App) fullheight
2019-11-23 10:48:17 +01:00

166 lines
3.9 KiB
Vue

<template>
<div id="app" class="app">
<nav
class="nav navbar is-fixed-top is-primary"
role="navigation"
aria-label="main navigation"
:class="{ shadow }"
v-click-outside="hideMenu"
>
<div class="navbar-brand">
<router-link class="navbar-item" to="/">
<img src="./assets/vaquant-root-white.png" title="vaquant" />
<online-view class="online-view">
<div slot="offline">
<img
class="icon"
src="./assets/icons/baseline_cloud_off_white_48dp.png"
alt="offline"
/>
</div>
</online-view>
</router-link>
<span class="vaquant-title" :class="{ visible: shadow }">{{
title
}}</span>
<div
class="navbar-burger burger"
data-target="navbar-main"
@click="toggleMenu"
:class="{ 'is-active': menuOpen }"
>
<span></span>
<span></span>
<span></span>
</div>
</div>
<div
id="navbar-main"
class="navbar-menu"
:class="{ 'is-active': menuOpen }"
@click="hideMenu"
>
<div class="navbar-end">
<install-app />
<router-link
class="navbar-item"
:to="{ name: 'about' }"
v-t="'title.about'"
></router-link>
<!-- <router-link class="navbar-item" :to="{ name: 'pricing' }" v-t="'title.pricing'"></router-link> -->
<a class="navbar-item" target="_blank" rel="noreferrer" :href="coffee"
>Supportez Vaquant avec un !</a
>
<router-link class="navbar-item" :to="{ name: 'user' }">{{
username ? username : $t('user.loginsignup')
}}</router-link>
</div>
</div>
</nav>
<main id="main">
<transition name="fade" mode="out-in">
<router-view />
</transition>
</main>
</div>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
import { throttle } from 'lodash-es'
import ClickOutside from 'vue-click-outside'
import { Action, Getter } from 'vuex-class'
import IUser from '@/models/IUser'
import { COFFEE_LINK } from '@/utils/constants'
import OnlineView from '@/components/OnlineView.vue'
@Component({
directives: {
ClickOutside
},
components: {
'online-view': OnlineView
}
})
export default class App extends Vue {
@Getter
public user!: IUser | null
@Getter
public username!: string
@Getter
public title!: string | null
public menuOpen: boolean = false
public transitionName: string = ''
public shadow: boolean = false
public coffee: string = COFFEE_LINK
public mounted(): void {
const main = document.getElementById('main')
if (main) {
this.shadow = main.getBoundingClientRect().top < 0
document.addEventListener(
'scroll',
throttle((evt) => {
this.shadow = main.getBoundingClientRect().top < 0
}, 150)
)
}
}
public toggleMenu(): void {
this.menuOpen = !this.menuOpen
}
public hideMenu(): void {
this.menuOpen = false
}
}
</script>
<style lang="scss">
$icon_size: 18px;
$margin: 0.75rem;
.navbar {
color: red;
.vaquant-title {
opacity: 0;
line-height: 52px;
transition: opacity 0.25s ease-out;
&.visible {
opacity: 1;
}
}
.online-view {
position: absolute;
bottom: 7px;
right: $icon_size;
width: $icon_size;
height: auto;
}
&::before {
content: '';
position: absolute;
right: 0;
bottom: -5px;
left: 0;
width: 100%;
height: 5px;
transition: opacity 0.25s ease-out;
pointer-events: none;
opacity: 0;
box-shadow: inset 0 5px 6px -3px rgba(0, 0, 0, 0.842);
will-change: opacity;
}
&.shadow::before {
opacity: 1;
}
}
main {
margin-left: $margin;
margin-right: $margin;
}
</style>