From 34f6f987a3b2254fd712c584e7e3c6ec79615b5f Mon Sep 17 00:00:00 2001 From: haolin3 Date: Thu, 30 Jul 2020 18:23:04 +0800 Subject: [PATCH] add theme --- package.json | 1 - website/.vuepress/config.js | 88 +++-- website/.vuepress/theme/LICENSE | 21 ++ website/.vuepress/theme/README.md | 88 +++++ .../theme/components/AlgoliaSearchBox.vue | 170 +++++++++ website/.vuepress/theme/components/Common.vue | 268 ++++++++++++++ .../theme/components/DropdownLink.vue | 183 +++++++++ .../theme/components/DropdownTransition.vue | 33 ++ website/.vuepress/theme/components/Footer.vue | 81 ++++ .../.vuepress/theme/components/FriendLink.vue | 196 ++++++++++ website/.vuepress/theme/components/Home.vue | 241 ++++++++++++ .../.vuepress/theme/components/HomeBlog.vue | 350 ++++++++++++++++++ .../.vuepress/theme/components/MobShare.vue | 30 ++ .../theme/components/Mode/ModePicker.vue | 102 +++++ .../theme/components/Mode/applyMode.js | 35 ++ .../.vuepress/theme/components/Mode/index.vue | 114 ++++++ .../theme/components/Mode/modeOptions.js | 44 +++ .../theme/components/ModuleTransition.vue | 45 +++ .../.vuepress/theme/components/NavLink.vue | 52 +++ .../.vuepress/theme/components/NavLinks.vue | 188 ++++++++++ website/.vuepress/theme/components/Navbar.vue | 131 +++++++ .../theme/components/NoteAbstract.vue | 31 ++ .../theme/components/NoteAbstractItem.vue | 86 +++++ website/.vuepress/theme/components/Page.vue | 282 ++++++++++++++ .../.vuepress/theme/components/PageInfo.vue | 114 ++++++ .../.vuepress/theme/components/Password.vue | 327 ++++++++++++++++ .../theme/components/PersonalInfo.vue | 75 ++++ .../.vuepress/theme/components/SearchBox.vue | 238 ++++++++++++ .../.vuepress/theme/components/Sidebar.vue | 65 ++++ .../theme/components/SidebarButton.vue | 27 ++ .../theme/components/SidebarGroup.vue | 129 +++++++ .../theme/components/SidebarLink.vue | 115 ++++++ .../theme/components/SidebarLinks.vue | 141 +++++++ .../.vuepress/theme/components/TagList.vue | 58 +++ website/.vuepress/theme/enhanceApp.js | 9 + .../theme/global-components/Badge.vue | 45 +++ website/.vuepress/theme/helpers/other.js | 18 + website/.vuepress/theme/helpers/postData.js | 41 ++ website/.vuepress/theme/helpers/utils.js | 273 ++++++++++++++ website/.vuepress/theme/images/home-bg.jpg | Bin 0 -> 26992 bytes website/.vuepress/theme/images/home-head.png | Bin 0 -> 32966 bytes .../theme/images/icon_vuepress_reco.png | Bin 0 -> 44905 bytes website/.vuepress/theme/index.js | 97 +++++ website/.vuepress/theme/layouts/404.vue | 69 ++++ website/.vuepress/theme/layouts/Category.vue | 169 +++++++++ website/.vuepress/theme/layouts/Layout.vue | 41 ++ website/.vuepress/theme/layouts/Tag.vue | 111 ++++++ website/.vuepress/theme/layouts/Tags.vue | 100 +++++ website/.vuepress/theme/layouts/TimeLines.vue | 153 ++++++++ .../theme/lib/vuepress-theme-reco.js | 7 + website/.vuepress/theme/locals/en.js | 8 + website/.vuepress/theme/locals/index.js | 7 + website/.vuepress/theme/locals/ja.js | 8 + website/.vuepress/theme/locals/ko.js | 8 + website/.vuepress/theme/locals/zh-hans.js | 8 + website/.vuepress/theme/locals/zh-hant.js | 8 + website/.vuepress/theme/mixins/index.js | 26 ++ website/.vuepress/theme/mixins/locals.js | 25 ++ .../.vuepress/theme/mixins/moduleTransiton.js | 13 + website/.vuepress/theme/mixins/pagination.js | 21 ++ website/.vuepress/theme/mixins/posts.js | 60 +++ website/.vuepress/theme/noopModule.js | 1 + website/.vuepress/theme/package.json | 65 ++++ website/.vuepress/theme/styles/arrow.styl | 22 ++ website/.vuepress/theme/styles/code.styl | 135 +++++++ .../.vuepress/theme/styles/custom-blocks.styl | 51 +++ website/.vuepress/theme/styles/iconfont.css | 174 +++++++++ website/.vuepress/theme/styles/mobile.styl | 39 ++ website/.vuepress/theme/styles/mode.styl | 38 ++ website/.vuepress/theme/styles/palette.styl | 47 +++ website/.vuepress/theme/styles/theme.styl | 226 +++++++++++ website/.vuepress/theme/styles/toc.styl | 3 + website/.vuepress/theme/styles/wrapper.styl | 9 + website/README.md | 16 +- 74 files changed, 6260 insertions(+), 40 deletions(-) create mode 100644 website/.vuepress/theme/LICENSE create mode 100644 website/.vuepress/theme/README.md create mode 100644 website/.vuepress/theme/components/AlgoliaSearchBox.vue create mode 100644 website/.vuepress/theme/components/Common.vue create mode 100644 website/.vuepress/theme/components/DropdownLink.vue create mode 100644 website/.vuepress/theme/components/DropdownTransition.vue create mode 100644 website/.vuepress/theme/components/Footer.vue create mode 100644 website/.vuepress/theme/components/FriendLink.vue create mode 100644 website/.vuepress/theme/components/Home.vue create mode 100644 website/.vuepress/theme/components/HomeBlog.vue create mode 100644 website/.vuepress/theme/components/MobShare.vue create mode 100644 website/.vuepress/theme/components/Mode/ModePicker.vue create mode 100644 website/.vuepress/theme/components/Mode/applyMode.js create mode 100755 website/.vuepress/theme/components/Mode/index.vue create mode 100644 website/.vuepress/theme/components/Mode/modeOptions.js create mode 100644 website/.vuepress/theme/components/ModuleTransition.vue create mode 100644 website/.vuepress/theme/components/NavLink.vue create mode 100644 website/.vuepress/theme/components/NavLinks.vue create mode 100644 website/.vuepress/theme/components/Navbar.vue create mode 100644 website/.vuepress/theme/components/NoteAbstract.vue create mode 100644 website/.vuepress/theme/components/NoteAbstractItem.vue create mode 100644 website/.vuepress/theme/components/Page.vue create mode 100644 website/.vuepress/theme/components/PageInfo.vue create mode 100644 website/.vuepress/theme/components/Password.vue create mode 100644 website/.vuepress/theme/components/PersonalInfo.vue create mode 100644 website/.vuepress/theme/components/SearchBox.vue create mode 100644 website/.vuepress/theme/components/Sidebar.vue create mode 100644 website/.vuepress/theme/components/SidebarButton.vue create mode 100644 website/.vuepress/theme/components/SidebarGroup.vue create mode 100644 website/.vuepress/theme/components/SidebarLink.vue create mode 100644 website/.vuepress/theme/components/SidebarLinks.vue create mode 100644 website/.vuepress/theme/components/TagList.vue create mode 100644 website/.vuepress/theme/enhanceApp.js create mode 100644 website/.vuepress/theme/global-components/Badge.vue create mode 100644 website/.vuepress/theme/helpers/other.js create mode 100644 website/.vuepress/theme/helpers/postData.js create mode 100644 website/.vuepress/theme/helpers/utils.js create mode 100644 website/.vuepress/theme/images/home-bg.jpg create mode 100644 website/.vuepress/theme/images/home-head.png create mode 100644 website/.vuepress/theme/images/icon_vuepress_reco.png create mode 100644 website/.vuepress/theme/index.js create mode 100644 website/.vuepress/theme/layouts/404.vue create mode 100644 website/.vuepress/theme/layouts/Category.vue create mode 100644 website/.vuepress/theme/layouts/Layout.vue create mode 100644 website/.vuepress/theme/layouts/Tag.vue create mode 100644 website/.vuepress/theme/layouts/Tags.vue create mode 100644 website/.vuepress/theme/layouts/TimeLines.vue create mode 100644 website/.vuepress/theme/lib/vuepress-theme-reco.js create mode 100644 website/.vuepress/theme/locals/en.js create mode 100644 website/.vuepress/theme/locals/index.js create mode 100644 website/.vuepress/theme/locals/ja.js create mode 100644 website/.vuepress/theme/locals/ko.js create mode 100644 website/.vuepress/theme/locals/zh-hans.js create mode 100644 website/.vuepress/theme/locals/zh-hant.js create mode 100644 website/.vuepress/theme/mixins/index.js create mode 100644 website/.vuepress/theme/mixins/locals.js create mode 100644 website/.vuepress/theme/mixins/moduleTransiton.js create mode 100644 website/.vuepress/theme/mixins/pagination.js create mode 100644 website/.vuepress/theme/mixins/posts.js create mode 100644 website/.vuepress/theme/noopModule.js create mode 100644 website/.vuepress/theme/package.json create mode 100644 website/.vuepress/theme/styles/arrow.styl create mode 100644 website/.vuepress/theme/styles/code.styl create mode 100644 website/.vuepress/theme/styles/custom-blocks.styl create mode 100644 website/.vuepress/theme/styles/iconfont.css create mode 100644 website/.vuepress/theme/styles/mobile.styl create mode 100644 website/.vuepress/theme/styles/mode.styl create mode 100644 website/.vuepress/theme/styles/palette.styl create mode 100644 website/.vuepress/theme/styles/theme.styl create mode 100644 website/.vuepress/theme/styles/toc.styl create mode 100644 website/.vuepress/theme/styles/wrapper.styl diff --git a/package.json b/package.json index 54330ab8..200d1669 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,6 @@ "devDependencies": { "algoliasearch": "^4.2.0", "vuepress": "^1.4.1", - "vuepress-theme-reco": "^1.4.5", "vuepress-plugin-autobar": "github:boboidream/vuepress-bar" }, "description": "易懂的算法教程", diff --git a/website/.vuepress/config.js b/website/.vuepress/config.js index 131a9a4a..fbf43a88 100644 --- a/website/.vuepress/config.js +++ b/website/.vuepress/config.js @@ -1,38 +1,56 @@ module.exports = { - title: "小浩算法", - plugins: [require('../../lib/autobar.js'), require('../../lib/Notification.js')], - description: '和小浩一起学算法', - // root : "./hell-algorithm", - theme: "reco", - themeConfig: { - logo: '/logo.png', - sidebar: "auto", - searchPlaceholder: "搜索:KMP", - nav: [ - {text: 'GitHub', link: 'https://github.com/geekxh/hello-algorithm', icon: 'reco-github'} - ], - head: [ - ['link', {rel: 'shortcut icon', href: '/favicon.ico'}] - ], - type: 'blog', - search: true, - searchMaxSuggestions: 10, - lastUpdated: '文章修订于', - author: '程序员小浩', - authorAvatar: '/code.png', - startYear: '2019', - valineConfig: { - visitor: false, - enable: true, - placeholder: "留下你的问题,或者你想要的资源...", - avatar: "wavatar", - requiredFields: ['nick'], - appId: 'sINkW5sfpPxoqDyBqbpvTN79-gzGzoHsz', - appKey: '5tkDVulRNyjuAbCUekxU6zHW', + title: "和小浩学编程", + plugins: [ + require('../../lib/autobar.js'), + require('../../lib/Notification.js')], + description: '编程是一件有趣的事情', + // root : "./hell-algorithm", + theme: "reco", + themeConfig: { + logo: '/logo.png', + sidebar: "auto", + searchPlaceholder: "搜索:KMP", + nav: [ + { + text: 'GitHub', + link: 'https://githubd.com/geekxh/hello-algorithm', + icon: 'reco-github' + }, + { + text: 'TimeLine', + link: '/timeline/', + icon: 'reco-date' + } + ], + // 博客配置 + blogConfig: { + tag: { + location: 3, // 在导航栏菜单中所占的位置,默认3 + text: 'Tag' // 默认文案 “标签” + } + }, + head: [ + ['link', {rel: 'shortcut icon', href: '/favicon.ico'}] + ], + type: 'blog', + search: true, + searchMaxSuggestions: 10, + lastUpdated: '文章修订于', + author: '程序员小浩', + authorAvatar: '/code.png', + startYear: '2019', + valineConfig: { + visitor: false, + enable: true, + placeholder: "留下你的问题,或者你想要的资源...", + avatar: "wavatar", + requiredFields: ['nick'], + appId: 'sINkW5sfpPxoqDyBqbpvTN79-gzGzoHsz', + appKey: '5tkDVulRNyjuAbCUekxU6zHW', + }, + noFoundPageByTencent: false }, - noFoundPageByTencent: false - }, - markdown: { - lineNumbers: true, - } + markdown: { + lineNumbers: true, + } } \ No newline at end of file diff --git a/website/.vuepress/theme/LICENSE b/website/.vuepress/theme/LICENSE new file mode 100644 index 00000000..84b7cce6 --- /dev/null +++ b/website/.vuepress/theme/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 reco_luan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/website/.vuepress/theme/README.md b/website/.vuepress/theme/README.md new file mode 100644 index 00000000..2b6d41e4 --- /dev/null +++ b/website/.vuepress/theme/README.md @@ -0,0 +1,88 @@ +

Vue logo

+ +

+ + + + +

+ +## Introduce + +1. 这是一个vuepress主题,旨在添加博客所需的分类、标签墙、分页、评论等功能; +2. 主题追求极简,根据 vuepress 的默认主题修改而成,官方的主题配置仍然适用; +3. 效果:[午后南杂](https://www.recoluan.com) +4. 文档:[vuepress-theme-reco-doc](https://vuepress-theme-reco.recoluan.com) + +## Quick start + +**npx** + +``` +npx @vuepress-reco/theme-cli init my-blog +``` + +**npm** + +```bash +# init +npm install @vuepress-reco/theme-cli -g +theme-cli init my-blog + +# install +cd my-blog +npm install + +# run +npm run dev + +# build +npm run build +``` + +**yarn** + +```bash +# init +yarn global add @vuepress-reco/theme-cli +theme-cli init my-blog + +# install +cd my-blog +yarn install + +# run +yarn dev + +# build +yarn build +``` + +## Preview + +![size.png](https://i.loli.net/2020/01/13/nCbXp13lRG2TNeD.png) + +![style.png](https://i.loli.net/2020/01/13/ke1VirShQRLnEd7.png) + +![dark.png](https://i.loli.net/2020/01/13/Lj6XbwdmDFCYH9k.png) + +![home.png](https://i.loli.net/2020/01/13/nra3kbYSlxojmw4.png) + +## Contributors + +**衷心感谢为此项目贡献过宝贵代码的朋友们** + +|昵称|贡献记录| +|:-:|-| +|[kangxu](https://github.com/kangxukangxu)|[vuepress-theme-reco@0.x](https://github.com/recoluan/vuepress-theme-reco/commit/ec7426a88d50cf8d9f90a7ad9b731a10da7f438b)| +|[Ekko](https://github.com/danranVm)|[vuepress-theme-reco-demo@1.x](https://github.com/recoluan/vuepress-theme-reco-demo/commit/6d2bbe919e7f6564b8c8173558d197e38e024dc5)| + +**衷心感谢美女设计师** + +|昵称|贡献内容| +|:-:|-| +|[Zoey]()|主题图标调整定稿| +|冰冰|主题图标初稿| + +## License +[MIT](https://github.com/recoluan/vuepress-theme-reco/blob/master/LICENSE) diff --git a/website/.vuepress/theme/components/AlgoliaSearchBox.vue b/website/.vuepress/theme/components/AlgoliaSearchBox.vue new file mode 100644 index 00000000..5add0002 --- /dev/null +++ b/website/.vuepress/theme/components/AlgoliaSearchBox.vue @@ -0,0 +1,170 @@ + + + + + diff --git a/website/.vuepress/theme/components/Common.vue b/website/.vuepress/theme/components/Common.vue new file mode 100644 index 00000000..bfcd929d --- /dev/null +++ b/website/.vuepress/theme/components/Common.vue @@ -0,0 +1,268 @@ + + + + + diff --git a/website/.vuepress/theme/components/DropdownLink.vue b/website/.vuepress/theme/components/DropdownLink.vue new file mode 100644 index 00000000..058b3bf5 --- /dev/null +++ b/website/.vuepress/theme/components/DropdownLink.vue @@ -0,0 +1,183 @@ + + + + + diff --git a/website/.vuepress/theme/components/DropdownTransition.vue b/website/.vuepress/theme/components/DropdownTransition.vue new file mode 100644 index 00000000..8c711a15 --- /dev/null +++ b/website/.vuepress/theme/components/DropdownTransition.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/website/.vuepress/theme/components/Footer.vue b/website/.vuepress/theme/components/Footer.vue new file mode 100644 index 00000000..74a98809 --- /dev/null +++ b/website/.vuepress/theme/components/Footer.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/website/.vuepress/theme/components/FriendLink.vue b/website/.vuepress/theme/components/FriendLink.vue new file mode 100644 index 00000000..9d730e5e --- /dev/null +++ b/website/.vuepress/theme/components/FriendLink.vue @@ -0,0 +1,196 @@ + + + + + diff --git a/website/.vuepress/theme/components/Home.vue b/website/.vuepress/theme/components/Home.vue new file mode 100644 index 00000000..4e31d2ce --- /dev/null +++ b/website/.vuepress/theme/components/Home.vue @@ -0,0 +1,241 @@ + + + + + diff --git a/website/.vuepress/theme/components/HomeBlog.vue b/website/.vuepress/theme/components/HomeBlog.vue new file mode 100644 index 00000000..a4ec2dfa --- /dev/null +++ b/website/.vuepress/theme/components/HomeBlog.vue @@ -0,0 +1,350 @@ + + + + + diff --git a/website/.vuepress/theme/components/MobShare.vue b/website/.vuepress/theme/components/MobShare.vue new file mode 100644 index 00000000..afb81e4a --- /dev/null +++ b/website/.vuepress/theme/components/MobShare.vue @@ -0,0 +1,30 @@ + + + + diff --git a/website/.vuepress/theme/components/Mode/ModePicker.vue b/website/.vuepress/theme/components/Mode/ModePicker.vue new file mode 100644 index 00000000..60880d2a --- /dev/null +++ b/website/.vuepress/theme/components/Mode/ModePicker.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/website/.vuepress/theme/components/Mode/applyMode.js b/website/.vuepress/theme/components/Mode/applyMode.js new file mode 100644 index 00000000..a4a0037e --- /dev/null +++ b/website/.vuepress/theme/components/Mode/applyMode.js @@ -0,0 +1,35 @@ +import modeOptions from './modeOptions' + +function render (mode) { + const rootElement = document.querySelector(':root') + const options = modeOptions[mode] + + for (const k in options) { + rootElement.style.setProperty(k, options[k]) + } +} + +/** + * Sets a color scheme for the website. + * If browser supports "prefers-color-scheme", 'auto' mode will respect the setting for light or dark mode + * otherwise it will set a dark theme during night time + */ +export default function applyMode (mode) { + if (mode !== 'auto') { + render(mode) + return + } + + const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches + const isLightMode = window.matchMedia('(prefers-color-scheme: light)').matches + + if (isDarkMode) render('dark') + if (isLightMode) render('light') + + if (!isDarkMode && !isLightMode) { + console.log('You specified no preference for a color scheme or your browser does not support it. I schedule dark mode during night time.') + const hour = new Date().getHours() + if (hour < 6 || hour >= 18) render('dark') + else render('light') + } +} diff --git a/website/.vuepress/theme/components/Mode/index.vue b/website/.vuepress/theme/components/Mode/index.vue new file mode 100755 index 00000000..5f11859e --- /dev/null +++ b/website/.vuepress/theme/components/Mode/index.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/website/.vuepress/theme/components/Mode/modeOptions.js b/website/.vuepress/theme/components/Mode/modeOptions.js new file mode 100644 index 00000000..fe48e9ee --- /dev/null +++ b/website/.vuepress/theme/components/Mode/modeOptions.js @@ -0,0 +1,44 @@ +const modeOptions = { + light: { + '--default-color-10': 'rgba(255, 255, 255, 1)', + '--default-color-9': 'rgba(255, 255, 255, .9)', + '--default-color-8': 'rgba(255, 255, 255, .8)', + '--default-color-7': 'rgba(255, 255, 255, .7)', + '--default-color-6': 'rgba(255, 255, 255, .6)', + '--default-color-5': 'rgba(255, 255, 255, .5)', + '--default-color-4': 'rgba(255, 255, 255, .4)', + '--default-color-3': 'rgba(255, 255, 255, .3)', + '--default-color-2': 'rgba(255, 255, 255, .2)', + '--default-color-1': 'rgba(255, 255, 255, .1)', + '--background-color': '#fff', + '--box-shadow': '0 1px 6px 0 rgba(0, 0, 0, 0.2)', + '--box-shadow-hover': '0 2px 16px 0 rgba(0, 0, 0, 0.2)', + '--text-color': '#242424', + '--text-color-sub': '#7F7F7F', + '--border-color': '#eaecef', + '--code-color': 'rgba(27, 31, 35, 0.05)', + '--mask-color': '#888' + }, + dark: { + '--default-color-10': 'rgba(0, 0, 0, 1)', + '--default-color-9': 'rgba(0, 0, 0, .9)', + '--default-color-8': 'rgba(0, 0, 0, .8)', + '--default-color-7': 'rgba(0, 0, 0, .7)', + '--default-color-6': 'rgba(0, 0, 0, .6)', + '--default-color-5': 'rgba(0, 0, 0, .5)', + '--default-color-4': 'rgba(0, 0, 0, .4)', + '--default-color-3': 'rgba(0, 0, 0, .3)', + '--default-color-2': 'rgba(0, 0, 0, .2)', + '--default-color-1': 'rgba(0, 0, 0, .1)', + '--background-color': '#181818', + '--box-shadow': '0 1px 6px 0 rgba(0, 0, 0, .9)', + '--box-shadow-hover': '0 2px 26px 0 rgba(0, 0, 0, .9)', + '--text-color': 'rgba(255, 255, 255, .8)', + '--text-color-sub': '#8B8B8B', + '--border-color': 'rgba(0, 0, 0, .3)', + '--code-color': 'rgba(0, 0, 0, .3)', + '--mask-color': '#000' + } +} + +export default modeOptions diff --git a/website/.vuepress/theme/components/ModuleTransition.vue b/website/.vuepress/theme/components/ModuleTransition.vue new file mode 100644 index 00000000..5b114f54 --- /dev/null +++ b/website/.vuepress/theme/components/ModuleTransition.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/website/.vuepress/theme/components/NavLink.vue b/website/.vuepress/theme/components/NavLink.vue new file mode 100644 index 00000000..40621a23 --- /dev/null +++ b/website/.vuepress/theme/components/NavLink.vue @@ -0,0 +1,52 @@ + + + diff --git a/website/.vuepress/theme/components/NavLinks.vue b/website/.vuepress/theme/components/NavLinks.vue new file mode 100644 index 00000000..00b52d53 --- /dev/null +++ b/website/.vuepress/theme/components/NavLinks.vue @@ -0,0 +1,188 @@ + + + + + diff --git a/website/.vuepress/theme/components/Navbar.vue b/website/.vuepress/theme/components/Navbar.vue new file mode 100644 index 00000000..ccc87b3c --- /dev/null +++ b/website/.vuepress/theme/components/Navbar.vue @@ -0,0 +1,131 @@ + + + + + diff --git a/website/.vuepress/theme/components/NoteAbstract.vue b/website/.vuepress/theme/components/NoteAbstract.vue new file mode 100644 index 00000000..a6d31b61 --- /dev/null +++ b/website/.vuepress/theme/components/NoteAbstract.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/website/.vuepress/theme/components/NoteAbstractItem.vue b/website/.vuepress/theme/components/NoteAbstractItem.vue new file mode 100644 index 00000000..9e066cfa --- /dev/null +++ b/website/.vuepress/theme/components/NoteAbstractItem.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/website/.vuepress/theme/components/Page.vue b/website/.vuepress/theme/components/Page.vue new file mode 100644 index 00000000..6bf13041 --- /dev/null +++ b/website/.vuepress/theme/components/Page.vue @@ -0,0 +1,282 @@ + + + + + diff --git a/website/.vuepress/theme/components/PageInfo.vue b/website/.vuepress/theme/components/PageInfo.vue new file mode 100644 index 00000000..9caa2b76 --- /dev/null +++ b/website/.vuepress/theme/components/PageInfo.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/website/.vuepress/theme/components/Password.vue b/website/.vuepress/theme/components/Password.vue new file mode 100644 index 00000000..523f75a3 --- /dev/null +++ b/website/.vuepress/theme/components/Password.vue @@ -0,0 +1,327 @@ + + + + + diff --git a/website/.vuepress/theme/components/PersonalInfo.vue b/website/.vuepress/theme/components/PersonalInfo.vue new file mode 100644 index 00000000..036ea1ab --- /dev/null +++ b/website/.vuepress/theme/components/PersonalInfo.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/website/.vuepress/theme/components/SearchBox.vue b/website/.vuepress/theme/components/SearchBox.vue new file mode 100644 index 00000000..365c308c --- /dev/null +++ b/website/.vuepress/theme/components/SearchBox.vue @@ -0,0 +1,238 @@ + + + + + diff --git a/website/.vuepress/theme/components/Sidebar.vue b/website/.vuepress/theme/components/Sidebar.vue new file mode 100644 index 00000000..57f34d7e --- /dev/null +++ b/website/.vuepress/theme/components/Sidebar.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/website/.vuepress/theme/components/SidebarButton.vue b/website/.vuepress/theme/components/SidebarButton.vue new file mode 100644 index 00000000..b8fb4150 --- /dev/null +++ b/website/.vuepress/theme/components/SidebarButton.vue @@ -0,0 +1,27 @@ + + + diff --git a/website/.vuepress/theme/components/SidebarGroup.vue b/website/.vuepress/theme/components/SidebarGroup.vue new file mode 100644 index 00000000..5f726a97 --- /dev/null +++ b/website/.vuepress/theme/components/SidebarGroup.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/website/.vuepress/theme/components/SidebarLink.vue b/website/.vuepress/theme/components/SidebarLink.vue new file mode 100644 index 00000000..7ad741a5 --- /dev/null +++ b/website/.vuepress/theme/components/SidebarLink.vue @@ -0,0 +1,115 @@ + + + diff --git a/website/.vuepress/theme/components/SidebarLinks.vue b/website/.vuepress/theme/components/SidebarLinks.vue new file mode 100644 index 00000000..9d45bfe3 --- /dev/null +++ b/website/.vuepress/theme/components/SidebarLinks.vue @@ -0,0 +1,141 @@ + + + diff --git a/website/.vuepress/theme/components/TagList.vue b/website/.vuepress/theme/components/TagList.vue new file mode 100644 index 00000000..55e3e956 --- /dev/null +++ b/website/.vuepress/theme/components/TagList.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/website/.vuepress/theme/enhanceApp.js b/website/.vuepress/theme/enhanceApp.js new file mode 100644 index 00000000..e325e2bb --- /dev/null +++ b/website/.vuepress/theme/enhanceApp.js @@ -0,0 +1,9 @@ +import postMixin from '@theme/mixins/posts' +import localMixin from '@theme/mixins/locals' + +export default ({ + Vue +}) => { + Vue.mixin(postMixin) + Vue.mixin(localMixin) +} diff --git a/website/.vuepress/theme/global-components/Badge.vue b/website/.vuepress/theme/global-components/Badge.vue new file mode 100644 index 00000000..019ba4d6 --- /dev/null +++ b/website/.vuepress/theme/global-components/Badge.vue @@ -0,0 +1,45 @@ + + + diff --git a/website/.vuepress/theme/helpers/other.js b/website/.vuepress/theme/helpers/other.js new file mode 100644 index 00000000..be543189 --- /dev/null +++ b/website/.vuepress/theme/helpers/other.js @@ -0,0 +1,18 @@ +export function getOneColor () { + const tagColorArr = [ + '#e15b64', + '#f47e60', + '#f8b26a', + '#abbd81', + '#849b87', + '#e15b64', + '#f47e60', + '#f8b26a', + '#f26d6d', + '#67cc86', + '#fb9b5f', + '#3498db' + ] + const index = Math.floor(Math.random() * tagColorArr.length) + return tagColorArr[index] +} diff --git a/website/.vuepress/theme/helpers/postData.js b/website/.vuepress/theme/helpers/postData.js new file mode 100644 index 00000000..95748e29 --- /dev/null +++ b/website/.vuepress/theme/helpers/postData.js @@ -0,0 +1,41 @@ +import { compareDate } from '@theme/helpers/utils' + +// 过滤博客数据 +export function filterPosts (posts, isTimeline) { + posts = posts.filter((item, index) => { + const { title, frontmatter: { home, date, publish }} = item + // 过滤多个分类时产生的重复数据 + if (posts.indexOf(item) !== index) { + return false + } else { + const someConditions = home == true || title == undefined || publish === false + const boo = isTimeline === true + ? !(someConditions || date === undefined) + : !someConditions + return boo + } + }) + return posts +} + +// 排序博客数据 +export function sortPostsByStickyAndDate (posts) { + posts.sort((prev, next) => { + const prevSticky = prev.frontmatter.sticky + const nextSticky = next.frontmatter.sticky + if (prevSticky && nextSticky) { + return prevSticky == nextSticky ? compareDate(prev, next) : (prevSticky - nextSticky) + } else if (prevSticky && !nextSticky) { + return -1 + } else if (!prevSticky && nextSticky) { + return 1 + } + return compareDate(prev, next) + }) +} + +export function sortPostsByDate (posts) { + posts.sort((prev, next) => { + return compareDate(prev, next) + }) +} diff --git a/website/.vuepress/theme/helpers/utils.js b/website/.vuepress/theme/helpers/utils.js new file mode 100644 index 00000000..80c3efcb --- /dev/null +++ b/website/.vuepress/theme/helpers/utils.js @@ -0,0 +1,273 @@ +export const hashRE = /#.*$/ +export const extRE = /\.(md|html)$/ +export const endingSlashRE = /\/$/ +export const outboundRE = /^(https?:|mailto:|tel:)/ + +export function normalize (path) { + return decodeURI(path) + .replace(hashRE, '') + .replace(extRE, '') +} + +export function getHash (path) { + const match = path.match(hashRE) + if (match) { + return match[0] + } +} + +export function isExternal (path) { + return outboundRE.test(path) +} + +export function isMailto (path) { + return /^mailto:/.test(path) +} + +export function isTel (path) { + return /^tel:/.test(path) +} + +export function ensureExt (path) { + if (isExternal(path)) { + return path + } + const hashMatch = path.match(hashRE) + const hash = hashMatch ? hashMatch[0] : '' + const normalized = normalize(path) + + if (endingSlashRE.test(normalized)) { + return path + } + return normalized + '.html' + hash +} + +export function isActive (route, path) { + const routeHash = route.hash + const linkHash = getHash(path) + if (linkHash && routeHash !== linkHash) { + return false + } + const routePath = normalize(route.path) + const pagePath = normalize(path) + return routePath === pagePath +} + +export function resolvePage (pages, rawPath, base) { + if (base) { + rawPath = resolvePath(rawPath, base) + } + const path = normalize(rawPath) + for (let i = 0; i < pages.length; i++) { + if (normalize(pages[i].regularPath) === path) { + return Object.assign({}, pages[i], { + type: 'page', + path: ensureExt(pages[i].path) + }) + } + } + console.error(`[vuepress] No matching page found for sidebar item "${rawPath}"`) + return {} +} + +function resolvePath (relative, base, append) { + const firstChar = relative.charAt(0) + if (firstChar === '/') { + return relative + } + + if (firstChar === '?' || firstChar === '#') { + return base + relative + } + + const stack = base.split('/') + + // remove trailing segment if: + // - not appending + // - appending to trailing slash (last segment is empty) + if (!append || !stack[stack.length - 1]) { + stack.pop() + } + + // resolve relative path + const segments = relative.replace(/^\//, '').split('/') + for (let i = 0; i < segments.length; i++) { + const segment = segments[i] + if (segment === '..') { + stack.pop() + } else if (segment !== '.') { + stack.push(segment) + } + } + + // ensure leading slash + if (stack[0] !== '') { + stack.unshift('') + } + + return stack.join('/') +} + +/** + * @param { Page } page + * @param { string } regularPath + * @param { SiteData } site + * @param { string } localePath + * @returns { SidebarGroup } + */ +export function resolveSidebarItems (page, regularPath, site, localePath) { + const { pages, themeConfig } = site + + const localeConfig = localePath && themeConfig.locales + ? themeConfig.locales[localePath] || themeConfig + : themeConfig + + const pageSidebarConfig = page.frontmatter.sidebar || localeConfig.sidebar || themeConfig.sidebar + if (pageSidebarConfig === 'auto') { + return resolveHeaders(page) + } + + const sidebarConfig = localeConfig.sidebar || themeConfig.sidebar + if (!sidebarConfig) { + return [] + } else { + const { base, config } = resolveMatchingConfig(regularPath, sidebarConfig) + return config + ? config.map(item => resolveItem(item, pages, base)) + : [] + } +} + +/** + * @param { Page } page + * @returns { SidebarGroup } + */ +function resolveHeaders (page) { + const headers = groupHeaders(page.headers || []) + return [{ + type: 'group', + collapsable: false, + title: page.title, + path: null, + children: headers.map(h => ({ + type: 'auto', + title: h.title, + basePath: page.path, + path: page.path + '#' + h.slug, + children: h.children || [] + })) + }] +} + +export function groupHeaders (headers) { + // group h3s under h2 + headers = headers.map(h => Object.assign({}, h)) + let lastH2 + headers.forEach(h => { + if (h.level === 2) { + lastH2 = h + } else if (lastH2) { + (lastH2.children || (lastH2.children = [])).push(h) + } + }) + return headers.filter(h => h.level === 2) +} + +export function resolveNavLinkItem (linkItem) { + return Object.assign(linkItem, { + type: linkItem.items && linkItem.items.length ? 'links' : 'link' + }) +} + +/** + * @param { Route } route + * @param { Array | Array | [link: string]: SidebarConfig } config + * @returns { base: string, config: SidebarConfig } + */ +export function resolveMatchingConfig (regularPath, config) { + if (Array.isArray(config)) { + return { + base: '/', + config: config + } + } + for (const base in config) { + if (ensureEndingSlash(regularPath).indexOf(encodeURI(base)) === 0) { + return { + base, + config: config[base] + } + } + } + return {} +} + +export function formatDate (time, fmt = 'yyyy-MM-dd hh:mm:ss') { + time = time.replace(/-/g, '/') + const date = new Date(time) + if (/(y+)/.test(fmt)) { + fmt = fmt.replace(RegExp.$1, date.getFullYear() + '').substr(4 - RegExp.$1.length) + } + + const o = { + 'M+': date.getMonth() + 1, + 'd+': date.getDate(), + 'h+': date.getHours(), + 'm+': date.getMinutes(), + 's+': date.getSeconds() + } + + for (const key in o) { + if (RegExp(`(${key})`).test(fmt)) { + const str = o[key] + '' + fmt = fmt.replace(RegExp.$1, str.length === 2 ? str : '0' + str) + } + } + return fmt +} + +// 获取时间的数字类型 +export function getTimeNum (date) { + return new Date(date.frontmatter.date).getTime() +} + +// 比对时间 +export function compareDate (a, b) { + return getTimeNum(b) - getTimeNum(a) +} + +function ensureEndingSlash (path) { + return /(\.html|\/)$/.test(path) + ? path + : path + '/' +} + +function resolveItem (item, pages, base, groupDepth = 1) { + if (typeof item === 'string') { + return resolvePage(pages, item, base) + } else if (Array.isArray(item)) { + return Object.assign(resolvePage(pages, item[0], base), { + title: item[1] + }) + } else { + if (groupDepth > 3) { + console.error( + '[vuepress] detected a too deep nested sidebar group.' + ) + } + const children = item.children || [] + if (children.length === 0 && item.path) { + return Object.assign(resolvePage(pages, item.path, base), { + title: item.title + }) + } + return { + type: 'group', + path: item.path, + title: item.title, + sidebarDepth: item.sidebarDepth, + children: children.map(child => resolveItem(child, pages, base, groupDepth + 1)), + collapsable: item.collapsable !== false + } + } +} diff --git a/website/.vuepress/theme/images/home-bg.jpg b/website/.vuepress/theme/images/home-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..02d4a81b4196f5422ddee20ec8787978a28d8c2d GIT binary patch literal 26992 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 S4?VKti`|wDjEcR8>SQ9PPQyEFI0^++Oxh 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 literal 0 HcmV?d00001 diff --git a/website/.vuepress/theme/index.js b/website/.vuepress/theme/index.js new file mode 100644 index 00000000..6835f6d7 --- /dev/null +++ b/website/.vuepress/theme/index.js @@ -0,0 +1,97 @@ +const path = require('path') + +// Theme API. +module.exports = (options, ctx) => ({ + alias () { + const { themeConfig, siteConfig } = ctx + // resolve algolia + const isAlgoliaSearch = ( + themeConfig.algolia || + Object.keys(siteConfig.locales && themeConfig.locales || {}) + .some(base => themeConfig.locales[base].algolia) + ) + return { + '@AlgoliaSearchBox': isAlgoliaSearch + ? path.resolve(__dirname, 'components/AlgoliaSearchBox.vue') + : path.resolve(__dirname, 'noopModule.js'), + '@SearchBox': path.resolve(__dirname, 'components/SearchBox.vue') + } + }, + + plugins: [ + '@vuepress-reco/back-to-top', + '@vuepress-reco/loading-page', + '@vuepress-reco/pagation', + '@vuepress-reco/comments', + '@vuepress/active-header-links', + ['@vuepress/medium-zoom', { + selector: '.theme-reco-content :not(a) > img' + }], + '@vuepress/plugin-nprogress', + ['@vuepress/plugin-blog', { + permalink: '/:regular', + frontmatters: [ + { + id: 'tags', + keys: ['tags'], + path: '/tag/', + layout: 'Tags', + scopeLayout: 'Tag' + }, + { + id: 'categories', + keys: ['categories'], + path: '/categories/', + layout: 'Categories', + scopeLayout: 'Category' + }, + { + id: 'timeline', + keys: ['timeline'], + path: '/timeline/', + layout: 'TimeLines', + scopeLayout: 'TimeLine' + } + ] + }], + ['container', { + type: 'tip', + defaultTitle: { + '/': '', + '/zh/': '提示' + } + }], + ['container', { + type: 'warning', + defaultTitle: { + '/': '', + '/zh/': '注意' + } + }], + ['container', { + type: 'danger', + defaultTitle: { + '/': '', + '/zh/': '警告' + } + }], + ['container', { + type: 'right', + defaultTitle: '' + }], + ['container', { + type: 'theorem', + before: info => `

${info}

`, + after: '
' + }], + ['container', { + type: 'details', + before: info => `
${info ? `${info}` : ''}\n`, + after: () => '
\n', + defaultTitle: { + '/': 'See More', + '/zh/': '更多' + } + }] + ] +}) diff --git a/website/.vuepress/theme/layouts/404.vue b/website/.vuepress/theme/layouts/404.vue new file mode 100644 index 00000000..3b3a22fc --- /dev/null +++ b/website/.vuepress/theme/layouts/404.vue @@ -0,0 +1,69 @@ + + + + + + + + diff --git a/website/.vuepress/theme/layouts/Category.vue b/website/.vuepress/theme/layouts/Category.vue new file mode 100644 index 00000000..71fb8153 --- /dev/null +++ b/website/.vuepress/theme/layouts/Category.vue @@ -0,0 +1,169 @@ + + + + + + + + diff --git a/website/.vuepress/theme/layouts/Layout.vue b/website/.vuepress/theme/layouts/Layout.vue new file mode 100644 index 00000000..8123cbf8 --- /dev/null +++ b/website/.vuepress/theme/layouts/Layout.vue @@ -0,0 +1,41 @@ + + + + + + diff --git a/website/.vuepress/theme/layouts/Tag.vue b/website/.vuepress/theme/layouts/Tag.vue new file mode 100644 index 00000000..7f761c1d --- /dev/null +++ b/website/.vuepress/theme/layouts/Tag.vue @@ -0,0 +1,111 @@ + + + + + + + + diff --git a/website/.vuepress/theme/layouts/Tags.vue b/website/.vuepress/theme/layouts/Tags.vue new file mode 100644 index 00000000..aecf550c --- /dev/null +++ b/website/.vuepress/theme/layouts/Tags.vue @@ -0,0 +1,100 @@ + + + + + + + + diff --git a/website/.vuepress/theme/layouts/TimeLines.vue b/website/.vuepress/theme/layouts/TimeLines.vue new file mode 100644 index 00000000..30dd5f2a --- /dev/null +++ b/website/.vuepress/theme/layouts/TimeLines.vue @@ -0,0 +1,153 @@ + + + + + + + diff --git a/website/.vuepress/theme/lib/vuepress-theme-reco.js b/website/.vuepress/theme/lib/vuepress-theme-reco.js new file mode 100644 index 00000000..ee7a9c3c --- /dev/null +++ b/website/.vuepress/theme/lib/vuepress-theme-reco.js @@ -0,0 +1,7 @@ +'use strict' + +module.exports = vuepressThemeReco + +function vuepressThemeReco () { + // TODO +} diff --git a/website/.vuepress/theme/locals/en.js b/website/.vuepress/theme/locals/en.js new file mode 100644 index 00000000..1d917f24 --- /dev/null +++ b/website/.vuepress/theme/locals/en.js @@ -0,0 +1,8 @@ +export default { + homeBlog: { + article: 'Article', + tag: 'Tag', + category: 'Category', + friendLink: 'Friend Link' + } +} diff --git a/website/.vuepress/theme/locals/index.js b/website/.vuepress/theme/locals/index.js new file mode 100644 index 00000000..05f22191 --- /dev/null +++ b/website/.vuepress/theme/locals/index.js @@ -0,0 +1,7 @@ +import zhHans from './zh-hans.js' +import zhHant from './zh-hant.js' +import en from './en.js' +import ja from './ja.js' +import ko from './ko.js' + +export { zhHans, zhHant, en, ja, ko } diff --git a/website/.vuepress/theme/locals/ja.js b/website/.vuepress/theme/locals/ja.js new file mode 100644 index 00000000..c5b81f8f --- /dev/null +++ b/website/.vuepress/theme/locals/ja.js @@ -0,0 +1,8 @@ +export default { + homeBlog: { + article: '文章', + tag: 'ラベル', + category: '分類', + friendLink: '友情リンク' + } +} diff --git a/website/.vuepress/theme/locals/ko.js b/website/.vuepress/theme/locals/ko.js new file mode 100644 index 00000000..7b53fe35 --- /dev/null +++ b/website/.vuepress/theme/locals/ko.js @@ -0,0 +1,8 @@ +export default { + homeBlog: { + article: '글', + tag: '태그', + category: '분류', + friendLink: '링크 참조' + } +} diff --git a/website/.vuepress/theme/locals/zh-hans.js b/website/.vuepress/theme/locals/zh-hans.js new file mode 100644 index 00000000..adf34dba --- /dev/null +++ b/website/.vuepress/theme/locals/zh-hans.js @@ -0,0 +1,8 @@ +export default { + homeBlog: { + article: '文章', + tag: '标签', + category: '分类', + friendLink: '友情链接' + } +} diff --git a/website/.vuepress/theme/locals/zh-hant.js b/website/.vuepress/theme/locals/zh-hant.js new file mode 100644 index 00000000..e84913f2 --- /dev/null +++ b/website/.vuepress/theme/locals/zh-hant.js @@ -0,0 +1,8 @@ +export default { + homeBlog: { + article: '文章', + tag: '標簽', + category: '分類', + friendLink: '友情鏈接' + } +} diff --git a/website/.vuepress/theme/mixins/index.js b/website/.vuepress/theme/mixins/index.js new file mode 100644 index 00000000..5afa78a9 --- /dev/null +++ b/website/.vuepress/theme/mixins/index.js @@ -0,0 +1,26 @@ +export default { + methods: { + _tagColor () { + const tagColorArr = ['#e15b64', '#f47e60', '#f8b26a', '#abbd81', '#849b87', '#e15b64', '#f47e60', '#f8b26a', '#f26d6d', '#67cc86', '#fb9b5f', '#3498db'] + const index = Math.floor(Math.random() * tagColorArr.length) + return tagColorArr[index] + }, + // 获取当前页码 + _getStoragePage () { + const path = window.location.pathname + const currentPage = JSON.parse(sessionStorage.getItem('currentPage')) + + if (currentPage === null || path !== currentPage.path) { + sessionStorage.setItem('currentPage', { page: 1, path: '' }) + return 1 + } + + return parseInt(currentPage.page) + }, + // 设置当前页码 + _setStoragePage (page) { + const path = window.location.pathname + sessionStorage.setItem('currentPage', JSON.stringify({ page, path })) + } + } +} diff --git a/website/.vuepress/theme/mixins/locals.js b/website/.vuepress/theme/mixins/locals.js new file mode 100644 index 00000000..58abc458 --- /dev/null +++ b/website/.vuepress/theme/mixins/locals.js @@ -0,0 +1,25 @@ +import { zhHans, zhHant, en, ja, ko } from '../locals/index' + +export default { + computed: { + $recoLocals () { + const recoLocals = this.$themeLocaleConfig.recoLocals + if (recoLocals) { + return recoLocals + } + if (/^zh\-(CN|SG)$/.test(this.$lang)) { + return zhHans + } + if (/^zh\-(HK|MO|TW)$/.test(this.$lang)) { + return zhHant + } + if (/^ja\-JP$/.test(this.$lang)) { + return ja + } + if (/^ko\-KR$/.test(this.$lang)) { + return ko + } + return en + } + } +} diff --git a/website/.vuepress/theme/mixins/moduleTransiton.js b/website/.vuepress/theme/mixins/moduleTransiton.js new file mode 100644 index 00000000..42cf101a --- /dev/null +++ b/website/.vuepress/theme/mixins/moduleTransiton.js @@ -0,0 +1,13 @@ +export default { + data () { + return { + recoShowModule: false + } + }, + mounted () { + this.recoShowModule = true + }, + destroyed () { + this.recoShowModule = false + } +} diff --git a/website/.vuepress/theme/mixins/pagination.js b/website/.vuepress/theme/mixins/pagination.js new file mode 100644 index 00000000..dbefecc7 --- /dev/null +++ b/website/.vuepress/theme/mixins/pagination.js @@ -0,0 +1,21 @@ +export default { + methods: { + // 获取当前页码 + _getStoragePage () { + const path = window.location.pathname + const currentPage = JSON.parse(sessionStorage.getItem('currentPage')) + + if (currentPage === null || path !== currentPage.path) { + sessionStorage.setItem('currentPage', { page: 1, path: '' }) + return 1 + } + + return parseInt(currentPage.page) + }, + // 设置当前页码 + _setStoragePage (page) { + const path = window.location.pathname + sessionStorage.setItem('currentPage', JSON.stringify({ page, path })) + } + } +} diff --git a/website/.vuepress/theme/mixins/posts.js b/website/.vuepress/theme/mixins/posts.js new file mode 100644 index 00000000..4c71405b --- /dev/null +++ b/website/.vuepress/theme/mixins/posts.js @@ -0,0 +1,60 @@ +import { filterPosts, sortPostsByStickyAndDate, sortPostsByDate } from '../helpers/postData' + +export default { + computed: { + $recoPosts () { + const { + $categories: { list: articles } + } = this + + let posts = articles.reduce((allData, currentData) => { + return [...allData, ...currentData.pages] + }, []) + + posts = filterPosts(posts, false) + sortPostsByStickyAndDate(posts) + + return posts + }, + $recoPostsForTimeline () { + let pages = this.$recoPosts + const formatPages = {} + const formatPagesArr = [] + pages = filterPosts(pages, true) + this.pages = pages.length == 0 ? [] : pages + for (let i = 0, length = pages.length; i < length; i++) { + const page = pages[i] + const pageDateYear = dateFormat(page.frontmatter.date, 'year') + if (formatPages[pageDateYear]) formatPages[pageDateYear].push(page) + else { + formatPages[pageDateYear] = [page] + } + } + + for (const key in formatPages) { + const data = formatPages[key] + sortPostsByDate(data) + formatPagesArr.unshift({ + year: key, + data + }) + } + + return formatPagesArr + } + } +} + +function renderTime (date) { + var dateee = new Date(date).toJSON() + return new Date(+new Date(dateee) + 8 * 3600 * 1000).toISOString().replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '').replace(/-/g, '/') +} +function dateFormat (date, type) { + date = renderTime(date) + const dateObj = new Date(date) + const year = dateObj.getFullYear() + const mon = dateObj.getMonth() + 1 + const day = dateObj.getDate() + if (type == 'year') return year + else return `${mon}-${day}` +} diff --git a/website/.vuepress/theme/noopModule.js b/website/.vuepress/theme/noopModule.js new file mode 100644 index 00000000..b1c6ea43 --- /dev/null +++ b/website/.vuepress/theme/noopModule.js @@ -0,0 +1 @@ +export default {} diff --git a/website/.vuepress/theme/package.json b/website/.vuepress/theme/package.json new file mode 100644 index 00000000..650d415e --- /dev/null +++ b/website/.vuepress/theme/package.json @@ -0,0 +1,65 @@ +{ + "_args": [ + [ + "vuepress-theme-reco@1.4.5", + "/Users/haolin3/Project/hello-algorithm" + ] + ], + "_development": true, + "_from": "vuepress-theme-reco@1.4.5", + "_id": "vuepress-theme-reco@1.4.5", + "_inBundle": false, + "_integrity": "sha512-6PUIzDIzfs8ZCdnUiPdYuCc1IHpRDuNXvD0RuBCbw8N6LsBsPSJy7aiffcDebjDyOpFFkEzTBDNH1EtVGkbExg==", + "_location": "/vuepress-theme-reco", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "vuepress-theme-reco@1.4.5", + "name": "vuepress-theme-reco", + "escapedName": "vuepress-theme-reco", + "rawSpec": "1.4.5", + "saveSpec": null, + "fetchSpec": "1.4.5" + }, + "_requiredBy": [ + "#DEV:/" + ], + "_resolved": "https://registry.npmjs.org/vuepress-theme-reco/-/vuepress-theme-reco-1.4.5.tgz", + "_spec": "1.4.5", + "_where": "/Users/haolin3/Project/hello-algorithm", + "author": { + "name": "reco_luan" + }, + "bugs": { + "url": "https://github.com/vuepress-reco/vuepress-theme-reco/issues" + }, + "dependencies": { + "@vuepress-reco/vuepress-plugin-back-to-top": "^1.4.0", + "@vuepress-reco/vuepress-plugin-comments": "^1.4.3", + "@vuepress-reco/vuepress-plugin-loading-page": "^1.4.0", + "@vuepress-reco/vuepress-plugin-pagation": "^1.4.0", + "@vuepress/plugin-blog": "1.9.2", + "@vuepress/plugin-medium-zoom": "1.4.1", + "docsearch.js": "2.6.3", + "md5": "2.2.1", + "valine": "1.4.4", + "vue-click-outside": "1.1.0" + }, + "description": "A simple and beautiful vuepress Blog & Doc theme.", + "gitHead": "44f9d0eb140fed40ba3cce815213c978a06faee0", + "homepage": "https://vuepress-theme-reco.recoluan.com/", + "keywords": [ + "vuepress", + "vue", + "theme" + ], + "license": "MIT", + "main": "index.js", + "name": "vuepress-theme-reco", + "repository": { + "type": "git", + "url": "git+https://github.com/vuepress-reco/vuepress-theme-reco.git" + }, + "version": "1.4.5" +} diff --git a/website/.vuepress/theme/styles/arrow.styl b/website/.vuepress/theme/styles/arrow.styl new file mode 100644 index 00000000..d116e1cc --- /dev/null +++ b/website/.vuepress/theme/styles/arrow.styl @@ -0,0 +1,22 @@ +@require './config' + +.arrow + display inline-block + width 0 + height 0 + &.up + border-left 4px solid transparent + border-right 4px solid transparent + border-bottom 6px solid var(--text-color-sub) + &.down + border-left 4px solid transparent + border-right 4px solid transparent + border-top 6px solid var(--text-color-sub) + &.right + border-top 4px solid transparent + border-bottom 4px solid transparent + border-left 6px solid var(--text-color-sub) + &.left + border-top 4px solid transparent + border-bottom 4px solid transparent + border-right 6px solid var(--text-color-sub) diff --git a/website/.vuepress/theme/styles/code.styl b/website/.vuepress/theme/styles/code.styl new file mode 100644 index 00000000..0cfa3c1d --- /dev/null +++ b/website/.vuepress/theme/styles/code.styl @@ -0,0 +1,135 @@ +.content__default + code + color lighten($textColor, 20%) + padding 0.25rem 0.5rem + margin 0 + font-size 0.85em + background-color var(--code-color) + border-radius 3px + .token + &.deleted + color #EC5975 + &.inserted + color $accentColor + +.content__default + pre, pre[class*="language-"] + line-height 1.4 + padding 1.25rem 1.5rem + margin 0.85rem 0 + background-color $codeBgColor + border-radius 6px + overflow auto + code + color #fff + padding 0 + background-color transparent + border-radius 0 + +div[class*="language-"] + position relative + background-color $codeBgColor + border-radius 6px + .highlight-lines + user-select none + padding-top 1.3rem + position absolute + top 0 + left 0 + width 100% + line-height 1.4 + .highlighted + background-color rgba(0, 0, 0, 66%) + pre, pre[class*="language-"] + background transparent + position relative + z-index 1 + &::before + position absolute + z-index 3 + top 0.8em + right 1em + font-size 0.75rem + color rgba(255, 255, 255, 0.4) + &:not(.line-numbers-mode) + .line-numbers-wrapper + display none + &.line-numbers-mode + .highlight-lines .highlighted + position relative + &:before + content ' ' + position absolute + z-index 3 + left 0 + top 0 + display block + width $lineNumbersWrapperWidth + height 100% + background-color rgba(0, 0, 0, 66%) + pre + padding-left $lineNumbersWrapperWidth + 1 rem + vertical-align middle + .line-numbers-wrapper + position absolute + top 0 + width $lineNumbersWrapperWidth + text-align center + color rgba(255, 255, 255, 0.3) + padding 1.25rem 0 + line-height 1.4 + br + user-select none + .line-number + position relative + z-index 4 + user-select none + font-size 0.85em + &::after + content '' + position absolute + z-index 2 + top 0 + left 0 + width $lineNumbersWrapperWidth + height 100% + border-radius 6px 0 0 6px + border-right 1px solid rgba(0, 0, 0, 66%) + background-color $codeBgColor + + +for lang in $codeLang + div{'[class~="language-' + lang + '"]'} + &:before + content ('' + lang) + +div[class~="language-javascript"] + &:before + content "js" + +div[class~="language-typescript"] + &:before + content "ts" + +div[class~="language-markup"] + &:before + content "html" + +div[class~="language-markdown"] + &:before + content "md" + +div[class~="language-json"]:before + content "json" + +div[class~="language-ruby"]:before + content "rb" + +div[class~="language-python"]:before + content "py" + +div[class~="language-bash"]:before + content "sh" + +div[class~="language-php"]:before + content "php" diff --git a/website/.vuepress/theme/styles/custom-blocks.styl b/website/.vuepress/theme/styles/custom-blocks.styl new file mode 100644 index 00000000..54c564ec --- /dev/null +++ b/website/.vuepress/theme/styles/custom-blocks.styl @@ -0,0 +1,51 @@ +.custom-block + .custom-block-title + font-weight 600 + margin-bottom -0.4rem + &.tip, &.warning, &.danger + padding .1rem 1.5rem + border-left-width .5rem + border-left-style solid + margin 1rem 0 + &.tip + background-color var(--code-color) + border-color #67cc86 + .custom-block-title + color #67cc86 + &.warning + background-color var(--code-color) + border-color #fb9b5f + .custom-block-title + color #fb9b5f + &.danger + background-color var(--code-color) + border-color #f26d6d + .custom-block-title + color #f26d6d + &.right + color transparentify($textColor, 0.4) + font-size 0.9rem + text-align right + &.theorem + margin 1rem 0 + padding .1rem 1.5rem + border-radius 0.4rem + background-color var(--code-color) + .title + font-weight bold + &.details + display block + position relative + border-radius 2px + margin 1em 0 + padding 1rem + background-color var(--code-color) + h4 + margin-top 0 + figure, p + &:last-child + margin-bottom 0 + padding-bottom 0 + summary + outline none + cursor pointer diff --git a/website/.vuepress/theme/styles/iconfont.css b/website/.vuepress/theme/styles/iconfont.css new file mode 100644 index 00000000..63028ad1 --- /dev/null +++ b/website/.vuepress/theme/styles/iconfont.css @@ -0,0 +1,174 @@ +@font-face { + font-family:"iconfont"; + src: url('http://at.alicdn.com/t/font_1030519_ookn0nnv0z8.eot?t=1574737898757'); + /* IE9 */ + src: url('http://at.alicdn.com/t/font_1030519_ookn0nnv0z8.eot?t=1574737898757#iefix') format('embedded-opentype'), + /* IE6-IE8 */ + url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'), url('http://at.alicdn.com/t/font_1030519_ookn0nnv0z8.woff?t=1574737898757') format('woff'), url('http://at.alicdn.com/t/font_1030519_ookn0nnv0z8.ttf?t=1574737898757') format('truetype'), + /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ + url('http://at.alicdn.com/t/font_1030519_ookn0nnv0z8.svg?t=1574737898757#iconfont') format('svg'); + /* iOS 4.1- */ +} +.iconfont { + font-family:"iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.reco-douban:before { + content:"\e603"; +} +.reco-wechat:before { + content:"\e720"; +} +.reco-color:before { + content:"\eae9"; +} +.reco-blog:before { + content:"\e61d"; +} +.reco-sf:before { + content:"\e610"; +} +.reco-message:before { + content:"\e634"; +} +.reco-eye:before { + content:"\e669"; +} +.reco-search:before { + content:"\e611"; +} +.reco-category:before { + content:"\e61e"; +} +.reco-npm:before { + content:"\e88d"; +} +.reco-menu:before { + content:"\e67c"; +} +.reco-suggestion:before { + content:"\e608"; +} +.reco-coding:before { + content:"\e601"; +} +.reco-github:before { + content:"\e628"; +} +.reco-mail:before { + content:"\e624"; +} +.reco-other:before { + content:"\e60e"; +} +.reco-home:before { + content:"\e65b"; +} +.reco-document:before { + content:"\e67a"; +} +.reco-huawei:before { + content:"\e6b9"; +} +.reco-up:before { + content:"\e68b"; +} +.reco-weibo:before { + content:"\e612"; +} +.reco-lock:before { + content:"\e60f"; +} +.reco-fullscreen:before { + content:"\e602"; +} +.reco-tag:before { + content:"\e633"; +} +.reco-date:before { + content:"\e63b"; +} +.reco-jianshu:before { + content:"\e60c"; +} +.reco-friend:before { + content:"\e62f"; +} +.reco-bokeyuan:before { + content:"\e626"; +} +.reco-beian:before { + content:"\e667"; +} +.reco-copyright:before { + content:"\ef87"; +} +.reco-rss:before { + content:"\f09d"; +} +.reco-bilibili:before { + content:"\e630"; +} +.reco-account:before { + content:"\e607"; +} +.reco-qq:before { + content:"\e67b"; +} +.reco-theme:before { + content:"\e7e8"; +} +.reco-three:before { + content:"\e644"; +} +.reco-gitlab:before { + content:"\e63c"; +} +.reco-api:before { + content:"\e662"; +} +.reco-mayun:before { + content:"\e6d0"; +} +.reco-zhihu:before { + content:"\e605"; +} +.reco-facebook:before { + content:"\e606"; +} +.reco-taobao:before { + content:"\e6a5"; +} +.reco-tongzhi:before { + content:"\e764"; +} +.reco-douyin:before { + content:"\e654"; +} +.reco-v2ex:before { + content:"\e62a"; +} +.reco-sticky:before { + content:"\e62b"; +} +.reco-toutiao:before { + content:"\e6b7"; +} +.reco-linkedin:before { + content:"\e668"; +} +.reco-faq:before { + content:"\e643"; +} +.reco-twitter:before { + content:"\e60b"; +} +.reco-csdn:before { + content:"\e609"; +} +.reco-juejin:before { + content:"\e613"; +} diff --git a/website/.vuepress/theme/styles/mobile.styl b/website/.vuepress/theme/styles/mobile.styl new file mode 100644 index 00000000..cb44a7d7 --- /dev/null +++ b/website/.vuepress/theme/styles/mobile.styl @@ -0,0 +1,39 @@ +// @require './config' + +$mobileSidebarWidth = $sidebarWidth * 0.82 + +// narrow desktop / iPad +@media (max-width: $MQNarrow) + .sidebar + font-size 15px + width $mobileSidebarWidth + .page, .password-wrapper-in + margin-left $mobileSidebarWidth + +// wide mobile +@media (max-width: $MQMobile) + .sidebar + top 0 + padding-top $navbarHeight + transform translateX(-100%) + transition transform .2s ease + .page, .password-wrapper-in + margin-left 0 + .theme-container + &.sidebar-open + .sidebar + transform translateX(0) + &.no-navbar + .sidebar + padding-top: 0 + .password-shadow + padding-left 0 + +// narrow mobile +@media (max-width: $MQMobileNarrow) + h1 + font-size 1.9rem + .content__default + div[class*="language-"] + margin 0.85rem -1.5rem + border-radius 0 diff --git a/website/.vuepress/theme/styles/mode.styl b/website/.vuepress/theme/styles/mode.styl new file mode 100644 index 00000000..c74ac858 --- /dev/null +++ b/website/.vuepress/theme/styles/mode.styl @@ -0,0 +1,38 @@ +:root + --default-color-10 $lightColor10 + --default-color-9 $lightColor9 + --default-color-8 $lightColor8 + --default-color-7 $lightColor7 + --default-color-6 $lightColor6 + --default-color-5 $lightColor5 + --default-color-4 $lightColor4 + --default-color-3 $lightColor3 + --default-color-2 $lightColor2 + --default-color-1 $lightColor1 + --background-color $backgroundColor + --box-shadow $boxShadow + --box-shadow-hover $boxShadowHover + --text-color $textColor + --text-color-sub $textColorSub + --border-color $borderColor + --code-color $codeColor + --mask-color $maskColor + @media (prefers-color-scheme: dark) + --default-color-10 $darkColor10 + --default-color-9 $darkColor9 + --default-color-8 $darkColor8 + --default-color-7 $darkColor7 + --default-color-6 $darkColor6 + --default-color-5 $darkColor5 + --default-color-4 $darkColor4 + --default-color-3 $darkColor3 + --default-color-2 $darkColor2 + --default-color-1 $darkColor1 + --background-color $backgroundColorDark + --box-shadow $boxShadowDark + --box-shadow-hover $boxShadowHoverDark + --text-color $textColorDark + --text-color-sub $textColorSubDark + --border-color $borderColorDark + --code-color $codeColorDark + --mask-color $maskColorDark diff --git a/website/.vuepress/theme/styles/palette.styl b/website/.vuepress/theme/styles/palette.styl new file mode 100644 index 00000000..a0dfaa83 --- /dev/null +++ b/website/.vuepress/theme/styles/palette.styl @@ -0,0 +1,47 @@ +$darkColor10 = rgba(0, 0, 0, 1) +$darkColor9 = rgba(0, 0, 0, .9) +$darkColor8 = rgba(0, 0, 0, .8) +$darkColor7 = rgba(0, 0, 0, .7) +$darkColor6 = rgba(0, 0, 0, .6) +$darkColor5 = rgba(0, 0, 0, .5) +$darkColor4 = rgba(0, 0, 0, .4) +$darkColor3 = rgba(0, 0, 0, .3) +$darkColor2 = rgba(0, 0, 0, .2) +$darkColor1 = rgba(0, 0, 0, .1) + +$lightColor10 = rgba(255, 255, 255, 1) +$lightColor9 = rgba(255, 255, 255, .9) +$lightColor8 = rgba(255, 255, 255, .8) +$lightColor7 = rgba(255, 255, 255, .7) +$lightColor6 = rgba(255, 255, 255, .6) +$lightColor5 = rgba(255, 255, 255, .5) +$lightColor4 = rgba(255, 255, 255, .4) +$lightColor3 = rgba(255, 255, 255, .3) +$lightColor2 = rgba(255, 255, 255, .2) +$lightColor1 = rgba(255, 255, 255, .1) + +$textShadow = 0 2px 4px $darkColor1; +$borderRadius = .25rem +$lineNumbersWrapperWidth = 2.5rem + +$backgroundColor ?= #fff +$backgroundColorDark ?= #181818 + +$boxShadow = 0 1px 6px 0 $darkColor2 +$boxShadowHover = 0 2px 16px 0 $darkColor2 +$boxShadowDark = 0 1px 6px 0 $darkColor6 +$boxShadowHoverDark = 0 2px 16px 0 $darkColor6 + +$textColor ?= #242424 +$textColorDark ?= $lightColor8 +$textColorSub = #7F7F7F +$textColorSubDark = #8B8B8B + +$borderColor ?= #eaecef +$borderColorDark ?= $darkColor3 + +$codeColor ?= rgba(27, 31, 35, 0.05) +$codeColorDark ?= $darkColor3 + +$maskColor ?= #888 +$maskColorDark ?= #000 diff --git a/website/.vuepress/theme/styles/theme.styl b/website/.vuepress/theme/styles/theme.styl new file mode 100644 index 00000000..535eb7e3 --- /dev/null +++ b/website/.vuepress/theme/styles/theme.styl @@ -0,0 +1,226 @@ +@require './mode' +@require './code' +@require './custom-blocks' +@require './arrow' +@require './wrapper' +@require './toc' +@require './iconfont.css' + +html, body + padding 0 + margin 0 +body + font-family Ubuntu, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif + -webkit-font-smoothing antialiased + -moz-osx-font-smoothing grayscale + font-size 15px + color var(--text-color) + background-color var(--background-color) + +.page, .password-wrapper-in + overflow-x: hidden + margin-left $sidebarWidth + +.navbar + position fixed + z-index 20 + top 0 + left 0 + right 0 + height $navbarHeight + box-sizing border-box + +.sidebar-mask + position fixed + z-index 9 + top 0 + left 0 + width 100vw + height 100vh + display none + background-color: rgba(0,0,0,.65); + +.sidebar + font-size 16px + background-color var(--background-color) + width $sidebarWidth + position fixed + z-index 10 + margin 0 + top $navbarHeight + left 0 + bottom 0 + box-sizing border-box + border-right 1px solid var(--border-color) + overflow-y auto + +.content__default:not(.custom) + @extend $wrapper + // > *:first-child + // margin-top 1.6rem + a:hover + text-decoration underline + p.demo + padding 1rem 1.5rem + border 1px solid #ddd + border-radius 4px + img + max-width 100% + +.content__default.custom + padding 0 + margin 0 + img + max-width 100% + +a + font-weight 500 + color $accentColor + text-decoration none + +p a code + font-weight 400 + color $accentColor + +kbd + background #eee + border solid 0.15rem #ddd + border-bottom solid 0.25rem #ddd + border-radius 0.15rem + padding 0 0.15em + +blockquote + font-size .9rem + color #999 + border-left .25rem solid #999 + background-color var(--code-color) + margin 0.5rem 0 + padding .25rem 0 .25rem 1rem + & > p + margin 0 + +ul, ol + padding-left 1.2em + +strong + font-weight 600 + +h1, h2, h3, h4, h5, h6 + font-weight 500 + line-height 1.25 + .content__default:not(.custom) > & + margin-top (0.5rem - $navbarHeight) + padding-top ($navbarHeight + 1rem) + margin-bottom 0 + &:first-child + margin-top -3.5rem + margin-bottom 1rem + + p, + pre, + .custom-block + margin-top 2rem + &:hover .header-anchor + opacity: 1 + +h1 + font-size 1.6rem + +h2 + font-size 1.4rem + padding-bottom .3rem + border-bottom 1px solid var(--border-color) + +h3 + font-size 1.2rem + +a.header-anchor + font-size 0.85em + float left + margin-left -0.87em + padding-right 0.23em + margin-top 0.125em + opacity 0 + &:hover + text-decoration none + +code, kbd, .line-number + font-family source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace + +p, ul, ol + line-height 1.7 + +hr + border 0 + border-top 1px solid var(--border-color) + +table + border-collapse collapse + margin 1rem 0 + display: block + overflow-x: auto + +tr + border-top 1px solid var(--border-color) + &:nth-child(2n) + background-color var(--code-color) + +th, td + border 1px solid var(--border-color) + padding .6em 1em + +.theme-container + &.sidebar-open + .sidebar-mask + display: block + &.no-navbar + .content__default:not(.custom) > h1, h2, h3, h4, h5, h6 + margin-top 1.5rem + padding-top 0 + .sidebar + top 0 + +@media (min-width: ($MQMobile + 1px)) + .theme-container.no-sidebar + .sidebar + display none + .page, .password-wrapper-in + margin-left 0 + +@require 'mobile.styl' + +.iconfont + font-size: 0.9rem; + color: var(--text-color-sub); + +/************** 滚动条 **************/ +::-webkit-scrollbar + width: 5px; + height: 5px; + +::-webkit-scrollbar-track-piece + // background-color: rgba(0, 0, 0, 0.2); + +::-webkit-scrollbar-thumb:vertical + height: 5px; + background-color: $accentColor; + +::-webkit-scrollbar-thumb:horizontal + width: 5px; + background-color: $accentColor; + +/************** 流程图的滚动条 **************/ +.vuepress-flowchart + overflow: auto + +/************** SW-Update Popup **************/ + +.sw-update-popup + border-radius: $borderRadius!important; + box-shadow: var(--box-shadow)!important; + color: var(--text-color)!important; + background: var(--background-color)!important; + border: none!important; + > button + background: $accentColor; + border-radius: $borderRadius; + color: #fff; + -webkit-tap-highlight-color:rgba(0, 0, 0, 0) + border: none; diff --git a/website/.vuepress/theme/styles/toc.styl b/website/.vuepress/theme/styles/toc.styl new file mode 100644 index 00000000..d3e71069 --- /dev/null +++ b/website/.vuepress/theme/styles/toc.styl @@ -0,0 +1,3 @@ +.table-of-contents + .badge + vertical-align middle diff --git a/website/.vuepress/theme/styles/wrapper.styl b/website/.vuepress/theme/styles/wrapper.styl new file mode 100644 index 00000000..a99262c7 --- /dev/null +++ b/website/.vuepress/theme/styles/wrapper.styl @@ -0,0 +1,9 @@ +$wrapper + max-width $contentWidth + margin 0 auto + padding 2rem 2.5rem + @media (max-width: $MQNarrow) + padding 2rem + @media (max-width: $MQMobileNarrow) + padding 1.5rem + diff --git a/website/README.md b/website/README.md index a03eab9e..c5f7a3d5 100644 --- a/website/README.md +++ b/website/README.md @@ -1,5 +1,13 @@ ---- -title: 奥利给 ---- +# 这是你的主页 -这是一个彩蛋。 \ No newline at end of file +--- +home: true +heroImage: /hero.png +heroImageStyle: { + maxHeight: '200px', + display: block, + margin: '6rem auto 1.5rem', + borderRadius: '50%', + boxShadow: '0 5px 18px rgba(0,0,0,0.2)' +} +--- \ No newline at end of file