diff options
author | Li Jin <dragon-fly@qq.com> | 2021-04-19 23:41:33 +0800 |
---|---|---|
committer | Li Jin <dragon-fly@qq.com> | 2021-04-19 23:41:33 +0800 |
commit | 5d3b07801456d16dcc2c75dcccd48d508a6b60cc (patch) | |
tree | 2df1a154bf58d93f2475df02afbd15f1a8ba2963 /doc/docs/.vuepress/theme/components/NavLinks.vue | |
parent | ea82666506b57d6e905b7f2e5fe78498fe5a7abd (diff) | |
download | yuescript-5d3b07801456d16dcc2c75dcccd48d508a6b60cc.tar.gz yuescript-5d3b07801456d16dcc2c75dcccd48d508a6b60cc.tar.bz2 yuescript-5d3b07801456d16dcc2c75dcccd48d508a6b60cc.zip |
first commit for Yuescript document site.
Diffstat (limited to 'doc/docs/.vuepress/theme/components/NavLinks.vue')
-rw-r--r-- | doc/docs/.vuepress/theme/components/NavLinks.vue | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/doc/docs/.vuepress/theme/components/NavLinks.vue b/doc/docs/.vuepress/theme/components/NavLinks.vue new file mode 100644 index 0000000..2656ae2 --- /dev/null +++ b/doc/docs/.vuepress/theme/components/NavLinks.vue | |||
@@ -0,0 +1,156 @@ | |||
1 | <template> | ||
2 | <nav | ||
3 | v-if="userLinks.length || repoLink" | ||
4 | class="nav-links" | ||
5 | > | ||
6 | <!-- user links --> | ||
7 | <div | ||
8 | v-for="item in userLinks" | ||
9 | :key="item.link" | ||
10 | class="nav-item" | ||
11 | > | ||
12 | <DropdownLink | ||
13 | v-if="item.type === 'links'" | ||
14 | :item="item" | ||
15 | /> | ||
16 | <NavLink | ||
17 | v-else | ||
18 | :item="item" | ||
19 | /> | ||
20 | </div> | ||
21 | |||
22 | <!-- repo link --> | ||
23 | <a | ||
24 | v-if="repoLink" | ||
25 | :href="repoLink" | ||
26 | class="repo-link" | ||
27 | target="_blank" | ||
28 | rel="noopener noreferrer" | ||
29 | > | ||
30 | {{ repoLabel }} | ||
31 | <OutboundLink /> | ||
32 | </a> | ||
33 | </nav> | ||
34 | </template> | ||
35 | |||
36 | <script> | ||
37 | import DropdownLink from '@theme/components/DropdownLink.vue' | ||
38 | import { resolveNavLinkItem } from '../util' | ||
39 | import NavLink from '@theme/components/NavLink.vue' | ||
40 | |||
41 | export default { | ||
42 | name: 'NavLinks', | ||
43 | |||
44 | components: { | ||
45 | NavLink, | ||
46 | DropdownLink | ||
47 | }, | ||
48 | |||
49 | computed: { | ||
50 | userNav () { | ||
51 | return this.$themeLocaleConfig.nav || this.$site.themeConfig.nav || [] | ||
52 | }, | ||
53 | |||
54 | nav () { | ||
55 | const { locales } = this.$site | ||
56 | if (locales && Object.keys(locales).length > 1) { | ||
57 | const currentLink = this.$page.path | ||
58 | const routes = this.$router.options.routes | ||
59 | const themeLocales = this.$site.themeConfig.locales || {} | ||
60 | const languageDropdown = { | ||
61 | text: this.$themeLocaleConfig.selectText || 'Languages', | ||
62 | ariaLabel: this.$themeLocaleConfig.ariaLabel || 'Select language', | ||
63 | items: Object.keys(locales).map(path => { | ||
64 | const locale = locales[path] | ||
65 | const text = themeLocales[path] && themeLocales[path].label || locale.lang | ||
66 | let link | ||
67 | // Stay on the current page | ||
68 | if (locale.lang === this.$lang) { | ||
69 | link = currentLink | ||
70 | } else { | ||
71 | // Try to stay on the same page | ||
72 | link = currentLink.replace(this.$localeConfig.path, path) | ||
73 | // fallback to homepage | ||
74 | if (!routes.some(route => route.path === link)) { | ||
75 | link = path | ||
76 | } | ||
77 | } | ||
78 | return { text, link } | ||
79 | }) | ||
80 | } | ||
81 | return [...this.userNav, languageDropdown] | ||
82 | } | ||
83 | return this.userNav | ||
84 | }, | ||
85 | |||
86 | userLinks () { | ||
87 | return (this.nav || []).map(link => { | ||
88 | return Object.assign(resolveNavLinkItem(link), { | ||
89 | items: (link.items || []).map(resolveNavLinkItem) | ||
90 | }) | ||
91 | }) | ||
92 | }, | ||
93 | |||
94 | repoLink () { | ||
95 | const { repo } = this.$site.themeConfig | ||
96 | if (repo) { | ||
97 | return /^https?:/.test(repo) | ||
98 | ? repo | ||
99 | : `https://github.com/${repo}` | ||
100 | } | ||
101 | return null | ||
102 | }, | ||
103 | |||
104 | repoLabel () { | ||
105 | if (!this.repoLink) return | ||
106 | if (this.$site.themeConfig.repoLabel) { | ||
107 | return this.$site.themeConfig.repoLabel | ||
108 | } | ||
109 | |||
110 | const repoHost = this.repoLink.match(/^https?:\/\/[^/]+/)[0] | ||
111 | const platforms = ['GitHub', 'GitLab', 'Bitbucket'] | ||
112 | for (let i = 0; i < platforms.length; i++) { | ||
113 | const platform = platforms[i] | ||
114 | if (new RegExp(platform, 'i').test(repoHost)) { | ||
115 | return platform | ||
116 | } | ||
117 | } | ||
118 | |||
119 | return 'Source' | ||
120 | } | ||
121 | } | ||
122 | } | ||
123 | </script> | ||
124 | |||
125 | <style lang="stylus"> | ||
126 | .nav-links | ||
127 | display inline-block | ||
128 | a | ||
129 | line-height 1.4rem | ||
130 | color inherit | ||
131 | &:hover, &.router-link-active | ||
132 | color $accentColor | ||
133 | .nav-item | ||
134 | position relative | ||
135 | display inline-block | ||
136 | margin-left 1.5rem | ||
137 | line-height 2rem | ||
138 | &:first-child | ||
139 | margin-left 0 | ||
140 | .repo-link | ||
141 | margin-left 1.5rem | ||
142 | |||
143 | @media (max-width: $MQMobile) | ||
144 | .nav-links | ||
145 | .nav-item, .repo-link | ||
146 | margin-left 0 | ||
147 | |||
148 | @media (min-width: $MQMobile) | ||
149 | .nav-links a | ||
150 | &:hover, &.router-link-active | ||
151 | color $textColor | ||
152 | .nav-item > a:not(.external) | ||
153 | &:hover, &.router-link-active | ||
154 | margin-bottom -2px | ||
155 | border-bottom 2px solid lighten($accentColor, 8%) | ||
156 | </style> | ||