<template lang='pug'> q-layout(view='hHh Lpr lff') header-nav q-drawer.bg-sidebar( :modelValue='isSidebarShown' :show-if-above='siteStore.theme.sidebarPosition !== `off`' :width='isSidebarMini ? 56 : 255' :side='siteStore.theme.sidebarPosition === `right` ? `right` : `left`' ) .sidebar-mini.column.items-stretch(v-if='isSidebarMini') q-btn.q-py-md( flat icon='las la-globe' color='white' aria-label='Switch Locale' @click='' ) locale-selector-menu(anchor='top right' self='top left') q-tooltip(anchor='center right' self='center left') Switch Locale q-btn.q-py-md( flat icon='las la-sitemap' color='white' aria-label='Browse' @click='notImplemented' ) q-tooltip(anchor='center right' self='center left') Browse q-separator.q-my-sm(inset, dark) q-btn.q-py-md( flat icon='las la-bookmark' color='white' aria-label='Bookmarks' @click='notImplemented' ) q-tooltip(anchor='center right' self='center left') Bookmarks q-space q-btn.q-py-xs( flat icon='las la-dharmachakra' color='white' aria-label='Edit Nav' size='sm' ) q-menu( ref='navEditMenuMini' anchor='top right' self='bottom left' ) nav-edit-menu( :menu-hide-handler='navEditMenuMini.hide' :update-position-handler='navEditMenuMini.updatePosition' ) q-tooltip(anchor='center right' self='center left') Edit Nav template(v-else) .sidebar-actions.flex.items-stretch q-btn.q-px-sm.col( flat dense icon='las la-globe' color='blue-7' text-color='custom-color' :label='commonStore.locale' :aria-label='commonStore.locale' size='sm' ) locale-selector-menu(:offset="[-5, 5]") q-separator(vertical) q-btn.q-px-sm.col( flat dense icon='las la-sitemap' color='blue-7' text-color='custom-color' label='Browse' aria-label='Browse' size='sm' @click='notImplemented' ) nav-sidebar q-bar.sidebar-footerbtns.text-white( v-if='userStore.authenticated' dense ) q-btn.col( icon='las la-dharmachakra' label='Edit Nav' flat ) q-menu( ref='navEditMenu' anchor='top left' self='bottom left' :offset='[0, 10]' ) nav-edit-menu( :menu-hide-handler='navEditMenu.hide' :update-position-handler='navEditMenu.updatePosition' ) q-separator(vertical) q-btn.col( icon='las la-bookmark' label='Bookmarks' flat @click='notImplemented' ) q-page-container router-view q-page-scroller( position='bottom-right' :scroll-offset='150' :offset='[15, 15]' ) q-btn( icon='las la-arrow-up' color='primary' round size='md' ) main-overlay-dialog footer-nav(v-if='!editorStore.isActive') </template> <script setup> import { useMeta, useQuasar } from 'quasar' import { computed, onMounted, reactive, ref, watch } from 'vue' import { useRouter, useRoute } from 'vue-router' import { useI18n } from 'vue-i18n' import { useCommonStore } from 'src/stores/common' import { useEditorStore } from 'src/stores/editor' import { useFlagsStore } from 'src/stores/flags' import { usePageStore } from 'src/stores/page' import { useSiteStore } from 'src/stores/site' import { useUserStore } from 'src/stores/user' // COMPONENTS import FooterNav from 'src/components/FooterNav.vue' import HeaderNav from 'src/components/HeaderNav.vue' import LocaleSelectorMenu from 'src/components/LocaleSelectorMenu.vue' import NavSidebar from 'src/components/NavSidebar.vue' import NavEditMenu from 'src/components/NavEditMenu.vue' import MainOverlayDialog from 'src/components/MainOverlayDialog.vue' // QUASAR const $q = useQuasar() // STORES const commonStore = useCommonStore() const editorStore = useEditorStore() const flagsStore = useFlagsStore() const pageStore = usePageStore() const siteStore = useSiteStore() const userStore = useUserStore() // ROUTER const router = useRouter() const route = useRoute() // I18N const { t } = useI18n() // META useMeta({ titleTemplate: title => `${title} - ${siteStore.title}` }) // REFS const navEditMenu = ref(null) const navEditMenuMini = ref(null) // COMPUTED const isSidebarShown = computed(() => { return siteStore.showSideNav && !siteStore.sideNavIsDisabled && !(editorStore.isActive && editorStore.hideSideNav) }) const isSidebarMini = computed(() => { return ['hide', 'hideExact'].includes(pageStore.navigationMode) || !pageStore.navigationId }) // METHODS function notImplemented () { $q.notify({ type: 'negative', message: 'Not implemented' }) } </script> <style lang="scss"> .sidebar-actions { background: linear-gradient(to bottom, rgba(255,255,255,.1) 0%, rgba(0,0,0, .05) 100%); border-bottom: 1px solid rgba(0,0,0,.2); height: 38px; .q-btn { color: rgba(255,255,255,.8); } } .sidebar-mini { height: 100%; } .sidebar-footerbtns { background-color: rgba(255,255,255,.1); } body.body--dark { background-color: $dark-6; } .main-overlay { > .q-dialog__backdrop { background-color: rgba(0,0,0,.6); backdrop-filter: blur(5px) saturate(180%); } > .q-dialog__inner { padding: 24px 64px; @media (max-width: $breakpoint-sm-max) { padding: 0; } > .q-layout-container { @at-root .body--light & { background-image: linear-gradient(to bottom, $dark-5 10px, $grey-3 11px, $grey-4); } @at-root .body--dark & { background-image: linear-gradient(to bottom, $dark-4 10px, $dark-4 11px, $dark-3); } border-radius: 6px; box-shadow: 0 0 30px 0 rgba(0,0,0,.3); } } } .q-footer { .q-bar { @at-root .body--light & { background-color: $grey-3; color: $grey-7; } @at-root .body--dark & { background-color: $dark-4; color: rgba(255,255,255,.3); } } } .syncing-enter-active { animation: syncing-anim .1s; } .syncing-leave-active { animation: syncing-anim 1s reverse; } @keyframes syncing-anim { 0% { opacity: 0; } 100% { opacity: 1; } } </style>