├── .babelrc ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .postcssrc.js ├── LICENSE ├── README.md ├── api ├── articles │ ├── categories.json │ ├── elements.json │ ├── excerpts.json │ ├── gallery-post.json │ ├── hello-world.json │ ├── images.json │ ├── link-post-without-title.json │ ├── link-post.json │ ├── long-title.json │ ├── no-title.json │ ├── tag-plugins.json │ ├── tags.json │ ├── videos.json │ ├── 中文測試.json │ └── 日本語テスト.json ├── categories.json ├── categories │ ├── Bar.json │ ├── Baz.json │ └── Foo.json ├── page │ ├── index.json │ ├── links.json │ └── page404.json ├── pages.json ├── posts.json ├── site.json ├── tags.json ├── tags │ ├── Bar.json │ ├── Baz.json │ └── Foo.json └── theme.json ├── build ├── build.js ├── check-versions.js ├── dev-client.js ├── dev-server.js ├── utils.js ├── vue-loader.conf.js ├── webpack.base.conf.js ├── webpack.dev.conf.js └── webpack.prod.conf.js ├── config ├── dev.env.js ├── index.js └── prod.env.js ├── docs ├── 404_page.png ├── README.md ├── animated.md ├── customize_404.md ├── dev.md ├── down.png ├── english │ ├── README.md │ ├── animated.md │ ├── customize_404.md │ ├── migrate_comments.md │ ├── setting.md │ └── setup.md ├── faq.md ├── migrate_comments.md ├── moderate.png ├── setting.md ├── setup.md ├── tools.png ├── upload.png └── urlmapper.png ├── hexo ├── _config.yml.example ├── layout │ ├── index.ejs │ └── layout.ejs ├── scripts │ ├── helper.js │ ├── index.js │ └── lib │ │ ├── css_lsload.js │ │ ├── font_lsload.js │ │ ├── get_file_hex.js │ │ ├── highlight_code.js │ │ ├── js_hex.js │ │ ├── js_lsload.js │ │ ├── path_for.js │ │ └── restful.js └── source │ ├── css │ ├── animate.min.css │ ├── app.css │ ├── app.css.map │ ├── atom-one-light.css │ ├── comfortaa.css │ ├── ionicons.min.css │ ├── loaders.min.css │ ├── milligram.min.css │ ├── nprogress.css │ └── source-sans-pro.css │ ├── fonts │ ├── Comfortaa-Regular.ttf │ ├── SourceSansPro-Regular.ttf │ └── ionicons.ttf │ ├── img │ └── background.jpg │ ├── index.html │ └── js │ ├── app.js │ ├── app.js.map │ ├── manifest.js │ ├── manifest.js.map │ ├── vendor.js │ └── vendor.js.map ├── index.html ├── package.json ├── src ├── App.vue ├── api.js ├── assets │ ├── background.jpg │ ├── logo.png │ └── sass │ │ └── base.sass ├── components │ ├── ArticleItem.vue │ ├── Container.vue │ ├── Disqus.vue │ ├── LinkItem.vue │ ├── Livere.vue │ ├── Loading.vue │ ├── Nav.vue │ ├── PostItem.vue │ └── TagCluster.vue ├── helper │ └── index.js ├── main.js ├── router │ └── index.js ├── store │ └── index.js └── views │ ├── NotFound.vue │ ├── Page.vue │ ├── Post.vue │ ├── Posts.vue │ ├── Splash.vue │ └── Tags.vue ├── static ├── .gitkeep ├── css │ ├── animate.min.css │ ├── atom-one-light.css │ ├── comfortaa.css │ ├── ionicons.min.css │ ├── loaders.min.css │ ├── milligram.min.css │ ├── nprogress.css │ └── source-sans-pro.css └── fonts │ ├── Comfortaa-Regular.ttf │ ├── SourceSansPro-Regular.ttf │ └── ionicons.ttf └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false, 5 | "targets": { 6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 7 | } 8 | }], 9 | "stage-2" 10 | ], 11 | "plugins": ["transform-runtime", "transform-object-rest-spread"], 12 | "comments": false, 13 | "env": { 14 | "test": { 15 | "presets": ["env", "stage-2"], 16 | "plugins": ["istanbul"] 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | build/*.js 2 | config/*.js 3 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | // http://eslint.org/docs/user-guide/configuring 2 | 3 | module.exports = { 4 | root: true, 5 | parser: 'babel-eslint', 6 | parserOptions: { 7 | sourceType: 'module' 8 | }, 9 | env: { 10 | browser: true, 11 | }, 12 | // https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style 13 | extends: 'standard', 14 | // required to lint *.vue files 15 | plugins: [ 16 | 'html' 17 | ], 18 | // add your custom rules here 19 | 'rules': { 20 | // allow paren-less arrow functions 21 | 'arrow-parens': 0, 22 | // allow async-await 23 | 'generator-star-spacing': 0, 24 | // allow debugger during development 25 | 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | npm-debug.log* 4 | yarn-debug.log* 5 | yarn-error.log* 6 | dist/ 7 | 8 | # Editor directories and files 9 | .idea 10 | *.suo 11 | *.ntvs* 12 | *.njsproj 13 | *.sln 14 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | // to edit target browsers: use "browserslist" field in package.json 6 | "autoprefixer": {} 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # hexo-theme-only 2 | 3 | > Just a theme for hexo 4 | 5 | 使用 Vue 所创作的单页应用式的 hexo 主题,部分点子和代码思路参考自 [hexo-theme-one](https://github.com/EYHN/hexo-theme-one) 6 | 7 | [Preview](https://lazzzis.github.io) 8 | 9 | [文档](./docs/README.md) 10 | 11 | 如果有疑问或建议,请尽管发起 ISSUE 12 | 13 | **提醒:** 这个主题目标是构建一个单页应用的博客,但是很不幸地带来了另一个问题:需要额外的时间去做 SEO。否则,你的博客文章很难通过搜索引擎被搜索到。 14 | 15 | --- 16 | 17 | A theme powered by Vue, partly inspired by [hexo-theme-one](https://github.com/EYHN/hexo-theme-one). 18 | 19 | [Preview](https://lazzzis.github.io) 20 | 21 | [Documents](./docs/english/README.md) 22 | 23 | If you have any question or advice, feel free to open an ISSUE 24 | 25 | **Caveat:** This theme aims at build a blog of Single Page Application, but unfortunately, this brings another trouble: you do some researching on SEO. Otherwise, people may find hard to find your articles through search engines (like google). 26 | -------------------------------------------------------------------------------- /api/articles/categories.json: -------------------------------------------------------------------------------- 1 | {"title":"Categories","slug":"categories","date":"2013-12-25T04:30:09.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"excerpt":"","content":"

This post contains 3 categories. Make sure your theme can display all of the categories.

\n","categories":[{"name":"Foo","path":"api/categories/Foo.json"},{"name":"Bar","path":"api/categories/Bar.json"},{"name":"Baz","path":"api/categories/Baz.json"}],"tags":[]} -------------------------------------------------------------------------------- /api/articles/elements.json: -------------------------------------------------------------------------------- 1 | {"title":"Elements","slug":"elements","date":"2013-12-25T04:29:08.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"excerpt":"","content":"

The purpose of this post is to help you make sure all of HTML elements can display properly. If you use CSS reset, don’t forget to redefine the style by yourself.

\n
\n

Heading 1

Heading 2

Heading 3

Heading 4

Heading 5
Heading 6

\n

Paragraph

Lorem ipsum dolor sit amet, test link consectetur adipiscing elit. Strong text pellentesque ligula commodo viverra vehicula. Italic text at ullamcorper enim. Morbi a euismod nibh. Underline text non elit nisl. Deleted text tristique, sem id condimentum tempus, metus lectus venenatis mauris, sit amet semper lorem felis a eros. Fusce egestas nibh at sagittis auctor. Sed ultricies ac arcu quis molestie. Donec dapibus nunc in nibh egestas, vitae volutpat sem iaculis. Curabitur sem tellus, elementum nec quam id, fermentum laoreet mi. Ut mollis ullamcorper turpis, vitae facilisis velit ultricies sit amet. Etiam laoreet dui odio, id tempus justo tincidunt id. Phasellus scelerisque nunc sed nunc ultricies accumsan.

\n

Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed erat diam, blandit eget felis aliquam, rhoncus varius urna. Donec tellus sapien, sodales eget ante vitae, feugiat ullamcorper urna. Praesent auctor dui vitae dapibus eleifend. Proin viverra mollis neque, ut ullamcorper elit posuere eget.

\n
\n

Praesent diam elit, interdum ut pulvinar placerat, imperdiet at magna.

\n
\n

Maecenas ornare arcu at mi suscipit, non molestie tortor ultrices. Aenean convallis, diam et congue ultricies, erat magna tincidunt orci, pulvinar posuere mi sapien ac magna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Praesent vitae placerat mauris. Nullam laoreet ante posuere tortor blandit auctor. Sed id ligula volutpat leo consequat placerat. Mauris fermentum dolor sed augue malesuada sollicitudin. Vivamus ultrices nunc felis, quis viverra orci eleifend ut. Donec et quam id urna cursus posuere. Donec elementum scelerisque laoreet.

\n

List Types

Definition List (dl)

Definition List Title
This is a definition list division.
\n\n

Ordered List (ol)

    \n
  1. List Item 1
  2. \n
  3. List Item 2
  4. \n
  5. List Item 3
  6. \n
\n

Unordered List (ul)

\n

Table

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Table Header 1Table Header 2Table Header 3
Division 1Division 2Division 3
Division 1Division 2Division 3
Division 1Division 2Division 3
\n

Misc Stuff - abbr, acronym, sub, sup, etc.

Lorem superscript dolor subscript amet, consectetuer adipiscing elit. Nullam dignissim convallis est. Quisque aliquam. cite. Nunc iaculis suscipit dui. Nam sit amet sem. Aliquam libero nisi, imperdiet at, tincidunt nec, gravida vehicula, nisl. Praesent mattis, massa quis luctus fermentum, turpis mi volutpat justo, eu volutpat enim diam eget metus. Maecenas ornare tortor. Donec sed tellus eget sapien fringilla nonummy. NBA Mauris a ante. Suspendisse quam sem, consequat at, commodo vitae, feugiat in, nunc. Morbi imperdiet augue quis tellus. AVE

\n","categories":[],"tags":[]} -------------------------------------------------------------------------------- /api/articles/excerpts.json: -------------------------------------------------------------------------------- 1 | {"title":"Excerpts","slug":"excerpts","date":"2013-12-25T05:23:23.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"excerpt":"

The following contents should be invisible in home/archive page.

","content":"

The following contents should be invisible in home/archive page.

\n\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce eget urna vitae velit eleifend interdum at ac nisi. In nec ligula lacus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed eu cursus erat, ut dapibus quam. Aliquam eleifend dolor vitae libero pharetra adipiscing. Etiam adipiscing dolor a quam tempor, eu convallis nulla varius. Aliquam sollicitudin risus a porta aliquam. Ut nec velit dolor. Proin eget leo lobortis, aliquam est sed, mollis mauris. Fusce vitae leo pretium massa accumsan condimentum. Fusce malesuada gravida lectus vel vulputate. Donec bibendum porta nibh ut aliquam.

\n

Sed lorem felis, congue non fringilla eu, aliquam eu eros. Curabitur orci libero, mollis sed semper vitae, adipiscing in lectus. Aenean non egestas odio. Donec sollicitudin nisi quis lorem gravida, in pharetra mauris fringilla. Duis sit amet faucibus dolor, id aliquam neque. In egestas, odio gravida tempor dictum, mauris felis faucibus purus, sit amet commodo lacus diam vitae est. Ut ut quam eget massa semper sodales. Aenean non ipsum cursus, blandit lectus in, ornare odio. Curabitur ultrices porttitor vulputate.

\n","categories":[],"tags":[]} -------------------------------------------------------------------------------- /api/articles/gallery-post.json: -------------------------------------------------------------------------------- 1 | {"title":"Gallery Post","slug":"gallery-post","date":"2013-12-25T05:16:18.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"excerpt":"","content":"

This post contains 4 photos:

\n\n

All photos should be displayed properly.

\n

From Wallbase.cc

\n","categories":[],"tags":[]} -------------------------------------------------------------------------------- /api/articles/hello-world.json: -------------------------------------------------------------------------------- 1 | {"title":"Hello World","slug":"hello-world","date":"2013-12-24T22:49:32.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"excerpt":"","content":"

Welcome to Hexo! This is your very first post. Check documentation to learn how to use.

\n","categories":[],"tags":[]} -------------------------------------------------------------------------------- /api/articles/images.json: -------------------------------------------------------------------------------- 1 | {"title":"Images","slug":"images","date":"2013-12-27T03:46:49.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"excerpt":"","content":"

This is a image test post.

\n

\"\"

\n

\"Caption\"

\n

\"\"

\n

\"Small

\n","categories":[],"tags":[]} -------------------------------------------------------------------------------- /api/articles/link-post-without-title.json: -------------------------------------------------------------------------------- 1 | {"title":"www.google.com","slug":"link-post-without-title","date":"2013-12-25T04:44:13.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"excerpt":"","content":"

This is a link post without a title. The title should be the link with or without protocol. Clicking on the link should open Google in a new tab or window.

\n","categories":[],"tags":[]} -------------------------------------------------------------------------------- /api/articles/link-post.json: -------------------------------------------------------------------------------- 1 | {"title":"Link Post","slug":"link-post","date":"2013-12-25T04:30:04.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"excerpt":"","content":"

This is a link post. Clicking on the link should open Google in a new tab or window.

\n","categories":[],"tags":[]} -------------------------------------------------------------------------------- /api/articles/long-title.json: -------------------------------------------------------------------------------- 1 | {"title":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam justo turpis, tincidunt ac convallis id.","slug":"long-title","date":"2013-12-25T04:31:06.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"excerpt":"","content":"

This post has a long title. Make sure the title displayed right.

\n","categories":[],"tags":[]} -------------------------------------------------------------------------------- /api/articles/no-title.json: -------------------------------------------------------------------------------- 1 | {"title":"","slug":"no-title","date":"2013-12-26T03:57:49.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"excerpt":"","content":"

This post doesn’t have a title. Make sure it’s accessible.

\n","categories":[],"tags":[]} -------------------------------------------------------------------------------- /api/articles/tag-plugins.json: -------------------------------------------------------------------------------- 1 | {"title":"Tag Plugins","slug":"tag-plugins","date":"2013-12-25T05:14:39.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"excerpt":"","content":"

This post is used for testing tag plugins. See docs for more info.

\n

Block Quote

Normal blockquote

\n

Praesent diam elit, interdum ut pulvinar placerat, imperdiet at magna.

\n
\n

Quote from a book

Do not just seek happiness for yourself. Seek happiness for all. Through kindness. Through mercy.

\n
\n

Quote from Twitter

NEW: DevDocs now comes with syntax highlighting. http://devdocs.io

\n
\n

Quote from an article on the web

Every interaction is both precious and an opportunity to delight.

\n
\n

Code Block

Normal code block

1
alert('Hello World!');
\n

With caption

Array.map
1
array.map(callback[, thisArg])
\n

With caption and URL

.compactUnderscore.js
1
2
.compact([0, 1, false, 2, ‘’, 3]);
=> [1, 2, 3]
\n

With marked lines

Line 1,7-8,10 should be marked with different color.

\n
1
2
3
4
5
6
7
8
9
10
11
const http = require('http');

const hostname = '127.0.0.1';
const port = 1337;

http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\\n');
}).listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
\n

Note: Theme’s style should support .highlight.line.marked (recommend to use the selection or current line color).

\n

Gist

\n

jsFiddle

\n

Pullquote

Left

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

\n
\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas tempus molestie arcu, et fringilla mauris placerat ac. Nullam luctus bibendum risus. Ut cursus sed ipsum feugiat egestas. Suspendisse elementum, velit eu consequat consequat, augue lorem dapibus libero, eget pulvinar dolor est sit amet nulla. Suspendisse a porta tortor, et posuere mi. Pellentesque ultricies, mi quis volutpat malesuada, erat felis vulputate nisl, ac congue ante tortor ut ante. Proin aliquam sem vel mauris tincidunt, eget scelerisque tortor euismod. Nulla tincidunt enim nec commodo dictum. Mauris id sapien et orci gravida luctus id ut dui. In vel vulputate odio. Duis vel turpis molestie, scelerisque enim eu, lobortis eros. Cras at ipsum gravida, sagittis ante vel, viverra tellus. Nunc mauris turpis, elementum ullamcorper nisl pretium, ultrices cursus justo. Mauris porttitor commodo eros, ac ornare orci interdum in. Cras fermentum cursus leo sed mattis. In dignissim lorem sem, sit amet elementum mauris venenatis ac.

\n

Right

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

\n
\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ligula justo, lobortis sit amet semper vel, dignissim sit amet libero. Praesent ac tempus ligula. Maecenas at gravida odio. Etiam tristique volutpat lacus eu faucibus. Donec non tempus arcu. Phasellus adipiscing, mauris nec mollis egestas, ipsum nunc auctor velit, et rhoncus lorem ipsum at ante. Praesent et sem in velit volutpat auctor. Duis vel mauris nulla. Maecenas mattis interdum ante, quis sagittis nibh cursus et. Nulla facilisi. Morbi convallis gravida tortor, ut fermentum enim gravida et. Nunc vel dictum nisl, non ultrices libero. Proin vestibulum felis eget orci consectetur lobortis. Vestibulum augue nulla, iaculis vitae augue vehicula, dignissim ultrices libero. Sed imperdiet urna et quam ultrices tincidunt nec ac magna. Etiam vel pharetra elit.

\n","categories":[],"tags":[]} -------------------------------------------------------------------------------- /api/articles/tags.json: -------------------------------------------------------------------------------- 1 | {"title":"Tags","slug":"tags","date":"2013-12-25T04:29:53.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"excerpt":"","content":"

This post contains 3 tags. Make sure your theme can display all of the tags.

\n","categories":[],"tags":[{"name":"Foo","path":"api/tags/Foo.json"},{"name":"Bar","path":"api/tags/Bar.json"},{"name":"Baz","path":"api/tags/Baz.json"}]} -------------------------------------------------------------------------------- /api/articles/videos.json: -------------------------------------------------------------------------------- 1 | {"title":"Videos","slug":"videos","date":"2013-12-25T05:19:15.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"excerpt":"","content":"

This is a video test post.

\n

Youtube

\n
\n

Vimeo

\n
","categories":[],"tags":[]} -------------------------------------------------------------------------------- /api/articles/中文測試.json: -------------------------------------------------------------------------------- 1 | {"title":"中文測試","slug":"中文測試","date":"2013-12-25T04:31:30.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"excerpt":"","content":"

This is a Chinese test post.

\n

善我王上魚、產生資西員合兒臉趣論。畫衣生這著爸毛親可時,安程幾?合學作。觀經而作建。都非子作這!法如言子你關!手師也。

\n

以也座論頭室業放。要車時地變此親不老高小是統習直麼調未,行年香一?

\n

就竟在,是我童示讓利分和異種百路關母信過明驗有個歷洋中前合著區亮風值新底車有正結,進快保的行戰從:弟除文辦條國備當來際年每小腳識世可的的外的廣下歌洲保輪市果底天影;全氣具些回童但倒影發狀在示,數上學大法很,如要我……月品大供這起服滿老?應學傳者國:山式排只不之然清同關;細車是!停屋常間又,資畫領生,相們制在?公別的人寫教資夠。資再我我!只臉夫藝量不路政吃息緊回力之;兒足灣電空時局我怎初安。意今一子區首者微陸現際安除發連由子由而走學體區園我車當會,經時取頭,嚴了新科同?很夫營動通打,出和導一樂,查旅他。坐是收外子發物北看蘭戰坐車身做可來。道就學務。

\n

國新故。

\n
\n

工步他始能詩的,裝進分星海演意學值例道……於財型目古香亮自和這乎?化經溫詩。只賽嚴大一主價世哥受的沒有中年即病行金拉麼河。主小路了種就小為廣不?

\n
\n

From 亂數假文產生器 - Chinese Lorem Ipsum

\n","categories":[],"tags":[]} -------------------------------------------------------------------------------- /api/articles/日本語テスト.json: -------------------------------------------------------------------------------- 1 | {"title":"日本語テスト","slug":"日本語テスト","date":"2013-12-25T04:33:26.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"excerpt":"","content":"

This is a Japanese test post.

\n

私は昨日ついにその助力家というのの上よりするたなけれ。

\n

最も今をお話団はちょうどこの前後なかろでくらいに困りがいるたをは帰着考えたなかって、そうにもするでうたらない。

\n

がたを知っないはずも同時に九月をいよいよたありた。

\n

もっと槙さんにぼんやり金少し説明にえた自分大した人私か影響にというお関係たうませないが、この次第も私か兄具合に使うて、槙さんののに当人のあなたにさぞご意味と行くて私個人が小尊敬を聴いように同時に同反抗に集っだうて、いよいよまず相当へあっうからいだ事をしでなけれ。

\n
\n

それでそれでもご時日をしはずはたったいやと突き抜けるますて、その元がは行ったてという獄を尽すていけですた。

\n
\n

この中道具の日その学校はあなたごろがすまなりかとネルソンさんの考えるですん、辺の事実ないというご盲従ありたですと、爺さんのためが薬缶が結果までの箸の当時してならて、多少の十月にためからそういう上からとにかくしましないと触れべきものたで、ないうですと多少お人達したのでたた。

\n

From すぐ使えるダミーテキスト - 日本語 Lorem ipsum

\n","categories":[],"tags":[]} -------------------------------------------------------------------------------- /api/categories.json: -------------------------------------------------------------------------------- 1 | [{"name":"Foo","path":"api/categories/Foo.json"},{"name":"Bar","path":"api/categories/Bar.json"},{"name":"Baz","path":"api/categories/Baz.json"}] -------------------------------------------------------------------------------- /api/categories/Bar.json: -------------------------------------------------------------------------------- 1 | {"name":"Bar","postlist":[{"title":"Categories","slug":"categories","date":"2013-12-25T04:30:09.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/categories.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[{"name":"Foo","path":"api/categories/Foo.json"},{"name":"Bar","path":"api/categories/Bar.json"},{"name":"Baz","path":"api/categories/Baz.json"}],"tags":[]}]} -------------------------------------------------------------------------------- /api/categories/Baz.json: -------------------------------------------------------------------------------- 1 | {"name":"Baz","postlist":[{"title":"Categories","slug":"categories","date":"2013-12-25T04:30:09.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/categories.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[{"name":"Foo","path":"api/categories/Foo.json"},{"name":"Bar","path":"api/categories/Bar.json"},{"name":"Baz","path":"api/categories/Baz.json"}],"tags":[]}]} -------------------------------------------------------------------------------- /api/categories/Foo.json: -------------------------------------------------------------------------------- 1 | {"name":"Foo","postlist":[{"title":"Categories","slug":"categories","date":"2013-12-25T04:30:09.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/categories.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[{"name":"Foo","path":"api/categories/Foo.json"},{"name":"Bar","path":"api/categories/Bar.json"},{"name":"Baz","path":"api/categories/Baz.json"}],"tags":[]}]} -------------------------------------------------------------------------------- /api/page/index.json: -------------------------------------------------------------------------------- 1 | {"page":{"layout":"index","_content":"","source":"404.md","raw":"layout: index\n---\n","date":"2018-04-03T23:56:09.000Z","updated":"2018-04-03T23:56:09.000Z","path":"404.html","title":"","comments":true,"_id":"cjfla9leb0000oe2fq9z6szd4","content":"","site":{"data":{}},"excerpt":"","more":"","permalink":"http://yoursite.com/404.html","full_source":"/Users/lazzzis/Documents/Projects/Moe/ForTest/source/404.md","__page":true},"title":"","date":"2018-04-03T23:56:09.000Z","updated":"2018-04-03T23:56:09.000Z","comments":true,"path":"api/page/index.json","content":""} -------------------------------------------------------------------------------- /api/page/links.json: -------------------------------------------------------------------------------- 1 | {"page":{"title":"Page","date":"2013-12-27T03:52:56.000Z","layout":"links","_content":"\nLinks layout\n","source":"page/links.md","raw":"title: Page\ndate: 2013-12-26 22:52:56\nlayout: links\n---\n\nLinks layout\n","updated":"2018-04-03T23:20:35.000Z","path":"page/links.html","comments":true,"_id":"cjfla9les0002oe2f0db7zo58","content":"

Links layout

\n","site":{"data":{}},"excerpt":"","more":"

Links layout

\n","permalink":"http://yoursite.com/page/links.html","full_source":"/Users/lazzzis/Documents/Projects/Moe/ForTest/source/page/links.md","__page":true},"title":"Page","date":"2013-12-27T03:52:56.000Z","updated":"2018-04-03T23:20:35.000Z","comments":true,"path":"api/page/links.json","content":"

Links layout

\n"} -------------------------------------------------------------------------------- /api/page/page404.json: -------------------------------------------------------------------------------- 1 | {"page":{"title":"Page","date":"2013-12-27T03:52:56.000Z","layout":"page404","_content":"\nThis is a page test.\n","source":"page/page404.md","raw":"title: Page\ndate: 2013-12-26 22:52:56\nlayout: page404\n---\n\nThis is a page test.\n","updated":"2018-04-03T21:31:51.000Z","path":"page/page404.html","comments":true,"_id":"cjfla9lfn000toe2fmla1dz6a","content":"

This is a page test.

\n","site":{"data":{}},"excerpt":"","more":"

This is a page test.

\n","permalink":"http://yoursite.com/page/page404.html","full_source":"/Users/lazzzis/Documents/Projects/Moe/ForTest/source/page/page404.md","__page":true},"title":"Page","date":"2013-12-27T03:52:56.000Z","updated":"2018-04-03T21:31:51.000Z","comments":true,"path":"api/page/page404.json","content":"

This is a page test.

\n"} -------------------------------------------------------------------------------- /api/pages.json: -------------------------------------------------------------------------------- 1 | [{"title":"Links","type":"page","layout":"links","link":"/links"}] -------------------------------------------------------------------------------- /api/posts.json: -------------------------------------------------------------------------------- 1 | [{"title":"Images","slug":"images","date":"2013-12-27T03:46:49.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/images.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[],"tags":[]},{"title":"","slug":"no-title","date":"2013-12-26T03:57:49.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/no-title.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[],"tags":[]},{"title":"Excerpts","slug":"excerpts","date":"2013-12-25T05:23:23.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/excerpts.json","excerpt":"

The following contents should be invisible in home/archive page.

","keywords":null,"content":null,"raw":null,"categories":[],"tags":[]},{"title":"Videos","slug":"videos","date":"2013-12-25T05:19:15.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/videos.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[],"tags":[]},{"title":"Gallery Post","slug":"gallery-post","date":"2013-12-25T05:16:18.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/gallery-post.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[],"tags":[]},{"title":"Tag Plugins","slug":"tag-plugins","date":"2013-12-25T05:14:39.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/tag-plugins.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[],"tags":[]},{"title":"www.google.com","slug":"link-post-without-title","date":"2013-12-25T04:44:13.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/link-post-without-title.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[],"tags":[]},{"title":"日本語テスト","slug":"日本語テスト","date":"2013-12-25T04:33:26.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/日本語テスト.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[],"tags":[]},{"title":"中文測試","slug":"中文測試","date":"2013-12-25T04:31:30.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/中文測試.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[],"tags":[]},{"title":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam justo turpis, tincidunt ac convallis id.","slug":"long-title","date":"2013-12-25T04:31:06.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/long-title.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[],"tags":[]},{"title":"Categories","slug":"categories","date":"2013-12-25T04:30:09.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/categories.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[{"name":"Foo","path":"api/categories/Foo.json"},{"name":"Bar","path":"api/categories/Bar.json"},{"name":"Baz","path":"api/categories/Baz.json"}],"tags":[]},{"title":"Link Post","slug":"link-post","date":"2013-12-25T04:30:04.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/link-post.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[],"tags":[]},{"title":"Tags","slug":"tags","date":"2013-12-25T04:29:53.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/tags.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[],"tags":[{"name":"Foo","path":"api/tags/Foo.json"},{"name":"Bar","path":"api/tags/Bar.json"},{"name":"Baz","path":"api/tags/Baz.json"}]},{"title":"Elements","slug":"elements","date":"2013-12-25T04:29:08.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/elements.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[],"tags":[]},{"title":"Hello World","slug":"hello-world","date":"2013-12-24T22:49:32.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/hello-world.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[],"tags":[]}] -------------------------------------------------------------------------------- /api/site.json: -------------------------------------------------------------------------------- 1 | {"title":"Hexo","subtitle":null,"description":null,"author":"John Doe","language":null,"timezone":null,"url":"http://yoursite.com","root":"/","permalink":":year/:month/:day/:title/","permalink_defaults":null,"source_dir":"source","public_dir":"public","tag_dir":"tags","archive_dir":"archives","category_dir":"categories","code_dir":"downloads/code","i18n_dir":":lang","skip_render":null,"new_post_name":":title.md","default_layout":"post","titlecase":false,"external_link":true,"filename_case":0,"render_drafts":false,"post_asset_folder":false,"relative_link":false,"future":true,"highlight":{"enable":true,"auto_detect":false,"line_number":true,"tab_replace":null},"default_category":"uncategorized","category_map":null,"tag_map":null,"date_format":"YYYY-MM-DD","time_format":"HH:mm:ss","per_page":10,"pagination_dir":"page","theme":"only","deploy":{"type":null},"ignore":[],"keywords":null,"index_generator":{"per_page":10,"order_by":"-date","path":""},"tag_generator":{"per_page":10},"archive_generator":{"per_page":10,"yearly":true,"monthly":true,"daily":false},"category_generator":{"per_page":10},"server":{"port":4000,"log":false,"ip":"0.0.0.0","compress":false,"header":true},"marked":{"gfm":true,"pedantic":false,"sanitize":false,"tables":true,"breaks":true,"smartLists":true,"smartypants":true,"modifyAnchors":"","autolink":true}} -------------------------------------------------------------------------------- /api/tags.json: -------------------------------------------------------------------------------- 1 | [{"name":"Foo","path":"api/tags/Foo.json"},{"name":"Bar","path":"api/tags/Bar.json"},{"name":"Baz","path":"api/tags/Baz.json"}] -------------------------------------------------------------------------------- /api/tags/Bar.json: -------------------------------------------------------------------------------- 1 | {"name":"Bar","postlist":[{"title":"Tags","slug":"tags","date":"2013-12-25T04:29:53.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/tags.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[],"tags":[{"name":"Foo","path":"api/tags/Foo.json"},{"name":"Bar","path":"api/tags/Bar.json"},{"name":"Baz","path":"api/tags/Baz.json"}]}]} -------------------------------------------------------------------------------- /api/tags/Baz.json: -------------------------------------------------------------------------------- 1 | {"name":"Baz","postlist":[{"title":"Tags","slug":"tags","date":"2013-12-25T04:29:53.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/tags.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[],"tags":[{"name":"Foo","path":"api/tags/Foo.json"},{"name":"Bar","path":"api/tags/Bar.json"},{"name":"Baz","path":"api/tags/Baz.json"}]}]} -------------------------------------------------------------------------------- /api/tags/Foo.json: -------------------------------------------------------------------------------- 1 | {"name":"Foo","postlist":[{"title":"Tags","slug":"tags","date":"2013-12-25T04:29:53.000Z","updated":"2018-04-03T21:26:31.000Z","comments":true,"path":"api/articles/tags.json","excerpt":"","keywords":null,"content":null,"raw":null,"categories":[],"tags":[{"name":"Foo","path":"api/tags/Foo.json"},{"name":"Bar","path":"api/tags/Bar.json"},{"name":"Baz","path":"api/tags/Baz.json"}]}]} -------------------------------------------------------------------------------- /api/theme.json: -------------------------------------------------------------------------------- 1 | {"Splash":[{"title":"Blogs","type":"sitelink","link":"/posts"},{"title":"Twitter","type":"permalink","link":"https://twitter.com","_blank":true},{"title":"Github","type":"permalink","link":"https://github.com","_blank":true},{"title":"Rss","type":"permalink","link":"/atom.xml","_blank":true}],"Drawer":[{"title":"Blog","type":"sitelink","link":"/posts"},{"title":"Tags","type":"sitelink","link":"/tags"},{"title":"Links","type":"page","layout":"links","link":"/links"}],"animated":{"posts":"slideInLeft","post":"slideInLeft","page":"slideInLeft","tags":"bounceInUp"},"page404":true} -------------------------------------------------------------------------------- /build/build.js: -------------------------------------------------------------------------------- 1 | require('./check-versions')() 2 | 3 | process.env.NODE_ENV = 'production' 4 | 5 | var ora = require('ora') 6 | var rm = require('rimraf') 7 | var path = require('path') 8 | var chalk = require('chalk') 9 | var webpack = require('webpack') 10 | var config = require('../config') 11 | var webpackConfig = require('./webpack.prod.conf') 12 | 13 | var spinner = ora('building for production...') 14 | spinner.start() 15 | 16 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { 17 | if (err) throw err 18 | webpack(webpackConfig, function (err, stats) { 19 | spinner.stop() 20 | if (err) throw err 21 | process.stdout.write(stats.toString({ 22 | colors: true, 23 | modules: false, 24 | children: false, 25 | chunks: false, 26 | chunkModules: false 27 | }) + '\n\n') 28 | 29 | console.log(chalk.cyan(' Build complete.\n')) 30 | console.log(chalk.yellow( 31 | ' Tip: built files are meant to be served over an HTTP server.\n' + 32 | ' Opening index.html over file:// won\'t work.\n' 33 | )) 34 | }) 35 | }) 36 | -------------------------------------------------------------------------------- /build/check-versions.js: -------------------------------------------------------------------------------- 1 | var chalk = require('chalk') 2 | var semver = require('semver') 3 | var packageConfig = require('../package.json') 4 | var shell = require('shelljs') 5 | function exec (cmd) { 6 | return require('child_process').execSync(cmd).toString().trim() 7 | } 8 | 9 | var versionRequirements = [ 10 | { 11 | name: 'node', 12 | currentVersion: semver.clean(process.version), 13 | versionRequirement: packageConfig.engines.node 14 | }, 15 | ] 16 | 17 | if (shell.which('npm')) { 18 | versionRequirements.push({ 19 | name: 'npm', 20 | currentVersion: exec('npm --version'), 21 | versionRequirement: packageConfig.engines.npm 22 | }) 23 | } 24 | 25 | module.exports = function () { 26 | var warnings = [] 27 | for (var i = 0; i < versionRequirements.length; i++) { 28 | var mod = versionRequirements[i] 29 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { 30 | warnings.push(mod.name + ': ' + 31 | chalk.red(mod.currentVersion) + ' should be ' + 32 | chalk.green(mod.versionRequirement) 33 | ) 34 | } 35 | } 36 | 37 | if (warnings.length) { 38 | console.log('') 39 | console.log(chalk.yellow('To use this template, you must update following to modules:')) 40 | console.log() 41 | for (var i = 0; i < warnings.length; i++) { 42 | var warning = warnings[i] 43 | console.log(' ' + warning) 44 | } 45 | console.log() 46 | process.exit(1) 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /build/dev-client.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | require('eventsource-polyfill') 3 | var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true') 4 | 5 | hotClient.subscribe(function (event) { 6 | if (event.action === 'reload') { 7 | window.location.reload() 8 | } 9 | }) 10 | -------------------------------------------------------------------------------- /build/dev-server.js: -------------------------------------------------------------------------------- 1 | require('./check-versions')() 2 | 3 | var config = require('../config') 4 | if (!process.env.NODE_ENV) { 5 | process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV) 6 | } 7 | 8 | var opn = require('opn') 9 | var path = require('path') 10 | var express = require('express') 11 | var webpack = require('webpack') 12 | var proxyMiddleware = require('http-proxy-middleware') 13 | var webpackConfig = require('./webpack.dev.conf') 14 | 15 | // default port where dev server listens for incoming traffic 16 | var port = process.env.PORT || config.dev.port 17 | // automatically open browser, if not set will be false 18 | var autoOpenBrowser = !!config.dev.autoOpenBrowser 19 | // Define HTTP proxies to your custom API backend 20 | // https://github.com/chimurai/http-proxy-middleware 21 | var proxyTable = config.dev.proxyTable 22 | 23 | var app = express() 24 | var compiler = webpack(webpackConfig) 25 | 26 | var devMiddleware = require('webpack-dev-middleware')(compiler, { 27 | publicPath: webpackConfig.output.publicPath, 28 | quiet: true 29 | }) 30 | 31 | var hotMiddleware = require('webpack-hot-middleware')(compiler, { 32 | log: () => {}, 33 | heartbeat: 2000 34 | }) 35 | // force page reload when html-webpack-plugin template changes 36 | compiler.plugin('compilation', function (compilation) { 37 | compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) { 38 | hotMiddleware.publish({ action: 'reload' }) 39 | cb() 40 | }) 41 | }) 42 | 43 | // proxy api requests 44 | Object.keys(proxyTable).forEach(function (context) { 45 | var options = proxyTable[context] 46 | if (typeof options === 'string') { 47 | options = { target: options } 48 | } 49 | app.use(proxyMiddleware(options.filter || context, options)) 50 | }) 51 | 52 | // handle fallback for HTML5 history API 53 | app.use(require('connect-history-api-fallback')()) 54 | 55 | // serve webpack bundle output 56 | app.use(devMiddleware) 57 | 58 | // enable hot-reload and state-preserving 59 | // compilation error display 60 | app.use(hotMiddleware) 61 | 62 | // serve pure static assets 63 | var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory) 64 | app.use(staticPath, express.static('./static')) 65 | 66 | var uri = 'http://localhost:' + port 67 | 68 | var _resolve 69 | var readyPromise = new Promise(resolve => { 70 | _resolve = resolve 71 | }) 72 | 73 | console.log('> Starting dev server...') 74 | devMiddleware.waitUntilValid(() => { 75 | console.log('> Listening at ' + uri + '\n') 76 | // when env is testing, don't need open it 77 | if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') { 78 | opn(uri) 79 | } 80 | _resolve() 81 | }) 82 | 83 | var server = app.listen(port) 84 | 85 | module.exports = { 86 | ready: readyPromise, 87 | close: () => { 88 | server.close() 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /build/utils.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var config = require('../config') 3 | var ExtractTextPlugin = require('extract-text-webpack-plugin') 4 | 5 | exports.assetsPath = function (_path) { 6 | var assetsSubDirectory = process.env.NODE_ENV === 'production' 7 | ? config.build.assetsSubDirectory 8 | : config.dev.assetsSubDirectory 9 | return path.posix.join(assetsSubDirectory, _path) 10 | } 11 | 12 | exports.cssLoaders = function (options) { 13 | options = options || {} 14 | 15 | var cssLoader = { 16 | loader: 'css-loader', 17 | options: { 18 | minimize: process.env.NODE_ENV === 'production', 19 | sourceMap: options.sourceMap 20 | } 21 | } 22 | 23 | // generate loader string to be used with extract text plugin 24 | function generateLoaders (loader, loaderOptions) { 25 | var loaders = [cssLoader] 26 | if (loader) { 27 | loaders.push({ 28 | loader: loader + '-loader', 29 | options: Object.assign({}, loaderOptions, { 30 | sourceMap: options.sourceMap 31 | }) 32 | }) 33 | } 34 | 35 | // Extract CSS when that option is specified 36 | // (which is the case during production build) 37 | if (options.extract) { 38 | return ExtractTextPlugin.extract({ 39 | use: loaders, 40 | fallback: 'vue-style-loader' 41 | }) 42 | } else { 43 | return ['vue-style-loader'].concat(loaders) 44 | } 45 | } 46 | 47 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html 48 | return { 49 | css: generateLoaders(), 50 | postcss: generateLoaders(), 51 | less: generateLoaders('less'), 52 | sass: generateLoaders('sass', { indentedSyntax: true }), 53 | scss: generateLoaders('sass'), 54 | stylus: generateLoaders('stylus'), 55 | styl: generateLoaders('stylus') 56 | } 57 | } 58 | 59 | // Generate loaders for standalone style files (outside of .vue) 60 | exports.styleLoaders = function (options) { 61 | var output = [] 62 | var loaders = exports.cssLoaders(options) 63 | for (var extension in loaders) { 64 | var loader = loaders[extension] 65 | output.push({ 66 | test: new RegExp('\\.' + extension + '$'), 67 | use: loader 68 | }) 69 | } 70 | return output 71 | } 72 | -------------------------------------------------------------------------------- /build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | var utils = require('./utils') 2 | var config = require('../config') 3 | var isProduction = process.env.NODE_ENV === 'production' 4 | 5 | module.exports = { 6 | loaders: utils.cssLoaders({ 7 | sourceMap: isProduction 8 | ? config.build.productionSourceMap 9 | : config.dev.cssSourceMap, 10 | extract: isProduction 11 | }), 12 | transformToRequire: { 13 | video: 'src', 14 | source: 'src', 15 | img: 'src', 16 | image: 'xlink:href' 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /build/webpack.base.conf.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var utils = require('./utils') 3 | var config = require('../config') 4 | var vueLoaderConfig = require('./vue-loader.conf') 5 | 6 | function resolve (dir) { 7 | return path.join(__dirname, '..', dir) 8 | } 9 | 10 | module.exports = { 11 | entry: { 12 | app: './src/main.js' 13 | }, 14 | output: { 15 | path: config.build.assetsRoot, 16 | filename: '[name].js', 17 | publicPath: process.env.NODE_ENV === 'production' 18 | ? config.build.assetsPublicPath 19 | : config.dev.assetsPublicPath 20 | }, 21 | resolve: { 22 | extensions: ['.js', '.vue', '.json'], 23 | alias: { 24 | 'vue$': 'vue/dist/vue.esm.js', 25 | '@': resolve('src') 26 | } 27 | }, 28 | module: { 29 | rules: [ 30 | { 31 | test: /\.(js|vue)$/, 32 | loader: 'eslint-loader', 33 | enforce: 'pre', 34 | include: [resolve('src'), resolve('test')], 35 | options: { 36 | formatter: require('eslint-friendly-formatter') 37 | } 38 | }, 39 | { 40 | test: /\.vue$/, 41 | loader: 'vue-loader', 42 | options: vueLoaderConfig 43 | }, 44 | { 45 | test: /\.js$/, 46 | loader: 'babel-loader', 47 | include: [resolve('src'), resolve('test')] 48 | }, 49 | { 50 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, 51 | loader: 'url-loader', 52 | options: { 53 | limit: 10000, 54 | // name: utils.assetsPath('img/[name].[hash:7].[ext]') 55 | name: utils.assetsPath('img/[name].[ext]') 56 | } 57 | }, 58 | { 59 | test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, 60 | loader: 'url-loader', 61 | options: { 62 | limit: 10000, 63 | name: utils.assetsPath('media/[name].[hash:7].[ext]') 64 | } 65 | }, 66 | { 67 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 68 | loader: 'url-loader', 69 | options: { 70 | limit: 10000, 71 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]') 72 | } 73 | } 74 | ] 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /build/webpack.dev.conf.js: -------------------------------------------------------------------------------- 1 | var utils = require('./utils') 2 | var webpack = require('webpack') 3 | var config = require('../config') 4 | var merge = require('webpack-merge') 5 | var baseWebpackConfig = require('./webpack.base.conf') 6 | var HtmlWebpackPlugin = require('html-webpack-plugin') 7 | var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') 8 | 9 | // add hot-reload related code to entry chunks 10 | Object.keys(baseWebpackConfig.entry).forEach(function (name) { 11 | baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name]) 12 | }) 13 | 14 | module.exports = merge(baseWebpackConfig, { 15 | module: { 16 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap }) 17 | }, 18 | // cheap-module-eval-source-map is faster for development 19 | devtool: '#cheap-module-eval-source-map', 20 | plugins: [ 21 | new webpack.DefinePlugin({ 22 | 'process.env': config.dev.env 23 | }), 24 | // https://github.com/glenjamin/webpack-hot-middleware#installation--usage 25 | new webpack.HotModuleReplacementPlugin(), 26 | new webpack.NoEmitOnErrorsPlugin(), 27 | // https://github.com/ampedandwired/html-webpack-plugin 28 | new HtmlWebpackPlugin({ 29 | filename: 'index.html', 30 | template: 'index.html', 31 | inject: true 32 | }), 33 | new FriendlyErrorsPlugin() 34 | ] 35 | }) 36 | -------------------------------------------------------------------------------- /build/webpack.prod.conf.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var utils = require('./utils') 3 | var webpack = require('webpack') 4 | var config = require('../config') 5 | var merge = require('webpack-merge') 6 | var baseWebpackConfig = require('./webpack.base.conf') 7 | var CopyWebpackPlugin = require('copy-webpack-plugin') 8 | var HtmlWebpackPlugin = require('html-webpack-plugin') 9 | var ExtractTextPlugin = require('extract-text-webpack-plugin') 10 | var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') 11 | 12 | var env = config.build.env 13 | 14 | var webpackConfig = merge(baseWebpackConfig, { 15 | module: { 16 | rules: utils.styleLoaders({ 17 | sourceMap: config.build.productionSourceMap, 18 | extract: true 19 | }) 20 | }, 21 | devtool: config.build.productionSourceMap ? '#source-map' : false, 22 | output: { 23 | path: config.build.assetsRoot, 24 | // filename: utils.assetsPath('js/[name].[chunkhash].js'), 25 | filename: utils.assetsPath('js/[name].js'), 26 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') 27 | }, 28 | plugins: [ 29 | // http://vuejs.github.io/vue-loader/en/workflow/production.html 30 | new webpack.DefinePlugin({ 31 | 'process.env': env 32 | }), 33 | new webpack.optimize.UglifyJsPlugin({ 34 | compress: { 35 | warnings: false 36 | }, 37 | sourceMap: true 38 | }), 39 | // extract css into its own file 40 | new ExtractTextPlugin({ 41 | // filename: utils.assetsPath('css/[name].[contenthash].css') 42 | filename: utils.assetsPath('css/[name].css') 43 | }), 44 | // Compress extracted CSS. We are using this plugin so that possible 45 | // duplicated CSS from different components can be deduped. 46 | new OptimizeCSSPlugin({ 47 | cssProcessorOptions: { 48 | safe: true 49 | } 50 | }), 51 | // generate dist index.html with correct asset hash for caching. 52 | // you can customize output by editing /index.html 53 | // see https://github.com/ampedandwired/html-webpack-plugin 54 | new HtmlWebpackPlugin({ 55 | filename: config.build.index, 56 | template: 'index.html', 57 | inject: true, 58 | minify: { 59 | removeComments: true, 60 | collapseWhitespace: true, 61 | removeAttributeQuotes: true 62 | // more options: 63 | // https://github.com/kangax/html-minifier#options-quick-reference 64 | }, 65 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin 66 | chunksSortMode: 'dependency' 67 | }), 68 | // split vendor js into its own file 69 | new webpack.optimize.CommonsChunkPlugin({ 70 | name: 'vendor', 71 | minChunks: function (module, count) { 72 | // any required modules inside node_modules are extracted to vendor 73 | return ( 74 | module.resource && 75 | /\.js$/.test(module.resource) && 76 | module.resource.indexOf( 77 | path.join(__dirname, '../node_modules') 78 | ) === 0 79 | ) 80 | } 81 | }), 82 | // extract webpack runtime and module manifest to its own file in order to 83 | // prevent vendor hash from being updated whenever app bundle is updated 84 | new webpack.optimize.CommonsChunkPlugin({ 85 | name: 'manifest', 86 | chunks: ['vendor'] 87 | }), 88 | // copy custom static assets 89 | new CopyWebpackPlugin([ 90 | { 91 | from: path.resolve(__dirname, '../static'), 92 | to: config.build.assetsSubDirectory, 93 | ignore: ['.*'] 94 | } 95 | ]) 96 | ] 97 | }) 98 | 99 | if (config.build.productionGzip) { 100 | var CompressionWebpackPlugin = require('compression-webpack-plugin') 101 | 102 | webpackConfig.plugins.push( 103 | new CompressionWebpackPlugin({ 104 | asset: '[path].gz[query]', 105 | algorithm: 'gzip', 106 | test: new RegExp( 107 | '\\.(' + 108 | config.build.productionGzipExtensions.join('|') + 109 | ')$' 110 | ), 111 | threshold: 10240, 112 | minRatio: 0.8 113 | }) 114 | ) 115 | } 116 | 117 | if (config.build.bundleAnalyzerReport) { 118 | var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin 119 | webpackConfig.plugins.push(new BundleAnalyzerPlugin()) 120 | } 121 | 122 | module.exports = webpackConfig 123 | -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | var merge = require('webpack-merge') 2 | var prodEnv = require('./prod.env') 3 | 4 | module.exports = merge(prodEnv, { 5 | NODE_ENV: '"development"' 6 | }) 7 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | // see http://vuejs-templates.github.io/webpack for documentation. 2 | var path = require('path') 3 | var webpack = require('webpack') 4 | 5 | module.exports = { 6 | build: { 7 | env: require('./prod.env'), 8 | index: path.resolve(__dirname, '../hexo/source/index.html'), 9 | assetsRoot: path.resolve(__dirname, '../hexo/source'), 10 | assetsSubDirectory: '', 11 | assetsPublicPath: '/', 12 | productionSourceMap: true, 13 | // Gzip off by default as many popular static hosts such as 14 | // Surge or Netlify already gzip all static assets for you. 15 | // Before setting to `true`, make sure to: 16 | // npm install --save-dev compression-webpack-plugin 17 | productionGzip: false, 18 | productionGzipExtensions: ['js', 'css'], 19 | // Run the build command with an extra argument to 20 | // View the bundle analyzer report after build finishes: 21 | // `npm run build --report` 22 | // Set to `true` or `false` to always turn it on or off 23 | bundleAnalyzerReport: process.env.npm_config_report, 24 | devtool: 'source-map' 25 | }, 26 | dev: { 27 | env: require('./dev.env'), 28 | port: 8080, 29 | autoOpenBrowser: true, 30 | assetsSubDirectory: '', 31 | assetsPublicPath: '/', 32 | // CSS Sourcemaps off by default because relative paths are "buggy" 33 | // with this option, according to the CSS-Loader README 34 | // (https://github.com/webpack/css-loader#sourcemaps) 35 | // In our experience, they generally work as expected, 36 | // just be aware of this issue when enabling this option. 37 | cssSourceMap: false, 38 | proxyTable: { 39 | '/api': { 40 | target: 'http://localhost:3300', 41 | changeOrigin: true, 42 | pathRewrite: { 43 | '^/api': '' 44 | } 45 | } 46 | }, 47 | devtool: 'source-map' 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | NODE_ENV: '"production"' 3 | } 4 | -------------------------------------------------------------------------------- /docs/404_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lazzzis/hexo-theme-only/cffdd674de3fb8403292c180d45262535e78b3be/docs/404_page.png -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | 此文档是为 2.x 版本定制的文档。1.x 相关文档已经转移至 [link](https://github.com/lazzzis/hexo-theme-only/tree/gh-pages/docs) 2 | 3 | # 文档 4 | 5 | 如同 [hexo-theme-one](https://github.com/EYHN/hexo-theme-one/blob/master/docs/README.md) 一样,这个主题也部分重写了 hexo 的一些功能 6 | 7 | - 文章 = Post 8 | 9 | - 页面 = Page 10 | 11 | - 本主题所有markdown均支持html 12 | 13 | 1. [安装](./setup.md) 14 | 2. [配置](./setting.md) 15 | 3. [评论迁移](./migrate_comments.md) 16 | 4. [动画效果](./animated.md) 17 | 5. [自定义 404 页面](./customize_404.md) 18 | 6. [faq](./faq.md) 19 | 7. [开发](./dev.md) 20 | -------------------------------------------------------------------------------- /docs/animated.md: -------------------------------------------------------------------------------- 1 | 此主题允许你想更改部分动画效果。 2 | 3 | 这个主题用到动画效果的地方有四个: 4 | 5 | 1. `/posts` 显示文章列表 6 | 2. `/post/:title` 显示一篇文章 7 | 3. `/tags` 以及 `/tags/:tag` 显示某一 tag 下的文章列表 8 | 4. 类型为 page 的页面 9 | 10 | 以上四项对应到 `_config.yml` 中 `animated` 属性的 `posts`, `post`, `tags`, `page`。 11 | 12 | 动画效果采用的是 [animate.css](https://daneden.github.io/animate.css/)。所以把对应字段的属性改成对应的动画效果即可。 13 | 14 | 举个例子,把显示 `posts` 的动画效果由默认的 `bounceInLeft` 更改为 `rotateInDownLeft`。那么更改后的 animated 为 15 | 16 | ```yml 17 | animated: 18 | posts: rotateInDownLeft # 更改 posts 页面的动画效果 19 | tags: bounceInUp 20 | post: slideInLeft 21 | page: slideInLeft 22 | ``` 23 | 24 | 配置后务必用 `hexo g` 重新生成静态文件 25 | -------------------------------------------------------------------------------- /docs/customize_404.md: -------------------------------------------------------------------------------- 1 | # 自定义 404 页面 2 | 3 | 在 source 文件夹下新建一份 markdown 文件,名字随意。类似与 `page` 的创建,在 `front-matter` 中添加 `layout: page404` 即可。 4 | 5 | 404 页面的内容将会以一篇文章的形式展现,因此你在该文件里编辑的内容就是 404 页面展现的内容。比如 6 | 7 | ```yml 8 | --- 9 | title: not-found 10 | date: 2018-03-24 14:31:52 11 | layout: page404 # 必须存在 12 | comments: false 13 | --- 14 | 15 | ### 迷路了么?这里什么也不存在 16 | 17 | 回到 [最开始的地方吧](/) 18 | 19 | ![](https://as.bitinn.net/upload/cite0l5z200oiz35nbv8t5xox.1200.jpg) 20 | 21 | ``` 22 | 23 | > `comments: false` 可以用于取消对 404 页面的注释,推荐加上这一字段。 24 | 25 | 渲染后的样子 26 | 27 | ![](./404_page.png) 28 | -------------------------------------------------------------------------------- /docs/dev.md: -------------------------------------------------------------------------------- 1 | # 开发 2 | 3 | 下载源码: 4 | 5 | `git clone https://github.com/lazzzis/hexo-theme-only.git` 6 | 7 | 安装依赖: 8 | 9 | `yarn` (推荐) 或 `npm i` 10 | 11 | 启动后台静态服务器: 12 | 13 | `yarn run dev:server` 或 `npm run dev:server` 14 | 15 | 启动前端开发模式: 16 | 17 | `yarn run dev` 或 `npm run dev` 18 | 19 | ## 基本思路 20 | 21 | 1. 通过 `hexo/scripts` 里的代码(这部分来自于 `hexo-theme-one`),可以生成 `api` 文件夹下的所有 `json` 文件。 22 | 2. 前端向后端请求相应的 `json` 文件并更新 23 | 24 | ## site.json 与 theme.json 25 | 26 | site.json 的内容就是将你的 hexo 目录下的 `_config.yml` 转化成了 `json` 格式而已 27 | 28 | 类似地,theme.json 则是将 `theme` 目录下的 `_config.yml` 转化成了 `json` 格式而已 29 | 30 | ## posts.json 与 articles 文件夹下 31 | 32 | 记录所有博客的一个列表 33 | 34 | 而某一具体的文章的具体内容则在 `articles` 文件夹下 35 | 36 | ## tags.json 37 | 38 | 记录该网站的所有 tags 的一个列表 39 | 40 | 如果 `tag` 为 `Foo`, 则在 `tags/Foo.json` 中可以查询到所有带有 `Foo` 标签的文章的列表 41 | 42 | > 其余文档完善中。。。 43 | -------------------------------------------------------------------------------- /docs/down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lazzzis/hexo-theme-only/cffdd674de3fb8403292c180d45262535e78b3be/docs/down.png -------------------------------------------------------------------------------- /docs/english/README.md: -------------------------------------------------------------------------------- 1 | These documents are specifically for v2.x. If you are looking for documents of v1.x, visiting [here](https://github.com/lazzzis/hexo-theme-only/tree/gh-pages/docs) 2 | 3 | # Documents 4 | 5 | Like `hexo-theme-one`, this theme also rewrites some functions of `hexo`. 6 | 7 | 1. [Install](./setup.md) 8 | 2. [Config](./setting.md) 9 | 3. [Migrate Comments](./migrate_comments.md) 10 | 4. [Animations](./animated.md) 11 | 5. [Customize 404 Page](./customize_404.md) 12 | 5. [faq](./faq.md) 13 | 14 | **Note**: In the following documents, the root directory refers to the directory you init with `hexo init`, not the directories under `themes` folder. 15 | -------------------------------------------------------------------------------- /docs/english/animated.md: -------------------------------------------------------------------------------- 1 | Some animations can be replaced。 2 | 3 | You can update the animations used in following urls: 4 | 5 | 1. `/posts` Demonstrating all the posts 6 | 2. `/post/:title` Showing one specific post 7 | 3. `/tags` and `/tags/:tag` Listing posts with one specific tag 8 | 4. Pages with type `page` 9 | 10 | Each link corresponds to the `animated` attribute in `config.yml`: `posts`, `post`, `tags`, `page`。 11 | 12 | The animations origin from [animate.css](https://daneden.github.io/animate.css/)。So update `animated` attributes by the animation names show in [animate.css](https://daneden.github.io/animate.css/)。 13 | 14 | As an instance, Change the animation of `posts` from default `bounceInLeft` to `rotateInDownLeft`: 15 | 16 | ```yml 17 | animated: 18 | posts: rotateInDownLeft # update animation of 'posts' 19 | tags: bounceInUp 20 | post: slideInLeft 21 | page: slideInLeft 22 | ``` 23 | 24 | Use `hexo g` to regenerate static files 25 | -------------------------------------------------------------------------------- /docs/english/customize_404.md: -------------------------------------------------------------------------------- 1 | # Customize 404 Page 2 | 3 | Create a new markdown file under source directory, which you can name anything, like `404.md`, `not-found.md`. Append `layout: page404` in the `front-matter`. 4 | 5 | The 404 page will show like a post. Therefore, the content of the `not-found.md` is just the content of your 404 page, such as 6 | 7 | ```yaml 8 | --- 9 | title: not-found 10 | layout: page404 # can not be omitted 11 | date: 2018-03-24 14:31:52 12 | comments: false 13 | --- 14 | 15 | ### 迷路了么?这里什么也不存在 16 | 17 | 回到 [最开始的地方吧](/) 18 | 19 | ![](https://as.bitinn.net/upload/cite0l5z200oiz35nbv8t5xox.1200.jpg) 20 | 21 | ``` 22 | 23 | > `comments: false` is recommended, since this can disable commenting on the 404 page 24 | 25 | will be rendered as: 26 | 27 | ![](../404_page.png) 28 | -------------------------------------------------------------------------------- /docs/english/migrate_comments.md: -------------------------------------------------------------------------------- 1 | # Comment Migration 2 | 3 | Due to some reason, all links to the posts are changed to `/post/:title`, which is different from the default url format. 4 | 5 | Take `https://lazzzis.github.io/2017/12/25/xmas` as an example, under the constraint of this theme, the link is changed to `https://lazzzis.github.io/post/xmas`. As a result, if you choose `disqus` as your comment system, you have to migrate your comments. 6 | 7 | **Note**: 8 | 9 | In disqus, `https://lazzzis.github.io/about` differs from `https://lazzzis.github.io/about/`. For standardizing, all links to comment is ended with slash `/`, just like the latter. 10 | 11 | If you're unclear how to migrate, follow these steps: 12 | 13 | Log in [disqus](https://disqus.com), and then click `Admin`. 14 | 15 | Click `moderate comments`: 16 | 17 | ![](../moderate.png) 18 | 19 | Click `migration tools` on the left sidebar: 20 | 21 | ![](../tools.png) 22 | 23 | Choose the site, and then click `Url Mapper` (Click for `URL mapper help` for further information) 24 | 25 | ![](../urlmapper.png) 26 | 27 | Click `Download`: 28 | 29 | ![](../down.png) 30 | 31 | 32 | Your inbox, which you used to register account, would receive an email containing a link to download a file. It is a csv file, containing all the urls of your blog. 33 | 34 | Each line indicates a match rule: original urls on the left while new urls on the right, separated by a comma, such as 35 | 36 | ```csv 37 | https://lazzzis.github.io/2017/03/05/source-code-of-howdoi/, https://lazzzis.github.io/post/source-code-of-howdoi/ 38 | ``` 39 | 40 | You can delete any url which you don't want it to match a new url. 41 | 42 | For example: these are links of my origin blogs: 43 | 44 | ```csv 45 | https://lazzzis.github.io/about 46 | https://lazzzis.github.io/blogs/testsfd/ 47 | https://lazzzis.github.io/2017/03/25/recent-interviews-in-march-2017/ 48 | ``` 49 | 50 | I don't want to update the first one and second one, so I only need to update the third one and fourth one. After modifying, the links are like following: 51 | 52 | ```csv 53 | https://lazzzis.github.io/2017/03/25/recent-interviews-in-march-2017/, https://lazzzis.github.io/post/recent-interviews-in-march-2017/ 54 | ``` 55 | 56 | > P.S. A scripts, utilizing regular expressions, could help you a lot. 57 | 58 | After updating this file, open the site which you download this file and then upload the modified file. 59 | 60 | ![](../upload.png) 61 | 62 | After uploading, it would take several minutes to one day to migrate all the comments. 63 | -------------------------------------------------------------------------------- /docs/english/setting.md: -------------------------------------------------------------------------------- 1 | # Settings 2 | 3 | Update `_config.yml` under your theme folder 4 | 5 | ## Splash & Drawer 6 | 7 | `Splash` corresponds to the links in your home page (index page) 8 | `Drawer` corresponds to the links in your sidebar 9 | 10 | ### type 11 | 12 | #### sitelink 13 | 14 | The links whose type is sitelink are reserved ones. You have to use these links for the following purpose: 15 | 16 | - `/` home page 17 | - `/posts` list of posts 18 | - `/post/:title` a post with one specific title 19 | - `/tags` list of tags 20 | - `/tags/:tag` list of posts with one specific tag 21 | 22 | This seems implements redirect for `/tags`. For example, if there exist there tags, such as ['foo', 'bar', 'baz'], it will redirect to `/tags/foo` when you visit `/tags` 23 | 24 | ```yml 25 | - 26 | title: Blog 27 | type: sitelink 28 | link: '/posts' 29 | ``` 30 | 31 | The value of `title` can be arbitrary. It will be shown in your index page (Splash) or side bar (Drawer). 32 | 33 | #### permalink 34 | 35 | generally corresponds to links other than your blog, such as 36 | 37 | ```yml 38 | - 39 | title: Twitter 40 | type: permalink 41 | link: https://twitter.com/lazzzis 42 | _blank: true 43 | ``` 44 | 45 | `_blank` only works for `permalink`. If it is set to true, the page will be opened in a new tab. 46 | 47 | #### page 48 | 49 | `page` is used for your custom pages. To make it work, you have to create a new `markdown` file in `source` folder under your root directory 50 | 51 | ```yml 52 | - 53 | title: About 54 | type: page 55 | layout: about 56 | link: /about-me 57 | ``` 58 | 59 | Let's say you would like a new page with the url `/about-me`. Then create a file, which you can name anything, like `about-me.md` or `About.md`, under `source` folder. 60 | 61 | The `front-matter` of this file must contain a `layout`, whose value is same with the one in `_config.yml`, like: 62 | 63 | ```yml 64 | title: Title can be arbitrary 65 | layout: about # can not be omitted and must be same with `layout` in `_config.yml` 66 | --- 67 | 68 | Writing anything you like 69 | ``` 70 | 71 | You can set `link` as arbitrary, as long as it does not conflict with previous links. But `layout` must be identical and does not conflict with other files. 72 | 73 | ## disqus_shortname 74 | 75 | the `disqus` id for your [disqus](disqus.com) comment system. If you leave it blank, the comments would be hidden. 76 | 77 | ## livere_uid 78 | 79 | (Beta Stage) 80 | 81 | the `livere` uid for [livere](https://livere.com/) comment system. If you leave it blank, the comments would be hidden. 82 | 83 | ## favicon.ico 84 | 85 | Put `favicon.ico` under the `source` folder of theme directory 86 | -------------------------------------------------------------------------------- /docs/english/setup.md: -------------------------------------------------------------------------------- 1 | # Install 2 | 3 | ## Preparation 4 | 5 | Update the `_config.yml` in your root directory: disable the default highlight function 6 | 7 | ```yml 8 | highlight: 9 | enable: false 10 | line_number: false 11 | auto_detect: false 12 | ``` 13 | 14 | Install additional modules in your root directory: `locash.pick`, `highlight.js` 15 | 16 | ```bash 17 | npm i lodash.pick highlight.js --save 18 | ``` 19 | 20 | Under `source` folder, which is in your root directory, create a file called `404.md`. The content can be arbitrary. 21 | 22 | ## Download theme 23 | 24 | Go to [https://github.com/lazzzis/hexo-theme-only/releases](https://github.com/lazzzis/hexo-theme-only/releases) to download latest release and unzip to the `themes` folder. 25 | 26 | **Note**: Rename `_config.yml.example` to `_config.yml` 27 | 28 | Set this theme as the default one. 29 | -------------------------------------------------------------------------------- /docs/faq.md: -------------------------------------------------------------------------------- 1 | Q: 如何更换首页的背景图片? 2 | 3 | A: 在主题文件夹的 source/img 下,有一个 background.jpg,将其替换即可。当然,文件名要与之前保持一致 4 | 5 | 6 | Q: 为什么更新了图片但博客还是没有更新? 7 | 8 | A: 之前也与遇到过类似的问题,貌似跟缓存有关。可以清楚缓存或者过一段时间再试试看。可以参考这个回答 [how long does it take for github page to show changes after changing index.html 9 | Ask](https://stackoverflow.com/questions/24851824/how-long-does-it-take-for-github-page-to-show-changes-after-changing-index-html) 10 | -------------------------------------------------------------------------------- /docs/migrate_comments.md: -------------------------------------------------------------------------------- 1 | # 评论迁移 2 | 3 | 因为某些原因,这里的博客文章的链接统一变为了 `/post/:title` 显示,而 hexo 默认却不是这样的。 4 | 5 | 比如以前我一篇文章的地址是 `https://lazzzis.github.io/2017/12/25/xmas`,但在这个主题的限制下,这篇文章对应的链接变成了 `https://lazzzis.github.io/post/xmas`。如果你用 disqus 评论的系统的话,这意味着你必须迁移评论。 6 | 7 | 首先说一点: 8 | 9 | 在 disqus 中,`https://lazzzis.github.io/about` 与 `https://lazzzis.github.io/about/` 是不同的,因此我为了统一,所有请求 disqus 评论是都用的是以 '/' 结尾的 URL,即后者。 10 | 11 | 如果你不知道怎么迁移,可以按照如下步骤: 12 | 13 | 登录 [disqus](https://disqus.com),选择右上角的 Admin 14 | 15 | 选择 moderate comments: 16 | 17 | ![](./moderate.png) 18 | 19 | 选择左栏的 migration tools: 20 | 21 | ![](./tools.png) 22 | 23 | 选择站点后,选择 Url Mapper (可以点击 URL mapper help 顺便查看匹配的具体信息): 24 | 25 | ![](./urlmapper.png) 26 | 27 | 选择下载: 28 | 29 | ![](./down.png) 30 | 31 | 之后会在你的注册 disqus 的邮箱里收到一封邮件,里面有个链接指向下载,下载后会有一个 csv 文件,里面是你的博客中所有评论对应的 url。 32 | 33 | 每一行写一个匹配规则,匹配规则为,左边写原 URL,右边写新的 URL,中间用一个逗号分隔,比如: 34 | 35 | ```csv 36 | https://lazzzis.github.io/2017/03/05/source-code-of-howdoi/, https://lazzzis.github.io/post/source-code-of-howdoi/ 37 | ``` 38 | 39 | 并不是里面所有的 URL 都有对应的匹配规则,比如你不想改的那一行的路由 ,直接删除就行了。 40 | 41 | 比如这是我之前的全部路由: 42 | 43 | ```csv 44 | https://lazzzis.github.io/about 45 | https://lazzzis.github.io/blogs/testsfd/ 46 | https://lazzzis.github.io/2017/03/25/recent-interviews-in-march-2017/ 47 | ``` 48 | 49 | 其中前两个不要,只要第 3 个,所以更改后只有: 50 | 51 | ```csv 52 | https://lazzzis.github.io/2017/03/25/recent-interviews-in-march-2017/, https://lazzzis.github.io/post/recent-interviews-in-march-2017/ 53 | ``` 54 | 55 | > P.S. 如果你需要改的较多,建议写一个脚本,利用正则表达式匹配 56 | 57 | 更改完后,保存文件,回到之前下载文件的地方,点击上传这个 csv 文件即可。 58 | 59 | ![](./upload.png) 60 | 61 | 上传后过一段时间(快则几分钟,慢则一天)即可生效。 62 | -------------------------------------------------------------------------------- /docs/moderate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lazzzis/hexo-theme-only/cffdd674de3fb8403292c180d45262535e78b3be/docs/moderate.png -------------------------------------------------------------------------------- /docs/setting.md: -------------------------------------------------------------------------------- 1 | # 设置 2 | 3 | 主题目录下的 `_config.yml` 配置 4 | 5 | ## Splash 与 Drawer 6 | 7 | Splash 对应的是首页页面的一批链接 8 | 9 | Drawer 对应的是侧边导航栏的一批链接 10 | 11 | ### type 12 | 13 | #### sitelink 14 | 15 | sitelink 的链接是本主题已经使用了,分别是 16 | 17 | - `/` 首页 18 | - `/posts` 文章列表 19 | - `/post/:title` 标题为 title 的文章 20 | - `/tags` 标签列表 21 | - `/tags/:tag` 标记了 tag 标签的文章列表 22 | 23 | 本主题实现了对 '/tags' 的自动跳转,如果拥有 ['foo', 'bar', 'barz'] 三个标签,那么访问 `/tags` 会自动跳转到 `/tags/foo` 24 | 25 | 请不要把这几个链接用于其它用途 26 | 27 | ```yml 28 | - 29 | title: Blog 30 | type: sitelink 31 | link: '/posts' 32 | ``` 33 | 34 | title 的值可以随意,它就是最后显示在博客 Splash 或 Drawer 的字符串 35 | 36 | #### permalink 37 | 38 | 一般指外链,比如链接到你的推特帐号,例如: 39 | 40 | ```yml 41 | - 42 | title: Twitter 43 | type: permalink 44 | link: https://twitter.com/lazzzis 45 | _blank: true 46 | ``` 47 | 48 | `_blank` 仅对 permalink 有用,如果为 true,则会在新标签页打开 49 | 50 | #### page 51 | 52 | page 指你可以自定义的其它页面,要想使用 page 必须在 source 目录下建立一个新的 markdown 文件 53 | 54 | ```yml 55 | - 56 | title: About 57 | type: page 58 | layout: about 59 | link: /about-me 60 | ``` 61 | 62 | 例如单独增加一个 `/about-me` 路由,那么在 source 目录下新建一个 `about-me.md` (你也可以命名为其它名字)。在文件的 `front-matter` 中必须包含 `layout: about`。 63 | 64 | 例如: 65 | 66 | ```yml 67 | title: 标题随意 68 | layout: about # 必须存在 69 | --- 70 | 71 | 文章内容随意 72 | ``` 73 | 74 | link 随意,一般不与之前冲突的就行。但是 `layout` 必须是唯一,不能存在两个相同 `layout` 的文件。 75 | 76 | ## disqus_shortname 77 | 78 | 评论用的 `disqus` id,如果不设置,就不显示评论 79 | 80 | ## livere_uid 81 | 82 | **此功能当前处于 Beta 状态** 83 | 评论用的 `livere` (来必力) uid,如果不设置,就不显示评论。这里的 uid 指管理页面 -> 代码管理 -> 一般网站 代码中的 data-uid 84 | 85 | ## favicon 86 | 87 | 将 `favicon.ico` 放置于主题的 `source` 文件夹下即可 88 | -------------------------------------------------------------------------------- /docs/setup.md: -------------------------------------------------------------------------------- 1 | # 安装 2 | 3 | ## 准备工作 4 | 5 | 先对 hexo 目录中的字段修改,取消默认的高亮(否则最后的高亮效果十分难看。。): 6 | 7 | ```yml 8 | highlight: 9 | enable: false 10 | line_number: false 11 | auto_detect: false 12 | ``` 13 | 14 | 在hexo目录中安装额外的模块: `lodash.pick`, `highlight.js` 15 | 16 | ```bash 17 | npm i lodash.pick highlight.js --save 18 | ``` 19 | 20 | 在 hexo 目录中的 `source` 文件夹下建立一个 `404.md` 文件,文件内容不重要,重要的是这个文件必须存在。 21 | 22 | ## 下载主题 23 | 24 | 前往 [https://github.com/lazzzis/hexo-theme-only/releases](https://github.com/lazzzis/hexo-theme-only/releases) 下载最新版主题,解压到 hexo 的 themes 目录中 25 | 26 | 记的把 `_config.yml.example` 改为 `_config.yml` 27 | 28 | 将本主题设置为 hexo 默认主题。(在站点配置文件里将默认主题字段设置为与存放主题的文件夹相同的值) 29 | -------------------------------------------------------------------------------- /docs/tools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lazzzis/hexo-theme-only/cffdd674de3fb8403292c180d45262535e78b3be/docs/tools.png -------------------------------------------------------------------------------- /docs/upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lazzzis/hexo-theme-only/cffdd674de3fb8403292c180d45262535e78b3be/docs/upload.png -------------------------------------------------------------------------------- /docs/urlmapper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lazzzis/hexo-theme-only/cffdd674de3fb8403292c180d45262535e78b3be/docs/urlmapper.png -------------------------------------------------------------------------------- /hexo/_config.yml.example: -------------------------------------------------------------------------------- 1 | # read documentations for more detail 2 | 3 | Splash: 4 | - 5 | title: Blogs 6 | type: sitelink 7 | link: /posts 8 | - 9 | title: Twitter 10 | type: permalink 11 | link: https://twitter.com 12 | _blank: true 13 | - 14 | title: Github 15 | type: permalink 16 | link: https://github.com 17 | _blank: true 18 | - 19 | title: Rss 20 | type: permalink 21 | link: /atom.xml 22 | _blank: true 23 | # - 24 | # title: About 25 | # type: page 26 | # link: /about 27 | 28 | Drawer: 29 | - 30 | title: Blog 31 | type: sitelink 32 | link: /posts 33 | - 34 | title: Tags 35 | type: sitelink 36 | link: /tags 37 | # - 38 | # title: Links 39 | # type: page 40 | # link: /links 41 | # layout: links 42 | # - 43 | # title: About 44 | # type: page 45 | # link: /about 46 | # layout: about 47 | 48 | # disqus_shortname: demo 49 | # livere_uid: demo 50 | 51 | animated: 52 | posts: slideInLeft 53 | post: slideInLeft 54 | page: slideInLeft 55 | tags: bounceInUp 56 | 57 | # customize 404 page 58 | # set false to show default 404 page 59 | page404: true 60 | -------------------------------------------------------------------------------- /hexo/layout/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | <%= config.title %> 6 | 7 | 8 | 9 | <%- css('css/ionicons.min.css') %> 10 | <%- css('css/milligram.min.css') %> 11 | <%- css('css/comfortaa.css') %> 12 | <%- css('css/source-sans-pro.css') %> 13 | <%- css('css/animate.min.css') %> 14 | <%- css('css/nprogress.css') %> 15 | <%- css('css/loaders.min.css') %> 16 | <%- css('css/atom-one-light.css') %> 17 | <%- css('css/app.css') %> 18 | 19 | 20 |
21 | 24 | <%- js('js/manifest.js') %> 25 | <%- js('js/vendor.js') %> 26 | <%- js('js/app.js') %> 27 | 28 | 29 | -------------------------------------------------------------------------------- /hexo/layout/layout.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | <%= config.title %> 6 | 7 | 8 | 9 | <%- css('css/ionicons.min.css') %> 10 | <%- css('css/milligram.min.css') %> 11 | <%- css('css/comfortaa.css') %> 12 | <%- css('css/source-sans-pro.css') %> 13 | <%- css('css/animate.min.css') %> 14 | <%- css('css/nprogress.css') %> 15 | <%- css('css/loaders.min.css') %> 16 | <%- css('css/atom-one-light.css') %> 17 | <%- css('css/app.css') %> 18 | 19 | 20 |
21 | 24 | <%- js('js/manifest.js') %> 25 | <%- js('js/vendor.js') %> 26 | <%- js('js/app.js') %> 27 | 28 | 29 | -------------------------------------------------------------------------------- /hexo/scripts/helper.js: -------------------------------------------------------------------------------- 1 | hexo.extend.helper.register('jsHex', function () { 2 | return require('./lib/js_hex.js').call(hexo, ...arguments) 3 | }) 4 | 5 | hexo.extend.helper.register('jsLsload', function () { 6 | return require('./lib/js_lsload.js').call(hexo, ...arguments) 7 | }) 8 | 9 | hexo.extend.helper.register('cssLsload', function () { 10 | return require('./lib/css_lsload.js').call(hexo, ...arguments) 11 | }) 12 | -------------------------------------------------------------------------------- /hexo/scripts/index.js: -------------------------------------------------------------------------------- 1 | const url = require('url') 2 | const restful = require('./lib/restful') 3 | const highlight_code = require('./lib/highlight_code') 4 | const fs = require('fs') 5 | const path = require('path') 6 | 7 | hexo.extend.generator.register('restful', function (site) { 8 | let {config, theme: {config: themeConfig}} = hexo 9 | return restful(config, themeConfig, site) 10 | }) 11 | 12 | hexo.extend.filter.register('after_post_render', highlight_code) 13 | 14 | // https://github.com/hexojs/hexo/issues/1030 15 | hexo.extend.filter.register('server_middleware', function _404middleware (app) { 16 | app.use(function handle404(req, res, next) { 17 | const { pathname } = url.parse(req.url) 18 | if (!pathname.endsWith('.json')) { 19 | res.writeHead(302, { 20 | 'Location': url.resolve(hexo.config.root, '404.html?redirect=' + req.url) 21 | }) 22 | res.end() 23 | } else { 24 | next() 25 | } 26 | }, 99) 27 | }) 28 | 29 | // hexo.extend.filter.register('server_middleware', function _404middleware (app) { 30 | // app.use(function handle404(req, res, next) { 31 | // const s = fs.createReadStream( 32 | // path.resolve(__dirname, '../../../', hexo.config.public_dir, './index.html') 33 | // ) 34 | // s.pipe(res) 35 | // }, 99) 36 | // }) 37 | 38 | // hexo.extend.filter.register('server_middleware', function _404middleware (app) { 39 | // app.use(function handle404(req, res, next) { 40 | // hexo.render.render( 41 | // {path: path.resolve(__dirname, '../layout/index.ejs')}, 42 | // { 43 | // config: hexo.config, 44 | // js: hexo.extend.helper.store.js.bind(HEXO), 45 | // css: hexo.extend.helper.store.css.bind(HEXO), 46 | // } 47 | // ).then(function(result) { 48 | // console.log(result) 49 | // res.write(result) 50 | // res.end() 51 | // }) 52 | // }, 99) 53 | // }) 54 | 55 | // delete unnecessary files 56 | hexo.extend.filter.register('after_generate', function (){ 57 | const list = hexo.route.list() 58 | for (const l of list) { 59 | if (l.endsWith('.html') && l !== 'index.html' && l !== '404.html') { 60 | hexo.route.remove(l) 61 | } 62 | } 63 | }) 64 | -------------------------------------------------------------------------------- /hexo/scripts/lib/css_lsload.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | var path_for = require('./path_for') 4 | var get_file_hex = require('./get_file_hex') 5 | var fs = require('fs') 6 | 7 | function cssHelper () { 8 | var result = '' 9 | var path = '' 10 | 11 | for (var i = 0, len = arguments.length; i < len; i++) { 12 | path = arguments[i] 13 | 14 | if (i) result += '\n' 15 | 16 | var localpath = path_for.call(this, path) 17 | 18 | if (Array.isArray(path)) { 19 | result += jsHelper.apply(this, path) 20 | } else { 21 | if (path.indexOf('?') < 0 && path.substring(path.length - 4, path.length) !== '.css') path += '.css' 22 | result += '' 30 | } 31 | } 32 | return result 33 | } 34 | 35 | module.exports = cssHelper 36 | -------------------------------------------------------------------------------- /hexo/scripts/lib/font_lsload.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lazzzis/hexo-theme-only/cffdd674de3fb8403292c180d45262535e78b3be/hexo/scripts/lib/font_lsload.js -------------------------------------------------------------------------------- /hexo/scripts/lib/get_file_hex.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs') 2 | var crypto = require('crypto') 3 | 4 | function getFileHexSync (filepath) { 5 | var buffer = fs.readFileSync(filepath) 6 | var fsHash = crypto.createHash('md5') 7 | 8 | fsHash.update(buffer) 9 | var sha384 = fsHash.digest('base64') 10 | return sha384 11 | } 12 | 13 | module.exports = getFileHexSync 14 | -------------------------------------------------------------------------------- /hexo/scripts/lib/highlight_code.js: -------------------------------------------------------------------------------- 1 | const map = { 2 | ''': '\'', 3 | '&': '&', 4 | '>': '>', 5 | '<': '<', 6 | '"': '"' 7 | } 8 | 9 | const regex = /
([\s\S]*?)<\/code><\/pre>/igm
10 | 
11 | function unescape (str) {
12 |   if (!str || str === null) return ''
13 |   const re = new RegExp('(' + Object.keys(map).join('|') + ')', 'g')
14 |   return String(str).replace(re, (match) => map[match])
15 | }
16 | 
17 | const highlight = require('highlight.js')
18 | 
19 | highlight.configure({
20 |   classPrefix: 'hljs-'     // don't append class prefix
21 | })
22 | 
23 | function highlight_code (data) {
24 |   data.content = data.content.replace(regex, (origin, lang, code) => {
25 |     code = unescape(code)
26 |     return `
27 |     
${highlight.highlightAuto(code).value}
` 28 | }) 29 | 30 | return data 31 | } 32 | 33 | module.exports = highlight_code 34 | -------------------------------------------------------------------------------- /hexo/scripts/lib/js_hex.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | var path_for = require('./path_for') 4 | var get_file_hex = require('./get_file_hex') 5 | 6 | function jsHelper () { 7 | var result = '' 8 | var path = '' 9 | 10 | for (var i = 0, len = arguments.length; i < len; i++) { 11 | path = arguments[i] 12 | 13 | if (i) result += '\n' 14 | 15 | if (Array.isArray(path)) { 16 | result += jsHelper.apply(this, path) 17 | } else { 18 | if (path.indexOf('?') < 0 && path.substring(path.length - 3, path.length) !== '.js') path += '.js' 19 | result += '' 20 | } 21 | } 22 | 23 | return result 24 | } 25 | 26 | module.exports = jsHelper 27 | -------------------------------------------------------------------------------- /hexo/scripts/lib/js_lsload.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | var path_for = require('./path_for') 4 | var get_file_hex = require('./get_file_hex') 5 | var fs = require('fs') 6 | 7 | function jsHelper () { 8 | var result = '' 9 | var path = '' 10 | 11 | for (var i = 0, len = arguments.length; i < len; i++) { 12 | path = arguments[i] 13 | 14 | if (i) result += '\n' 15 | 16 | var localpath = path_for.call(this, path) 17 | 18 | if (Array.isArray(path)) { 19 | result += jsHelper.apply(this, path) 20 | } else { 21 | if (path.indexOf('?') < 0 && path.substring(path.length - 3, path.length) !== '.js') path += '.js' 22 | result += '' 25 | } 26 | } 27 | return result 28 | } 29 | 30 | module.exports = jsHelper 31 | -------------------------------------------------------------------------------- /hexo/scripts/lib/path_for.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var fs = require('fs') 3 | 4 | function pathFor (paths) { 5 | var res = '' 6 | res = path.join(this.theme_dir, 'source', paths) 7 | if (!fs.existsSync(res)) { 8 | res = path.join(this.source_dir, paths) 9 | } 10 | return res 11 | } 12 | 13 | module.exports = pathFor 14 | -------------------------------------------------------------------------------- /hexo/scripts/lib/restful.js: -------------------------------------------------------------------------------- 1 | var pagination = require('hexo-pagination') 2 | var _pick = require('lodash.pick') 3 | 4 | module.exports = function (cfg, themecfg, site) { 5 | var restful = cfg.hasOwnProperty('restful') ? cfg.restful : 6 | { 7 | site: true, 8 | theme: true, 9 | posts_size: 0, 10 | posts_props: { 11 | title: true, 12 | slug: true, 13 | date: true, 14 | updated: true, 15 | comments: true, 16 | path: true, 17 | raw: false, 18 | excerpt: true, 19 | content: false, 20 | categories: true, 21 | tags: true, 22 | primarycolor: true, 23 | accentcolor: true, 24 | thumbnail: true 25 | }, 26 | categories: true, 27 | tags: true, 28 | post: true, 29 | page: true 30 | }, 31 | 32 | posts = site.posts.sort('-date').filter(function (post) { 33 | return post.published 34 | }), 35 | 36 | posts_props = (function () { 37 | var props = restful.posts_props 38 | 39 | return function (name, val) { 40 | return props[name] ? (typeof val === 'function' ? val() : val) : null 41 | } 42 | })(), 43 | 44 | postMap = function (post) { 45 | return { 46 | title: posts_props('title', post.title), 47 | slug: posts_props('slug', post.slug), 48 | date: posts_props('date', post.date), 49 | updated: posts_props('updated', post.updated), 50 | comments: posts_props('comments', post.comments), 51 | path: posts_props('path', 'api/articles/' + post.slug + '.json'), 52 | excerpt: posts_props('excerpt', post.excerpt), 53 | keywords: posts_props('keywords', cfg.keywords), 54 | thumbnail: posts_props('thumbnail', post.thumbnail), 55 | primarycolor: posts_props('primarycolor', post.primarycolor), 56 | accentcolor: posts_props('accentcolor', post.accentcolor), 57 | content: posts_props('content', post.content), 58 | raw: posts_props('raw', post.raw), 59 | categories: posts_props('categories', function () { 60 | return post.categories.map(function (cat) { 61 | return { 62 | name: cat.name, 63 | path: 'api/categories/' + cat.name + '.json' 64 | } 65 | }) 66 | }), 67 | tags: posts_props('tags', function () { 68 | return post.tags.map(function (tag) { 69 | return { 70 | name: tag.name, 71 | path: 'api/tags/' + tag.name + '.json' 72 | } 73 | }) 74 | }) 75 | } 76 | }, 77 | 78 | cateReduce = function (cates, name) { 79 | return cates.reduce(function (result, item) { 80 | if (!item.length) return result 81 | 82 | return result.concat(pagination(item.path, posts, { 83 | perPage: 0, 84 | data: { 85 | name: item.name, 86 | path: 'api/' + name + '/' + item.name + '.json', 87 | postlist: item.posts.map(postMap) 88 | } 89 | })) 90 | }, []) 91 | }, 92 | 93 | catesMap = function (item) { 94 | return { 95 | name: item.data.name, 96 | path: item.data.path 97 | } 98 | }, 99 | 100 | cateMap = function (item) { 101 | var itemData = item.data 102 | return { 103 | path: itemData.path, 104 | data: JSON.stringify({ 105 | name: itemData.name, 106 | postlist: itemData.postlist 107 | }) 108 | } 109 | }, 110 | 111 | apiData = [] 112 | 113 | if (restful.site) { 114 | apiData.push({ 115 | path: 'api/site.json', 116 | data: JSON.stringify(restful.site instanceof Array ? _pick(cfg, restful.site) : cfg) 117 | }) 118 | } 119 | 120 | if (restful.theme) { 121 | apiData.push({ 122 | path: 'api/theme.json', 123 | data: JSON.stringify(restful.theme instanceof Array ? _pick(themecfg, restful.theme) : themecfg) 124 | }) 125 | } 126 | 127 | if (restful.categories) { 128 | var cates = cateReduce(site.categories, 'categories') 129 | 130 | if (cates.length) { 131 | apiData.push({ 132 | path: 'api/categories.json', 133 | data: JSON.stringify(cates.map(catesMap)) 134 | }) 135 | 136 | apiData = apiData.concat(cates.map(cateMap)) 137 | } 138 | } 139 | 140 | if (restful.tags) { 141 | var tags = cateReduce(site.tags, 'tags') 142 | 143 | if (tags.length) { 144 | apiData.push({ 145 | path: 'api/tags.json', 146 | data: JSON.stringify(tags.map(catesMap)) 147 | }) 148 | 149 | apiData = apiData.concat(tags.map(cateMap)) 150 | } 151 | } 152 | 153 | var postlist = posts.map(postMap) 154 | 155 | if (restful.posts_size > 0) { 156 | var page_posts = [], 157 | i = 0, 158 | len = postlist.length, 159 | ps = restful.posts_size, 160 | pc = Math.ceil(len / ps) 161 | 162 | for (; i < len; i += ps) { 163 | page_posts.push({ 164 | path: 'api/posts/' + Math.ceil((i + 1) / ps) + '.json', 165 | data: JSON.stringify({ 166 | total: len, 167 | pageSize: ps, 168 | pageCount: pc, 169 | data: postlist.slice(i, i + ps) 170 | }) 171 | }) 172 | } 173 | 174 | apiData.push({ 175 | path: 'api/posts.json', 176 | data: page_posts[0].data 177 | }) 178 | 179 | apiData = apiData.concat(page_posts) 180 | } else { 181 | apiData.push({ 182 | path: 'api/posts.json', 183 | data: JSON.stringify(postlist) 184 | }) 185 | } 186 | 187 | if (restful.post) { 188 | apiData = apiData.concat(posts.map(function (post) { 189 | var path = 'api/articles/' + post.slug + '.json' 190 | return { 191 | path: path, 192 | data: JSON.stringify({ 193 | title: post.title, 194 | slug: post.slug, 195 | date: post.date, 196 | updated: post.updated, 197 | comments: post.comments, 198 | excerpt: post.excerpt, 199 | keywords: cfg.keyword, 200 | content: post.content, 201 | thumbnail: post.thumbnail, 202 | primarycolor: post.primarycolor, 203 | accentcolor: post.accentcolor, 204 | categories: post.categories.map(function (cat) { 205 | return { 206 | name: cat.name, 207 | path: 'api/categories/' + cat.name + '.json' 208 | } 209 | }), 210 | tags: post.tags.map(function (tag) { 211 | return { 212 | name: tag.name, 213 | path: 'api/tags/' + tag.name + '.json' 214 | } 215 | }) 216 | }) 217 | } 218 | })) 219 | } 220 | 221 | let pages = site.pages 222 | 223 | if (restful.page) { 224 | apiData = apiData.concat(pages.map(function (page) { 225 | var path = 'api/page/' + page.layout + '.json' 226 | return { 227 | path: path, 228 | data: JSON.stringify({ 229 | page: page, 230 | title: page.title, 231 | date: page.date, 232 | updated: page.updated, 233 | comments: page.comments, 234 | path: path, 235 | content: page.content, 236 | thumbnail: page.thumbnail, 237 | primarycolor: page.primarycolor, 238 | accentcolor: page.accentcolor, 239 | background: page.background, 240 | toc: page.toc, 241 | html: page.html 242 | }) 243 | } 244 | })) 245 | } 246 | 247 | const pageMaps = {} 248 | if (themecfg && themecfg.Splash) { 249 | themecfg.Splash 250 | .filter((item) => item.type === 'page') 251 | .forEach((item) => { 252 | pageMaps[item.link] = item 253 | }) 254 | } 255 | 256 | if (themecfg && themecfg.Drawer) { 257 | themecfg.Drawer 258 | .filter((item) => item.type === 'page') 259 | .forEach((item) => { 260 | pageMaps[item.link] = item 261 | }) 262 | } 263 | 264 | apiData.push({ 265 | path: 'api/pages.json', 266 | data: JSON.stringify(Object.values(pageMaps)) 267 | }) 268 | 269 | return apiData 270 | } 271 | -------------------------------------------------------------------------------- /hexo/source/css/app.css: -------------------------------------------------------------------------------- 1 | a{color:#8b80f9}a:hover{color:#fc7753}pre{border-left-color:#8b80f9}code,pre{font-family:source code pro,Consolas,Lucida Console,Monaco,Andale Mono,DejaVu Sans Mono,Courier New,monospace}body,h1,h2,h3,h4,h5,h6{font-weight:400}body{padding:0;margin:0;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;font-family:source sans pro,Ubuntu,Segoe UI,Roboto,Oxygen,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Source Han Sans CN,Source Han Sans SC,Microsoft YaHei,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,WenQuanYi Zen Hei Sharp,Arial,sans-serif}.nav-container{position:fixed;z-index:100}.nav-container .entry{background-color:rgba(96,108,118,.3);margin-top:1em;font-size:3rem;width:4rem;height:4rem;-webkit-transition:.4s ease;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;top:0;left:0;position:fixed;z-index:-1;transition:.4s ease}.nav-container .entry.active,.nav-container .entry:hover{background-color:#606c76;color:#fff}.nav-container .entry.active:hover{color:#fc7753}.nav-container .nav{display:-ms-flexbox;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;display:flex;background-color:rgba(0,0,0,.8);width:100vw;height:100vh}.nav-container .nav .item{font-size:4rem;font-family:Comfortaa,source sans pro,Ubuntu,Segoe UI,Roboto,Oxygen,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Source Han Sans CN,Source Han Sans SC,Microsoft YaHei,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,WenQuanYi Zen Hei Sharp,Arial,sans-serif;cursor:pointer;padding-left:1em;padding-right:1em;color:hsla(0,0%,100%,.8)}@media only screen and (max-height:400px){.nav-container .nav .item{font-size:3rem}}.nav-container .nav .item:hover{color:#fff;text-shadow:0 0 2px #fff}.container{padding-top:3.5rem}.article .title{margin-bottom:.5rem}.article hr.splitline{margin-top:0}.article .content h1:before,.article .content h2:before,.article .content h3:before,.article .content h4:before,.article .content h5:before,.article .content h6:before{content:"# ";color:#8b80f9}.article .content img{display:block;margin:auto;max-width:75%;min-width:35%}.article .content code{overflow-wrap:break-word;white-space:unset}.article .content p.caption{font-size:.8em;color:#606c76;display:-ms-flexbox;display:flex}.article .content p.caption,.loading{-ms-flex-pack:center;justify-content:center}.loading{width:100%;padding:1em;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center}.loading .pacman>div:first-of-type,.loading .pacman>div:nth-child(2){border-top-color:#8b80f9;border-left-color:#8b80f9;border-bottom-color:#8b80f9}.loading .pacman>div:nth-child(3),.loading .pacman>div:nth-child(4),.loading .pacman>div:nth-child(5),.loading .pacman>div:nth-child(6){background-color:#8b80f9}section.splash{width:100vw;height:100vh}section.splash .shadow{background-color:rgba(0,0,0,.7);width:100%;height:100%}section.splash .body{background-image:url(/img/background.jpg);background-size:cover;background-position:50%;width:100%;height:100%}section.splash .content{font-family:Comfortaa,source sans pro,Ubuntu,Segoe UI,Roboto,Oxygen,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Source Han Sans CN,Source Han Sans SC,Microsoft YaHei,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,WenQuanYi Zen Hei Sharp,Arial,sans-serif;width:100%;height:100%;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;-ms-flex-direction:column;flex-direction:column}section.splash .content .title{margin-bottom:1.4rem;color:hsla(0,0%,100%,.8);font-size:6rem}section.splash .content .subtitle{margin-bottom:1rem;color:hsla(0,0%,100%,.7)}section.splash .content nav{display:-ms-flexbox;display:flex}@media only screen and (max-width:600px){section.splash .content nav{-ms-flex-direction:column;flex-direction:column}}section.splash .content nav a{color:#fff;font-size:1.8em;padding:0 .6em 1em;color:hsla(0,0%,100%,.65);transition:all .6s;cursor:pointer;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-pack:center;justify-content:center}section.splash .content nav a:hover{color:#fff;text-shadow:0 0 2px #fff}.blog-item .tag,.blog-item .title,.hover-highlight{transition:color .2s ease}.blog-item .tag:hover,.blog-item .title:hover,.hover-highlight:hover{color:#fc7753}.blog-item{margin-bottom:2em}.blog-item .title{margin-bottom:.5rem;color:#8b80f9;cursor:pointer}.blog-item .time{color:#606c76}.blog-item .tag{color:#606c76;cursor:pointer;padding-left:.4em}.hover-highlight{transition:color .2s ease}.hover-highlight:hover{color:#fc7753}span.image-caption{display:block;text-align:center;font-size:90%;color:grey}.tags-container{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.tags-container .tag{border:1px solid #8b80f9;box-shadow:0 0 .2em #8b80f9;border-radius:2em;padding:0 1em;margin-top:.5em;margin-right:.5em;cursor:pointer;transition:.2s ease;display:inline-block}.tags-container .tag:last-child{margin-right:0}.tags-container .tag.active,.tags-container .tag:hover{border:1px solid #fc7753;box-shadow:0 0 .2em #fc7753}.tags-container .tag.active{color:#fc7753} -------------------------------------------------------------------------------- /hexo/source/css/app.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./src/App.vue","webpack:///./src/components/Nav.vue","webpack:///./src/components/Container.vue","webpack:///./src/components/ArticleItem.vue","webpack:///./src/components/Loading.vue","webpack:///./src/views/Splash.vue","webpack:///./src/components/PostItem.vue","webpack:///./src/views/Tags.vue"],"names":[],"mappings":"AACA,iBACE,kCACA,yBAA4B,CAE9B,uBACI,aAAe,CAEnB,mBACE,cACA,kBACA,cACA,UAAY,CAEd,EACE,aAAe,CAEjB,QACI,aAAe,CAEnB,IACE,yBAA2B,CAE7B,SACE,6GAAoI,CAKtI,uBAFE,eAAiB,CASlB,KALC,UACA,SACA,kCACA,mCACA,mSAAkW,CClCpW,iBACE,kCACA,yBAA4B,CAE9B,uBACI,aAAe,CAEnB,mBACE,cACA,kBACA,cACA,UAAY,CAEd,eACE,eACA,WAAa,CAEf,sBACI,qCACA,eACA,eACA,WACA,YACA,4BAEA,oBACA,oBACA,aACA,wBACI,qBACI,uBACR,yBACI,sBACI,mBACR,MACA,OACA,eACA,WACA,mBAAsB,CAE1B,yDACM,yBACA,UAAa,CAEnB,mCACM,aAAe,CAErB,oBACI,oBACA,oBAEA,4BACA,6BACI,0BACI,sBACR,yBACI,sBACI,mBACR,wBACI,qBACI,uBACR,aACA,gCACA,YACA,YAAc,CAElB,0BACM,eACA,8SACA,eACA,iBACA,kBACA,wBAAgC,CAEtC,0CACA,0BACU,cAAgB,CACzB,CAED,gCACQ,WACA,wBAA0B,CCjFlC,WACE,kBAAoB,CCDtB,iBACE,kCACA,yBAA4B,CAE9B,uBACI,aAAe,CAEnB,mBACE,cACA,kBACA,cACA,UAAY,CAEd,gBACE,mBAAsB,CAExB,sBACE,YAAc,CAEhB,wKACE,aACA,aAAe,CAEjB,sBACE,cACA,YACA,cACA,aAAe,CAEjB,uBACE,yBACA,iBAAmB,CAErB,4BACE,eACA,cACA,oBACA,oBACA,aACA,wBACI,qBACI,sBAAwB,CCzClC,iBACE,kCACA,yBAA4B,CAE9B,uBACI,aAAe,CAEnB,mBACE,cACA,kBACA,cACA,UAAY,CAEd,SACE,WACA,YACA,2BACA,2BACA,oBACA,wBACI,qBACI,uBACR,yBACI,sBACI,kBAAoB,CAE9B,qEACI,yBACA,0BACA,2BAA6B,CAEjC,wIACI,wBAA0B,CChC9B,iBACE,kCACA,yBAA4B,CAE9B,uBACI,aAAe,CAEnB,mBACE,cACA,kBACA,cACA,UAAY,CAEd,eACE,YACA,YAAc,CAEhB,uBACI,gCACA,WACA,WAAa,CAEjB,qBACI,+CACA,sBACA,wBACA,WACA,WAAa,CAEjB,wBACI,8SACA,WACA,YACA,oBACA,oBACA,aACA,yBACI,sBACI,mBACR,wBACI,qBACI,uBACR,4BACA,6BACI,0BACI,qBAAuB,CAEnC,+BACM,qBACA,yBACA,cAAgB,CAEtB,kCACM,mBACA,wBAAgC,CAEtC,4BACM,oBACA,oBACA,YAAc,CAEpB,yCACA,4BACU,4BACA,6BACI,0BACI,qBAAuB,CACxC,CAED,8BACQ,WACA,gBACA,mBACA,0BACA,2BACA,mBACA,eACA,2BACA,2BACA,oBACA,wBACI,qBACI,sBAAwB,CAExC,oCACU,WACA,oBCtFV,mDACE,kCACA,yBAA4B,CAE9B,qEACI,aAAe,CAEnB,mBACE,cACA,kBACA,cACA,UAAY,CAEd,WACE,iBAAmB,CAErB,kBACI,oBACA,cACA,cAAgB,CAEpB,iBACI,aAAe,CAEnB,gBACI,cACA,eACA,iBAAoB,CC3BxB,iBACE,kCACA,yBAA4B,CAE9B,uBACI,aAAe,CAEnB,mBACE,cACA,kBACA,cACA,UAAY,CAEd,gBACE,oBACA,oBACA,aACA,mBACI,cAAgB,CAEtB,qBACI,yBACA,oCACQ,4BACR,kBACA,cACA,gBACA,kBACA,eACA,4BACA,oBACA,oBAAsB,CAE1B,gCACM,cAAgB,CAEtB,uDACM,yBACA,oCACQ,2BAAkC,CAEhD,4BACM,aAAe","file":"css/app.css","sourcesContent":["\n.hover-highlight {\n -webkit-transition: 0.2s ease color;\n transition: 0.2s ease color;\n}\n.hover-highlight:hover {\n color: #FC7753;\n}\nspan.image-caption {\n display: block;\n text-align: center;\n font-size: 90%;\n color: grey;\n}\na {\n color: #8B80F9;\n}\na:hover {\n color: #FC7753;\n}\npre {\n border-left-color: #8B80F9;\n}\npre, code {\n font-family: \"source code pro\", \"Consolas\", \"Lucida Console\", \"Monaco\", \"Andale Mono\", \"DejaVu Sans Mono\", \"Courier New\", monospace;\n}\nh1, h2, h3, h4, h5, h6 {\n font-weight: 400;\n}\nbody {\n font-weight: 400;\n padding: 0;\n margin: 0;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n font-family: \"source sans pro\", \"Ubuntu\", \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", \"Helvetica\", \"PingFang SC\", \"Hiragino Sans GB\", \"Source Han Sans CN\", \"Source Han Sans SC\", \"Microsoft YaHei\", \"Wenquanyi Micro Hei\", \"WenQuanYi Zen Hei\", \"ST Heiti\", SimHei, \"WenQuanYi Zen Hei Sharp\", \"Arial\", sans-serif;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/App.vue","\n.hover-highlight {\n -webkit-transition: 0.2s ease color;\n transition: 0.2s ease color;\n}\n.hover-highlight:hover {\n color: #FC7753;\n}\nspan.image-caption {\n display: block;\n text-align: center;\n font-size: 90%;\n color: grey;\n}\n.nav-container {\n position: fixed;\n z-index: 100;\n}\n.nav-container .entry {\n background-color: rgba(96, 108, 118, 0.3);\n margin-top: 1em;\n font-size: 3rem;\n width: 4rem;\n height: 4rem;\n -webkit-transition: 0.4s ease;\n transition: 0.4s ease;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n top: 0;\n left: 0;\n position: fixed;\n z-index: -1;\n transition: 0.4s ease;\n}\n.nav-container .entry:hover, .nav-container .entry.active {\n background-color: #606c76;\n color: white;\n}\n.nav-container .entry.active:hover {\n color: #FC7753;\n}\n.nav-container .nav {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n display: flex;\n background-color: rgba(0, 0, 0, 0.8);\n width: 100vw;\n height: 100vh;\n}\n.nav-container .nav .item {\n font-size: 4rem;\n font-family: \"Comfortaa\", \"source sans pro\", \"Ubuntu\", \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", \"Helvetica\", \"PingFang SC\", \"Hiragino Sans GB\", \"Source Han Sans CN\", \"Source Han Sans SC\", \"Microsoft YaHei\", \"Wenquanyi Micro Hei\", \"WenQuanYi Zen Hei\", \"ST Heiti\", SimHei, \"WenQuanYi Zen Hei Sharp\", \"Arial\", sans-serif;\n cursor: pointer;\n padding-left: 1em;\n padding-right: 1em;\n color: rgba(255, 255, 255, 0.8);\n}\n@media only screen and (max-height: 400px) {\n.nav-container .nav .item {\n font-size: 3rem;\n}\n}\n.nav-container .nav .item:hover {\n color: white;\n text-shadow: 0 0 2px #fff;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/Nav.vue","\n.container {\n padding-top: 3.5rem;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/Container.vue","\n.hover-highlight {\n -webkit-transition: 0.2s ease color;\n transition: 0.2s ease color;\n}\n.hover-highlight:hover {\n color: #FC7753;\n}\nspan.image-caption {\n display: block;\n text-align: center;\n font-size: 90%;\n color: grey;\n}\n.article .title {\n margin-bottom: 0.5rem;\n}\n.article hr.splitline {\n margin-top: 0;\n}\n.article .content h1::before, .article .content h2::before, .article .content h3::before, .article .content h4::before, .article .content h5::before, .article .content h6::before {\n content: '# ';\n color: #8B80F9;\n}\n.article .content img {\n display: block;\n margin: auto;\n max-width: 75%;\n min-width: 35%;\n}\n.article .content code {\n overflow-wrap: break-word;\n white-space: unset;\n}\n.article .content p.caption {\n font-size: 0.8em;\n color: #606c76;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/ArticleItem.vue","\n.hover-highlight {\n -webkit-transition: 0.2s ease color;\n transition: 0.2s ease color;\n}\n.hover-highlight:hover {\n color: #FC7753;\n}\nspan.image-caption {\n display: block;\n text-align: center;\n font-size: 90%;\n color: grey;\n}\n.loading {\n width: 100%;\n padding: 1em;\n display: -webkit-inline-box;\n display: -ms-inline-flexbox;\n display: inline-flex;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n}\n.loading .pacman > div:first-of-type, .loading .pacman > div:nth-child(2) {\n border-top-color: #8B80F9;\n border-left-color: #8B80F9;\n border-bottom-color: #8B80F9;\n}\n.loading .pacman > div:nth-child(3), .loading .pacman > div:nth-child(4), .loading .pacman > div:nth-child(5), .loading .pacman > div:nth-child(6) {\n background-color: #8B80F9;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/Loading.vue","\n.hover-highlight {\n -webkit-transition: 0.2s ease color;\n transition: 0.2s ease color;\n}\n.hover-highlight:hover {\n color: #FC7753;\n}\nspan.image-caption {\n display: block;\n text-align: center;\n font-size: 90%;\n color: grey;\n}\nsection.splash {\n width: 100vw;\n height: 100vh;\n}\nsection.splash .shadow {\n background-color: rgba(0, 0, 0, 0.7);\n width: 100%;\n height: 100%;\n}\nsection.splash .body {\n background-image: url(../assets/background.jpg);\n background-size: cover;\n background-position: center;\n width: 100%;\n height: 100%;\n}\nsection.splash .content {\n font-family: \"Comfortaa\", \"source sans pro\", \"Ubuntu\", \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", \"Helvetica\", \"PingFang SC\", \"Hiragino Sans GB\", \"Source Han Sans CN\", \"Source Han Sans SC\", \"Microsoft YaHei\", \"Wenquanyi Micro Hei\", \"WenQuanYi Zen Hei\", \"ST Heiti\", SimHei, \"WenQuanYi Zen Hei Sharp\", \"Arial\", sans-serif;\n width: 100%;\n height: 100%;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n}\nsection.splash .content .title {\n margin-bottom: 1.4rem;\n color: rgba(255, 255, 255, 0.8);\n font-size: 6rem;\n}\nsection.splash .content .subtitle {\n margin-bottom: 1rem;\n color: rgba(255, 255, 255, 0.7);\n}\nsection.splash .content nav {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n}\n@media only screen and (max-width: 600px) {\nsection.splash .content nav {\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n}\nsection.splash .content nav a {\n color: white;\n font-size: 1.8em;\n padding: 0 0.6em 1em;\n color: rgba(255, 255, 255, 0.65);\n -webkit-transition: all 0.6s;\n transition: all 0.6s;\n cursor: pointer;\n display: -webkit-inline-box;\n display: -ms-inline-flexbox;\n display: inline-flex;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n}\nsection.splash .content nav a:hover {\n color: white;\n text-shadow: 0 0 2px #fff;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/views/Splash.vue","\n.hover-highlight, .blog-item .title, .blog-item .tag {\n -webkit-transition: 0.2s ease color;\n transition: 0.2s ease color;\n}\n.hover-highlight:hover, .blog-item .title:hover, .blog-item .tag:hover {\n color: #FC7753;\n}\nspan.image-caption {\n display: block;\n text-align: center;\n font-size: 90%;\n color: grey;\n}\n.blog-item {\n margin-bottom: 2em;\n}\n.blog-item .title {\n margin-bottom: 0.5rem;\n color: #8B80F9;\n cursor: pointer;\n}\n.blog-item .time {\n color: #606c76;\n}\n.blog-item .tag {\n color: #606c76;\n cursor: pointer;\n padding-left: 0.4em;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/PostItem.vue","\n.hover-highlight {\n -webkit-transition: 0.2s ease color;\n transition: 0.2s ease color;\n}\n.hover-highlight:hover {\n color: #FC7753;\n}\nspan.image-caption {\n display: block;\n text-align: center;\n font-size: 90%;\n color: grey;\n}\n.tags-container {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n}\n.tags-container .tag {\n border: 1px solid #8B80F9;\n -webkit-box-shadow: 0px 0px 0.2em #8B80F9;\n box-shadow: 0px 0px 0.2em #8B80F9;\n border-radius: 2em;\n padding: 0 1em;\n margin-top: 0.5em;\n margin-right: 0.5em;\n cursor: pointer;\n -webkit-transition: 0.2s ease;\n transition: 0.2s ease;\n display: inline-block;\n}\n.tags-container .tag:last-child {\n margin-right: 0;\n}\n.tags-container .tag:hover, .tags-container .tag.active {\n border: 1px solid #FC7753;\n -webkit-box-shadow: 0px 0px 0.2em #FC7753;\n box-shadow: 0px 0px 0.2em #FC7753;\n}\n.tags-container .tag.active {\n color: #FC7753;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/views/Tags.vue"],"sourceRoot":""} -------------------------------------------------------------------------------- /hexo/source/css/atom-one-light.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Atom One Light by Daniel Gamage 4 | Original One Light Syntax theme from https://github.com/atom/one-light-syntax 5 | 6 | base: #fafafa 7 | mono-1: #383a42 8 | mono-2: #686b77 9 | mono-3: #a0a1a7 10 | hue-1: #0184bb 11 | hue-2: #4078f2 12 | hue-3: #a626a4 13 | hue-4: #50a14f 14 | hue-5: #e45649 15 | hue-5-2: #c91243 16 | hue-6: #986801 17 | hue-6-2: #c18401 18 | 19 | */ 20 | 21 | .hljs { 22 | display: block; 23 | overflow-x: auto; 24 | padding: 0.5em; 25 | color: #383a42; 26 | background: #fafafa; 27 | } 28 | 29 | .hljs-comment, 30 | .hljs-quote { 31 | color: #a0a1a7; 32 | font-style: italic; 33 | } 34 | 35 | .hljs-doctag, 36 | .hljs-keyword, 37 | .hljs-formula { 38 | color: #a626a4; 39 | } 40 | 41 | .hljs-section, 42 | .hljs-name, 43 | .hljs-selector-tag, 44 | .hljs-deletion, 45 | .hljs-subst { 46 | color: #e45649; 47 | } 48 | 49 | .hljs-literal { 50 | color: #0184bb; 51 | } 52 | 53 | .hljs-string, 54 | .hljs-regexp, 55 | .hljs-addition, 56 | .hljs-attribute, 57 | .hljs-meta-string { 58 | color: #50a14f; 59 | } 60 | 61 | .hljs-built_in, 62 | .hljs-class .hljs-title { 63 | color: #c18401; 64 | } 65 | 66 | .hljs-attr, 67 | .hljs-variable, 68 | .hljs-template-variable, 69 | .hljs-type, 70 | .hljs-selector-class, 71 | .hljs-selector-attr, 72 | .hljs-selector-pseudo, 73 | .hljs-number { 74 | color: #986801; 75 | } 76 | 77 | .hljs-symbol, 78 | .hljs-bullet, 79 | .hljs-link, 80 | .hljs-meta, 81 | .hljs-selector-id, 82 | .hljs-title { 83 | color: #4078f2; 84 | } 85 | 86 | .hljs-emphasis { 87 | font-style: italic; 88 | } 89 | 90 | .hljs-strong { 91 | font-weight: bold; 92 | } 93 | 94 | .hljs-link { 95 | text-decoration: underline; 96 | } 97 | -------------------------------------------------------------------------------- /hexo/source/css/comfortaa.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Comfortaa'; 3 | src: url('../fonts/Comfortaa-Regular.ttf'); 4 | } 5 | -------------------------------------------------------------------------------- /hexo/source/css/milligram.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Milligram v1.3.0 3 | * https://milligram.github.io 4 | * 5 | * Copyright (c) 2017 CJ Patoilo 6 | * Licensed under the MIT license 7 | */ 8 | 9 | *,*:after,*:before{box-sizing:inherit}html{box-sizing:border-box;font-size:62.5%}body{color:#606c76;font-family:'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;font-size:1.6em;font-weight:300;letter-spacing:.01em;line-height:1.6}blockquote{border-left:0.3rem solid #d1d1d1;margin-left:0;margin-right:0;padding:1rem 1.5rem}blockquote *:last-child{margin-bottom:0}.button,button,input[type='button'],input[type='reset'],input[type='submit']{background-color:#9b4dca;border:0.1rem solid #9b4dca;border-radius:.4rem;color:#fff;cursor:pointer;display:inline-block;font-size:1.1rem;font-weight:700;height:3.8rem;letter-spacing:.1rem;line-height:3.8rem;padding:0 3.0rem;text-align:center;text-decoration:none;text-transform:uppercase;white-space:nowrap}.button:focus,.button:hover,button:focus,button:hover,input[type='button']:focus,input[type='button']:hover,input[type='reset']:focus,input[type='reset']:hover,input[type='submit']:focus,input[type='submit']:hover{background-color:#606c76;border-color:#606c76;color:#fff;outline:0}.button[disabled],button[disabled],input[type='button'][disabled],input[type='reset'][disabled],input[type='submit'][disabled]{cursor:default;opacity:.5}.button[disabled]:focus,.button[disabled]:hover,button[disabled]:focus,button[disabled]:hover,input[type='button'][disabled]:focus,input[type='button'][disabled]:hover,input[type='reset'][disabled]:focus,input[type='reset'][disabled]:hover,input[type='submit'][disabled]:focus,input[type='submit'][disabled]:hover{background-color:#9b4dca;border-color:#9b4dca}.button.button-outline,button.button-outline,input[type='button'].button-outline,input[type='reset'].button-outline,input[type='submit'].button-outline{background-color:transparent;color:#9b4dca}.button.button-outline:focus,.button.button-outline:hover,button.button-outline:focus,button.button-outline:hover,input[type='button'].button-outline:focus,input[type='button'].button-outline:hover,input[type='reset'].button-outline:focus,input[type='reset'].button-outline:hover,input[type='submit'].button-outline:focus,input[type='submit'].button-outline:hover{background-color:transparent;border-color:#606c76;color:#606c76}.button.button-outline[disabled]:focus,.button.button-outline[disabled]:hover,button.button-outline[disabled]:focus,button.button-outline[disabled]:hover,input[type='button'].button-outline[disabled]:focus,input[type='button'].button-outline[disabled]:hover,input[type='reset'].button-outline[disabled]:focus,input[type='reset'].button-outline[disabled]:hover,input[type='submit'].button-outline[disabled]:focus,input[type='submit'].button-outline[disabled]:hover{border-color:inherit;color:#9b4dca}.button.button-clear,button.button-clear,input[type='button'].button-clear,input[type='reset'].button-clear,input[type='submit'].button-clear{background-color:transparent;border-color:transparent;color:#9b4dca}.button.button-clear:focus,.button.button-clear:hover,button.button-clear:focus,button.button-clear:hover,input[type='button'].button-clear:focus,input[type='button'].button-clear:hover,input[type='reset'].button-clear:focus,input[type='reset'].button-clear:hover,input[type='submit'].button-clear:focus,input[type='submit'].button-clear:hover{background-color:transparent;border-color:transparent;color:#606c76}.button.button-clear[disabled]:focus,.button.button-clear[disabled]:hover,button.button-clear[disabled]:focus,button.button-clear[disabled]:hover,input[type='button'].button-clear[disabled]:focus,input[type='button'].button-clear[disabled]:hover,input[type='reset'].button-clear[disabled]:focus,input[type='reset'].button-clear[disabled]:hover,input[type='submit'].button-clear[disabled]:focus,input[type='submit'].button-clear[disabled]:hover{color:#9b4dca}code{background:#f4f5f6;border-radius:.4rem;font-size:86%;margin:0 .2rem;padding:.2rem .5rem;white-space:nowrap}pre{background:#f4f5f6;border-left:0.3rem solid #9b4dca;overflow-y:hidden}pre>code{border-radius:0;display:block;padding:1rem 1.5rem;white-space:pre}hr{border:0;border-top:0.1rem solid #f4f5f6;margin:3.0rem 0}input[type='email'],input[type='number'],input[type='password'],input[type='search'],input[type='tel'],input[type='text'],input[type='url'],textarea,select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;border:0.1rem solid #d1d1d1;border-radius:.4rem;box-shadow:none;box-sizing:inherit;height:3.8rem;padding:.6rem 1.0rem;width:100%}input[type='email']:focus,input[type='number']:focus,input[type='password']:focus,input[type='search']:focus,input[type='tel']:focus,input[type='text']:focus,input[type='url']:focus,textarea:focus,select:focus{border-color:#9b4dca;outline:0}select{background:url('data:image/svg+xml;utf8,') center right no-repeat;padding-right:3.0rem}select:focus{background-image:url('data:image/svg+xml;utf8,')}textarea{min-height:6.5rem}label,legend{display:block;font-size:1.6rem;font-weight:700;margin-bottom:.5rem}fieldset{border-width:0;padding:0}input[type='checkbox'],input[type='radio']{display:inline}.label-inline{display:inline-block;font-weight:normal;margin-left:.5rem}.container{margin:0 auto;max-width:112.0rem;padding:0 2.0rem;position:relative;width:100%}.row{display:flex;flex-direction:column;padding:0;width:100%}.row.row-no-padding{padding:0}.row.row-no-padding>.column{padding:0}.row.row-wrap{flex-wrap:wrap}.row.row-top{align-items:flex-start}.row.row-bottom{align-items:flex-end}.row.row-center{align-items:center}.row.row-stretch{align-items:stretch}.row.row-baseline{align-items:baseline}.row .column{display:block;flex:1 1 auto;margin-left:0;max-width:100%;width:100%}.row .column.column-offset-10{margin-left:10%}.row .column.column-offset-20{margin-left:20%}.row .column.column-offset-25{margin-left:25%}.row .column.column-offset-33,.row .column.column-offset-34{margin-left:33.3333%}.row .column.column-offset-50{margin-left:50%}.row .column.column-offset-66,.row .column.column-offset-67{margin-left:66.6666%}.row .column.column-offset-75{margin-left:75%}.row .column.column-offset-80{margin-left:80%}.row .column.column-offset-90{margin-left:90%}.row .column.column-10{flex:0 0 10%;max-width:10%}.row .column.column-20{flex:0 0 20%;max-width:20%}.row .column.column-25{flex:0 0 25%;max-width:25%}.row .column.column-33,.row .column.column-34{flex:0 0 33.3333%;max-width:33.3333%}.row .column.column-40{flex:0 0 40%;max-width:40%}.row .column.column-50{flex:0 0 50%;max-width:50%}.row .column.column-60{flex:0 0 60%;max-width:60%}.row .column.column-66,.row .column.column-67{flex:0 0 66.6666%;max-width:66.6666%}.row .column.column-75{flex:0 0 75%;max-width:75%}.row .column.column-80{flex:0 0 80%;max-width:80%}.row .column.column-90{flex:0 0 90%;max-width:90%}.row .column .column-top{align-self:flex-start}.row .column .column-bottom{align-self:flex-end}.row .column .column-center{-ms-grid-row-align:center;align-self:center}@media (min-width: 40rem){.row{flex-direction:row;margin-left:-1.0rem;width:calc(100% + 2.0rem)}.row .column{margin-bottom:inherit;padding:0 1.0rem}}a{color:#9b4dca;text-decoration:none}a:focus,a:hover{color:#606c76}dl,ol,ul{list-style:none;margin-top:0;padding-left:0}dl dl,dl ol,dl ul,ol dl,ol ol,ol ul,ul dl,ul ol,ul ul{font-size:90%;margin:1.5rem 0 1.5rem 3.0rem}ol{list-style:decimal inside}ul{list-style:circle inside}.button,button,dd,dt,li{margin-bottom:1.0rem}fieldset,input,select,textarea{margin-bottom:1.5rem}blockquote,dl,figure,form,ol,p,pre,table,ul{margin-bottom:2.5rem}table{border-spacing:0;width:100%}td,th{border-bottom:0.1rem solid #e1e1e1;padding:1.2rem 1.5rem;text-align:left}td:first-child,th:first-child{padding-left:0}td:last-child,th:last-child{padding-right:0}b,strong{font-weight:bold}p{margin-top:0}h1,h2,h3,h4,h5,h6{font-weight:300;letter-spacing:-.1rem;margin-bottom:2.0rem;margin-top:0}h1{font-size:4.6rem;line-height:1.2}h2{font-size:3.6rem;line-height:1.25}h3{font-size:2.8rem;line-height:1.3}h4{font-size:2.2rem;letter-spacing:-.08rem;line-height:1.35}h5{font-size:1.8rem;letter-spacing:-.05rem;line-height:1.5}h6{font-size:1.6rem;letter-spacing:0;line-height:1.4}img{max-width:100%}.clearfix:after{clear:both;content:' ';display:table}.float-left{float:left}.float-right{float:right} 10 | 11 | /*# sourceMappingURL=milligram.min.css.map */ 12 | -------------------------------------------------------------------------------- /hexo/source/css/nprogress.css: -------------------------------------------------------------------------------- 1 | /* Make clicks pass-through */ 2 | #nprogress { 3 | pointer-events: none; 4 | } 5 | 6 | #nprogress .bar { 7 | background: #29d; 8 | 9 | position: fixed; 10 | z-index: 1031; 11 | top: 0; 12 | left: 0; 13 | 14 | width: 100%; 15 | height: 2px; 16 | } 17 | 18 | /* Fancy blur effect */ 19 | #nprogress .peg { 20 | display: block; 21 | position: absolute; 22 | right: 0px; 23 | width: 100px; 24 | height: 100%; 25 | box-shadow: 0 0 10px #29d, 0 0 5px #29d; 26 | opacity: 1.0; 27 | 28 | -webkit-transform: rotate(3deg) translate(0px, -4px); 29 | -ms-transform: rotate(3deg) translate(0px, -4px); 30 | transform: rotate(3deg) translate(0px, -4px); 31 | } 32 | 33 | /* Remove these to get rid of the spinner */ 34 | #nprogress .spinner { 35 | display: block; 36 | position: fixed; 37 | z-index: 1031; 38 | top: 15px; 39 | right: 15px; 40 | } 41 | 42 | #nprogress .spinner-icon { 43 | width: 18px; 44 | height: 18px; 45 | box-sizing: border-box; 46 | 47 | border: solid 2px transparent; 48 | border-top-color: #29d; 49 | border-left-color: #29d; 50 | border-radius: 50%; 51 | 52 | -webkit-animation: nprogress-spinner 400ms linear infinite; 53 | animation: nprogress-spinner 400ms linear infinite; 54 | } 55 | 56 | .nprogress-custom-parent { 57 | overflow: hidden; 58 | position: relative; 59 | } 60 | 61 | .nprogress-custom-parent #nprogress .spinner, 62 | .nprogress-custom-parent #nprogress .bar { 63 | position: absolute; 64 | } 65 | 66 | @-webkit-keyframes nprogress-spinner { 67 | 0% { -webkit-transform: rotate(0deg); } 68 | 100% { -webkit-transform: rotate(360deg); } 69 | } 70 | @keyframes nprogress-spinner { 71 | 0% { transform: rotate(0deg); } 72 | 100% { transform: rotate(360deg); } 73 | } 74 | -------------------------------------------------------------------------------- /hexo/source/css/source-sans-pro.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Source Sans Pro'; 4 | src: url('../fonts/SourceSansPro-Regular.ttf'); 5 | } 6 | -------------------------------------------------------------------------------- /hexo/source/fonts/Comfortaa-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lazzzis/hexo-theme-only/cffdd674de3fb8403292c180d45262535e78b3be/hexo/source/fonts/Comfortaa-Regular.ttf -------------------------------------------------------------------------------- /hexo/source/fonts/SourceSansPro-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lazzzis/hexo-theme-only/cffdd674de3fb8403292c180d45262535e78b3be/hexo/source/fonts/SourceSansPro-Regular.ttf -------------------------------------------------------------------------------- /hexo/source/fonts/ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lazzzis/hexo-theme-only/cffdd674de3fb8403292c180d45262535e78b3be/hexo/source/fonts/ionicons.ttf -------------------------------------------------------------------------------- /hexo/source/img/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lazzzis/hexo-theme-only/cffdd674de3fb8403292c180d45262535e78b3be/hexo/source/img/background.jpg -------------------------------------------------------------------------------- /hexo/source/index.html: -------------------------------------------------------------------------------- 1 | hexo-theme-only
-------------------------------------------------------------------------------- /hexo/source/js/app.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([1],[,,,,,,,,,,,,,function(t,e,n){function i(t){n(145)}var a=n(0)(n(88),n(172),i,null,null);t.exports=a.exports},,,,,,,,,,,,,,,,,,,function(t,e,n){function i(t){n(147)}var a=n(0)(n(95),n(174),i,null,null);t.exports=a.exports},function(t,e,n){function i(t){n(150)}var a=n(0)(n(96),n(177),i,null,null);t.exports=a.exports},,,,,,function(t,e,n){"use strict";function i(){return window.location.origin+(window.location.pathname.endsWith("/")?window.location.pathname:window.location.pathname+"/")}n.d(e,"a",function(){return i})},,,,,,,,,,,,,,,,,,function(t,e,n){function i(t){n(152)}var a=n(0)(n(87),n(179),i,null,null);t.exports=a.exports},function(t,e,n){function i(t){n(138)}var a=n(0)(n(90),n(165),i,null,null);t.exports=a.exports},function(t,e,n){function i(t){n(141)}var a=n(0)(n(92),n(168),i,null,null);t.exports=a.exports},function(t,e,n){function i(t){n(148)}var a=n(0)(n(94),n(175),i,null,null);t.exports=a.exports},function(t,e,n){"use strict";var i=n(14),a=n(180),s=n(163),o=n.n(s),r=n(162),c=n.n(r),u=n(161),l=n.n(u),f=n(164),d=n.n(f);window.root&&""!==window.root?window.root.endsWith("/")||(window.root+="/"):window.root="/";var p=window.root;i.a.use(a.a);var g=[{path:p,name:"Splash",component:o.a},{path:p+"posts",name:"Posts",component:c.a},{path:p+"post/:slug",props:function(t){return t.params},name:"Post",component:l.a},{path:p+"tags",name:"Tags",props:function(){return null},component:d.a},{path:p+"tags/:tag",name:"Tag",component:d.a,props:function(t){return t.params}}];e.a=new a.a({mode:"history",routes:g})},function(t,e,n){"use strict";var i=n(2),a=n.n(i),s=n(14),o=n(5),r=n(157),c=n.n(r),u=n(84);s.a.use(o.c);var l={themeCfg:null,siteCfg:null,article:{},page:{},pages:[],post:null,posts:[],tags:null,status:200},f={posts:function(t){return t.posts},post:function(t){return t.post},article:function(t){return t.article},pages:function(t){return t.pages},page:function(t){return t.page},tags:function(t){return t.tags},themeCfg:function(t){return t.themeCfg},siteCfg:function(t){return t.siteCfg},status:function(t){return t.status}},d={updatePosts:function(t,e){var n=e.posts;t.posts=n},updatePost:function(t,e){var n=e.post;t.post=n},updateArticle:function(t,e){var n=e.article;t.article=n},updatePages:function(t,e){var n=e.pages;t.pages=n},updatePage:function(t,e){var n=e.page;t.page=n},updateTags:function(t,e){var n=e.tags;t.tags=n},updateThemeCfg:function(t,e){t.themeCfg=e},updateSiteCfg:function(t,e){t.siteCfg=e},updateStatus:function(t,e){t.status=e}},p={fetchSiteCfg:function(t){var e=t.commit;return u.a.get("api/site.json").then(function(t){var n=t.data;e("updateSiteCfg",n)})},fetchThemeCfg:function(t){var e=t.commit;return u.a.get("api/theme.json").then(function(t){var n=t.data;n.Drawer.filter(function(t){return"sitelink"===t.type||"page"===t.type}).forEach(function(t){t.link=c()(window.root,t.link)}),n.Splash.filter(function(t){return"sitelink"===t.type||"page"===t.type}).forEach(function(t){t.link=c()(window.root,t.link)}),e("updateThemeCfg",n)})},fetchPosts:function(t){var e=t.commit;return u.a.get("api/posts.json").then(function(t){var n=t.data;e("updatePosts",{posts:n.sort(function(t,e){return new Date(e.date).getTime()-new Date(t.date).getTime()})})})},fetchPost:function(t,e){var n=t.commit,i=e.slug;return u.a.get("api/articles/"+i+".json").then(function(t){var e=t.data;n("updatePost",{post:e})})},fetchPage:function(t,e){var n=t.commit,i=e.layout;return u.a.get("api/page/"+i+".json").then(function(t){var e=t.data;n("updatePage",{page:e})})},fetchPages:function(t){var e=t.commit;return u.a.get("api/pages.json").then(function(t){var n=t.data;n=n.map(function(t){return a()({},t,{link:c()(window.root,t.link)})}),e("updatePages",{pages:n})})},fetchTags:function(t){var e=t.commit;return u.a.get("api/tags.json").then(function(t){var n=t.data;e("updateTags",{tags:n})})},fetchPostsByTag:function(t,e){var n=t.commit,i=e.tag;return u.a.get("api/tags/"+i+".json").then(function(t){var e=t.data;n("updatePosts",{posts:e.postlist.sort(function(t,e){return new Date(e.date).getTime()-new Date(t.date).getTime()})})})}};e.a=new o.c.Store({actions:p,mutations:d,state:l,getters:f})},,,,function(t,e,n){function i(t){n(142)}var a=n(0)(n(86),n(169),i,null,null);t.exports=a.exports},,,,,,,,,,,,,,,,,,function(t,e,n){"use strict";var i=n(30),a=n.n(i),s=a.a.create({baseURL:window.root});e.a=s},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=n(31),a=n.n(i),s=n(14),o=n(66),r=n.n(o),c=n(61),u=n(62),l=n(64),f=n.n(l),d=n(33),p=n.n(d),g=n(32),m=n.n(g),h=n(30),v=n.n(h),_=n(65),y=n.n(_),C=n(63);n.n(C).a.attach(window.document.body),y.a.configure({speed:400}),v.a.interceptors.request.use(function(t){return y.a.start(),t},function(t){return a.a.reject(t)}),v.a.interceptors.response.use(function(t){return y.a.done(),t},function(t){return a.a.reject(t)}),s.a.config.productionTip=!1,s.a.filter("timePretty",function(t){return f.a.format(new Date(t),"YYYY - MM - DD")}),a.a.all([u.a.dispatch("fetchSiteCfg"),u.a.dispatch("fetchThemeCfg"),u.a.dispatch("fetchPages")]).then(function(){c.a.addRoutes(u.a.getters.pages.map(function(t){return{path:t.link,component:p.a,props:{layout:t.layout}}})),c.a.addRoutes([{name:"NotFound",path:window.root+"*",component:m.a}]),new s.a({el:"#app",router:c.a,store:u.a,template:"",components:{App:r.a}})})},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),a=n.n(i),s=n(160),o=n.n(s),r=n(32),c=n.n(r),u=n(5);e.default={name:"app",components:{"only-nav":o.a,"only-not-found":c.a},computed:a()({},n.i(u.a)(["status"]))}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),a=n.n(i),s=n(5),o=n(154),r=n(158),c=n.n(r),u=n(159),l=n.n(u);e.default={components:{"only-disqus":c.a,"only-livere":l.a},props:["article","config"],computed:a()({},n.i(s.a)(["themeCfg"])),mounted:function(){n.i(o.a)("article.content img",{background:"rgba(255, 255, 255, 0.7)"})}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default={}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default={props:{config:{required:!0,type:Object}},mounted:function(){this.loadDisqus()},methods:{addDisqusScript:function(){if("undefined"==typeof DISQUS){var t=document.getElementById("disqus_embed");t&&t.parent.remove(t);var e=this.disqus=document.createElement("script"),n=document.getElementsByTagName("head")[0]||document.getElementsByTagName("body")[0];e.async=!0,e.type="text/javascript",e.src="https://"+this.config.shortname+".disqus.com/embed.js",e.id="disqus_embed",n.appendChild(e)}},loadDisqus:function(){var t=this.config;void 0!==window.DISQUS?window.DISQUS.reset({reload:!0,config:function(){this.page.title=t.title,this.page.url=t.url,this.page.identifier=t.identifier}}):(window.disqus_config=function(){this.page.title=t.title,this.page.url=t.url,this.page.identifier=t.identifier},this.addDisqusScript())}}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default={props:["item"]}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default={props:{config:{required:!0,type:Object}},mounted:function(){!function(t,e){var n=void 0,i=t.getElementsByTagName(e)[0];"function"!=typeof LivereTower&&(n=t.createElement(e),n.src="https://cdn-city.livere.com/js/embed.dist.js",n.async=!0,i.parentNode.insertBefore(n,i))}(document,"script")}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default={props:{loading:{default:!1}}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),a=n.n(i),s=n(5),o=n(58),r=n.n(o);e.default={components:{"only-link":r.a},data:function(){return{active:!1}},computed:a()({},n.i(s.a)(["themeCfg"])),methods:{toggleBar:function(){this.active=!this.active}}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),a=n.n(i),s=n(5);e.default={props:["post"],methods:{fetchTag:function(t){var e=this;this.$router.push({name:"Tag",params:{tag:t}}),this.$store.dispatch("fetchPostsByTag",{tag:t}).then(function(){document.title=t+" | "+e.siteCfg.title})}},computed:a()({},n.i(s.a)(["siteCfg"]))}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),a=n.n(i),s=n(13),o=n.n(s),r=n(33),c=n.n(r),u=n(5);e.default={created:function(){this.$route.query.redirect&&this.$router.replace(this.$route.query.redirect)},components:{"only-container":o.a,"only-page":c.a},computed:a()({},n.i(u.a)(["themeCfg"])),watch:{"$route.path":function(t,e){this.$store.commit("updateStatus",200)}}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),a=n.n(i),s=n(5),o=n(57),r=n.n(o),c=n(13),u=n.n(c),l=n(59),f=n.n(l),d=n(39),p=n(14);e.default={props:["layout"],data:function(){return{loading:!0,notExisted:!1}},created:function(){var t=this;this.loading=!0,this.refresh(this.layout).then(function(){t.loading=!1})},components:{"only-article":r.a,"only-container":u.a,"only-loading":f.a},computed:a()({},n.i(s.a)(["page","themeCfg","siteCfg"]),{config:function(){return this.themeCfg.disqus_shortname?{shortname:this.themeCfg.disqus_shortname,url:n.i(d.a)(),title:document.title,identifier:n.i(d.a)()}:{livere_uid:this.themeCfg.livere_uid}}}),methods:a()({},n.i(s.b)(["fetchPage"]),{refresh:function(t){var e=this;return this.notExisted=!1,this.fetchPage({layout:t}).then(function(){document.title=e.page.title+" | "+e.siteCfg.title}).catch(function(t){t.response&&404===t.response.status&&(e.notExisted=!0)})}}),watch:{layout:function(t,e){var i=this;this.loading=!0,this.refresh(t).then(function(){i.loading=!1}).then(function(){p.a.nextTick(function(){window.DISQUS.reset({reload:!0,config:function(){this.page.identifier=n.i(d.a)(),this.page.url=n.i(d.a)(),this.page.title=document.title,console.log(this.page.identifier,this.page.url)}})})})}}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),a=n.n(i),s=n(5),o=n(57),r=n.n(o),c=n(13),u=n.n(c),l=n(59),f=n.n(l),d=n(39);e.default={props:["slug"],created:function(){var t=this;this.fetchPost({slug:this.slug}).then(function(){document.title=t.post.title+" | "+t.siteCfg.title,t.loading=!1}).catch(function(e){e.response&&404===e.response.status&&(t.notExisted=!0,t.$store.commit("updateStatus",404)),t.loading=!1})},components:{"only-article":r.a,"only-container":u.a,"only-loading":f.a},data:function(){return{loading:!0,notExisted:!1}},computed:a()({},n.i(s.a)(["post","themeCfg","siteCfg"]),{config:function(){return this.themeCfg.disqus_shortname?{shortname:this.themeCfg.disqus_shortname,url:n.i(d.a)(),title:document.title,identifier:n.i(d.a)()}:{livere_uid:this.themeCfg.livere_uid}}}),methods:a()({},n.i(s.b)(["fetchPost"]))}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),a=n.n(i),s=n(5),o=n(13),r=n.n(o),c=n(60),u=n.n(c);e.default={created:function(){var t=this;this.fetchPosts().then(function(){document.title="Posts | "+t.siteCfg.title})},components:{"only-container":r.a,"only-post":u.a},computed:a()({},n.i(s.a)(["posts","siteCfg","themeCfg"])),methods:a()({},n.i(s.b)(["fetchPosts"]))}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),a=n.n(i),s=n(5),o=n(58),r=n.n(o);e.default={components:{"only-link":r.a},created:function(){document.title="Home | "+this.siteCfg.title},computed:a()({},n.i(s.a)(["themeCfg","siteCfg"]),{style:function(){return{backgroundImage:"url("+window.root+"img/background.jpg)"}}})}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),a=n.n(i),s=n(31),o=n.n(s),r=n(5),c=n(13),u=n.n(c),l=n(60),f=n.n(l);e.default={props:["tag"],data:function(){return{noTags:!1,notExisted:!1}},components:{"only-container":u.a,"only-post":f.a},created:function(){var t=this,e=o.a.resolve();null==this.tags&&(e=this.fetchTags().then(function(){null==t.tag&&t.$router.push({name:"Tag",params:{tag:t.tags[0].name}})}).catch(function(e){e.response&&404===e.response.status&&(t.noTags=!0,t.$store.commit("updateStatus",404))})),e.then(function(){if(!t.noTags&&null!=t.tag)return t.fetchPostsByTag({tag:t.tag})}).catch(function(e){e.response&&404===e.response.status&&(t.notExisted=!0,t.$store.commit("updateStatus",404))}).then(function(){document.title=t.tag+" | "+t.siteCfg.title})},computed:a()({},n.i(r.a)(["tags","posts","siteCfg","themeCfg"])),methods:a()({},n.i(r.b)(["fetchTags","fetchPostsByTag"]),{fetchTag:function(t){this.$router.push({name:"Tag",params:{tag:t}}),this.fetchPostsByTag({tag:t}),document.title=t+" | "+this.siteCfg.title}})}},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(t,e){},function(t,e){},function(t,e){},function(t,e){},function(t,e){},function(t,e){},function(t,e){},function(t,e){},function(t,e){},function(t,e){},function(t,e){},function(t,e){},function(t,e){},function(t,e){},function(t,e){},,,,,,function(t,e,n){function i(t){n(144)}var a=n(0)(n(89),n(171),i,null,null);t.exports=a.exports},function(t,e,n){function i(t){n(139)}var a=n(0)(n(91),n(166),i,null,null);t.exports=a.exports},function(t,e,n){function i(t){n(149)}var a=n(0)(n(93),n(176),i,null,null);t.exports=a.exports},function(t,e,n){function i(t){n(151)}var a=n(0)(n(97),n(178),i,null,null);t.exports=a.exports},function(t,e,n){function i(t){n(143)}var a=n(0)(n(98),n(170),i,null,null);t.exports=a.exports},function(t,e,n){function i(t){n(146)}var a=n(0)(n(99),n(173),i,null,null);t.exports=a.exports},function(t,e,n){function i(t){n(140)}var a=n(0)(n(100),n(167),i,null,null);t.exports=a.exports},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return"permalink"===t.item.type?n("a",{attrs:{href:t.item.link,target:t.item._blank?"_blank":""}},[t._v(t._s(t.item.title))]):n("router-link",{attrs:{to:t.item.link}},[t._v(t._s(t.item.title))])},staticRenderFns:[]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement;return(t._self._c||e)("div",{attrs:{id:"lv-container","data-id":"city","data-uid":t.config.livere_uid}})},staticRenderFns:[]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("only-container",[t.notExisted?n("div",[n("h2",[t._v("嗯,这个标签并不存在")]),t._v(" "),n("img",{attrs:{src:"https://as.bitinn.net/upload/cj2l8o36f00ofbo5nj7spml66.1200.jpg"}})]):n("div",[t.tags?n("div",{staticClass:"tags-container"},t._l(t.tags,function(e){return n("span",{staticClass:"tag",class:{active:t.tag===e.name},on:{click:function(n){t.fetchTag(e.name)}}},[t._v(" "+t._s(e.name)+" ")])})):t._e(),t._v(" "),n("hr"),t._v(" "),t._l(t.posts,function(e){return n("only-post",{key:e.title,staticClass:"animated",class:t.themeCfg.animated&&t.themeCfg.animated.tags,attrs:{post:e}})})],2)])},staticRenderFns:[]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t.loading?n("div",{staticClass:"loading"},[t._m(0)]):t._t("default")],2)},staticRenderFns:[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("h1",[t._v("Loading")]),t._v(" "),n("div",{staticClass:"pacman"},[n("div"),t._v(" "),n("div"),t._v(" "),n("div"),t._v(" "),n("div"),t._v(" "),n("div")])])}]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{attrs:{id:"app"}},["Splash"!==t.$route.name?n("only-nav"):t._e(),t._v(" "),n(404!==t.status?"router-view":"only-not-found")],1)},staticRenderFns:[]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("only-container",t._l(t.posts,function(e){return n("only-post",{key:e.title,staticClass:"animated",class:t.themeCfg.animated&&t.themeCfg.animated.posts,attrs:{post:e}})}))},staticRenderFns:[]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement;return(t._self._c||e)("div",{attrs:{id:"disqus_thread"}})},staticRenderFns:[]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement;return(t._self._c||e)("div",{staticClass:"container"},[t._t("default")],2)},staticRenderFns:[]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("section",{staticClass:"splash"},[n("section",{staticClass:"body",style:t.style},[n("section",{staticClass:"shadow"},[n("section",{staticClass:"content"},[n("h1",{staticClass:"title"},[t._v(t._s(t.siteCfg.title))]),t._v(" "),n("nav",t._l(t.themeCfg.Splash,function(t){return n("only-link",{key:t.title,attrs:{item:t}})}))])])])])},staticRenderFns:[]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[null==t.themeCfg.page404?n("only-container",[n("h1",[t._v("404 Not Found")]),t._v(" "),n("h3",[t._v(" 迷路了么?这里什么也不存在 ")]),t._v(" "),n("p",[t._v(" 回到 "),n("router-link",{attrs:{to:{name:"Splash"}}},[t._v("最开始的地方吧")])],1),t._v(" "),n("img",{attrs:{src:"https://as.bitinn.net/upload/cite0l5z200oiz35nbv8t5xox.1200.jpg",alt:""}})]):n("only-page",{attrs:{layout:"page404"}})],1)},staticRenderFns:[]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("section",{staticClass:"blog-item"},[n("router-link",{staticClass:"title",attrs:{tag:"h2",to:{name:"Post",params:{slug:t.post.slug}}}},[t._v("\n "+t._s(t.post.title)+"\n ")]),t._v(" "),n("span",{staticClass:"time"},[t._v(t._s(t._f("timePretty")(t.post.date)))]),t._v(" "),t._l(t.post.tags,function(e){return n("span",{staticClass:"tag",on:{click:function(n){t.fetchTag(e.name)}}},[t._v("#"+t._s(e.name))])})],2)},staticRenderFns:[]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"nav-container",on:{click:t.toggleBar}},[n("transition",{attrs:{"enter-active-class":"animated slideInLeft fadeIn","leave-active-class":"animated slideOutLeft fadeOut"}},[t.active?n("div",{staticClass:"nav"},[t._l(t.themeCfg.Drawer,function(t){return n("only-link",{key:t.title,staticClass:"item",attrs:{item:t}})}),t._v(" "),n("a",{staticClass:"item"},[n("i",{staticClass:"icon ion-chevron-left"})])],2):n("div",{key:"entry",staticClass:"entry",on:{click:function(e){return e.stopPropagation(),t.toggleBar(e)}}},[n("i",{staticClass:"icon ion-chevron-right"})])])],1)},staticRenderFns:[]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.page?n("only-container",[n("only-loading",{attrs:{loading:t.loading}},[t.notExisted?t._e():n("only-article",{staticClass:"animated",class:t.themeCfg.animated&&t.themeCfg.animated.page,attrs:{article:t.page,config:t.config}})],1)],1):t._e()},staticRenderFns:[]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("only-container",[n("only-loading",{attrs:{loading:t.loading}},[!t.notExisted&&t.post?n("only-article",{staticClass:"animated",class:t.themeCfg.animated&&t.themeCfg.animated.post,attrs:{article:t.post,config:t.config}}):n("h1",[t._v("This Post is Not Existed")])],1)],1)},staticRenderFns:[]}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"article"},[n("h1",{staticClass:"title"},[t._v(t._s(t.article.title))]),t._v(" "),n("hr",{staticClass:"splitline"}),t._v(" "),n("article",{staticClass:"content",domProps:{innerHTML:t._s(t.article.content)}}),t._v(" "),n("span",{staticClass:"time"},[t._v(" "+t._s(t._f("timePretty")(t.article.date))+"\n / Updated on "+t._s(t._f("timePretty")(t.article.updated))+"\n ")]),t._v(" "),n("hr",{staticClass:"splitline"}),t._v(" "),t.article.comments&&t.config&&t.themeCfg.disqus_shortname?n("only-disqus",{attrs:{config:t.config}}):t.article.comments&&t.config&&t.themeCfg.livere_uid?n("only-livere",{attrs:{config:t.config}}):t._e()],1)},staticRenderFns:[]}}],[85]); 2 | //# sourceMappingURL=app.js.map -------------------------------------------------------------------------------- /hexo/source/js/manifest.js: -------------------------------------------------------------------------------- 1 | !function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,c,a){for(var u,i,f,s=0,l=[];s 2 | 3 | 4 | 5 | 6 | hexo-theme-only 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hexo-theme-only", 3 | "version": "2.0.0-alpha.2", 4 | "description": "Just a theme for hexo", 5 | "author": "lazzzis ", 6 | "private": true, 7 | "scripts": { 8 | "dev": "cross-env NODE_ENV=development node build/dev-server.js", 9 | "start": "node build/dev-server.js", 10 | "build": "cross-env NODE_ENV=production node build/build.js", 11 | "lint": "eslint --ext .js,.vue src", 12 | "dev:server": "http-server --cors -p 3300 -c-1 ./api" 13 | }, 14 | "dependencies": { 15 | "axios": "^0.16.2", 16 | "fastclick": "^1.0.6", 17 | "fecha": "^2.3.3", 18 | "http-server": "^0.11.1", 19 | "medium-zoom": "^0.4.0", 20 | "nprogress": "^0.2.0", 21 | "url-join": "^4.0.0", 22 | "vue": "^2.3.3", 23 | "vue-router": "^2.6.0", 24 | "vuex": "^2.3.1" 25 | }, 26 | "devDependencies": { 27 | "autoprefixer": "^7.1.2", 28 | "babel-core": "^6.22.1", 29 | "babel-eslint": "^7.1.1", 30 | "babel-loader": "^7.1.1", 31 | "babel-plugin-transform-object-rest-spread": "^6.23.0", 32 | "babel-plugin-transform-runtime": "^6.22.0", 33 | "babel-preset-env": "^1.3.2", 34 | "babel-preset-stage-2": "^6.22.0", 35 | "babel-register": "^6.22.0", 36 | "chalk": "^2.0.1", 37 | "connect-history-api-fallback": "^1.3.0", 38 | "copy-webpack-plugin": "^4.0.1", 39 | "cross-env": "^5.1.1", 40 | "css-loader": "^0.28.4", 41 | "cssnano": "^3.10.0", 42 | "eslint": "^3.19.0", 43 | "eslint-config-standard": "^6.2.1", 44 | "eslint-friendly-formatter": "^3.0.0", 45 | "eslint-loader": "^1.7.1", 46 | "eslint-plugin-html": "^3.0.0", 47 | "eslint-plugin-promise": "^3.4.0", 48 | "eslint-plugin-standard": "^2.0.1", 49 | "eventsource-polyfill": "^0.9.6", 50 | "express": "^4.14.1", 51 | "extract-text-webpack-plugin": "^2.0.0", 52 | "file-loader": "^0.11.1", 53 | "friendly-errors-webpack-plugin": "^1.1.3", 54 | "html-webpack-plugin": "^2.28.0", 55 | "http-proxy-middleware": "^0.17.3", 56 | "node-sass": "^4.5.3", 57 | "opn": "^5.1.0", 58 | "optimize-css-assets-webpack-plugin": "^2.0.0", 59 | "ora": "^1.2.0", 60 | "rimraf": "^2.6.0", 61 | "sass-loader": "^6.0.6", 62 | "semver": "^5.3.0", 63 | "shelljs": "^0.7.6", 64 | "url-loader": "^0.5.8", 65 | "vue-loader": "^12.1.0", 66 | "vue-style-loader": "^3.0.1", 67 | "vue-template-compiler": "^2.3.3", 68 | "webpack": "^2.6.1", 69 | "webpack-bundle-analyzer": "^2.2.1", 70 | "webpack-dev-middleware": "^1.10.0", 71 | "webpack-hot-middleware": "^2.18.0", 72 | "webpack-merge": "^4.1.0" 73 | }, 74 | "engines": { 75 | "node": ">= 4.0.0", 76 | "npm": ">= 3.0.0" 77 | }, 78 | "browserslist": [ 79 | "> 1%", 80 | "last 2 versions", 81 | "not ie <= 8" 82 | ] 83 | } 84 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 26 | 27 | 48 | -------------------------------------------------------------------------------- /src/api.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | 3 | const instance = axios.create({ 4 | baseURL: window.root 5 | }) 6 | 7 | export default instance 8 | -------------------------------------------------------------------------------- /src/assets/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lazzzis/hexo-theme-only/cffdd674de3fb8403292c180d45262535e78b3be/src/assets/background.jpg -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lazzzis/hexo-theme-only/cffdd674de3fb8403292c180d45262535e78b3be/src/assets/logo.png -------------------------------------------------------------------------------- /src/assets/sass/base.sass: -------------------------------------------------------------------------------- 1 | $color-initial: #fff !default 2 | $color-primary: #8B80F9 !default 3 | $color-secondary: #606c76 !default 4 | $color-tertiary: #f4f5f6 !default 5 | $color-quaternary: #d1d1d1 !default 6 | $color-quinary: #e1e1e1 !default 7 | 8 | $color-highlight: #FC7753 9 | 10 | .hover-highlight 11 | transition: 0.2s ease color 12 | &:hover 13 | color: $color-highlight 14 | 15 | $base-font: "source sans pro", "Ubuntu", "Segoe UI", "Roboto", "Oxygen", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "PingFang SC", "Hiragino Sans GB", "Source Han Sans CN", "Source Han Sans SC", "Microsoft YaHei", "Wenquanyi Micro Hei", "WenQuanYi Zen Hei", "ST Heiti", SimHei, "WenQuanYi Zen Hei Sharp", "Arial", sans-serif 16 | 17 | $cursive-font: "Comfortaa", "source sans pro", "Ubuntu", "Segoe UI", "Roboto", "Oxygen", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "PingFang SC", "Hiragino Sans GB", "Source Han Sans CN", "Source Han Sans SC", "Microsoft YaHei", "Wenquanyi Micro Hei", "WenQuanYi Zen Hei", "ST Heiti", SimHei, "WenQuanYi Zen Hei Sharp", "Arial", sans-serif 18 | 19 | $monospace: "source code pro", "Consolas", "Lucida Console", "Monaco", "Andale Mono", "DejaVu Sans Mono", "Courier New", monospace 20 | 21 | span.image-caption 22 | display: block 23 | text-align: center 24 | font-size: 90% 25 | color: grey 26 | -------------------------------------------------------------------------------- /src/components/ArticleItem.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 47 | 48 | 77 | -------------------------------------------------------------------------------- /src/components/Container.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /src/components/Disqus.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 65 | 66 | 68 | -------------------------------------------------------------------------------- /src/components/LinkItem.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 18 | 19 | 21 | -------------------------------------------------------------------------------- /src/components/Livere.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 32 | 33 | 35 | -------------------------------------------------------------------------------- /src/components/Loading.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 29 | 30 | 45 | -------------------------------------------------------------------------------- /src/components/Nav.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 51 | 52 | 107 | -------------------------------------------------------------------------------- /src/components/PostItem.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 44 | 45 | 70 | -------------------------------------------------------------------------------- /src/components/TagCluster.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | 13 | -------------------------------------------------------------------------------- /src/helper/index.js: -------------------------------------------------------------------------------- 1 | function disqusUrl () { 2 | const origin = window.location.origin 3 | const pathname = window.location.pathname.endsWith('/') 4 | ? window.location.pathname 5 | : window.location.pathname + '/' 6 | return origin + pathname 7 | } 8 | 9 | export { 10 | disqusUrl 11 | } 12 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | import Vue from 'vue' 4 | import App from './App' 5 | import router from './router' 6 | import store from './store' 7 | import fecha from 'fecha' 8 | import Page from '@/views/Page' 9 | import NotFound from '@/views/NotFound' 10 | import axios from 'axios' 11 | import nprogress from 'nprogress' 12 | 13 | import FastClick from 'fastclick' 14 | 15 | FastClick.attach(window.document.body) 16 | 17 | nprogress.configure({ speed: 400 }) 18 | 19 | axios.interceptors.request.use(function (config) { 20 | nprogress.start() 21 | return config 22 | }, function (error) { 23 | return Promise.reject(error) 24 | }) 25 | 26 | axios.interceptors.response.use(function (response) { 27 | nprogress.done() 28 | return response 29 | }, function (error) { 30 | return Promise.reject(error) 31 | }) 32 | 33 | Vue.config.productionTip = false 34 | 35 | Vue.filter('timePretty', function (date) { 36 | return fecha.format(new Date(date), 'YYYY - MM - DD') 37 | }) 38 | 39 | Promise.all([ 40 | store.dispatch('fetchSiteCfg'), 41 | store.dispatch('fetchThemeCfg'), 42 | store.dispatch('fetchPages') 43 | ]).then(() => { 44 | router.addRoutes(store.getters.pages.map((item) => ({ 45 | path: item.link, 46 | component: Page, 47 | props: { layout: item.layout } 48 | }))) 49 | 50 | router.addRoutes([{ 51 | name: 'NotFound', 52 | path: window.root + '*', 53 | component: NotFound 54 | }]) 55 | /* eslint-disable no-new */ 56 | new Vue({ 57 | el: '#app', 58 | router, 59 | store, 60 | template: '', 61 | components: { App } 62 | }) 63 | }) 64 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | import Splash from '@/views/Splash' 4 | import Posts from '@/views/Posts' 5 | import Post from '@/views/Post' 6 | import Tags from '@/views/Tags' 7 | 8 | if (!window.root || window.root === '') { 9 | window.root = '/' 10 | } else if (!window.root.endsWith('/')) { 11 | window.root += '/' 12 | } 13 | 14 | const root = window.root 15 | 16 | Vue.use(Router) 17 | 18 | const routes = [ 19 | { 20 | path: root, 21 | name: 'Splash', 22 | component: Splash 23 | }, { 24 | path: root + 'posts', 25 | name: 'Posts', 26 | component: Posts 27 | }, { 28 | path: root + 'post/:slug', 29 | props: (route) => route.params, 30 | name: 'Post', 31 | component: Post 32 | }, { 33 | path: root + 'tags', 34 | name: 'Tags', 35 | props: () => null, 36 | component: Tags 37 | }, { 38 | path: root + 'tags/:tag', 39 | name: 'Tag', 40 | component: Tags, 41 | props: (route) => route.params 42 | } 43 | ] 44 | 45 | export default new Router({ 46 | mode: 'history', 47 | routes 48 | }) 49 | -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import urlJoin from 'url-join' 4 | import http from '@/api' 5 | 6 | Vue.use(Vuex) 7 | 8 | const state = { 9 | themeCfg: null, 10 | siteCfg: null, 11 | article: {}, 12 | page: {}, 13 | pages: [], 14 | post: null, 15 | posts: [], 16 | tags: null, // can not be empty array 17 | // (empty array represents no tags at all) 18 | // (null means tags.json have not been fetched) 19 | status: 200 // http status code 20 | } 21 | 22 | const getters = { 23 | posts (state) { 24 | return state.posts 25 | }, 26 | post (state) { 27 | return state.post 28 | }, 29 | article (state) { 30 | return state.article 31 | }, 32 | pages (state) { 33 | return state.pages 34 | }, 35 | page (state) { 36 | return state.page 37 | }, 38 | tags (state) { 39 | return state.tags 40 | }, 41 | themeCfg (state) { 42 | return state.themeCfg 43 | }, 44 | siteCfg (state) { 45 | return state.siteCfg 46 | }, 47 | status (state) { 48 | return state.status 49 | } 50 | } 51 | 52 | const mutations = { 53 | updatePosts (state, {posts}) { 54 | state.posts = posts 55 | }, 56 | updatePost (state, {post}) { 57 | state.post = post 58 | }, 59 | updateArticle (state, {article}) { 60 | state.article = article 61 | }, 62 | updatePages (state, {pages}) { 63 | state.pages = pages 64 | }, 65 | updatePage (state, {page}) { 66 | state.page = page 67 | }, 68 | updateTags (state, {tags}) { 69 | state.tags = tags 70 | }, 71 | updateThemeCfg (state, themeCfg) { 72 | state.themeCfg = themeCfg 73 | }, 74 | updateSiteCfg (state, siteCfg) { 75 | state.siteCfg = siteCfg 76 | }, 77 | updateStatus (state, status) { 78 | state.status = status 79 | } 80 | } 81 | 82 | const actions = { 83 | fetchSiteCfg ({commit}) { 84 | return http.get('api/site.json') 85 | .then(({data}) => { 86 | commit('updateSiteCfg', data) 87 | }) 88 | }, 89 | fetchThemeCfg ({commit}) { 90 | return http.get('api/theme.json') 91 | .then(({data}) => { 92 | data.Drawer 93 | .filter((item) => item.type === 'sitelink' || item.type === 'page') 94 | .forEach((item) => { 95 | item.link = urlJoin(window.root, item.link) 96 | }) 97 | data.Splash 98 | .filter((item) => item.type === 'sitelink' || item.type === 'page') 99 | .forEach((item) => { 100 | item.link = urlJoin(window.root, item.link) 101 | }) 102 | commit('updateThemeCfg', data) 103 | }) 104 | }, 105 | fetchPosts ({commit}) { 106 | return http.get('api/posts.json') 107 | .then(({data}) => { 108 | commit('updatePosts', { 109 | posts: data.sort((x, y) => new Date(y.date).getTime() - new Date(x.date).getTime()) 110 | }) 111 | }) 112 | }, 113 | fetchPost ({commit}, {slug}) { 114 | return http.get(`api/articles/${slug}.json`) 115 | .then(({data}) => { 116 | commit('updatePost', { 117 | post: data 118 | }) 119 | }) 120 | }, 121 | fetchPage ({commit}, {layout}) { 122 | return http.get(`api/page/${layout}.json`) 123 | .then(({data}) => { 124 | commit('updatePage', { 125 | page: data 126 | }) 127 | }) 128 | }, 129 | fetchPages ({commit}) { 130 | return http.get(`api/pages.json`) 131 | .then(({data}) => { 132 | data = data.map((item) => ({ 133 | ...item, 134 | link: urlJoin(window.root, item.link) 135 | })) 136 | commit('updatePages', { 137 | pages: data 138 | }) 139 | }) 140 | }, 141 | fetchTags ({commit}) { 142 | return http.get(`api/tags.json`) 143 | .then(({data}) => { 144 | commit('updateTags', { 145 | tags: data 146 | }) 147 | }) 148 | }, 149 | fetchPostsByTag ({commit}, {tag}) { 150 | return http.get(`api/tags/${tag}.json`) 151 | .then(({data}) => { 152 | commit('updatePosts', { 153 | posts: data.postlist.sort((x, y) => new Date(y.date).getTime() - new Date(x.date).getTime()) 154 | }) 155 | }) 156 | } 157 | } 158 | 159 | export default new Vuex.Store({ 160 | actions, 161 | mutations, 162 | state, 163 | getters 164 | }) 165 | -------------------------------------------------------------------------------- /src/views/NotFound.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 40 | 41 | 43 | -------------------------------------------------------------------------------- /src/views/Page.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 92 | 93 | 95 | -------------------------------------------------------------------------------- /src/views/Post.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 68 | 69 | 71 | -------------------------------------------------------------------------------- /src/views/Posts.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 37 | 38 | 40 | -------------------------------------------------------------------------------- /src/views/Splash.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 48 | 49 | 98 | -------------------------------------------------------------------------------- /src/views/Tags.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 96 | 97 | 127 | -------------------------------------------------------------------------------- /static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lazzzis/hexo-theme-only/cffdd674de3fb8403292c180d45262535e78b3be/static/.gitkeep -------------------------------------------------------------------------------- /static/css/atom-one-light.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Atom One Light by Daniel Gamage 4 | Original One Light Syntax theme from https://github.com/atom/one-light-syntax 5 | 6 | base: #fafafa 7 | mono-1: #383a42 8 | mono-2: #686b77 9 | mono-3: #a0a1a7 10 | hue-1: #0184bb 11 | hue-2: #4078f2 12 | hue-3: #a626a4 13 | hue-4: #50a14f 14 | hue-5: #e45649 15 | hue-5-2: #c91243 16 | hue-6: #986801 17 | hue-6-2: #c18401 18 | 19 | */ 20 | 21 | .hljs { 22 | display: block; 23 | overflow-x: auto; 24 | padding: 0.5em; 25 | color: #383a42; 26 | background: #fafafa; 27 | } 28 | 29 | .hljs-comment, 30 | .hljs-quote { 31 | color: #a0a1a7; 32 | font-style: italic; 33 | } 34 | 35 | .hljs-doctag, 36 | .hljs-keyword, 37 | .hljs-formula { 38 | color: #a626a4; 39 | } 40 | 41 | .hljs-section, 42 | .hljs-name, 43 | .hljs-selector-tag, 44 | .hljs-deletion, 45 | .hljs-subst { 46 | color: #e45649; 47 | } 48 | 49 | .hljs-literal { 50 | color: #0184bb; 51 | } 52 | 53 | .hljs-string, 54 | .hljs-regexp, 55 | .hljs-addition, 56 | .hljs-attribute, 57 | .hljs-meta-string { 58 | color: #50a14f; 59 | } 60 | 61 | .hljs-built_in, 62 | .hljs-class .hljs-title { 63 | color: #c18401; 64 | } 65 | 66 | .hljs-attr, 67 | .hljs-variable, 68 | .hljs-template-variable, 69 | .hljs-type, 70 | .hljs-selector-class, 71 | .hljs-selector-attr, 72 | .hljs-selector-pseudo, 73 | .hljs-number { 74 | color: #986801; 75 | } 76 | 77 | .hljs-symbol, 78 | .hljs-bullet, 79 | .hljs-link, 80 | .hljs-meta, 81 | .hljs-selector-id, 82 | .hljs-title { 83 | color: #4078f2; 84 | } 85 | 86 | .hljs-emphasis { 87 | font-style: italic; 88 | } 89 | 90 | .hljs-strong { 91 | font-weight: bold; 92 | } 93 | 94 | .hljs-link { 95 | text-decoration: underline; 96 | } 97 | -------------------------------------------------------------------------------- /static/css/comfortaa.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Comfortaa'; 3 | src: url('../fonts/Comfortaa-Regular.ttf'); 4 | } 5 | -------------------------------------------------------------------------------- /static/css/milligram.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Milligram v1.3.0 3 | * https://milligram.github.io 4 | * 5 | * Copyright (c) 2017 CJ Patoilo 6 | * Licensed under the MIT license 7 | */ 8 | 9 | *,*:after,*:before{box-sizing:inherit}html{box-sizing:border-box;font-size:62.5%}body{color:#606c76;font-family:'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;font-size:1.6em;font-weight:300;letter-spacing:.01em;line-height:1.6}blockquote{border-left:0.3rem solid #d1d1d1;margin-left:0;margin-right:0;padding:1rem 1.5rem}blockquote *:last-child{margin-bottom:0}.button,button,input[type='button'],input[type='reset'],input[type='submit']{background-color:#9b4dca;border:0.1rem solid #9b4dca;border-radius:.4rem;color:#fff;cursor:pointer;display:inline-block;font-size:1.1rem;font-weight:700;height:3.8rem;letter-spacing:.1rem;line-height:3.8rem;padding:0 3.0rem;text-align:center;text-decoration:none;text-transform:uppercase;white-space:nowrap}.button:focus,.button:hover,button:focus,button:hover,input[type='button']:focus,input[type='button']:hover,input[type='reset']:focus,input[type='reset']:hover,input[type='submit']:focus,input[type='submit']:hover{background-color:#606c76;border-color:#606c76;color:#fff;outline:0}.button[disabled],button[disabled],input[type='button'][disabled],input[type='reset'][disabled],input[type='submit'][disabled]{cursor:default;opacity:.5}.button[disabled]:focus,.button[disabled]:hover,button[disabled]:focus,button[disabled]:hover,input[type='button'][disabled]:focus,input[type='button'][disabled]:hover,input[type='reset'][disabled]:focus,input[type='reset'][disabled]:hover,input[type='submit'][disabled]:focus,input[type='submit'][disabled]:hover{background-color:#9b4dca;border-color:#9b4dca}.button.button-outline,button.button-outline,input[type='button'].button-outline,input[type='reset'].button-outline,input[type='submit'].button-outline{background-color:transparent;color:#9b4dca}.button.button-outline:focus,.button.button-outline:hover,button.button-outline:focus,button.button-outline:hover,input[type='button'].button-outline:focus,input[type='button'].button-outline:hover,input[type='reset'].button-outline:focus,input[type='reset'].button-outline:hover,input[type='submit'].button-outline:focus,input[type='submit'].button-outline:hover{background-color:transparent;border-color:#606c76;color:#606c76}.button.button-outline[disabled]:focus,.button.button-outline[disabled]:hover,button.button-outline[disabled]:focus,button.button-outline[disabled]:hover,input[type='button'].button-outline[disabled]:focus,input[type='button'].button-outline[disabled]:hover,input[type='reset'].button-outline[disabled]:focus,input[type='reset'].button-outline[disabled]:hover,input[type='submit'].button-outline[disabled]:focus,input[type='submit'].button-outline[disabled]:hover{border-color:inherit;color:#9b4dca}.button.button-clear,button.button-clear,input[type='button'].button-clear,input[type='reset'].button-clear,input[type='submit'].button-clear{background-color:transparent;border-color:transparent;color:#9b4dca}.button.button-clear:focus,.button.button-clear:hover,button.button-clear:focus,button.button-clear:hover,input[type='button'].button-clear:focus,input[type='button'].button-clear:hover,input[type='reset'].button-clear:focus,input[type='reset'].button-clear:hover,input[type='submit'].button-clear:focus,input[type='submit'].button-clear:hover{background-color:transparent;border-color:transparent;color:#606c76}.button.button-clear[disabled]:focus,.button.button-clear[disabled]:hover,button.button-clear[disabled]:focus,button.button-clear[disabled]:hover,input[type='button'].button-clear[disabled]:focus,input[type='button'].button-clear[disabled]:hover,input[type='reset'].button-clear[disabled]:focus,input[type='reset'].button-clear[disabled]:hover,input[type='submit'].button-clear[disabled]:focus,input[type='submit'].button-clear[disabled]:hover{color:#9b4dca}code{background:#f4f5f6;border-radius:.4rem;font-size:86%;margin:0 .2rem;padding:.2rem .5rem;white-space:nowrap}pre{background:#f4f5f6;border-left:0.3rem solid #9b4dca;overflow-y:hidden}pre>code{border-radius:0;display:block;padding:1rem 1.5rem;white-space:pre}hr{border:0;border-top:0.1rem solid #f4f5f6;margin:3.0rem 0}input[type='email'],input[type='number'],input[type='password'],input[type='search'],input[type='tel'],input[type='text'],input[type='url'],textarea,select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;border:0.1rem solid #d1d1d1;border-radius:.4rem;box-shadow:none;box-sizing:inherit;height:3.8rem;padding:.6rem 1.0rem;width:100%}input[type='email']:focus,input[type='number']:focus,input[type='password']:focus,input[type='search']:focus,input[type='tel']:focus,input[type='text']:focus,input[type='url']:focus,textarea:focus,select:focus{border-color:#9b4dca;outline:0}select{background:url('data:image/svg+xml;utf8,') center right no-repeat;padding-right:3.0rem}select:focus{background-image:url('data:image/svg+xml;utf8,')}textarea{min-height:6.5rem}label,legend{display:block;font-size:1.6rem;font-weight:700;margin-bottom:.5rem}fieldset{border-width:0;padding:0}input[type='checkbox'],input[type='radio']{display:inline}.label-inline{display:inline-block;font-weight:normal;margin-left:.5rem}.container{margin:0 auto;max-width:112.0rem;padding:0 2.0rem;position:relative;width:100%}.row{display:flex;flex-direction:column;padding:0;width:100%}.row.row-no-padding{padding:0}.row.row-no-padding>.column{padding:0}.row.row-wrap{flex-wrap:wrap}.row.row-top{align-items:flex-start}.row.row-bottom{align-items:flex-end}.row.row-center{align-items:center}.row.row-stretch{align-items:stretch}.row.row-baseline{align-items:baseline}.row .column{display:block;flex:1 1 auto;margin-left:0;max-width:100%;width:100%}.row .column.column-offset-10{margin-left:10%}.row .column.column-offset-20{margin-left:20%}.row .column.column-offset-25{margin-left:25%}.row .column.column-offset-33,.row .column.column-offset-34{margin-left:33.3333%}.row .column.column-offset-50{margin-left:50%}.row .column.column-offset-66,.row .column.column-offset-67{margin-left:66.6666%}.row .column.column-offset-75{margin-left:75%}.row .column.column-offset-80{margin-left:80%}.row .column.column-offset-90{margin-left:90%}.row .column.column-10{flex:0 0 10%;max-width:10%}.row .column.column-20{flex:0 0 20%;max-width:20%}.row .column.column-25{flex:0 0 25%;max-width:25%}.row .column.column-33,.row .column.column-34{flex:0 0 33.3333%;max-width:33.3333%}.row .column.column-40{flex:0 0 40%;max-width:40%}.row .column.column-50{flex:0 0 50%;max-width:50%}.row .column.column-60{flex:0 0 60%;max-width:60%}.row .column.column-66,.row .column.column-67{flex:0 0 66.6666%;max-width:66.6666%}.row .column.column-75{flex:0 0 75%;max-width:75%}.row .column.column-80{flex:0 0 80%;max-width:80%}.row .column.column-90{flex:0 0 90%;max-width:90%}.row .column .column-top{align-self:flex-start}.row .column .column-bottom{align-self:flex-end}.row .column .column-center{-ms-grid-row-align:center;align-self:center}@media (min-width: 40rem){.row{flex-direction:row;margin-left:-1.0rem;width:calc(100% + 2.0rem)}.row .column{margin-bottom:inherit;padding:0 1.0rem}}a{color:#9b4dca;text-decoration:none}a:focus,a:hover{color:#606c76}dl,ol,ul{list-style:none;margin-top:0;padding-left:0}dl dl,dl ol,dl ul,ol dl,ol ol,ol ul,ul dl,ul ol,ul ul{font-size:90%;margin:1.5rem 0 1.5rem 3.0rem}ol{list-style:decimal inside}ul{list-style:circle inside}.button,button,dd,dt,li{margin-bottom:1.0rem}fieldset,input,select,textarea{margin-bottom:1.5rem}blockquote,dl,figure,form,ol,p,pre,table,ul{margin-bottom:2.5rem}table{border-spacing:0;width:100%}td,th{border-bottom:0.1rem solid #e1e1e1;padding:1.2rem 1.5rem;text-align:left}td:first-child,th:first-child{padding-left:0}td:last-child,th:last-child{padding-right:0}b,strong{font-weight:bold}p{margin-top:0}h1,h2,h3,h4,h5,h6{font-weight:300;letter-spacing:-.1rem;margin-bottom:2.0rem;margin-top:0}h1{font-size:4.6rem;line-height:1.2}h2{font-size:3.6rem;line-height:1.25}h3{font-size:2.8rem;line-height:1.3}h4{font-size:2.2rem;letter-spacing:-.08rem;line-height:1.35}h5{font-size:1.8rem;letter-spacing:-.05rem;line-height:1.5}h6{font-size:1.6rem;letter-spacing:0;line-height:1.4}img{max-width:100%}.clearfix:after{clear:both;content:' ';display:table}.float-left{float:left}.float-right{float:right} 10 | 11 | /*# sourceMappingURL=milligram.min.css.map */ 12 | -------------------------------------------------------------------------------- /static/css/nprogress.css: -------------------------------------------------------------------------------- 1 | /* Make clicks pass-through */ 2 | #nprogress { 3 | pointer-events: none; 4 | } 5 | 6 | #nprogress .bar { 7 | background: #29d; 8 | 9 | position: fixed; 10 | z-index: 1031; 11 | top: 0; 12 | left: 0; 13 | 14 | width: 100%; 15 | height: 2px; 16 | } 17 | 18 | /* Fancy blur effect */ 19 | #nprogress .peg { 20 | display: block; 21 | position: absolute; 22 | right: 0px; 23 | width: 100px; 24 | height: 100%; 25 | box-shadow: 0 0 10px #29d, 0 0 5px #29d; 26 | opacity: 1.0; 27 | 28 | -webkit-transform: rotate(3deg) translate(0px, -4px); 29 | -ms-transform: rotate(3deg) translate(0px, -4px); 30 | transform: rotate(3deg) translate(0px, -4px); 31 | } 32 | 33 | /* Remove these to get rid of the spinner */ 34 | #nprogress .spinner { 35 | display: block; 36 | position: fixed; 37 | z-index: 1031; 38 | top: 15px; 39 | right: 15px; 40 | } 41 | 42 | #nprogress .spinner-icon { 43 | width: 18px; 44 | height: 18px; 45 | box-sizing: border-box; 46 | 47 | border: solid 2px transparent; 48 | border-top-color: #29d; 49 | border-left-color: #29d; 50 | border-radius: 50%; 51 | 52 | -webkit-animation: nprogress-spinner 400ms linear infinite; 53 | animation: nprogress-spinner 400ms linear infinite; 54 | } 55 | 56 | .nprogress-custom-parent { 57 | overflow: hidden; 58 | position: relative; 59 | } 60 | 61 | .nprogress-custom-parent #nprogress .spinner, 62 | .nprogress-custom-parent #nprogress .bar { 63 | position: absolute; 64 | } 65 | 66 | @-webkit-keyframes nprogress-spinner { 67 | 0% { -webkit-transform: rotate(0deg); } 68 | 100% { -webkit-transform: rotate(360deg); } 69 | } 70 | @keyframes nprogress-spinner { 71 | 0% { transform: rotate(0deg); } 72 | 100% { transform: rotate(360deg); } 73 | } 74 | -------------------------------------------------------------------------------- /static/css/source-sans-pro.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Source Sans Pro'; 4 | src: url('../fonts/SourceSansPro-Regular.ttf'); 5 | } 6 | -------------------------------------------------------------------------------- /static/fonts/Comfortaa-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lazzzis/hexo-theme-only/cffdd674de3fb8403292c180d45262535e78b3be/static/fonts/Comfortaa-Regular.ttf -------------------------------------------------------------------------------- /static/fonts/SourceSansPro-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lazzzis/hexo-theme-only/cffdd674de3fb8403292c180d45262535e78b3be/static/fonts/SourceSansPro-Regular.ttf -------------------------------------------------------------------------------- /static/fonts/ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lazzzis/hexo-theme-only/cffdd674de3fb8403292c180d45262535e78b3be/static/fonts/ionicons.ttf --------------------------------------------------------------------------------