├── Changelog.md ├── LICENSE ├── README-EN.md ├── README.md ├── _config.yml ├── fiction.md ├── languages ├── en.yml └── zh-CN.yml ├── layout ├── 404.pug ├── _partial │ ├── article-index.pug │ ├── article-item.pug │ ├── article.pug │ ├── blog-info.pug │ ├── comment.pug │ ├── footer.pug │ ├── head.pug │ ├── header.pug │ ├── menu-index.pug │ ├── other-resources.pug │ ├── pageview │ │ ├── pageview-post.pug │ │ └── pageview-site.pug │ ├── pagination.pug │ ├── post │ │ ├── copyright.pug │ │ ├── date.pug │ │ ├── post-categories.pug │ │ ├── post-tags.pug │ │ ├── reward.pug │ │ ├── toc.pug │ │ └── word-count.pug │ ├── search.pug │ └── tool-bar.pug ├── about.pug ├── archive.pug ├── categories.pug ├── index.pug ├── layout.pug ├── post.pug └── tags.pug ├── scripts ├── events │ └── welcome.js └── tags │ ├── link-card.js │ └── quote.js └── source ├── css ├── _style │ ├── 404.styl │ ├── _default │ │ ├── animation.styl │ │ ├── code-highlight.styl │ │ ├── global-settings.styl │ │ ├── icon.styl │ │ ├── image.styl │ │ ├── link-card.styl │ │ ├── media.styl │ │ └── text.styl │ ├── _partial │ │ ├── article-index.styl │ │ ├── article.styl │ │ ├── blog-info.styl │ │ ├── code.styl │ │ ├── comment.styl │ │ ├── footer.styl │ │ ├── header.styl │ │ ├── menu-index.styl │ │ ├── pagination.styl │ │ ├── post │ │ │ ├── copyright.styl │ │ │ ├── date.styl │ │ │ ├── post-categories.styl │ │ │ ├── post-tags.styl │ │ │ ├── reward.styl │ │ │ ├── toc.styl │ │ │ └── word-count.styl │ │ ├── search.styl │ │ └── tool-bar.styl │ ├── about.styl │ ├── archive.styl │ ├── categories.styl │ ├── index.styl │ ├── layout.styl │ └── tags.styl ├── darkmode.styl ├── style.styl └── third-party │ └── APlayer.min.css ├── img ├── author.jpg ├── blog-background.png ├── reward │ ├── alipay.jpg │ └── wechat.jpg └── site-icon.png └── js ├── jquery-3.7.1.min.js ├── theme ├── copy.js ├── menu.js ├── reward.js ├── search.js ├── toc.js └── tool-bar.js └── third-party ├── APlayer.min.js ├── clipboard.min.js └── darkmode.js /Changelog.md: -------------------------------------------------------------------------------- 1 | # Changelog 更新日志 2 | 3 | *Chinese Version & English Version* 4 | 5 | ## 🐱v2.1.5 6 | Released at `2025-05-01`. 7 | 8 | ### ✅️问题修复 9 | - 修复首页文章自动生成摘要时可能会导致html标签不闭合的问题,并且新增主题配置项“摘要长度” 10 | 11 | ### ✅️Fixes 12 | - Fixed the issue of auto generating post excerpt at homepage, which could probably make html tags not closed. Also added a new theme configuration 'excerpt length'. 13 | 14 |
15 | 16 | --- 17 | 18 |
19 | 20 | ## 🐱v2.1.4 21 | Released at `2025-04-09`. 22 | 23 | ### ♾️优化项目 24 | - 优化关于页联系方式: 25 | - 增加QQ选项:点击选项可以自动复制账号到剪贴板 26 | - 优化Wechat选项:填写“微信”也可以被识别;点击选项可以自动复制账号到剪贴板 27 | - 去除公众号选项 28 | 29 | ### ♾️Improvements 30 | - Improved contact module in About page: 31 | - Added QQ: Automatically copy account name to clipboard when click the option. 32 | - Improved Wechat: Automatically copy account name to clipboard when click the option. 33 | 34 |
35 | 36 | --- 37 | 38 |
39 | 40 | ## 🐱v2.1.3 41 | Released at `2025-03-11`. 42 | 43 | ### 🆕新增功能 44 | - 新增配置选项:网站背景是否跟随页面滚动 45 | 46 | ### ♾️优化项目 47 | - 优化背景设置:背景图片自动居中 48 | - 优化博客简介字体样式 49 | 50 | ### 🆕New Features 51 | - Added configuration: background scrollable. 52 | 53 | ### ♾️Improvements 54 | - Improved background setting: background image will be centered automatically. 55 | - Improved the font style of blog description. 56 | 57 |
58 | 59 | --- 60 | 61 |
62 | 63 | ## 🐱v2.1.2 64 | Released at `2025-01-27`. 65 | 66 | ### ♾️优化项目 67 | - 优化悬浮工具栏的位置,使其吸附在主体部分右边 68 | - 优化归档页面的文章卡片大小及布局,现在可以显示更多的摘要内容 69 | - 优化首页元素的外间距,使布局更紧凑美观 70 | 71 | ### ♾️Improvements 72 | - Improved the position of toolbar to make it attached to the right side of the main container. 73 | - Improved the size and layout of article cards in the Archives page, it can display more excerpt content now. 74 | - Improved the margin of elements in Index page to make the layout tighter and more beautiful. 75 | 76 |
77 | 78 | --- 79 | 80 |
81 | 82 | ## 🐱v2.1.1 83 | Released at `2025-01-26`. 84 | 85 | ### ✅️问题修复 86 | - 修复首页错误地显示相对时间的问题,现在会直接显示文章的发布日期 87 | 88 | ### ♾️优化项目 89 | - 优化TOC的位置,使其吸附在主体部分右边 90 | 91 | ### ✅️Fixes 92 | - Fixed the issue of displaying relative time at Index page by mistake, it displays posts publish time now. 93 | 94 | ### ♾️Improvements 95 | - Improved the position of TOC to make it attached to the right side of the main container. 96 | 97 |
98 | 99 | --- 100 | 101 |
102 | 103 | ## 🐱v2.1.0 104 | Released at `2024-11-04`. 105 | 106 | ### 🆕新增功能 107 | - 新增链接卡片标签,可用于链接外部页面、站内文章或文件下载,详见[链接卡片](https://chanwj.github.io/Meow-Theme-Guide/#链接卡片)介绍 108 | - 新增悬浮工具栏功能:可以放大/缩小文章正文字体 109 | - 新增功能:一键复制代码(使用clipboard.js) 110 | 111 | ### ✅️问题修复 112 | - 修复切换深色模式时背景图片/渐变色不变的问题 113 | - 修复切回浅色模式时背景颜色会变成默认黄色的问题 114 | 115 | ### ♾️优化项目 116 | - 优化分类页面显示效果,可以更清晰地看到分类的层级结构,并且可以配置是否显示文章数量、显示几层分类 117 | - 优化对APlayer的使用:改为在需要使用APlayer的页面Front-matter中配置开关,现在可以在“关于页”内引入音乐播放器了 118 | - 置顶的文章会在首页显示相应的置顶标签,可在语言文件中配置标签显示值 119 | - 优化资源引入,提升页面加载速度 120 | - 优化了一些代码结构与页面展示效果,增加了一些动态特效 121 | 122 | ### 🆕New Features 123 | - Added tag for link card, support to link external page, site post or file to be downloaded. Read more in [Link Card](https://chanwj.github.io/en/Meow-Theme-Guide/#Link-Card). 124 | - Added function to toolbar: increase/decrease font size of post. 125 | - Added function: copy codes with one click (with clipboard.js). 126 | 127 | ### ✅️Fixes 128 | - Fixed the issue of background image/gradient color remaining unchanged when switching to darkmode. 129 | - Fixed the issue of background color changing to yellow by default when switching back to lightmode. 130 | 131 | ### ♾️Improvements 132 | - Improved the display effect of categories page, the hierarchies are more clear now. Configurable: show posts count, depth of categories to display. 133 | - Improved the usage of APlayer: change to configuring switches in Front-matter of each page. You can also import music player in 'About' page now. 134 | - Top posts will show top-tag on the homepage, the display value of top-tag can be configured in language files. 135 | - Optimized the introductions of resources and improve page loading speed. 136 | - Optimized some code structures and page display styles, added some dynamic effects. 137 | 138 |
139 | 140 | --- 141 | 142 |
143 | 144 | ## 🐱v2.0.0 145 | Released at `2024-10-20`. 146 | 147 | ### ⭐提示 148 | - 适配`Hexo v7.3.0`,建议同步更新Hexo 149 | - 本次更新内容较多,建议提前对已自定义修改过的主题配置文件`_config.yml`进行备份。 150 | 151 | ### 🆕新增功能 152 | - 新增评论功能(使用giscus),在文章和关于页加入评论区模块,可配置,详情可见[评论功能](https://chanwj.github.io/Meow-Theme-Guide/#评论功能)说明 153 | - 新增加密功能(使用hexo-blog-encrypt),详情可见[加密功能](https://chanwj.github.io/Meow-Theme-Guide/#加密功能)说明 154 | - 新增深色模式,可配置,详情可见[深色模式](https://chanwj.github.io/Meow-Theme-Guide/#深色模式)介绍。 155 | - 新增引用块标签,支持使用多种颜色风格的引用块,详情可见[引用块](https://chanwj.github.io/Meow-Theme-Guide/#引用块)介绍 156 | - 新增悬浮工具栏功能: 157 | - 当前页面为文章或关于页时可跳转至页尾评论区 158 | - 深色模式开关 159 | - 在关于页新增致谢栏目,可配置开关、致谢词、致谢名单 160 | - 新增配置:可自定义字体,详情可见[网站字体](https://chanwj.github.io/Meow-Theme-Guide/#网站字体)说明 161 | - 新增配置:文章段落首行缩进两字符,可为每篇文章单独开关,详情可见[段首缩进](https://chanwj.github.io/Meow-Theme-Guide/#段首缩进)介绍 162 | - 新增配置:可自定义网站背景,支持三种背景类型,详情可见[网站背景](https://chanwj.github.io/Meow-Theme-Guide/#网站背景)说明 163 | - 新增对`APlayer`音乐播放器的支持,详情可见[音乐播放器](https://chanwj.github.io/Meow-Theme-Guide/#音乐播放器)介绍 164 | - 新增TOC配置项`max_items`(`Hexo v7.3.0`更新内容) 165 | 166 | ### ♾️优化项目 167 | - 在``中新增Open Graph信息以优化SEO,并且优化meta description的内容:文章页面为文章简介/摘要,其它页面为网站简介 168 | - 简化小说模板中的完结状态配置项为Y/N:Y=完结,N=连载中,置空=不显示完结状态 169 | - 兼容v1.0.0中的完结状态选项,因此以前发布的文章无须进行修改 170 | - 建议将新版`fiction.md`复制到网站根目录下的scaffolds文件夹并覆盖旧版文件 171 | - 优化404页面的显示效果,在主题指南中增加[404页面](https://chanwj.github.io/Meow-Theme-Guide/#404页面)说明 172 | - 优化`
`折叠块显示效果,详情可见[折叠块](https://chanwj.github.io/Post-Style-Display/#折叠块)介绍 173 | - 优化归档页面的文章预览内容,优先级:文章摘要>小说模板的简介>自动截取文章开头部分 174 | - 优化滚动条显示效果 175 | - 优化代码块标题显示效果 176 | - 优化文章字数统计的显示,增加千和万的单位(保留一位小数),仅对中文文章生效。 177 | - 优化表格在内容溢出时的显示效果,具体用法可见[表格](https://chanwj.github.io/Post-Style-Display/#表格) 178 | - 使用小屏设备时字体减小,优化显示效果 179 | - 去除主体背景纹理的灰点,使背景看起来更干净 180 | - 执行Hexo指令后在控制台打印主题Meow的相关信息 181 | - 增加更新日志 182 | 183 | ### ⭐Tips 184 | - Compatible with `Hexo v7.3.0`, it is recommended to update Hexo in synchrony. 185 | - Since there are many new updates in this version, it is recommended to backup the theme configuration file `_config.yml` (which has been modified) in advance. 186 | 187 | ### 🆕New Features 188 | - Add comment function (using giscus), add comment module for posts and 'About' page, configurable. Read more in [Comment](https://chanwj.github.io/en/Meow-Theme-Guide/#Comment). 189 | - Add encryption function (using hexo-blog-encrypt), read more in [Encryption](https://chanwj.github.io/en/Meow-Theme-Guide/#Encryption). 190 | - Add darkmode, configurable, read more in [Darkmode](https://chanwj.github.io/en/Meow-Theme-Guide/#Darkmode). 191 | - Add quote tag, support to use blockquote in various style, read more in [Quote](https://chanwj.github.io/en/Meow-Theme-Guide/#Quote). 192 | - Add more functions to toolbar: 193 | - Go to comment module if it is post or 'About' page. 194 | - Switch to darkmode. 195 | - Add credits module at 'About' page, configurable: switch, acknowledgements words, credits list. 196 | - Add configuration: fonts customizable. Read more in [Fonts](https://chanwj.github.io/en/Meow-Theme-Guide/#Fonts). 197 | - Add configuration: indent the first line of paragraph in post by 2em. You can also enable/disable it for specific posts. Read more in [Text Indent](https://chanwj.github.io/en/Meow-Theme-Guide/#Text-Indent). 198 | - Add configuration: site background customizable, support 3 kinds of background. Read more in [Background](https://chanwj.github.io/en/Meow-Theme-Guide/#Background). 199 | - Add support for `APlayer`, read more in [Music Player](https://chanwj.github.io/en/Meow-Theme-Guide/#Music-Player). 200 | - Add TOC configuration: `max_items` (updated by `Hexo v7.3.0`). 201 | 202 | ### ♾️Improvements 203 | - Add Open Graph message in `` to improve SEO. Improve meta description: summary/excerpt(posts), site description(other pages). 204 | - Simplify the configuration of status in fiction scaffold to Y/N: Y=complete, N=incomplete, stay blank=hide status. 205 | - Compatible with status options of v1.0.0. Therefore, those articles published previously do not need to be modified. 206 | - It is recommended to copy the new `fiction.md` to the scaffolds folder under the root directory and overwrite the old one. 207 | - Improve the display style of 404 page, add configuration guide in [404 Page](https://chanwj.github.io/en/Meow-Theme-Guide/#404-Page). 208 | - Improve the display style of `
`, read more in [Details](https://chanwj.github.io/Post-Style-Display/#折叠块). 209 | - Improve preview content of post in archives page, priority: post's excerpt > summary of fiction scaffold > truncate the start of post automatically. 210 | - Improve scrollbar style. 211 | - Improve the style of code block title. 212 | - Improve the display of post word count, add thousand/ten thousand unit (rounded to one decimal place), only work for languages: zh-XX. 213 | - Improve the style of table when the content of table overflows. Read more in [Table](https://chanwj.github.io/Post-Style-Display/#表格). 214 | - Decrease font size and optimize display effect when using small screen devices. 215 | - Remove the gray dots from the background texture of the main container to make the background look cleaner. 216 | - Print Theme Meow information on console after executing Hexo commands. 217 | - Add change log. 218 | 219 |
220 | 221 | --- 222 | 223 |
224 | 225 | ## 🐱v1.0.0 226 | Released at `2024-04-28`. 227 | 228 | 主题「Meow」正式发布。 229 | 「Meow」was released officially. -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 chanwj(小橘猫) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README-EN.md: -------------------------------------------------------------------------------- 1 | # Hexo Theme Meow 2 | 3 | Language: [简体中文](README.md) | English 4 | 5 | **Meow** is a cute and bright Hexo theme. It optimizes the adaptability of original novel and fanfiction. 6 | 7 | ![Meow](https://chanwj.github.io/images/theme-preview.png) 8 | 9 |
10 | 11 | ## 😺 Theme Preview 12 | 13 | - **[Meow Preview Station](https://chanwj.github.io/)** 14 | 15 |
16 | 17 | ## 💻️ Installation 18 | 19 | Execute the following command in the root directory of the blog. 20 | 21 | ``` bash 22 | git clone -b v2.0 https://github.com/chanwj/hexo-theme-meow.git themes/meow 23 | ``` 24 | 25 | Modify the `_config. yml` file in the root directory. Set theme variable to `meow`. 26 | 27 | ``` yml 28 | theme: meow 29 | ``` 30 | 31 | **Meow** uses Pug for rendering. Please install the Pug renderer in advance. 32 | 33 | ``` bash 34 | npm install hexo-renderer-pug --save 35 | ``` 36 | 37 |
38 | 39 | ## 📚️ Documents 40 | 41 | - **[Meow Configuration Guide](https://chanwj.github.io/en/Meow-Theme-Guide/#Theme-Configuration)** 42 | 43 |
44 | 45 | ## ⭐️ Features 46 | 47 | - Fiction scaffold ( **[Meow Fiction Scaffold Introduction](https://chanwj.github.io/en/Meow-Theme-Guide/#Fiction-Scaffold)** ) 48 | - Responsive design for small screen devices 49 | - Template for "About" page, supporting i18n 50 | - Card style archives pages, sort by years and months 51 | - Categories page that can show all hierarchies 52 | - Generate TOC for articles customizable 53 | - Provide various tag plugins: blockquote in different styles / link card / ... 54 | - Floating toolbar 55 | - Configurable reward module & credits module 56 | - Darkmode 57 | - Comment 58 | - Post encryption 59 | - Support for APlayer 60 | - Built-in 404 page 61 | - Integrate multiple function switches, highly customizable configuration 62 | 63 |
64 | 65 | ## 📋 Changelog 66 | 67 | Get the specific update content of each version, including new features, fixes and improvements. 68 | 69 | - **[Changelog](Changelog.md)** 70 | 71 |
72 | 73 | ## ⏳️ TO DO 74 | 75 | - [ ] More toolbar functions 76 | - [ ] Support for photos gallery 77 | - [ ] ... 78 | 79 |
80 | 81 | ## 📢 Pronouncement 82 | 83 | *Meow* has been open-source and is available for anyone to download and use. If you encounter any issues or have suggestions during use, you can submit them as Issues in *Meow*'s Github repository or leave comments directly on the preview site. 84 | 85 | *Meow* also welcome all of you to participate in the development of this theme (either by submitting Pull Requests or contacting the author). Those who have made contributions will have their names listed on *Meow*'s Github homepage and in the credits list of the preview site. 86 | 87 | At the same time, *Meow* permits secondary creative modifications (Fork), provided that you **prominently indicate the original work (i.e., `hexo-theme-meow`) and the original author (i.e., chanwj/小橘猫) in your work, and retain the copyright and license notices from the original work**. 88 | 89 | If you need to use this theme, **please retain the copyright information in the footer to show respect for the author and her creation**, which can also help more people in need to know this theme. Thank you very much! 90 | 91 | Although *Meow* is an open source project, it does NOT mean that plagiarism by removing copyright information of the original work is permissible or acceptable. (If you want, welcome to introduce your website/secondary creation to the author. You can also apply to add a friend link to the preview site.) 92 | 93 | *If you think *Meow* is helpful, feel free to let the author know (leave comments or pay her a coffee), so that the author will be encouraged and more motivated to continue updating and maintaining *Meow* in the future. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Hexo Theme Meow 2 | 3 | Language: 简体中文 | [English](README-EN.md) 4 | 5 | **Meow**是一款可爱明亮的Hexo主题,尤其适用于发表文学作品,比如长篇小说、同人创作等等。 6 | 7 | ![Meow](https://chanwj.github.io/images/theme-preview.png) 8 | 9 |
10 | 11 | ## 😺 主题展示 12 | 13 | - **[Meow展示站](https://chanwj.github.io/)** 14 | 15 |
16 | 17 | ## 💻️ 安装指南 18 | 19 | 在博客根目录下执行以下指令,获取最新版主题。 20 | 21 | ``` bash 22 | git clone -b v2.0 https://github.com/chanwj/hexo-theme-meow.git themes/meow 23 | ``` 24 | 25 | 修改博客根目录下的`_config.yml`配置文件,将主题更换为`meow`。 26 | 27 | ``` yml 28 | theme: meow 29 | ``` 30 | 31 | 本主题使用pug进行渲染,请提前安装pug渲染器。 32 | 33 | ``` bash 34 | npm install hexo-renderer-pug --save 35 | ``` 36 | 37 |
38 | 39 | ## 📚️ 配置文档 40 | 41 | - **[Meow配置指南](https://chanwj.github.io/Meow-Theme-Guide/#主题配置指南)** 42 | 43 |
44 | 45 | ## ⭐️ 特色功能 46 | 47 | - 小说模板 ( **[Meow小说模板介绍](https://chanwj.github.io/Meow-Theme-Guide/#小说模板)** ) 48 | - 响应式设计,优化小屏设备显示效果 49 | - 支持i18n的“关于”页模板 50 | - 按年份与月份归类的卡片式归档页面 51 | - 可显示层级的分类目录页面 52 | - 可自定义生成文章TOC目录 53 | - 提供多样化的标签插件:不同风格的引用块/链接卡片/…… 54 | - 装配悬浮工具栏 55 | - 可配置的赞赏栏目、致谢名单 56 | - 深色模式 57 | - 评论功能 58 | - 文章加密功能 59 | - 支持APlayer音乐播放器 60 | - 内置404页面 61 | - 集成多项功能开关,高度自定义的配置 62 | 63 |
64 | 65 | ## 📋 更新日志 66 | 67 | 快速获取各个版本的具体更新内容,包括新增功能、问题修复、优化项目。 68 | 69 | - **[Changelog](Changelog.md)** 70 | 71 |
72 | 73 | ## ⏳️ TO DO 74 | 75 | - [ ] 更多工具栏功能 76 | - [ ] 图片画廊功能 77 | - [ ] …… 78 | 79 |
80 | 81 | ## 📢 声明 82 | 83 | 主题*Meow*已经开源,任何人都可以下载使用。如果在使用的过程中有任何问题或建议,您可以在*Meow*的Github仓库中提交Issues,或者直接在主题展示站中留言。 84 | 85 | 也欢迎各位大神和同好参与建设这个主题(Pull Requests或联系作者),作出贡献的朋友,其名字会被列在*Meow*的Github主页与主题展示站的致谢名单中。 86 | 87 | 同时,本主题允许进行二创修改(Fork),但前提是**您必须在二创成果中显著标出原作品(即`hexo-theme-meow`)以及原作者(即chanwj/小橘猫),并且保留原作品中的版权和许可声明**。 88 | 89 | 如果您需要使用本主题,**请保留页脚部分的主题版权信息,尊重作者与创作**,此举同样可以帮助更多有需要的人了解本主题,非常感谢! 90 | 91 | 虽然本主题是开源项目,但并不代表抹掉作品版权信息的剽窃行为是可以被允许和存在的。(如果您愿意的话,欢迎向原作者介绍您的网站/二创成果呀~也可以向作者申请在主题展示站中添加友链) 92 | 93 | *如果您因为本主题而得到了帮助,可以留言/打赏告知作者,这样作者也会受到鼓舞,更有动力进行后续的主题更新与维护~* -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | # Theme Configuration 主题配置 2 | # Source: https://github.com/chanwj/hexo-theme-meow 3 | # Docs: https://chanwj.github.io 4 | 5 | # theme version 主题所使用的版本 6 | version: v2.1.5 7 | 8 | # site icon 网站图标 9 | blog_pic: img/site-icon.png 10 | 11 | # author picture 作者头像 12 | author_pic: img/author.jpg 13 | 14 | # background image/color 背景图片/颜色 15 | background: 16 | type: 3 # 1: image 图片 | 2: color 颜色 | 3: gradient style 渐变 17 | color: # (css color name css颜色名称) 'MistyRose' | (color code 颜色代码) '#FFE4E1' 18 | image_url: images/Spiritfarer-1.png # image path 图片路径 19 | gradient: linear-gradient(to bottom right,#ffa751,#ffe259) # gradient css statement 渐变css语句 20 | attachment: fixed # background scrollable 背景是否可以随页面滚动: scroll | fixed 21 | 22 | # menu config 导航栏菜单项 23 | # archives/categories/tags will use the path in root config automatically 归档、分类以及标签页使用根目录配置中的路径 24 | # other custom pages require path configuration manually 其他自定义页面需要配置页面路径 25 | menu: 26 | archives: 27 | categories: 28 | tags: 29 | about: /about 30 | 31 | # search function 搜索功能 32 | search: 33 | enable: true 34 | 35 | # site register info 网站备案信息(比如ICP) 36 | register_info: 37 | enable: false 38 | record_info: 京ICP备………………号 39 | query_url: https://beian.miit.gov.cn/ 40 | 41 | # the year that this site was built 创建网站的年份 42 | since_year: 2024 43 | 44 | # users can select text content 允许用户选取网站上的文本内容 45 | selectable: true 46 | 47 | # toc of post 文章目录导航栏 48 | toc: 49 | enable: true 50 | list_number: true # show list number 是否显示编号 51 | max_depth: 6 # Maximum heading depth of generated toc 生成 TOC 的最大深度 52 | max_items: Infinity # Maximum number of items in generated toc, default: Infinity 生成的toc的最大项目数,默认为Infinity无限 53 | 54 | # count words in post 文章字数统计 55 | word_count: 56 | enable: true 57 | 58 | # indent the first line of paragraph in post by 2em 文章段落首行缩进2字符 59 | text_indent: 60 | enable: false 61 | 62 | # copyright statement 版权声明(比如CC协议) 63 | copyright: 64 | enable: true 65 | license: CC BY-NC-ND 4.0 66 | link: https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh-hans 67 | 68 | # the length of post auto excerpt 文章自动摘要的字符长度 69 | excerpt_length: 200 70 | 71 | # tags page config 标签页面设置 72 | # tag cloud & tag list: just choose one to display 标签云与标签列表只需要选择其一显示 73 | tags: 74 | show_count: true # show posts total count of each tag 显示每个标签的文章总数 75 | tag_cloud: true 76 | tag_list: false 77 | 78 | # categories page config 分类页面设置 79 | categories: 80 | show_count: true # show posts total count of each category 显示每个分类的文章总数 81 | depth: 0 # decide the depth of categories to display: 0-all, 1-only first layer... 显示分类层级:0-显示全部层级,1-只显示第一层…… 82 | 83 | # page view counting(with busuanzi) 访问量统计(使用不蒜子) 84 | page_view: 85 | enable: true 86 | site_pv: true # show site's page view 显示网站访问量信息 87 | post_pv: true # show post's page view 显示文章访问量信息 88 | 89 | # contact information, add item in 'name: url' format, stay blank if you don't want to show that item 联系方式,新增项请按'名称: 链接网址'配置,不需要显示的项目则置空 90 | # currently support icons of items below, any other links will be display in paw icon 目前支持以下网站图标,其他链接统一用猫爪图标显示 91 | # Email|邮箱,Github,Twitter,Facebook,Instagram,Tiktok|抖音,Bilibili,Weibo|微博,Mastodon,Wechat|微信 92 | contact_info: 93 | Email: chan.wj@outlook.com 94 | Github: https://github.com/chanwj 95 | QQ: 96 | Twitter: / 97 | Facebook: / 98 | Instagram: 99 | Tiktok: / 100 | Bilibili: / 101 | Weibo: / 102 | AO3: / 103 | Mastodon: 104 | 105 | # other links to display 其他链接 106 | links: 107 | enable: true 108 | links_list: 109 | hexo-theme-meow: # link name 链接名称 110 | desc: 本主题的Github仓库 # link description 链接简介 111 | url: https://github.com/chanwj/hexo-theme-meow 112 | 技术博客A: 113 | desc: 好友A的个人博客,此处仅用于展示效果 114 | url: / 115 | Friend's Blog: 116 | desc: My Friend's Blog, for example. 117 | url: / 118 | 119 | # reward module 赞赏栏目 120 | reward: 121 | enable: true 122 | QR_code: # list your payment QR Code so that users can pay you a coffee 列出你的收款二维码,让用户可以扫描打赏 123 | Wechat: /img/reward/wechat.jpg # payment name: QRCode's image url 支付方式名称: 二维码图片路径 124 | Alipay: /img/reward/alipay.jpg 125 | 126 | # show 'previous article' and 'next article' at the end of post 在文章最后生成'上一篇'和'下一篇'文章的链接 127 | post_prev_next: true 128 | 129 | # the root of site's path, must be as same as the 'root' configuration in the root's _config.yml 网站根目录,填写值与根目录下的_config.yml中的root项必须一致 130 | # if this site was not deployed on a project page(e.g. username.github.io/repository), the default root should be '/' 若网站并非部署在子目录下,root则默认为'/' 131 | root: / 132 | 133 | # comment module (using Giscus) 评论模块(使用Giscus) 134 | # get configuration value through giscus.app 配置值请通过giscus.app获取 135 | comment: 136 | post_enable: true # add comment module at posts 在文章页面增加评论模块 137 | about_enable: true # add comment module at about page 在关于页增加评论模块 138 | data_repo: 139 | data_repo_id: 140 | data_category: 141 | data_category_id: 142 | data_mapping: 143 | data_strict: 144 | data_reactions_enabled: 145 | data_emit_metadata: 146 | data_input_position: 147 | data_theme: 148 | data_lang: 149 | data_loading: # stay blank if you don't want to load comments lazily 如不启用懒加载则置空此项 150 | crossorigin: 151 | 152 | # credits module 致谢栏目 153 | credits: 154 | enable: true 155 | # list people you want to express gratitude, Markdown available 致谢名单,支持Markdown语法 156 | credits_list: '\*奶、**小橘猫**、叉子、example' 157 | 158 | # font config 字体配置 159 | font: 160 | # import fonts links, use Google Fonts 导入字体链接,使用谷歌字体库 161 | # format: - 'url' 配置格式:- 'url' 162 | # recommended fonts 推荐字体 163 | # https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400..700&display=swap 164 | # https://fonts.googleapis.com/css2?family=Noto+Serif&display=swap 165 | # https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300..700&display=swap 166 | url_list: 167 | - 'https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300..700&display=swap' 168 | # use fonts, please keep the content in double quotation marks and seperate each font with comma 使用字体,请用双引号将全部字体包裹起来,逗号分隔不同字体 169 | font_family: "'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', Sans-serif, Serif" 170 | 171 | # toolbar configuration 悬浮工具栏配置 172 | tool_bar: 173 | more_tools: true # display more function button available (e.g. darkmode) 展示更多可用的功能按钮(比如深色模式) 174 | setting_font_size: true # increase or decrease font size of post 增大或减小文章字体 175 | 176 | # darkmode 深色模式 177 | darkmode: 178 | enable: true 179 | start_at: 24:00 # time to start dark theme 自动切换深色模式的开始时间 180 | end_at: 06:00 # time to end dark theme 自动切换深色模式的结束时间 181 | check_system_scheme: false # check if system indicates light or dark color themes 检查系统是否指定模式 182 | save_on_toggle: true # save current mode in local storage 在本地保存现有模式 -------------------------------------------------------------------------------- /fiction.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: {{ title }} 3 | date: {{ date }} 4 | categories: 5 | tags: 6 | layout: post 7 | type: fiction 8 | toc: false 9 | meta_show: true # true: show meta info | false: disable meta info 10 | meta_info: 11 | type: # Original Work | Fanfiction | ... 12 | fandom: # If type is 'Fanction', it's generally necessary to indicate the fandom | stay blank if you don't want to show fandom info 13 | relationship: # stay blank if you don't want to show relationships info 14 | character: # stay blank if you don't want to show characters info 15 | rating: # General | Teen | Mature | Explicit | stay blank if you don't want to show rating 16 | warning: # Anything that audiences should know before reading | stay blank if you don't want to show warnings 17 | status: # Y | N | stay blank if you don't want to show status 18 | summary: # stay blank if you don't want to show summary. Markdown available. 19 | notes_before: # Anything you want to show at the beginning. Markdown available. 20 | notes_after: # Anything you want to show at the end. Markdown available. 21 | --- 22 | -------------------------------------------------------------------------------- /languages/en.yml: -------------------------------------------------------------------------------- 1 | # various menu item 2 | menu: 3 | archives: Archives 4 | category: Category 5 | categories: Categories 6 | tags: Tags 7 | about: About 8 | search: Search 9 | home: Home 10 | toc: TOC 11 | settings: Settings 12 | comment: Comment 13 | darkmode: Darkmode 14 | font_size_increase: Increase Font Size 15 | font_size_decrease: Decrease Font Size 16 | 17 | # site information 18 | # only affects on page display and does not affect webpage meta 19 | blog_info: 20 | title: MEOW 21 | subtitle: A Cute and Bright Hexo Theme 22 | description: 'Preview of Meow: a cute and bright theme for Hexo blog. It optimizes the adaptability of original novel and fanfiction.' 23 | 24 | # posts related item 25 | article: 26 | read_more: Read More 27 | word_count: About %s words 28 | copyright: Copyright 29 | copyright_desc: BY-NC-ND 4.0 30 | # description of reward for posts, Markdown available 31 | reward: If you like this article, welcome to pay me a coffee, thanks💗 32 | previous_post: Previous Article 33 | next_post: Next Article 34 | top: '📌**Pinned**' # Markdown available 35 | 36 | # navigation item 37 | navigation: 38 | back_to_top: Back To Top 39 | back_to_home: Back To Home 40 | menu_toggle: Open Menu 41 | 42 | # pagination item 43 | pagination: 44 | prev: Previous Page 45 | next: Next Page 46 | 47 | # datetime item 48 | datetime: 49 | published: Published date 50 | updated: Updated date 51 | 52 | # 404 page 53 | page_not_found: 54 | tips: This Page Dose Not Exist. 55 | 56 | # search panel item 57 | search: 58 | tips: Please enter the content to search... 59 | result_count: Matching results 60 | no_result: No matching articles were found. 61 | 62 | # page view counting 63 | page_view: 64 | site_pv: Total hits 65 | site_uv: Total visitors 66 | post_pv: Hits 67 | 68 | # posts with type 'fiction' 69 | fiction: 70 | meta: 71 | type: Type 72 | fandom: Fandom 73 | relationship: Relationship 74 | character: Character 75 | rating: Rating 76 | warning: Warning 77 | status: 78 | complete: COMPLETE 79 | in_progress: TO BE CONTINUED 80 | summary: Summary 81 | notes: Notes 82 | rating: 83 | General: General Audiences 84 | Teen: Teen And Up Audiences 85 | Mature: Mature 86 | Explicit: Explicit 87 | 88 | # 'About' page 89 | about: 90 | about_blog: 91 | title: About This Site 92 | # keywords of this blog, split with ',' 93 | keywords: Hexo,Theme,Blog,Tutorial 94 | # introduction for this blog,Markdown available 95 | introduction: '- 「Meow」is a theme for Hexo blog, the source code was already public on [Github](https://github.com/chanwj/hexo-theme-meow). 96 | 97 | - This theme has cute style and bright colors. I hope anyone who see it can have a good mood. 98 | 99 | - In addition to supporting the basic purpose of blogs, this theme also optimizes the creation of literary works, allowing every author to use scaffold to publish original novel and fanfiction easily. 100 | 101 | - This website provides preview for this theme. It also provides guides for theme installation and configuration. I hope it will be helpful to you.' 102 | # Additional notes, Markdown available 103 | supplement: '🌟It cost a lot of time and efforts for me to make this work. If you need to use this theme, **please keep the copyright information of this theme in the footer**, show respect to the author and creation, which can also help more people in need to know this theme. Thank you very much!' 104 | about_author: 105 | title: About The Author 106 | description: A ginger cat focuses on writing and coding. 107 | about_contact: Contact Me 108 | about_links: Links 109 | reward: 110 | title: Rewards 111 | # description of reward for the author or the site, Markdown available 112 | description: If this theme is helpful to you, welcome to scan the QR Code to reward the author. Your encouragement and support are very important for my continuous creation. Thank you!💗 113 | credits: 114 | title: Credits 115 | # to express gratitude, Markdown available 116 | description: 'Thanks so much for the strong support from these friends! 💕
(p.s. bold = important contributions, underlined = gave reward)' 117 | 118 | -------------------------------------------------------------------------------- /languages/zh-CN.yml: -------------------------------------------------------------------------------- 1 | # 导航栏菜单项显示值 2 | menu: 3 | archives: 归档 4 | category: 分类 5 | categories: 分类 6 | tags: 标签 7 | about: 关于 8 | search: 搜索 9 | home: 主页 10 | toc: 目录 11 | settings: 设置 12 | comment: 评论 13 | darkmode: 深色模式 14 | font_size_increase: 放大字体 15 | font_size_decrease: 缩小字体 16 | 17 | # 网站信息 18 | # 此处的配置仅影响页内展示,不影响网页meta 19 | blog_info: 20 | title: MEOW 21 | subtitle: 可爱明亮的Hexo主题 22 | description: Hexo主题「Meow」展示站。本主题尤其适用于发布原创小说、同人二创等文学作品。 23 | 24 | # 文章相关显示值 25 | article: 26 | read_more: 阅读全文 27 | word_count: 全文约%s字 28 | copyright: 版权声明 29 | copyright_desc: 署名-非商业性使用-禁止演绎 4.0 30 | # 关于文章赞赏支持的说明,支持Markdown语法 31 | reward: 如果您喜欢这篇文章,欢迎赞赏支持作者,谢谢💗 32 | previous_post: 上一篇文章 33 | next_post: 下一篇文章 34 | top: '📌**置顶**' # 支持Markdown语法 35 | 36 | # 导航相关 37 | navigation: 38 | back_to_top: 返回顶部 39 | back_to_home: 返回首页 40 | menu_toggle: 打开菜单 41 | 42 | # 分页相关显示值 43 | pagination: 44 | prev: 上一页 45 | next: 下一页 46 | 47 | # 日期时间相关显示值 48 | datetime: 49 | published: 发布日期 50 | updated: 更新日期 51 | 52 | # 404页面相关 53 | page_not_found: 54 | tips: 此页面不存在 55 | 56 | # 搜索面板相关 57 | search: 58 | tips: 请输入需要搜索的内容…… 59 | result_count: 匹配结果数 60 | no_result: 未搜索到匹配的文章。 61 | 62 | # 访问量统计 63 | page_view: 64 | site_pv: 总访问量 65 | site_uv: 总访客数 66 | post_pv: 阅读次数 67 | 68 | # fiction类型的文章相关显示值 69 | fiction: 70 | meta: 71 | type: 类型 72 | fandom: 原型 73 | relationship: 关系 74 | character: 角色 75 | rating: 分级 76 | warning: 预警 77 | status: 78 | complete: 完结 79 | in_progress: 未完待续 80 | summary: 简介 81 | notes: 作者的话 82 | rating: 83 | General: 全年龄 84 | Teen: 青少年及以上 85 | Mature: 成人向 86 | Explicit: 限制级 87 | 88 | # “关于”页面相关显示值 89 | about: 90 | about_blog: 91 | title: 关于本站 92 | # 博客关键词,以','分隔 93 | keywords: Hexo,主题,博客,开源,教程 94 | # 介绍博客,支持Markdown语法 95 | introduction: '- 「Meow」是一款可应用于Hexo博客框架的主题,源码已在[Github](https://github.com/chanwj/hexo-theme-meow)上公开。 96 | 97 | - 本主题风格可爱,色彩明亮,希望大家看到就能拥有一份好心情~ 98 | 99 | - 除了支持博客的基本用途之外,本主题还针对文学创作进行了优化,让各位作者大大可以更方便地使用模板发表原创小说、同人作品。 100 | 101 | - 本站全方位地展示了这款主题的应用效果,并且发布了相关的安装配置指南,可供大家参考使用。' 102 | # 补充说明/备注,支持Markdown语法 103 | supplement: '🌟这是作者投入许多时间与精力制作而成的作品,如果您需要使用本主题,**请保留页脚部分的主题版权信息**,尊重作者与创作,这样也可以帮助更多有需要的人了解本主题,非常感谢!' 104 | about_author: 105 | title: 关于作者 106 | description: 一只既写小说又敲代码的橘猫,是个糕手。 107 | about_contact: 联系方式 108 | about_links: 其他链接 109 | reward: 110 | title: 赞赏 111 | # 关于赞赏支持的说明,支持Markdown语法 112 | description: 如果这个主题对您有帮助,欢迎扫码赞赏作者~各位的鼓励与支持是我持续创作的动力,谢谢💗 113 | credits: 114 | title: 致谢 115 | # 致谢词,支持Markdown语法 116 | description: '感谢这些朋友的大力支持~比心💕
注:字体加粗=重要贡献,下划线=打赏支持' 117 | 118 | -------------------------------------------------------------------------------- /layout/404.pug: -------------------------------------------------------------------------------- 1 | .page-not-found 2 | h1= '404' 3 | p= __('page_not_found.tips') 4 | a(href= url_for())= __('navigation.back_to_home') -------------------------------------------------------------------------------- /layout/_partial/article-index.pug: -------------------------------------------------------------------------------- 1 | article.index-post-item 2 | //- 文章标题 3 | .post-title-index 4 | h1 5 | a(href= url_for(post.path)) 6 | i.fa-solid.fa-paw 7 | | #{ post.title } 8 | 9 | if post.sticky 10 | .post-top 11 | | !{ markdown(__('article.top'))} 12 | 13 | .post-head-info 14 | //- post's date info 文章日期相关信息 15 | | !{ partial('_partial/post/date') } 16 | 17 | //- post's categories info 文章分类 18 | | !{ partial('_partial/post/post-categories') } 19 | 20 | //- post's excerpt 文章摘要 21 | .post-excerpt 22 | if post.excerpt 23 | | !{ post.excerpt } 24 | else if post.summary 25 | | !{ markdown(post.summary) } 26 | else 27 | //- generate excerpt automatically if no excerpt 如果没有可用的摘要则自动生成摘要 28 | | !{ truncate(strip_html(post.content), {length: theme.excerpt_length}) } 29 | 30 | //- read more button "阅读全文"按钮 31 | .read-more 32 | i.fa-solid.fa-paw.fa-xs 33 | a.read-more-link(href= url_for(post.path))= __('article.read_more') 34 | 35 | //- post's tags info 文章标签 36 | | !{ partial('_partial/post/post-tags') } 37 | -------------------------------------------------------------------------------- /layout/_partial/article-item.pug: -------------------------------------------------------------------------------- 1 | .article-item 2 | a.article-item-card(href= url_for(post.path)) 3 | .article-item-title 4 | span= post.title 5 | 6 | .article-item-preview 7 | - let content = "" 8 | if post.excerpt 9 | - content= strip_html(post.excerpt) 10 | else if post.summary 11 | - content= strip_html(markdown(post.summary)) 12 | else 13 | - content= strip_html(post.content) 14 | 15 | span= truncate(content, {length: 80}) 16 | 17 | .article-item-hover 18 | span= date(post.date) 19 | i.fa-solid.fa-paw 20 | -------------------------------------------------------------------------------- /layout/_partial/article.pug: -------------------------------------------------------------------------------- 1 | article.post 2 | //- article's title 文章标题 3 | .post-title 4 | h1 5 | i.fa-solid.fa-paw 6 | | #{ post.title } 7 | 8 | //- article's info 文章相关信息 9 | .post-info 10 | .post-info-first-line 11 | //- published date, updated date 发布日期、更新日期 12 | | !{ partial('_partial/post/date') } 13 | 14 | //- categories 分类 15 | | !{ partial('_partial/post/post-categories') } 16 | 17 | //- tags 标签 18 | | !{ partial('_partial/post/post-tags') } 19 | 20 | .post-info-second-line 21 | //- copyright statement 版权声明 22 | | !{ partial('_partial/post/copyright') } 23 | 24 | //- words counting 字数 25 | | !{ partial('_partial/post/word-count') } 26 | 27 | //- article's page view 文章访问量统计 28 | if theme.page_view.post_pv 29 | | !{ partial('_partial/pageview/pageview-post') } 30 | 31 | //- determine whether to indent the first line of paragraph by 2em 判断是否需要段落首行缩进两字符 32 | - var text_indent = (theme.text_indent.enable && (post.indent == undefined || post.indent)) || (!theme.text_indent.enable && (post.indent)) ? true.toString() : false 33 | 34 | //- fiction has its own layout content 小说类型的文章有特别的展示内容 35 | if post.type === 'fiction' 36 | if post.meta_show 37 | .fiction-meta 38 | if post.meta_info.type 39 | .fiction-meta-item 40 | .fiction-meta-key 41 | i.fa-solid.fa-caret-right 42 | | #{ __('fiction.meta.type') }: 43 | .fiction-meta-value 44 | span= post.meta_info.type 45 | 46 | if post.meta_info.fandom 47 | .fiction-meta-item 48 | .fiction-meta-key 49 | i.fa-solid.fa-caret-right 50 | | #{ __('fiction.meta.fandom') }: 51 | .fiction-meta-value 52 | span= post.meta_info.fandom 53 | 54 | if post.meta_info.relationship 55 | .fiction-meta-item 56 | .fiction-meta-key 57 | i.fa-solid.fa-caret-right 58 | | #{ __('fiction.meta.relationship') }: 59 | .fiction-meta-value 60 | span= post.meta_info.relationship 61 | 62 | if post.meta_info.character 63 | .fiction-meta-item 64 | .fiction-meta-key 65 | i.fa-solid.fa-caret-right 66 | | #{ __('fiction.meta.character') }: 67 | .fiction-meta-value 68 | span= post.meta_info.character 69 | 70 | if post.meta_info.rating 71 | .fiction-meta-item#fiction-meta-rating 72 | .fiction-meta-key 73 | i.fa-solid.fa-caret-right 74 | | #{ __('fiction.meta.rating') }: 75 | .fiction-meta-value 76 | - const rating = post.meta_info.rating 77 | span(rating= rating)= __('fiction.rating.' + rating) 78 | 79 | if post.meta_info.warning 80 | .fiction-meta-item#fiction-meta-warning 81 | .fiction-meta-key 82 | i.fa-solid.fa-caret-right 83 | | #{ __('fiction.meta.warning') }: 84 | .fiction-meta-value 85 | span= post.meta_info.warning 86 | 87 | if (post.summary || post.notes_before) 88 | .fiction-before-content(text-indent=text_indent) 89 | if post.summary 90 | .fiction-summary 91 | h4= __('fiction.summary') 92 | | !{ markdown(post.summary) } 93 | 94 | if post.notes_before 95 | .fiction-notes-before 96 | h4= __('fiction.notes') 97 | | !{ markdown(post.notes_before) } 98 | 99 | //- article's content 文章内容 100 | .post-content(text-indent=text_indent) 101 | | !{ post.content } 102 | 103 | if post.type === 'fiction' 104 | if post.status 105 | .fiction-status 106 | | ~ 107 | if post.status === 'N' || post.status === 'inProgress' 108 | | #{ __('fiction.status.in_progress') } 109 | else 110 | | #{ __('fiction.status.complete') } 111 | | ~ 112 | 113 | if post.notes_after 114 | .fiction-notes-after(text-indent=text_indent) 115 | h4= __('fiction.notes') 116 | | !{ markdown(post.notes_after) } 117 | 118 | if theme.post_prev_next || theme.reward.enable 119 | .post-end 120 | //- previous post link 链接上一篇文章 121 | .post-prev 122 | if theme.post_prev_next && post.prev 123 | a(href= url_for(post.prev.path), title= __('article.previous_post')) 124 | i.fa-solid.fa-chevron-left.fa-lg 125 | 126 | //- reward button 赞赏按钮 127 | if theme.reward.enable 128 | | !{ partial('_partial/post/reward') } 129 | 130 | //- next post link 链接下一篇文章 131 | .post-next 132 | if theme.post_prev_next && post.next 133 | a(href= url_for(post.next.path), title= __('article.next_post')) 134 | i.fa-solid.fa-chevron-right.fa-lg 135 | -------------------------------------------------------------------------------- /layout/_partial/blog-info.pug: -------------------------------------------------------------------------------- 1 | .blog-info 2 | //- display site icon 展示博客图标 3 | .blog-pic 4 | img#blog-pic(src= url_for(theme.blog_pic)) 5 | 6 | //- blog's title 博客标题 7 | .blog-title 8 | i.fa-solid.fa-paw.fa-2xs.fa-rotate-by 9 | span= __('blog_info.title') 10 | i.fa-solid.fa-paw.fa-2xs.fa-rotate-by 11 | 12 | //- blog's description 博客介绍 13 | .blog-desc 14 | | !{ __('blog_info.description') } 15 | -------------------------------------------------------------------------------- /layout/_partial/comment.pug: -------------------------------------------------------------------------------- 1 | .comment#comment 2 | script(src="https://giscus.app/client.js", 3 | data-repo=theme.comment.data_repo, 4 | data-repo-id=theme.comment.data_repo_id, 5 | data-category=theme.comment.data_category, 6 | data-category-id=theme.comment.data_category_id, 7 | data-mapping=theme.comment.data_mapping, 8 | data-strict=theme.comment.data_strict, 9 | data-reactions-enabled=theme.comment.data_reactions_enabled, 10 | data-emit-metadata=theme.comment.data_emit_metadata, 11 | data-input-position=theme.comment.data_input_position, 12 | data-theme=theme.comment.data_theme, 13 | data-lang=theme.comment.data_lang, 14 | data-loading=theme.comment.data_loading, 15 | crossorigin=theme.comment.crossorigin, 16 | async) -------------------------------------------------------------------------------- /layout/_partial/footer.pug: -------------------------------------------------------------------------------- 1 | footer 2 | .footer-content 3 | //- copyright information 版权信息 4 | //- It's not easy to create a theme, please keep the copyright information of this theme in the footer to support theme author. Thank you very much! 制作主题不易,请保留footer中的主题版权信息来支持作者、支持创作,谢谢~ 5 | .copyright-info 6 | i.fa-regular.fa-copyright.fa-xs 7 | - let current_year = date(Date.now(), "YYYY"); 8 | if current_year != theme.since_year 9 | span= theme.since_year + ' - ' + current_year + ' ' 10 | else 11 | span= theme.since_year + ' ' 12 | a(href= url_for('/about'))= config.author 13 | i.fa-solid.fa-cat.fa-sm 14 | span= 'Powered by ' 15 | a(href="https://hexo.io/", target="_blank")= 'Hexo' 16 | span= ' & ' 17 | a(href="https://github.com/chanwj/hexo-theme-meow", target="_blank", title=theme.version)= 'Theme Meow' 18 | 19 | //- site register info 备案信息 20 | if theme.register_info.enable 21 | .register-info 22 | a#register_link( 23 | target="_blank" 24 | href= theme.register_info.query_url) 25 | = theme.register_info.record_info 26 | 27 | //- site's page view 网站访问量统计 28 | if theme.page_view.site_pv 29 | | !{ partial('_partial/pageview/pageview-site') } 30 | -------------------------------------------------------------------------------- /layout/_partial/head.pug: -------------------------------------------------------------------------------- 1 | meta(charset='utf-8') 2 | meta(name="viewport" content="width=device-width, initial-scale=1.0") 3 | meta(name="author" content= config.author) 4 | //- meta(name="description" content= config.description) 5 | meta(name="keyword" content= config.keywords) 6 | 7 | //- Open Graph message for SEO 优化SEO的Open Graph信息 8 | | !{ open_graph({description:page.summary}) } 9 | 10 | //- page title: current page name - blog's name - blog's subtitle 页面标题:当前页面名称 - 博客标题 - 博客副标题 11 | title 12 | if is_archive() 13 | | !{ __('menu.archives') } - 14 | else if is_category() 15 | | !{ __('menu.category') } : !{ page.category } - 16 | else if is_tag() 17 | | !{ __('menu.tags') } : !{ page.tag } - 18 | else if page.title 19 | | !{ page.title } - 20 | | !{ __('blog_info.title') } - !{ __('blog_info.subtitle') } 21 | 22 | //- favicon 网站图标 23 | if theme.blog_pic 24 | | !{ favicon_tag(theme.blog_pic) } 25 | 26 | //- link css 引入css 27 | | !{ css({href: 'css/style', id: 'dm-light'}) } 28 | //- icon library 图标库 29 | | !{ css('https://cdn.bootcdn.net/ajax/libs/font-awesome/6.4.2/css/all.min.css') } 30 | 31 | //- link js 引入js 32 | //- page view counting 统计网站浏览量数据 33 | if theme.page_view.enable 34 | | !{ js({src:'//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js', async: true}) } 35 | 36 | //- aplayer 音乐播放器 37 | if page.music 38 | | !{ css('css/third-party/APlayer.min') } 39 | | !{ js('js/third-party/APlayer.min') } -------------------------------------------------------------------------------- /layout/_partial/header.pug: -------------------------------------------------------------------------------- 1 | header 2 | .top-nav( ondblclick= "scrollToTop()" ) 3 | //- blog's information at the left 左侧的博客信息 4 | .nav-info 5 | //- site icon 网站图标 6 | .nav-icon: img#nav-icon(src= url_for(theme.blog_pic)) 7 | 8 | //- site's title, link to homepage 网站标题,可跳转回首页 9 | .nav-title: a#nav-title(href= url_for(), title= __('menu.home')) 10 | = config.title 11 | 12 | //- functional ribbon at the right 右侧的功能区 13 | .nav-ribbon 14 | //- top menu 导航菜单项 15 | .top-menu-expanded 16 | - for(const item in theme.menu) 17 | case item 18 | when "archives" 19 | a.top-menu-item(href= url_for(config.archive_dir)) 20 | //- i.fa-solid.fa-box-archive.fa-sm 21 | span= __('menu.archives') 22 | when "categories" 23 | a.top-menu-item(href= url_for(config.category_dir)) 24 | //- i.fa-regular.fa-folder-open.fa-sm 25 | span= __('menu.categories') 26 | when "tags" 27 | a.top-menu-item(href= url_for(config.tag_dir)) 28 | //- i.fa-solid.fa-tags.fa-sm 29 | span= __('menu.tags') 30 | default 31 | a.top-menu-item(href= url_for(theme.menu[item])) 32 | //- i.fa-solid.fa-paw.fa-sm 33 | span= __('menu.' + item) 34 | 35 | //- search module 搜索框 36 | if theme.search.enable 37 | .top-search( onclick= "toggleSearchWindow()" ) 38 | #top-search-btn(title= __('menu.search')) 39 | i.icon.fa-solid.fa-magnifying-glass 40 | span= __('menu.search') 41 | 42 | //- menu button(display at small screen) 导航菜单展开按钮(使用小屏设备时显示) 43 | #top-menu-btn( onclick= "openTopMenu()", title= __('navigation.menu_toggle') ) 44 | i.fa-solid.fa-bars.fa-lg 45 | 46 | //- menu display at small screen after click the button 小屏设备下的下拉导航菜单 47 | #top-menu-hidden 48 | .menu-hidden-content 49 | .menu-hidden-nav 50 | - for(const item in theme.menu) 51 | case item 52 | when "archives" 53 | a.menu-hidden-item(href= url_for(config.archive_dir)) 54 | i.fa-solid.fa-box-archive.fa-sm 55 | span= __('menu.archives') 56 | when "categories" 57 | a.menu-hidden-item(href= url_for(config.category_dir)) 58 | i.fa-regular.fa-folder-open.fa-sm 59 | span= __('menu.categories') 60 | when "tags" 61 | a.menu-hidden-item(href= url_for(config.tag_dir)) 62 | i.fa-solid.fa-tags.fa-sm 63 | span= __('menu.tags') 64 | default 65 | a.menu-hidden-item(href= url_for(theme.menu[item])) 66 | i.fa-solid.fa-paw.fa-sm 67 | span= __('menu.' + item) 68 | .menu-hidden-blank( onclick= "closeTopMenu()" ) 69 | -------------------------------------------------------------------------------- /layout/_partial/menu-index.pug: -------------------------------------------------------------------------------- 1 | - for(const item in theme.menu) 2 | case item 3 | when "archives" 4 | a.menu-item(href= url_for(config.archive_dir)) 5 | span= __('menu.' + item) 6 | when "categories" 7 | a.menu-item(href= url_for(config.category_dir)) 8 | span= __('menu.' + item) 9 | when "tags" 10 | a.menu-item(href= url_for(config.tag_dir)) 11 | span= __('menu.' + item) 12 | default 13 | a.menu-item(href= url_for(theme.menu[item])) 14 | span= __('menu.' + item) 15 | -------------------------------------------------------------------------------- /layout/_partial/other-resources.pug: -------------------------------------------------------------------------------- 1 | //- send needful configuration values to script 向script传入需要的配置值 2 | script. 3 | const GLOBAL_CONFIG = { 4 | comment: { theme: '#{theme.comment.data_theme}'} 5 | } 6 | 7 | //- darkmode 深色模式 8 | if theme.darkmode.enable 9 | | !{ js('js/third-party/darkmode') } 10 | 11 | script. 12 | var options = { 13 | dark: '#{url_for("/css/darkmode.css")}', 14 | startAt: '#{theme.darkmode.start_at}', 15 | endAt: '#{theme.darkmode.end_at}', 16 | checkSystemScheme: '#{theme.darkmode.check_system_scheme}', 17 | saveOnToggle: '#{theme.darkmode.save_on_toggle}' 18 | }; 19 | var darkMode = new DarkMode(options); 20 | // change comment theme synchronously 同步修改评论区主题 21 | if (darkMode.getMode() == "dark" && (#{theme.comment.post_enable} || #{theme.comment.about_enable})) { 22 | if (document.getElementById('comment')) { 23 | document.getElementById('comment').getElementsByTagName('script')[0].setAttribute('data-theme', 'noborder_dark'); 24 | } 25 | } 26 | 27 | //- get current font size in local storage 在本地存储中获取文章当前字体大小 28 | if is_post() && theme.tool_bar.setting_font_size 29 | script. 30 | if (localStorage.getItem('font-size')) { 31 | document.querySelector('.post-content').style.fontSize = localStorage.getItem('font-size') + 'px'; 32 | } 33 | 34 | | !{ js('js/theme/tool-bar') } 35 | | !{ js('js/theme/menu') } 36 | 37 | //- clipboard 剪贴板 38 | | !{ js('js/third-party/clipboard.min') } 39 | | !{ js('js/theme/copy') } 40 | script. 41 | copyCode(); 42 | 43 | //- reward function 奖赏功能 44 | if theme.reward.enable && is_post() 45 | | !{ js('js/theme/reward') } 46 | 47 | //- search function 搜索功能 48 | if theme.search.enable 49 | | !{ js('js/jquery-3.7.1.min') } 50 | | !{ js('js/theme/search') } 51 | 52 | script. 53 | searchFunc('#{url_for(config.search.path)}', 'search-input', 'search-result'); 54 | 55 | //- APlayer 音乐播放器 56 | if page.music && theme.toc.enable && (page.toc == undefined || page.toc) 57 | | !{ js('js/theme/toc') } 58 | //- Since APlayer conflicts with TOC function, it is necessary to decode URLs from TOC 因为APlayer与TOC功能冲突,需要额外对TOC链接进行解码才能正常跳转 59 | script. 60 | decodeToc(); -------------------------------------------------------------------------------- /layout/_partial/pageview/pageview-post.pug: -------------------------------------------------------------------------------- 1 | .pageview-post 2 | i.icon.fa-regular.fa-eye 3 | span#busuanzi_container_page_pv 4 | | #{ __('page_view.post_pv') }: 5 | span#busuanzi_value_page_pv 6 | i.fa-solid.fa-spinner -------------------------------------------------------------------------------- /layout/_partial/pageview/pageview-site.pug: -------------------------------------------------------------------------------- 1 | .pageview-site 2 | span#busuanzi_container_site_pv 3 | | #{ __('page_view.site_pv') } : 4 | span#busuanzi_value_site_pv 5 | i.fa-solid.fa-spinner 6 | 7 | span#busuanzi_container_site_uv 8 | | #{ __('page_view.site_uv') } : 9 | span#busuanzi_value_site_uv 10 | i.fa-solid.fa-spinner -------------------------------------------------------------------------------- /layout/_partial/pagination.pug: -------------------------------------------------------------------------------- 1 | //- //- 上一页 2 | //- .page-prev 3 | //- if page.prev > 0 4 | //- a(href= url_for(page.prev_link), title= __('pagination.prev')) 5 | //- i.icon-prev.fa-solid.fa-chevron-left 6 | //- else 7 | //- i#icon-prev-none.icon-prev.fa-solid.fa-chevron-left 8 | 9 | //- //- 当前页数 10 | //- .current-page 11 | //- span#current-page-num= page.current 12 | 13 | //- //- 下一页 14 | //- .page-next 15 | //- if page.next > 0 16 | //- a(href= url_for(page.next_link), title= __('pagination.next')) 17 | //- i.icon-next.fa-solid.fa-chevron-right 18 | //- else 19 | //- i#icon-next-none.icon-next.fa-solid.fa-chevron-right 20 | 21 | 22 | | !{ paginator({prev_text: '', next_text: '', escape: false, mid_size: 1, force_prev_next: true}) } -------------------------------------------------------------------------------- /layout/_partial/post/copyright.pug: -------------------------------------------------------------------------------- 1 | if theme.copyright.enable 2 | .post-copyright 3 | i.icon.fa-brands.fa-creative-commons(title= __('article.copyright')) 4 | span= __('article.copyright') + ': ' 5 | a(href= theme.copyright.link, title= theme.copyright.license) 6 | = __('article.copyright_desc') 7 | -------------------------------------------------------------------------------- /layout/_partial/post/date.pug: -------------------------------------------------------------------------------- 1 | .post-date 2 | if is_home() 3 | //- post's published date(formatted by config.date_format) 文章发表日期(显示格式由config.date_format配置) 4 | i.icon.fa-regular.fa-calendar-plus(title= __('datetime.published')) 5 | time.publish-time= date(post.date) 6 | else 7 | //- post's published date(formatted by config.date_format) 文章发表日期(显示格式由config.date_format配置) 8 | i.icon.fa-regular.fa-calendar-plus(title= __('datetime.published')) 9 | time.publish-time= date(post.date) 10 | 11 | //- post's updated date 文章更新日期 12 | i.icon.fa-regular.fa-calendar-check(title= __('datetime.updated')) 13 | time.update-time= date(post.updated) 14 | -------------------------------------------------------------------------------- /layout/_partial/post/post-categories.pug: -------------------------------------------------------------------------------- 1 | if post.categories && post.categories.length>0 2 | .post-categories 3 | - for (cat of post.categories.toArray()) 4 | i.icon.fa-regular.fa-folder-open(title= __('menu.categories')) 5 | a.post-category(href= url_for(cat.path))= cat.name 6 | -------------------------------------------------------------------------------- /layout/_partial/post/post-tags.pug: -------------------------------------------------------------------------------- 1 | if post.tags && post.tags.length>0 2 | .post-tags 3 | - for (tag of post.tags.toArray()) 4 | i.icon.fa-solid.fa-tags(title= __('menu.tags')) 5 | a.post-tag(href= url_for(tag.path))= tag.name 6 | -------------------------------------------------------------------------------- /layout/_partial/post/reward.pug: -------------------------------------------------------------------------------- 1 | //- reward button 赞赏按钮 2 | .post-reward( onclick="openPostReward()", title= __('about.reward.title') ) 3 | i.fa-regular.fa-thumbs-up.fa-xl.fa-beat-fade 4 | 5 | //- reward panel expanded 展开的赞赏栏 6 | #reward-panel( onclick="closePostReward()" ) 7 | .reward-container 8 | | !{ markdown(__('article.reward')) } 9 | 10 | .reward-nav 11 | - for (reward_item in theme.reward.QR_code) 12 | .reward-item 13 | img.reward-img(src= url_for(theme.reward.QR_code[reward_item]), title= reward_item, alt= reward_item) 14 | span= reward_item -------------------------------------------------------------------------------- /layout/_partial/post/toc.pug: -------------------------------------------------------------------------------- 1 | if !(undefined != post.toc && !post.toc) 2 | #post-toc 3 | aside.toc-aside 4 | .toc-title 5 | span 6 | i.fa-solid.fa-paw 7 | | #{ __('menu.toc') } 8 | 9 | .toc-container#toc-body 10 | | !{ toc(post.encrypt ? post.origin : post.content, { class: 'toc-content', list_number: theme.toc.list_number, max_depth: theme.toc.max_depth, max_items: theme.toc.max_items}) } 11 | 12 | .toc-blank( onclick= "tocToggle()" ) -------------------------------------------------------------------------------- /layout/_partial/post/word-count.pug: -------------------------------------------------------------------------------- 1 | - 2 | var pure_content = post.encrypt ? strip_html(post.origin) : strip_html(post.content); 3 | //- count only English words, numbers and Chinese characters 只统计中文字符、英文单词和数字 4 | var word_list = pure_content.match(/[\u4E00-\u9FA5]|[A-Za-z]+|[0-9]+/g) || []; 5 | //- console.log(word_list.toString()) 6 | //- console.log(word_list.length); 7 | var word_num = ""; 8 | if (word_list.length >= 10000) { 9 | word_num = (word_list.length / 10000).toFixed(1) + "W"; 10 | } else if (word_list.length >= 100) { 11 | word_num = (word_list.length / 1000).toFixed(1) + "K"; 12 | } else { 13 | word_num = word_list.length.toString(); 14 | } 15 | 16 | if theme.word_count.enable 17 | .post-word-count 18 | i.icon.fa-solid.fa-pen-to-square 19 | span= _p('article.word_count', (post.lang).startsWith('zh') ? word_num : word_list.length.toString()) -------------------------------------------------------------------------------- /layout/_partial/search.pug: -------------------------------------------------------------------------------- 1 | #search-panel 2 | .search-container 3 | .search-head 4 | .search-title 5 | span 6 | i.fa-solid.fa-paw 7 | | #{ __('menu.search') } 8 | 9 | .search-close-btn( onclick= "toggleSearchWindow()" ) 10 | i.fa-regular.fa-circle-xmark 11 | 12 | .search-box 13 | i.fa-solid.fa-magnifying-glass 14 | input#search-input(type= 'text', placeholder= __('search.tips'), value= '') 15 | 16 | .search-body 17 | #search-count= __('search.result_count') + ': ' 18 | 19 | #search-result 20 | 21 | #search-result-empty= __('search.no_result') 22 | -------------------------------------------------------------------------------- /layout/_partial/tool-bar.pug: -------------------------------------------------------------------------------- 1 | #tool-bar 2 | #tool-bar-main 3 | //- more functions toggle button 更多功能开关按钮 4 | #tool-toggle( onclick= "toolToggle()", title= __('menu.settings') ) 5 | i.fa-solid.fa-gear 6 | 7 | //- TOC switch TOC开关 8 | if (is_post() && theme.toc.enable && !(undefined != page.toc && !page.toc)) 9 | #toc-toggle( onclick= "tocToggle()", title= __('menu.toc') ) 10 | i.fa-solid.fa-list-ul 11 | 12 | //- go to comment 跳转至评论区 13 | if (is_post() && theme.comment.post_enable && page.comments) || (page.layout == 'about' && theme.comment.about_enable) 14 | #go-to-comment( onclick= "gotoComment()", title= __('menu.comment') ) 15 | i.fa-regular.fa-message.fa-flip-horizontal 16 | 17 | //- back to top button 返回顶部 18 | #back-to-top( onclick= "scrollToTop()", title= __('navigation.back_to_top') ) 19 | i.fa-solid.fa-chevron-up 20 | 21 | //- "more functions" module "更多工具"模块 22 | if theme.tool_bar.more_tools 23 | #tool-bar-more(style="display: none;") 24 | //- darkmode switch 深色模式开关 25 | if theme.darkmode.enable 26 | #darkmode-switch( onclick= "darkmodeSwitch()", title= __('menu.darkmode') ) 27 | i.fa-solid.fa-circle-half-stroke 28 | 29 | //- increase or decrease font size of post 增大或减小文章字体 30 | if is_post() && theme.tool_bar.setting_font_size 31 | #font-size-increase( onclick= "fontSizeIncrease()", title= __('menu.font_size_increase') ) 32 | i.fa-solid.fa-plus 33 | #font-size-decrease( onclick= "fontSizeDecrease()", title= __('menu.font_size_decrease') ) 34 | i.fa-solid.fa-minus -------------------------------------------------------------------------------- /layout/about.pug: -------------------------------------------------------------------------------- 1 | .about-container 2 | .about-blog 3 | h1 4 | i.fa-solid.fa-paw 5 | | #{ __('about.about_blog.title') } 6 | 7 | .about-keywords 8 | - const keywords = __('about.about_blog.keywords'); 9 | - const keywords_list = keywords.split(','); 10 | - for (kw of keywords_list) 11 | span.about-keywords-tag= kw 12 | 13 | .about-blog-intro 14 | | !{ markdown(__('about.about_blog.introduction')) } 15 | 16 | .about-blog-supplement 17 | | !{ markdown(__('about.about_blog.supplement')) } 18 | 19 | .about-author 20 | h1 21 | i.fa-solid.fa-paw 22 | | #{ __('about.about_author.title') } 23 | 24 | .about-author-nav 25 | img#author-img(src= url_for(theme.author_pic)) 26 | 27 | .about-author-info 28 | .author-name= config.author 29 | 30 | .author-desc= __('about.about_author.description') 31 | 32 | .about-contact 33 | h1 34 | i.fa-solid.fa-paw 35 | | #{ __('about.about_contact') } 36 | 37 | .contact-nav 38 | - for (contact_item in theme.contact_info) 39 | if theme.contact_info[contact_item] != null 40 | .contact-item(title= contact_item) 41 | case contact_item 42 | when 'Email' 43 | i.fa-solid.fa-envelope.fa-xl 44 | when '邮箱' 45 | i.fa-solid.fa-envelope.fa-xl 46 | when 'Github' 47 | i.fa-brands.fa-github.fa-xl 48 | when 'Twitter' 49 | i.fa-brands.fa-twitter.fa-xl 50 | when 'Facebook' 51 | i.fa-brands.fa-facebook.fa-xl 52 | when 'Instagram' 53 | i.fa-brands.fa-instagram.fa-xl 54 | when 'Tiktok' 55 | i.fa-brands.fa-tiktok.fa-xl 56 | when '抖音' 57 | i.fa-brands.fa-tiktok.fa-xl 58 | when 'Bilibili' 59 | i.fa-brands.fa-bilibili.fa-xl 60 | when 'Weibo' 61 | i.fa-brands.fa-weibo.fa-xl 62 | when '微博' 63 | i.fa-brands.fa-weibo.fa-xl 64 | when 'Wechat' 65 | i.fa-brands.fa-weixin.fa-xl 66 | when '微信' 67 | i.fa-brands.fa-weixin.fa-xl 68 | when 'Mastodon' 69 | i.fa-brands.fa-mastodon.fa-xl 70 | when 'QQ' 71 | i.fa-brands.fa-qq.fa-xl 72 | default 73 | i.fa-solid.fa-paw.fa-xl 74 | 75 | if contact_item === 'Email' || contact_item === '邮箱' 76 | a(href= 'mailto:'+theme.contact_info[contact_item])= contact_item 77 | else if contact_item === 'QQ' || contact_item === 'Wechat' || contact_item === '微信' 78 | span(onclick="copyText("+theme.contact_info[contact_item]+")")= contact_item 79 | else 80 | a(href= theme.contact_info[contact_item])= contact_item 81 | 82 | if theme.links.enable 83 | .about-links 84 | h1 85 | i.fa-solid.fa-paw 86 | | #{ __('about.about_links') } 87 | 88 | .links-nav 89 | - for (links_item in theme.links.links_list) 90 | a.links-item(href= theme.links.links_list[links_item].url) 91 | span.links-item-title 92 | i.fa-solid.fa-link 93 | | #{ links_item } 94 | span.links-item-desc= theme.links.links_list[links_item].desc 95 | 96 | if theme.reward.enable 97 | .about-reward 98 | h1 99 | i.fa-solid.fa-paw 100 | | #{ __('about.reward.title') } 101 | 102 | .about-reward-desc 103 | | !{ markdown(__('about.reward.description')) } 104 | 105 | .about-reward-nav 106 | - for (reward_item in theme.reward.QR_code) 107 | .about-reward-item 108 | img.about-reward-img(src= url_for(theme.reward.QR_code[reward_item]), title= reward_item, alt= reward_item) 109 | span= reward_item 110 | 111 | if theme.credits.enable 112 | .about-credits 113 | h1 114 | i.fa-solid.fa-paw 115 | | #{ __('about.credits.title') } 116 | 117 | .about-credits-desc 118 | | !{ markdown(__('about.credits.description')) } 119 | 120 | .about-credits-list 121 | | !{ markdown(theme.credits.credits_list) } 122 | 123 | //- Comment zone 评论区 124 | if theme.comment.about_enable 125 | | !{ partial('_partial/comment') } -------------------------------------------------------------------------------- /layout/archive.pug: -------------------------------------------------------------------------------- 1 | //- sort posts by year and month descendingly 根据年份和月份降序排列文章 2 | - 3 | var postsSortByDate = {years:[], posts:{}}; 4 | for (post of page.posts.toArray()){ 5 | let postYear = post.date.year(); 6 | let postMonth = post.date.month(); 7 | 8 | if (!postsSortByDate.years.includes(postYear)){ 9 | postsSortByDate.years.push(postYear); 10 | } 11 | 12 | if (!postsSortByDate.posts[postYear]){ 13 | postsSortByDate.posts[postYear] = {months:[]}; 14 | //- postsSortByDate.posts[postYear] = {}; 15 | } 16 | 17 | if (!postsSortByDate.posts[postYear][postMonth]){ 18 | postsSortByDate.posts[postYear].months.push(postMonth); 19 | postsSortByDate.posts[postYear][postMonth] = []; 20 | } 21 | 22 | postsSortByDate.posts[postYear][postMonth].push(post); 23 | //- console.log(postsSortByDate.posts[postYear].months); 24 | } 25 | //- postsSortByDate.posts[2024].months.sort((a, b) => a - b); 26 | //- console.log(postsSortByDate); 27 | 28 | .page-container 29 | .page-title 30 | h1 31 | if is_tag() 32 | i.fa-solid.fa-tags 33 | | #{ __('menu.tags') } : #{ page.tag } 34 | else if is_category() 35 | i.fa-regular.fa-folder-open 36 | | #{ __('menu.category') } : #{ page.category } 37 | else 38 | i.fa-solid.fa-box-archive 39 | | #{ __('menu.archives') } 40 | 41 | .archives-container 42 | //- sort by year 根据年份分类 43 | - for (year of postsSortByDate.years) 44 | - let year_list = postsSortByDate.posts[year] 45 | - let url_year = url_for(config.archive_dir)+ '/' + year 46 | .archives-year 47 | a.archives-year-link(href= url_year) 48 | | #{ year } 49 | i.fa-solid.fa-paw 50 | //- sort by month 根据月份分类 51 | - for (month of year_list.months) 52 | - 53 | let temp_date = new Date(); 54 | temp_date.setMonth(month); 55 | let month_name = date(temp_date,'MMMM'); 56 | let month_num = date(temp_date,'MM') 57 | .archives-month 58 | a.archives-month-link(href= url_year + '/' + month_num) 59 | | #{ month_name } 60 | i.fa-solid.fa-paw 61 | //- list posts 列出文章 62 | .archives-article-list 63 | - for (article of year_list[month]) 64 | | !{ partial('_partial/article-item', {post: article}) } 65 | 66 | //- pagination 分页 67 | .pagination 68 | | !{ partial('_partial/pagination', {page: page}) } 69 | -------------------------------------------------------------------------------- /layout/categories.pug: -------------------------------------------------------------------------------- 1 | - 2 | //- var categories_list = []; 3 | //- for (cat of site.categories.toArray()){ 4 | //- categories_list.push(cat.slug); 5 | //- } 6 | //- categories_list.sort(); 7 | 8 | .page-container 9 | .page-title 10 | h1 11 | i.fa-regular.fa-folder-open 12 | | #{ __('menu.categories') } 13 | 14 | //- sorted list 15 | //- .categories-list-container 16 | //- - for (category of categories_list) 17 | //- a.categories-item(href= url_for('categories/'+category)) 18 | //- i.fa-regular.fa-folder-closed 19 | //- span.categories-item-name= category 20 | 21 | //- use hexo helpers 22 | .categories-list-container-helpers 23 | | !{ list_categories({show_count:theme.categories.show_count, style:'list', depth:theme.categories.depth}) } 24 | 25 | //- unsorted list 26 | //- .categories-list-container 27 | //- - for (category of site.categories.toArray()) 28 | //- a.categories-item(href= url_for(category.path)) 29 | //- i.fa-regular.fa-folder-closed 30 | //- span.categories-item-name= category.slug 31 | //- span.categories-item-count= '( ' + category.length + ' )' 32 | -------------------------------------------------------------------------------- /layout/index.pug: -------------------------------------------------------------------------------- 1 | //- index menu bar 首页菜单栏 2 | //- .index-menu 3 | //- | !{ partial('_partial/menu-index', null, {cache: true}) } 4 | 5 | //- posts list 文章列表 6 | .index-posts 7 | - for (post of page.posts.toArray()) 8 | | !{ partial('_partial/article-index', {post: post}) } 9 | 10 | //- pagination function 分页功能 11 | .pagination 12 | | !{ partial('_partial/pagination', {page: page}) } 13 | -------------------------------------------------------------------------------- /layout/layout.pug: -------------------------------------------------------------------------------- 1 | doctype html 2 | html(lang= config.language) 3 | //- html head html头部信息 4 | head 5 | | !{ partial('_partial/head', null, {cache: false}) } 6 | 7 | //- html body html主体 8 | body 9 | //- header bar at the top 顶部页眉信息 10 | | !{ partial('_partial/header', null, {cache: false}) } 11 | 12 | //- blog's information display 博客信息展示 13 | | !{ partial('_partial/blog-info', null, {cache: false}) } 14 | 15 | //- page's main part 页面主题部分 16 | .main 17 | .main-content !{ body } 18 | 19 | //- toolbar float on screen 悬浮工具栏 20 | | !{ partial('_partial/tool-bar', null, {cache: false}) } 21 | 22 | //- search panel 搜索面板 23 | if config.search 24 | | !{ partial('_partial/search', null, {cache: false}) } 25 | 26 | //- footer information at the bottom 底部页脚信息 27 | | !{ partial('_partial/footer', null, {cache: false}) } 28 | 29 | //- link other resources at the end of the page 在页面最后引入其它资源 30 | | !{ partial('_partial/other-resources', null, {cache: false}) } 31 | -------------------------------------------------------------------------------- /layout/post.pug: -------------------------------------------------------------------------------- 1 | //- post page's content 文章内容 2 | | !{ partial('_partial/article', {post: page}) } 3 | 4 | //- Comment zone 评论区 5 | if theme.comment.post_enable && page.comments 6 | | !{ partial('_partial/comment') } 7 | 8 | //- TOC module TOC导航栏 9 | if theme.toc.enable 10 | | !{ partial('_partial/post/toc', {post: page}) } -------------------------------------------------------------------------------- /layout/tags.pug: -------------------------------------------------------------------------------- 1 | .page-container 2 | .page-title 3 | h1 4 | i.fa-solid.fa-tags 5 | | #{ __('menu.tags') } 6 | 7 | if theme.tags.tag_cloud 8 | .tag-cloud 9 | if theme.tags.show_count 10 | | !{ tagcloud(site.tags, {min_font:18, max_font:22, color:true, start_color:'darkgrey', end_color:'#f9802d', show_count:true, count_class:'tag-count'}) } 11 | else 12 | | !{ tagcloud(site.tags, {min_font:18, max_font:22, color:true, start_color:'darkgrey', end_color:'#f9802d', show_count:false}) } 13 | 14 | if theme.tags.tag_list 15 | .tag-list-container 16 | if theme.tags.show_count 17 | | !{ list_tags({show_count:true, style:false, transform(str){return '#'+str}}) } 18 | else 19 | | !{ list_tags({show_count:false, style:false, transform(str){return '#'+str}}) } 20 | -------------------------------------------------------------------------------- /scripts/events/welcome.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | hexo.on('ready', () => { 4 | hexo.log.info(` 5 | =================================================================== 6 | 7 | ▄▄▄▄███▄▄▄▄ ▄████████ ▄██████▄ ▄█ █▄ 8 | ▄██▀▀▀███▀▀▀██▄ ███ ███ ███ ███ ███ ███ 9 | ███ ███ ███ ███ █▀ ███ ███ ███ ███ 10 | ███ ███ ███ ▄███▄▄▄ ███ ███ ███ ███ 11 | ███ ███ ███ ▀▀███▀▀▀ ███ ███ ███ ███ 12 | ███ ███ ███ ███ █▄ ███ ███ ███ ███ 13 | ███ ███ ███ ███ ███ ███ ███ ███ ▄█▄ ███ 14 | ▀█ ███ █▀ ██████████ ▀██████▀ ▀███▀███▀ 15 | 16 | v2.1.5 17 | 18 | =================================================================== 19 | Meow's Github Repository: https://github.com/chanwj/hexo-theme-meow 20 | ------------------------------------------------------------------- 21 | `); 22 | }); -------------------------------------------------------------------------------- /scripts/tags/link-card.js: -------------------------------------------------------------------------------- 1 | /* 2 | * [Tag] link card [标签]链接卡片 3 | * 4 | * @Usage 用法 5 | * {% linkcard %} 6 | - type: 7 | title: 8 | url: 9 | icon: 10 | desc: 11 | {% endlinkcard %} 12 | * 13 | * @Parameter 参数 14 | * type: page | post | file 15 | * icon: favicon's path, display paw by default. 网站图标路径,默认展示猫爪图案 16 | */ 17 | 18 | 'use strict' 19 | 20 | const url_for = hexo.extend.helper.get("url_for").bind(hexo); 21 | 22 | const link_card = (args, content) => { 23 | const link_list = hexo.render.renderSync({ text: content, engine: 'yaml' }); 24 | let result = ''; 25 | 26 | link_list.forEach(item => { 27 | let icon_result = ``; 28 | switch (item.type) { 29 | case 'page': 30 | if (item.icon) { 31 | icon_result = ``; 32 | } 33 | result += ` 34 | `; 41 | break; 42 | case 'post': 43 | result += ` 44 | `; 51 | break; 52 | case 'file': 53 | icon_result = ``; 54 | result += ` 55 | `; 62 | break; 63 | default: 64 | result += ` 65 | `; 72 | } 73 | }) 74 | return `
${result}
`; 75 | } 76 | 77 | hexo.extend.tag.register('linkcard', link_card, { ends: true }); -------------------------------------------------------------------------------- /scripts/tags/quote.js: -------------------------------------------------------------------------------- 1 | /* 2 | * [Tag] blockquote in different styles [标签]不同风格的引用块 3 | * 4 | * @Usage 用法 5 | * {% quote [style] %} 6 | * content 7 | * {% endquote %} 8 | * 9 | * @Parameter 参数 10 | * style[Optional 可选项]: light | pink | red | blue | green 11 | */ 12 | 13 | 'use strict' 14 | 15 | const quote = (args, content) => { 16 | var className = args.length>0 ? (' class="' + args[0] + '"') : ''; 17 | return '' + content + ''; 18 | } 19 | 20 | hexo.extend.tag.register('quote', quote, { ends: true }); -------------------------------------------------------------------------------- /source/css/_style/404.styl: -------------------------------------------------------------------------------- 1 | .page-not-found 2 | margin: 0 auto 3 | display: flex 4 | align-items: center 5 | flex-flow: column 6 | 7 | h1, p 8 | // background: linear-gradient(to right, #8A2387, #E94057, #4BC0C8) 9 | // -webkit-background-clip: text 10 | // background-clip: text 11 | // -webkit-text-fill-color: transparent 12 | // color: transparent 13 | margin: 0 auto 8px 14 | color: orange-dark 15 | 16 | h1 17 | font-size: 5em 18 | 19 | p 20 | font-size: 20px 21 | 22 | a 23 | font-size: 18px 24 | text-decoration: none 25 | color: white 26 | background-color: orange-low-saturation 27 | padding: 3px 15px 28 | border-radius: 20px 29 | margin-top: 10px 30 | 31 | &:hover 32 | background-color: yellow-normal 33 | -------------------------------------------------------------------------------- /source/css/_style/_default/animation.styl: -------------------------------------------------------------------------------- 1 | @keyframes show-toc-slide { 2 | 0% { 3 | opacity: 0 4 | transform: translateX(-10%) 5 | -webkit-transform: translateX(-10%) 6 | } 7 | 100% { 8 | opacity: 1 9 | transform: translateX(0) 10 | -webkit-transform: translateX(0) 11 | } 12 | } 13 | 14 | @keyframes show-toc { 15 | 0% { 16 | opacity: 0 17 | transform: translateY(-10%) 18 | -webkit-transform: translateY(-10%) 19 | } 20 | 100% { 21 | opacity: 1 22 | transform: translateY(0) 23 | -webkit-transform: translateY(0) 24 | } 25 | } 26 | 27 | @keyframes show-menu { 28 | 0% { 29 | opacity: 0 30 | transform: translateY(-10%) 31 | -webkit-transform: translateY(-10%) 32 | } 33 | 100% { 34 | opacity: 1 35 | transform: translateY(0) 36 | -webkit-transform: translateY(0) 37 | } 38 | } 39 | 40 | @keyframes disable-menu { 41 | 0% { 42 | opacity: 1 43 | transform: translateY(0) 44 | -webkit-transform: translateY(0) 45 | } 46 | 100% { 47 | opacity: 0 48 | transform: translateY(-10%) 49 | -webkit-transform: translateY(-10%) 50 | } 51 | } 52 | 53 | @keyframes fade { 54 | 0%, 100% { 55 | opacity: 1 56 | } 57 | 50% { 58 | opacity: 0.2 59 | } 60 | } 61 | 62 | @keyframes beat { 63 | 0%, 100% { 64 | transform: scale(1) 65 | -webkit-transform: scale(1) 66 | } 67 | 50% { 68 | transform: scale(1.2) 69 | -webkit-transform: scale(1.2) 70 | } 71 | } 72 | 73 | @keyframes bounce { 74 | 0%, 50%, 100% { 75 | transform: translateY(0) 76 | -webkit-transform: translateY(0) 77 | } 78 | 25% { 79 | transform: translateY(-3px) 80 | -webkit-transform: translateY(-3px) 81 | } 82 | 75% { 83 | transform: translateY(3px) 84 | -webkit-transform: translateY(3px) 85 | } 86 | } 87 | 88 | @keyframes showup { 89 | 0% { 90 | opacity: 0 91 | } 92 | 100% { 93 | opacity: 1 94 | } 95 | } 96 | 97 | @keyframes spin { 98 | 0% { 99 | transform: rotate(0) 100 | -webkit-transform: rotate(0) 101 | } 102 | 100% { 103 | transform: rotate(360deg) 104 | -webkit-transform: rotate(360deg) 105 | } 106 | } 107 | 108 | @keyframes title-run { 109 | 0% { 110 | opacity: 0 111 | transform: translateY(-10%) 112 | -webkit-transform: translateY(-10%) 113 | } 114 | 100% { 115 | opacity: 1 116 | transform: translateY(0) 117 | -webkit-transform: translateY(0) 118 | } 119 | } 120 | 121 | @keyframes to-left { 122 | 0%, 100% { 123 | transform: translateX(0) 124 | -webkit-transform: translateX(0) 125 | } 126 | 50% { 127 | transform: translateX(-30%) 128 | -webkit-transform: translateX(-30%) 129 | } 130 | } 131 | 132 | @keyframes to-right { 133 | 0%, 100% { 134 | transform: translateX(0) 135 | -webkit-transform: translateX(0) 136 | } 137 | 50% { 138 | transform: translateX(30%) 139 | -webkit-transform: translateX(30%) 140 | } 141 | } 142 | 143 | @keyframes swtich-to-darkmode { 144 | 0% { 145 | background-color: #ffdf6a 146 | } 147 | 100% { 148 | background-color: black 149 | } 150 | } 151 | 152 | @keyframes swtich-to-lightmode { 153 | 0% { 154 | background-color: black 155 | } 156 | 100% { 157 | background-color: #ffdf6a 158 | } 159 | } 160 | 161 | @keyframes scroll-text-horizontal { 162 | 0% { 163 | transform: translateX(50%) 164 | -webkit-transform: translateX(50%) 165 | } 166 | 100% { 167 | transform: translateX(-100%) 168 | -webkit-transform: translateX(-100%) 169 | } 170 | } 171 | 172 | @keyframes scroll-text-vertical { 173 | 0% { 174 | transform: translateY(100%) 175 | -webkit-transform: translateY(100%) 176 | } 177 | 100% { 178 | transform: translateY(-100%) 179 | -webkit-transform: translateY(-100%) 180 | } 181 | } -------------------------------------------------------------------------------- /source/css/_style/_default/code-highlight.styl: -------------------------------------------------------------------------------- 1 | .comment, .quote 2 | color: #a0a1a7 3 | 4 | .doctag, .keyword, .formula 5 | color: #a626a4 6 | 7 | .section, .name, .selector-tag, .deletion, .subst 8 | color: #e45649 9 | 10 | .literal 11 | color: #0184bb 12 | 13 | .string, .regexp, .addition, .attribute, .meta .string 14 | color: #50a14f 15 | 16 | .attr, .variable, .template-variable, .type, .selector-class, .selector-attr, .selector-pseudo, .number 17 | color: #b37a00 18 | 19 | .symbol, .bullet, .link, .meta, .selector-id, .title 20 | color: #4078f2 21 | 22 | .built_in, .title.class_, .class .title 23 | color: #c98900 24 | 25 | .strong 26 | font-weight: bold 27 | 28 | .link 29 | text-decoration: underline -------------------------------------------------------------------------------- /source/css/_style/_default/global-settings.styl: -------------------------------------------------------------------------------- 1 | // config 2 | $root-path = hexo-config('root') 3 | 4 | // page 5 | max-page-width = 1080px 6 | 7 | // font-family 8 | default-font-family = 'PingFang SC', 'Microsoft YaHei', Sans-serif, Serif 9 | if hexo-config('font.font_family') 10 | default-font-family = unquote(hexo-config('font.font_family')) 11 | code-font = 'Lucida Console', Courier, 'PingFang SC', 'Microsoft YaHei', Monaco,'Courier New', Sans-serif, Serif, monospace 12 | 13 | // font-size 14 | default-font-size = 18px 15 | default-font-size-smaller = 16px 16 | article-title-font-size = 28px 17 | article-title1-font-size = 26px 18 | article-title2-font-size = 24px 19 | article-title3-font-size = 22px 20 | article-title4-font-size = 20px 21 | article-title5-font-size = 18px 22 | article-title6-font-size = 18px 23 | header-item-font-size = 20px 24 | header-item-font-size-smaller = 18px 25 | info-font-size = 16px 26 | info-font-size-normal = 16px 27 | info-font-size-larger = 17px 28 | info-font-size-smaller = 16px 29 | code-font-size = 16px 30 | code-line-number-font-size = 16px 31 | footer-font-size = 15px 32 | register-font-size = 15px 33 | pagination-font-size = 18px 34 | toc-font-size = 16px 35 | superscript-font-size = 14px 36 | 37 | // color 38 | orange-normal = #ffb64f 39 | orange-fresh = #fba414 40 | orange-light = #f9ae08 41 | orange-middle = #f9802d 42 | orange-dark = #975100 43 | orange-low-saturation = #db8540 44 | red-light = #f15b00 45 | red-normal = #f94032 46 | red-dark = #e45649 47 | red-fresh = #ff8e71 48 | cherry = #ff6e6c 49 | pink-light = #ffdddd 50 | pink-normal = #ff9393 51 | pink-dark = #ff6767 52 | yellow-normal = #FFCF2F 53 | yellow-light = #ffdf6a 54 | purple-normal = #67568c 55 | green-normal = #50a14f 56 | green-light = #B8E05A 57 | green-fresh = #A4CF3E 58 | green-dark = #809B3E 59 | cream = #fef1e1 60 | code-light = #f0f0f0 61 | code-normal = #e9e9e9 62 | code-dark = #E4E4E4 63 | quote-background = #fff7dc 64 | text-black = #1f1235 65 | text-black-light = #4e4a55 66 | text-grey = #8d8d8d 67 | text-grey-light = #b1b1b1 68 | border-grey = #cccccc 69 | shadow-grey = #d7d7d7 70 | icon-grey = #b0b0b0 71 | blue-light = #A3DCF3 72 | blue-normal = #78CCEF 73 | background-dark-light = rgba(78, 74, 85, 0.4) 74 | background-dark = rgb(43, 41, 46) 75 | background-dark-lighter = rgba(135, 135, 135, 0.4) 76 | darkmode-text = rgb(224, 224, 224) 77 | 78 | // container 79 | header-height = 50px 80 | 81 | // site background 82 | site-background-color = yellow-light 83 | site-background-image = '' 84 | site-background-gradient = linear-gradient(to bottom right,#ffa751,#ffe259) 85 | if hexo-config('background.type') == 1 86 | if hexo-config('background.image_url') 87 | site-background-image = hexo-config('background.image_url') 88 | else if hexo-config('background.type') == 2 89 | if hexo-config('background.color') 90 | site-background-color = unquote(hexo-config('background.color')) 91 | else 92 | if hexo-config('background.gradient') 93 | site-background-gradient = unquote(hexo-config('background.gradient')) -------------------------------------------------------------------------------- /source/css/_style/_default/icon.styl: -------------------------------------------------------------------------------- 1 | .icon 2 | color: icon-grey -------------------------------------------------------------------------------- /source/css/_style/_default/image.styl: -------------------------------------------------------------------------------- 1 | img 2 | display: block 3 | margin: 5px auto 4 | max-width: 100% -------------------------------------------------------------------------------- /source/css/_style/_default/link-card.styl: -------------------------------------------------------------------------------- 1 | .linkcard 2 | margin: 15px 0 3 | display: flex 4 | flex-flow: row wrap 5 | align-items: center 6 | 7 | .linkcard-item 8 | width: 30% 9 | padding: 10px 10 | height: 60px 11 | overflow: hidden 12 | border: 1px border-grey dotted 13 | border-radius: 8px 14 | margin: 8px calc((10% - 6px) / 6 - 10px) 15 | 16 | &:hover 17 | background-color: code-light 18 | 19 | .linkcard-item-desc 20 | span 21 | animation: scroll-text-horizontal 3s linear infinite 22 | 23 | a 24 | display: block 25 | height: 100% 26 | width: 100% 27 | text-decoration: none 28 | color: text-black 29 | overflow: hidden 30 | 31 | &:hover 32 | color: text-black 33 | 34 | .linkcard-item-icon 35 | animation: fade 1.2s infinite 36 | 37 | .linkcard-item-title 38 | text-decoration: underline 39 | 40 | .linkcard-item-icon 41 | float: left 42 | margin: 0 10px 43 | width: 50px 44 | font-size: 45px 45 | line-height: 1em 46 | color: text-black-light 47 | 48 | i 49 | margin: 7.5px auto 50 | 51 | img 52 | width: 50px 53 | 54 | .linkcard-item-title 55 | font-weight: bold 56 | height: 25px 57 | overflow: hidden 58 | 59 | .linkcard-item-desc 60 | font-size: default-font-size-smaller 61 | margin-top: 5px 62 | overflow: hidden 63 | height: 30px 64 | 65 | span 66 | display: inline-block 67 | white-space: nowrap 68 | 69 | @media screen and (max-width: 768px) 70 | .linkcard-item 71 | width: 100% -------------------------------------------------------------------------------- /source/css/_style/_default/media.styl: -------------------------------------------------------------------------------- 1 | #aplayer 2 | margin: 1.5em 5px 3 | 4 | .aplayer-lrc-contents p 5 | text-align: center -------------------------------------------------------------------------------- /source/css/_style/_default/text.styl: -------------------------------------------------------------------------------- 1 | a 2 | color: orange-middle 3 | 4 | a:hover 5 | color: orange-fresh 6 | 7 | p 8 | line-height: 1.6em 9 | text-align: justify 10 | vertical-align: baseline 11 | 12 | h1 13 | font-size: article-title1-font-size 14 | margin: 1em 0 15 | 16 | h2 17 | font-size: article-title2-font-size 18 | margin: 0.9em 0 19 | 20 | h3 21 | font-size: article-title3-font-size 22 | margin: 0.8em 0 23 | 24 | h4 25 | font-size: article-title4-font-size 26 | margin: 0.7em 0 27 | 28 | h5 29 | font-size: article-title5-font-size 30 | margin: 0.7em 0 31 | 32 | h6 33 | font-size: article-title6-font-size 34 | margin: 0.6em 0 35 | 36 | h1,h2,h3,h4,h5,h6 37 | font-weight: 1200 38 | 39 | hr 40 | border: 1px solid transparent 41 | border-image: linear-gradient(to right, rgba(31, 18, 53, 0.1), rgba(31, 18, 53, 0.35), rgba(31, 18, 53, 0.1)) 1 42 | 43 | blockquote 44 | margin: 15px 0 45 | padding: 6px 12px 46 | background-color: quote-background 47 | // border-radius: 10px 48 | box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1) 49 | border-left: 10px solid yellow-light 50 | line-height: 2em 51 | 52 | blockquote.light 53 | background-color: transparent 54 | box-shadow: none 55 | border-left-color: shadow-grey 56 | color: text-grey 57 | 58 | blockquote.pink 59 | background-color: pink-light 60 | border-left-color: pink-normal 61 | 62 | blockquote.red 63 | background-color: red-fresh 64 | border-left-color: red-dark 65 | 66 | blockquote.blue 67 | background-color: blue-light 68 | border-left-color: blue-normal 69 | 70 | blockquote.green 71 | background-color: green-light 72 | border-left-color: green-fresh 73 | 74 | ul 75 | padding-left: 1em 76 | line-height: 1.8em 77 | 78 | ol 79 | padding-left: 1em 80 | line-height: 1.8em 81 | 82 | input[type='checkbox']:disabled 83 | width: 15px 84 | height: 15px 85 | 86 | table 87 | margin: 1.5em 0 88 | border-collapse: collapse; 89 | width: 100% 90 | 91 | ul, ol 92 | padding-left: 25px 93 | line-height: normal 94 | margin: 0 95 | 96 | th, td 97 | vertical-align: middle; 98 | padding: 5px 8px 99 | border: 1px solid border-grey 100 | 101 | thead 102 | background-color: text-black-light 103 | color: white 104 | 105 | .table-center 106 | width: 100% 107 | overflow-x: auto 108 | 109 | details 110 | margin: 10px auto 111 | 112 | summary 113 | border-radius: 10px 114 | background-color: code-light 115 | padding: 10px 20px 116 | font-weight: bold 117 | 118 | &:hover 119 | color: orange-middle 120 | 121 | &[open] 122 | padding: 10px 20px 123 | background-color: code-light 124 | border-radius: 10px 125 | 126 | summary 127 | padding: 0 128 | text-decoration: underline -------------------------------------------------------------------------------- /source/css/_style/_partial/article-index.styl: -------------------------------------------------------------------------------- 1 | .index-posts 2 | margin: 0 auto 3 | width: 85% 4 | 5 | .index-post-item 6 | margin-top: 10px 7 | padding-bottom: 20px 8 | border-bottom: 1px solid transparent 9 | border-image: linear-gradient(to right, rgba(31, 18, 53, 0.1), rgba(31, 18, 53, 0.35), rgba(31, 18, 53, 0.1)) 1 10 | 11 | .post-title-index 12 | display: flex 13 | flex-flow: row nowrap 14 | align-items: baseline 15 | justify-content: space-between 16 | 17 | h1 18 | margin-bottom: 0.3em 19 | a 20 | text-decoration: none 21 | color: orange-middle 22 | 23 | &:hover 24 | color: orange-fresh 25 | 26 | i 27 | margin-right: 5px 28 | 29 | .post-top 30 | padding: 3px 12px 31 | border: 1px orange-middle dashed 32 | border-radius: 15px 33 | text-align: center 34 | color: orange-middle 35 | 36 | p 37 | margin: 0 38 | white-space: nowrap 39 | 40 | .post-head-info 41 | font-size: info-font-size 42 | color: text-grey-light 43 | // display: flex 44 | // flex-flow: row nowrap 45 | overflow: hidden 46 | white-space: nowrap 47 | 48 | div 49 | margin-top: 5px 50 | display: inline-block 51 | 52 | .read-more 53 | background-color: orange-low-saturation 54 | padding: 3px 10px 55 | border-radius: 20px 56 | display: inline-block 57 | text-align: center 58 | margin: 10px 0 59 | 60 | i 61 | margin-right: 3px 62 | color: white 63 | 64 | .read-more-link 65 | text-decoration: none 66 | color: white 67 | font-size: info-font-size 68 | 69 | &:hover 70 | background-color: yellow-normal 71 | box-shadow: 1.5px 1.5px 2px shadow-grey 72 | 73 | .post-tags 74 | font-size: info-font-size 75 | display: block 76 | white-space: nowrap 77 | overflow: hidden 78 | 79 | .post-excerpt 80 | margin: 0.6em 0 81 | text-align: justify 82 | 83 | @media screen and (max-width: 768px) 84 | .index-post-item 85 | h1 86 | font-size: article-title2-font-size -------------------------------------------------------------------------------- /source/css/_style/_partial/article.styl: -------------------------------------------------------------------------------- 1 | .post 2 | margin: 0 auto 3 | width: 85% 4 | 5 | .post-title 6 | border-bottom: 2px solid border-grey 7 | 8 | h1 9 | margin: 20px 0 15px 10 | font-size: article-title-font-size 11 | color: orange-middle 12 | 13 | i 14 | margin-right: 5px 15 | 16 | .post-info 17 | font-size: info-font-size-larger 18 | color: text-grey-light 19 | 20 | .post-info-first-line 21 | display: flex 22 | flex-flow: row wrap 23 | align-items: center 24 | margin-top: 10px 25 | 26 | div 27 | overflow: visible 28 | white-space: nowrap 29 | margin: 5px 0 30 | 31 | .post-info-second-line 32 | display: flex 33 | flex-flow: row wrap 34 | align-items: center 35 | // margin-top: 5px 36 | 37 | div 38 | overflow: visible 39 | white-space: nowrap 40 | margin: 5px 0 41 | 42 | .pageview-post 43 | margin: 5px 0 44 | overflow: hidden 45 | white-space: nowrap 46 | 47 | #busuanzi_container_page_pv 48 | padding: 0 5px 49 | 50 | .post-end 51 | display: flex 52 | flex-flow: row nowrap 53 | align-items: center 54 | justify-content: space-between 55 | margin: 50px auto 0 56 | 57 | .post-prev,.post-next 58 | width: 45px 59 | height: 45px 60 | display: flex 61 | justify-content: center 62 | align-items: center 63 | 64 | a 65 | color: text-grey 66 | 67 | &:hover 68 | color: orange-fresh 69 | 70 | .post-prev a:hover 71 | animation: to-left 0.8s infinite 72 | 73 | .post-next a:hover 74 | animation: to-right 0.8s infinite 75 | 76 | .post-reward 77 | border: 1px solid border-grey 78 | border-radius: 50% 79 | width: 45px 80 | height: 45px 81 | margin: 0 auto 82 | display: flex 83 | justify-content: center 84 | align-items: center 85 | 86 | &:hover 87 | background-color: orange-normal 88 | color: white 89 | box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.125) 90 | 91 | .post-content[text-indent=true] 92 | p 93 | text-indent: 2em 94 | 95 | .fiction-meta 96 | margin: 15px 0 97 | padding: 15px 20px 98 | background-color: code-light 99 | border-radius: 15px 100 | box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.125) 101 | display: flex 102 | flex-flow: column nowrap 103 | 104 | .fiction-meta-item 105 | display: flex 106 | flex-flow: row nowrap 107 | font-size: info-font-size-larger 108 | margin-top: 8px 109 | 110 | &:first-child 111 | margin-top: 0 112 | 113 | &:hover 114 | background-color: rgba(255, 255, 255, 0.8) 115 | 116 | .fiction-meta-key 117 | width: 130px 118 | margin-right 10px 119 | border-right: 1px solid border-grey 120 | font-weight: bold 121 | color: text-black-light 122 | white-space: nowrap 123 | 124 | i 125 | margin-right: 5px 126 | 127 | .fiction-meta-value 128 | flex: 1 129 | 130 | #fiction-meta-rating 131 | span[rating=Teen],span[rating=Mature],span[rating=Explicit] 132 | font-weight: bold 133 | 134 | span[rating=Mature],span[rating=Explicit] 135 | color: red-dark 136 | 137 | #fiction-meta-warning 138 | span 139 | font-weight: bold 140 | color: red-dark 141 | 142 | .fiction-before-content 143 | margin: 20px 0 35px 144 | border-bottom: 2px solid transparent 145 | border-image: linear-gradient(to right, rgba(31, 18, 53, 0.1), rgba(31, 18, 53, 0.35), rgba(31, 18, 53, 0.1)) 1 146 | 147 | &[text-indent=true] 148 | p 149 | text-indent: 2em 150 | 151 | .fiction-summary 152 | margin: 20px 0 30px 153 | 154 | .fiction-notes-before 155 | margin: 20px 0 156 | padding-bottom: 10px 157 | 158 | .fiction-status 159 | margin: 35px auto 20px 160 | text-align: center 161 | color: text-grey-light 162 | font-weight: bold 163 | 164 | .fiction-notes-after 165 | margin: 35px 0 0 166 | padding-bottom: 10px 167 | border-top: 2px solid transparent 168 | border-image: linear-gradient(to right, rgba(31, 18, 53, 0.1), rgba(31, 18, 53, 0.35), rgba(31, 18, 53, 0.1)) 1 169 | 170 | &[text-indent=true] 171 | p 172 | text-indent: 2em 173 | 174 | @media screen and (max-width: 768px) 175 | .fiction-meta-item 176 | flex-flow: column nowrap 177 | font-size: info-font-size-smaller 178 | 179 | .fiction-meta-key 180 | width: auto 181 | border-right: 0 182 | 183 | .fiction-meta-value 184 | flex: initial 185 | margin-top: 5px 186 | margin-left: 1em 187 | 188 | .post-info 189 | font-size: info-font-size-smaller 190 | 191 | .post-title h1 192 | font-size: article-title1-font-size -------------------------------------------------------------------------------- /source/css/_style/_partial/blog-info.styl: -------------------------------------------------------------------------------- 1 | .blog-info 2 | margin: 20px auto 3 | display: flex 4 | align-items: center 5 | flex-flow: column nowrap 6 | max-width: max-page-width 7 | width: 90% 8 | 9 | #blog-pic 10 | width: 180px 11 | height: 180px 12 | margin: 0 13 | 14 | .blog-title 15 | font-size: 40px 16 | font-weight: bold 17 | color: #ffffff 18 | text-shadow: 2px 2px 2px rgba(0, 0, 0, 0.125) 19 | white-space: nowrap 20 | overflow: hidden 21 | animation: title-run 0.8s ease-in-out linear 22 | -webkit-animation: title-run 0.8s linear 23 | 24 | span 25 | margin: 0 15px 26 | font-weight: 1200 27 | 28 | i 29 | --fa-rotate-angle: 45deg 30 | 31 | &:first-child 32 | --fa-rotate-angle: 315deg 33 | 34 | .blog-desc 35 | font-size: default-font-size 36 | color: white 37 | text-shadow: 2px 2px 2px rgba(0, 0, 0, 0.125) 38 | text-align: center 39 | margin: 20px auto 40 | -------------------------------------------------------------------------------- /source/css/_style/_partial/code.styl: -------------------------------------------------------------------------------- 1 | figure.highlight 2 | margin: 10px auto 3 | // padding: 3px 5px 0 4 | background-color: code-light 5 | border-radius: 10px 6 | box-shadow: 1.5px 1.5px 2px rgba(0, 0, 0, 0.125) 7 | font-size: code-font-size 8 | position: relative 9 | 10 | &:hover 11 | #copyCodeBtn 12 | visibility: visible 13 | 14 | figcaption 15 | font-size: article-title6-font-size 16 | font-weight: bold 17 | font-family: code-font 18 | color: text-black-light 19 | line-height: 1.5em 20 | padding: 5px 10px 5px 10px 21 | background-color: code-dark 22 | border-radius: 10px 10px 0 0 23 | 24 | table 25 | border-spacing: 5px 10px 26 | line-height: 1.5em 27 | margin: 2px 0 28 | padding: 5px 29 | border-collapse: separate 30 | overflow-x: auto 31 | display: block 32 | 33 | td 34 | padding: 0 5px 0 0 35 | border: 0 36 | 37 | pre 38 | margin: 0 39 | 40 | .gutter 41 | color: text-grey-light 42 | font-size: code-line-number-font-size 43 | padding-right: 10px 44 | border-right: 1px solid text-grey-light 45 | 46 | .line 47 | font-family: code-font 48 | padding-left: 5px 49 | 50 | // scrollbar for chrome 51 | ::-webkit-scrollbar 52 | height: 8px 53 | 54 | ::-webkit-scrollbar-thumb 55 | background-color: shadow-grey 56 | border-radius: 30px 57 | 58 | ::-webkit-scrollbar-thumb:hover 59 | background-color: border-grey 60 | 61 | ::-webkit-scrollbar-track 62 | background-color: transparent 63 | 64 | // scrollbar for firefox 65 | @-moz-document url-prefix() 66 | scrollbar-color: shadow-grey transparent 67 | scrollbar-width: thin 68 | 69 | code 70 | background-color: code-normal 71 | border-radius: 8px 72 | box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.15) 73 | // border: 0.5px solid rgba(0, 0, 0, 0.1) 74 | padding: 0 8px 75 | margin: 0 2px 76 | font-family: default-font-family 77 | color: green-normal // text-black-light 78 | line-height: 1.8em 79 | 80 | details 81 | code 82 | background-color: code-dark 83 | 84 | #copyCodeBtn 85 | position: absolute 86 | top: 6px 87 | right: 5px 88 | padding: 5px 89 | z-index: 3 90 | border: none 91 | font-size: article-title5-font-size 92 | color: text-grey-light 93 | background-color: transparent 94 | cursor: pointer 95 | visibility: hidden 96 | 97 | &:hover 98 | color: text-black-light 99 | animation: fade 1.2s ease-in-out infinite -------------------------------------------------------------------------------- /source/css/_style/_partial/comment.styl: -------------------------------------------------------------------------------- 1 | .comment 2 | margin: 60px auto 0 3 | width: 85% 4 | -------------------------------------------------------------------------------- /source/css/_style/_partial/footer.styl: -------------------------------------------------------------------------------- 1 | .footer-content 2 | max-width: max-page-width 3 | width: 90% 4 | margin: 20px auto 10px 5 | text-align: center 6 | font-size: footer-font-size 7 | color: orange-dark 8 | 9 | i 10 | margin: 0 5px 11 | 12 | &:first-child 13 | margin-left: 0 14 | 15 | .copyright-info 16 | a 17 | text-decoration: none 18 | color: orange-dark 19 | 20 | &:hover 21 | color: white 22 | background-color: orange-normal 23 | border-radius: 8px 24 | 25 | .register-info 26 | font-size: register-font-size 27 | 28 | #register_link 29 | text-decoration: none 30 | color: orange-dark 31 | 32 | &:hover 33 | text-decoration: underline 34 | 35 | #busuanzi_container_site_uv 36 | margin-right: 0 37 | 38 | #busuanzi_container_site_pv 39 | margin-right: 5px -------------------------------------------------------------------------------- /source/css/_style/_partial/header.styl: -------------------------------------------------------------------------------- 1 | header 2 | background-color: #ffffff 3 | position: sticky 4 | top: 0 5 | box-shadow: 0 2px 2px rgba(0, 0, 0, 0.125) 6 | z-index: 6 7 | 8 | .top-nav 9 | height: header-height 10 | max-width: max-page-width 11 | display: flex 12 | justify-content: space-between 13 | align-items: center 14 | margin: 0 auto 15 | width: 90% 16 | 17 | 18 | .nav-info 19 | display: flex 20 | align-items: center 21 | font-weight: 1000 22 | 23 | div 24 | vertical-align: text-bottom 25 | display: inline-block 26 | 27 | #nav-icon 28 | width: 40px 29 | height: 40px 30 | margin: 0 31 | display: inline 32 | 33 | &:hover 34 | animation: fade 1.2s ease-in-out infinite 35 | 36 | #nav-title 37 | font-size: 30px 38 | font-weight: bold 39 | text-decoration: none 40 | color: orange-fresh 41 | margin-left: 5px 42 | 43 | &:hover 44 | color: orange-middle 45 | 46 | #top-menu-hidden 47 | display: none 48 | 49 | .nav-ribbon 50 | display: flex 51 | align-items: center 52 | 53 | #top-menu-btn 54 | display: none 55 | 56 | .top-menu-expanded 57 | display: inline-block 58 | font-size: header-item-font-size 59 | font-weight: 800 60 | 61 | .top-menu-item 62 | text-decoration: none 63 | color: orange-fresh 64 | margin-right: 20px 65 | 66 | i 67 | margin-right: 5px 68 | 69 | &:hover 70 | color: orange-middle 71 | 72 | .top-search 73 | display: inline-block 74 | cursor: pointer 75 | 76 | &:hover 77 | i 78 | animation: fade 1s infinite 79 | 80 | #top-search-btn 81 | padding: 2px 10px 2px 8px 82 | background-color: transparent 83 | border: 1px solid border-grey 84 | border-radius: 70px 85 | font-size: info-font-size-larger 86 | 87 | // &:hover 88 | // box-shadow: 1.5px 1.5px 2px shadow-grey 89 | 90 | span 91 | margin-left: 5px 92 | color: icon-grey 93 | 94 | @media screen and (max-width: 768px) 95 | #top-menu-btn 96 | display: inline-block 97 | width: 22px 98 | height: 22px 99 | margin-left: 15px 100 | font-size: info-font-size-larger 101 | cursor: pointer 102 | 103 | .top-menu-expanded 104 | display: none 105 | 106 | .top-search 107 | span 108 | display: none 109 | #top-search-btn 110 | border-radius: 50% 111 | padding: 2px 5px 112 | 113 | #top-menu-hidden 114 | z-index: 5 115 | position: fixed 116 | top: header-height 117 | width: 100% 118 | height: calc(100% - 50px) 119 | margin: 0 auto 120 | animation: show-menu 0.5s 121 | background-color: rgba(255, 255, 255, 0.5) 122 | backdrop-filter: blur(8px) 123 | -webkit-backdrop-filter: blur(8px) 124 | flex-direction: column 125 | font-weight: 1000 126 | 127 | &:not([menu-show]) 128 | animation: disable-menu 0.5s 129 | 130 | .menu-hidden-content 131 | background-color: rgba(255, 255, 255, 0.5) 132 | box-shadow: 0 1px 1px rgba(0, 0, 0, 0.125) 133 | max-height: 80% 134 | overflow-y: auto 135 | 136 | .menu-hidden-nav 137 | width: 90% 138 | display: flex 139 | flex-flow: row wrap 140 | align-items: center 141 | justify-content: center 142 | margin: 0 auto 143 | padding: 20px 0 144 | 145 | .menu-hidden-item 146 | padding: 8px 35px 147 | margin: 8px 10px 148 | border: 1px solid orange-light 149 | border-radius: 15px 150 | text-decoration: none 151 | line-height: 1.5em 152 | font-size: header-item-font-size-smaller 153 | background-color: yellow-light 154 | opacity: 0.8 155 | flex: 1 156 | display: flex 157 | flex-flow: row nowrap 158 | align-items: center 159 | justify-content: center 160 | 161 | i 162 | margin-right: 5px 163 | 164 | &:hover 165 | background-color: quote-background 166 | 167 | i 168 | animation: beat 1s infinite 169 | 170 | .menu-hidden-blank 171 | flex: 1 172 | -webkit-flex: 1 173 | -ms-flex: 1 174 | -------------------------------------------------------------------------------- /source/css/_style/_partial/menu-index.styl: -------------------------------------------------------------------------------- 1 | .index-menu 2 | margin: 30px auto 40px 3 | display: flex 4 | align-items: center 5 | justify-content: space-evenly 6 | max-width: 70% 7 | height: 50px 8 | width: 90% 9 | 10 | .menu-item 11 | font-size: 18px 12 | text-decoration: none 13 | font-weight: bold 14 | text-align: center 15 | color: text-black 16 | width: 70px 17 | height: 40px 18 | border-bottom: 3px solid orange-fresh 19 | line-height: 40px 20 | 21 | &:hover 22 | color: orange-fresh 23 | border-bottom: 6px solid orange-fresh -------------------------------------------------------------------------------- /source/css/_style/_partial/pagination.styl: -------------------------------------------------------------------------------- 1 | .pagination 2 | margin: 30px auto 5px 3 | display: flex 4 | align-items: center 5 | justify-content: center 6 | font-size: pagination-font-size 7 | 8 | a 9 | color: text-black-light 10 | text-decoration: none 11 | 12 | &:hover 13 | color: orange-fresh 14 | 15 | .prev, .next 16 | color: text-black-light 17 | 18 | &:hover 19 | color: orange-fresh 20 | 21 | i 22 | color: border-grey 23 | margin: 0 10px 24 | 25 | &:hover 26 | color: orange-fresh 27 | 28 | .page-number 29 | margin: 0 5px 30 | 31 | .current 32 | border: 1px solid border-grey 33 | border-radius: 10px 34 | padding: 0.5px 10px 35 | -------------------------------------------------------------------------------- /source/css/_style/_partial/post/copyright.styl: -------------------------------------------------------------------------------- 1 | .post-copyright 2 | span 3 | padding-left: 5px 4 | a 5 | text-decoration: none 6 | color: text-grey-light 7 | margin-right: 5px 8 | padding-right: 5px 9 | 10 | &:hover 11 | color: orange-fresh -------------------------------------------------------------------------------- /source/css/_style/_partial/post/date.styl: -------------------------------------------------------------------------------- 1 | .post-date 2 | i 3 | margin-right: 5px 4 | 5 | time,span 6 | margin-right: 10px -------------------------------------------------------------------------------- /source/css/_style/_partial/post/post-categories.styl: -------------------------------------------------------------------------------- 1 | .post-categories 2 | margin: 5px 0 3 | display: flex 4 | flex-flow: row wrap 5 | align-items: center 6 | 7 | .post-category 8 | display: inline-block 9 | text-decoration: none 10 | color: text-grey-light 11 | margin-right: 5px 12 | padding: 0 5px 13 | 14 | &:hover 15 | color: orange-fresh -------------------------------------------------------------------------------- /source/css/_style/_partial/post/post-tags.styl: -------------------------------------------------------------------------------- 1 | .post-tags 2 | margin: 5px 0 3 | display: flex 4 | flex-flow: row wrap 5 | align-items: center 6 | 7 | .post-tag 8 | display: inline-block 9 | text-decoration: none 10 | color: text-grey-light 11 | margin-right: 5px 12 | padding: 0 5px 13 | 14 | &:hover 15 | color: orange-fresh -------------------------------------------------------------------------------- /source/css/_style/_partial/post/reward.styl: -------------------------------------------------------------------------------- 1 | #reward-panel 2 | &:not([reward-show]) 3 | display: none 4 | 5 | position: fixed 6 | top: header-height 7 | left: 0 8 | z-index: 3 9 | width: 100% 10 | height: calc(100% - 50px) 11 | background-color: rgba(255, 255, 255, 0.2) 12 | backdrop-filter: blur(5px) 13 | -webkit-backdrop-filter: blur(5px) 14 | display: flex 15 | align-items: center 16 | justify-content: center 17 | animation: showup 0.3s 18 | 19 | .reward-container 20 | width: 70% 21 | height: 380px 22 | padding: 15px 20px 23 | background-color: white 24 | border: 1px solid rgba(209, 209, 209, 0.825) 25 | border-radius: 20px 26 | overflow-y: auto 27 | 28 | p 29 | text-align: center 30 | font-weight: bold 31 | 32 | .reward-nav 33 | display: flex 34 | flex-flow: row wrap 35 | justify-content: center 36 | align-items: center 37 | 38 | .reward-item 39 | display: flex 40 | flex-flow: column nowrap 41 | justify-content: center 42 | align-items: center 43 | width: 250px 44 | aspect-ratio: 1/1 45 | margin: 0 1.5% 5px 46 | 47 | .reward-img 48 | width: 90% 49 | aspect-ratio: 1/1 50 | 51 | @media screen and (max-width: 768px) 52 | .reward-container 53 | width: 80% 54 | height: 80% 55 | 56 | .reward-container 57 | p 58 | text-align: left 59 | 60 | .reward-nav 61 | display: flex 62 | flex-flow: column nowrap 63 | 64 | .reward-item 65 | width: 300px 66 | margin: 5px auto 67 | -------------------------------------------------------------------------------- /source/css/_style/_partial/post/toc.styl: -------------------------------------------------------------------------------- 1 | @media screen and (max-width: 1499px) 2 | #post-toc 3 | display: none 4 | 5 | &[toc-show] 6 | display: flex 7 | z-index: 2 8 | position: fixed 9 | left: 0 10 | top: 0 11 | margin-top: header-height 12 | height: calc(100% - 50px) 13 | width: 100% 14 | flex-flow: row nowrap 15 | animation: show-toc-slide 0.5s 16 | 17 | .toc-blank 18 | width: 30% 19 | 20 | .toc-aside 21 | font-size: toc-font-size 22 | width: 70% 23 | padding: 15px 20px 24 | background-color: rgba(255, 255, 255, 0.9) 25 | backdrop-filter: blur(5px) 26 | -webkit-backdrop-filter: blur(5px) 27 | box-shadow: 1px 0 1px rgba(0, 0, 0, 0.125) 28 | 29 | .toc-title 30 | font-size: article-title4-font-size 31 | font-weight: bold 32 | color: orange-middle 33 | padding-bottom: 5px 34 | border-bottom: 1px solid rgba(209, 209, 209, 0.825) 35 | 36 | i 37 | margin-right: 5px 38 | 39 | .toc-container 40 | height: 90% 41 | overflow-y: auto 42 | 43 | .toc-content, .toc-content-child 44 | list-style: none 45 | padding-left: 1em 46 | line-height: 1.5em 47 | border-left: 1px solid rgba(209, 209, 209, 0.5) 48 | margin: 5px 0 49 | 50 | &:first-child 51 | padding-left: 0 52 | border-left:0 53 | 54 | .toc-content-link 55 | text-decoration: none 56 | 57 | &:hover 58 | text-decoration: underline 59 | 60 | @media screen and (min-width: 1499px) 61 | #post-toc 62 | display: flex 63 | font-size: toc-font-size 64 | position: fixed 65 | right: calc((100% - 1080px) / 2 - 190px) 66 | top: header-height 67 | margin-top: 50px 68 | width: 150px 69 | height: 60% 70 | padding: 10px 10px 71 | background-color: rgba(255, 255, 255, 0.9) 72 | box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.125) 73 | border-radius: 10px 74 | animation: show-toc 0.5s 75 | overflow: hidden 76 | 77 | .toc-aside 78 | width: 100% 79 | display: flex 80 | flex-flow: column nowrap 81 | 82 | .toc-title 83 | font-size: article-title4-font-size 84 | font-weight: bold 85 | color: orange-middle 86 | padding-bottom: 5px 87 | border-bottom: 1px solid rgba(209, 209, 209, 0.825) 88 | 89 | i 90 | margin-right: 5px 91 | 92 | .toc-container 93 | overflow-y: auto 94 | 95 | .toc-content, .toc-content-child 96 | list-style: none 97 | padding-left: 1em 98 | line-height: 1.5em 99 | border-left: 1px solid rgba(209, 209, 209, 0.5) 100 | white-space: nowrap 101 | overflow-x: hidden 102 | margin: 5px 0 103 | 104 | &:first-child 105 | padding-left: 0 106 | border-left:0 107 | 108 | .toc-content-link 109 | text-decoration: none 110 | 111 | &:hover 112 | text-decoration: underline 113 | 114 | &:not([toc-show]) 115 | display: none 116 | -------------------------------------------------------------------------------- /source/css/_style/_partial/post/word-count.styl: -------------------------------------------------------------------------------- 1 | .post-word-count 2 | i 3 | margin-right: 5px 4 | 5 | span 6 | margin-right: 10px -------------------------------------------------------------------------------- /source/css/_style/_partial/search.styl: -------------------------------------------------------------------------------- 1 | #search-panel 2 | &:not([search-show]) 3 | display: none 4 | 5 | position: fixed 6 | top: header-height 7 | z-index: 4 8 | width: 100% 9 | height: calc(100% - 50px) 10 | background-color: rgba(255, 255, 255, 0.2) 11 | backdrop-filter: blur(5px) 12 | -webkit-backdrop-filter: blur(5px) 13 | display: flex 14 | align-items: center 15 | justify-content: center 16 | 17 | .search-container 18 | width: 80% 19 | height: 70% 20 | padding: 15px 20px 21 | background-color: rgba(255, 255, 255, 0.95) 22 | // box-shadow: 0.5px 0.5px 1px rgba(0, 0, 0, 0.125) 23 | border: 1px solid rgba(209, 209, 209, 0.825) 24 | border-radius: 20px 25 | overflow-y: auto 26 | overflow-x: hidden 27 | 28 | .search-head 29 | display: flex 30 | flex-flow: row nowrap 31 | justify-content: space-between 32 | align-items: center 33 | font-size: article-title4-font-size 34 | color: orange-middle 35 | 36 | .search-title 37 | font-weight: bold 38 | font-weight: 1000 39 | 40 | i 41 | margin-right: 5px 42 | 43 | .search-close-btn 44 | margin-right: 5px 45 | cursor: pointer 46 | 47 | &:hover 48 | animation: beat 1s infinite 49 | 50 | .search-box 51 | margin: 15px auto 10px 52 | display: flex 53 | flex-flow: row nowrap 54 | align-items: center 55 | padding-bottom: 20px 56 | border-bottom: 1px solid rgba(209, 209, 209, 0.825) 57 | 58 | i 59 | margin-right: 5px 60 | 61 | #search-input 62 | flex: 1 63 | -webkit-flex: 1 64 | -ms-flex: 1 65 | font-size: default-font-size 66 | font-family: default-font-family 67 | border: 1px solid text-black-light 68 | border-radius: 15px 69 | padding: 3px 8px 70 | 71 | #search-count 72 | &:not([search-count-show]) 73 | display: none 74 | 75 | color: text-grey 76 | 77 | #search-result 78 | p 79 | margin: 5px 0 80 | 81 | em 82 | color: orange-middle 83 | font-weight: bold 84 | font-style: normal 85 | 86 | ul 87 | margin: 5px 0 0 88 | 89 | #search-result-empty 90 | &:not([search-empty-show]) 91 | display: none 92 | -------------------------------------------------------------------------------- /source/css/_style/_partial/tool-bar.styl: -------------------------------------------------------------------------------- 1 | #tool-bar 2 | z-index: 5 3 | font-size: 20px 4 | line-height: 20px 5 | position: fixed 6 | right: 5px 7 | bottom: 5px 8 | animation: showup 1s 9 | 10 | #tool-bar-main 11 | float: right 12 | padding: 8px 13 | background-color: code-light 14 | border: 0.5px solid rgba(204, 204, 204, 0.4) 15 | border-radius: 10px 16 | box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.125) 17 | 18 | div 19 | width: 20px 20 | height: 20px 21 | margin-top: 6px 22 | 23 | &:first-child 24 | margin-top: 0 25 | 26 | &:hover 27 | color: orange-fresh 28 | cursor: pointer 29 | 30 | #back-to-top 31 | display: none 32 | animation: showup 1s 33 | &:hover 34 | animation: bounce 1s ease-in-out infinite 35 | 36 | #tool-toggle 37 | animation: spin 1.2s ease-in-out 38 | 39 | &:hover 40 | animation: spin 1.5s ease-in-out infinite 41 | 42 | #tool-bar-more 43 | float: right 44 | margin-right: 2px 45 | padding: 8px 46 | background-color: code-light 47 | border: 0.5px solid rgba(204, 204, 204, 0.4) 48 | border-radius: 10px 49 | box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.125) 50 | 51 | div 52 | width: 20px 53 | height: 20px 54 | margin-top: 6px 55 | 56 | &:first-child 57 | margin-top: 0 58 | 59 | &:hover 60 | color: orange-fresh 61 | cursor: pointer 62 | 63 | @media screen and (min-width: 1280px) 64 | #tool-bar 65 | right: calc((100% - 1080px) / 2 - 55px) -------------------------------------------------------------------------------- /source/css/_style/about.styl: -------------------------------------------------------------------------------- 1 | .about-container 2 | width: 85% 3 | margin: 0 auto 4 | 5 | h1 6 | color: orange-middle 7 | padding-bottom: 12px 8 | border-bottom: 2px solid transparent 9 | border-image: linear-gradient(to right, rgba(31, 18, 53, 0.35), rgba(31, 18, 53, 0.1)) 1 10 | 11 | i 12 | margin-right: 5px 13 | 14 | .about-blog,.about-author,.about-contact,.about-links,.about-reward,.about-credits 15 | margin-bottom: 40px 16 | 17 | .about-keywords 18 | display: flex 19 | align-items: center 20 | justify-content: center 21 | flex-flow: row wrap 22 | margin: 10px auto 23 | 24 | .about-keywords-tag 25 | display: inline-flex 26 | align-items: center 27 | justify-content: center 28 | margin: 5px 5px 0 29 | width: 80px 30 | height: 25px 31 | background-color: rgba(255, 182, 79, 0.9) 32 | border-radius: 15px 33 | box-shadow: 1px 1px 2px shadow-grey 34 | text-align: center 35 | color: white 36 | font-size: info-font-size-normal 37 | 38 | .about-blog-supplement 39 | color: orange-low-saturation 40 | 41 | #author-img 42 | width: 100px 43 | height: 100px 44 | border-radius: 50% 45 | margin: 0 0 5px 46 | 47 | .about-author-nav 48 | display: flex 49 | flex-flow: row nowrap 50 | 51 | .about-author-info 52 | margin-left: 25px 53 | display: flex 54 | flex-flow: column wrap 55 | justify-content: center 56 | 57 | .author-name 58 | font-size: article-title3-font-size 59 | font-weight: bold 60 | margin-bottom: 5px 61 | 62 | .contact-nav 63 | display: flex 64 | flex-flow: row wrap 65 | 66 | .contact-item 67 | margin: 0 1% 15px 1% 68 | display: flex 69 | align-items: center 70 | width: 18% 71 | height: 30px 72 | white-space: nowrap 73 | 74 | i 75 | margin-right: 5px 76 | margin-left: 5px 77 | 78 | a 79 | color: text-black 80 | text-decoration: none 81 | margin-right: 5px 82 | overflow: hidden 83 | 84 | span 85 | margin-right: 5px 86 | 87 | &:hover 88 | background-color: orange-normal 89 | border-radius: 10px 90 | color: white 91 | 92 | a 93 | text-decoration: underline 94 | color: white 95 | 96 | i 97 | animation: fade 1s infinite 98 | 99 | .links-nav 100 | display: flex 101 | flex-flow: row wrap 102 | 103 | .links-item 104 | display: flex 105 | flex-flow: column nowrap 106 | width: 30% 107 | height: 95px 108 | border-radius: 15px 109 | border: 1px solid code-normal 110 | margin: 0 1.5% 15px 1.5% 111 | text-decoration: none 112 | color: text-black 113 | 114 | &:hover 115 | box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.125) 116 | 117 | .links-item-title 118 | background-color: orange-normal 119 | color: white 120 | transition: background-color 0.5s ease-out 121 | 122 | .links-item-title 123 | height: 30% 124 | padding: 5px 15px 125 | margin-bottom: 5px 126 | font-weight: bold 127 | background-color: code-normal 128 | border-radius: 15px 15px 0 0 129 | 130 | .links-item-desc 131 | margin: 0 15px 5px 132 | overflow: hidden 133 | font-size: info-font-size-normal 134 | 135 | .about-reward-nav 136 | display: flex 137 | flex-flow: row wrap 138 | justify-content: center 139 | align-items: center 140 | 141 | .about-reward-item 142 | display: flex 143 | flex-flow: column nowrap 144 | justify-content: center 145 | align-items: center 146 | width: 30% 147 | aspect-ratio: 1/1 148 | margin: 0 1.5% 5px 149 | 150 | .about-reward-img 151 | width: 90% 152 | aspect-ratio: 1/1 153 | 154 | .about-credits-list 155 | background-color: code-light 156 | padding: 5px 20px 157 | border-radius: 10px 158 | 159 | @media screen and (max-width: 768px) 160 | .contact-item 161 | width: 30% 162 | 163 | .about-author-nav 164 | flex-flow: column wrap 165 | justify-content: center 166 | align-items: center 167 | 168 | .author-name 169 | text-align: center 170 | 171 | .about-author-info 172 | margin-left: 0 173 | display: block 174 | 175 | .links-item 176 | width: 100% 177 | height: 90px 178 | 179 | .about-reward-nav 180 | display: flex 181 | flex-flow: column nowrap 182 | 183 | .about-reward-item 184 | width: 300px 185 | margin: 5px auto 186 | -------------------------------------------------------------------------------- /source/css/_style/archive.styl: -------------------------------------------------------------------------------- 1 | .page-container 2 | width: 85% 3 | margin: 0 auto 4 | 5 | a 6 | text-decoration: none 7 | color: text-black 8 | 9 | .page-title 10 | color: orange-middle 11 | 12 | h1 13 | margin: 0.5em 0 14 | 15 | i 16 | margin-right: 5px 17 | 18 | .archives-year 19 | margin: 20px 0 20 | 21 | .archives-year-link 22 | font-size: article-title1-font-size 23 | font-weight: bold 24 | display: block 25 | width: 100% 26 | padding: 5px 0 27 | border-bottom: 2px solid border-grey 28 | vertical-align: middle 29 | 30 | i 31 | display: none 32 | 33 | &:hover 34 | color: orange-middle 35 | 36 | i 37 | display: inline 38 | margin-left: 5px 39 | 40 | 41 | .archives-month 42 | margin: 20px 0 43 | 44 | .archives-month-link 45 | margin: 10px 0 46 | display: block 47 | font-size: article-title3-font-size 48 | font-weight: bold 49 | 50 | i 51 | display: none 52 | 53 | &:hover 54 | color: orange-middle 55 | 56 | i 57 | display: inline 58 | margin-left: 5px 59 | 60 | .archives-article-list 61 | display: flex 62 | flex-flow: row wrap 63 | align-items: center 64 | 65 | .article-item 66 | width: 23% 67 | aspect-ratio: 1/1 68 | border: 1px solid border-grey 69 | margin-right: 1.8% 70 | margin-top: 10px 71 | 72 | .article-item-card 73 | display: flex 74 | flex-flow: column nowrap 75 | width: 100% 76 | height: 100% 77 | font-size: info-font-size-normal 78 | 79 | &:hover 80 | background-color: rgba(249, 173, 8, 0.7) 81 | transition: background-color 0.3s ease-out 82 | -moz-transition: background-color 0.3s ease-out 83 | -webkit-transition: background-color 0.3s ease-out 84 | -o-transition: background-color 0.3s ease-out 85 | 86 | .article-item-title,.article-item-preview 87 | display: none 88 | 89 | .article-item-hover 90 | display: flex 91 | width: 100% 92 | height: 100% 93 | flex-flow: column nowrap 94 | justify-content: center 95 | align-items: center 96 | color: white 97 | font-size: article-title4-font-size 98 | font-weight: bold 99 | animation: showup 0.5s 100 | 101 | i 102 | margin-top: 10px 103 | 104 | .article-item-title 105 | font-size: default-font-size 106 | font-weight: bold 107 | margin: 10px 10px 5px 108 | 109 | .article-item-preview 110 | margin: 0 10px 10px 111 | word-break: break-all 112 | overflow: hidden 113 | text-align: justify 114 | 115 | .article-item-hover 116 | display: none 117 | 118 | @media screen and (max-width: 820px) 119 | .article-item 120 | width: 45% 121 | margin-right: 4% 122 | 123 | .article-item-title 124 | margin: 5px 5px 3px 125 | 126 | .article-item-preview 127 | margin: 0 5px 5px 128 | -------------------------------------------------------------------------------- /source/css/_style/categories.styl: -------------------------------------------------------------------------------- 1 | .categories-list-container 2 | margin: 18px auto 3 | font-size: article-title5-font-size 4 | display: flex 5 | flex-flow: column wrap 6 | 7 | .categories-item 8 | height: 2em 9 | display: flex 10 | align-items: center 11 | 12 | i 13 | margin-right 5px 14 | 15 | &:hover 16 | background: rgba(255, 182, 79, 0.6) 17 | 18 | .categories-item-count 19 | margin-left: 5px 20 | 21 | .categories-list-container-helpers 22 | margin: 18px auto 23 | font-size: article-title5-font-size 24 | 25 | .category-list 26 | list-style: none 27 | line-height: 2em 28 | padding-left: 0 29 | 30 | .category-list-item::before 31 | content: "\2013" 32 | margin-right: 5px 33 | 34 | .category-list-link 35 | display: inline-block 36 | width: calc(100% - 50px - 20px) 37 | padding-left: 5px 38 | border-radius: 10px 39 | 40 | &:hover 41 | background: rgba(255, 223, 106, 0.6) 42 | transition: background 0.5s ease-out 43 | -moz-transition: background 0.5s ease-out 44 | -webkit-transition: background 0.5s ease-out 45 | -o-transition: background 0.5s ease-out 46 | 47 | .category-list-count 48 | color: text-grey-light 49 | background-color: code-light 50 | width: 40px 51 | border-radius: 20px 52 | text-align: center 53 | font-size: default-font-size-smaller 54 | line-height: 1em 55 | margin: 6px 0 56 | padding: 2px 2px 57 | float: right 58 | 59 | .category-list-child 60 | list-style: none 61 | padding-left: 2em -------------------------------------------------------------------------------- /source/css/_style/index.styl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chanwj/hexo-theme-meow/7bba0986340a6e003e6e2c820a29bcb6938b5cce/source/css/_style/index.styl -------------------------------------------------------------------------------- /source/css/_style/layout.styl: -------------------------------------------------------------------------------- 1 | html 2 | // scrollbar for chrome 3 | *::-webkit-scrollbar 4 | width: 10px 5 | 6 | *::-webkit-scrollbar-thumb 7 | background-color: border-grey 8 | border-radius: 30px 9 | 10 | *::-webkit-scrollbar-thumb:hover 11 | background-color: yellow-normal 12 | 13 | *::-webkit-scrollbar-thumb:active 14 | background-color: orange-middle 15 | 16 | *::-webkit-scrollbar-track 17 | background-color: code-light 18 | 19 | // scrollbar for firefox 20 | @-moz-document url-prefix() 21 | * 22 | scrollbar-color: orange-normal code-light 23 | scrollbar-width: thin 24 | 25 | scroll-behavior: smooth 26 | 27 | body 28 | if hexo-config('background.type') == 1 29 | background: url($root-path + site-background-image) 30 | else if hexo-config('background.type') == 3 31 | background: site-background-gradient 32 | else 33 | background: site-background-color 34 | background-position: center 35 | background-size: cover 36 | background-attachment: unquote(hexo-config('background.attachment')) 37 | transition: background 0.5s ease-out 38 | -moz-transition: background 0.5s ease-out 39 | -webkit-transition: background 0.5s ease-out 40 | -o-transition: background 0.5s ease-out 41 | margin: 0 42 | padding: 0 43 | font-size: default-font-size 44 | font-family: default-font-family 45 | color: text-black 46 | position: relative 47 | 48 | if(! hexo-config('selectable')) 49 | -webkit-user-select: none /* Safari */ 50 | -ms-user-select: none /* IE 10+ and Edge */ 51 | -moz-user-select: none /* Firefox */ 52 | user-select: none /* Standard syntax */ 53 | 54 | .main 55 | max-width: max-page-width 56 | width: 95% 57 | margin: 0 auto 58 | 59 | .main-content 60 | background-color: #ffffff 61 | background-image: url($root-path + 'img/blog-background.png') 62 | border-radius: 20px 63 | margin: 0 auto 64 | padding: 20px 0 40px 65 | 66 | @media screen and (max-width: 768px) 67 | body 68 | font-size: default-font-size-smaller -------------------------------------------------------------------------------- /source/css/_style/tags.styl: -------------------------------------------------------------------------------- 1 | .tag-cloud 2 | margin: 20px auto 3 | display: flex 4 | justify-content: center 5 | flex-flow: row wrap 6 | align-items: baseline 7 | 8 | a 9 | margin: 5px 10px 10 | 11 | &:hover 12 | text-decoration: underline 13 | 14 | .tag-list-container 15 | margin: 18px auto 16 | display: flex 17 | flex-flow: row wrap 18 | // justify-content: center 19 | align-items: baseline 20 | font-size: article-title4-font-size 21 | color: orange-low-saturation 22 | 23 | a 24 | margin: 5px 10px 25 | color: orange-low-saturation 26 | 27 | &:hover 28 | text-decoration: underline 29 | color: orange-fresh 30 | 31 | .tag-count 32 | vertical-align: super 33 | font-size: superscript-font-size -------------------------------------------------------------------------------- /source/css/darkmode.styl: -------------------------------------------------------------------------------- 1 | @import '_style/_default/global-settings' 2 | 3 | body.dm-dark 4 | background: black 5 | background-image: none 6 | color: darkmode-text 7 | transition: background 0.5s ease-out 8 | -moz-transition: background 0.5s ease-out 9 | -webkit-transition: background 0.5s ease-out 10 | -o-transition: background 0.5s ease-out 11 | 12 | .main-content 13 | background: background-dark-light 14 | 15 | a 16 | color: orange-low-saturation 17 | 18 | &:hover 19 | color: orange-middle 20 | 21 | h1,h2,h3,h4,h5,h6 22 | color: orange-low-saturation 23 | 24 | hr 25 | border-image: linear-gradient(to right, rgba(141, 141, 141, 0.1), rgba(141, 141, 141, 0.35), rgba(141, 141, 141, 0.1)) 1 26 | 27 | details 28 | summary 29 | background-color: background-dark-lighter 30 | 31 | &[open] 32 | background-color: background-dark-lighter 33 | 34 | summary 35 | background-color: background-dark-light 36 | 37 | .blog-title 38 | color: orange-low-saturation 39 | 40 | .blog-desc 41 | color: darkmode-text 42 | 43 | .index-post-item 44 | border-image: linear-gradient(to right, rgba(141, 141, 141, 0.1), rgba(141, 141, 141, 0.35), rgba(141, 141, 141, 0.1)) 1 45 | 46 | h1 47 | a 48 | color: orange-low-saturation 49 | 50 | &:hover 51 | color: orange-middle 52 | 53 | .read-more 54 | background-color: orange-dark 55 | 56 | &:hover 57 | background-color: orange-low-saturation 58 | 59 | .pagination 60 | a 61 | color: text-grey 62 | 63 | .footer-content 64 | color: text-grey-light 65 | 66 | .copyright-info a 67 | color: text-grey-light 68 | 69 | &:hover 70 | color: white 71 | background-color: text-grey-light 72 | 73 | #register_link 74 | color: text-grey-light 75 | 76 | #tool-bar-main, #tool-bar-more 77 | background-color: text-black-light 78 | border-color: background-dark-lighter 79 | 80 | div:hover 81 | color: orange-middle 82 | 83 | header 84 | background-color: background-dark 85 | 86 | .nav-info #nav-title 87 | color: orange-low-saturation 88 | 89 | &:hover 90 | color: orange-middle 91 | 92 | .top-menu-expanded 93 | .top-menu-item 94 | color: orange-low-saturation 95 | 96 | &:hover 97 | color: orange-middle 98 | 99 | #top-menu-hidden .menu-hidden-content 100 | background-color: background-dark-light 101 | 102 | .menu-hidden-item 103 | background-color: background-dark 104 | border-color: background-dark-lighter 105 | 106 | .search-container 107 | background-color: background-dark 108 | 109 | .search-head 110 | color: orange-low-saturation 111 | 112 | #search-result em 113 | color: orange-low-saturation 114 | 115 | .article-item a, .post-copyright a, .post-prev a, .post-next a 116 | color: text-grey-light 117 | 118 | .categories-item 119 | color: darkmode-text 120 | 121 | &:hover 122 | color: white 123 | 124 | .category-list a 125 | color: darkmode-text 126 | 127 | &:hover 128 | color: white 129 | 130 | .category-list-count 131 | background-color: background-dark-lighter 132 | 133 | .page-not-found a 134 | color: white 135 | 136 | .about-container h1 137 | border-image: linear-gradient(to right, rgba(141, 141, 141, 0.1), rgba(141, 141, 141, 0.35), rgba(141, 141, 141, 0.1)) 1 138 | 139 | .about-keywords-tag 140 | background-color: background-dark-lighter 141 | box-shadow: none 142 | 143 | .contact-item 144 | a 145 | color: darkmode-text 146 | 147 | &:hover 148 | background-color: orange-low-saturation 149 | 150 | .links-item 151 | color: darkmode-text 152 | border-color: text-black-light 153 | 154 | .links-item-title 155 | background-color: background-dark-lighter 156 | 157 | .about-credits-list 158 | background-color: background-dark-lighter 159 | 160 | figure.highlight 161 | background-color: background-dark-lighter 162 | 163 | figcaption 164 | color: darkmode-text 165 | background-color: rgba(135, 135, 135, 0.5) 166 | 167 | ::-webkit-scrollbar-thumb 168 | background-color: background-dark-lighter 169 | 170 | @-moz-document url-prefix() 171 | scrollbar-color: background-dark-lighter transparent 172 | 173 | code 174 | background-color: background-dark-lighter 175 | color: darkmode-text 176 | 177 | #copyCodeBtn:hover 178 | color: darkmode-text 179 | 180 | blockquote 181 | color: text-black 182 | 183 | blockquote.light 184 | color: darkmode-text 185 | 186 | thead 187 | background-color: background-dark-lighter 188 | color: darkmode-text 189 | 190 | .reward-container 191 | background-color: background-dark 192 | border-color: background-dark-lighter 193 | 194 | *::-webkit-scrollbar-thumb 195 | background-color: background-dark-lighter 196 | 197 | *::-webkit-scrollbar-track 198 | background-color: background-dark-light 199 | 200 | // scrollbar for firefox 201 | @-moz-document url-prefix() 202 | * 203 | scrollbar-color: background-dark-lighter code-light 204 | scrollbar-width: thin 205 | 206 | #post-toc 207 | background-color: background-dark-light 208 | 209 | .toc-title 210 | color: text-grey-light 211 | 212 | a 213 | color: text-grey-light 214 | 215 | @media screen and (max-width: 1499px) 216 | .toc-aside 217 | background-color: rgba(78, 74, 85, 0.9) 218 | 219 | .fiction-meta 220 | background-color: background-dark-lighter 221 | 222 | .fiction-meta-item:hover 223 | background-color: background-dark 224 | 225 | .fiction-meta-key 226 | color: darkmode-text 227 | 228 | .fiction-before-content, .fiction-notes-after 229 | border-image: linear-gradient(to right, rgba(141, 141, 141, 0.1), rgba(141, 141, 141, 0.35), rgba(141, 141, 141, 0.1)) 1 230 | 231 | .linkcard-item 232 | &:hover 233 | background-color: background-dark-lighter 234 | 235 | a 236 | color: darkmode-text 237 | 238 | &:hover 239 | color: darkmode-text 240 | .linkcard-item-icon 241 | color: darkmode-text 242 | 243 | .article-item-card:hover 244 | background-color: background-dark-lighter -------------------------------------------------------------------------------- /source/css/style.styl: -------------------------------------------------------------------------------- 1 | importUrl(url_list) 2 | if url_list 3 | for url_item in url_list 4 | @import url(url_item) 5 | 6 | importUrl(hexo-config('font.url_list')) 7 | 8 | @import '_style/_default/*' 9 | @import '_style/*' 10 | @import '_style/_partial/*' 11 | @import '_style/_partial/post/*' -------------------------------------------------------------------------------- /source/css/third-party/APlayer.min.css: -------------------------------------------------------------------------------- 1 | .aplayer{background:#fff;font-family:Arial,Helvetica,sans-serif;margin:5px;box-shadow:0 2px 2px 0 rgba(0,0,0,.07),0 1px 5px 0 rgba(0,0,0,.1);border-radius:2px;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:normal;position:relative}.aplayer *{box-sizing:content-box}.aplayer svg{width:100%;height:100%}.aplayer svg circle,.aplayer svg path{fill:#fff}.aplayer.aplayer-withlist .aplayer-info{border-bottom:1px solid #e9e9e9}.aplayer.aplayer-withlist .aplayer-list{display:block}.aplayer.aplayer-withlist .aplayer-icon-order,.aplayer.aplayer-withlist .aplayer-info .aplayer-controller .aplayer-time .aplayer-icon.aplayer-icon-menu{display:inline}.aplayer.aplayer-withlrc .aplayer-pic{height:90px;width:90px}.aplayer.aplayer-withlrc .aplayer-info{margin-left:90px;height:90px;padding:10px 7px 0}.aplayer.aplayer-withlrc .aplayer-lrc{display:block}.aplayer.aplayer-narrow{width:66px}.aplayer.aplayer-narrow .aplayer-info,.aplayer.aplayer-narrow .aplayer-list{display:none}.aplayer.aplayer-narrow .aplayer-body,.aplayer.aplayer-narrow .aplayer-pic{height:66px;width:66px}.aplayer.aplayer-fixed{position:fixed;bottom:0;left:0;right:0;margin:0;z-index:99;overflow:visible;max-width:400px;box-shadow:none}.aplayer.aplayer-fixed .aplayer-list{margin-bottom:65px;border:1px solid #eee;border-bottom:none}.aplayer.aplayer-fixed .aplayer-body{position:fixed;bottom:0;left:0;right:0;margin:0;z-index:99;background:#fff;padding-right:18px;transition:all .3s ease;max-width:400px}.aplayer.aplayer-fixed .aplayer-lrc{display:block;position:fixed;bottom:10px;left:0;right:0;margin:0;z-index:98;pointer-events:none;text-shadow:-1px -1px 0 #fff}.aplayer.aplayer-fixed .aplayer-lrc:after,.aplayer.aplayer-fixed .aplayer-lrc:before{display:none}.aplayer.aplayer-fixed .aplayer-info{-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transform-origin:0 0;transform-origin:0 0;transition:all .3s ease;border-bottom:none;border-top:1px solid #e9e9e9}.aplayer.aplayer-fixed .aplayer-info .aplayer-music{width:calc(100% - 105px)}.aplayer.aplayer-fixed .aplayer-miniswitcher{display:block}.aplayer.aplayer-fixed.aplayer-narrow .aplayer-info{display:block;-webkit-transform:scaleX(0);transform:scaleX(0)}.aplayer.aplayer-fixed.aplayer-narrow .aplayer-body{width:66px!important}.aplayer.aplayer-fixed.aplayer-narrow .aplayer-miniswitcher .aplayer-icon{-webkit-transform:rotateY(0);transform:rotateY(0)}.aplayer.aplayer-fixed .aplayer-icon-back,.aplayer.aplayer-fixed .aplayer-icon-forward,.aplayer.aplayer-fixed .aplayer-icon-lrc,.aplayer.aplayer-fixed .aplayer-icon-play{display:inline-block}.aplayer.aplayer-fixed .aplayer-icon-back,.aplayer.aplayer-fixed .aplayer-icon-forward,.aplayer.aplayer-fixed .aplayer-icon-menu,.aplayer.aplayer-fixed .aplayer-icon-play{position:absolute;bottom:27px;width:20px;height:20px}.aplayer.aplayer-fixed .aplayer-icon-back{right:75px}.aplayer.aplayer-fixed .aplayer-icon-play{right:50px}.aplayer.aplayer-fixed .aplayer-icon-forward{right:25px}.aplayer.aplayer-fixed .aplayer-icon-menu{right:0}.aplayer.aplayer-arrow .aplayer-icon-loop,.aplayer.aplayer-arrow .aplayer-icon-order,.aplayer.aplayer-mobile .aplayer-icon-volume-down{display:none}.aplayer.aplayer-loading .aplayer-info .aplayer-controller .aplayer-loading-icon{display:block}.aplayer.aplayer-loading .aplayer-info .aplayer-controller .aplayer-bar-wrap .aplayer-bar .aplayer-played .aplayer-thumb{-webkit-transform:scale(1);transform:scale(1)}.aplayer .aplayer-body{position:relative}.aplayer .aplayer-icon{width:15px;height:15px;border:none;background-color:transparent;outline:none;cursor:pointer;opacity:.8;vertical-align:middle;padding:0;font-size:12px;margin:0;display:inline-block}.aplayer .aplayer-icon path{transition:all .2s ease-in-out}.aplayer .aplayer-icon-back,.aplayer .aplayer-icon-forward,.aplayer .aplayer-icon-lrc,.aplayer .aplayer-icon-order,.aplayer .aplayer-icon-play{display:none}.aplayer .aplayer-icon-lrc-inactivity svg{opacity:.4}.aplayer .aplayer-icon-forward{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.aplayer .aplayer-lrc-content{display:none}.aplayer .aplayer-pic{position:relative;float:left;height:66px;width:66px;background-size:cover;background-position:50%;transition:all .3s ease;cursor:pointer}.aplayer .aplayer-pic:hover .aplayer-button{opacity:1}.aplayer .aplayer-pic .aplayer-button{position:absolute;border-radius:50%;opacity:.8;text-shadow:0 1px 1px rgba(0,0,0,.2);box-shadow:0 1px 1px rgba(0,0,0,.2);background:rgba(0,0,0,.2);transition:all .1s ease}.aplayer .aplayer-pic .aplayer-button path{fill:#fff}.aplayer .aplayer-pic .aplayer-hide{display:none}.aplayer .aplayer-pic .aplayer-play{width:26px;height:26px;border:2px solid #fff;bottom:50%;right:50%;margin:0 -15px -15px 0}.aplayer .aplayer-pic .aplayer-play svg{position:absolute;top:3px;left:4px;height:20px;width:20px}.aplayer .aplayer-pic .aplayer-pause{width:16px;height:16px;border:2px solid #fff;bottom:4px;right:4px}.aplayer .aplayer-pic .aplayer-pause svg{position:absolute;top:2px;left:2px;height:12px;width:12px}.aplayer .aplayer-info{margin-left:66px;padding:14px 7px 0 10px;height:66px;box-sizing:border-box}.aplayer .aplayer-info .aplayer-music{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin:0 0 13px 5px;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;cursor:default;padding-bottom:2px;height:20px}.aplayer .aplayer-info .aplayer-music .aplayer-title{font-size:14px}.aplayer .aplayer-info .aplayer-music .aplayer-author{font-size:12px;color:#666}.aplayer .aplayer-info .aplayer-controller{position:relative;display:flex}.aplayer .aplayer-info .aplayer-controller .aplayer-bar-wrap{margin:0 0 0 5px;padding:4px 0;cursor:pointer!important;flex:1}.aplayer .aplayer-info .aplayer-controller .aplayer-bar-wrap:hover .aplayer-bar .aplayer-played .aplayer-thumb{-webkit-transform:scale(1);transform:scale(1)}.aplayer .aplayer-info .aplayer-controller .aplayer-bar-wrap .aplayer-bar{position:relative;height:2px;width:100%;background:#cdcdcd}.aplayer .aplayer-info .aplayer-controller .aplayer-bar-wrap .aplayer-bar .aplayer-loaded{position:absolute;left:0;top:0;bottom:0;background:#aaa;height:2px;transition:all .5s ease}.aplayer .aplayer-info .aplayer-controller .aplayer-bar-wrap .aplayer-bar .aplayer-played{position:absolute;left:0;top:0;bottom:0;height:2px}.aplayer .aplayer-info .aplayer-controller .aplayer-bar-wrap .aplayer-bar .aplayer-played .aplayer-thumb{position:absolute;top:0;right:5px;margin-top:-4px;margin-right:-10px;height:10px;width:10px;border-radius:50%;cursor:pointer;transition:all .3s ease-in-out;-webkit-transform:scale(0);transform:scale(0)}.aplayer .aplayer-info .aplayer-controller .aplayer-time{position:relative;right:0;bottom:4px;height:17px;color:#999;font-size:11px;padding-left:7px}.aplayer .aplayer-info .aplayer-controller .aplayer-time .aplayer-time-inner{vertical-align:middle}.aplayer .aplayer-info .aplayer-controller .aplayer-time .aplayer-icon{cursor:pointer;transition:all .2s ease}.aplayer .aplayer-info .aplayer-controller .aplayer-time .aplayer-icon path{fill:#666}.aplayer .aplayer-info .aplayer-controller .aplayer-time .aplayer-icon.aplayer-icon-loop{margin-right:2px}.aplayer .aplayer-info .aplayer-controller .aplayer-time .aplayer-icon:hover path{fill:#000}.aplayer .aplayer-info .aplayer-controller .aplayer-time .aplayer-icon.aplayer-icon-menu,.aplayer .aplayer-info .aplayer-controller .aplayer-time.aplayer-time-narrow .aplayer-icon-menu,.aplayer .aplayer-info .aplayer-controller .aplayer-time.aplayer-time-narrow .aplayer-icon-mode{display:none}.aplayer .aplayer-info .aplayer-controller .aplayer-volume-wrap{position:relative;display:inline-block;margin-left:3px;cursor:pointer!important}.aplayer .aplayer-info .aplayer-controller .aplayer-volume-wrap:hover .aplayer-volume-bar-wrap{height:40px}.aplayer .aplayer-info .aplayer-controller .aplayer-volume-wrap .aplayer-volume-bar-wrap{position:absolute;bottom:15px;right:-3px;width:25px;height:0;z-index:99;overflow:hidden;transition:all .2s ease-in-out}.aplayer .aplayer-info .aplayer-controller .aplayer-volume-wrap .aplayer-volume-bar-wrap.aplayer-volume-bar-wrap-active{height:40px}.aplayer .aplayer-info .aplayer-controller .aplayer-volume-wrap .aplayer-volume-bar-wrap .aplayer-volume-bar{position:absolute;bottom:0;right:10px;width:5px;height:35px;background:#aaa;border-radius:2.5px;overflow:hidden}.aplayer .aplayer-info .aplayer-controller .aplayer-volume-wrap .aplayer-volume-bar-wrap .aplayer-volume-bar .aplayer-volume{position:absolute;bottom:0;right:0;width:5px;transition:all .1s ease}.aplayer .aplayer-info .aplayer-controller .aplayer-loading-icon{display:none}.aplayer .aplayer-info .aplayer-controller .aplayer-loading-icon svg{position:absolute;-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite}.aplayer .aplayer-lrc{display:none;position:relative;height:30px;text-align:center;overflow:hidden;margin:-10px 0 7px}.aplayer .aplayer-lrc:before{top:0;height:10%;background:linear-gradient(180deg,#fff 0,hsla(0,0%,100%,0));filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffffff",endColorstr="#00ffffff",GradientType=0)}.aplayer .aplayer-lrc:after,.aplayer .aplayer-lrc:before{position:absolute;z-index:1;display:block;overflow:hidden;width:100%;content:" "}.aplayer .aplayer-lrc:after{bottom:0;height:33%;background:linear-gradient(180deg,hsla(0,0%,100%,0) 0,hsla(0,0%,100%,.8));filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00ffffff",endColorstr="#ccffffff",GradientType=0)}.aplayer .aplayer-lrc p{font-size:12px;color:#666;line-height:16px!important;height:16px!important;padding:0!important;margin:0!important;transition:all .5s ease-out;opacity:.4;overflow:hidden}.aplayer .aplayer-lrc p.aplayer-lrc-current{opacity:1;overflow:visible;height:auto!important;min-height:16px}.aplayer .aplayer-lrc.aplayer-lrc-hide{display:none}.aplayer .aplayer-lrc .aplayer-lrc-contents{width:100%;transition:all .5s ease-out;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;cursor:default}.aplayer .aplayer-list{overflow:auto;transition:all .5s ease;will-change:height;display:none;overflow:hidden}.aplayer .aplayer-list.aplayer-list-hide{max-height:0!important}.aplayer .aplayer-list ol{list-style-type:none;margin:0;padding:0;overflow-y:auto}.aplayer .aplayer-list ol::-webkit-scrollbar{width:5px}.aplayer .aplayer-list ol::-webkit-scrollbar-thumb{border-radius:3px;background-color:#eee}.aplayer .aplayer-list ol::-webkit-scrollbar-thumb:hover{background-color:#ccc}.aplayer .aplayer-list ol li{position:relative;height:32px;line-height:32px;padding:0 15px;font-size:12px;border-top:1px solid #e9e9e9;cursor:pointer;transition:all .2s ease;overflow:hidden;margin:0}.aplayer .aplayer-list ol li:first-child{border-top:none}.aplayer .aplayer-list ol li:hover{background:#efefef}.aplayer .aplayer-list ol li.aplayer-list-light{background:#e9e9e9}.aplayer .aplayer-list ol li.aplayer-list-light .aplayer-list-cur{display:inline-block}.aplayer .aplayer-list ol li .aplayer-list-cur{display:none;width:3px;height:22px;position:absolute;left:0;top:5px;cursor:pointer}.aplayer .aplayer-list ol li .aplayer-list-index{color:#666;margin-right:12px;cursor:pointer}.aplayer .aplayer-list ol li .aplayer-list-author{color:#666;float:right;cursor:pointer}.aplayer .aplayer-notice{opacity:0;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);font-size:12px;border-radius:4px;padding:5px 10px;transition:all .3s ease-in-out;overflow:hidden;color:#fff;pointer-events:none;background-color:#f4f4f5;color:#909399}.aplayer .aplayer-miniswitcher{display:none;position:absolute;top:0;right:0;bottom:0;height:100%;background:#e6e6e6;width:18px;border-radius:0 2px 2px 0}.aplayer .aplayer-miniswitcher .aplayer-icon{height:100%;width:100%;-webkit-transform:rotateY(180deg);transform:rotateY(180deg);transition:all .3s ease}.aplayer .aplayer-miniswitcher .aplayer-icon path{fill:#666}.aplayer .aplayer-miniswitcher .aplayer-icon:hover path{fill:#000}@-webkit-keyframes aplayer-roll{0%{left:0}to{left:-100%}}@keyframes aplayer-roll{0%{left:0}to{left:-100%}}@-webkit-keyframes rotate{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes rotate{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}} 2 | 3 | /*# sourceMappingURL=APlayer.min.css.map*/ -------------------------------------------------------------------------------- /source/img/author.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chanwj/hexo-theme-meow/7bba0986340a6e003e6e2c820a29bcb6938b5cce/source/img/author.jpg -------------------------------------------------------------------------------- /source/img/blog-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chanwj/hexo-theme-meow/7bba0986340a6e003e6e2c820a29bcb6938b5cce/source/img/blog-background.png -------------------------------------------------------------------------------- /source/img/reward/alipay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chanwj/hexo-theme-meow/7bba0986340a6e003e6e2c820a29bcb6938b5cce/source/img/reward/alipay.jpg -------------------------------------------------------------------------------- /source/img/reward/wechat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chanwj/hexo-theme-meow/7bba0986340a6e003e6e2c820a29bcb6938b5cce/source/img/reward/wechat.jpg -------------------------------------------------------------------------------- /source/img/site-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chanwj/hexo-theme-meow/7bba0986340a6e003e6e2c820a29bcb6938b5cce/source/img/site-icon.png -------------------------------------------------------------------------------- /source/js/theme/copy.js: -------------------------------------------------------------------------------- 1 | function copyCode() { 2 | 'use strict'; 3 | var clipboard = new ClipboardJS('#copyCodeBtn', { 4 | target: function (trigger) { 5 | return trigger.parentNode.querySelector('.code'); 6 | }, 7 | }); 8 | } 9 | 10 | document.addEventListener('DOMContentLoaded', function () { 11 | 'use strict'; 12 | var figureList = document.querySelectorAll('.highlight'); 13 | figureList.forEach(function (figure) { 14 | var copyCodeBtn = document.createElement('button'); 15 | copyCodeBtn.id = 'copyCodeBtn'; 16 | copyCodeBtn.className = 'fa-regular fa-copy'; 17 | copyCodeBtn.alt = 'Copy'; 18 | figure.appendChild(copyCodeBtn); 19 | }) 20 | }) 21 | 22 | function copyText(text) { 23 | 'use strict'; 24 | if (navigator.clipboard) { 25 | navigator.clipboard.writeText(text); 26 | } else { 27 | const textarea = document.createElement('textarea'); 28 | textarea.value = text; 29 | textarea.style.position = 'fixed'; 30 | document.body.appendChild(textarea); 31 | textarea.select(); 32 | document.execCommand('copy'); 33 | document.body.removeChild(textarea); 34 | } 35 | 36 | alert('Copied successfully.'); 37 | } 38 | -------------------------------------------------------------------------------- /source/js/theme/menu.js: -------------------------------------------------------------------------------- 1 | function openTopMenu() { 2 | 'use strict'; 3 | var hiddenMenu = document.getElementById('top-menu-hidden'); 4 | if (hiddenMenu.getAttribute('menu-show')) { 5 | hiddenMenu.removeAttribute('menu-show') 6 | hiddenMenu.style.display = 'none'; 7 | } else { 8 | hiddenMenu.setAttribute('menu-show', true); 9 | hiddenMenu.style.display = 'flex'; 10 | } 11 | } 12 | 13 | function closeTopMenu() { 14 | 'use strict'; 15 | var hiddenMenu = document.getElementById('top-menu-hidden'); 16 | if (hiddenMenu.getAttribute('menu-show')) { 17 | hiddenMenu.removeAttribute('menu-show') 18 | hiddenMenu.style.display = 'none'; 19 | } else { 20 | hiddenMenu.setAttribute('menu-show', true); 21 | hiddenMenu.style.display = 'flex'; 22 | } 23 | } -------------------------------------------------------------------------------- /source/js/theme/reward.js: -------------------------------------------------------------------------------- 1 | function openPostReward(){ 2 | 'use strict'; 3 | var rewardPanel = document.getElementById('reward-panel'); 4 | rewardPanel.setAttribute('reward-show', true); 5 | } 6 | 7 | function closePostReward(){ 8 | 'use strict'; 9 | var rewardPanel = document.getElementById('reward-panel'); 10 | rewardPanel.removeAttribute('reward-show') 11 | } -------------------------------------------------------------------------------- /source/js/theme/search.js: -------------------------------------------------------------------------------- 1 | var searchFunc = function(path, search_id, content_id) { 2 | 'use strict'; 3 | $.ajax({ 4 | url: path, 5 | dataType: "xml", 6 | success: function( xmlResponse ) { 7 | // get the contents from search data 8 | var datas = $( "entry", xmlResponse ).map(function() { 9 | return { 10 | title: $( "title", this ).text(), 11 | content: $("content",this).text(), 12 | url: $( "url" , this).text() 13 | }; 14 | }).get(); 15 | 16 | var $input = document.getElementById(search_id); 17 | if (!$input) return; 18 | var $resultContent = document.getElementById(content_id); 19 | var searchCount = document.getElementById('search-count'); 20 | var initSearchCount = searchCount.innerText; 21 | var searchEmpty = document.getElementById('search-result-empty'); 22 | if ($("#search-input").length > 0) { 23 | $input.addEventListener('input', function () { 24 | $resultContent.innerHTML = ""; 25 | if (this.value.trim().length <= 0) { 26 | searchCount.removeAttribute('search-count-show'); 27 | return; 28 | } 29 | var str = '
    '; 30 | var keywords = this.value.trim().toLowerCase().split(/[\s\-]+/); 31 | var matchCount = 0; 32 | 33 | // perform local searching 34 | datas.forEach(function (data) { 35 | var isMatch = true; 36 | // var content_index = []; 37 | if (!data.title || data.title.trim() === '') { 38 | data.title = "Untitled"; 39 | } 40 | var data_title = data.title.trim().toLowerCase(); 41 | var data_content = data.content.trim().replace(/<[^>]+>/g, "").toLowerCase(); 42 | var data_url = data.url; 43 | var index_title = -1; 44 | var index_content = -1; 45 | var first_occur = -1; 46 | // only match artiles with not empty contents 47 | if (data_content !== '') { 48 | keywords.forEach(function (keyword, i) { 49 | index_title = data_title.indexOf(keyword); 50 | index_content = data_content.indexOf(keyword); 51 | 52 | if (index_title < 0 && index_content < 0) { 53 | isMatch = false; 54 | } else { 55 | if (index_content < 0) { 56 | index_content = 0; 57 | } 58 | if (i == 0) { 59 | first_occur = index_content; 60 | } 61 | // content_index.push({index_content:index_content, keyword_len:keyword_len}); 62 | } 63 | }); 64 | } else { 65 | isMatch = false; 66 | } 67 | // show search results 68 | if (isMatch) { 69 | matchCount++; 70 | str += "
  • " + data_title + ""; 71 | var content = data.content.trim().replace(/<[^>]+>/g, ""); 72 | if (first_occur >= 0) { 73 | // cut out 100 characters 74 | var start = first_occur - 20; 75 | var end = first_occur + 80; 76 | 77 | if (start < 0) { 78 | start = 0; 79 | } 80 | 81 | if (start == 0) { 82 | end = 100; 83 | } 84 | 85 | if (end > content.length) { 86 | end = content.length; 87 | } 88 | 89 | var match_content = content.substring(start, end); 90 | 91 | // highlight all keywords 92 | keywords.forEach(function (keyword) { 93 | var regS = new RegExp(keyword, "gi"); 94 | match_content = match_content.replace(regS, "" + keyword + ""); 95 | }); 96 | 97 | str += "

    " + match_content + "...

    " 98 | } 99 | str += "
  • "; 100 | } 101 | }); 102 | str += "
"; 103 | 104 | // show special notes if no matched article 105 | if (matchCount <= 0) { 106 | $resultContent.innerHTML = ""; 107 | searchCount.removeAttribute('search-count-show'); 108 | searchEmpty.setAttribute('search-empty-show', true); 109 | return; 110 | } 111 | 112 | $resultContent.innerHTML = str; 113 | searchCount.setAttribute('search-count-show', true); 114 | searchCount.innerText = initSearchCount + matchCount; 115 | searchEmpty.removeAttribute('search-empty-show'); 116 | }); 117 | } 118 | } 119 | }); 120 | } 121 | 122 | function toggleSearchWindow(){ 123 | 'use strict'; 124 | var searchPanel = document.getElementById('search-panel'); 125 | if (searchPanel.getAttribute('search-show')) { 126 | searchPanel.removeAttribute('search-show') 127 | } else { 128 | searchPanel.setAttribute('search-show', true); 129 | } 130 | } -------------------------------------------------------------------------------- /source/js/theme/toc.js: -------------------------------------------------------------------------------- 1 | function decodeToc() { 2 | 'use strict'; 3 | if (document.getElementById('toc-body')) { 4 | document.getElementById('toc-body').addEventListener('click', function (event) { 5 | var targetElement = event.target.tagName; 6 | var parentElement = event.target.parentElement; 7 | var decodeId = ""; 8 | if (targetElement.tagName === 'A' && targetElement.getAttribute("class") === 'toc-content-link') { 9 | decodeId = decodeURIComponent(targetElement.getAttribute("href").replace("#", "")); 10 | document.getElementById(decodeId).scrollIntoView({ behavior: 'smooth' }); 11 | } else if (parentElement.tagName === 'A' && parentElement.getAttribute("class") === 'toc-content-link') { 12 | decodeId = decodeURIComponent(parentElement.getAttribute("href").replace("#", "")); 13 | document.getElementById(decodeId).scrollIntoView({ behavior: 'smooth' }); 14 | } 15 | }); 16 | } 17 | } -------------------------------------------------------------------------------- /source/js/theme/tool-bar.js: -------------------------------------------------------------------------------- 1 | window.onscroll = function () { 2 | 'use strict'; 3 | if (window.scrollY > 200 || document.body.scrollTop > 200 || document.documentElement.scrollTop > 200) { 4 | document.getElementById('back-to-top').style.display = 'block'; 5 | } else { 6 | document.getElementById('back-to-top').style.display = 'none'; 7 | } 8 | }; 9 | 10 | function scrollToTop() { 11 | 'use strict'; 12 | window.scrollTo(0, 0); 13 | document.body.scrollTop = 0; // Safari 14 | document.documentElement.scrollTop = 0; // Chrome, Firefox, IE, Opera 15 | } 16 | 17 | function tocToggle() { 18 | 'use strict'; 19 | var tocContainer = document.getElementById('post-toc'); 20 | if (tocContainer != null) { 21 | if (!tocContainer.getAttribute('toc-show')) { 22 | tocContainer.setAttribute('toc-show', true); 23 | // 24 | if (document.getElementById('hbePass')) { 25 | document.getElementById('toc-body').style.display = 'none'; 26 | } else { 27 | document.getElementById('toc-body').style.display = 'block'; 28 | } 29 | } else { 30 | tocContainer.removeAttribute('toc-show') 31 | } 32 | } 33 | } 34 | 35 | function gotoComment() { 36 | 'use strict'; 37 | var commentContainer = document.getElementById('comment'); 38 | if (commentContainer) { 39 | commentContainer.scrollIntoView({ behavior: 'smooth' }); 40 | } 41 | } 42 | 43 | function toolToggle() { 44 | 'use strict'; 45 | var moreToolsContainer = document.getElementById('tool-bar-more'); 46 | if (moreToolsContainer.style.display == 'none') { 47 | moreToolsContainer.style.display = 'block'; 48 | } else { 49 | moreToolsContainer.style.display = 'none'; 50 | } 51 | } 52 | 53 | function darkmodeSwitch() { 54 | 'use strict'; 55 | darkMode.toggleMode(); 56 | // change comment theme synchronously 同步修改评论区主题 57 | if (document.getElementById('comment')) { 58 | if (darkMode.getMode() == "dark") { 59 | sendGiscusMessage({ 60 | setConfig: { 61 | theme: 'noborder_dark', 62 | } 63 | }); 64 | } else { 65 | sendGiscusMessage({ 66 | setConfig: { 67 | theme: GLOBAL_CONFIG.comment.theme, 68 | } 69 | }); 70 | } 71 | } 72 | toolToggle(); 73 | } 74 | 75 | function sendGiscusMessage(message) { 76 | const iframe = document.getElementsByClassName('giscus-frame')[0]; 77 | if (!iframe) return; 78 | iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app'); 79 | } 80 | 81 | function fontSizeIncrease() { 82 | 'use strict'; 83 | var postContent = document.querySelector('.post-content'); 84 | if (postContent) { 85 | var sizeNum = 18; 86 | if (localStorage.getItem('font-size')) { 87 | sizeNum = parseInt(localStorage.getItem('font-size')) + 2; 88 | } else { 89 | var currentSize = window.getComputedStyle(postContent).getPropertyValue('font-size'); 90 | sizeNum = parseInt(currentSize) + 2; 91 | } 92 | postContent.style.fontSize = sizeNum + 'px'; 93 | localStorage.setItem('font-size', sizeNum); 94 | } 95 | } 96 | 97 | function fontSizeDecrease() { 98 | 'use strict'; 99 | var postContent = document.querySelector('.post-content'); 100 | if (postContent) { 101 | var sizeNum = 18; 102 | if (localStorage.getItem('font-size')) { 103 | sizeNum = parseInt(localStorage.getItem('font-size')) - 2; 104 | } else { 105 | var currentSize = window.getComputedStyle(postContent).getPropertyValue('font-size'); 106 | sizeNum = parseInt(currentSize) - 2; 107 | } 108 | postContent.style.fontSize = sizeNum + 'px'; 109 | localStorage.setItem('font-size', sizeNum); 110 | } 111 | } -------------------------------------------------------------------------------- /source/js/third-party/clipboard.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * clipboard.js v2.0.11 3 | * https://clipboardjs.com/ 4 | * 5 | * Licensed MIT © Zeno Rocha 6 | */ 7 | !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1 startAt) || (startAt > now && now < endAt) 151 | ? 'dark' 152 | : 'light' 153 | }, 154 | 155 | /** 156 | * Set Mode 157 | * @param {String} mode 158 | * @return {Void} 159 | */ 160 | /* setMode: function(enabledMode) { 161 | if (enabledMode !== 'light' && enabledMode !== 'dark') { 162 | console.error('setMode', 'Invalid value') 163 | return false 164 | } 165 | 166 | this.mode = enabledMode 167 | var disabledMode = oppositeMode(enabledMode) 168 | 169 | // If custom styles existed – process it 170 | if (this.options[enabledMode]) { 171 | var enabledStyles = document.getElementById('dm-' + enabledMode), 172 | disabledStyles = document.getElementById('dm-' + disabledMode) 173 | 174 | if (!enabledStyles) 175 | includeStyles('dm-' + enabledMode, this.options[enabledMode]) 176 | else if (!!enabledStyles) enabledStyles.removeAttribute('disabled') 177 | 178 | if (!!disabledStyles) disabledStyles.setAttribute('disabled', true) 179 | } 180 | 181 | // Process classes on body 182 | Body.classList.add('dm-' + enabledMode) 183 | Body.classList.remove('dm-' + disabledMode) 184 | 185 | return true 186 | }, */ 187 | 188 | /** 189 | * Set Mode (for meow by chanwj) 190 | * @param {String} mode 191 | * @param {Boolean} ifToggle optional 192 | * @return {Boolean} 193 | */ 194 | setMode: function(enabledMode, ifToggle) { 195 | if (enabledMode !== 'light' && enabledMode !== 'dark') { 196 | console.error('setMode', 'Invalid value') 197 | return false 198 | } 199 | 200 | this.mode = enabledMode 201 | 202 | // If custom styles existed – process it 203 | if (enabledMode == 'dark') { 204 | // if (ifToggle) 205 | // Body.style.setProperty('animation', 'swtich-to-darkmode 0.5s ease-out forwards') 206 | var darkStyles = document.getElementById('dm-dark') 207 | if (!darkStyles) 208 | includeStyles('dm-dark', this.options[enabledMode]) 209 | else if (!!darkStyles) darkStyles.removeAttribute('disabled') 210 | Body.classList.add('dm-dark') 211 | } else { 212 | // if (ifToggle) 213 | // Body.style.setProperty('animation', 'swtich-to-lightmode 0.5s ease-out forwards') 214 | var darkStyles = document.getElementById('dm-dark') 215 | if (!!darkStyles) darkStyles.setAttribute('disabled', true) 216 | Body.classList.remove('dm-dark') 217 | } 218 | 219 | return true 220 | }, 221 | 222 | /** 223 | * Check localStorage Value 224 | */ 225 | isModeSaved: function() { 226 | return Boolean(localStorage.getItem('dm-mode')) 227 | }, 228 | 229 | /** 230 | * Clear localStorage Value 231 | */ 232 | clearSavedMode: function() { 233 | localStorage.removeItem('dm-mode') 234 | this.mode = null 235 | this.setMode(this.getMode()) 236 | return true 237 | }, 238 | 239 | /** 240 | * Toggle Mode 241 | * @return {String} Enabled Mode 242 | */ 243 | toggleMode: function() { 244 | var newMode = oppositeMode(this.mode) 245 | this.setMode(newMode, true) 246 | if (this.options.saveOnToggle) localStorage.setItem('dm-mode', newMode) 247 | return newMode 248 | }, 249 | 250 | /** 251 | * Get Mode from System Scheme (css: prefers-color-scheme) 252 | * @return {String} System Scheme Mode 253 | */ 254 | getSystemScheme: function() { 255 | return window.matchMedia && 256 | window.matchMedia('(prefers-color-scheme: dark)').matches 257 | ? 'dark' 258 | : 'light' 259 | }, 260 | } 261 | 262 | return Plugin 263 | }) 264 | --------------------------------------------------------------------------------