-
Pierre-Jean CHANCELLIER authoredPierre-Jean CHANCELLIER authored
Bar.vue 3.42 KiB
<template>
<header class="header position-fixed">
<div class="position-relative">
<button
class="toggle btn border-secondary position-absolute p-1 ml-4"
@click="toggleMenu">
<span></span>
</button>
<NavigationBreadcrumb :breadcrumb="breadcrumb" />
</div>
<NavigationMenuSidebar @toggleMenu="toggleMenu" :menus="menus" />
<div class="bg_overlay position-fixed" @click="toggleMenu"></div>
</header>
</template>
<script>
export default {
data() {
return {
isOpen: false
}
},
props: {
breadcrumb: Array,
menus: Array
},
methods: {
toggleMenu() {
document.querySelector(".app").classList.toggle("open")
this.isOpen = !this.isOpen
localStorage.setItem("menu-open", this.isOpen)
}
},
mounted() {
this.isOpen = localStorage.getItem("menu-open") == "true"
if (this.isOpen) {
document.querySelector(".app").classList.add("open")
}
}
}
</script>
<style lang="scss">
$btn-width: 50px;
.header {
--menu-width: 0px;
width: 100%;
z-index: 100;
background: var(--background-color-primary);
transition: width 0.5s ease-in-out;
.open & {
--menu-width: 320px;
}
@media (min-width: 1200px) {
width: calc(99vw - var(--menu-width));
}
}
nav.breadcrumb-wrapper {
min-height: 80px;
margin: 8px 15px;
padding: 1rem 1rem 1rem 4.5rem;
display: flex;
flex-direction: column;
gap: 1rem;
background: var(--background-color-secondary);
a {
color: var(--text-primary-color);
}
.breadcrumb-item.active {
opacity: 0.7;
}
@media (min-width: 768px) {
flex-direction: row;
justify-content: space-between;
align-items: center;
}
}
%hamburger-line {
display: block;
height: 4px;
width: 0.8 * $btn-width;
background: var(--text-primary-color);
content: "";
position: absolute;
transition-property: transform;
border-radius: 4px;
}
.toggle {
height: $btn-width;
width: $btn-width;
line-height: $btn-width;
top: 1rem;
span {
@extend %hamburger-line;
top: 50%;
transform: translateY(-50%);
transition-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);
transition-duration: 75ms;
.open & {
transform: rotate(45deg);
display: block;
margin-top: -2px;
}
&::before {
transition: top 75ms ease 0.12s, opacity 75ms ease;
@extend %hamburger-line;
top: -10px;
.open & {
opacity: 0;
}
}
&::after {
transition: bottom 75ms ease 0.12s,
transform 75ms cubic-bezier(0.55, 0.055, 0.675, 0.19);
@extend %hamburger-line;
bottom: -10px;
.open & {
top: 0;
transform: rotate(-90deg);
}
}
}
}
.menu {
background: var(--background-color-primary);
width: var(--menu-size);
top: 0;
z-index: 1200;
height: 100%;
padding: 1.1rem 0.5rem;
overflow-y: scroll;
scrollbar-color: #6969dd #e0e0e0;
scrollbar-width: thin;
transition: left 0.5s ease-in-out;
left: -400px;
h1 {
color: var(--text-primary-color);
}
.open & {
left: 0;
}
.close {
--size: 50px;
width: var(--size);
height: var(--size);
top: 0.8rem;
right: 0;
font-size: 2rem;
}
h2 {
cursor: default;
}
}
.bg_overlay {
top: 0;
left: 0;
right: 0;
height: 120vh;
z-index: 1100;
visibility: hidden;
opacity: 0;
transition: all 0.5s ease;
background-color: rgba(34, 41, 47, 0.5);
.open & {
opacity: 1;
visibility: visible;
}
}
.logo {
max-width: 75px;
}
@media (min-width: 1200px) {
.open {
&.app {
margin-left: var(--menu-size);
}
.menu {
left: 0;
}
.bg_overlay {
visibility: hidden;
opacity: 0;
}
}
}
</style>