From 2b75680031ef3645c7cf95b07cfba788ab2bb804 Mon Sep 17 00:00:00 2001 From: reco_luan Date: Mon, 15 Apr 2019 10:35:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B01.x?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE | 21 +++ README.md | 41 +++++ components/AlgoliaSearchBox.vue | 155 ++++++++++++++++ components/BackToTop.vue | 109 +++++++++++ components/Background.vue | 118 ++++++++++++ components/Common.vue | 152 +++++++++++++++ components/DropdownLink.vue | 181 ++++++++++++++++++ components/DropdownTransition.vue | 33 ++++ components/Home.vue | 285 +++++++++++++++++++++++++++++ components/NavLink.vue | 52 ++++++ components/NavLinks.vue | 181 ++++++++++++++++++ components/Navbar.vue | 125 +++++++++++++ components/NoteAbstract.vue | 84 +++++++++ components/Pagation.vue | 157 ++++++++++++++++ components/Page.vue | 284 ++++++++++++++++++++++++++++ components/PageInfo.vue | 68 +++++++ components/Password.vue | 283 ++++++++++++++++++++++++++++ components/Sidebar.vue | 59 ++++++ components/SidebarButton.vue | 27 +++ components/SidebarGroup.vue | 129 +++++++++++++ components/SidebarLink.vue | 109 +++++++++++ components/SidebarLinks.vue | 86 +++++++++ components/Theme/ThemeOptions.vue | 124 +++++++++++++ components/Theme/index.vue | 140 ++++++++++++++ components/Theme/recoConfig.js | 22 +++ components/TimeLine.vue | 189 +++++++++++++++++++ components/Valine/AccessNumber.vue | 24 +++ components/Valine/index.vue | 83 +++++++++ fonts/iconfont.css | 109 +++++++++++ fonts/iconfont.eot | Bin 0 -> 6376 bytes fonts/iconfont.svg | 95 ++++++++++ fonts/iconfont.ttf | Bin 0 -> 6208 bytes fonts/iconfont.woff | Bin 0 -> 4260 bytes fonts/iconfont.woff2 | Bin 0 -> 3556 bytes global-components/Badge.vue | 44 +++++ index.js | 46 +++++ layouts/404.vue | 28 +++ layouts/Category.vue | 93 ++++++++++ layouts/Layout.vue | 42 +++++ layouts/Tags.vue | 129 +++++++++++++ noopModule.js | 1 + package.json | 32 ++++ styles/arrow.styl | 22 +++ styles/code.styl | 135 ++++++++++++++ styles/colorMode/colorMixin.styl | 55 ++++++ styles/colorMode/colorMode.styl | 17 ++ styles/colorMode/index.styl | 2 + styles/colorMode/nightMode.styl | 114 ++++++++++++ styles/custom-blocks.styl | 30 +++ styles/loadMixin.styl | 11 ++ styles/mobile.styl | 37 ++++ styles/recoConfig.styl | 3 + styles/theme.styl | 215 ++++++++++++++++++++++ styles/toc.styl | 3 + styles/wrapper.styl | 9 + util/index.js | 239 ++++++++++++++++++++++++ 56 files changed, 4832 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 components/AlgoliaSearchBox.vue create mode 100644 components/BackToTop.vue create mode 100644 components/Background.vue create mode 100644 components/Common.vue create mode 100644 components/DropdownLink.vue create mode 100644 components/DropdownTransition.vue create mode 100644 components/Home.vue create mode 100644 components/NavLink.vue create mode 100644 components/NavLinks.vue create mode 100644 components/Navbar.vue create mode 100644 components/NoteAbstract.vue create mode 100644 components/Pagation.vue create mode 100644 components/Page.vue create mode 100644 components/PageInfo.vue create mode 100644 components/Password.vue create mode 100644 components/Sidebar.vue create mode 100644 components/SidebarButton.vue create mode 100644 components/SidebarGroup.vue create mode 100644 components/SidebarLink.vue create mode 100644 components/SidebarLinks.vue create mode 100755 components/Theme/ThemeOptions.vue create mode 100755 components/Theme/index.vue create mode 100755 components/Theme/recoConfig.js create mode 100644 components/TimeLine.vue create mode 100644 components/Valine/AccessNumber.vue create mode 100644 components/Valine/index.vue create mode 100644 fonts/iconfont.css create mode 100644 fonts/iconfont.eot create mode 100644 fonts/iconfont.svg create mode 100644 fonts/iconfont.ttf create mode 100644 fonts/iconfont.woff create mode 100644 fonts/iconfont.woff2 create mode 100644 global-components/Badge.vue create mode 100644 index.js create mode 100644 layouts/404.vue create mode 100644 layouts/Category.vue create mode 100644 layouts/Layout.vue create mode 100644 layouts/Tags.vue create mode 100644 noopModule.js create mode 100644 package.json create mode 100644 styles/arrow.styl create mode 100644 styles/code.styl create mode 100644 styles/colorMode/colorMixin.styl create mode 100644 styles/colorMode/colorMode.styl create mode 100644 styles/colorMode/index.styl create mode 100644 styles/colorMode/nightMode.styl create mode 100644 styles/custom-blocks.styl create mode 100644 styles/loadMixin.styl create mode 100644 styles/mobile.styl create mode 100644 styles/recoConfig.styl create mode 100644 styles/theme.styl create mode 100644 styles/toc.styl create mode 100644 styles/wrapper.styl create mode 100644 util/index.js diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..84b7cce --- /dev/null +++ b/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/README.md b/README.md new file mode 100644 index 0000000..3ced62e --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +# vuepress-theme-reco + +![vuepress](https://img.shields.io/badge/vuepress-0.14.8-brightgreen.svg) +![leancloud-storage](https://img.shields.io/badge/leancloud--storage-3.10.1-orange.svg) +![valine](https://img.shields.io/badge/valine-1.3.4-blue.svg) + +> 1. 这是一个vuepress主题,旨在添加博客所需的分类、TAB墙、分页、评论等能; +> 2. 主题追求极简,根据 vuepress 的默认主题修改而成,官方的主题配置仍然适用; +> 3. 效果:[午后南杂](http://recoluan.gitlab.io) +> 4. 文档:[vuepress-theme-reco-doc](https://recoluan.gitlab.io/vuepress-theme-reco-doc) + +## 预览 + +### 首页 +![home.png](https://upload-images.jianshu.io/upload_images/4660406-0bf9d91e9d289f75.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + + +### 分类页面 +![category.png](https://upload-images.jianshu.io/upload_images/4660406-8c7995d750c58536.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + + +### 标签页 +![tag.png](https://upload-images.jianshu.io/upload_images/4660406-39c0d47627869e3a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + + +### 文章页面 +![article.png](https://upload-images.jianshu.io/upload_images/4660406-a19cad487991409d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +### 加密登录页 + +![password.png](https://upload-images.jianshu.io/upload_images/4660406-7d38dc78c16b7d48.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +### 时间轴 + +![timeline.png](https://upload-images.jianshu.io/upload_images/4660406-1dc5a5fe6c03952e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +### 移动端 +![m.png](https://upload-images.jianshu.io/upload_images/4660406-7e2c78c48dd78284.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +## License +[MIT](https://github.com/recoluan/vuepress-theme-reco/blob/master/LICENSE) \ No newline at end of file diff --git a/components/AlgoliaSearchBox.vue b/components/AlgoliaSearchBox.vue new file mode 100644 index 0000000..41b62af --- /dev/null +++ b/components/AlgoliaSearchBox.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/components/BackToTop.vue b/components/BackToTop.vue new file mode 100644 index 0000000..7d05abb --- /dev/null +++ b/components/BackToTop.vue @@ -0,0 +1,109 @@ + + + + + \ No newline at end of file diff --git a/components/Background.vue b/components/Background.vue new file mode 100644 index 0000000..d75fdd6 --- /dev/null +++ b/components/Background.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/components/Common.vue b/components/Common.vue new file mode 100644 index 0000000..af1f360 --- /dev/null +++ b/components/Common.vue @@ -0,0 +1,152 @@ + + + diff --git a/components/DropdownLink.vue b/components/DropdownLink.vue new file mode 100644 index 0000000..f859857 --- /dev/null +++ b/components/DropdownLink.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/components/DropdownTransition.vue b/components/DropdownTransition.vue new file mode 100644 index 0000000..8c711a1 --- /dev/null +++ b/components/DropdownTransition.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/components/Home.vue b/components/Home.vue new file mode 100644 index 0000000..2ee1f3e --- /dev/null +++ b/components/Home.vue @@ -0,0 +1,285 @@ + + + + + diff --git a/components/NavLink.vue b/components/NavLink.vue new file mode 100644 index 0000000..6c71577 --- /dev/null +++ b/components/NavLink.vue @@ -0,0 +1,52 @@ + + + diff --git a/components/NavLinks.vue b/components/NavLinks.vue new file mode 100644 index 0000000..7c4d3cd --- /dev/null +++ b/components/NavLinks.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/components/Navbar.vue b/components/Navbar.vue new file mode 100644 index 0000000..aae224a --- /dev/null +++ b/components/Navbar.vue @@ -0,0 +1,125 @@ + + + + + diff --git a/components/NoteAbstract.vue b/components/NoteAbstract.vue new file mode 100644 index 0000000..a87064a --- /dev/null +++ b/components/NoteAbstract.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/components/Pagation.vue b/components/Pagation.vue new file mode 100644 index 0000000..6faabdd --- /dev/null +++ b/components/Pagation.vue @@ -0,0 +1,157 @@ + + + + + diff --git a/components/Page.vue b/components/Page.vue new file mode 100644 index 0000000..8c622f3 --- /dev/null +++ b/components/Page.vue @@ -0,0 +1,284 @@ + + + + + diff --git a/components/PageInfo.vue b/components/PageInfo.vue new file mode 100644 index 0000000..3dba962 --- /dev/null +++ b/components/PageInfo.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/components/Password.vue b/components/Password.vue new file mode 100644 index 0000000..13d1deb --- /dev/null +++ b/components/Password.vue @@ -0,0 +1,283 @@ + + + + + \ No newline at end of file diff --git a/components/Sidebar.vue b/components/Sidebar.vue new file mode 100644 index 0000000..62f1286 --- /dev/null +++ b/components/Sidebar.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/components/SidebarButton.vue b/components/SidebarButton.vue new file mode 100644 index 0000000..b8fb415 --- /dev/null +++ b/components/SidebarButton.vue @@ -0,0 +1,27 @@ + + + diff --git a/components/SidebarGroup.vue b/components/SidebarGroup.vue new file mode 100644 index 0000000..da7b5e8 --- /dev/null +++ b/components/SidebarGroup.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/components/SidebarLink.vue b/components/SidebarLink.vue new file mode 100644 index 0000000..7d128b4 --- /dev/null +++ b/components/SidebarLink.vue @@ -0,0 +1,109 @@ + + + diff --git a/components/SidebarLinks.vue b/components/SidebarLinks.vue new file mode 100644 index 0000000..dfdb0be --- /dev/null +++ b/components/SidebarLinks.vue @@ -0,0 +1,86 @@ + + + diff --git a/components/Theme/ThemeOptions.vue b/components/Theme/ThemeOptions.vue new file mode 100755 index 0000000..198bfae --- /dev/null +++ b/components/Theme/ThemeOptions.vue @@ -0,0 +1,124 @@ + + + + + diff --git a/components/Theme/index.vue b/components/Theme/index.vue new file mode 100755 index 0000000..65061bf --- /dev/null +++ b/components/Theme/index.vue @@ -0,0 +1,140 @@ + + + + + diff --git a/components/Theme/recoConfig.js b/components/Theme/recoConfig.js new file mode 100755 index 0000000..05fa129 --- /dev/null +++ b/components/Theme/recoConfig.js @@ -0,0 +1,22 @@ +export default { + data() { + return { + reco: {}, + colors: { + blue: '#2196f3', + red: '#f26d6d', + green: '#3eaf7c', + orange: '#fb9b5f' + } + }; + }, + + mounted() { + this.reco = { + themes: ['blue', 'red', 'green', 'orange'], + disableDarkTheme: false + }; + + this.reco.hasThemes = this.$site.themeConfig.themePicker || true + }, +}; diff --git a/components/TimeLine.vue b/components/TimeLine.vue new file mode 100644 index 0000000..0a47c3b --- /dev/null +++ b/components/TimeLine.vue @@ -0,0 +1,189 @@ + + + + + diff --git a/components/Valine/AccessNumber.vue b/components/Valine/AccessNumber.vue new file mode 100644 index 0000000..4cb0ab5 --- /dev/null +++ b/components/Valine/AccessNumber.vue @@ -0,0 +1,24 @@ + + + + + + diff --git a/components/Valine/index.vue b/components/Valine/index.vue new file mode 100644 index 0000000..a33051e --- /dev/null +++ b/components/Valine/index.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/fonts/iconfont.css b/fonts/iconfont.css new file mode 100644 index 0000000..080d647 --- /dev/null +++ b/fonts/iconfont.css @@ -0,0 +1,109 @@ +@font-face {font-family: "iconfont"; + src: url('iconfont.eot?t=1555230336940'); /* IE9 */ + src: url('iconfont.eot?t=1555230336940#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'), + url('iconfont.woff?t=1555230336940') format('woff'), + url('iconfont.ttf?t=1555230336940') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ + url('iconfont.svg?t=1555230336940#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-color:before { + content: "\eae9"; +} + +.reco-message:before { + content: "\e634"; +} + +.reco-eye:before { + content: "\e669"; +} + +.reco-search:before { + content: "\e611"; +} + +.reco-category:before { + content: "\e61e"; +} + +.reco-wechat:before { + content: "\e615"; +} + +.reco-npm:before { + content: "\e88d"; +} + +.reco-twitter:before { + content: "\e609"; +} + +.reco-csdn:before { + content: "\e60d"; +} + +.reco-menu:before { + content: "\e67c"; +} + +.reco-github:before { + content: "\e628"; +} + +.reco-qq:before { + content: "\e60a"; +} + +.reco-other:before { + content: "\e60e"; +} + +.reco-home:before { + content: "\e65b"; +} + +.reco-up:before { + content: "\e68b"; +} + +.reco-tag:before { + content: "\e633"; +} + +.reco-date:before { + content: "\e63b"; +} + +.reco-bokeyuan:before { + content: "\e626"; +} + +.reco-copyright:before { + content: "\ef87"; +} + +.reco-account:before { + content: "\e607"; +} + +.reco-jianshu:before { + content: "\e600"; +} + +.reco-theme:before { + content: "\e7e8"; +} + +.reco-three:before { + content: "\e644"; +} + diff --git a/fonts/iconfont.eot b/fonts/iconfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..95c907f2120972bc71f13ef9e8d5178ce553588f GIT binary patch literal 6376 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 + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fonts/iconfont.ttf b/fonts/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3a46f0bb87dc57a0fe2165b9eb71c8ccb12bcafd GIT binary patch literal 6208 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 eHq_iWI4?tO45eCzdC+zAsUHzk&{+($0001gr?d +export default { + functional: true, + props: { + type: { + type: String, + default: 'tip' + }, + text: String, + vertical: { + type: String, + default: 'top' + } + }, + render (h, { props, slots }) { + return h('span', { + class: ['badge', props.type], + style: { + verticalAlign: props.vertical + } + }, props.text || slots().default) + } +} + + + diff --git a/index.js b/index.js new file mode 100644 index 0000000..c9e26bd --- /dev/null +++ b/index.js @@ -0,0 +1,46 @@ +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') + } + }, + + plugins: [ + '@vuepress/active-header-links', + ['@vuepress/plugin-blog', { + permalink: '/:regular' + }], + '@vuepress/search', + '@vuepress/plugin-nprogress', + ['container', { + type: 'tip', + defaultTitle: { + '/zh/': '提示' + } + }], + ['container', { + type: 'warning', + defaultTitle: { + '/zh/': '注意' + } + }], + ['container', { + type: 'danger', + defaultTitle: { + '/zh/': '警告' + } + }] + ] +}) diff --git a/layouts/404.vue b/layouts/404.vue new file mode 100644 index 0000000..4eef36d --- /dev/null +++ b/layouts/404.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/layouts/Category.vue b/layouts/Category.vue new file mode 100644 index 0000000..d15066c --- /dev/null +++ b/layouts/Category.vue @@ -0,0 +1,93 @@ + + + + + + + + + diff --git a/layouts/Layout.vue b/layouts/Layout.vue new file mode 100644 index 0000000..93c834a --- /dev/null +++ b/layouts/Layout.vue @@ -0,0 +1,42 @@ + + + + + + diff --git a/layouts/Tags.vue b/layouts/Tags.vue new file mode 100644 index 0000000..285fa4b --- /dev/null +++ b/layouts/Tags.vue @@ -0,0 +1,129 @@ + + + + + + + + + diff --git a/noopModule.js b/noopModule.js new file mode 100644 index 0000000..b1c6ea4 --- /dev/null +++ b/noopModule.js @@ -0,0 +1 @@ +export default {} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f9da596 --- /dev/null +++ b/package.json @@ -0,0 +1,32 @@ +{ + "name": "vuepress-theme-reco", + "version": "1.0.0-alpha.11", + "description": "this is a vuepress theme", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/recoluan/vuepress-theme-reco.git" + }, + "keywords": [ + "vuepress", + "vue", + "theme" + ], + "author": "reco_luan", + "license": "MIT", + "bugs": { + "url": "https://github.com/recoluan/vuepress-theme-reco/issues" + }, + "homepage": "https://recoluan.gitlab.io/vuepress-theme-reco-doc/", + "_from": "vuepress-theme-reco@0.2.1", + "_resolved": "http://registry.npm.taobao.org/vuepress-theme-reco/download/vuepress-theme-reco-0.2.1.tgz", + "dependencies": { + "leancloud-storage": "^3.10.1", + "valine": "^1.3.4", + "@vuepress/plugin-blog": "^1.0.0-alpha.46", + "vue-click-outside": "^1.0.7" + } +} \ No newline at end of file diff --git a/styles/arrow.styl b/styles/arrow.styl new file mode 100644 index 0000000..20bffc0 --- /dev/null +++ b/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 $arrowBgColor + &.down + border-left 4px solid transparent + border-right 4px solid transparent + border-top 6px solid $arrowBgColor + &.right + border-top 4px solid transparent + border-bottom 4px solid transparent + border-left 6px solid $arrowBgColor + &.left + border-top 4px solid transparent + border-bottom 4px solid transparent + border-right 6px solid $arrowBgColor diff --git a/styles/code.styl b/styles/code.styl new file mode 100644 index 0000000..bc5701e --- /dev/null +++ b/styles/code.styl @@ -0,0 +1,135 @@ +.content + code + color lighten($textColor, 20%) + padding 0.25rem 0.5rem + margin 0 + font-size 0.85em + background-color rgba(27,31,35,0.05) + border-radius 3px + .token + &.deleted + color #EC5975 + &.inserted + color $accentColor + +.content + 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/styles/colorMode/colorMixin.styl b/styles/colorMode/colorMixin.styl new file mode 100644 index 0000000..5dc699b --- /dev/null +++ b/styles/colorMode/colorMixin.styl @@ -0,0 +1,55 @@ +color-mode(accountColor , colorName) + .reco-theme-{colorName} + input + color accountColor!important; + .search-box input + border-color: accountColor!important; + &:focus + border-color: accountColor!important; + .navbar + box-shadow: 0 1px 6px 0 rgba(32,33,36,.28) + .nav-links a:hover, + .nav-links a.router-link-active, + .nav-links a:hover .iconfont, + .nav-links a.router-link-active .iconfont + color accountColor!important; + .home + .hero + .description + color accountColor!important; + .action-button, img + background-color accountColor!important; + color: #fff!important + .features + .feature + h2, p + color accountColor!important; + .footer + a + color accountColor!important; + .abstract-wrapper .abstract-item .title + a + color accountColor!important; + a:after + background-color accountColor!important; + .back-to-ceiling i + color accountColor!important; + .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active::after + border-left: 5px solid accountColor!important; + .tags + .tag-item.active, .tag-item:hover + color accountColor!important; + .timeline-wrapper .year-wrapper li:hover + .title + color accountColor!important; + .date::before + background: accountColor!important; + .date + color accountColor!important; + @media (min-width: 765px) + .nav-item > a:not(.external):hover, + .nav-item > a:not(.external).router-link-active + border-color: accountColor!important; + @media (max-width: 959px) + .search-box input + border-color: transparent!important; \ No newline at end of file diff --git a/styles/colorMode/colorMode.styl b/styles/colorMode/colorMode.styl new file mode 100644 index 0000000..fda4853 --- /dev/null +++ b/styles/colorMode/colorMode.styl @@ -0,0 +1,17 @@ +@require './colorMixin.styl' + +$fc-red = #f26d6d +$fc-red-name = 'red' +color-mode($fc-red, $fc-red-name) + +$fc-blue = #2196f3 +$fc-blue-name = 'blue' +color-mode($fc-blue, $fc-blue-name) + +$fc-green = #3eaf7c +$fc-green-name = 'green' +color-mode($fc-green, $fc-green-name) + +$fc-orange = #fb9b5f +$fc-orange-name = 'orange' +color-mode($fc-orange, $fc-orange-name) \ No newline at end of file diff --git a/styles/colorMode/index.styl b/styles/colorMode/index.styl new file mode 100644 index 0000000..2ff8a58 --- /dev/null +++ b/styles/colorMode/index.styl @@ -0,0 +1,2 @@ +@require './nightMode.styl' +@require './colorMode.styl' \ No newline at end of file diff --git a/styles/colorMode/nightMode.styl b/styles/colorMode/nightMode.styl new file mode 100644 index 0000000..974603b --- /dev/null +++ b/styles/colorMode/nightMode.styl @@ -0,0 +1,114 @@ +$bc = #000 +$fc = #9e9e9e +$bdc = #9e9e9e +$fcActive = #fff + + +bc() { + background-color: $bc!important +} +fc() { + color: $fc!important +} +bdc() { + border-color: $bdc!important +} +fc-active() { + color: $fcActive!important +} + +.reco-theme-night + bc() + fc() + bdc() + h1, h2, h3, h4, h5, h6, a, hr + bdc() + fc() + input + bc() + fc() + .search-box input + bdc() + &:focus + bdc() + .navbar + bc() + box-shadow: 0 2px 20px 0 rgba(255,255,255,0.4); + border-bottom: 1px solid $bdc + .site-name, .links + bc() + fc() + .nav-links a:hover, + .nav-links a.router-link-active, + .nav-links a:hover .iconfont, + .nav-links a.router-link-active .iconfont + fc-active() + .tags .tag-item:hover + fc-active() + @media (min-width: 765px) + .nav-item > a:not(.external):hover, + .nav-item > a:not(.external).router-link-active + border-color: $fcActive; + .dropdown-wrapper .nav-dropdown + bc() + box-shadow: 0 2px 20px 0 rgba(255,255,255,0.4); + border: 1px solid $bdc + @media (min-width: 719px) + .nav-item > a:not(.external):hover, + .nav-item > a:not(.external).router-link-active + border-bottom: 2px solid $fcActive!important; + @media (max-width: 959px) + .search-box input + border-color: transparent!important; + .home + .hero + .description + fc() + .features + bdc() + .feature + h2, p + fc() + .footer + bdc() + a + fc() + .abstract-wrapper .abstract-item + background-color: lighten($bc, 20%) + .custom-block.tip, .custom-block.warning, .custom-block.danger + background-color: lighten($bc, 15%) + .pagation .pagation-list + bc() + .sidebar + bc() + bdc() + .valine-wrapper + bc() + + .v .vbtn, .v .vwrap + bc() + bdc() + .v .vlist .vcard + .vhead .vsys, .vh + bdc() + bc() + .timeline-wrapper + &::after + background: $fc + .year-wrapper li + bdc() + .back-to-ceiling + background-color: lighten($bc, 15%)!important + i + fc() + .color-picker .color-button .iconfont + fc() + .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active::after + border-left: 5px solid $fcActive + .timeline-wrapper .year-wrapper li:hover + .title + fc() + .date::before + background: $fcActive + .date + fc() \ No newline at end of file diff --git a/styles/custom-blocks.styl b/styles/custom-blocks.styl new file mode 100644 index 0000000..d0775c3 --- /dev/null +++ b/styles/custom-blocks.styl @@ -0,0 +1,30 @@ +.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 #f3f5f7 + border-color #67cc86 + &.warning + background-color #fbf0ea + border-color #fb9b5f + // color darken(#ffe564, 70%) + .custom-block-title + color darken(#ffe564, 50%) + a + color $textColor + &.danger + background-color #fceaea + border-color #f26d6d + // color darken(red, 70%) + .custom-block-title + color darken(red, 40%) + a + color $textColor + + diff --git a/styles/loadMixin.styl b/styles/loadMixin.styl new file mode 100644 index 0000000..7c3bba5 --- /dev/null +++ b/styles/loadMixin.styl @@ -0,0 +1,11 @@ +load-start(){ + transition:all .25s; + transform:translateY(-20px); + opacity 0 +} + +load-end($delayTime){ + transform:translateY(0); + transition-delay: $delayTime + opacity 1 +} \ No newline at end of file diff --git a/styles/mobile.styl b/styles/mobile.styl new file mode 100644 index 0000000..ca6b18a --- /dev/null +++ b/styles/mobile.styl @@ -0,0 +1,37 @@ +// @require './config' + +$mobileSidebarWidth = $sidebarWidth * 0.82 + +// narrow desktop / iPad +@media (max-width: $MQNarrow) + .sidebar + font-size 15px + width $mobileSidebarWidth + .page + padding-left $mobileSidebarWidth + +// wide mobile +@media (max-width: $MQMobile) + .sidebar + top 0 + padding-top $navbarHeight + transform translateX(-100%) + transition transform .2s ease + .page + padding-left 0 + .theme-container + &.sidebar-open + .sidebar + transform translateX(0) + &.no-navbar + .sidebar + padding-top: 0 + +// narrow mobile +@media (max-width: $MQMobileNarrow) + h1 + font-size 1.9rem + .content + div[class*="language-"] + margin 0.85rem -1.5rem + border-radius 0 diff --git a/styles/recoConfig.styl b/styles/recoConfig.styl new file mode 100644 index 0000000..b7002cc --- /dev/null +++ b/styles/recoConfig.styl @@ -0,0 +1,3 @@ +// colors +$accentColor = #424242 +$textColor = #232321 \ No newline at end of file diff --git a/styles/theme.styl b/styles/theme.styl new file mode 100644 index 0000000..451a6ae --- /dev/null +++ b/styles/theme.styl @@ -0,0 +1,215 @@ +@require './recoConfig' +@require './code' +@require './custom-blocks' +@require './arrow' +@require './wrapper' +@require './toc' +@require './colorMode/index' +@require '../fonts/iconfont.css' + +html, body + padding 0 + margin 0 +body + font-family -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif + -webkit-font-smoothing antialiased + -moz-osx-font-smoothing grayscale + font-size 16px + color $textColor + background-color #fff + +.page + padding-left $sidebarWidth + +.navbar + position fixed + z-index 20 + top 0 + left 0 + right 0 + height $navbarHeight + background-color #fff + 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 #fff + width $sidebarWidth + position fixed + z-index 10 + margin 0 + top $navbarHeight + left 0 + bottom 0 + box-sizing border-box + border-right 1px solid $borderColor + overflow-y auto + +.content: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.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 #dfe2e5 + 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:not(.custom) > & + margin-top (0.5rem - $navbarHeight) + padding-top ($navbarHeight + 1rem) + margin-bottom 0 + &:first-child + margin-top -1.5rem + margin-bottom 1rem + + p, + pre, + .custom-block + margin-top 2rem + &:hover .header-anchor + opacity: 1 + +h1 + font-size 2.2rem + +h2 + font-size 1.65rem + padding-bottom .3rem + border-bottom 1px solid $borderColor + +h3 + font-size 1.35rem + +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 $borderColor + +table + border-collapse collapse + margin 1rem 0 + display: block + overflow-x: auto + +tr + border-top 1px solid #dfe2e5 + &:nth-child(2n) + background-color #f6f8fa + +th, td + border 1px solid #dfe2e5 + padding .6em 1em + +.theme-container + &.sidebar-open + .sidebar-mask + display: block + &.no-navbar + .content: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 + padding-left 0 + +@require 'mobile.styl' + +.iconfont + font-size: 0.9rem; + color: #999; + // &:not(:first-child) + // margin-left: 1rem + // span + // margin-left: .5rem + +/************** 滚动条 **************/ +::-webkit-scrollbar + width: 5px; + height: 5px; + +::-webkit-scrollbar-track-piece + background-color: rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + +::-webkit-scrollbar-thumb:vertical + height: 5px; + background-color: rgba(125, 125, 125, 0.7); + -webkit-border-radius: 6px; + +::-webkit-scrollbar-thumb:horizontal + width: 5px; + background-color: rgba(125, 125, 125, 0.7); + -webkit-border-radius: 6px; + diff --git a/styles/toc.styl b/styles/toc.styl new file mode 100644 index 0000000..d3e7106 --- /dev/null +++ b/styles/toc.styl @@ -0,0 +1,3 @@ +.table-of-contents + .badge + vertical-align middle diff --git a/styles/wrapper.styl b/styles/wrapper.styl new file mode 100644 index 0000000..a99262c --- /dev/null +++ b/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/util/index.js b/util/index.js new file mode 100644 index 0000000..9913ff7 --- /dev/null +++ b/util/index.js @@ -0,0 +1,239 @@ +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 {} +} + +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 + } + } +}