Skip to content

Commit 6c9e1a4

Browse files
committed
implement nested links in dropdown
1 parent 94c2236 commit 6c9e1a4

File tree

5 files changed

+129
-18
lines changed

5 files changed

+129
-18
lines changed

docs/.vuepress/config.js

+73
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,79 @@ module.exports = {
4747
link: '/',
4848
},
4949
]
50+
},
51+
{
52+
text: 'Ecosystem',
53+
items: [
54+
{
55+
text: 'Help',
56+
items: [
57+
{
58+
text: 'Forum',
59+
link: 'https://forum.vuejs.org/'
60+
},
61+
{
62+
text: 'Chat',
63+
link: 'https://chat.vuejs.org/'
64+
}
65+
]
66+
},
67+
{
68+
text: 'Tooling',
69+
items: [
70+
{
71+
text: 'Devtools',
72+
link: 'https://github.com/vuejs/vue-devtools'
73+
},
74+
{
75+
text: 'Webpack Template',
76+
link: 'https://vuejs-templates.github.io/webpack'
77+
},
78+
{
79+
text: 'Vue Loader',
80+
link: 'https://vue-loader.vuejs.org'
81+
}
82+
]
83+
},
84+
{
85+
text: 'News',
86+
items: [
87+
{
88+
text: 'Weekly News',
89+
link: 'https://news.vuejs.org'
90+
},
91+
{
92+
text: 'Roadmap',
93+
link: 'https://github.com/vuejs/roadmap'
94+
},
95+
{
96+
text: 'Twitter',
97+
link: 'https://twitter.com/vuejs'
98+
},
99+
{
100+
text: 'Blog',
101+
link: 'https://medium.com/the-vue-point'
102+
},
103+
{
104+
text: 'Jobs',
105+
link: 'https://vuejobs.com/?ref=vuejs'
106+
}
107+
]
108+
},
109+
{
110+
text: 'Resource Lists',
111+
items: [
112+
{
113+
text: 'Vue Curated',
114+
link: 'ttps://curated.vuejs.org/'
115+
},
116+
{
117+
text: 'Awesome Vue',
118+
link: 'https://github.com/vuejs/awesome-vue'
119+
}
120+
]
121+
}
122+
]
50123
}
51124
],
52125
sidebar: {

lib/default-theme/NavLink.vue

+9-4
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,31 @@
11
<template>
22
<router-link
33
class="router-link"
4-
:to="item.link"
5-
v-if="!isExternal(item.link)"
4+
:to="link"
5+
v-if="!isExternal(link)"
66
exact
77
>{{ item.text }}</router-link>
88
<a
99
v-else
10-
:href="item.link"
10+
:href="link"
1111
target="_blank"
1212
class="router-link"
1313
>{{ item.text }}</a>
1414
</template>
1515

1616
<script>
17-
import { isExternal } from './util'
17+
import { isExternal, ensureExt } from './util'
1818
export default {
1919
props: {
2020
item: {
2121
required: true
2222
}
2323
},
24+
computed: {
25+
link() {
26+
return ensureExt(this.item.link)
27+
}
28+
},
2429
methods: {
2530
isExternal
2631
}

lib/default-theme/NavLinks.vue

+31-11
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,23 @@
66
v-for="item in userLinks"
77
:key="item.link">
88
<div
9-
v-if="item.type === 'dropdown'"
9+
v-if="item.type === 'links'"
1010
class="dropdown-wrapper">
1111
<span class="dropdown-title">{{ item.text }}</span>
1212
<span class="arrow"></span>
1313
<ul class="nav-dropdown">
1414
<li
1515
v-for="subItem in item.items"
1616
:key="subItem.link">
17-
<nav-link :item="subItem"></nav-link>
17+
<h4 v-if="subItem.type === 'links'">{{ subItem.text }}</h4>
18+
<ul v-if="subItem.type === 'links'">
19+
<li
20+
v-for="childSubItem in subItem.items"
21+
:key="childSubItem.link">
22+
<nav-link :item="childSubItem"></nav-link>
23+
</li>
24+
</ul>
25+
<nav-link v-else :item="subItem"></nav-link>
1826
</li>
1927
</ul>
2028
</div>
@@ -35,17 +43,16 @@
3543
<script>
3644
import OutboundLink from './OutboundLink.vue'
3745
import NavLink from './NavLink.vue'
38-
import { isActive, ensureExt } from './util'
46+
import { isActive, resolveNavLinkItem } from './util'
3947
4048
export default {
4149
components: { OutboundLink, NavLink },
4250
computed: {
4351
userLinks () {
44-
return (this.$site.themeConfig.nav || []).map(({ text, link, type, items }) => ({
45-
text,
46-
type,
47-
link: link ? ensureExt(link) : null,
48-
items: (items || []).map(({ text, link }) => ({ text, link: ensureExt(link) }))
52+
return (this.$site.themeConfig.nav || []).map((link => {
53+
return Object.assign(resolveNavLinkItem(link), {
54+
items: (link.items || []).map(resolveNavLinkItem)
55+
})
4956
}))
5057
},
5158
githubLink () {
@@ -81,7 +88,6 @@ export default {
8188
line-height 2rem
8289
.dropdown-wrapper
8390
cursor pointer
84-
padding-right 15
8591
&:hover .nav-dropdown
8692
display block
8793
.arrow
@@ -98,12 +104,15 @@ export default {
98104
li
99105
color inherit
100106
line-height 1.7rem
101-
padding 0 1.5rem 0 1.25rem
102107
a
108+
display block
109+
height 1.7rem
110+
line-height 1.7rem
103111
position relative
104112
border-bottom none
105113
font-weight 400
106114
margin-bottom 0
115+
padding 0 1.5rem 0 1.25rem
107116
&:hover
108117
color $accentColor
109118
&.router-link-active
@@ -117,7 +126,18 @@ export default {
117126
border-bottom 4px solid transparent
118127
position absolute
119128
top calc(50% - 3px)
120-
left -10px
129+
left 10px
130+
&:first-child h4
131+
margin-top: 0;
132+
padding-top: 0;
133+
border-top: 0;
134+
& > h4
135+
margin 0.45rem 0 0
136+
border-top 1px solid #eee
137+
padding 0.45rem 1.5rem 0 1.25rem
138+
& > ul
139+
padding 0
140+
list-style none
121141
.github-link
122142
margin-left 1.5rem
123143

lib/default-theme/Sidebar.vue

+10-3
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,16 @@ function resolveOpenGroupIndex (route, items) {
9191
.dropdown-title
9292
display inline-block
9393
margin-bottom 5px
94-
.nav-dropdown li
95-
font-size 15px
96-
line-height 1.7rem
94+
.nav-dropdown
95+
li, h4
96+
font-size 15px
97+
line-height 1.7rem
98+
h4
99+
border-top 0
100+
margin-top 0
101+
padding-top 0
102+
ul > li
103+
padding-left 1rem
97104
.sidebar-links
98105
margin-top 1.5rem
99106

lib/default-theme/util.js

+6
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,12 @@ export function groupHeaders (headers) {
151151
return headers.filter(h => h.level === 2)
152152
}
153153

154+
export function resolveNavLinkItem (linkItem) {
155+
return Object.assign(linkItem, {
156+
type: linkItem.items && linkItem.items.length ? 'links' : 'link'
157+
})
158+
}
159+
154160
function resolveMatchingSidebarConfig (route, sidebarConfig) {
155161
if (Array.isArray(sidebarConfig)) {
156162
return {

0 commit comments

Comments
 (0)