Add sidebar animation #4

Closed
boiii wants to merge 2 commits from (deleted):sidebar-anim into master
3 changed files with 170 additions and 140 deletions

View File

@ -3,10 +3,8 @@
class="container" class="container"
:class="theme" :class="theme"
> >
<Sidebar <Sidebar v-model="showSidebar" />
v-if="showSidebar" <SidebarBackground v-model="showSidebar" />
:toggle-sidebar="toggleSidebar"
/>
<Header :toggle-sidebar="toggleSidebar" /> <Header :toggle-sidebar="toggleSidebar" />
@ -20,10 +18,9 @@
<script> <script>
import { mapState } from 'vuex'; import { mapState } from 'vuex';
import EventBus from '../../js/event-bus';
import Header from '../header/header.vue'; import Header from '../header/header.vue';
import Sidebar from '../sidebar/sidebar.vue'; import Sidebar from '../sidebar/sidebar.vue';
import SidebarBackground from '../sidebar/background.vue';
function theme(state) { function theme(state) {
return state.ui.theme; return state.ui.theme;
@ -33,17 +30,11 @@ function toggleSidebar(state) {
this.showSidebar = typeof state === 'boolean' ? state : !this.showSidebar; this.showSidebar = typeof state === 'boolean' ? state : !this.showSidebar;
} }
function mounted() {
document.addEventListener('click', () => {
EventBus.$emit('blur');
this.showSidebar = false;
});
}
export default { export default {
components: { components: {
Header, Header,
Sidebar, Sidebar,
SidebarBackground
}, },
data() { data() {
return { return {
@ -55,7 +46,6 @@ export default {
theme, theme,
}), }),
}, },
mounted,
methods: { methods: {
toggleSidebar, toggleSidebar,
}, },

View File

@ -0,0 +1,38 @@
<template>
<transition name="fade">
<div v-if="value" @click="toggleSidebar(false)" class="sidebar-container">
</div>
</transition>
</template>
<script>
export default {
props: {
value: {
type: Boolean
}
},
methods: {
toggleSidebar(state) {
this.$emit("input", !!state);
}
},
};
</script>
<style lang="scss" scoped>
.fade-enter-active, .fade-leave-active {
transition: opacity .2s ease-in-out;
}
.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
opacity: 0;
}
.sidebar-container {
height: 100%;
width: 100%;
position: absolute;
z-index: 9;
background: var(--darken-weak);
}
</style>

View File

@ -1,6 +1,7 @@
<template> <template>
<div class="sidebar-container"> <transition name="slide">
<div <div
v-if="value"
class="sidebar" class="sidebar"
@click.stop @click.stop
> >
@ -117,7 +118,7 @@
><Icon icon="moon" />Use dark theme</label> ><Icon icon="moon" />Use dark theme</label>
</div> </div>
</div> </div>
</div> </transition>
</template> </template>
<script> <script>
@ -143,10 +144,9 @@ function setSfw(enabled) {
export default { export default {
props: { props: {
toggleSidebar: { value: {
type: Function, type: Boolean
default: null, }
},
}, },
data() { data() {
return { return {
@ -162,25 +162,27 @@ export default {
methods: { methods: {
setTheme, setTheme,
setSfw, setSfw,
toggleSidebar(state) {
this.$emit("input", !!state);
}
}, },
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.sidebar-container { .slide-leave-active,
height: 100%; .slide-enter-active {
width: 100%; transition: 0.2s ease-in-out;
position: absolute; }
z-index: 10; .slide-enter, .slide-leave-to {
background: var(--darken-hint); transform: translate(-100%, 0);
} }
.sidebar { .sidebar {
display: flex; position: fixed;
flex-direction: column; z-index: 10;
justify-content: space-between;
width: 15rem; width: 15rem;
height: 100%; height: 100vh;
color: var(--text); color: var(--text);
background: var(--background); background: var(--background);
box-shadow: 0 0 3px var(--darken-weak); box-shadow: 0 0 3px var(--darken-weak);