components/sidebar.vue (63 lines of code) (raw):
<script>
import { mapState } from 'vuex';
import { NavTree } from '../helpers/navigation/nav_tree';
import nav from '../nav.json';
import Navbar from './navbar.vue';
import MenuItem from './menu_item.vue';
import Search from './search/search_box.vue';
export default {
components: {
Navbar,
MenuItem,
Search,
},
data() {
return {
navTree: new NavTree(nav),
};
},
computed: {
...mapState(['sidebarOpen']),
},
mounted() {
this.$router.afterEach(() => {
this.$nextTick(this.updateActiveNavItem);
});
this.updateActiveNavItem();
},
methods: {
updateActiveNavItem() {
const [activeLink] = [...this.$el.querySelectorAll('.nuxt-link-active')].reverse();
if (activeLink) {
this.navTree.activateNodeWithRoute(activeLink.getAttribute('href'));
}
},
},
};
</script>
<template>
<aside :class="{ 'sidebar--open': sidebarOpen }" class="sidebar">
<navbar class="gl-hidden md:gl-flex" />
<div class="gl-px-4 gl-pb-3">
<client-only>
<search />
<template #placeholder>
<div class="gl-py-6"></div>
</template>
</client-only>
</div>
<div class="gl-grow gl-overflow-auto gl-px-2 gl-py-3">
<nav class="sidebar__nav" aria-labelledby="nav-heading">
<h2 id="nav-heading" class="gl-sr-only">Main navigation</h2>
<ul class="gl-m-0 gl-pl-0">
<menu-item
v-for="item in navTree.topLevelNodes"
:key="item.id"
:item="item"
:nav-tree="navTree"
/>
</ul>
</nav>
</div>
</aside>
</template>