Files
yiliang114 e27eb50565 feat:
vuepress@1.x config change and style use
2020-02-12 14:53:42 +08:00

123 lines
2.2 KiB
Vue

<template>
<div class="sidebar">
<NavLinks />
<slot name="top" />
<ul class="sidebar-links"
v-if="items.length">
<li v-for="(item, i) in items"
:key="i">
<SidebarGroup v-if="item.type === 'group'"
:item="item"
:first="i === 0"
:open="i === openGroupIndex"
:collapsable="item.collapsable"
@toggle="toggleGroup(i)" />
<SidebarLink v-else
:item="item" />
</li>
</ul>
<slot name="bottom" />
</div>
</template>
<script>
import SidebarGroup from "./SidebarGroup.vue";
import SidebarLink from "./SidebarLink.vue";
import NavLinks from "./NavLinks.vue";
import { isActive } from "../utils";
export default {
components: { SidebarGroup, SidebarLink, NavLinks },
props: ["items"],
data() {
return {
openGroupIndex: 0
};
},
created() {
this.refreshIndex();
},
watch: {
$route() {
this.refreshIndex();
}
},
methods: {
refreshIndex() {
const index = resolveOpenGroupIndex(this.$route, this.items);
if (index > -1) {
this.openGroupIndex = index;
}
},
toggleGroup(index) {
this.openGroupIndex = index === this.openGroupIndex ? -1 : index;
},
isActive(page) {
return isActive(this.$route, page.path);
}
}
};
function resolveOpenGroupIndex(route, items) {
for (let i = 0; i < items.length; i++) {
const item = items[i];
if (
item.type === "group" &&
item.children.some(c => isActive(route, c.path))
) {
return i;
}
}
return -1;
}
</script>
<style lang="stylus">
@import '../styles/config.styl';
.sidebar {
ul {
padding: 0;
margin: 0;
list-style-type: none;
}
a {
display: inline-block;
}
.nav-links {
display: none;
border-bottom: 1px solid $borderColor;
padding: 0.5rem 0 0.75rem 0;
a {
font-weight: 600;
}
.nav-item, .repo-link {
display: block;
line-height: 1.25rem;
font-size: 1.1em;
padding: 0.5rem 0 0.5rem 1.5rem;
}
}
.sidebar-links {
padding: 1.5rem 0;
}
}
@media (max-width: $MQMobile) {
.sidebar {
.nav-links {
display: block;
}
.sidebar-links {
padding: 1rem 0;
}
}
}
</style>