<template> <div :class="classObj" class="app-wrapper" :style="{ '--current-color': theme }" > <div v-if="device === 'mobile' && sidebar.opened" class="drawer-bg" @click="handleClickOutside" /> <sidebar v-if="!sidebar.hide" class="sidebar-container" /> <div :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }" class="main-container" > <div class="topFix"></div> <div :class="{ 'fixed-header': fixedHeader }"> <!-- <navbar /> --> <tags-view v-if="needTagsView" /> </div> <app-main /> <right-panel> <settings /> </right-panel> </div> </div> </template> <script> import RightPanel from "@/components/RightPanel"; import { AppMain, Navbar, Settings, Sidebar, TagsView } from "./components"; import ResizeMixin from "./mixin/ResizeHandler"; import { mapState } from "vuex"; import variables from "@/assets/styles/variables.scss"; export default { name: "Layout", components: { AppMain, Navbar, RightPanel, Settings, Sidebar, TagsView, }, mixins: [ResizeMixin], computed: { ...mapState({ theme: (state) => state.settings.theme, sideTheme: (state) => state.settings.sideTheme, sidebar: (state) => state.app.sidebar, device: (state) => state.app.device, needTagsView: (state) => state.settings.tagsView, fixedHeader: (state) => state.settings.fixedHeader, }), classObj() { return { hideSidebar: !this.sidebar.opened, openSidebar: this.sidebar.opened, withoutAnimation: this.sidebar.withoutAnimation, mobile: this.device === "mobile", }; }, variables() { return variables; }, }, methods: { handleClickOutside() { this.$store.dispatch("app/closeSideBar", { withoutAnimation: false }); }, }, }; </script> <style lang="scss" scoped> @import "~@/assets/styles/mixin.scss"; @import "~@/assets/styles/variables.scss"; .app-wrapper { @include clearfix; position: relative; height: 100%; width: 100%; &.mobile.openSidebar { position: fixed; top: 0; } } .drawer-bg { background: #000; opacity: 0.3; width: 100%; top: 0; height: 100%; position: absolute; z-index: 999; } .fixed-header { position: fixed; top: 0; right: 0; z-index: 9; width: calc(100% - #{$base-sidebar-width}); transition: width 0.28s; } .hideSidebar .fixed-header { width: calc(100% - 54px); } .sidebarHide .fixed-header { width: 100%; } .mobile .fixed-header { width: 100%; } .topFix { width: 100%; height: 120px; } </style>