Skip to content

Commit

Permalink
feat: add nav option
Browse files Browse the repository at this point in the history
  • Loading branch information
egoist committed Nov 20, 2018
1 parent 8a64653 commit 430b21e
Show file tree
Hide file tree
Showing 24 changed files with 405 additions and 135 deletions.
3 changes: 2 additions & 1 deletion build/poi.website.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ module.exports = {
},
constants: {
__DOCUTE_VERSION__: JSON.stringify(pkg.version),
__PRISM_VERSION__: JSON.stringify(require('prismjs/package').version)
__PRISM_VERSION__: JSON.stringify(require('prismjs/package').version),
__DEPS__: JSON.stringify(Object.keys(pkg.dependencies))
},
plugins: [
{
Expand Down
92 changes: 92 additions & 0 deletions src/components/Header.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
<template>
<header class="Header">
<div class="Wrap" :class="{'is-center': $store.getters.centerContent}">
<div class="header-inner">
<div class="header-left">
<h1 class="site-title">
<SidebarToggle />
<router-link to="/">{{ $store.getters.config.title }}</router-link>
</h1>
<HeaderNav v-if="leftNav" :nav="leftNav" />
</div>
<div class="header-right">
<HeaderNav v-if="rightNav" :nav="rightNav" />
</div>
</div>
</div>
</header>
</template>

<script>
import HeaderNav from './HeaderNav.vue'
import SidebarToggle from './SidebarToggle.vue'
export default {
components: {
HeaderNav,
SidebarToggle
},
computed: {
leftNav() {
const {nav} = this.$store.getters.config
return (
nav &&
nav.filter(item => {
return item.position === 'left'
})
)
},
rightNav() {
const {nav} = this.$store.getters.config
return (
nav &&
nav.filter(item => {
return item.position === 'right' || !item.position
})
)
}
}
}
</script>


<style scoped>
@import 'vars.css';
.Header {
height: var(--header-height);
line-height: var(--header-height);
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 33;
border-bottom: 1px solid var(--border-color);
background: var(--sidebar-bg);
}
.site-title {
font-weight: normal;
margin: 0 25px 0 0;
font-size: 1.2rem;
display: flex;
align-items: center;
& a {
color: #000;
text-decoration: none;
}
}
.header-inner {
padding: 0 20px;
display: flex;
justify-content: space-between;
}
.header-left {
display: flex;
}
</style>
56 changes: 56 additions & 0 deletions src/components/HeaderNav.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<template>
<div class="header-nav">
<div class="header-nav-item" v-for="(item, index) in nav" :key="index">
<a v-if="isExternalLink(item.link)" :href="item.link" target="_blank">
{{ item.title }}
<external-link-icon />
</a>
<router-link v-else :to="item.link" :class="{active: $route.path === item.link}">
{{ item.title }}
</router-link>
</div>
</div>
</template>

<script>
import {isExternalLink} from '../utils'
export default {
props: {
nav: {
type: Array,
required: true
}
},
methods: {
isExternalLink
}
}
</script>

<style scoped>
.header-nav {
display: flex;
& .header-nav-item {
&:not(:first-child) {
margin-left: 20px;
}
}
& a {
color: #999;
text-decoration: none;
&:hover,
&.active {
color: #000;
}
}
@media (max-width: 768px) {
display: none;
}
}
</style>
57 changes: 0 additions & 57 deletions src/components/MobileHeader.vue

This file was deleted.

56 changes: 56 additions & 0 deletions src/components/MobileHeaderNav.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<template>
<div class="mobile-header-nav">
<div class="header-nav-item" v-for="(item, index) in nav" :key="index">
<a v-if="isExternalLink(item.link)" :href="item.link" target="_blank">
{{ item.title }}
<external-link-icon />
</a>
<router-link v-else :to="item.link" :class="{active: $route.path === item.link}">
{{ item.title }}
</router-link>
</div>
</div>
</template>

<script>
import {isExternalLink} from '../utils'
export default {
props: {
nav: {
type: Array,
requried: true
}
},
methods: {
isExternalLink
}
}
</script>

<style scoped>
@import 'vars.css';
.mobile-header-nav {
padding: 0 20px;
margin-bottom: 30px;
padding-bottom: 30px;
font-weight: bold;
font-size: 1.1rem;
border-bottom: 1px solid var(--border-color);
& a {
color: #000;
text-decoration: none;
&.active {
color: var(--accent-color);
}
}
@media (min-width: 768px) {
display: none;
}
}
</style>
32 changes: 11 additions & 21 deletions src/components/Sidebar.vue
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
<template>
<div class="Sidebar" :class="{isShown: $store.state.showSidebar}">

<div class="SiteTitle">
<router-link to="/">{{ $store.getters.config.title }}</router-link>
</div>

<InjectedComponents position="sidebar:start" />

<MobileHeaderNav v-if="$store.getters.config.nav" :nav="$store.getters.config.nav" />

<div class="SidebarItems">
<div
v-for="(item, index) in $store.getters.sidebar"
Expand All @@ -22,7 +19,8 @@
:href="link.link"
class="ItemLink"
target="_blank">
{{ link.title }} ↗
{{ link.title }}
<external-link-icon />
</a>
<router-link
v-else
Expand Down Expand Up @@ -60,8 +58,13 @@

<script>
import {isExternalLink} from '../utils'
import MobileHeaderNav from './MobileHeaderNav.vue'
export default {
components: {
MobileHeaderNav
},
methods: {
isExternalLink
}
Expand All @@ -76,11 +79,11 @@ export default {
width: 250px;
background: var(--sidebar-bg);
position: fixed;
top: 0;
top: var(--header-height);
bottom: 0;
z-index: 9;
overflow-y: auto;
padding: 20px 0;
padding: 30px 0;
word-break: break-word;
border-right: 1px solid var(--border-color);
Expand All @@ -93,7 +96,6 @@ export default {
left: 0;
transform: translateX(-100%);
width: 80%;
top: var(--mobile-header-height);
transition: transform 0.5s cubic-bezier(0.5, 0.32, 0.01, 1);
&.isShown {
Expand All @@ -102,18 +104,6 @@ export default {
}
}
.SiteTitle {
font-size: 1.8rem;
font-weight: 300;
padding: 20px;
padding-top: 0;
line-height: 1.2;
@media (max-width: 768px) {
display: none;
}
}
.SidebarItem {
&:not(:last-child) {
padding-bottom: 1.2rem;
Expand Down
35 changes: 35 additions & 0 deletions src/components/SidebarToggle.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<template>
<span class="sidebar-toggle" @click="toggleSidebar">
<svg aria-hidden="true" role="img" viewBox="0 0 448 512">
<path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path>
</svg>
</span>
</template>

<script>
export default {
methods: {
toggleSidebar() {
this.$store.commit('TOGGLE_SIDEBAR')
}
}
}
</script>

<style scoped>
.sidebar-toggle {
display: flex;
height: 100%;
align-items: center;
@media (min-width: 768px) {
display: none;
}
& svg {
width: 20px;
height: 20px;
margin-right: 10px;
}
}
</style>
Loading

0 comments on commit 430b21e

Please sign in to comment.