NexT is a high quality elegant Hexo theme. It is crafted from scratch, with love.
+ +[![gitter-image]][gitter-url] +[![mnt-image]][commits-url] +[![travis-image]][travis-url] +[![rel-image]][releases-url] +[![hexo-image]][hexo-url] +[![lic-image]](LICENSE) + +* [Chinese Documentation](README.cn.md) + +## Live Preview + +* :heart_decoration: Muse scheme: [XiaMo](https://notes.wanghao.work) | [OAwan](https://oawan.me) | [Hui Wang](http://hui-wang.info) +* :six_pointed_star: Mist scheme: [Jeff](https://blog.zzbd.org) | [uchuhimo](http://uchuhimo.me) | [xirong](http://www.ixirong.com) +* :pisces: Pisces scheme: [Vi](http://notes.iissnan.com) | [Acris](https://blog.mrx.one) | [Rainy](https://rainylog.com) +* :gemini: Gemini scheme: [Ivan.Nginx](https://almostover.ru) | [Alynx](http://sh.alynx.xyz) | [Raincal](https://raincal.top) + +More NexT examples [here](https://github.com/iissnan/hexo-theme-next/issues/119). + +## Installation + +**1.** Change dir to **hexo root** directory. There must be `node_modules`, `source`, `themes` and other directories: + ```sh + $ cd hexo + $ ls + _config.yml node_modules package.json public scaffolds source themes + ``` + +**2.** Get theme from GitHub. There are several variants to do it: + +### Download [latest release version][releases-latest-url]. + At most cases **stable**. Recommended for most users. + + [![curl-tar-wget-image]][curl-tar-wget-url] + + ```sh + $ mkdir themes/next + $ curl -s https://api.github.com/repos/iissnan/hexo-theme-next/releases/latest | grep tarball_url | cut -d '"' -f 4 | wget -i - -O- | tar -zx -C themes/next --strip-components=1 + ``` + +### Download [tagged release version][releases-url]. + You must define version. Replace `v5.1.2` with any version from [tags list][tags-url]. + + [![curl-tar-image]][curl-tar-url] + + ```sh + $ mkdir themes/next + $ curl -L https://api.github.com/repos/iissnan/hexo-theme-next/tarball/v5.1.2 | tar -zxv -C themes/next --strip-components=1 + ``` + + [![git-image]][git-url] + + ```sh + $ git clone --branch v5.1.2 https://github.com/iissnan/hexo-theme-next themes/next + ``` + +### Download [latest master branch][download-latest-url]. + May be **unstable**, but includes latest features. Recommended for developers. + + [![curl-tar-image]][curl-tar-url] + + ```sh + $ mkdir themes/next + $ curl -L https://api.github.com/repos/iissnan/hexo-theme-next/tarball | tar -zxv -C themes/next --strip-components=1 + ``` + + [![git-image]][git-url] + + ```sh + $ git clone https://github.com/iissnan/hexo-theme-next themes/next + ``` + + Clone command will give you the **whole repository**. And in any time you can switch to any tagged release.\ + Get tags list: + + ```sh + $ cd themes/next + $ git tag -l + … + v5.0.0 + v5.0.1 + v5.1.0 + v5.1.1 + v5.1.2 + ``` + + For example, you want to switch on `v5.1.0` [tagged release version][tags-url]. Input the following command: + + ```sh + $ git checkout tags/v5.1.0 + Note: checking out 'tags/v5.1.0'. + … + HEAD now on 1f72f68... CSS: Remove global list-style setting of ul + ``` + + And if you want to switch back on [master branch][commits-url], input this command: + + ```sh + $ git checkout master + ``` + +**3.** Set theme in main **hexo root config** `_config.yml` file: + + theme: next + +### Bugs +For those who also encounter **Error: Cannot find module 'hexo-util'** [issue](https://github.com/iissnan/hexo-theme-next/issues/1490), please check your NPM version. + +- `> 3`: Still not work. Please remove `node_modules` directory and reinstall using `npm install`. +- `< 3`: Please add `hexo-util` explicitly via `npm install --save-dev hexo-util` to you site package deps. + +## Update + +```sh +$ cd themes/next +$ git pull +``` + +### Bugs + +> Commit your changes or stash them before you can merge + +You must Commit, Stash or Discard local changes. See [here](https://stackoverflow.com/a/15745424/5861495) how to do it. + +### Theme configurations using Hexo data files ([#328](https://github.com/iissnan/hexo-theme-next/issues/328)) + +Currently, it is not smooth to update NexT theme from pulling or downloading new releases. It is quite often running into conflict status when updating NexT theme via `git pull`, or need to merge configurations manually when upgrading to new releases. + + At present, NexT encourages users to store some options in site's `_config.yml` and other options in theme's `_config.yml`. This approach is applicable, but has some drawbacks: +1. Configurations are splited into two pieces +2. Users maybe confuse which place should be for options + +In order to resolve this issue, NexT will take advantage of Hexo [Data files](https://hexo.io/docs/data-files.html). Because Data files is introduced in Hexo 3, so you need upgrade Hexo to 3.0 (or above) to use this feature. + +If you prefer Hexo 2.x, you can still use the old approach for configurations. NexT is still compatible with Hexo 2.x. + +#### Benefits + +With this feature, now you can put all your configurations into one place (`source/_data/next.yml`), you don't need to touch `next/_config.yml`. If there are any new options in new releases, you just need to copy those options from `next/_config.yml`, paste into `_data/next.yml` and set their values to whatever you want. + +#### How to use this feature + +1. Please ensure you are using Hexo 3 (or above) +2. Create an file named `next.yml` in site's `source/_data` directory (create `_data` directory if it did not exist) +3. Copy NexT theme options both in site's `_config.yml` and theme's `_config.yml` into `next.yml`. +4. Use `--config source/_data/next.yml` parameter to start server, generate or deploy.\ + For example: `hexo clean --config source/_data/next.yml && hexo g --config source/_data/next.yml`. + +## Features + +### Multiple languages support, including: +:cn: Simplified Chinese & Traditional Chinese. and code blocks.
+ codes:
+ external: true
+ family:
+ size: 16
+
+
+# ---------------------------------------------------------------
+# Third Party Services Settings
+# ---------------------------------------------------------------
+
+# MathJax Support
+mathjax:
+ enable: false
+ per_page: false
+ cdn: //cdn.bootcss.com/mathjax/2.7.1/latest.js?config=TeX-AMS-MML_HTMLorMML
+
+# Han Support docs: https://hanzi.pro/
+han: false
+
+# Swiftype Search API Key
+#swiftype_key:
+
+# Baidu Analytics ID
+#baidu_analytics:
+
+# Duoshuo ShortName
+#duoshuo_shortname:
+
+# Disqus
+disqus:
+ enable: false
+ shortname:
+ count: true
+
+# Hypercomments
+#hypercomments_id:
+
+# changyan
+changyan:
+ enable: false
+ appid:
+ appkey:
+
+
+# Valine.
+# You can get your appid and appkey from https://leancloud.cn
+# more info please open https://github.com/xCss/Valine
+valine:
+ enable: true
+ appid: 745bBqqCtC5529IS1Qo7fCOk-gzGzoHsz # your leancloud application appid
+ appkey: AhvFYwuvyKadY9pCVhlMlQYu # your leancloud application appkey
+ notify: false # mail notifier , https://github.com/xCss/Valine/wiki
+ verify: false # Verification code
+ placeholder: Comment input placeholder
+
+# Support for youyan comments system.
+# You can get your uid from http://www.uyan.cc
+#youyan_uid: your uid
+
+# Support for LiveRe comments system.
+# You can get your uid from https://livere.com/insight/myCode (General web site)
+#livere_uid: your uid
+
+# Baidu Share
+# Available value:
+# button | slide
+# Warning: Baidu Share does not support https.
+#baidushare:
+## type: button
+
+# Share
+# This plugin is more useful in China, make sure you known how to use it.
+# And you can find the use guide at official webiste: http://www.jiathis.com/.
+# Warning: JiaThis does not support https.
+#jiathis:
+ ##uid: Get this uid from http://www.jiathis.com/
+#add_this_id:
+
+# Share
+duoshuo_share: true
+
+
+# NeedMoreShare2
+# This plugin is a pure javascript sharing lib which is useful in China.
+# See: https://github.com/revir/need-more-share2
+# Also see: https://github.com/DzmVasileusky/needShareButton
+# iconStyle: default | box
+# boxForm: horizontal | vertical
+# position: top / middle / bottom + Left / Center / Right
+# networks: Weibo,Wechat,Douban,QQZone,Twitter,Linkedin,Mailto,Reddit,
+# Delicious,StumbleUpon,Pinterest,Facebook,GooglePlus,Slashdot,
+# Technorati,Posterous,Tumblr,GoogleBookmarks,Newsvine,
+# Evernote,Friendfeed,Vkontakte,Odnoklassniki,Mailru
+needmoreshare2:
+ enable: true
+ postbottom:
+ enable: true
+ options:
+ iconStyle: box
+ boxForm: horizontal
+ position: bottomCenter
+ networks: Weibo,Wechat,Douban,QQZone,Twitter,Facebook
+ float:
+ enable: true
+ options:
+ iconStyle: box
+ boxForm: horizontal
+ position: middleRight
+ networks: Weibo,Wechat,Douban,QQZone,Twitter,Facebook
+
+# Google Webmaster tools verification setting
+# See: https://www.google.com/webmasters/
+#google_site_verification:
+
+# Google Analytics
+#google_analytics:
+
+# Bing Webmaster tools verification setting
+# See: https://www.bing.com/webmaster/
+#bing_site_verification:
+
+# Yandex Webmaster tools verification setting
+# See: https://webmaster.yandex.ru/
+#yandex_site_verification:
+
+# CNZZ count
+#cnzz_siteid:
+
+# Application Insights
+# See https://azure.microsoft.com/en-us/services/application-insights/
+# application_insights:
+
+# Make duoshuo show UA
+# user_id must NOT be null when admin_enable is true!
+# you can visit http://dev.duoshuo.com get duoshuo user id.
+duoshuo_info:
+ ua_enable: true
+ admin_enable: false
+ user_id: 0
+ #admin_nickname: Author
+
+# Post widgets & FB/VK comments settings.
+# ---------------------------------------------------------------
+# Facebook SDK Support.
+# https://github.com/iissnan/hexo-theme-next/pull/410
+facebook_sdk:
+ enable: false
+ app_id: #
+ fb_admin: #
+ like_button: #true
+ webmaster: #true
+
+# Facebook comments plugin
+# This plugin depends on Facebook SDK.
+# If facebook_sdk.enable is false, Facebook comments plugin is unavailable.
+facebook_comments_plugin:
+ enable: false
+ num_of_posts: 10 # min posts num is 1
+ width: 100% # default width is 550px
+ scheme: light # default scheme is light (light or dark)
+
+# VKontakte API Support.
+# To get your AppID visit https://vk.com/editapp?act=create
+vkontakte_api:
+ enable: false
+ app_id: #
+ like: true
+ comments: true
+ num_of_posts: 10
+
+# Star rating support to each article.
+# To get your ID visit https://widgetpack.com
+rating:
+ enable: false
+ id: #
+ color: fc6423
+# ---------------------------------------------------------------
+
+# Show number of visitors to each article.
+# You can visit https://leancloud.cn get AppID and AppKey.
+leancloud_visitors:
+ enable: true
+ app_id: 745bBqqCtC5529IS1Qo7fCOk-gzGzoHsz #
+ app_key: AhvFYwuvyKadY9pCVhlMlQYu #
+
+# Show PV/UV of the website/page with busuanzi.
+# Get more information on http://ibruce.info/2015/04/04/busuanzi/
+busuanzi_count:
+ # count values only if the other configs are false
+ enable: true
+ # custom uv span for the whole site
+ site_uv: true
+ site_uv_header: 本站总访客数
+ site_uv_footer: 人次
+ # custom pv span for the whole site
+ site_pv: true
+ site_pv_header: 本站总访问量
+ site_pv_footer: 次
+ # custom pv span for one page only
+ page_pv: true
+ page_pv_header: 阅读次数
+ page_pv_footer: 次
+
+
+# Tencent analytics ID
+# tencent_analytics:
+
+# Tencent MTA ID
+# tencent_mta:
+
+
+# Enable baidu push so that the blog will push the url to baidu automatically which is very helpful for SEO
+baidu_push: true
+
+# Google Calendar
+# Share your recent schedule to others via calendar page
+#
+# API Documentation:
+# https://developers.google.com/google-apps/calendar/v3/reference/events/list
+calendar:
+ enable: false
+ calendar_id:
+ api_key:
+ orderBy: startTime
+ offsetMax: 24
+ offsetMin: 4
+ timeZone:
+ showDeleted: false
+ singleEvents: true
+ maxResults: 250
+
+# Algolia Search
+algolia_search:
+ enable: false
+ hits:
+ per_page: 10
+ labels:
+ input_placeholder: Search for Posts
+ hits_empty: "We didn't find any results for the search: ${query}"
+ hits_stats: "${hits} results found in ${time} ms"
+
+# Local search
+# Dependencies: https://github.com/flashlab/hexo-generator-search
+local_search:
+ enable: true
+ # if auto, trigger search by changing input
+ # if manual, trigger search by pressing enter key or search button
+ trigger: auto
+ # show top n results per article, show all results by setting to -1
+ top_n_per_article: 1
+
+
+# ---------------------------------------------------------------
+# Tags Settings
+# ---------------------------------------------------------------
+
+# External URL with BASE64 encrypt & decrypt.
+# Usage: {% exturl text url "title" %}
+# Alias: {% extlink text url "title" %}
+exturl: false
+
+# Note tag (bs-callout).
+note:
+ # Note tag style values:
+ # - simple bs-callout old alert style. Default.
+ # - modern bs-callout new (v2-v3) alert style.
+ # - flat flat callout style with background, like on Mozilla or StackOverflow.
+ # - disabled disable all CSS styles import of note tag.
+ style: simple
+ icons: false
+ border_radius: 3
+ # Offset lighter of background in % for modern and flat styles (modern: -12 | 12; flat: -18 | 6).
+ # Offset also applied to label tag variables. This option can work with disabled note tag.
+ light_bg_offset: 0
+
+# Label tag.
+label: true
+
+# Tabs tag.
+tabs:
+ enable: true
+ transition:
+ tabs: false
+ labels: true
+ border_radius: 0
+
+
+#! ---------------------------------------------------------------
+#! DO NOT EDIT THE FOLLOWING SETTINGS
+#! UNLESS YOU KNOW WHAT YOU ARE DOING
+#! ---------------------------------------------------------------
+
+# Use velocity to animate everything.
+motion:
+ enable: true
+ async: false
+ transition:
+ # Transition variants:
+ # fadeIn | fadeOut | flipXIn | flipXOut | flipYIn | flipYOut | flipBounceXIn | flipBounceXOut | flipBounceYIn | flipBounceYOut
+ # swoopIn | swoopOut | whirlIn | whirlOut | shrinkIn | shrinkOut | expandIn | expandOut
+ # bounceIn | bounceOut | bounceUpIn | bounceUpOut | bounceDownIn | bounceDownOut | bounceLeftIn | bounceLeftOut | bounceRightIn | bounceRightOut
+ # slideUpIn | slideUpOut | slideDownIn | slideDownOut | slideLeftIn | slideLeftOut | slideRightIn | slideRightOut
+ # slideUpBigIn | slideUpBigOut | slideDownBigIn | slideDownBigOut | slideLeftBigIn | slideLeftBigOut | slideRightBigIn | slideRightBigOut
+ # perspectiveUpIn | perspectiveUpOut | perspectiveDownIn | perspectiveDownOut | perspectiveLeftIn | perspectiveLeftOut | perspectiveRightIn | perspectiveRightOut
+ post_block: fadeIn
+ post_header: slideDownIn
+ post_body: slideDownIn
+ coll_header: slideLeftIn
+ # Only for Pisces | Gemini.
+ sidebar: slideUpIn
+
+# Fancybox
+fancybox: true
+
+# Progress bar in the top during page loading.
+pace: true
+# Themes list:
+#pace-theme-big-counter
+#pace-theme-bounce
+#pace-theme-barber-shop
+#pace-theme-center-atom
+#pace-theme-center-circle
+#pace-theme-center-radar
+#pace-theme-center-simple
+#pace-theme-corner-indicator
+#pace-theme-fill-left
+#pace-theme-flash
+#pace-theme-loading-bar
+#pace-theme-mac-osx
+#pace-theme-minimal
+# For example
+# pace_theme: pace-theme-center-simple
+pace_theme: pace-theme-minimal
+
+# Canvas-nest
+canvas_nest: true
+
+# three_waves
+three_waves: false
+
+# canvas_lines
+canvas_lines: false
+
+# canvas_sphere
+canvas_sphere: false
+
+# Only fit scheme Pisces
+# Canvas-ribbon
+canvas_ribbon: false
+
+# Script Vendors.
+# Set a CDN address for the vendor you want to customize.
+# For example
+# jquery: https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js
+# Be aware that you should use the same version as internal ones to avoid potential problems.
+# Please use the https protocol of CDN files when you enable https on your site.
+vendors:
+ # Internal path prefix. Please do not edit it.
+ _internal: lib
+
+ # Internal version: 2.1.3
+ jquery:
+
+ # Internal version: 2.1.5
+ # See: http://fancyapps.com/fancybox/
+ fancybox:
+ fancybox_css:
+
+ # Internal version: 1.0.6
+ # See: https://github.com/ftlabs/fastclick
+ fastclick:
+
+ # Internal version: 1.9.7
+ # See: https://github.com/tuupola/jquery_lazyload
+ lazyload:
+
+ # Internal version: 1.2.1
+ # See: http://VelocityJS.org
+ velocity:
+
+ # Internal version: 1.2.1
+ # See: http://VelocityJS.org
+ velocity_ui:
+
+ # Internal version: 0.7.9
+ # See: https://faisalman.github.io/ua-parser-js/
+ ua_parser:
+
+ # Internal version: 4.6.2
+ # See: http://fontawesome.io/
+ fontawesome:
+
+ # Internal version: 1
+ # https://www.algolia.com
+ algolia_instant_js:
+ algolia_instant_css:
+
+ # Internal version: 1.0.2
+ # See: https://github.com/HubSpot/pace
+ # Or use direct links below:
+ # pace: //cdn.bootcss.com/pace/1.0.2/pace.min.js
+ # pace_css: //cdn.bootcss.com/pace/1.0.2/themes/blue/pace-theme-flash.min.css
+ pace:
+ pace_css:
+
+ # Internal version: 1.0.0
+ # https://github.com/hustcc/canvas-nest.js
+ canvas_nest:
+
+ # three
+ three:
+
+ # three_waves
+ # https://github.com/jjandxa/three_waves
+ three_waves:
+
+ # three_waves
+ # https://github.com/jjandxa/canvas_lines
+ canvas_lines:
+
+ # three_waves
+ # https://github.com/jjandxa/canvas_sphere
+ canvas_sphere:
+
+ # Internal version: 1.0.0
+ # https://github.com/zproo/canvas-ribbon
+ canvas_ribbon:
+
+ # Internal version: 3.3.0
+ # https://github.com/ethantw/Han
+ han:
+
+
+# Assets
+css: css
+js: js
+images: images
+
+# Theme version
+version: 5.1.3
+
+# 文章末尾添加“本文结束”标记
+passage_end_tag:
+ enabled: true
+
+# Post wordcount display settings
+
+
diff --git a/themes/Next/bower.json b/themes/Next/bower.json
new file mode 100644
index 0000000..ec1ec27
--- /dev/null
+++ b/themes/Next/bower.json
@@ -0,0 +1,37 @@
+{
+ "name": "isn-next",
+ "version": "5.1.3",
+ "homepage": "https://github.com/iissnan/hexo-theme-next",
+ "authors": [
+ "iissnan "
+ ],
+ "description": "Elegant theme for Hexo",
+ "repository": "https://github.com/iissnan/hexo-theme-next",
+ "keywords": [
+ "hexo",
+ "notes",
+ "theme",
+ "iissnan",
+ "NexT"
+ ],
+ "license": "MIT",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "source/lib",
+ "test",
+ "tests",
+ "screenshots"
+ ],
+ "dependencies": {
+ "fancybox": "~2.1.5",
+ "velocity": "~1.2.1",
+ "jquery": "http://code.jquery.com/jquery-2.1.3.min.js",
+ "fastclick": "~1.0.6",
+ "font-awesome": "fontawesome#*",
+ "jquery_lazyload": "jquery.lazyload#~1.9.7",
+ "ua-parser-js": "~0.7.9",
+ "Han": "^3.3.0"
+ }
+}
diff --git a/themes/Next/googleab6c97dd37c3166f.html b/themes/Next/googleab6c97dd37c3166f.html
new file mode 100644
index 0000000..13a020d
--- /dev/null
+++ b/themes/Next/googleab6c97dd37c3166f.html
@@ -0,0 +1 @@
+google-site-verification: googleab6c97dd37c3166f.html
diff --git a/themes/Next/gulpfile.coffee b/themes/Next/gulpfile.coffee
new file mode 100644
index 0000000..c7d706b
--- /dev/null
+++ b/themes/Next/gulpfile.coffee
@@ -0,0 +1,54 @@
+fs = require('fs')
+path = require('path')
+gulp = require('gulp')
+jshint = require('gulp-jshint')
+stylish = require('jshint-stylish')
+shell = require('gulp-shell')
+yaml = require('js-yaml')
+
+gulp.task 'lint', ->
+ return gulp.src([
+ './source/js/src/utils.js',
+ './source/js/src/motion.js',
+ './source/js/src/hook-duoshuo.js',
+ './source/js/src/algolia-search.js',
+ './source/js/src/bootstrap.js',
+ './source/js/src/post-details.js',
+ './source/js/src/schemes/pisces.js'
+ ]).pipe jshint()
+ .pipe jshint.reporter(stylish)
+
+gulp.task 'lint:stylus', shell.task [
+ '"./node_modules/.bin/stylint" ./source/css/'
+]
+
+gulp.task 'validate:config', (cb) ->
+ themeConfig = fs.readFileSync path.join(__dirname, '_config.yml')
+
+ try
+ yaml.safeLoad(themeConfig)
+ cb()
+ catch error
+ cb new Error(error)
+
+gulp.task 'validate:languages', (cb) ->
+ languagesPath = path.join __dirname, 'languages'
+ languages = fs.readdirSync languagesPath
+ errors = []
+
+ for lang in languages
+ languagePath = path.join languagesPath, lang
+ try
+ yaml.safeLoad fs.readFileSync(languagePath), {
+ filename: path.relative(__dirname, languagePath)
+ }
+ catch error
+ errors.push error
+
+ if errors.length == 0
+ cb()
+ else
+ cb(errors)
+
+
+gulp.task 'default', ['lint', 'validate:config', 'validate:languages']
diff --git a/themes/Next/languages/de.yml b/themes/Next/languages/de.yml
new file mode 100644
index 0000000..8c74a69
--- /dev/null
+++ b/themes/Next/languages/de.yml
@@ -0,0 +1,90 @@
+title:
+ archive: Archiv
+ category: Kategorie
+ tag: Tag
+
+author: Author
+
+menu:
+ home: Startseite
+ archives: Archiv
+ categories: Kategorien
+ tags: Tags
+ about: Über
+ feed: RSS
+ search: Suche
+
+sidebar:
+ overview: Übersicht
+ toc: Inhaltsverzeichnis
+
+post:
+ created: Post created
+ sticky: Sticky
+ posted: Veröffentlicht am
+ modified: Updated at
+ in: in
+ read_more: Weiterlesen
+ untitled: Unbenannt
+ toc_empty: Dieser Artikel hat kein Inhaltsverzeichnis
+ visitors: Visitors
+ wordcount: Words count in article
+ min2read: Reading time
+ totalcount: Site words total count
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: Gesamt
+ tags: tags
+
+footer:
+ powered: "Erstellt mit %s"
+ theme: Theme
+
+counter:
+ tag_cloud:
+ zero: Keine Tags
+ one: Insgesamt ein Tag
+ other: "Insgesamt %d Tags"
+
+ categories:
+ zero: Keine Kategorien
+ one: Insgesamt eine Kategorie
+ other: "Insgesamt %d Kategorien"
+
+ archive_posts:
+ zero: Keine Artikel vorhanden.
+ one: Ein Artikel.
+ other: "Insgesamt %d Artikel."
+
+state:
+ posts: Artikel
+ pages: Seiten
+ tags: Tags
+ categories: Kategorien
+
+cheers:
+ um: Öhm..
+ ok: OK
+ nice: Schön
+ good: Gut
+ great: Wunderbar
+ excellent: Exzellent
+
+keep_on: Bleib dran.
+
+symbol:
+ comma: '. '
+ period: ', '
+ colon: ':'
+
+reward:
+ donate: Donate
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/themes/Next/languages/default.yml b/themes/Next/languages/default.yml
new file mode 100644
index 0000000..b1fec61
--- /dev/null
+++ b/themes/Next/languages/default.yml
@@ -0,0 +1,97 @@
+title:
+ archive: Archive
+ category: Category
+ tag: Tag
+ schedule: Schedule
+
+author: Author
+
+menu:
+ home: Home
+ archives: Archives
+ categories: Categories
+ tags: Tags
+ about: About
+ search: Search
+ schedule: Schedule
+ sitemap: Sitemap
+ commonweal: Commonweal 404
+
+sidebar:
+ overview: Overview
+ toc: Table of Contents
+
+post:
+ created: Post created
+ modified: Post modified
+ sticky: Sticky
+ posted: Posted on
+ in: In
+ more: more
+ read_more: Read more
+ untitled: Untitled
+ toc_empty: This post does not have a Table of Contents
+ visitors: Visitors
+ wordcount: Words count in article
+ min2read: Reading time
+ totalcount: Site words total count
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: Totally
+ tags: tags
+
+footer:
+ powered: "Powered by %s"
+ theme: Theme
+
+counter:
+ tag_cloud:
+ zero: No tags
+ one: 1 tag in total
+ other: "%d tags in total"
+
+ categories:
+ zero: No categories
+ one: 1 category in total
+ other: "%d categories in total"
+
+ archive_posts:
+ zero: No posts.
+ one: 1 post.
+ other: "%d posts in total."
+
+state:
+ posts: posts
+ pages: pages
+ tags: tags
+ categories: categories
+
+search:
+ placeholder: Searching...
+
+cheers:
+ um: Um..
+ ok: OK
+ nice: Nice
+ good: Good
+ great: Great
+ excellent: Excellent
+
+keep_on: Keep on posting.
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Donate
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/themes/Next/languages/en.yml b/themes/Next/languages/en.yml
new file mode 100644
index 0000000..37fe1db
--- /dev/null
+++ b/themes/Next/languages/en.yml
@@ -0,0 +1,99 @@
+title:
+ archive: Archive
+ category: Category
+ tag: Tag
+ schedule: Schedule
+
+author: Author
+
+menu:
+ home: Home
+ archives: Archives
+ categories: Categories
+ tags: Tags
+ about: About
+ search: Search
+ schedule: Schedule
+ sitemap: Sitemap
+ commonweal: Commonweal 404
+
+sidebar:
+ overview: Overview
+ toc: Table of Contents
+
+post:
+ created: Post created
+ modified: Post modified
+ sticky: Sticky
+ posted: Posted on
+ in: In
+ more: more
+ read_more: Read more
+ untitled: Untitled
+ toc_empty: This post does not have a Table of Contents
+ visitors: Visitors
+ wordcount: Words count in article
+ min2read: Reading time
+ totalcount: Site words total count
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: Totally
+ tags: tags
+
+footer:
+ powered: "Powered by %s"
+ theme: Theme
+
+counter:
+ tag_cloud:
+ zero: No tags
+ one: 1 tag in total
+ other: "%d tags in total"
+
+ categories:
+ zero: No categories
+ one: 1 category in total
+ other: "%d categories in total"
+
+ archive_posts:
+ zero: No posts.
+ one: 1 post.
+ other: "%d posts in total."
+
+state:
+ posts: posts
+ pages: pages
+ tags: tags
+ categories: categories
+
+search:
+ placeholder: Searching...
+
+cheers:
+ um: Um..
+ ok: OK
+ nice: Nice
+ good: Good
+ great: Great
+ excellent: Excellent
+
+keep_on: Keep on posting.
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Donate
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
+
+gitmentbutton: Show comments from Gitment
diff --git a/themes/Next/languages/fr-FR.yml b/themes/Next/languages/fr-FR.yml
new file mode 100644
index 0000000..6a3d2ae
--- /dev/null
+++ b/themes/Next/languages/fr-FR.yml
@@ -0,0 +1,88 @@
+title:
+ archive: Archive
+ category: Catégorie
+ tag: Tag
+
+author: Author
+
+menu:
+ home: Accueil
+ archives: Archives
+ categories: Categories
+ tags: Tags
+ about: A propos
+ search: recherche
+
+sidebar:
+ overview: Ensemble
+ toc: Table Des Matières
+
+post:
+ sticky: Sticky
+ posted: Posté le
+ modified: Updated at
+ in: In
+ read_more: Lire la suite
+ untitled: Non titré
+ toc_empty: This post does not have a Table of Contents
+ visitors: Visitors
+ wordcount: Words count in article
+ min2read: Reading time
+ totalcount: Site words total count
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: Total
+ tags: tags
+
+footer:
+ powered: "Powered by %s"
+ theme: Thème
+
+counter:
+ tag_cloud:
+ zero: Aucun tags
+ one: 1 tag au total
+ other: "%d tags au total"
+
+ categories:
+ zero: Aucun categories
+ one: 1 category au total
+ other: "%d categories au total"
+
+ archive_posts:
+ zero: Aucun article.
+ one: 1 article.
+ other: "%d articles au total."
+
+state:
+ posts: articles
+ pages: pages
+ tags: tags
+ categories: categories
+
+cheers:
+ um: Um..
+ ok: OK
+ nice: Jolie
+ good: Bien
+ great: Super
+ excellent: Excellent
+
+keep_on: Et ca ne fait que commencer.
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Donate
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/themes/Next/languages/id.yml b/themes/Next/languages/id.yml
new file mode 100644
index 0000000..0e81fe4
--- /dev/null
+++ b/themes/Next/languages/id.yml
@@ -0,0 +1,88 @@
+title:
+ archive: Arsip
+ category: Kategori
+ tag: Tag
+
+author: Penulis
+
+menu:
+ home: Beranda
+ archives: Arsip
+ categories: Kategori
+ tags: Tags
+ about: Tentang
+ search: Pencarian
+
+sidebar:
+ overview: Ikhtisar
+ toc: Daftar Isi
+
+post:
+ sticky: Sticky
+ posted: Diposting di
+ modified: Updated at
+ in: Di
+ read_more: Baca lebih
+ untitled: Tidak ada title
+ toc_empty: Posting ini tidak memiliki Daftar Isi
+ visitors: Pengunjung
+ wordcount: Words count in article
+ min2read: Reading time
+ totalcount: Site words total count
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: Total
+ tags: tags
+
+footer:
+ powered: "Powered by %s"
+ theme: Tema
+
+counter:
+ tag_cloud:
+ zero: Tidak ada tags
+ one: 1 total tag
+ other: "%d total tags"
+
+ categories:
+ zero: Tidak ada kategori
+ one: 1 total categori
+ other: "%d total kategori"
+
+ archive_posts:
+ zero: Tidak ada posting.
+ one: 1 posting.
+ other: "%d total posting."
+
+state:
+ posts: posting
+ pages: halaman
+ tags: tags
+ categories: kategori
+
+cheers:
+ um: Um..
+ ok: OK
+ nice: Bagus
+ good: Bagus
+ great: Besar
+ excellent: Baik
+
+keep_on: Terus Posting.
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Donate
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/themes/Next/languages/it.yml b/themes/Next/languages/it.yml
new file mode 100644
index 0000000..39aa40e
--- /dev/null
+++ b/themes/Next/languages/it.yml
@@ -0,0 +1,97 @@
+title:
+ archive: Archivio
+ category: Categoria
+ tag: Tag
+ schedule: Programma
+
+author: Autore
+
+menu:
+ home: Home
+ archives: Archivi
+ categories: Categorie
+ tags: Tags
+ about: Informazioni su
+ search: Cerca
+ schedule: Programma
+ sitemap: Sitemap
+ commonweal: Commonweal 404
+
+sidebar:
+ overview: Panoramica
+ toc: Indice
+
+post:
+ created: Post creato
+ modified: Post modificato
+ sticky: Sticky
+ posted: Scritto il
+ in: In
+ more: espandi
+ read_more: Leggi di più
+ untitled: Senza titolo
+ toc_empty: Questo post non ha un indice
+ visitors: Visitatori
+ wordcount: Numero di parole nell'articolo
+ min2read: Tempo di lettura
+ totalcount: Numero totale di parole
+ copyright:
+ author: Autore
+ link: Link
+ license_title: Copyright
+ license_content: 'Tutti gli articoli in questo sito sono sotto licenza
+ %s salvo disposizione contraria.'
+
+page:
+ totally: Totale
+ tags: tags
+
+footer:
+ powered: "Powered by %s"
+ theme: Tema
+
+counter:
+ tag_cloud:
+ zero: Nessun tag
+ one: 1 tag in totale
+ other: "%d tags in totale."
+
+ categories:
+ zero: Nessuna categoria
+ one: 1 categoria in totale
+ other: "%d categorie in totale."
+
+ archive_posts:
+ zero: Nessun post.
+ one: 1 post.
+ other: "%d posts in totale."
+
+state:
+ posts: posts
+ pages: pagine
+ tags: tags
+ categories: categorie
+
+search:
+ placeholder: Cerca...
+
+cheers:
+ um: Mh..
+ ok: OK
+ nice: Bello
+ good: Buono
+ great: Ottimo
+ excellent: Eccellente
+
+keep_on: Continua così.
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Dona
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/themes/Next/languages/ja.yml b/themes/Next/languages/ja.yml
new file mode 100644
index 0000000..990e5f2
--- /dev/null
+++ b/themes/Next/languages/ja.yml
@@ -0,0 +1,88 @@
+title:
+ archive: アーカイブ
+ category: カテゴリ
+ tag: タグ
+
+author: Author
+
+menu:
+ home: ホーム
+ archives: アーカイブ
+ categories: カテゴリ
+ tags: タグ
+ about: About
+ search: 検索
+
+sidebar:
+ overview: 概要
+ toc: 見出し
+
+post:
+ sticky: 固定
+ posted: 投稿日
+ modified: Updated at
+ in: In
+ read_more: 続きを読む
+ untitled: 無題
+ toc_empty: 見出しがありません
+ visitors: Visitors
+ wordcount: Words count in article
+ min2read: Reading time
+ totalcount: Site words total count
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: 全ページ
+ tags: タグ
+
+footer:
+ powered: "Powered by %s"
+ theme: Theme
+
+counter:
+ tag_cloud:
+ zero: タグなし
+ one: "全 1 タグ"
+ other: "全 %d タグ"
+
+ categories:
+ zero: カテゴリなし
+ one: "全 1 カテゴリ"
+ other: "全 %d カテゴリ"
+
+ archive_posts:
+ zero: ポストなし
+ one: "全 1 ポスト"
+ other: "全 %d ポスト"
+
+state:
+ posts: ポスト
+ pages: ページ
+ tags: タグ
+ categories: カテゴリ
+
+cheers:
+ um: うーん
+ ok: OK
+ nice: まあまあ
+ good: いいね
+ great: すごい
+ excellent: 最高
+
+keep_on: もっと書こう!
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Donate
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/themes/Next/languages/ko.yml b/themes/Next/languages/ko.yml
new file mode 100644
index 0000000..df4e736
--- /dev/null
+++ b/themes/Next/languages/ko.yml
@@ -0,0 +1,88 @@
+title:
+ archive: 아카이브
+ category: 카테고리
+ tag: 태그
+
+author: 작성자
+
+menu:
+ home: 홈
+ archives: 아카이브
+ categories: 카테고리
+ tags: 태그
+ about: About
+ search: 검색
+
+sidebar:
+ overview: 흝어보기
+ toc: 목차
+
+post:
+ sticky: 고정
+ posted: 작성일
+ modified: Updated at
+ in: In
+ read_more: 더 읽어보기
+ untitled: 제목 없음
+ toc_empty: 목차 없음
+ visitors: 방문객
+ wordcount: Words count in article
+ min2read: Reading time
+ totalcount: Site words total count
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: 모두
+ tags: 태그
+
+footer:
+ powered: "Powered by %s"
+ theme: Theme
+
+counter:
+ tag_cloud:
+ zero: 태그 없음
+ one: 1개의 태그
+ other: "총 %d개의 태그"
+
+ categories:
+ zero: 카테고리 없음
+ one: 1개의 카테고리
+ other: "총 %d개의 카테고리"
+
+ archive_posts:
+ zero: 포스트 없음
+ one: 1개의 포스트
+ other: "총 %d개의 포스트"
+
+state:
+ posts: 포스트
+ pages: 페이지
+ tags: 태그
+ categories: 카테고리
+
+cheers:
+ um: 음..
+ ok: OK
+ nice: 잘했어요
+ good: 좋아요
+ great: 훌륭해요
+ excellent: 완벽해요
+
+keep_on: 포스트를 마저 작성하세요
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Donate
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/themes/Next/languages/nl-NL.yml b/themes/Next/languages/nl-NL.yml
new file mode 100644
index 0000000..4acd836
--- /dev/null
+++ b/themes/Next/languages/nl-NL.yml
@@ -0,0 +1,97 @@
+title:
+ archive: Archief
+ category: Categorie
+ tag: Label
+ schedule: Rooster
+
+author: Auteur
+
+menu:
+ home: Home
+ archives: Archieven
+ categories: Categorieën
+ tags: Labels
+ about: Over
+ search: Zoeken
+ schedule: Rooster
+ sitemap: Sitemap
+ commonweal: Gezond verstand 404
+
+sidebar:
+ overview: Overzicht
+ toc: Inhoudsopgave
+
+post:
+ created: Post aangemaakt
+ modified: Post aangepast
+ sticky: Sticky
+ posted: Geplaatst op
+ in: In
+ more: meer
+ read_more: Lees meer
+ untitled: Naamloos
+ toc_empty: Deze post heeft geen inhoudsopgave
+ visitors: Bezoekers
+ wordcount: Aantal woorden in artikel
+ min2read: Leestijd
+ totalcount: Aantal woorden in site
+ copyright:
+ author: Post auteur
+ link: Post link
+ license_title: Copyright melding
+ license_content: 'Alle artikelen op deze blog zijn gelicenseerd onder
+ %s, mits niet anders aangegeven.'
+
+page:
+ totally: Totaal
+ tags: labels
+
+footer:
+ powered: "Mede mogelijk gemaakt door %s"
+ theme: Thema
+
+counter:
+ tag_cloud:
+ zero: Geen labels
+ one: 1 label in totaal
+ other: "%d labels in totaal"
+
+ categories:
+ zero: Geen categorieën
+ one: 1 categorie in totaal
+ other: "%d categorieën in totaal"
+
+ archive_posts:
+ zero: Geen posts.
+ one: 1 post.
+ other: "%d posts in totaal."
+
+state:
+ posts: posts
+ pages: pagina's
+ tags: labels
+ categories: categorieën
+
+search:
+ placeholder: Zoeken...
+
+cheers:
+ um: Um..
+ ok: Oké
+ nice: Leuk
+ good: Goed
+ great: Geweldig
+ excellent: Uitstekend
+
+keep_on: Blijf posten.
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Doneer
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/themes/Next/languages/pt-BR.yml b/themes/Next/languages/pt-BR.yml
new file mode 100644
index 0000000..64f2da0
--- /dev/null
+++ b/themes/Next/languages/pt-BR.yml
@@ -0,0 +1,88 @@
+title:
+ archive: Arquivo
+ category: Categoria
+ tag: Tag
+
+author: Autor
+
+menu:
+ home: Home
+ archives: Arquivos
+ categories: Categorias
+ tags: Tags
+ about: Sobre
+ search: Pesquisar
+
+sidebar:
+ overview: Visão geral
+ toc: Tabela de conteúdo
+
+post:
+ sticky: Sticky
+ posted: Postado em
+ modified: Updated at
+ in: Em
+ read_more: Leia mais
+ untitled: Sem título
+ toc_empty: Este post não possui tabela de conteúdo
+ visitors: Visitantes
+ wordcount: Words count in article
+ min2read: Reading time
+ totalcount: Site words total count
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: Totalmente
+ tags: tags
+
+footer:
+ powered: "Feito com %s"
+ theme: Tema
+
+counter:
+ tag_cloud:
+ zero: Sem tags
+ one: 1 tag no total de
+ other: "%d tags no total de"
+
+ categories:
+ zero: Sem categoria
+ one: 1 categoria no total de
+ other: "%d categoria no total de"
+
+ archive_posts:
+ zero: Sem posts.
+ one: 1 post.
+ other: "%d posts no total."
+
+state:
+ posts: Posts
+ pages: Páginas
+ tags: Tags
+ categories: Categorias
+
+cheers:
+ um: Uhmmmm...
+ ok: OK
+ nice: Bom
+ good: Muito Bom
+ great: Ótimo
+ excellent: Excelente
+
+keep_on: Continuar no post.
+
+symbol:
+ comma: '. '
+ period: ', '
+ colon: ':'
+
+reward:
+ donate: Donate
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/themes/Next/languages/pt.yml b/themes/Next/languages/pt.yml
new file mode 100644
index 0000000..9c83699
--- /dev/null
+++ b/themes/Next/languages/pt.yml
@@ -0,0 +1,88 @@
+title:
+ archive: Arquivo
+ category: Categoria
+ tag: Tag
+
+author: Author
+
+menu:
+ home: Home
+ archives: Arquivos
+ categories: Categorias
+ tags: Tags
+ about: Sobre
+ search: Pesquisa
+
+sidebar:
+ overview: Visão Geral
+ toc: Tabela de Conteúdo
+
+post:
+ sticky: Sticky
+ posted: Postado em
+ modified: Updated at
+ in: Em
+ read_more: Ler mais
+ untitled: Sem título
+ toc_empty: Esta publicação não possui uma tabela de conteúdo
+ visitors: Visitors
+ wordcount: Words count in article
+ min2read: Reading time
+ totalcount: Site words total count
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: Totalmente
+ tags: tags
+
+footer:
+ powered: "Desenvolvido com amor com %s"
+ theme: Tema
+
+counter:
+ tag_cloud:
+ zero: Sem tags
+ one: 1 tag no total
+ other: "%d tags no total"
+
+ categories:
+ zero: Sem categorias
+ one: 1 categoria no total
+ other: "%d categorias no total"
+
+ archive_posts:
+ zero: Sem publicações.
+ one: 1 post.
+ other: "%d publicações no total."
+
+state:
+ posts: publicações
+ pages: páginas
+ tags: tags
+ categories: categorias
+
+cheers:
+ um: Um..
+ ok: OK
+ nice: Legal
+ good: Bom
+ great: Grandioso
+ excellent: Excelente
+
+keep_on: Mantenha-se publicando!
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Donate
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/themes/Next/languages/ru.yml b/themes/Next/languages/ru.yml
new file mode 100644
index 0000000..55b6df1
--- /dev/null
+++ b/themes/Next/languages/ru.yml
@@ -0,0 +1,105 @@
+title:
+ archive: Архив
+ category: Категория
+ tag: Тэг
+ schedule: Календарь
+
+author: Автор
+
+menu:
+ home: Главная
+ archives: Архив
+ categories: Категории
+ tags: Тэги
+ about: О сайте
+ search: Поиск
+ schedule: Календарь
+ sitemap: Карта сайта
+
+sidebar:
+ overview: Обзор
+ toc: Содержание
+
+post:
+ created: Дата создания записи
+ modified: Дата обновления записи
+ sticky: Ссылка
+ posted: Размещено
+ in: в категории
+ more: далее
+ read_more: Читать полностью
+ untitled: Без имени
+ toc_empty: Эта запись без оглавления
+ visitors: Просмотров
+ wordcount: Кол-во слов в статье
+ min2read: Время чтения в минутах
+ totalcount: Общее кол-во слов в записях
+ copyright:
+ author: Автор записи
+ link: Ссылка на запись
+ license_title: Информация об авторских правах
+ license_content: 'Все записи на этом сайте защищены лицензией
+ %s если не указано дополнительно.'
+
+page:
+ totally: Всего
+ tags: тэги
+
+footer:
+ powered: "Powered by %s"
+ theme: Theme
+
+counter:
+ tag_cloud:
+ zero: Нет тэгов.
+ one: 1 тэг.
+ two: "%d тэга всего."
+ three: "%d тэга всего."
+ four: "%d тэга всего."
+ other: "%d тэгов всего."
+
+ categories:
+ zero: Нет категорий.
+ one: 1 категория.
+ two: "%d категории всего."
+ three: "%d категории всего."
+ four: "%d категории всего."
+ other: "%d категорий всего."
+
+ archive_posts:
+ zero: Нет записей.
+ one: 1 запись.
+ two: "%d записи всего."
+ three: "%d записи всего."
+ four: "%d записи всего."
+ other: "%d записей всего."
+
+state:
+ posts: Архив
+ pages: Страницы
+ tags: Тэги
+ categories: Категории
+
+search:
+ placeholder: Поиск...
+
+cheers:
+ um: Эм..
+ ok: OK
+ nice: Неплохо
+ good: Хорошо
+ great: Замечательно
+ excellent: Великолепно
+
+keep_on: Продолжаю писать.
+
+symbol:
+ comma: ', '
+ period: '. '
+ colon: ':'
+
+reward:
+ donate: Донат
+ wechatpay: WeChat Pay
+ alipay: Alipay
+ bitcoin: Bitcoin
diff --git a/themes/Next/languages/zh-Hans.yml b/themes/Next/languages/zh-Hans.yml
new file mode 100644
index 0000000..b90158b
--- /dev/null
+++ b/themes/Next/languages/zh-Hans.yml
@@ -0,0 +1,100 @@
+title:
+ archive: 归档
+ category: 分类
+ tag: 标签
+ schedule: 日程表
+
+author: 博主
+
+menu:
+ home: 首页
+ archives: 归档
+ categories: 分类
+ tags: 标签
+ about: 关于
+ search: 搜索
+ schedule: 日程表
+ sitemap: 站点地图
+ commonweal: 公益404
+ guestbook: 留言
+
+
+sidebar:
+ overview: 站点概览
+ toc: 文章目录
+
+post:
+ created: 创建于
+ modified: 更新于
+ sticky: 置顶
+ posted: 发表于
+ in: 分类于
+ read_more: 阅读全文
+ untitled: 未命名
+ toc_empty: 此文章未包含目录
+ visitors: 阅读次数
+ wordcount: 字数统计
+ min2read: 阅读时长
+ totalcount: Site words total count
+ copyright:
+ author: 本文作者
+ link: 本文链接
+ license_title: 版权声明
+ license_content: '本博客所有文章除特别声明外,均采用
+ %s 许可协议。转载请注明出处!'
+
+page:
+ totally: 共有
+ tags: 标签
+
+footer:
+ powered: "由 %s 强力驱动"
+ theme: 主题
+
+counter:
+ tag_cloud:
+ zero: 暂无标签
+ one: 目前共计 1 个标签
+ other: "目前共计 %d 个标签"
+
+ categories:
+ zero: 暂无分类
+ one: 目前共计 1 个分类
+ other: "目前共计 %d 个分类"
+
+ archive_posts:
+ zero: 暂无日志。
+ one: 目前共计 1 篇日志。
+ other: "目前共计 %d 篇日志。"
+
+state:
+ posts: 日志
+ pages: 页面
+ tags: 标签
+ categories: 分类
+
+search:
+ placeholder: 搜索...
+
+cheers:
+ um: 嗯..
+ ok: OK
+ nice: 好
+ good: 很好
+ great: 非常好
+ excellent: 太棒了
+
+keep_on: 继续努力。
+
+symbol:
+ comma: ', '
+ period: '。 '
+ colon: ':'
+
+reward:
+ donate: 打赏
+ wechatpay: 微信支付
+ alipay: 支付宝
+ bitcoin: 比特币
+
+gitmentbutton: 显示 Gitment 评论
diff --git a/themes/Next/languages/zh-hk.yml b/themes/Next/languages/zh-hk.yml
new file mode 100644
index 0000000..dddc1f3
--- /dev/null
+++ b/themes/Next/languages/zh-hk.yml
@@ -0,0 +1,98 @@
+title:
+ archive: 歸檔
+ category: 分類
+ tag: 標籤
+ schedule: 日程表
+
+author: 博主
+
+menu:
+ home: 首頁
+ archives: 歸檔
+ categories: 分類
+ tags: 標籤
+ about: 關於
+ search: 檢索
+ schedule: 日程表
+ sitemap: 站點地圖
+ commonweal: 公益404
+
+sidebar:
+ overview: 本站概覽
+ toc: 文章目錄
+
+post:
+ created: 創建於
+ modified: 更新於
+ sticky: 置頂
+ posted: 發表於
+ in: 分類於
+ read_more: 閱讀全文
+ untitled: 未命名
+ toc_empty: 此文章未包含目錄
+ visitors: 閱讀次數
+ wordcount: 字數統計
+ min2read: 閱讀時長
+ totalcount: Site words total count
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: 共有
+ tags: 標籤
+
+footer:
+ powered: "由 %s 強力驅動"
+ theme: 主題
+
+counter:
+ tag_cloud:
+ zero: 暫無標籤
+ one: 目前共有 1 個標籤
+ other: "目前共有 %d 個標籤"
+
+ categories:
+ zero: 暫無分類
+ one: 目前共有 1 個分類
+ other: "目前共有 %d 個分類"
+
+ archive_posts:
+ zero: 暫無文章。
+ one: 目前共有 1 篇文章。
+ other: "目前共有 %d 篇文章。"
+
+state:
+ posts: 文章
+ pages: 頁面
+ tags: 標籤
+ categories: 分類
+
+search:
+ placeholder: 搜索...
+
+cheers:
+ um: 嗯..
+ ok: OK
+ nice: 好
+ good: 很好
+ great: 非常好
+ excellent: 激爆好
+
+keep_on: 繼續努力。
+
+symbol:
+ comma: ', '
+ period: '。 '
+ colon: ':'
+
+reward:
+ donate: 打賞
+ wechatpay: 微信支付
+ alipay: 支付寶
+ bitcoin: 比特幣
+
+gitmentbutton: 顯示 Gitment 評論
diff --git a/themes/Next/languages/zh-tw.yml b/themes/Next/languages/zh-tw.yml
new file mode 100644
index 0000000..1b87af5
--- /dev/null
+++ b/themes/Next/languages/zh-tw.yml
@@ -0,0 +1,98 @@
+title:
+ archive: 歸檔
+ category: 分類
+ tag: 標籤
+ schedule: 日程表
+
+author: 博主
+
+menu:
+ home: 首頁
+ archives: 歸檔
+ categories: 分類
+ tags: 標籤
+ about: 關於
+ search: 檢索
+ schedule: 日程表
+ sitemap: 站點地圖
+ commonweal: 公益404
+
+sidebar:
+ overview: 本站概覽
+ toc: 文章目錄
+
+post:
+ created: 創建於
+ modified: 更新於
+ sticky: 置頂
+ posted: 發表於
+ in: 分類於
+ read_more: 閱讀全文
+ untitled: 未命名
+ toc_empty: 此文章未包含目錄
+ visitors: 閱讀次數
+ wordcount: 字數統計
+ min2read: 閱讀時長
+ totalcount: Site words total count
+ copyright:
+ author: Post author
+ link: Post link
+ license_title: Copyright Notice
+ license_content: 'All articles in this blog are licensed under
+ %s unless stating additionally.'
+
+page:
+ totally: 共有
+ tags: 標籤
+
+footer:
+ powered: "由 %s 強力驅動"
+ theme: 主題
+
+counter:
+ tag_cloud:
+ zero: 暫無標籤
+ one: 目前共計 1 個標籤
+ other: "目前共計 %d 個標籤"
+
+ categories:
+ zero: 暫無分類
+ one: 目前共計 1 個分類
+ other: "目前共計 %d 個分類"
+
+ archive_posts:
+ zero: 暫無文章。
+ one: 目前共計 1 篇文章。
+ other: "目前共計 %d 篇文章。"
+
+state:
+ posts: 文章
+ pages: 頁面
+ tags: 標籤
+ categories: 分類
+
+search:
+ placeholder: 搜索...
+
+cheers:
+ um: 嗯..
+ ok: OK
+ nice: 好
+ good: 很好
+ great: 非常好
+ excellent: 非常屌
+
+keep_on: 繼續努力。
+
+symbol:
+ comma: ', '
+ period: '。 '
+ colon: ':'
+
+reward:
+ donate: 打賞
+ wechatpay: 微信支付
+ alipay: 支付寶
+ bitcoin: 比特幣
+
+gitmentbutton: 顯示 Gitment 評論
diff --git a/themes/Next/layout/_custom/header.swig b/themes/Next/layout/_custom/header.swig
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/themes/Next/layout/_custom/header.swig
@@ -0,0 +1 @@
+
diff --git a/themes/Next/layout/_custom/sidebar.swig b/themes/Next/layout/_custom/sidebar.swig
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/themes/Next/layout/_custom/sidebar.swig
@@ -0,0 +1 @@
+
diff --git a/themes/Next/layout/_layout.swig b/themes/Next/layout/_layout.swig
new file mode 100644
index 0000000..a33555a
--- /dev/null
+++ b/themes/Next/layout/_layout.swig
@@ -0,0 +1,91 @@
+
+
+{% set html_class = 'theme-next ' + theme.scheme %}
+{% if theme.motion.enable %}
+ {% set html_class = html_class + ' use-motion' %}
+{% endif %}
+
+
+
+ {% include '_partials/head.swig' %}
+ {% block title %}{% endblock %}
+ {% include '_third-party/analytics/index.swig' %}
+
+
+
+
+ {% set container_class = "container " %}
+ {% if theme.sidebar.position %}
+ {% set container_class = container_class + 'sidebar-position-' + theme.sidebar.position %}
+ {% endif %}
+
+
+
+
+
+ {%- include '_partials/header.swig' %}
+
+
+
+
+
+
+ {% block content %}{% endblock %}
+
+ {% include '_third-party/duoshuo-hot-articles.swig' %}
+ {% include '_partials/comments.swig' %}
+
+ {% if theme.sidebar.display !== 'remove' %}
+ {% block sidebar %}{% endblock %}
+ {% endif %}
+
+
+
+
+
+ {% if not theme.sidebar.b2t %}
+
+
+ {% if theme.sidebar.scrollpercent %}
+ 0%
+ {% endif %}
+
+ {% endif %}
+
+ {% if theme.needmoreshare2.enable and theme.needmoreshare2.float.enable %}
+
+ {% endif %}
+
+
+
+ {% include '_scripts/vendors.swig' %}
+ {% include '_scripts/commons.swig' %}
+
+ {% set scheme_script = '_scripts/schemes/' + theme.scheme | lower + '.swig' %}
+ {% include scheme_script %}
+
+ {% block script_extra %}{% endblock %}
+
+ {% include '_scripts/boostrap.swig' %}
+
+ {% include '_third-party/comments/index.swig' %}
+ {% include '_third-party/search/index.swig' %}
+ {% include '_third-party/analytics/lean-analytics.swig' %}
+ {% include '_third-party/seo/baidu-push.swig' %}
+ {% include '_third-party/needsharebutton.swig' %}
+ {% include '_third-party/rating.swig' %}
+ {% include '_third-party/mathjax.swig' %}
+ {% include '_third-party/scroll-cookie.swig' %}
+ {% include '_third-party/exturl.swig' %}
+
+
diff --git a/themes/Next/layout/_macro/my-copyright.swig b/themes/Next/layout/_macro/my-copyright.swig
new file mode 100644
index 0000000..d14a456
--- /dev/null
+++ b/themes/Next/layout/_macro/my-copyright.swig
@@ -0,0 +1,32 @@
+{% if page.copyright %}
+
+
+
+
+
+
+
+ 本文标题:{{ page.title }}
+ 文章作者:{{ theme.author }}
+ 发布时间:{{ page.date.format("YYYY年MM月DD日 - HH:MM") }}
+ 最后更新:{{ page.updated.format("YYYY年MM月DD日 - HH:MM") }}
+ 原始链接:{{ page.permalink }}
+
+
+ 许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。
+
+
+{% endif %}
diff --git a/themes/Next/layout/_macro/passage-end-tag.swig b/themes/Next/layout/_macro/passage-end-tag.swig
new file mode 100644
index 0000000..d3a7110
--- /dev/null
+++ b/themes/Next/layout/_macro/passage-end-tag.swig
@@ -0,0 +1,5 @@
+
+ {% if not is_index %}
+ -------------本文结束感谢您的阅读-------------
+ {% endif %}
+
diff --git a/themes/Next/layout/_macro/post-collapse.swig b/themes/Next/layout/_macro/post-collapse.swig
new file mode 100644
index 0000000..1894d24
--- /dev/null
+++ b/themes/Next/layout/_macro/post-collapse.swig
@@ -0,0 +1,34 @@
+{% macro render(post) %}
+
+
+
+
+ <{% if theme.seo %}h3{% else %}h2{% endif %} class="post-title">
+ {% if post.link %}{# Link posts #}
+
+ {{ post.title or post.link }}
+
+
+ {% else %}
+
+ {% if post.type === 'picture' %}
+ {{ post.content }}
+ {% else %}
+ {{ post.title | default(__('post.untitled')) }}
+ {% endif %}
+
+ {% endif %}
+ {% if theme.seo %}h3{% else %}h2{% endif %}>
+
+
+
+
+
+
+{% endmacro %}
diff --git a/themes/Next/layout/_macro/post-copyright.swig b/themes/Next/layout/_macro/post-copyright.swig
new file mode 100644
index 0000000..4ad0490
--- /dev/null
+++ b/themes/Next/layout/_macro/post-copyright.swig
@@ -0,0 +1,14 @@
+
+
+ -
+ {{ __('post.copyright.link') + __('symbol.colon') }}
+ {{ post.url | default(post.permalink) }}
+
+ -
+ {{ __('post.copyright.license_title') + __('symbol.colon') }}
+ {{ __('post.copyright.license_content', theme.post_copyright.license_url, theme.post_copyright.license) }}
+
+
diff --git a/themes/Next/layout/_macro/post.swig b/themes/Next/layout/_macro/post.swig
new file mode 100644
index 0000000..f75384f
--- /dev/null
+++ b/themes/Next/layout/_macro/post.swig
@@ -0,0 +1,438 @@
+{% macro render(post, is_index, post_extra_class) %}
+
+ {% set headlessPost = Array.prototype.indexOf.call(['quote', 'picture'], post.type) > -1 %}
+
+ {% set post_class = 'post post-type-' + post.type | default('normal') %}
+ {% if post_extra_class > 0 %}
+ {% set post_class = post_class + ' ' + post_extra_class | default('') %}
+ {% endif %}
+ {% if post.sticky > 0 %}
+ {% set post_class = post_class + ' ' + 'post-sticky' %}
+ {% endif %}
+
+
+ {##################}
+ {### POST BLOCK ###}
+ {##################}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% if not headlessPost %}
+
+
+ {# Not to show title for quote posts that do not have a title #}
+ {% if not (is_index and post.type === 'quote' and not post.title) %}
+ <{% if theme.seo %}h2{% else %}h1{% endif %} class="post-title{% if post.direction && post.direction.toLowerCase() === 'rtl' %} rtl{% endif %}" itemprop="name headline">{#
+ #}{# Link posts #}{#
+ #}{% if post.link %}
+ {% if post.sticky > 0 %}
+ {{ post.sticky }}
+
+
+
+ {% endif %}
+
+ {{ post.title or post.link }}
+
+
+ {% else %}{#
+ #}{% if is_index %}
+ {% if post.sticky > 0 %}
+
+
+
+ {% endif %}
+ {#
+ #}{{ post.title | default(__('post.untitled'))}}{#
+ #}{#
+ #}{% else %}{{ post.title }}{% endif %}{#
+ #}{% endif %}{#
+ #}{% if theme.seo %}h2{% else %}h1{% endif %}>
+ {% endif %}
+
+
+
+ {% endif %}
+
+ {#################}
+ {### POST BODY ###}
+ {#################}
+
+
+ {# Gallery support #}
+ {% if post.photos and post.photos.length %}
+
+ {% set COLUMN_NUMBER = 3 %}
+ {% for photo in post.photos %}
+ {% if loop.index0 % COLUMN_NUMBER === 0 %}{% endif %}
+
+
+
+ {% if loop.index0 % COLUMN_NUMBER === 2 %}{% endif %}
+ {% endfor %}
+
+ {# Append end tag for `post-gallery-row` when (photos size mod COLUMN_NUMBER) is less than COLUMN_NUMBER #}
+ {% if post.photos.length % COLUMN_NUMBER > 0 %}{% endif %}
+
+ {% endif %}
+
+ {% if is_index %}
+ {% if post.description and theme.excerpt_description %}
+ {{ post.description }}
+
+
+
+ {% elif post.excerpt %}
+ {{ post.excerpt }}
+
+
+
+ {% elif theme.auto_excerpt.enable %}
+ {% set content = post.content | striptags %}
+ {{ content.substring(0, theme.auto_excerpt.length) }}
+ {% if content.length > theme.auto_excerpt.length %}...{% endif %}
+
+
+
+ {% else %}
+ {% if post.type === 'picture' %}
+ {{ post.content }}
+ {% else %}
+ {{ post.content }}
+ {% endif %}
+ {% endif %}
+ {% else %}
+ {{ post.content }}
+ {% endif %}
+
+ {#####################}
+ {### END POST BODY ###}
+ {#####################}
+
+ {% if theme.wechat_subscriber.enabled and not is_index %}
+
+ {% include 'wechat-subscriber.swig' %}
+
+ {% endif %}
+
+
+ {% if not is_index %}
+ {% include 'my-copyright.swig' %}
+ {% endif %}
+
+
+ {% if (theme.alipay or theme.wechatpay or theme.bitcoin) and not is_index %}
+
+ {% include 'reward.swig' %}
+
+ {% endif %}
+
+ {% if theme.post_copyright.enable and not is_index %}
+
+ {% include 'post-copyright.swig' with { post: post } %}
+
+ {% endif %}
+
+
+ {% if not is_index %}
+ {% include 'passage-end-tag.swig' %}
+ {% endif %}
+
+
+
+
+ {######################}
+ {### END POST BLOCK ###}
+ {######################}
+
+
+{% endmacro %}
diff --git a/themes/Next/layout/_macro/reward.swig b/themes/Next/layout/_macro/reward.swig
new file mode 100644
index 0000000..268436e
--- /dev/null
+++ b/themes/Next/layout/_macro/reward.swig
@@ -0,0 +1,30 @@
+
+ {{ theme.reward_comment }}
+
+
+
diff --git a/themes/Next/layout/_macro/sidebar.swig b/themes/Next/layout/_macro/sidebar.swig
new file mode 100644
index 0000000..6b755da
--- /dev/null
+++ b/themes/Next/layout/_macro/sidebar.swig
@@ -0,0 +1,175 @@
+{% macro render(is_post) %}
+
+
+
+{% endmacro %}
diff --git a/themes/Next/layout/_macro/wechat-subscriber.swig b/themes/Next/layout/_macro/wechat-subscriber.swig
new file mode 100644
index 0000000..b1d4364
--- /dev/null
+++ b/themes/Next/layout/_macro/wechat-subscriber.swig
@@ -0,0 +1,4 @@
+
+
+ {{ theme.wechat_subscriber.description }}
+
diff --git a/themes/Next/layout/_partials/comments.swig b/themes/Next/layout/_partials/comments.swig
new file mode 100644
index 0000000..f453b4a
--- /dev/null
+++ b/themes/Next/layout/_partials/comments.swig
@@ -0,0 +1,71 @@
+{% if page.comments %}
+
+ {% if (theme.duoshuo and theme.duoshuo.shortname) or theme.duoshuo_shortname %}
+
+
+
+
+
+ {% elseif theme.facebook_sdk.enable and theme.facebook_comments_plugin.enable %}
+
+
+
+
+
+ {% elseif theme.vkontakte_api.enable and theme.vkontakte_api.comments %}
+
+
+
+
+ {% elseif theme.disqus.enable %}
+
+
+
+
+
+
+ {% elseif theme.hypercomments_id %}
+
+
+
+
+ {% elseif theme.youyan_uid %}
+
+
+
+
+ {% elseif theme.livere_uid %}
+
+
+
+
+ {% elseif theme.changyan.appid and theme.changyan.appkey %}
+
+
+
+
+ {% elseif theme.gitment.enable %}
+
+ {% if theme.gitment.lazy %}
+
+
+ {% else %}
+
+ {% endif %}
+
+
+ {% elseif theme.valine.appid and theme.valine.appkey %}
+
+
+
+ {% endif %}
+
+{% endif %}
diff --git a/themes/Next/layout/_partials/footer.swig b/themes/Next/layout/_partials/footer.swig
new file mode 100644
index 0000000..fcdb9c0
--- /dev/null
+++ b/themes/Next/layout/_partials/footer.swig
@@ -0,0 +1,53 @@
+{#
+#}{% set current = date(Date.now(), "YYYY") %}{#
+#}© {% if theme.footer.since and theme.footer.since != current %}{{ theme.footer.since }} — {% endif %}{#
+#}{{ current }}
+
+
+
+
+
+ {% if theme.post_wordcount.totalcount %}
+
+
+ {% if theme.post_wordcount.item_text %}
+
+ {% endif %}
+ {#
+ #}{{ totalcount(site, '0,0.0a') }}{#
+ #}
+ {% endif %}
+
+
+{% if theme.footer.powered %}
+ {#
+ #}{{ __('footer.powered', 'Hexo') }}{#
+#}
+{% endif %}
+
+{% if theme.footer.powered and theme.footer.theme.enable %}
+
+{% endif %}
+
+{% if theme.footer.theme.enable %}
+ {#
+ #}{{ __('footer.theme') }} — {#
+ #}{#
+ #}NexT.{{ theme.scheme }}{#
+ #}{% if theme.footer.theme.version %} v{{ theme.version }}{% endif %}{#
+#}
+{% endif %}
+
+{% if theme.footer.custom_text %}
+
+{% endif %}
+
+
+
+ 博客全站共{{ totalcount(site) }}字
+
+
diff --git a/themes/Next/layout/_partials/head.swig b/themes/Next/layout/_partials/head.swig
new file mode 100644
index 0000000..1e03db6
--- /dev/null
+++ b/themes/Next/layout/_partials/head.swig
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+{% if theme.pace %}
+ {% set pace_css_uri = url_for(theme.vendors._internal + '/pace/'+ theme.pace_theme +'.min.css?v=1.0.2') %}
+ {% set pace_js_uri = url_for(theme.vendors._internal + '/pace/pace.min.js?v=1.0.2') %}
+ {% if theme.vendors.pace %}
+ {% set pace_js_uri = theme.vendors.pace %}
+ {% endif %}
+ {% if theme.vendors.pace_css %}
+ {% set pace_css_uri = theme.vendors.pace_css %}
+ {% endif %}
+
+
+{% endif %}
+
+
+{% if theme.han %}
+ {% set Han_uri = url_for(theme.vendors._internal + '/Han/dist/han.min.css?v=3.3') %}
+ {% if theme.vendors.Han %}
+ {% set Han_uri = theme.vendors.Han %}
+ {% endif %}
+
+{% endif %}
+
+
+{# #238, Disable Baidu tranformation #}
+
+
+
+
+{% if theme.google_site_verification %}
+
+{% endif %}
+
+{% if theme.bing_site_verification %}
+
+{% endif %}
+
+{% if theme.yandex_site_verification %}
+
+{% endif %}
+
+
+{% if theme.baidu_site_verification %}
+
+{% endif %}
+
+
+{% if theme.qihu_site_verification %}
+
+{% endif %}
+
+
+{% if theme.fancybox %}
+ {% set fancybox_css_uri = url_for(theme.vendors._internal + '/fancybox/source/jquery.fancybox.css?v=2.1.5') %}
+ {% if theme.vendors.fancybox_css %}
+ {% set fancybox_css_uri = theme.vendors.fancybox_css %}
+ {% endif %}
+
+{% endif %}
+
+{% include "./head/external-fonts.swig" %}
+
+{% set font_awesome_uri = url_for(theme.vendors._internal + '/font-awesome/css/font-awesome.min.css?v=4.6.2') %}
+{% if theme.vendors.fontawesome %}
+ {% set font_awesome_uri = theme.vendors.fontawesome %}
+{% endif %}
+
+
+
+
+{% if theme.favicon.apple_touch_icon %}
+
+{% endif %}
+{% if theme.favicon.medium %}
+
+{% endif %}
+{% if theme.favicon.small %}
+
+{% endif %}
+{% if theme.favicon.safari_pinned_tab %}
+
+{% endif %}
+{% if theme.favicon.android_manifest %}
+
+{% endif %}
+{% if theme.favicon.ms_browserconfig %}
+
+{% endif %}
+
+{% if page.keywords %}
+
+{% elif page.tags and page.tags.length %}
+
+{% elif theme.keywords %}
+
+{% endif %}
+
+
+{% if theme.rss === '' and config.feed and config.feed.path %}
+ {% set theme.rss = config.feed.path %}
+{% endif %}
+{% if theme.rss %}
+
+{% endif %}
+
+
+{% if theme.facebook_sdk.enable and theme.facebook_sdk.webmaster %}
+
+
+{% endif %}
+
+
+{{
+ open_graph({
+ twitter_id: theme.twitter,
+ google_plus: theme.google_plus,
+ fb_admins: theme.fb_admins,
+ fb_app_id: theme.fb_app_id
+ })
+}}
+
+
+{# Export some HEXO Configurations to Front-End #}
+
+
+{# Canonical, good for google search engine (SEO) : https://support.google.com/webmasters/answer/139066 #}
+{% if theme.canonical %}
+
+{% endif %}
+
+{% include 'head/custom-head.swig' %}
diff --git a/themes/Next/layout/_partials/head/custom-head.swig b/themes/Next/layout/_partials/head/custom-head.swig
new file mode 100644
index 0000000..6aed40d
--- /dev/null
+++ b/themes/Next/layout/_partials/head/custom-head.swig
@@ -0,0 +1,3 @@
+{#
+Custom head.
+#}
diff --git a/themes/Next/layout/_partials/head/external-fonts.swig b/themes/Next/layout/_partials/head/external-fonts.swig
new file mode 100644
index 0000000..876e12e
--- /dev/null
+++ b/themes/Next/layout/_partials/head/external-fonts.swig
@@ -0,0 +1,51 @@
+{% if theme.font.enable %}
+
+ {% set font_config = theme.font %}
+ {% set font_families = '' %}
+ {% set font_styles = ':300,300italic,400,400italic,700,700italic' %}
+ {% set font_found = false %}
+
+ {% if font_config.global.family and font_config.global.external %}
+ {% set font_families += font_config.global.family + font_styles %}
+ {% set font_found = true %}
+ {% endif %}
+
+ {% if font_config.headings.family and font_config.headings.external %}
+ {% if font_found %}
+ {% set font_families += '|' %}
+ {% endif %}
+
+ {% set font_families += font_config.headings.family + font_styles %}
+ {% endif %}
+
+ {% if font_config.posts.family and font_config.posts.external %}
+ {% if font_found %}
+ {% set font_families += '|' %}
+ {% endif %}
+
+ {% set font_families += font_config.posts.family + font_styles %}
+ {% endif %}
+
+ {% if font_config.logo.family and font_config.logo.external %}
+ {% if font_found %}
+ {% set font_families += '|' %}
+ {% endif %}
+
+ {% set font_families += font_config.logo.family + font_styles %}
+ {% endif %}
+
+ {% if font_config.codes.family and font_config.codes.external %}
+ {% if font_found %}
+ {% set font_families += '|' %}
+ {% endif %}
+
+ {% set font_families += font_config.codes.family + font_styles %}
+ {% endif %}
+
+ {% if font_families !== '' %}
+ {% set font_families += '&subset=latin,latin-ext' %}
+ {% set font_host = font_config.host | default('//fonts.googleapis.com') %}
+
+ {% endif %}
+
+{% endif %}
diff --git a/themes/Next/layout/_partials/header.swig b/themes/Next/layout/_partials/header.swig
new file mode 100644
index 0000000..81d5d74
--- /dev/null
+++ b/themes/Next/layout/_partials/header.swig
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+{% include '../_custom/header.swig' %}
diff --git a/themes/Next/layout/_partials/page-header.swig b/themes/Next/layout/_partials/page-header.swig
new file mode 100644
index 0000000..1e1f890
--- /dev/null
+++ b/themes/Next/layout/_partials/page-header.swig
@@ -0,0 +1,11 @@
+
+
+ <{% if theme.seo %}h2{% else %}h1{% endif %} class="post-title" itemprop="name headline">{{ page.title }}{% if theme.seo %}h2{% else %}h1{% endif %}>
+
+{% if page.description %}
+
+{% endif %}
+
+
diff --git a/themes/Next/layout/_partials/pagination.swig b/themes/Next/layout/_partials/pagination.swig
new file mode 100644
index 0000000..5f96b99
--- /dev/null
+++ b/themes/Next/layout/_partials/pagination.swig
@@ -0,0 +1,11 @@
+{% if page.prev or page.next %}
+
+{% endif %}
diff --git a/themes/Next/layout/_partials/search.swig b/themes/Next/layout/_partials/search.swig
new file mode 100644
index 0000000..a507d27
--- /dev/null
+++ b/themes/Next/layout/_partials/search.swig
@@ -0,0 +1,9 @@
+{% if theme.algolia_search.enable %}
+ {% include '../_third-party/search/algolia-search/dom.swig' %}
+{% elseif theme.swiftype_key %}
+ {% include 'search/swiftype.swig' %}
+{% elseif theme.tinysou_Key %}
+ {% include 'search/tinysou.swig' %}
+{% elseif theme.local_search.enable %}
+ {% include 'search/localsearch.swig' %}
+{% endif %}
diff --git a/themes/Next/layout/_partials/search/localsearch.swig b/themes/Next/layout/_partials/search/localsearch.swig
new file mode 100644
index 0000000..f106aa0
--- /dev/null
+++ b/themes/Next/layout/_partials/search/localsearch.swig
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/themes/Next/layout/_partials/search/swiftype.swig b/themes/Next/layout/_partials/search/swiftype.swig
new file mode 100644
index 0000000..732e0c1
--- /dev/null
+++ b/themes/Next/layout/_partials/search/swiftype.swig
@@ -0,0 +1,12 @@
+
+
+
diff --git a/themes/Next/layout/_partials/search/tinysou.swig b/themes/Next/layout/_partials/search/tinysou.swig
new file mode 100644
index 0000000..2dfa3e3
--- /dev/null
+++ b/themes/Next/layout/_partials/search/tinysou.swig
@@ -0,0 +1,3 @@
+
diff --git a/themes/Next/layout/_partials/share/add-this.swig b/themes/Next/layout/_partials/share/add-this.swig
new file mode 100644
index 0000000..ae0a6b4
--- /dev/null
+++ b/themes/Next/layout/_partials/share/add-this.swig
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/themes/Next/layout/_partials/share/baidushare.swig b/themes/Next/layout/_partials/share/baidushare.swig
new file mode 100644
index 0000000..6be4898
--- /dev/null
+++ b/themes/Next/layout/_partials/share/baidushare.swig
@@ -0,0 +1,57 @@
+{% if theme.baidushare.type === "button" %}
+
+
+{% elseif theme.baidushare.type === "slide" %}
+
+{% endif %}
+
diff --git a/themes/Next/layout/_partials/share/duoshuo_share.swig b/themes/Next/layout/_partials/share/duoshuo_share.swig
new file mode 100644
index 0000000..bfa26f4
--- /dev/null
+++ b/themes/Next/layout/_partials/share/duoshuo_share.swig
@@ -0,0 +1,18 @@
+
+
+
\ No newline at end of file
diff --git a/themes/Next/layout/_partials/share/jiathis.swig b/themes/Next/layout/_partials/share/jiathis.swig
new file mode 100644
index 0000000..3251352
--- /dev/null
+++ b/themes/Next/layout/_partials/share/jiathis.swig
@@ -0,0 +1,25 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/themes/Next/layout/_scripts/boostrap.swig b/themes/Next/layout/_scripts/boostrap.swig
new file mode 100644
index 0000000..5e95090
--- /dev/null
+++ b/themes/Next/layout/_scripts/boostrap.swig
@@ -0,0 +1,9 @@
+{%
+ set boot_scripts = [
+ 'src/bootstrap.js'
+ ]
+%}
+
+{% for bs in boot_scripts %}
+
+{% endfor %}
diff --git a/themes/Next/layout/_scripts/commons.swig b/themes/Next/layout/_scripts/commons.swig
new file mode 100644
index 0000000..abc2971
--- /dev/null
+++ b/themes/Next/layout/_scripts/commons.swig
@@ -0,0 +1,10 @@
+{%
+ set js_commons = [
+ 'src/utils.js',
+ 'src/motion.js'
+ ]
+%}
+
+{% for common in js_commons %}
+
+{% endfor %}
diff --git a/themes/Next/layout/_scripts/pages/post-details.swig b/themes/Next/layout/_scripts/pages/post-details.swig
new file mode 100644
index 0000000..6938779
--- /dev/null
+++ b/themes/Next/layout/_scripts/pages/post-details.swig
@@ -0,0 +1,2 @@
+
+
diff --git a/themes/Next/layout/_scripts/schemes/gemini.swig b/themes/Next/layout/_scripts/schemes/gemini.swig
new file mode 100644
index 0000000..5119eba
--- /dev/null
+++ b/themes/Next/layout/_scripts/schemes/gemini.swig
@@ -0,0 +1,10 @@
+{%
+ set scripts = [
+ 'src/affix.js',
+ 'src/schemes/pisces.js'
+ ]
+%}
+
+{% for script in scripts %}
+
+{% endfor %}
diff --git a/themes/Next/layout/_scripts/schemes/mist.swig b/themes/Next/layout/_scripts/schemes/mist.swig
new file mode 100644
index 0000000..e69de29
diff --git a/themes/Next/layout/_scripts/schemes/muse.swig b/themes/Next/layout/_scripts/schemes/muse.swig
new file mode 100644
index 0000000..e69de29
diff --git a/themes/Next/layout/_scripts/schemes/pisces.swig b/themes/Next/layout/_scripts/schemes/pisces.swig
new file mode 100644
index 0000000..5119eba
--- /dev/null
+++ b/themes/Next/layout/_scripts/schemes/pisces.swig
@@ -0,0 +1,10 @@
+{%
+ set scripts = [
+ 'src/affix.js',
+ 'src/schemes/pisces.js'
+ ]
+%}
+
+{% for script in scripts %}
+
+{% endfor %}
diff --git a/themes/Next/layout/_scripts/vendors.swig b/themes/Next/layout/_scripts/vendors.swig
new file mode 100644
index 0000000..d0b86fd
--- /dev/null
+++ b/themes/Next/layout/_scripts/vendors.swig
@@ -0,0 +1,49 @@
+{# Reset `window.Promise` when it was not a function. #}
+{# IE refers the element whose id is `Promise` as `window.Promise`, this causes Velocity throwing an exception #}
+
+
+{% set js_vendors = {} %}
+{% set js_vendors.jquery = 'jquery/index.js?v=2.1.3' %}
+{% set js_vendors.fastclick = 'fastclick/lib/fastclick.min.js?v=1.0.6' %}
+{% set js_vendors.lazyload = 'jquery_lazyload/jquery.lazyload.js?v=1.9.7' %}
+{% set js_vendors.velocity = 'velocity/velocity.min.js?v=1.2.1' %}
+{% set js_vendors.velocity_ui = 'velocity/velocity.ui.min.js?v=1.2.1' %}
+
+{% if theme.fancybox %}
+ {% set js_vendors.fancybox = 'fancybox/source/jquery.fancybox.pack.js?v=2.1.5' %}
+{% endif %}
+{% if theme.canvas_nest %}
+ {% set js_vendors.canvas_nest = 'canvas-nest/canvas-nest.min.js' %}
+{% endif %}
+
+{% if theme.three_waves %}
+ {% set js_vendors.three = 'three/three.min.js' %}
+ {% set js_vendors.three_waves = 'three/three-waves.min.js' %}
+{% endif %}
+
+{% if theme.canvas_lines %}
+ {% set js_vendors.three = 'three/three.min.js' %}
+ {% set js_vendors.canvas_lines = 'three/canvas_lines.min.js' %}
+{% endif %}
+
+{% if theme.canvas_sphere %}
+ {% set js_vendors.three = 'three/three.min.js' %}
+ {% set js_vendors.canvas_sphere = 'three/canvas_sphere.min.js' %}
+{% endif %}
+
+{% if theme.canvas_ribbon.enable and theme.scheme === 'Pisces'%}
+ {% set js_vendors.canvas_ribbon = 'canvas-ribbon/canvas-ribbon.js' %}
+{% endif %}
+
+{% for name, internal in js_vendors %}
+ {% set internal_script = url_for(theme.vendors._internal) + '/' + internal %}
+ {% if name == 'canvas_ribbon' %}
+
+ {% else %}
+
+ {% endif %}
+{% endfor %}
diff --git a/themes/Next/layout/_third-party/analytics/analytics-with-widget.swig b/themes/Next/layout/_third-party/analytics/analytics-with-widget.swig
new file mode 100644
index 0000000..f2a4049
--- /dev/null
+++ b/themes/Next/layout/_third-party/analytics/analytics-with-widget.swig
@@ -0,0 +1,4 @@
+{% include 'busuanzi-counter.swig' %}
+{% include 'tencent-mta.swig' %}
+{% include 'tencent-analytics.swig' %}
+{% include 'cnzz-analytics.swig' %}
\ No newline at end of file
diff --git a/themes/Next/layout/_third-party/analytics/application-insights.swig b/themes/Next/layout/_third-party/analytics/application-insights.swig
new file mode 100644
index 0000000..c0af16f
--- /dev/null
+++ b/themes/Next/layout/_third-party/analytics/application-insights.swig
@@ -0,0 +1,11 @@
+{% if theme.application_insights %}
+
+{% endif %}
\ No newline at end of file
diff --git a/themes/Next/layout/_third-party/analytics/baidu-analytics.swig b/themes/Next/layout/_third-party/analytics/baidu-analytics.swig
new file mode 100644
index 0000000..9ae1d83
--- /dev/null
+++ b/themes/Next/layout/_third-party/analytics/baidu-analytics.swig
@@ -0,0 +1,11 @@
+{% if theme.baidu_analytics %}
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/analytics/busuanzi-counter.swig b/themes/Next/layout/_third-party/analytics/busuanzi-counter.swig
new file mode 100644
index 0000000..721b2c8
--- /dev/null
+++ b/themes/Next/layout/_third-party/analytics/busuanzi-counter.swig
@@ -0,0 +1,21 @@
+{% if theme.busuanzi_count.enable %}
+
+
+
+ {% if theme.busuanzi_count.site_uv %}
+
+ {{ theme.busuanzi_count.site_uv_header }}
+
+ {{ theme.busuanzi_count.site_uv_footer }}
+
+ {% endif %}
+
+ {% if theme.busuanzi_count.site_pv %}
+
+ {{ theme.busuanzi_count.site_pv_header }}
+
+ {{ theme.busuanzi_count.site_pv_footer }}
+
+ {% endif %}
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/analytics/cnzz-analytics.swig b/themes/Next/layout/_third-party/analytics/cnzz-analytics.swig
new file mode 100644
index 0000000..bffb73c
--- /dev/null
+++ b/themes/Next/layout/_third-party/analytics/cnzz-analytics.swig
@@ -0,0 +1,7 @@
+{% if theme.cnzz_siteid %}
+
+
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/analytics/facebook-sdk.swig b/themes/Next/layout/_third-party/analytics/facebook-sdk.swig
new file mode 100644
index 0000000..7b5a291
--- /dev/null
+++ b/themes/Next/layout/_third-party/analytics/facebook-sdk.swig
@@ -0,0 +1,19 @@
+{% if theme.facebook_sdk.enable %}
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/analytics/google-analytics.swig b/themes/Next/layout/_third-party/analytics/google-analytics.swig
new file mode 100644
index 0000000..c66d461
--- /dev/null
+++ b/themes/Next/layout/_third-party/analytics/google-analytics.swig
@@ -0,0 +1,10 @@
+{% if theme.google_analytics %}
+
+{% endif %}
\ No newline at end of file
diff --git a/themes/Next/layout/_third-party/analytics/index.swig b/themes/Next/layout/_third-party/analytics/index.swig
new file mode 100644
index 0000000..78ae38e
--- /dev/null
+++ b/themes/Next/layout/_third-party/analytics/index.swig
@@ -0,0 +1,5 @@
+{% include 'facebook-sdk.swig' %}
+{% include 'vkontakte-api.swig' %}
+{% include 'google-analytics.swig' %}
+{% include 'baidu-analytics.swig' %}
+{% include 'application-insights.swig' %}
diff --git a/themes/Next/layout/_third-party/analytics/lean-analytics.swig b/themes/Next/layout/_third-party/analytics/lean-analytics.swig
new file mode 100644
index 0000000..2e8bb98
--- /dev/null
+++ b/themes/Next/layout/_third-party/analytics/lean-analytics.swig
@@ -0,0 +1,108 @@
+{% if theme.leancloud_visitors.enable %}
+
+ {# custom analytics part create by xiamo #}
+
+
+
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/analytics/tencent-analytics.swig b/themes/Next/layout/_third-party/analytics/tencent-analytics.swig
new file mode 100644
index 0000000..c2fab35
--- /dev/null
+++ b/themes/Next/layout/_third-party/analytics/tencent-analytics.swig
@@ -0,0 +1,10 @@
+{% if theme.tencent_analytics %}
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/analytics/tencent-mta.swig b/themes/Next/layout/_third-party/analytics/tencent-mta.swig
new file mode 100644
index 0000000..f4b6470
--- /dev/null
+++ b/themes/Next/layout/_third-party/analytics/tencent-mta.swig
@@ -0,0 +1,14 @@
+{% if theme.tencent_mta %}
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/analytics/vkontakte-api.swig b/themes/Next/layout/_third-party/analytics/vkontakte-api.swig
new file mode 100644
index 0000000..913a8fc
--- /dev/null
+++ b/themes/Next/layout/_third-party/analytics/vkontakte-api.swig
@@ -0,0 +1,27 @@
+{% if theme.vkontakte_api.enable %}
+
+
+
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/comments/changyan.swig b/themes/Next/layout/_third-party/comments/changyan.swig
new file mode 100644
index 0000000..d816b2c
--- /dev/null
+++ b/themes/Next/layout/_third-party/comments/changyan.swig
@@ -0,0 +1,18 @@
+{% if theme.changyan.enable and theme.changyan.appid and theme.changyan.appkey %}
+ {% if is_home() %}
+
+ {% else %}
+
+
+ {% endif %}
+{% endif %}
diff --git a/themes/Next/layout/_third-party/comments/disqus.swig b/themes/Next/layout/_third-party/comments/disqus.swig
new file mode 100644
index 0000000..2d14907
--- /dev/null
+++ b/themes/Next/layout/_third-party/comments/disqus.swig
@@ -0,0 +1,23 @@
+{% if not (theme.duoshuo and theme.duoshuo.shortname) and not theme.duoshuo_shortname %}
+ {% if theme.disqus.enable %}
+
+ {% if theme.disqus.count %}
+
+ {% endif %}
+
+ {% if page.comments %}
+
+ {% endif %}
+
+ {% endif %}
+{% endif %}
diff --git a/themes/Next/layout/_third-party/comments/duoshuo.swig b/themes/Next/layout/_third-party/comments/duoshuo.swig
new file mode 100644
index 0000000..c8499b2
--- /dev/null
+++ b/themes/Next/layout/_third-party/comments/duoshuo.swig
@@ -0,0 +1,33 @@
+{% if (theme.duoshuo and theme.duoshuo.shortname) or theme.duoshuo_shortname %}
+
+ {% if theme.duoshuo %}
+ {% set duoshuo_shortname = theme.duoshuo.shortname %}
+ {% else %}
+ {% set duoshuo_shortname = theme.duoshuo_shortname %}
+ {% endif %}
+
+
+
+ {% if theme.duoshuo_info.ua_enable %}
+ {% if theme.duoshuo_info.admin_enable %}
+ {% set ua_parser_internal = url_for(theme.vendors._internal) + '/ua-parser-js/dist/ua-parser.min.js?v=0.7.9' %}
+
+
+ {% endif %}
+ {% set ua_parser_internal = url_for(theme.vendors._internal) + '/ua-parser-js/dist/ua-parser.min.js?v=0.7.9' %}
+
+
+ {% endif %}
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/comments/gitment.swig b/themes/Next/layout/_third-party/comments/gitment.swig
new file mode 100644
index 0000000..398779e
--- /dev/null
+++ b/themes/Next/layout/_third-party/comments/gitment.swig
@@ -0,0 +1,59 @@
+{% if not (theme.duoshuo and theme.duoshuo.shortname) and not theme.duoshuo_shortname %}
+{% if theme.gitment.enable and theme.gitment.client_id %}
+
+ {% if theme.gitment.mint %}
+ {% set CommentsClass = "Gitmint" %}
+
+
+ {% else %}
+ {% set CommentsClass = "Gitment" %}
+
+
+ {% endif %}
+
+
+ {% if theme.gitment.cleanly %}
+
+ {% endif %}
+
+ {% if page.comments %}
+
+ {% endif %}
+
+{% endif %}
+{% endif %}
diff --git a/themes/Next/layout/_third-party/comments/hypercomments.swig b/themes/Next/layout/_third-party/comments/hypercomments.swig
new file mode 100644
index 0000000..de693e4
--- /dev/null
+++ b/themes/Next/layout/_third-party/comments/hypercomments.swig
@@ -0,0 +1,27 @@
+{% if not (theme.duoshuo and theme.duoshuo.shortname) and not theme.duoshuo_shortname and not theme.disqus_shortname %}
+
+ {% if theme.hypercomments_id %}
+
+
+
+ {% endif %}
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/comments/index.swig b/themes/Next/layout/_third-party/comments/index.swig
new file mode 100644
index 0000000..b2da232
--- /dev/null
+++ b/themes/Next/layout/_third-party/comments/index.swig
@@ -0,0 +1,8 @@
+{% include 'duoshuo.swig' %}
+{% include 'disqus.swig' %}
+{% include 'hypercomments.swig' %}
+{% include 'youyan.swig' %}
+{% include 'livere.swig' %}
+{% include 'changyan.swig' %}
+{% include 'gitment.swig' %}
+{% include 'valine.swig' %}
diff --git a/themes/Next/layout/_third-party/comments/livere.swig b/themes/Next/layout/_third-party/comments/livere.swig
new file mode 100644
index 0000000..9e1e165
--- /dev/null
+++ b/themes/Next/layout/_third-party/comments/livere.swig
@@ -0,0 +1,16 @@
+{% if not (theme.duoshuo and theme.duoshuo.shortname) and not theme.duoshuo_shortname and not (theme.disqus.enable and theme.disqus.shortname) and not theme.hypercomments_id %}
+
+ {% if page.comments and theme.livere_uid %}
+
+ {% endif %}
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/comments/valine.swig b/themes/Next/layout/_third-party/comments/valine.swig
new file mode 100644
index 0000000..3f10a66
--- /dev/null
+++ b/themes/Next/layout/_third-party/comments/valine.swig
@@ -0,0 +1,16 @@
+{% if page.comments and theme.valine.enable and theme.valine.appid and theme.valine.appkey %}
+
+
+
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/comments/youyan.swig b/themes/Next/layout/_third-party/comments/youyan.swig
new file mode 100644
index 0000000..dbf3e8a
--- /dev/null
+++ b/themes/Next/layout/_third-party/comments/youyan.swig
@@ -0,0 +1,16 @@
+{% if not (theme.duoshuo and theme.duoshuo.shortname)
+ and not theme.duoshuo_shortname
+ and not theme.disqus_shortname
+ and not theme.hypercomments_id %}
+
+ {% if theme.youyan_uid %}
+ {% set uid = theme.youyan_uid %}
+
+ {% if page.comments %}
+
+
+
+ {% endif %}
+ {% endif %}
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/duoshuo-hot-articles.swig b/themes/Next/layout/_third-party/duoshuo-hot-articles.swig
new file mode 100644
index 0000000..2d1088d
--- /dev/null
+++ b/themes/Next/layout/_third-party/duoshuo-hot-articles.swig
@@ -0,0 +1,5 @@
+{# 多说热评文章 #}
+{% if (theme.duoshuo_hotartical and page.title) %}
+ 热评文章
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/exturl.swig b/themes/Next/layout/_third-party/exturl.swig
new file mode 100644
index 0000000..329ab50
--- /dev/null
+++ b/themes/Next/layout/_third-party/exturl.swig
@@ -0,0 +1,3 @@
+{% if theme.exturl %}
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/mathjax.swig b/themes/Next/layout/_third-party/mathjax.swig
new file mode 100644
index 0000000..89db7b4
--- /dev/null
+++ b/themes/Next/layout/_third-party/mathjax.swig
@@ -0,0 +1,23 @@
+{% if theme.mathjax.enable %}
+ {% if not theme.mathjax.per_page or (page.total or page.mathjax) %}
+
+
+
+
+ {% endif %}
+{% endif %}
diff --git a/themes/Next/layout/_third-party/needsharebutton.swig b/themes/Next/layout/_third-party/needsharebutton.swig
new file mode 100644
index 0000000..73d8e4b
--- /dev/null
+++ b/themes/Next/layout/_third-party/needsharebutton.swig
@@ -0,0 +1,30 @@
+{% if theme.needmoreshare2.enable %}
+ {% set needmoreshare2_css = url_for(theme.vendors._internal + '/needsharebutton/needsharebutton.css') %}
+ {% if theme.vendors.needmoreshare2 %}
+ {% set needmoreshare2_css = theme.vendors.needmoreshare2_css %}
+ {% endif %}
+
+
+ {% set needmoreshare2_js = url_for(theme.vendors._internal + '/needsharebutton/needsharebutton.js') %}
+ {% if theme.vendors.needmoreshare2_js %}
+ {% set needmoreshare2_js = theme.vendors.needmoreshare2_js %}
+ {% endif %}
+
+
+
+{% endif %}
\ No newline at end of file
diff --git a/themes/Next/layout/_third-party/rating.swig b/themes/Next/layout/_third-party/rating.swig
new file mode 100644
index 0000000..3b376ce
--- /dev/null
+++ b/themes/Next/layout/_third-party/rating.swig
@@ -0,0 +1,18 @@
+{% if theme.rating.enable and (not is_home() and is_post()) %}
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/schedule.swig b/themes/Next/layout/_third-party/schedule.swig
new file mode 100644
index 0000000..6db3a3c
--- /dev/null
+++ b/themes/Next/layout/_third-party/schedule.swig
@@ -0,0 +1,185 @@
+{% if theme.calendar.enable %}
+{% if page.type == 'schedule' %}
+
+
+
+{% endif %}
+{% endif %}
diff --git a/themes/Next/layout/_third-party/scroll-cookie.swig b/themes/Next/layout/_third-party/scroll-cookie.swig
new file mode 100644
index 0000000..9fbb0eb
--- /dev/null
+++ b/themes/Next/layout/_third-party/scroll-cookie.swig
@@ -0,0 +1,4 @@
+{% if theme.save_scroll %}
+
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/search/algolia-search/assets.swig b/themes/Next/layout/_third-party/search/algolia-search/assets.swig
new file mode 100644
index 0000000..069504f
--- /dev/null
+++ b/themes/Next/layout/_third-party/search/algolia-search/assets.swig
@@ -0,0 +1,18 @@
+{% if theme.algolia_search.enable %}
+
+ {# S: Include Algolia instantsearch.js library #}
+ {% set algolia_instant_css = url_for(theme.vendors._internal + '/algolia-instant-search/instantsearch.min.css') %}
+ {% if theme.vendors.algolia_instant_css %}
+ {% set algolia_instant_css = theme.vendors.algolia_instant_css %}
+ {% endif %}
+
+
+ {% set algolia_instant_js = url_for(theme.vendors._internal + '/algolia-instant-search/instantsearch.min.js') %}
+ {% if theme.vendors.algolia_instant_js %}
+ {% set algolia_instant_js = theme.vendors.algolia_instant_js %}
+ {% endif %}
+
+ {# E: Include Algolia instantsearch.js library #}
+
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/search/algolia-search/dom.swig b/themes/Next/layout/_third-party/search/algolia-search/dom.swig
new file mode 100644
index 0000000..a733bb1
--- /dev/null
+++ b/themes/Next/layout/_third-party/search/algolia-search/dom.swig
@@ -0,0 +1,20 @@
+{% if theme.algolia_search.enable %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/search/index.swig b/themes/Next/layout/_third-party/search/index.swig
new file mode 100644
index 0000000..0a352bc
--- /dev/null
+++ b/themes/Next/layout/_third-party/search/index.swig
@@ -0,0 +1,3 @@
+{% include 'tinysou.swig' %}
+{% include 'localsearch.swig' %}
+{% include 'algolia-search/assets.swig' %}
diff --git a/themes/Next/layout/_third-party/search/localsearch.swig b/themes/Next/layout/_third-party/search/localsearch.swig
new file mode 100644
index 0000000..c373e5c
--- /dev/null
+++ b/themes/Next/layout/_third-party/search/localsearch.swig
@@ -0,0 +1,318 @@
+{% if theme.local_search.enable %}
+
+{% endif %}
diff --git a/themes/Next/layout/_third-party/search/tinysou.swig b/themes/Next/layout/_third-party/search/tinysou.swig
new file mode 100644
index 0000000..6e18684
--- /dev/null
+++ b/themes/Next/layout/_third-party/search/tinysou.swig
@@ -0,0 +1,23 @@
+{% if config.tinysou_Key %}
+
+{% endif %}
\ No newline at end of file
diff --git a/themes/Next/layout/_third-party/seo/baidu-push.swig b/themes/Next/layout/_third-party/seo/baidu-push.swig
new file mode 100644
index 0000000..ee6838f
--- /dev/null
+++ b/themes/Next/layout/_third-party/seo/baidu-push.swig
@@ -0,0 +1,16 @@
+{% if theme.baidu_push %}
+
+{% endif %}
diff --git a/themes/Next/layout/archive.swig b/themes/Next/layout/archive.swig
new file mode 100644
index 0000000..970491f
--- /dev/null
+++ b/themes/Next/layout/archive.swig
@@ -0,0 +1,62 @@
+{% extends '_layout.swig' %}
+{% import '_macro/post-collapse.swig' as post_template %}
+{% import '_macro/sidebar.swig' as sidebar_template %}
+
+{% block title %}{{ __('title.archive') }} | {{ config.title }}{% endblock %}
+
+{% block page_class %}page-archive{% endblock %}
+
+{% block content %}
+
+ {#####################}
+ {### ARCHIVE BLOCK ###}
+ {#####################}
+
+
+
+
+
+ {% set cheers %}
+ {% set posts_length = site.posts.length %}
+ {% if posts_length > 210 %} {% set cheers = 'excellent' %}
+ {% elif posts_length > 130 %} {% set cheers = 'great' %}
+ {% elif posts_length > 80 %} {% set cheers = 'good' %}
+ {% elif posts_length > 50 %} {% set cheers = 'nice' %}
+ {% elif posts_length > 30 %} {% set cheers = 'ok' %}
+ {% else %}
+ {% set cheers = 'um' %}
+ {% endif %}
+ {{ __('cheers.' + cheers) }}! {{ _p("counter.archive_posts", site.posts.length) }} {{ __('keep_on') }}
+
+
+ {% for post in page.posts %}
+
+ {# Show year #}
+ {% set year %}
+ {% set post.year = date(post.date, 'YYYY') %}
+
+ {% if post.year !== year %}
+ {% set year = post.year %}
+
+ <{% if theme.seo %}h2{% else %}h1{% endif %} class="archive-year" id="archive-year-{{ year }}">{{ year }}{% if theme.seo %}h2{% else %}h1{% endif %}>
+
+ {% endif %}
+ {# endshow #}
+
+ {{ post_template.render(post) }}
+
+ {% endfor %}
+
+
+
+ {#########################}
+ {### END ARCHIVE BLOCK ###}
+ {#########################}
+
+ {% include '_partials/pagination.swig' %}
+
+{% endblock %}
+
+{% block sidebar %}
+ {{ sidebar_template.render(false) }}
+{% endblock %}
diff --git a/themes/Next/layout/category.swig b/themes/Next/layout/category.swig
new file mode 100644
index 0000000..8e3aa72
--- /dev/null
+++ b/themes/Next/layout/category.swig
@@ -0,0 +1,38 @@
+{% extends '_layout.swig' %}
+{% import '_macro/post-collapse.swig' as post_template %}
+{% import '_macro/sidebar.swig' as sidebar_template %}
+
+{% block title %}{{ __('title.category') }}: {{ page.category }} | {{ config.title }}{% endblock %}
+
+{% block content %}
+
+ {######################}
+ {### CATEGORY BLOCK ###}
+ {######################}
+
+
+
+
+ <{% if theme.seo %}h2{% else %}h1{% endif %}>{#
+ #}{{ page.category }}{#
+ #}{{ __('title.category') }}
+ {% if theme.seo %}h2{% else %}h1{% endif %}>
+
+
+ {% for post in page.posts %}
+ {{ post_template.render(post) }}
+ {% endfor %}
+
+
+
+ {##########################}
+ {### END CATEGORY BLOCK ###}
+ {##########################}
+
+ {% include '_partials/pagination.swig' %}
+
+{% endblock %}
+
+{% block sidebar %}
+ {{ sidebar_template.render(false) }}
+{% endblock %}
diff --git a/themes/Next/layout/index.swig b/themes/Next/layout/index.swig
new file mode 100644
index 0000000..995c28a
--- /dev/null
+++ b/themes/Next/layout/index.swig
@@ -0,0 +1,23 @@
+{% extends '_layout.swig' %}
+{% import '_macro/post.swig' as post_template %}
+{% import '_macro/sidebar.swig' as sidebar_template %}
+
+{% block title %}{{ config.title }}{% if theme.index_with_subtitle and config.subtitle %} - {{config.subtitle }}{% endif %}{% endblock %}
+
+{% block page_class %}
+ {% if is_home() %}page-home{% endif -%}
+{% endblock %}
+
+{% block content %}
+
+
+ {% include '_partials/pagination.swig' %}
+{% endblock %}
+
+{% block sidebar %}
+ {{ sidebar_template.render(false) }}
+{% endblock %}
diff --git a/themes/Next/layout/page.swig b/themes/Next/layout/page.swig
new file mode 100644
index 0000000..83ad7bd
--- /dev/null
+++ b/themes/Next/layout/page.swig
@@ -0,0 +1,70 @@
+{% extends '_layout.swig' %}
+{% import '_macro/sidebar.swig' as sidebar_template %}
+
+ {% block title %}{#
+ #}{% set page_title_suffix = ' | ' + config.title %}{#
+
+ #}{% if page.type === "categories" and not page.title %}{#
+ #}{{ __('title.category') + page_title_suffix }}{#
+ #}{% elif page.type === "tags" and not page.title %}{#
+ #}{{ __('title.tag') + page_title_suffix }}{#
+ #}{% else %}{#
+ #}{{ page.title + page_title_suffix }}{#
+ #}{% endif %}{#
+#}{% endblock %}
+
+{% block page_class %}page-post-detail{% endblock %}
+
+{% block content %}
+
+
+
+{% endblock %}
+
+{% block sidebar %}
+ {{ sidebar_template.render(false) }}
+{% endblock %}
+
+{% block script_extra %}
+ {% include '_scripts/pages/post-details.swig' %}
+{% endblock %}
diff --git a/themes/Next/layout/post.swig b/themes/Next/layout/post.swig
new file mode 100644
index 0000000..8274630
--- /dev/null
+++ b/themes/Next/layout/post.swig
@@ -0,0 +1,37 @@
+{% extends '_layout.swig' %}
+{% import '_macro/post.swig' as post_template %}
+{% import '_macro/sidebar.swig' as sidebar_template %}
+
+
+{% block title %}{{ page.title }} | {{ config.title }}{% endblock %}
+
+{% block page_class %}page-post-detail{% endblock %}
+
+
+{% block content %}
+
+
+
+{% endblock %}
+
+{% block sidebar %}
+ {{ sidebar_template.render(true) }}
+{% endblock %}
+
+{% block script_extra %}
+ {% include '_scripts/pages/post-details.swig' %}
+{% endblock %}
diff --git a/themes/Next/layout/schedule.swig b/themes/Next/layout/schedule.swig
new file mode 100644
index 0000000..216dfea
--- /dev/null
+++ b/themes/Next/layout/schedule.swig
@@ -0,0 +1,25 @@
+{% extends '_layout.swig' %}
+{% import '_macro/sidebar.swig' as sidebar_template %}
+
+{% block title %}{{ __('title.schedule') }} | {{ config.title }}{% endblock %}
+
+{% block page_class %}page-post-detail page-calendar{% endblock %}
+
+{% block content %}
+ {######################}
+ {### SCHEDULE BLOCK ###}
+ {######################}
+
+
+
+
+
+
+ {##########################}
+ {### END SCHEDULE BLOCK ###}
+ {##########################}
+{% endblock %}
+
+{% block sidebar %}
+ {{ sidebar_template.render(false) }}
+{% endblock %}
diff --git a/themes/Next/layout/tag.swig b/themes/Next/layout/tag.swig
new file mode 100644
index 0000000..e570ce8
--- /dev/null
+++ b/themes/Next/layout/tag.swig
@@ -0,0 +1,37 @@
+{% extends '_layout.swig' %}
+{% import '_macro/post-collapse.swig' as post_template %}
+{% import '_macro/sidebar.swig' as sidebar_template %}
+
+{% block title %}{{ __('title.tag') }}: {{ page.tag }} | {{ config.title }}{% endblock %}
+
+{% block content %}
+
+ {#################}
+ {### TAG BLOCK ###}
+ {#################}
+
+
+
+
+ <{% if theme.seo %}h2{% else %}h1{% endif %}>{#
+ #}{{ page.tag }}{#
+ #}{{ __('title.tag') }}
+ {% if theme.seo %}h2{% else %}h1{% endif %}>
+
+
+ {% for post in page.posts %}
+ {{ post_template.render(post) }}
+ {% endfor %}
+
+
+
+ {#####################}
+ {### END TAG BLOCK ###}
+ {#####################}
+
+ {% include '_partials/pagination.swig' %}
+{% endblock %}
+
+{% block sidebar %}
+ {{ sidebar_template.render(false) }}
+{% endblock %}
diff --git a/themes/Next/package.json b/themes/Next/package.json
new file mode 100644
index 0000000..33377ac
--- /dev/null
+++ b/themes/Next/package.json
@@ -0,0 +1,38 @@
+{
+ "name": "hexo-theme-next",
+ "version": "5.1.3",
+ "description": "Elegant theme for Hexo",
+ "main": "index.js",
+ "directories": {
+ "test": "test"
+ },
+ "scripts": {
+ "test": "gulp"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/iissnan/hexo-theme-next.git"
+ },
+ "keywords": [
+ "NexT",
+ "Hexo"
+ ],
+ "author": "iissnan ",
+ "maintainers": [
+ "Ivan Nginx (https://almostover.ru)"
+ ],
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/iissnan/hexo-theme-next/issues"
+ },
+ "homepage": "https://theme-next.iissnan.com",
+ "devDependencies": {
+ "coffee-script": "^1.10.0",
+ "gulp": "^3.9.0",
+ "gulp-jshint": "^1.12.0",
+ "gulp-shell": "^0.6.1",
+ "js-yaml": "^3.8.1",
+ "jshint-stylish": "^2.1.0",
+ "stylint": "^1.5.9"
+ }
+}
diff --git a/themes/Next/scripts/merge-configs.js b/themes/Next/scripts/merge-configs.js
new file mode 100644
index 0000000..3f6cf71
--- /dev/null
+++ b/themes/Next/scripts/merge-configs.js
@@ -0,0 +1,20 @@
+/* global hexo */
+
+var merge = require('./merge');
+
+/**
+ * Merge configs in _data/next.yml into hexo.theme.config.
+ * Note: configs in _data/next.yml will override configs in hexo.theme.config.
+ */
+hexo.on('generateBefore', function () {
+ if (hexo.locals.get) {
+ var data = hexo.locals.get('data');
+ if ( data && data.next ) {
+ if ( data.next.override ) {
+ hexo.theme.config = data.next;
+ } else {
+ merge(hexo.theme.config, data.next);
+ }
+ }
+ }
+});
diff --git a/themes/Next/scripts/merge.js b/themes/Next/scripts/merge.js
new file mode 100644
index 0000000..f964663
--- /dev/null
+++ b/themes/Next/scripts/merge.js
@@ -0,0 +1,2225 @@
+/**
+ * lodash (Custom Build)
+ * Build: `lodash modularize exports="npm" -o ./`
+ * Copyright jQuery Foundation and other contributors
+ * Released under MIT license
+ * Based on Underscore.js 1.8.3
+ * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ */
+
+/** Used as the size to enable large array optimizations. */
+var LARGE_ARRAY_SIZE = 200;
+
+/** Used to stand-in for `undefined` hash values. */
+var HASH_UNDEFINED = '__lodash_hash_undefined__';
+
+/** Used as references for various `Number` constants. */
+var MAX_SAFE_INTEGER = 9007199254740991;
+
+/** `Object#toString` result references. */
+var argsTag = '[object Arguments]',
+ arrayTag = '[object Array]',
+ boolTag = '[object Boolean]',
+ dateTag = '[object Date]',
+ errorTag = '[object Error]',
+ funcTag = '[object Function]',
+ genTag = '[object GeneratorFunction]',
+ mapTag = '[object Map]',
+ numberTag = '[object Number]',
+ objectTag = '[object Object]',
+ promiseTag = '[object Promise]',
+ regexpTag = '[object RegExp]',
+ setTag = '[object Set]',
+ stringTag = '[object String]',
+ symbolTag = '[object Symbol]',
+ weakMapTag = '[object WeakMap]';
+
+var arrayBufferTag = '[object ArrayBuffer]',
+ dataViewTag = '[object DataView]',
+ float32Tag = '[object Float32Array]',
+ float64Tag = '[object Float64Array]',
+ int8Tag = '[object Int8Array]',
+ int16Tag = '[object Int16Array]',
+ int32Tag = '[object Int32Array]',
+ uint8Tag = '[object Uint8Array]',
+ uint8ClampedTag = '[object Uint8ClampedArray]',
+ uint16Tag = '[object Uint16Array]',
+ uint32Tag = '[object Uint32Array]';
+
+/**
+ * Used to match `RegExp`
+ * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
+ */
+var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
+
+/** Used to match `RegExp` flags from their coerced string values. */
+var reFlags = /\w*$/;
+
+/** Used to detect host constructors (Safari). */
+var reIsHostCtor = /^\[object .+?Constructor\]$/;
+
+/** Used to detect unsigned integer values. */
+var reIsUint = /^(?:0|[1-9]\d*)$/;
+
+/** Used to identify `toStringTag` values of typed arrays. */
+var typedArrayTags = {};
+typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
+ typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
+ typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
+ typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
+ typedArrayTags[uint32Tag] = true;
+typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
+ typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
+ typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
+ typedArrayTags[errorTag] = typedArrayTags[funcTag] =
+ typedArrayTags[mapTag] = typedArrayTags[numberTag] =
+ typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
+ typedArrayTags[setTag] = typedArrayTags[stringTag] =
+ typedArrayTags[weakMapTag] = false;
+
+/** Used to identify `toStringTag` values supported by `_.clone`. */
+var cloneableTags = {};
+cloneableTags[argsTag] = cloneableTags[arrayTag] =
+ cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
+ cloneableTags[boolTag] = cloneableTags[dateTag] =
+ cloneableTags[float32Tag] = cloneableTags[float64Tag] =
+ cloneableTags[int8Tag] = cloneableTags[int16Tag] =
+ cloneableTags[int32Tag] = cloneableTags[mapTag] =
+ cloneableTags[numberTag] = cloneableTags[objectTag] =
+ cloneableTags[regexpTag] = cloneableTags[setTag] =
+ cloneableTags[stringTag] = cloneableTags[symbolTag] =
+ cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
+ cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
+cloneableTags[errorTag] = cloneableTags[funcTag] =
+ cloneableTags[weakMapTag] = false;
+
+/** Detect free variable `global` from Node.js. */
+var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
+
+/** Detect free variable `self`. */
+var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
+
+/** Used as a reference to the global object. */
+var root = freeGlobal || freeSelf || Function('return this')();
+
+/** Detect free variable `exports`. */
+var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
+
+/** Detect free variable `module`. */
+var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
+
+/** Detect the popular CommonJS extension `module.exports`. */
+var moduleExports = freeModule && freeModule.exports === freeExports;
+
+/** Detect free variable `process` from Node.js. */
+var freeProcess = moduleExports && freeGlobal.process;
+
+/** Used to access faster Node.js helpers. */
+var nodeUtil = (function () {
+ try {
+ return freeProcess && freeProcess.binding('util');
+ } catch (e) {
+ }
+}());
+
+/* Node.js helper references. */
+var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
+
+/**
+ * Adds the key-value `pair` to `map`.
+ *
+ * @private
+ * @param {Object} map The map to modify.
+ * @param {Array} pair The key-value pair to add.
+ * @returns {Object} Returns `map`.
+ */
+function addMapEntry(map, pair) {
+ // Don't return `map.set` because it's not chainable in IE 11.
+ map.set(pair[0], pair[1]);
+ return map;
+}
+
+/**
+ * Adds `value` to `set`.
+ *
+ * @private
+ * @param {Object} set The set to modify.
+ * @param {*} value The value to add.
+ * @returns {Object} Returns `set`.
+ */
+function addSetEntry(set, value) {
+ // Don't return `set.add` because it's not chainable in IE 11.
+ set.add(value);
+ return set;
+}
+
+/**
+ * A faster alternative to `Function#apply`, this function invokes `func`
+ * with the `this` binding of `thisArg` and the arguments of `args`.
+ *
+ * @private
+ * @param {Function} func The function to invoke.
+ * @param {*} thisArg The `this` binding of `func`.
+ * @param {Array} args The arguments to invoke `func` with.
+ * @returns {*} Returns the result of `func`.
+ */
+function apply(func, thisArg, args) {
+ switch (args.length) {
+ case 0:
+ return func.call(thisArg);
+ case 1:
+ return func.call(thisArg, args[0]);
+ case 2:
+ return func.call(thisArg, args[0], args[1]);
+ case 3:
+ return func.call(thisArg, args[0], args[1], args[2]);
+ }
+ return func.apply(thisArg, args);
+}
+
+/**
+ * A specialized version of `_.forEach` for arrays without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns `array`.
+ */
+function arrayEach(array, iteratee) {
+ var index = -1,
+ length = array ? array.length : 0;
+
+ while (++index < length) {
+ if (iteratee(array[index], index, array) === false) {
+ break;
+ }
+ }
+ return array;
+}
+
+/**
+ * Appends the elements of `values` to `array`.
+ *
+ * @private
+ * @param {Array} array The array to modify.
+ * @param {Array} values The values to append.
+ * @returns {Array} Returns `array`.
+ */
+function arrayPush(array, values) {
+ var index = -1,
+ length = values.length,
+ offset = array.length;
+
+ while (++index < length) {
+ array[offset + index] = values[index];
+ }
+ return array;
+}
+
+/**
+ * A specialized version of `_.reduce` for arrays without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @param {boolean} [initAccum] Specify using the first element of `array` as
+ * the initial value.
+ * @returns {*} Returns the accumulated value.
+ */
+function arrayReduce(array, iteratee, accumulator, initAccum) {
+ var index = -1,
+ length = array ? array.length : 0;
+
+ if (initAccum && length) {
+ accumulator = array[++index];
+ }
+ while (++index < length) {
+ accumulator = iteratee(accumulator, array[index], index, array);
+ }
+ return accumulator;
+}
+
+/**
+ * The base implementation of `_.times` without support for iteratee shorthands
+ * or max array length checks.
+ *
+ * @private
+ * @param {number} n The number of times to invoke `iteratee`.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns the array of results.
+ */
+function baseTimes(n, iteratee) {
+ var index = -1,
+ result = Array(n);
+
+ while (++index < n) {
+ result[index] = iteratee(index);
+ }
+ return result;
+}
+
+/**
+ * The base implementation of `_.unary` without support for storing metadata.
+ *
+ * @private
+ * @param {Function} func The function to cap arguments for.
+ * @returns {Function} Returns the new capped function.
+ */
+function baseUnary(func) {
+ return function (value) {
+ return func(value);
+ };
+}
+
+/**
+ * Gets the value at `key` of `object`.
+ *
+ * @private
+ * @param {Object} [object] The object to query.
+ * @param {string} key The key of the property to get.
+ * @returns {*} Returns the property value.
+ */
+function getValue(object, key) {
+ return object == null ? undefined : object[key];
+}
+
+/**
+ * Checks if `value` is a host object in IE < 9.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a host object, else `false`.
+ */
+function isHostObject(value) {
+ // Many host objects are `Object` objects that can coerce to strings
+ // despite having improperly defined `toString` methods.
+ var result = false;
+ if (value != null && typeof value.toString != 'function') {
+ try {
+ result = !!(value + '');
+ } catch (e) {
+ }
+ }
+ return result;
+}
+
+/**
+ * Converts `map` to its key-value pairs.
+ *
+ * @private
+ * @param {Object} map The map to convert.
+ * @returns {Array} Returns the key-value pairs.
+ */
+function mapToArray(map) {
+ var index = -1,
+ result = Array(map.size);
+
+ map.forEach(function (value, key) {
+ result[++index] = [key, value];
+ });
+ return result;
+}
+
+/**
+ * Creates a unary function that invokes `func` with its argument transformed.
+ *
+ * @private
+ * @param {Function} func The function to wrap.
+ * @param {Function} transform The argument transform.
+ * @returns {Function} Returns the new function.
+ */
+function overArg(func, transform) {
+ return function (arg) {
+ return func(transform(arg));
+ };
+}
+
+/**
+ * Converts `set` to an array of its values.
+ *
+ * @private
+ * @param {Object} set The set to convert.
+ * @returns {Array} Returns the values.
+ */
+function setToArray(set) {
+ var index = -1,
+ result = Array(set.size);
+
+ set.forEach(function (value) {
+ result[++index] = value;
+ });
+ return result;
+}
+
+/** Used for built-in method references. */
+var arrayProto = Array.prototype,
+ funcProto = Function.prototype,
+ objectProto = Object.prototype;
+
+/** Used to detect overreaching core-js shims. */
+var coreJsData = root['__core-js_shared__'];
+
+/** Used to detect methods masquerading as native. */
+var maskSrcKey = (function () {
+ var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
+ return uid ? ('Symbol(src)_1.' + uid) : '';
+}());
+
+/** Used to resolve the decompiled source of functions. */
+var funcToString = funcProto.toString;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/** Used to infer the `Object` constructor. */
+var objectCtorString = funcToString.call(Object);
+
+/**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var objectToString = objectProto.toString;
+
+/** Used to detect if a method is native. */
+var reIsNative = RegExp('^' +
+ funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
+ .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
+);
+
+/** Built-in value references. */
+var Buffer = moduleExports ? root.Buffer : undefined,
+ Symbol = root.Symbol,
+ Uint8Array = root.Uint8Array,
+ getPrototype = overArg(Object.getPrototypeOf, Object),
+ objectCreate = Object.create,
+ propertyIsEnumerable = objectProto.propertyIsEnumerable,
+ splice = arrayProto.splice;
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeGetSymbols = Object.getOwnPropertySymbols,
+ nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
+ nativeKeys = overArg(Object.keys, Object),
+ nativeMax = Math.max;
+
+/* Built-in method references that are verified to be native. */
+var DataView = getNative(root, 'DataView'),
+ Map = getNative(root, 'Map'),
+ Promise = getNative(root, 'Promise'),
+ Set = getNative(root, 'Set'),
+ WeakMap = getNative(root, 'WeakMap'),
+ nativeCreate = getNative(Object, 'create');
+
+/** Used to detect maps, sets, and weakmaps. */
+var dataViewCtorString = toSource(DataView),
+ mapCtorString = toSource(Map),
+ promiseCtorString = toSource(Promise),
+ setCtorString = toSource(Set),
+ weakMapCtorString = toSource(WeakMap);
+
+/** Used to convert symbols to primitives and strings. */
+var symbolProto = Symbol ? Symbol.prototype : undefined,
+ symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
+
+/**
+ * Creates a hash object.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+function Hash(entries) {
+ var index = -1,
+ length = entries ? entries.length : 0;
+
+ this.clear();
+ while (++index < length) {
+ var entry = entries[index];
+ this.set(entry[0], entry[1]);
+ }
+}
+
+/**
+ * Removes all key-value entries from the hash.
+ *
+ * @private
+ * @name clear
+ * @memberOf Hash
+ */
+function hashClear() {
+ this.__data__ = nativeCreate ? nativeCreate(null) : {};
+}
+
+/**
+ * Removes `key` and its value from the hash.
+ *
+ * @private
+ * @name delete
+ * @memberOf Hash
+ * @param {Object} hash The hash to modify.
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+function hashDelete(key) {
+ return this.has(key) && delete this.__data__[key];
+}
+
+/**
+ * Gets the hash value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf Hash
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+function hashGet(key) {
+ var data = this.__data__;
+ if (nativeCreate) {
+ var result = data[key];
+ return result === HASH_UNDEFINED ? undefined : result;
+ }
+ return hasOwnProperty.call(data, key) ? data[key] : undefined;
+}
+
+/**
+ * Checks if a hash value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf Hash
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function hashHas(key) {
+ var data = this.__data__;
+ return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);
+}
+
+/**
+ * Sets the hash `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf Hash
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the hash instance.
+ */
+function hashSet(key, value) {
+ var data = this.__data__;
+ data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
+ return this;
+}
+
+// Add methods to `Hash`.
+Hash.prototype.clear = hashClear;
+Hash.prototype['delete'] = hashDelete;
+Hash.prototype.get = hashGet;
+Hash.prototype.has = hashHas;
+Hash.prototype.set = hashSet;
+
+/**
+ * Creates an list cache object.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+function ListCache(entries) {
+ var index = -1,
+ length = entries ? entries.length : 0;
+
+ this.clear();
+ while (++index < length) {
+ var entry = entries[index];
+ this.set(entry[0], entry[1]);
+ }
+}
+
+/**
+ * Removes all key-value entries from the list cache.
+ *
+ * @private
+ * @name clear
+ * @memberOf ListCache
+ */
+function listCacheClear() {
+ this.__data__ = [];
+}
+
+/**
+ * Removes `key` and its value from the list cache.
+ *
+ * @private
+ * @name delete
+ * @memberOf ListCache
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+function listCacheDelete(key) {
+ var data = this.__data__,
+ index = assocIndexOf(data, key);
+
+ if (index < 0) {
+ return false;
+ }
+ var lastIndex = data.length - 1;
+ if (index == lastIndex) {
+ data.pop();
+ } else {
+ splice.call(data, index, 1);
+ }
+ return true;
+}
+
+/**
+ * Gets the list cache value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf ListCache
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+function listCacheGet(key) {
+ var data = this.__data__,
+ index = assocIndexOf(data, key);
+
+ return index < 0 ? undefined : data[index][1];
+}
+
+/**
+ * Checks if a list cache value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf ListCache
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function listCacheHas(key) {
+ return assocIndexOf(this.__data__, key) > -1;
+}
+
+/**
+ * Sets the list cache `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf ListCache
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the list cache instance.
+ */
+function listCacheSet(key, value) {
+ var data = this.__data__,
+ index = assocIndexOf(data, key);
+
+ if (index < 0) {
+ data.push([key, value]);
+ } else {
+ data[index][1] = value;
+ }
+ return this;
+}
+
+// Add methods to `ListCache`.
+ListCache.prototype.clear = listCacheClear;
+ListCache.prototype['delete'] = listCacheDelete;
+ListCache.prototype.get = listCacheGet;
+ListCache.prototype.has = listCacheHas;
+ListCache.prototype.set = listCacheSet;
+
+/**
+ * Creates a map cache object to store key-value pairs.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+function MapCache(entries) {
+ var index = -1,
+ length = entries ? entries.length : 0;
+
+ this.clear();
+ while (++index < length) {
+ var entry = entries[index];
+ this.set(entry[0], entry[1]);
+ }
+}
+
+/**
+ * Removes all key-value entries from the map.
+ *
+ * @private
+ * @name clear
+ * @memberOf MapCache
+ */
+function mapCacheClear() {
+ this.__data__ = {
+ 'hash': new Hash,
+ 'map': new (Map || ListCache),
+ 'string': new Hash
+ };
+}
+
+/**
+ * Removes `key` and its value from the map.
+ *
+ * @private
+ * @name delete
+ * @memberOf MapCache
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+function mapCacheDelete(key) {
+ return getMapData(this, key)['delete'](key);
+}
+
+/**
+ * Gets the map value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf MapCache
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+function mapCacheGet(key) {
+ return getMapData(this, key).get(key);
+}
+
+/**
+ * Checks if a map value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf MapCache
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function mapCacheHas(key) {
+ return getMapData(this, key).has(key);
+}
+
+/**
+ * Sets the map `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf MapCache
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the map cache instance.
+ */
+function mapCacheSet(key, value) {
+ getMapData(this, key).set(key, value);
+ return this;
+}
+
+// Add methods to `MapCache`.
+MapCache.prototype.clear = mapCacheClear;
+MapCache.prototype['delete'] = mapCacheDelete;
+MapCache.prototype.get = mapCacheGet;
+MapCache.prototype.has = mapCacheHas;
+MapCache.prototype.set = mapCacheSet;
+
+/**
+ * Creates a stack cache object to store key-value pairs.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+function Stack(entries) {
+ this.__data__ = new ListCache(entries);
+}
+
+/**
+ * Removes all key-value entries from the stack.
+ *
+ * @private
+ * @name clear
+ * @memberOf Stack
+ */
+function stackClear() {
+ this.__data__ = new ListCache;
+}
+
+/**
+ * Removes `key` and its value from the stack.
+ *
+ * @private
+ * @name delete
+ * @memberOf Stack
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+function stackDelete(key) {
+ return this.__data__['delete'](key);
+}
+
+/**
+ * Gets the stack value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf Stack
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+function stackGet(key) {
+ return this.__data__.get(key);
+}
+
+/**
+ * Checks if a stack value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf Stack
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function stackHas(key) {
+ return this.__data__.has(key);
+}
+
+/**
+ * Sets the stack `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf Stack
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the stack cache instance.
+ */
+function stackSet(key, value) {
+ var cache = this.__data__;
+ if (cache instanceof ListCache) {
+ var pairs = cache.__data__;
+ if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
+ pairs.push([key, value]);
+ return this;
+ }
+ cache = this.__data__ = new MapCache(pairs);
+ }
+ cache.set(key, value);
+ return this;
+}
+
+// Add methods to `Stack`.
+Stack.prototype.clear = stackClear;
+Stack.prototype['delete'] = stackDelete;
+Stack.prototype.get = stackGet;
+Stack.prototype.has = stackHas;
+Stack.prototype.set = stackSet;
+
+/**
+ * Creates an array of the enumerable property names of the array-like `value`.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @param {boolean} inherited Specify returning inherited property names.
+ * @returns {Array} Returns the array of property names.
+ */
+function arrayLikeKeys(value, inherited) {
+ // Safari 8.1 makes `arguments.callee` enumerable in strict mode.
+ // Safari 9 makes `arguments.length` enumerable in strict mode.
+ var result = (isArray(value) || isArguments(value))
+ ? baseTimes(value.length, String)
+ : [];
+
+ var length = result.length,
+ skipIndexes = !!length;
+
+ for (var key in value) {
+ if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && (key == 'length' || isIndex(key, length)))) {
+ result.push(key);
+ }
+ }
+ return result;
+}
+
+/**
+ * This function is like `assignValue` except that it doesn't assign
+ * `undefined` values.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {string} key The key of the property to assign.
+ * @param {*} value The value to assign.
+ */
+function assignMergeValue(object, key, value) {
+ if ((value !== undefined && !eq(object[key], value)) ||
+ (typeof key == 'number' && value === undefined && !(key in object))) {
+ object[key] = value;
+ }
+}
+
+/**
+ * Assigns `value` to `key` of `object` if the existing value is not equivalent
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {string} key The key of the property to assign.
+ * @param {*} value The value to assign.
+ */
+function assignValue(object, key, value) {
+ var objValue = object[key];
+ if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
+ (value === undefined && !(key in object))) {
+ object[key] = value;
+ }
+}
+
+/**
+ * Gets the index at which the `key` is found in `array` of key-value pairs.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {*} key The key to search for.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
+function assocIndexOf(array, key) {
+ var length = array.length;
+ while (length--) {
+ if (eq(array[length][0], key)) {
+ return length;
+ }
+ }
+ return -1;
+}
+
+/**
+ * The base implementation of `_.assign` without support for multiple sources
+ * or `customizer` functions.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @returns {Object} Returns `object`.
+ */
+function baseAssign(object, source) {
+ return object && copyObject(source, keys(source), object);
+}
+
+/**
+ * The base implementation of `_.clone` and `_.cloneDeep` which tracks
+ * traversed objects.
+ *
+ * @private
+ * @param {*} value The value to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @param {boolean} [isFull] Specify a clone including symbols.
+ * @param {Function} [customizer] The function to customize cloning.
+ * @param {string} [key] The key of `value`.
+ * @param {Object} [object] The parent object of `value`.
+ * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
+ * @returns {*} Returns the cloned value.
+ */
+function baseClone(value, isDeep, isFull, customizer, key, object, stack) {
+ var result;
+ if (customizer) {
+ result = object ? customizer(value, key, object, stack) : customizer(value);
+ }
+ if (result !== undefined) {
+ return result;
+ }
+ if (!isObject(value)) {
+ return value;
+ }
+ var isArr = isArray(value);
+ if (isArr) {
+ result = initCloneArray(value);
+ if (!isDeep) {
+ return copyArray(value, result);
+ }
+ } else {
+ var tag = getTag(value),
+ isFunc = tag == funcTag || tag == genTag;
+
+ if (isBuffer(value)) {
+ return cloneBuffer(value, isDeep);
+ }
+ if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
+ if (isHostObject(value)) {
+ return object ? value : {};
+ }
+ result = initCloneObject(isFunc ? {} : value);
+ if (!isDeep) {
+ return copySymbols(value, baseAssign(result, value));
+ }
+ } else {
+ if (!cloneableTags[tag]) {
+ return object ? value : {};
+ }
+ result = initCloneByTag(value, tag, baseClone, isDeep);
+ }
+ }
+ // Check for circular references and return its corresponding clone.
+ stack || (stack = new Stack);
+ var stacked = stack.get(value);
+ if (stacked) {
+ return stacked;
+ }
+ stack.set(value, result);
+
+ if (!isArr) {
+ var props = isFull ? getAllKeys(value) : keys(value);
+ }
+ arrayEach(props || value, function (subValue, key) {
+ if (props) {
+ key = subValue;
+ subValue = value[key];
+ }
+ // Recursively populate clone (susceptible to call stack limits).
+ assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack));
+ });
+ return result;
+}
+
+/**
+ * The base implementation of `_.create` without support for assigning
+ * properties to the created object.
+ *
+ * @private
+ * @param {Object} prototype The object to inherit from.
+ * @returns {Object} Returns the new object.
+ */
+function baseCreate(proto) {
+ return isObject(proto) ? objectCreate(proto) : {};
+}
+
+/**
+ * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
+ * `keysFunc` and `symbolsFunc` to get the enumerable property names and
+ * symbols of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Function} keysFunc The function to get the keys of `object`.
+ * @param {Function} symbolsFunc The function to get the symbols of `object`.
+ * @returns {Array} Returns the array of property names and symbols.
+ */
+function baseGetAllKeys(object, keysFunc, symbolsFunc) {
+ var result = keysFunc(object);
+ return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
+}
+
+/**
+ * The base implementation of `getTag`.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the `toStringTag`.
+ */
+function baseGetTag(value) {
+ return objectToString.call(value);
+}
+
+/**
+ * The base implementation of `_.isNative` without bad shim checks.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a native function,
+ * else `false`.
+ */
+function baseIsNative(value) {
+ if (!isObject(value) || isMasked(value)) {
+ return false;
+ }
+ var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;
+ return pattern.test(toSource(value));
+}
+
+/**
+ * The base implementation of `_.isTypedArray` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
+ */
+function baseIsTypedArray(value) {
+ return isObjectLike(value) &&
+ isLength(value.length) && !!typedArrayTags[objectToString.call(value)];
+}
+
+/**
+ * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ */
+function baseKeys(object) {
+ if (!isPrototype(object)) {
+ return nativeKeys(object);
+ }
+ var result = [];
+ for (var key in Object(object)) {
+ if (hasOwnProperty.call(object, key) && key != 'constructor') {
+ result.push(key);
+ }
+ }
+ return result;
+}
+
+/**
+ * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ */
+function baseKeysIn(object) {
+ if (!isObject(object)) {
+ return nativeKeysIn(object);
+ }
+ var isProto = isPrototype(object),
+ result = [];
+
+ for (var key in object) {
+ if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
+ result.push(key);
+ }
+ }
+ return result;
+}
+
+/**
+ * The base implementation of `_.merge` without support for multiple sources.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @param {number} srcIndex The index of `source`.
+ * @param {Function} [customizer] The function to customize merged values.
+ * @param {Object} [stack] Tracks traversed source values and their merged
+ * counterparts.
+ */
+function baseMerge(object, source, srcIndex, customizer, stack) {
+ if (object === source) {
+ return;
+ }
+ if (!(isArray(source) || isTypedArray(source))) {
+ var props = baseKeysIn(source);
+ }
+ arrayEach(props || source, function (srcValue, key) {
+ if (props) {
+ key = srcValue;
+ srcValue = source[key];
+ }
+ if (isObject(srcValue)) {
+ stack || (stack = new Stack);
+ baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
+ }
+ else {
+ var newValue = customizer
+ ? customizer(object[key], srcValue, (key + ''), object, source, stack)
+ : undefined;
+
+ if (newValue === undefined) {
+ newValue = srcValue;
+ }
+ assignMergeValue(object, key, newValue);
+ }
+ });
+}
+
+/**
+ * A specialized version of `baseMerge` for arrays and objects which performs
+ * deep merges and tracks traversed objects enabling objects with circular
+ * references to be merged.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @param {string} key The key of the value to merge.
+ * @param {number} srcIndex The index of `source`.
+ * @param {Function} mergeFunc The function to merge values.
+ * @param {Function} [customizer] The function to customize assigned values.
+ * @param {Object} [stack] Tracks traversed source values and their merged
+ * counterparts.
+ */
+function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
+ var objValue = object[key],
+ srcValue = source[key],
+ stacked = stack.get(srcValue);
+
+ if (stacked) {
+ assignMergeValue(object, key, stacked);
+ return;
+ }
+ var newValue = customizer
+ ? customizer(objValue, srcValue, (key + ''), object, source, stack)
+ : undefined;
+
+ var isCommon = newValue === undefined;
+
+ if (isCommon) {
+ newValue = srcValue;
+ if (isArray(srcValue) || isTypedArray(srcValue)) {
+ if (isArray(objValue)) {
+ newValue = objValue;
+ }
+ else if (isArrayLikeObject(objValue)) {
+ newValue = copyArray(objValue);
+ }
+ else {
+ isCommon = false;
+ newValue = baseClone(srcValue, true);
+ }
+ }
+ else if (isPlainObject(srcValue) || isArguments(srcValue)) {
+ if (isArguments(objValue)) {
+ newValue = toPlainObject(objValue);
+ }
+ else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {
+ isCommon = false;
+ newValue = baseClone(srcValue, true);
+ }
+ else {
+ newValue = objValue;
+ }
+ }
+ else {
+ isCommon = false;
+ }
+ }
+ if (isCommon) {
+ // Recursively merge objects and arrays (susceptible to call stack limits).
+ stack.set(srcValue, newValue);
+ mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
+ stack['delete'](srcValue);
+ }
+ assignMergeValue(object, key, newValue);
+}
+
+/**
+ * The base implementation of `_.rest` which doesn't validate or coerce arguments.
+ *
+ * @private
+ * @param {Function} func The function to apply a rest parameter to.
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
+ * @returns {Function} Returns the new function.
+ */
+function baseRest(func, start) {
+ start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
+ return function () {
+ var args = arguments,
+ index = -1,
+ length = nativeMax(args.length - start, 0),
+ array = Array(length);
+
+ while (++index < length) {
+ array[index] = args[start + index];
+ }
+ index = -1;
+ var otherArgs = Array(start + 1);
+ while (++index < start) {
+ otherArgs[index] = args[index];
+ }
+ otherArgs[start] = array;
+ return apply(func, this, otherArgs);
+ };
+}
+
+/**
+ * Creates a clone of `buffer`.
+ *
+ * @private
+ * @param {Buffer} buffer The buffer to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Buffer} Returns the cloned buffer.
+ */
+function cloneBuffer(buffer, isDeep) {
+ if (isDeep) {
+ return buffer.slice();
+ }
+ var result = new buffer.constructor(buffer.length);
+ buffer.copy(result);
+ return result;
+}
+
+/**
+ * Creates a clone of `arrayBuffer`.
+ *
+ * @private
+ * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
+ * @returns {ArrayBuffer} Returns the cloned array buffer.
+ */
+function cloneArrayBuffer(arrayBuffer) {
+ var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
+ new Uint8Array(result).set(new Uint8Array(arrayBuffer));
+ return result;
+}
+
+/**
+ * Creates a clone of `dataView`.
+ *
+ * @private
+ * @param {Object} dataView The data view to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the cloned data view.
+ */
+function cloneDataView(dataView, isDeep) {
+ var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
+ return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
+}
+
+/**
+ * Creates a clone of `map`.
+ *
+ * @private
+ * @param {Object} map The map to clone.
+ * @param {Function} cloneFunc The function to clone values.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the cloned map.
+ */
+function cloneMap(map, isDeep, cloneFunc) {
+ var array = isDeep ? cloneFunc(mapToArray(map), true) : mapToArray(map);
+ return arrayReduce(array, addMapEntry, new map.constructor);
+}
+
+/**
+ * Creates a clone of `regexp`.
+ *
+ * @private
+ * @param {Object} regexp The regexp to clone.
+ * @returns {Object} Returns the cloned regexp.
+ */
+function cloneRegExp(regexp) {
+ var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
+ result.lastIndex = regexp.lastIndex;
+ return result;
+}
+
+/**
+ * Creates a clone of `set`.
+ *
+ * @private
+ * @param {Object} set The set to clone.
+ * @param {Function} cloneFunc The function to clone values.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the cloned set.
+ */
+function cloneSet(set, isDeep, cloneFunc) {
+ var array = isDeep ? cloneFunc(setToArray(set), true) : setToArray(set);
+ return arrayReduce(array, addSetEntry, new set.constructor);
+}
+
+/**
+ * Creates a clone of the `symbol` object.
+ *
+ * @private
+ * @param {Object} symbol The symbol object to clone.
+ * @returns {Object} Returns the cloned symbol object.
+ */
+function cloneSymbol(symbol) {
+ return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
+}
+
+/**
+ * Creates a clone of `typedArray`.
+ *
+ * @private
+ * @param {Object} typedArray The typed array to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the cloned typed array.
+ */
+function cloneTypedArray(typedArray, isDeep) {
+ var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
+ return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
+}
+
+/**
+ * Copies the values of `source` to `array`.
+ *
+ * @private
+ * @param {Array} source The array to copy values from.
+ * @param {Array} [array=[]] The array to copy values to.
+ * @returns {Array} Returns `array`.
+ */
+function copyArray(source, array) {
+ var index = -1,
+ length = source.length;
+
+ array || (array = Array(length));
+ while (++index < length) {
+ array[index] = source[index];
+ }
+ return array;
+}
+
+/**
+ * Copies properties of `source` to `object`.
+ *
+ * @private
+ * @param {Object} source The object to copy properties from.
+ * @param {Array} props The property identifiers to copy.
+ * @param {Object} [object={}] The object to copy properties to.
+ * @param {Function} [customizer] The function to customize copied values.
+ * @returns {Object} Returns `object`.
+ */
+function copyObject(source, props, object, customizer) {
+ object || (object = {});
+
+ var index = -1,
+ length = props.length;
+
+ while (++index < length) {
+ var key = props[index];
+
+ var newValue = customizer
+ ? customizer(object[key], source[key], key, object, source)
+ : undefined;
+
+ assignValue(object, key, newValue === undefined ? source[key] : newValue);
+ }
+ return object;
+}
+
+/**
+ * Copies own symbol properties of `source` to `object`.
+ *
+ * @private
+ * @param {Object} source The object to copy symbols from.
+ * @param {Object} [object={}] The object to copy symbols to.
+ * @returns {Object} Returns `object`.
+ */
+function copySymbols(source, object) {
+ return copyObject(source, getSymbols(source), object);
+}
+
+/**
+ * Creates a function like `_.assign`.
+ *
+ * @private
+ * @param {Function} assigner The function to assign values.
+ * @returns {Function} Returns the new assigner function.
+ */
+function createAssigner(assigner) {
+ return baseRest(function (object, sources) {
+ var index = -1,
+ length = sources.length,
+ customizer = length > 1 ? sources[length - 1] : undefined,
+ guard = length > 2 ? sources[2] : undefined;
+
+ customizer = (assigner.length > 3 && typeof customizer == 'function')
+ ? (length--, customizer)
+ : undefined;
+
+ if (guard && isIterateeCall(sources[0], sources[1], guard)) {
+ customizer = length < 3 ? undefined : customizer;
+ length = 1;
+ }
+ object = Object(object);
+ while (++index < length) {
+ var source = sources[index];
+ if (source) {
+ assigner(object, source, index, customizer);
+ }
+ }
+ return object;
+ });
+}
+
+/**
+ * Creates an array of own enumerable property names and symbols of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names and symbols.
+ */
+function getAllKeys(object) {
+ return baseGetAllKeys(object, keys, getSymbols);
+}
+
+/**
+ * Gets the data for `map`.
+ *
+ * @private
+ * @param {Object} map The map to query.
+ * @param {string} key The reference key.
+ * @returns {*} Returns the map data.
+ */
+function getMapData(map, key) {
+ var data = map.__data__;
+ return isKeyable(key)
+ ? data[typeof key == 'string' ? 'string' : 'hash']
+ : data.map;
+}
+
+/**
+ * Gets the native function at `key` of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {string} key The key of the method to get.
+ * @returns {*} Returns the function if it's native, else `undefined`.
+ */
+function getNative(object, key) {
+ var value = getValue(object, key);
+ return baseIsNative(value) ? value : undefined;
+}
+
+/**
+ * Creates an array of the own enumerable symbol properties of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of symbols.
+ */
+var getSymbols = nativeGetSymbols ? overArg(nativeGetSymbols, Object) : stubArray;
+
+/**
+ * Gets the `toStringTag` of `value`.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the `toStringTag`.
+ */
+var getTag = baseGetTag;
+
+// Fallback for data views, maps, sets, and weak maps in IE 11,
+// for data views in Edge < 14, and promises in Node.js.
+if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
+ (Map && getTag(new Map) != mapTag) ||
+ (Promise && getTag(Promise.resolve()) != promiseTag) ||
+ (Set && getTag(new Set) != setTag) ||
+ (WeakMap && getTag(new WeakMap) != weakMapTag)) {
+ getTag = function (value) {
+ var result = objectToString.call(value),
+ Ctor = result == objectTag ? value.constructor : undefined,
+ ctorString = Ctor ? toSource(Ctor) : undefined;
+
+ if (ctorString) {
+ switch (ctorString) {
+ case dataViewCtorString:
+ return dataViewTag;
+ case mapCtorString:
+ return mapTag;
+ case promiseCtorString:
+ return promiseTag;
+ case setCtorString:
+ return setTag;
+ case weakMapCtorString:
+ return weakMapTag;
+ }
+ }
+ return result;
+ };
+}
+
+/**
+ * Initializes an array clone.
+ *
+ * @private
+ * @param {Array} array The array to clone.
+ * @returns {Array} Returns the initialized clone.
+ */
+function initCloneArray(array) {
+ var length = array.length,
+ result = array.constructor(length);
+
+ // Add properties assigned by `RegExp#exec`.
+ if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
+ result.index = array.index;
+ result.input = array.input;
+ }
+ return result;
+}
+
+/**
+ * Initializes an object clone.
+ *
+ * @private
+ * @param {Object} object The object to clone.
+ * @returns {Object} Returns the initialized clone.
+ */
+function initCloneObject(object) {
+ return (typeof object.constructor == 'function' && !isPrototype(object))
+ ? baseCreate(getPrototype(object))
+ : {};
+}
+
+/**
+ * Initializes an object clone based on its `toStringTag`.
+ *
+ * **Note:** This function only supports cloning values with tags of
+ * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
+ *
+ * @private
+ * @param {Object} object The object to clone.
+ * @param {string} tag The `toStringTag` of the object to clone.
+ * @param {Function} cloneFunc The function to clone values.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the initialized clone.
+ */
+function initCloneByTag(object, tag, cloneFunc, isDeep) {
+ var Ctor = object.constructor;
+ switch (tag) {
+ case arrayBufferTag:
+ return cloneArrayBuffer(object);
+
+ case boolTag:
+ case dateTag:
+ return new Ctor(+object);
+
+ case dataViewTag:
+ return cloneDataView(object, isDeep);
+
+ case float32Tag:
+ case float64Tag:
+ case int8Tag:
+ case int16Tag:
+ case int32Tag:
+ case uint8Tag:
+ case uint8ClampedTag:
+ case uint16Tag:
+ case uint32Tag:
+ return cloneTypedArray(object, isDeep);
+
+ case mapTag:
+ return cloneMap(object, isDeep, cloneFunc);
+
+ case numberTag:
+ case stringTag:
+ return new Ctor(object);
+
+ case regexpTag:
+ return cloneRegExp(object);
+
+ case setTag:
+ return cloneSet(object, isDeep, cloneFunc);
+
+ case symbolTag:
+ return cloneSymbol(object);
+ }
+}
+
+/**
+ * Checks if `value` is a valid array-like index.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
+ * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
+ */
+function isIndex(value, length) {
+ length = length == null ? MAX_SAFE_INTEGER : length;
+ return !!length &&
+ (typeof value == 'number' || reIsUint.test(value)) &&
+ (value > -1 && value % 1 == 0 && value < length);
+}
+
+/**
+ * Checks if the given arguments are from an iteratee call.
+ *
+ * @private
+ * @param {*} value The potential iteratee value argument.
+ * @param {*} index The potential iteratee index or key argument.
+ * @param {*} object The potential iteratee object argument.
+ * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
+ * else `false`.
+ */
+function isIterateeCall(value, index, object) {
+ if (!isObject(object)) {
+ return false;
+ }
+ var type = typeof index;
+ if (type == 'number'
+ ? (isArrayLike(object) && isIndex(index, object.length))
+ : (type == 'string' && index in object)
+ ) {
+ return eq(object[index], value);
+ }
+ return false;
+}
+
+/**
+ * Checks if `value` is suitable for use as unique object key.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
+ */
+function isKeyable(value) {
+ var type = typeof value;
+ return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
+ ? (value !== '__proto__')
+ : (value === null);
+}
+
+/**
+ * Checks if `func` has its source masked.
+ *
+ * @private
+ * @param {Function} func The function to check.
+ * @returns {boolean} Returns `true` if `func` is masked, else `false`.
+ */
+function isMasked(func) {
+ return !!maskSrcKey && (maskSrcKey in func);
+}
+
+/**
+ * Checks if `value` is likely a prototype object.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
+ */
+function isPrototype(value) {
+ var Ctor = value && value.constructor,
+ proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
+
+ return value === proto;
+}
+
+/**
+ * This function is like
+ * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
+ * except that it includes inherited enumerable properties.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ */
+function nativeKeysIn(object) {
+ var result = [];
+ if (object != null) {
+ for (var key in Object(object)) {
+ result.push(key);
+ }
+ }
+ return result;
+}
+
+/**
+ * Converts `func` to its source code.
+ *
+ * @private
+ * @param {Function} func The function to process.
+ * @returns {string} Returns the source code.
+ */
+function toSource(func) {
+ if (func != null) {
+ try {
+ return funcToString.call(func);
+ } catch (e) {
+ }
+ try {
+ return (func + '');
+ } catch (e) {
+ }
+ }
+ return '';
+}
+
+/**
+ * Performs a
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * comparison between two values to determine if they are equivalent.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+ * @example
+ *
+ * var object = { 'a': 1 };
+ * var other = { 'a': 1 };
+ *
+ * _.eq(object, object);
+ * // => true
+ *
+ * _.eq(object, other);
+ * // => false
+ *
+ * _.eq('a', 'a');
+ * // => true
+ *
+ * _.eq('a', Object('a'));
+ * // => false
+ *
+ * _.eq(NaN, NaN);
+ * // => true
+ */
+function eq(value, other) {
+ return value === other || (value !== value && other !== other);
+}
+
+/**
+ * Checks if `value` is likely an `arguments` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an `arguments` object,
+ * else `false`.
+ * @example
+ *
+ * _.isArguments(function() { return arguments; }());
+ * // => true
+ *
+ * _.isArguments([1, 2, 3]);
+ * // => false
+ */
+function isArguments(value) {
+ // Safari 8.1 makes `arguments.callee` enumerable in strict mode.
+ return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&
+ (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);
+}
+
+/**
+ * Checks if `value` is classified as an `Array` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array, else `false`.
+ * @example
+ *
+ * _.isArray([1, 2, 3]);
+ * // => true
+ *
+ * _.isArray(document.body.children);
+ * // => false
+ *
+ * _.isArray('abc');
+ * // => false
+ *
+ * _.isArray(_.noop);
+ * // => false
+ */
+var isArray = Array.isArray;
+
+/**
+ * Checks if `value` is array-like. A value is considered array-like if it's
+ * not a function and has a `value.length` that's an integer greater than or
+ * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+ * @example
+ *
+ * _.isArrayLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLike(document.body.children);
+ * // => true
+ *
+ * _.isArrayLike('abc');
+ * // => true
+ *
+ * _.isArrayLike(_.noop);
+ * // => false
+ */
+function isArrayLike(value) {
+ return value != null && isLength(value.length) && !isFunction(value);
+}
+
+/**
+ * This method is like `_.isArrayLike` except that it also checks if `value`
+ * is an object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array-like object,
+ * else `false`.
+ * @example
+ *
+ * _.isArrayLikeObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLikeObject(document.body.children);
+ * // => true
+ *
+ * _.isArrayLikeObject('abc');
+ * // => false
+ *
+ * _.isArrayLikeObject(_.noop);
+ * // => false
+ */
+function isArrayLikeObject(value) {
+ return isObjectLike(value) && isArrayLike(value);
+}
+
+/**
+ * Checks if `value` is a buffer.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.3.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
+ * @example
+ *
+ * _.isBuffer(new Buffer(2));
+ * // => true
+ *
+ * _.isBuffer(new Uint8Array(2));
+ * // => false
+ */
+var isBuffer = nativeIsBuffer || stubFalse;
+
+/**
+ * Checks if `value` is classified as a `Function` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a function, else `false`.
+ * @example
+ *
+ * _.isFunction(_);
+ * // => true
+ *
+ * _.isFunction(/abc/);
+ * // => false
+ */
+function isFunction(value) {
+ // The use of `Object#toString` avoids issues with the `typeof` operator
+ // in Safari 8-9 which returns 'object' for typed array and other constructors.
+ var tag = isObject(value) ? objectToString.call(value) : '';
+ return tag == funcTag || tag == genTag;
+}
+
+/**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This method is loosely based on
+ * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ * @example
+ *
+ * _.isLength(3);
+ * // => true
+ *
+ * _.isLength(Number.MIN_VALUE);
+ * // => false
+ *
+ * _.isLength(Infinity);
+ * // => false
+ *
+ * _.isLength('3');
+ * // => false
+ */
+function isLength(value) {
+ return typeof value == 'number' &&
+ value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+}
+
+/**
+ * Checks if `value` is the
+ * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
+ * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(_.noop);
+ * // => true
+ *
+ * _.isObject(null);
+ * // => false
+ */
+function isObject(value) {
+ var type = typeof value;
+ return !!value && (type == 'object' || type == 'function');
+}
+
+/**
+ * Checks if `value` is object-like. A value is object-like if it's not `null`
+ * and has a `typeof` result of "object".
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ * @example
+ *
+ * _.isObjectLike({});
+ * // => true
+ *
+ * _.isObjectLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isObjectLike(_.noop);
+ * // => false
+ *
+ * _.isObjectLike(null);
+ * // => false
+ */
+function isObjectLike(value) {
+ return !!value && typeof value == 'object';
+}
+
+/**
+ * Checks if `value` is a plain object, that is, an object created by the
+ * `Object` constructor or one with a `[[Prototype]]` of `null`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.8.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * }
+ *
+ * _.isPlainObject(new Foo);
+ * // => false
+ *
+ * _.isPlainObject([1, 2, 3]);
+ * // => false
+ *
+ * _.isPlainObject({ 'x': 0, 'y': 0 });
+ * // => true
+ *
+ * _.isPlainObject(Object.create(null));
+ * // => true
+ */
+function isPlainObject(value) {
+ if (!isObjectLike(value) ||
+ objectToString.call(value) != objectTag || isHostObject(value)) {
+ return false;
+ }
+ var proto = getPrototype(value);
+ if (proto === null) {
+ return true;
+ }
+ var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
+ return (typeof Ctor == 'function' &&
+ Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString);
+}
+
+/**
+ * Checks if `value` is classified as a typed array.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
+ * @example
+ *
+ * _.isTypedArray(new Uint8Array);
+ * // => true
+ *
+ * _.isTypedArray([]);
+ * // => false
+ */
+var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
+
+/**
+ * Converts `value` to a plain object flattening inherited enumerable string
+ * keyed properties of `value` to own properties of the plain object.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {Object} Returns the converted plain object.
+ * @example
+ *
+ * function Foo() {
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.assign({ 'a': 1 }, new Foo);
+ * // => { 'a': 1, 'b': 2 }
+ *
+ * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
+ * // => { 'a': 1, 'b': 2, 'c': 3 }
+ */
+function toPlainObject(value) {
+ return copyObject(value, keysIn(value));
+}
+
+/**
+ * Creates an array of the own enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects. See the
+ * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
+ * for more details.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.keys(new Foo);
+ * // => ['a', 'b'] (iteration order is not guaranteed)
+ *
+ * _.keys('hi');
+ * // => ['0', '1']
+ */
+function keys(object) {
+ return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
+}
+
+/**
+ * Creates an array of the own and inherited enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.keysIn(new Foo);
+ * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
+ */
+function keysIn(object) {
+ return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
+}
+
+/**
+ * This method is like `_.assign` except that it recursively merges own and
+ * inherited enumerable string keyed properties of source objects into the
+ * destination object. Source properties that resolve to `undefined` are
+ * skipped if a destination value exists. Array and plain object properties
+ * are merged recursively. Other objects and value types are overridden by
+ * assignment. Source objects are applied from left to right. Subsequent
+ * sources overwrite property assignments of previous sources.
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.5.0
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * var object = {
+ * 'a': [{ 'b': 2 }, { 'd': 4 }]
+ * };
+ *
+ * var other = {
+ * 'a': [{ 'c': 3 }, { 'e': 5 }]
+ * };
+ *
+ * _.merge(object, other);
+ * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
+ */
+var merge = createAssigner(function (object, source, srcIndex) {
+ baseMerge(object, source, srcIndex);
+});
+
+/**
+ * This method returns a new empty array.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.13.0
+ * @category Util
+ * @returns {Array} Returns the new empty array.
+ * @example
+ *
+ * var arrays = _.times(2, _.stubArray);
+ *
+ * console.log(arrays);
+ * // => [[], []]
+ *
+ * console.log(arrays[0] === arrays[1]);
+ * // => false
+ */
+function stubArray() {
+ return [];
+}
+
+/**
+ * This method returns `false`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.13.0
+ * @category Util
+ * @returns {boolean} Returns `false`.
+ * @example
+ *
+ * _.times(2, _.stubFalse);
+ * // => [false, false]
+ */
+function stubFalse() {
+ return false;
+}
+
+module.exports = merge;
diff --git a/themes/Next/scripts/tags/button.js b/themes/Next/scripts/tags/button.js
new file mode 100644
index 0000000..dfc0962
--- /dev/null
+++ b/themes/Next/scripts/tags/button.js
@@ -0,0 +1,31 @@
+/* global hexo */
+// Usage: {% button /path/to/url/, text, icon [class], title %}
+// Alias: {% btn /path/to/url/, text, icon [class], title %}
+
+function postButton(args) {
+ args = args.join(' ').split(',');
+ var url = args[0];
+ var text = args[1] || '';
+ var icon = args[2] || '';
+ var title = args[3] || '';
+
+ if (!url) {
+ hexo.log.warn('URL can NOT be empty');
+ }
+
+ text = text.trim();
+ icon = icon.trim();
+ title = title.trim();
+
+ var result = [' 0 && result.push(' title="' + title + '"');
+ result.push('>');
+ icon.length > 0 && result.push('');
+ text.length > 0 && result.push(text);
+ result.push('');
+
+ return result.join('');
+}
+
+hexo.extend.tag.register('button', postButton);
+hexo.extend.tag.register('btn', postButton);
diff --git a/themes/Next/scripts/tags/center-quote.js b/themes/Next/scripts/tags/center-quote.js
new file mode 100644
index 0000000..93c5258
--- /dev/null
+++ b/themes/Next/scripts/tags/center-quote.js
@@ -0,0 +1,12 @@
+/* global hexo */
+// Usage: {% centerquote %} Something {% endcenterquote %}
+// Alias: {% cq %} Something {% endcq %}
+
+function centerQuote (args, content) {
+ return '' +
+ hexo.render.renderSync({text: content, engine: 'markdown'}) +
+ '
';
+}
+
+hexo.extend.tag.register('centerquote', centerQuote, {ends: true});
+hexo.extend.tag.register('cq', centerQuote, {ends: true});
diff --git a/themes/Next/scripts/tags/exturl.js b/themes/Next/scripts/tags/exturl.js
new file mode 100644
index 0000000..901a9ce
--- /dev/null
+++ b/themes/Next/scripts/tags/exturl.js
@@ -0,0 +1,59 @@
+/* global hexo */
+// Usage: {% exturl text url "title" %}
+// Alias: {% extlink text url "title" %}
+
+'use strict';
+
+/*jshint camelcase: false */
+var util = require('hexo-util');
+/*jshint camelcase: true */
+var htmlTag = util.htmlTag;
+
+var rUrl = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[.\!\/\\w]*))?)/;
+
+// Create Base64 Object
+var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9+/=]/g,"");while(f>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/rn/g,"n");var t="";for(var n=0;n127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}};
+
+function extURL(args, content) {
+ var exturl = 'exturl';
+ var url = '';
+ var text = [''];
+ var title = '';
+ var item = '';
+ var i = 0;
+ var len = args.length;
+
+ // Find link URL and text
+ for (; i < len; i++) {
+ item = args[i];
+
+ if (rUrl.test(item)) {
+ url = Base64.encode(item);
+ break;
+ } else {
+ text.push(item);
+ }
+ }
+
+ // Delete link URL and text from arguments
+ args = args.slice(i + 1);
+
+ // Check if the link should be open in a new window
+ // and collect the last text as the link title
+ if (args.length) {
+ var shift = args[0];
+ title = args.join(' ');
+ }
+
+ var attrs = {
+ class: exturl,
+ 'data-url': url,
+ title: title
+ };
+
+ //console.log(url);
+ return htmlTag('span', attrs, text.join(' '));
+}
+
+hexo.extend.tag.register('exturl', extURL, {ends: false});
+hexo.extend.tag.register('extlink', extURL, {ends: false});
diff --git a/themes/Next/scripts/tags/full-image.js b/themes/Next/scripts/tags/full-image.js
new file mode 100644
index 0000000..d4e0e4f
--- /dev/null
+++ b/themes/Next/scripts/tags/full-image.js
@@ -0,0 +1,26 @@
+/* global hexo */
+// Usage: {% fullimage /path/to/image, alt, title %}
+// Alias: {% fi /path/to/image, alt, title %}
+
+function fullImage(args) {
+ args = args.join(' ').split(',');
+ var src = args[0];
+ var alt = args[1] || '';
+ var title = args[2] || '';
+
+ if (!src) {
+ hexo.log.warn('Image src can NOT be empty');
+ }
+ alt = alt.trim();
+ title = title.trim();
+
+ var image = ['
0 && image.push('alt="' + alt + '"');
+ title.length > 0 && image.push('title="' + title + '"');
+ image.push('/>');
+
+ return image.join(' ');
+}
+
+hexo.extend.tag.register('fullimage', fullImage);
+hexo.extend.tag.register('fi', fullImage);
diff --git a/themes/Next/scripts/tags/group-pictures.js b/themes/Next/scripts/tags/group-pictures.js
new file mode 100644
index 0000000..df7774b
--- /dev/null
+++ b/themes/Next/scripts/tags/group-pictures.js
@@ -0,0 +1,833 @@
+/* global hexo */
+// Usage: {% grouppicture group-layout %}{% endgrouppicture %}
+// Alias: {% gp group-layout %}{% endgp %}
+
+function groupPicture(args, content) {
+ args = args[0].split('-');
+ var group = parseInt(args[0]);
+ var layout = parseInt(args[1]);
+
+ content = hexo.render.renderSync({text: content, engine: 'markdown'});
+
+ var pictures = content.match(/
/g);
+
+ return '' +
+ templates.dispatch(pictures, group, layout) +
+ '';
+}
+
+var templates = {
+
+ dispatch: function (pictures, group, layout) {
+ var fn = 'group' + group + 'Layout' + layout;
+ fn = templates[fn] || templates.defaults;
+ return fn.call(templates, pictures);
+ },
+
+ /**
+ * 2-1
+ *
+ * □
+ * □
+ *
+ * @param pictures
+ * @returns {string}
+ */
+ group2Layout1: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1)
+ ]);
+ },
+
+ /**
+ * 2-2
+ *
+ * □ □
+ *
+ * @param pictures
+ */
+ group2Layout2: function (pictures) {
+ return this.getHTML(pictures);
+ },
+
+ /**
+ * 3-1
+ *
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group3Layout1: function (pictures) {
+ return this.getHTML(pictures);
+ },
+
+ /**
+ * 3-2
+ *
+ * □
+ * □ □
+ *
+ * @param pictures
+ */
+ group3Layout2: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1)
+ ]);
+ },
+
+ /**
+ * 3-3
+ *
+ * □ □
+ * □
+ *
+ * @param pictures
+ */
+ group3Layout3: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2)
+ ]);
+ },
+
+ /**
+ * 4-1
+ *
+ * □
+ * □ □
+ * □
+ *
+ * @param pictures
+ */
+ group4Layout1: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 3),
+ pictures.slice(3)
+ ]);
+ },
+
+ /**
+ * 4-2
+ *
+ * □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group4Layout2: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1)
+ ]);
+ },
+
+ /**
+ * 4-3
+ *
+ * □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group4Layout3: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2)
+ ]);
+ },
+
+ /**
+ * 4-4
+ *
+ * □ □ □
+ * □
+ *
+ * @param pictures
+ */
+ group4Layout4: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3)
+ ]);
+ },
+
+ /**
+ * 5-1
+ *
+ * □
+ * □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group5Layout1: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 3),
+ pictures.slice(3)
+ ]);
+ },
+
+ /**
+ * 5-2
+ *
+ * □ □
+ * □
+ * □ □
+ *
+ * @param pictures
+ */
+ group5Layout2: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 3),
+ pictures.slice(3)
+ ]);
+ },
+
+ /**
+ * 5-3
+ *
+ * □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group5Layout3: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2)
+ ]);
+ },
+
+ /**
+ * 5-4
+ *
+ * □ □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group5Layout4: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3)
+ ]);
+ },
+
+ /**
+ * 6-1
+ *
+ * □
+ * □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group6Layout1: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 3),
+ pictures.slice(3)
+ ]);
+ },
+
+ /**
+ * 6-2
+ *
+ * □
+ * □ □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group6Layout2: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 4),
+ pictures.slice(4)
+ ]);
+ },
+
+ /**
+ * 6-3
+ *
+ * □ □
+ * □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group6Layout3: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 3),
+ pictures.slice(3)
+ ]);
+ },
+
+ /**
+ * 6-4
+ *
+ * □ □
+ * □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group6Layout4: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 4),
+ pictures.slice(4)
+ ]);
+ },
+
+ /**
+ * 6-5
+ *
+ * □ □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group6Layout5: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3)
+ ]);
+ },
+
+ /**
+ * 7-1
+ *
+ * □
+ * □ □
+ * □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group7Layout1: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 3),
+ pictures.slice(3, 5),
+ pictures.slice(5)
+ ]);
+ },
+
+ /**
+ * 7-2
+ *
+ * □
+ * □ □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group7Layout2: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 4),
+ pictures.slice(4)
+ ]);
+ },
+
+ /**
+ * 7-3
+ *
+ * □ □
+ * □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group7Layout3: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 4),
+ pictures.slice(4)
+ ]);
+ },
+
+ /**
+ * 7-4
+ *
+ * □ □
+ * □ □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group7Layout4: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 5),
+ pictures.slice(5)
+ ]);
+ },
+
+ /**
+ * 7-5
+ *
+ * □ □ □
+ * □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group7Layout5: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3, 5),
+ pictures.slice(5)
+ ]);
+ },
+
+ /**
+ * 8-1
+ *
+ * □
+ * □ □
+ * □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group8Layout1: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 3),
+ pictures.slice(3, 5),
+ pictures.slice(5)
+ ]);
+ },
+
+ /**
+ * 8-2
+ *
+ * □
+ * □ □
+ * □ □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group8Layout2: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 3),
+ pictures.slice(3, 6),
+ pictures.slice(6)
+ ]);
+ },
+
+ /**
+ * 8-3
+ *
+ * □
+ * □ □ □
+ * □ □
+ * □ □
+ * @param pictures
+ */
+ group8Layout3: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 4),
+ pictures.slice(4, 6),
+ pictures.slice(6)
+ ]);
+ },
+
+ /**
+ * 8-4
+ *
+ * □ □
+ * □ □
+ * □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group8Layout4: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 4),
+ pictures.slice(4, 6),
+ pictures.slice(6)
+ ]);
+ },
+
+ /**
+ * 8-5
+ *
+ * □ □
+ * □ □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group8Layout5: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 5),
+ pictures.slice(5)
+ ]);
+ },
+
+ /**
+ * 8-6
+ *
+ * □ □ □
+ * □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group8Layout6: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3, 5),
+ pictures.slice(5)
+ ]);
+ },
+
+ /**
+ * 8-7
+ *
+ * □ □ □
+ * □ □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group8Layout7: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3, 6),
+ pictures.slice(6)
+ ]);
+ },
+
+ /**
+ * 9-1
+ *
+ * □
+ * □ □
+ * □ □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group9Layout1: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 3),
+ pictures.slice(3, 6),
+ pictures.slice(6)
+ ]);
+ },
+
+ /**
+ * 9-2
+ *
+ * □
+ * □ □ □
+ * □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group9Layout2: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 4),
+ pictures.slice(4, 6),
+ pictures.slice(6)
+ ]);
+ },
+
+ /**
+ * 9-3
+ *
+ * □ □
+ * □ □
+ * □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group9Layout3: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 4),
+ pictures.slice(4, 6),
+ pictures.slice(6)
+ ]);
+ },
+
+ /**
+ * 9-4
+ *
+ * □ □
+ * □ □
+ * □ □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group9Layout4: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 4),
+ pictures.slice(4, 7),
+ pictures.slice(7)
+ ]);
+ },
+
+ /**
+ * 9-5
+ *
+ * □ □
+ * □ □ □
+ * □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group9Layout5: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 5),
+ pictures.slice(5, 7),
+ pictures.slice(7)
+ ]);
+ },
+
+ /**
+ * 9-6
+ *
+ * □ □ □
+ * □ □
+ * □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group9Layout6: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3, 5),
+ pictures.slice(5, 7),
+ pictures.slice(7)
+ ]);
+ },
+
+ /**
+ * 9-7
+ *
+ * □ □ □
+ * □ □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group9Layout7: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3, 6),
+ pictures.slice(6)
+ ]);
+ },
+
+ /**
+ * 10-1
+ *
+ * □
+ * □ □ □
+ * □ □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group10Layout1: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 1),
+ pictures.slice(1, 4),
+ pictures.slice(4, 7),
+ pictures.slice(7)
+ ]);
+ },
+
+ /**
+ * 10-2
+ *
+ * □ □
+ * □ □
+ * □ □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group10Layout2: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 4),
+ pictures.slice(4, 7),
+ pictures.slice(7)
+ ]);
+ },
+
+ /**
+ * 10-3
+ *
+ * □ □
+ * □ □ □
+ * □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group10Layout3: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 5),
+ pictures.slice(5, 7),
+ pictures.slice(7)
+ ]);
+ },
+
+ /**
+ * 10-4
+ *
+ * □ □
+ * □ □ □
+ * □ □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group10Layout4: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 2),
+ pictures.slice(2, 5),
+ pictures.slice(5, 8),
+ pictures.slice(8)
+ ]);
+ },
+
+ /**
+ * 10-5
+ *
+ * □ □ □
+ * □ □
+ * □ □
+ * □ □ □
+ *
+ * @param pictures
+ */
+ group10Layout5: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3, 5),
+ pictures.slice(5, 7),
+ pictures.slice(7)
+ ]);
+ },
+
+ /**
+ * 10-6
+ *
+ * □ □ □
+ * □ □
+ * □ □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group10Layout6: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3, 5),
+ pictures.slice(5, 8),
+ pictures.slice(8)
+ ]);
+ },
+
+ /**
+ * 10-7
+ *
+ * □ □ □
+ * □ □ □
+ * □ □
+ * □ □
+ *
+ * @param pictures
+ */
+ group10Layout7: function (pictures) {
+ return this.getHTML([
+ pictures.slice(0, 3),
+ pictures.slice(3, 6),
+ pictures.slice(6, 8),
+ pictures.slice(8)
+ ]);
+ },
+
+ /**
+ * Defaults Layout
+ *
+ * □ □ □
+ * □ □ □
+ * ...
+ *
+ * @param pictures
+ */
+ defaults: function (pictures) {
+ var ROW_SIZE = 3;
+ var rows = pictures.length / ROW_SIZE + 1;
+ var pictureArr = [];
+
+ for (var i = 0; i < rows; i++) {
+ pictureArr.push(pictures.slice(i * ROW_SIZE, (i + 1) * ROW_SIZE));
+ }
+
+ return this.getHTML(pictureArr);
+ },
+
+ getHTML: function (rows) {
+ var rowHTML = '';
+
+ for (var i = 0; i < rows.length; i++) {
+ rowHTML += this.getRowHTML(rows[i]);
+ }
+
+ return '' + rowHTML + '';
+ },
+
+ getRowHTML: function (pictures) {
+ return (
+ '' +
+ this.getColumnHTML(pictures) +
+ ''
+ );
+ },
+
+ getColumnHTML: function (pictures) {
+ var columns = [];
+ var columnWidth = 100 / pictures.length;
+ var columnStyle = ' style="width: ' + columnWidth + '%;"';
+
+ for (var i = 0; i < pictures.length; i++) {
+ columns.push('' + pictures[i] + '');
+ }
+ return columns.join('');
+ }
+};
+
+hexo.extend.tag.register('grouppicture', groupPicture, {ends: true});
+hexo.extend.tag.register('gp', groupPicture, {ends: true});
diff --git a/themes/Next/scripts/tags/label.js b/themes/Next/scripts/tags/label.js
new file mode 100644
index 0000000..57e54dd
--- /dev/null
+++ b/themes/Next/scripts/tags/label.js
@@ -0,0 +1,23 @@
+/**
+ * label.js | global hexo script.
+ *
+ * Usage:
+ *
+ * {% label [class]@Text %}
+ *
+ * [class] : default | primary | success | info | warning | danger.
+ * If not defined, default class will be selected.
+ */
+
+function postLabel (args) {
+ args = args.join(' ').split('@');
+ var classes = args[0] || 'default';
+ var text = args[1] || '';
+
+ classes = classes.trim();
+ !text && hexo.log.warn('Label text must be defined!');
+
+ return '' + text + '';
+}
+
+hexo.extend.tag.register('label', postLabel, { ends: false });
diff --git a/themes/Next/scripts/tags/lazy-image.js b/themes/Next/scripts/tags/lazy-image.js
new file mode 100644
index 0000000..650d57a
--- /dev/null
+++ b/themes/Next/scripts/tags/lazy-image.js
@@ -0,0 +1,26 @@
+/* global hexo */
+// Usage: {% lazyimage /path/to/image, alt, title %}
+// Alias: {% li /path/to/image, alt, title %}
+
+function lazyImage(args) {
+ args = args.join(' ').split(',');
+ var src = args[0];
+ var alt = args[1] || '';
+ var title = args[2] || '';
+
+ if (!src) {
+ hexo.log.warn('Image src can NOT be empty');
+ }
+ alt = alt.trim();
+ title = title.trim();
+
+ var image = ['
0 && image.push('alt="' + alt + '"');
+ title.length > 0 && image.push('title="' + title + '"');
+ image.push('/>');
+
+ return image.join(' ');
+}
+
+hexo.extend.tag.register('lazyimage', lazyImage);
+hexo.extend.tag.register('li', lazyImage);
diff --git a/themes/Next/scripts/tags/note.js b/themes/Next/scripts/tags/note.js
new file mode 100644
index 0000000..a5690a3
--- /dev/null
+++ b/themes/Next/scripts/tags/note.js
@@ -0,0 +1,20 @@
+/**
+ * note.js | global hexo script.
+ *
+ * ATTENTION! No need to write this tag in 1 line if u don't want see probally bugs.
+ *
+ * Usage:
+ *
+ * {% note [class] %}
+ * Any content (support inline tags too).
+ * {% endnote %}
+ *
+ * [class] : default | primary | success | info | warning | danger.
+ * May be not defined.
+ */
+
+function bscallOut (args, content) {
+ return '' + hexo.render.renderSync({text: content, engine: 'markdown'}).trim() + '';
+}
+
+hexo.extend.tag.register('note', bscallOut, {ends: true});
diff --git a/themes/Next/scripts/tags/tabs.js b/themes/Next/scripts/tags/tabs.js
new file mode 100644
index 0000000..9af8f68
--- /dev/null
+++ b/themes/Next/scripts/tags/tabs.js
@@ -0,0 +1,78 @@
+/**
+ * tabs.js | global hexo script.
+ *
+ * Usage:
+ *
+ * {% tabs [Unique name], [index] %}
+ *
+ * Any content (support inline tags too).
+ *
+ * {% endtabs %}
+ *
+ * [Unique name] : Unique name of tabs block tag without comma.
+ * Will be used in #id's as prefix for each tab with their index numbers.
+ * If there are whitespaces in name, for generate #id all whitespaces will replaced by dashes.
+ * Only for current url of post/page must be unique!
+ * [index] : Index number of active tab.
+ * If not defined, first tab (1) will be selected.
+ * If index is -1, no tab will be selected. It's will be something like spoiler.
+ * May be not defined.
+ * [Tab caption] : Caption of current tab.
+ * If not caption specified, unique name with tab index suffix will be used as caption of tab.
+ * If not caption specified, but specified icon, caption will empty.
+ * May be not defined.
+ * [icon] : Font awesome icon.
+ * May be not defined.
+ */
+
+'use strict';
+
+ function postTabs (args, content) {
+ var tabBlock = /\n([\w\W\s\S]*?)/g;
+
+ var args = args.join(' ').split(',');
+ var tabName = args[0];
+ var tabActive = args[1] || '';
+
+ var matches = [];
+ var match;
+ var tabId = 0;
+ var tabNav = '';
+ var tabContent = '';
+
+ !tabName && hexo.log.warn('Tabs block must have unique name!');
+
+ while (match = tabBlock.exec(content)) {
+ matches.push(match[1]);
+ matches.push(match[2]);
+ }
+
+ for (var i = 0; i < matches.length; i += 2) {
+ var tabParameters = matches[i].split('@');
+ var postContent = matches[i + 1];
+ var tabCaption = tabParameters[0] || '';
+ var tabIcon = tabParameters[1] || '';
+ var tabHref = '';
+
+ postContent = hexo.render.renderSync({text: postContent, engine: 'markdown'});
+
+ tabId += 1;
+ tabHref = (tabName + ' ' + tabId).toLowerCase().split(' ').join('-');
+
+ ((tabCaption.length === 0) && (tabIcon.length === 0)) && (tabCaption = tabName + ' ' + tabId);
+
+ var isOnlyicon = (tabIcon.length > 0 && tabCaption.length === 0) ? 'style="text-align: center;' : '';
+ tabIcon.length > 0 && (tabIcon = '');
+
+ var isActive = ((tabActive.length > 0 && tabActive == tabId) || (tabActive.length === 0 && tabId == 1)) ? ' active' : '';
+ tabNav += '' + tabIcon + tabCaption + ' ';
+ tabContent += '' + postContent + '';
+ }
+
+ tabNav = '';
+ tabContent = '' + tabContent + '';
+
+ return '' + tabNav + tabContent + '';
+ }
+
+ hexo.extend.tag.register('tabs', postTabs, {ends: true});
diff --git a/themes/Next/source/about/index.md b/themes/Next/source/about/index.md
new file mode 100644
index 0000000..a50fd1b
--- /dev/null
+++ b/themes/Next/source/about/index.md
@@ -0,0 +1,12 @@
+---
+title: about
+date: 2017-10-06 12:11:28
+---
+## 关于我
+
+一个还在学习中的FISH,欢迎分享。
+
+
+
+QQ:941510759
+Email:941510759@qq.com
diff --git a/themes/Next/source/categories/index.md b/themes/Next/source/categories/index.md
new file mode 100644
index 0000000..9f1bcd2
--- /dev/null
+++ b/themes/Next/source/categories/index.md
@@ -0,0 +1,5 @@
+---
+title: categories
+date: 2017-10-06 12:04:39
+type: "categories"
+---
diff --git a/themes/Next/source/css/_common/components/back-to-top-sidebar.styl b/themes/Next/source/css/_common/components/back-to-top-sidebar.styl
new file mode 100644
index 0000000..d23d35d
--- /dev/null
+++ b/themes/Next/source/css/_common/components/back-to-top-sidebar.styl
@@ -0,0 +1,25 @@
+.back-to-top {
+ display: none;
+ margin: 20px -10px -20px;
+ background: $body-bg-color;
+ font-size: $b2t-font-size;
+ opacity: $b2t-opacity;
+ cursor: pointer;
+ text-align: center;
+ -webkit-transform: translateZ(0);
+ the-transition();
+ &:hover { opacity: 0.8; }
+
+ +tablet() {
+ fixbutton() if hexo-config('sidebar.onmobile');
+ hide() if not hexo-config('sidebar.onmobile');
+ }
+ +mobile() {
+ fixbutton() if hexo-config('sidebar.onmobile');
+ hide() if not hexo-config('sidebar.onmobile');
+ }
+
+ &.back-to-top-on {
+ display: block;
+ }
+}
diff --git a/themes/Next/source/css/_common/components/back-to-top.styl b/themes/Next/source/css/_common/components/back-to-top.styl
new file mode 100644
index 0000000..1ae463a
--- /dev/null
+++ b/themes/Next/source/css/_common/components/back-to-top.styl
@@ -0,0 +1,31 @@
+.back-to-top {
+ box-sizing: border-box;
+ position: fixed;
+ bottom: $b2t-position-bottom;
+ right: $b2t-position-right;
+ z-index: $zindex-5;
+ padding: 0 6px;
+ width: hexo-config('sidebar.scrollpercent') ? initial : 24px;
+ background: $b2t-bg-color;
+ font-size: $b2t-font-size;
+ opacity: $b2t-opacity;
+ color: $b2t-color;
+ cursor: pointer;
+ text-align: center;
+ -webkit-transform: translateZ(0);
+ transition-property: bottom;
+ the-transition();
+
+ +tablet() {
+ fixbutton() if hexo-config('sidebar.onmobile');
+ hide() if not hexo-config('sidebar.onmobile');
+ }
+ +mobile() {
+ fixbutton() if hexo-config('sidebar.onmobile');
+ hide() if not hexo-config('sidebar.onmobile');
+ }
+
+ &.back-to-top-on {
+ bottom: $b2t-position-bottom-on;
+ }
+}
diff --git a/themes/Next/source/css/_common/components/buttons.styl b/themes/Next/source/css/_common/components/buttons.styl
new file mode 100644
index 0000000..7712646
--- /dev/null
+++ b/themes/Next/source/css/_common/components/buttons.styl
@@ -0,0 +1,38 @@
+.btn {
+ display: inline-block;
+ padding: 0 20px;
+ font-size: $btn-default-font-size;
+ color: $btn-default-color;
+ background: $btn-default-bg;
+ border: $btn-default-border-width solid $btn-default-border-color;
+ text-decoration: none;
+ border-radius: $btn-default-radius;
+ transition-property: background-color;
+ the-transition();
+ line-height: 2;
+
+ &:hover {
+ border-color: $btn-default-hover-border-color;
+ color: $btn-default-hover-color;
+ background: $btn-default-hover-bg;
+ }
+
+ +.btn {
+ margin: 0 0 8px 8px;
+ }
+
+ .fa-fw {
+ width: (18em / 14);
+ text-align: left;
+ }
+}
+
+.btn-bar {
+ display: block;
+ width: 22px;
+ height: 2px;
+ background: $text-color;
+ border-radius: 1px;
+
+ &+.btn-bar { margin-top: 4px; }
+}
diff --git a/themes/Next/source/css/_common/components/comments.styl b/themes/Next/source/css/_common/components/comments.styl
new file mode 100644
index 0000000..bf3edb9
--- /dev/null
+++ b/themes/Next/source/css/_common/components/comments.styl
@@ -0,0 +1 @@
+.comments { margin: 60px 20px 0; }
diff --git a/themes/Next/source/css/_common/components/components.styl b/themes/Next/source/css/_common/components/components.styl
new file mode 100644
index 0000000..fe4a160
--- /dev/null
+++ b/themes/Next/source/css/_common/components/components.styl
@@ -0,0 +1,16 @@
+@import "highlight";
+@import "tags";
+
+@import "buttons";
+@import "pagination";
+@import "comments";
+@import "tag-cloud";
+@import hexo-config('sidebar.b2t') ? "back-to-top-sidebar" : "back-to-top";
+
+@import "header";
+@import "post";
+@import "sidebar";
+@import "footer";
+@import "third-party";
+
+@import "pages";
diff --git a/themes/Next/source/css/_common/components/footer/footer.styl b/themes/Next/source/css/_common/components/footer/footer.styl
new file mode 100644
index 0000000..af7ce8c
--- /dev/null
+++ b/themes/Next/source/css/_common/components/footer/footer.styl
@@ -0,0 +1,30 @@
+.footer {
+ font-size: 14px;
+ color: $grey-dark;
+
+ img { border: none; }
+}
+
+.footer-inner { text-align: center; }
+
+.with-love {
+ display: inline-block;
+ margin: 0 5px;
+}
+
+.powered-by,
+.theme-info { display: inline-block; }
+
+.cc-license {
+ margin-top: 10px;
+ text-align: center;
+
+ .cc-opacity {
+ opacity: 0.7;
+ border-bottom: none;
+
+ &:hover { opacity: 0.9; }
+ }
+
+ img { display: inline-block; }
+}
diff --git a/themes/Next/source/css/_common/components/header/header.styl b/themes/Next/source/css/_common/components/header/header.styl
new file mode 100644
index 0000000..01f7f8a
--- /dev/null
+++ b/themes/Next/source/css/_common/components/header/header.styl
@@ -0,0 +1,9 @@
+.header { background: $head-bg; }
+
+.header-inner { position: relative; }
+
+
+@import "headerband";
+@import "site-meta";
+@import "site-nav";
+@import "menu";
diff --git a/themes/Next/source/css/_common/components/header/headerband.styl b/themes/Next/source/css/_common/components/header/headerband.styl
new file mode 100644
index 0000000..382dbd9
--- /dev/null
+++ b/themes/Next/source/css/_common/components/header/headerband.styl
@@ -0,0 +1,4 @@
+.headband {
+ height: $headband-height;
+ background: $headband-bg;
+}
diff --git a/themes/Next/source/css/_common/components/header/menu.styl b/themes/Next/source/css/_common/components/header/menu.styl
new file mode 100644
index 0000000..d2b0f05
--- /dev/null
+++ b/themes/Next/source/css/_common/components/header/menu.styl
@@ -0,0 +1,32 @@
+// Menu
+// --------------------------------------------------
+.menu {
+ margin-top: 20px;
+ padding-left: 0;
+ text-align: center;
+}
+
+.menu .menu-item {
+ display: inline-block;
+ margin: 0 10px;
+ list-style: none;
+
+ @media screen and (max-width: 767px) {
+ margin-top: 10px;
+ }
+
+ a {
+ display: block;
+ font-size: 13px;
+ line-height: inherit;
+ border-bottom: 1px solid $menu-link-border;
+ transition-property: border-color;
+ the-transition();
+
+ &:hover { border-bottom-color: $menu-link-hover-border; }
+ }
+
+ .fa { margin-right: 5px; }
+}
+
+.use-motion .menu-item { opacity: 0; }
diff --git a/themes/Next/source/css/_common/components/header/site-meta.styl b/themes/Next/source/css/_common/components/header/site-meta.styl
new file mode 100644
index 0000000..efe31ec
--- /dev/null
+++ b/themes/Next/source/css/_common/components/header/site-meta.styl
@@ -0,0 +1,48 @@
+.site-meta {
+ margin: 0;
+ text-align: $site-meta-text-align;
+
+ +mobile() { text-align: center; }
+}
+
+.brand {
+ position: relative;
+ display: inline-block;
+ padding: 0 40px;
+ color: $brand-color;
+ background: $brand-bg;
+ border-bottom: none;
+ &:hover { color: $brand-hover-color; }
+}
+
+.logo {
+ display: inline-block;
+ margin-right: 5px;
+ line-height: 36px;
+ vertical-align: top;
+}
+
+.site-title {
+ display: inline-block;
+ vertical-align: top;
+ line-height: 36px;
+ font-size: $logo-font-size;
+ font-weight: normal;
+ font-family: $font-family-logo;
+}
+
+.site-subtitle {
+ margin-top: 10px;
+ font-size: $subtitle-font-size;
+ color: $subtitle-color;
+}
+
+.use-motion {
+ .brand { opacity: 0; }
+
+ .logo, .site-title, .site-subtitle {
+ opacity: 0;
+ position: relative;
+ top: -10px;
+ }
+}
diff --git a/themes/Next/source/css/_common/components/header/site-nav.styl b/themes/Next/source/css/_common/components/header/site-nav.styl
new file mode 100644
index 0000000..c6446e7
--- /dev/null
+++ b/themes/Next/source/css/_common/components/header/site-nav.styl
@@ -0,0 +1,28 @@
+.site-nav-toggle {
+ display: none;
+ position: absolute;
+ top: 10px;
+ left: 10px;
+ +mobile() {
+ display: block;
+ }
+
+ button {
+ margin-top: 2px;
+ padding: 9px 10px;
+ background: transparent;
+ border: none;
+ }
+}
+
+.site-nav {
+ +mobile() {
+ display: none;
+ margin: 0 -10px;
+ padding: 0 10px;
+ clear: both;
+ border-top: 1px solid $gray-lighter;
+ }
+ +tablet() { display: block !important; }
+ +desktop() { display: block !important; }
+}
diff --git a/themes/Next/source/css/_common/components/highlight/diff.styl b/themes/Next/source/css/_common/components/highlight/diff.styl
new file mode 100644
index 0000000..f779499
--- /dev/null
+++ b/themes/Next/source/css/_common/components/highlight/diff.styl
@@ -0,0 +1,8 @@
+$highlight_theme = hexo-config("highlight_theme")
+
+if $highlight_theme == "normal"
+ $highlight-deletion = #fdd
+ $highlight-addition = #dfd
+else
+ $highlight-deletion = #008000
+ $highlight-addition = #800000
diff --git a/themes/Next/source/css/_common/components/highlight/highlight.styl b/themes/Next/source/css/_common/components/highlight/highlight.styl
new file mode 100644
index 0000000..6b540fd
--- /dev/null
+++ b/themes/Next/source/css/_common/components/highlight/highlight.styl
@@ -0,0 +1,177 @@
+// https://github.com/chriskempson/tomorrow-theme
+
+@require "theme"
+@require "diff"
+
+// Placeholder: $code-block
+$code-block {
+ overflow: auto;
+ margin: 20px 0;
+ padding: 0;
+ font-size $code-font-size;
+ color: $highlight-foreground;
+ background: $highlight-background;
+ line-height: $line-height-code-block;
+}
+
+pre, code { font-family: $code-font-family; }
+
+code {
+ padding: 2px 4px;
+ word-wrap: break-word;
+ color: $code-foreground;
+ background: $code-background;
+ border-radius: $code-border-radius;
+ font-size $code-font-size;
+}
+
+pre {
+ @extend $code-block;
+ padding: 10px;
+
+ code {
+ padding: 0;
+ color: $highlight-foreground;
+ background: none;
+ text-shadow: none;
+ }
+}
+
+.highlight {
+ @extend $code-block;
+ border-radius: 1px
+
+ pre {
+ border: none;
+ margin: 0;
+ padding: 10px 0;
+ }
+
+ table {
+ margin: 0;
+ width: auto;
+ border: none;
+ }
+
+ td {
+ border: none;
+ padding: 0;
+ }
+
+ figcaption {
+ clearfix();
+ font-size: 1em;
+ color: $highlight-foreground;
+ line-height: 1em;
+ margin-bottom: 1em;
+
+ a {
+ float: right;
+ color: $highlight-foreground;
+
+ &:hover { border-bottom-color: $highlight-foreground; }
+ }
+ }
+
+ .gutter pre {
+ padding-left: 10px
+ padding-right: 10px
+ color: $highlight-gutter.color
+ text-align: right
+ background-color: $highlight-gutter.bg-color
+ }
+
+ .code pre {
+ width: 100%
+ padding-left: 10px
+ padding-right: 10px
+ background-color: $highlight-background
+ }
+
+ .line { height: 20px; }
+}
+
+
+.gutter {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.gist table {
+ width: auto;
+
+ td { border: none; }
+}
+
+// For diff highlight
+pre .deletion { background: $highlight-deletion; }
+pre .addition { background: $highlight-addition; }
+pre .meta { color: $highlight-purple; }
+
+pre {
+
+ .comment { color: $highlight-comment; }
+
+ .variable
+ .attribute
+ .tag
+ .regexp
+ .ruby .constant
+ .xml .tag .title
+ .xml .pi
+ .xml .doctype
+ .html .doctype
+ .css .id
+ .css .class
+ .css .pseudo {
+ color: $highlight-red;
+ }
+
+ .number
+ .preprocessor
+ .built_in
+ .literal
+ .params
+ .constant
+ .command {
+ color: $highlight-orange;
+ }
+
+ .ruby .class .title
+ .css .rules .attribute
+ .string
+ .value
+ .inheritance
+ .header
+ .ruby .symbol
+ .xml .cdata
+ .special
+ .number
+ .formula {
+ color: $highlight-green;
+ }
+
+ .title
+ .css .hexcolor {
+ color: $highlight-aqua;
+ }
+
+ .function
+ .python .decorator
+ .python .title
+ .ruby .function .title
+ .ruby .title .keyword
+ .perl .sub
+ .javascript .title
+ .coffeescript .title {
+ color: $highlight-blue;
+ }
+
+ .keyword
+ .javascript .function {
+ color: $highlight-purple;
+ }
+
+}
diff --git a/themes/Next/source/css/_common/components/highlight/theme.styl b/themes/Next/source/css/_common/components/highlight/theme.styl
new file mode 100644
index 0000000..ff1f4be
--- /dev/null
+++ b/themes/Next/source/css/_common/components/highlight/theme.styl
@@ -0,0 +1,92 @@
+$highlight_theme = hexo-config("highlight_theme")
+
+
+if $highlight_theme == "normal"
+ $highlight-background = #f7f7f7
+ $highlight-current-line = #efefef
+ $highlight-selection = #d6d6d6
+ $highlight-foreground = #4d4d4c
+ $highlight-comment = #8e908c
+ $highlight-red = #c82829
+ $highlight-orange = #f5871f
+ $highlight-yellow = #eab700
+ $highlight-green = #718c00
+ $highlight-aqua = #3e999f
+ $highlight-blue = #4271ae
+ $highlight-purple = #8959a8
+ $highlight-gutter = {
+ color: #869194,
+ bg-color: #eff2f3
+ }
+
+if $highlight_theme == "night"
+ $highlight-background = #1d1f21
+ $highlight-current-line = #282a2e
+ $highlight-selection = #373b41
+ $highlight-foreground = #c5c8c6
+ $highlight-comment = #969896
+ $highlight-red = #cc6666
+ $highlight-orange = #de935f
+ $highlight-yellow = #f0c674
+ $highlight-green = #b5bd68
+ $highlight-aqua = #8abeb7
+ $highlight-blue = #81a2be
+ $highlight-purple = #b294bb
+ $highlight-gutter = {
+ color: lighten($highlight-background, 50%),
+ bg-color: darken($highlight-background, 100%)
+ }
+
+if $highlight_theme == "night eighties"
+ $highlight-background = #2d2d2d
+ $highlight-current-line = #393939
+ $highlight-selection = #515151
+ $highlight-foreground = #cccccc
+ $highlight-comment = #999999
+ $highlight-red = #f2777a
+ $highlight-orange = #f99157
+ $highlight-yellow = #ffcc66
+ $highlight-green = #99cc99
+ $highlight-aqua = #66cccc
+ $highlight-blue = #6699cc
+ $highlight-purple = #cc99cc
+ $highlight-gutter = {
+ color: $highlight-comment,
+ bg-color: darken($highlight-background, 40%)
+ }
+
+if $highlight_theme == "night blue"
+ $highlight-background = #002451
+ $highlight-current-line = #00346e
+ $highlight-selection = #003f8e
+ $highlight-foreground = #ffffff
+ $highlight-comment = #7285b7
+ $highlight-red = #ff9da4
+ $highlight-orange = #ffc58f
+ $highlight-yellow = #ffeead
+ $highlight-green = #d1f1a9
+ $highlight-aqua = #99ffff
+ $highlight-blue = #bbdaff
+ $highlight-purple = #ebbbff
+ $highlight-gutter = {
+ color: $highlight-comment,
+ bg-color: darken($highlight-background, 60%)
+ }
+
+if $highlight_theme == "night bright"
+ $highlight-background = #000000
+ $highlight-current-line = #2a2a2a
+ $highlight-selection = #424242
+ $highlight-foreground = #eaeaea
+ $highlight-comment = #969896
+ $highlight-red = #d54e53
+ $highlight-orange = #e78c45
+ $highlight-yellow = #e7c547
+ $highlight-green = #b9ca4a
+ $highlight-aqua = #70c0b1
+ $highlight-blue = #7aa6da
+ $highlight-purple = #c397d8
+ $highlight-gutter = {
+ color: lighten($highlight-background, 40%),
+ bg-color: lighten($highlight-background, 16%)
+ }
diff --git a/themes/Next/source/css/_common/components/pages/archive.styl b/themes/Next/source/css/_common/components/pages/archive.styl
new file mode 100644
index 0000000..8a1363d
--- /dev/null
+++ b/themes/Next/source/css/_common/components/pages/archive.styl
@@ -0,0 +1,29 @@
+.page-archive {
+
+ .archive-page-counter {
+ position: relative;
+ top: 3px;
+ left: 20px;
+
+ +mobile() {
+ top: 5px;
+ }
+ }
+
+ .posts-collapse {
+
+ .archive-move-on {
+ position: absolute;
+ top: 11px;
+ left: 0;
+ margin-left: -6px;
+ width: 10px;
+ height: 10px;
+ opacity: 0.5;
+ background: $black-light;
+ border: 1px solid white;
+
+ circle();
+ }
+ }
+}
diff --git a/themes/Next/source/css/_common/components/pages/categories.styl b/themes/Next/source/css/_common/components/pages/categories.styl
new file mode 100644
index 0000000..db3bb10
--- /dev/null
+++ b/themes/Next/source/css/_common/components/pages/categories.styl
@@ -0,0 +1,27 @@
+.category-all-page {
+ .category-all-title { text-align: center; }
+
+ .category-all { margin-top: 20px; }
+
+ .category-list {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ }
+
+ .category-list-item { margin: 5px 10px; }
+
+ .category-list-count {
+ color: $grey;
+ &:before {
+ display: inline;
+ content: " ("
+ }
+ &:after {
+ display: inline;
+ content: ") "
+ }
+ }
+
+ .category-list-child { padding-left: 10px; }
+}
diff --git a/themes/Next/source/css/_common/components/pages/pages.styl b/themes/Next/source/css/_common/components/pages/pages.styl
new file mode 100644
index 0000000..cb14d04
--- /dev/null
+++ b/themes/Next/source/css/_common/components/pages/pages.styl
@@ -0,0 +1,6 @@
+// Page specific styles
+
+@import "archive";
+@import "categories";
+@import "schedule";
+@import "post-detail";
diff --git a/themes/Next/source/css/_common/components/pages/post-detail.styl b/themes/Next/source/css/_common/components/pages/post-detail.styl
new file mode 100644
index 0000000..3f26afd
--- /dev/null
+++ b/themes/Next/source/css/_common/components/pages/post-detail.styl
@@ -0,0 +1,6 @@
+.page-post-detail {
+
+ .sidebar-toggle-line { background: $sidebar-highlight; }
+
+ .comments { overflow: hidden; }
+}
diff --git a/themes/Next/source/css/_common/components/pages/schedule.styl b/themes/Next/source/css/_common/components/pages/schedule.styl
new file mode 100644
index 0000000..18ec933
--- /dev/null
+++ b/themes/Next/source/css/_common/components/pages/schedule.styl
@@ -0,0 +1,101 @@
+@keyframes dot-flash {
+ from {opacity: 1; transform:scale(1.1);}
+ to {opacity: 0; transform:scale(1);}
+}
+
+#schedule {
+ ul#event-list {
+ padding-left: 30px
+ hr {
+ margin: 20px 0 45px 0!important
+ background: #222
+ &:after {
+ display: inline-block
+ content: 'NOW'
+ background: #222
+ color: #FFF
+ font-weight:bold
+ text-align: right
+ padding: 0 5px
+ }
+ }
+ li.event {
+ margin: 20px 0px
+ background: #F9F9F9
+ padding-left: 10px
+ min-height: 40px
+ h2.event-summary {
+ margin: 0
+ padding-bottom: 3px
+ &:before {
+ display: inline-block
+ font-family: FontAwesome
+ font-size: 8px
+ content: '\f111'
+ vertical-align: middle
+ margin-right: 25px
+ color: #bbb
+ }
+ }
+ span.event-relative-time {
+ display: inline-block
+ font-size: 12px
+ font-weight: 400
+ padding-left: 12px
+ color: #bbb
+ }
+ span.event-details {
+ display: block
+ color: #bbb
+ margin-left: 56px
+ padding-top: 3px
+ padding-bottom: 6px
+ text-indent: -24px
+ line-height: 18px
+ &:before {
+ text-indent: 0
+ display: inline-block
+ width: 14px
+ font-family: FontAwesome
+ text-align: center
+ margin-right: 9px
+ color: #bbb
+ }
+ &.event-location:before {
+ content: '\f041'
+ }
+ &.event-duration:before {
+ content: '\f017'
+ }
+ }
+ }
+ li.event-past {
+ background: #FCFCFC
+ & > * {
+ opacity: .6
+ }
+ h2.event-summary {
+ color: #bbb
+ &:before {
+ color: #DFDFDF
+ }
+ }
+ }
+ li.event-now {
+ background: #222
+ color: #FFF
+ padding: 15px 0 15px 10px
+ h2.event-summary {
+ &:before {
+ transform: scale(1.2)
+ color: #FFF
+ animation: dot-flash 1s alternate infinite ease-in-out;
+ }
+ }
+ * {
+ color: #FFF!important
+ }
+ }
+ }
+}
+
diff --git a/themes/Next/source/css/_common/components/pagination.styl b/themes/Next/source/css/_common/components/pagination.styl
new file mode 100644
index 0000000..a054ef0
--- /dev/null
+++ b/themes/Next/source/css/_common/components/pagination.styl
@@ -0,0 +1,56 @@
+.pagination {
+ margin: 120px 0 40px;
+ text-align: center;
+ border-top: 1px solid $pagination-border;
+}
+
+.page-number-basic {
+ display: inline-block;
+ position: relative;
+ top: -1px;
+ margin: 0 10px;
+ padding: 0 11px;
+
+ +mobile() { margin: 0 5px; }
+}
+
+.pagination {
+ .prev, .next, .page-number {
+ @extend .page-number-basic;
+ border-bottom: 0;
+ border-top: 1px solid $pagination-link-border;
+ transition-property: border-color;
+ the-transition();
+
+ &:hover { border-top-color: $pagination-link-hover-border; }
+ }
+
+ .space {
+ @extend .page-number-basic;
+ padding: 0;
+ margin: 0;
+ }
+
+ .prev { margin-left: 0; }
+ .next { margin-right: 0; }
+
+ .page-number.current {
+ color: $pagination-active-color;
+ background: $pagination-active-bg;
+ border-top-color: $pagination-active-border;
+ }
+}
+
+@media (max-width: 767px)
+ .pagination { border-top: none; }
+
+ .pagination {
+ .prev, .next, .page-number {
+ margin-bottom: 10px;
+ border-top: 0;
+ border-bottom: 1px solid $pagination-link-border;
+ padding: 0 10px;
+
+ &:hover { border-bottom-color: $pagination-link-hover-border; }
+ }
+ }
diff --git a/themes/Next/source/css/_common/components/post/my-post-copyright.styl b/themes/Next/source/css/_common/components/post/my-post-copyright.styl
new file mode 100644
index 0000000..e4f8474
--- /dev/null
+++ b/themes/Next/source/css/_common/components/post/my-post-copyright.styl
@@ -0,0 +1,45 @@
+.my_post_copyright {
+ width: 85%;
+ max-width: 45em;
+ margin: 2.8em auto 0;
+ padding: 0.5em 1.0em;
+ border: 1px solid #d3d3d3;
+ font-size: 0.93rem;
+ line-height: 1.6em;
+ word-break: break-all;
+ background: rgba(255,255,255,0.4);
+}
+.my_post_copyright p{margin:0;}
+.my_post_copyright span {
+ display: inline-block;
+ width: 5.2em;
+ color: #b5b5b5;
+ font-weight: bold;
+}
+.my_post_copyright .raw {
+ margin-left: 1em;
+ width: 5em;
+}
+.my_post_copyright a {
+ color: #808080;
+ border-bottom:0;
+}
+.my_post_copyright a:hover {
+ color: #a3d2a3;
+ text-decoration: underline;
+}
+.my_post_copyright:hover .fa-clipboard {
+ color: #000;
+}
+.my_post_copyright .post-url:hover {
+ font-weight: normal;
+}
+.my_post_copyright .copy-path {
+ margin-left: 1em;
+ width: 1em;
+ +mobile(){display:none;}
+}
+.my_post_copyright .copy-path:hover {
+ color: #808080;
+ cursor: pointer;
+}
diff --git a/themes/Next/source/css/_common/components/post/post-button.styl b/themes/Next/source/css/_common/components/post/post-button.styl
new file mode 100644
index 0000000..fd0809f
--- /dev/null
+++ b/themes/Next/source/css/_common/components/post/post-button.styl
@@ -0,0 +1,3 @@
+.post-button {
+ margin-top: 40px;
+}
diff --git a/themes/Next/source/css/_common/components/post/post-collapse.styl b/themes/Next/source/css/_common/components/post/post-collapse.styl
new file mode 100644
index 0000000..6633a45
--- /dev/null
+++ b/themes/Next/source/css/_common/components/post/post-collapse.styl
@@ -0,0 +1,111 @@
+// TODO: Refactor.
+
+@media (max-width: 767px) {
+ .posts-collapse {
+ margin: 0 20px;
+
+ .post-title, .post-meta {
+ display: block;
+ width: auto;
+ text-align: left;
+ }
+ }
+}
+
+.posts-collapse {
+ position: relative;
+ z-index: $zindex-1;
+
+ &::after {
+ content: " ";
+ position: absolute;
+ top: 20px;
+ left: 0;
+ margin-left: -2px;
+ width: 4px;
+ height: 100%;
+ background: $whitesmoke;
+ z-index: $zindex-bottom;
+ }
+
+ margin-left: $posts-collapse-left;
+ +mobile() { margin: 0 20px; }
+
+ .collection-title {
+ position: relative;
+ margin: 60px 0;
+
+ h1, h2 { margin-left: 20px; }
+
+ small { color: $grey; margin-left: 5px; }
+
+ &::before {
+ content: " ";
+ position: absolute;
+ left: 0;
+ top: 50%;
+ margin-left: -4px;
+ margin-top: -4px;
+ width: 8px;
+ height: 8px;
+ background: $grey;
+ circle();
+ }
+ }
+
+ .post { margin: 30px 0; }
+
+ .post-header {
+ position: relative;
+ the-transition();
+ transition-property: border;
+ border-bottom: 1px dashed $grey-light;
+
+ &::before {
+ content: " ";
+ position: absolute;
+ left: 0;
+ top: 12px;
+ width: 6px;
+ height: 6px;
+ margin-left: -4px;
+ background: $grey;
+ circle();
+ border: 1px solid white;
+ the-transition();
+ transition-property: background;
+ }
+ }
+
+ .post-header:hover {
+ border-bottom-color: $grey-dim;
+
+ &::before { background: $black-deep; }
+ }
+
+ .post-meta {
+ position: absolute;
+ font-size: 12px;
+ left: 20px;
+ top: 5px;
+ }
+
+ .post-comments-count { display: none; }
+
+ .post-title {
+ margin-left: 60px;
+ font-size: 16px;
+ font-weight: normal;
+ line-height: inherit;
+
+ &::after {
+ margin-left: 3px;
+ opacity: 0.6;
+ }
+
+ a {
+ color: $grey-dim;
+ border-bottom: none;
+ }
+ }
+}
diff --git a/themes/Next/source/css/_common/components/post/post-copyright.styl b/themes/Next/source/css/_common/components/post/post-copyright.styl
new file mode 100644
index 0000000..f1cc7cb
--- /dev/null
+++ b/themes/Next/source/css/_common/components/post/post-copyright.styl
@@ -0,0 +1,7 @@
+.post-copyright {
+ margin: $post-copyright.margin;
+ padding: $post-copyright.padding;
+ border-left: $post-copyright.border.width $post-copyright.border.style $post-copyright.border.color;
+ background-color: $post-copyright.bg;
+ list-style: none;
+}
diff --git a/themes/Next/source/css/_common/components/post/post-eof.styl b/themes/Next/source/css/_common/components/post/post-eof.styl
new file mode 100644
index 0000000..e430325
--- /dev/null
+++ b/themes/Next/source/css/_common/components/post/post-eof.styl
@@ -0,0 +1,17 @@
+.posts-expand {
+ .post-eof {
+ display: block;
+ margin: $post-eof-margin-top auto $post-eof-margin-bottom;
+ width: 8%;
+ height: 1px;
+ background: $grey-light;
+ text-align: center;
+ }
+}
+
+
+.post:last-child {
+ .post-eof.post-eof.post-eof {
+ display: none;
+ }
+}
diff --git a/themes/Next/source/css/_common/components/post/post-expand.styl b/themes/Next/source/css/_common/components/post/post-expand.styl
new file mode 100644
index 0000000..8c6d8a5
--- /dev/null
+++ b/themes/Next/source/css/_common/components/post/post-expand.styl
@@ -0,0 +1,64 @@
+// TODO: Refactor.
+
+.posts-expand {
+ padding-top: 40px;
+}
+
+@media (max-width: 767px) {
+ .posts-expand {
+ margin: 0 20px;
+ }
+
+ .post-body {
+ pre {
+ .gutter pre {
+ padding-right: 10px;
+ }
+ }
+
+ .highlight {
+ margin-left: 0px;
+ margin-right: 0px;
+ padding: 0;
+ .gutter pre {
+ padding-right: 10px;
+ }
+ }
+ }
+}
+
+.posts-expand .post-body {
+ +desktop() { text-align: justify; }
+
+
+ h2, h3, h4, h5, h6 {
+ padding-top: 10px;
+
+ .header-anchor{
+ float: right;
+ margin-left: 10px;
+ color: $grey-light;
+ border-bottom-style: none;
+ visibility: hidden;
+
+ &:hover{
+ color: inherit;
+ }
+ }
+
+ &:hover .header-anchor{
+ visibility: visible;
+ }
+ }
+
+ ul li { list-style: circle; }
+
+ img {
+ box-sizing: border-box;
+ margin: auto;
+ padding: 3px;
+ border: 1px solid $gray-lighter;
+ }
+}
+
+.posts-expand .post-body .fancybox img { margin: 0 auto 25px; }
diff --git a/themes/Next/source/css/_common/components/post/post-gallery.styl b/themes/Next/source/css/_common/components/post/post-gallery.styl
new file mode 100644
index 0000000..b2385ae
--- /dev/null
+++ b/themes/Next/source/css/_common/components/post/post-gallery.styl
@@ -0,0 +1,23 @@
+.post-gallery {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
+ border-collapse: separate;
+}
+
+.post-gallery-row { display: table-row; }
+
+.post-gallery .post-gallery-img {
+ display: table-cell;
+ text-align: center;
+ vertical-align: middle;
+ border: none;
+}
+
+.post-gallery .post-gallery-img img {
+ max-width: 100%;
+ max-height: 100%;
+ border: none;
+}
+
+.fancybox-close, .fancybox-close:hover { border: none; }
diff --git a/themes/Next/source/css/_common/components/post/post-meta.styl b/themes/Next/source/css/_common/components/post/post-meta.styl
new file mode 100644
index 0000000..d715203
--- /dev/null
+++ b/themes/Next/source/css/_common/components/post/post-meta.styl
@@ -0,0 +1,49 @@
+.posts-expand .post-meta {
+ margin: 3px 0 60px 0;
+ color: $grey-dark;
+ font-family: $font-family-posts;
+ font-size: 12px;
+ text-align: center;
+
+ .post-category-list {
+ display: inline-block;
+ margin: 0;
+ padding: 3px;
+ }
+ .post-category-list-link { color: $grey-dark; }
+
+ .post-description {
+ font-size: 14px;
+ margin-top: 2px;
+ }
+}
+
+.post-wordcount {
+ if !hexo-config('post_wordcount.separated_meta') { display: inline-block; }
+}
+
+.post-meta-divider {
+ margin: 0 .5em;
+}
+
+.post-meta-item-icon {
+ margin-right: 3px;
+ +tablet() {
+ display: inline-block;
+ }
+ +mobile() {
+ display: inline-block;
+ }
+}
+.post-meta-item-text {
+ +tablet() {
+ display: none;
+ }
+ +mobile() {
+ display: none;
+ }
+}
+
+.posts-expand .post-comments-count {
+ +mobile() { display: none; }
+}
diff --git a/themes/Next/source/css/_common/components/post/post-nav.styl b/themes/Next/source/css/_common/components/post/post-nav.styl
new file mode 100644
index 0000000..fa85838
--- /dev/null
+++ b/themes/Next/source/css/_common/components/post/post-nav.styl
@@ -0,0 +1,57 @@
+.post-nav {
+ display: table;
+ margin-top: 15px;
+ width: 100%;
+ border-top: 1px solid $gainsboro;
+}
+
+.post-nav-divider {
+ display: table-cell;
+ width: 10%;
+}
+
+.post-nav-item {
+ display: table-cell;
+ padding: 10px 0 0 0;
+ width: 45%;
+ vertical-align: top;
+
+ a {
+ position: relative;
+ display: block;
+ line-height: 25px;
+ font-size: 14px;
+ color: $link-color;
+ border-bottom: none;
+
+ &:hover {
+ color: $link-hover-color;
+ border-bottom: none;
+ }
+
+ &:active { top: 2px; }
+ }
+
+ .fa {
+ position: absolute;
+ top: 8px;
+ left: 0;
+ font-size: 12px;
+ }
+
+}
+
+.post-nav-next {
+ a { padding-left: 15px; }
+}
+
+.post-nav-prev {
+ text-align: right;
+
+ a { padding-right: 15px; }
+
+ .fa {
+ right: 0;
+ left: auto;
+ }
+}
diff --git a/themes/Next/source/css/_common/components/post/post-reward.styl b/themes/Next/source/css/_common/components/post/post-reward.styl
new file mode 100644
index 0000000..450a104
--- /dev/null
+++ b/themes/Next/source/css/_common/components/post/post-reward.styl
@@ -0,0 +1,64 @@
+#rewardButton {
+ cursor: pointer;
+ border: 0;
+ outline: 0;
+ border-radius: 5px;
+ padding: 0;
+ margin: 0;
+ letter-spacing: normal;
+ text-transform: none;
+ text-indent: 0px;
+ text-shadow: none;
+}
+#rewardButton span {
+ display: inline-block;
+ width: 80px;
+ height: 35px;
+ border-radius: 5px;
+ color: #fff;
+ font-weight: 400;
+ font-style: normal;
+ font-variant: normal;
+ font-stretch: normal;
+ font-size: 18px;
+ font-family: "Microsoft Yahei";
+ background: #F44336;
+}
+#rewardButton span:hover{
+ background: #F7877F;
+}
+#QR{
+ padding-top:20px;
+}
+#QR a{
+ border:0;
+}
+#QR img{
+ width: 180px;
+ max-width: 100%;
+ display: inline-block;
+ margin: 0.8em 2em 0 2em;
+}
+#wechat:hover p{
+ animation: roll 0.1s infinite linear;
+ -webkit-animation: roll 0.1s infinite linear;
+ -moz-animation: roll 0.1s infinite linear;
+}
+#alipay:hover p{
+ animation: roll 0.1s infinite linear;
+ -webkit-animation: roll 0.1s infinite linear;
+ -moz-animation: roll 0.1s infinite linear;
+}
+#bitcoin:hover p {
+ animation: roll 0.1s infinite linear;
+ -webkit-animation: roll 0.1s infinite linear;
+ -moz-animation: roll 0.1s infinite linear;
+}
+@keyframes roll {
+ from {
+ transform(rotateZ(30deg));
+ }
+ to {
+ transform(rotateZ(-30deg));
+ }
+}
diff --git a/themes/Next/source/css/_common/components/post/post-rtl.styl b/themes/Next/source/css/_common/components/post/post-rtl.styl
new file mode 100644
index 0000000..ea048b9
--- /dev/null
+++ b/themes/Next/source/css/_common/components/post/post-rtl.styl
@@ -0,0 +1,11 @@
+.rtl {
+ &.post-body {
+ p, a, h1, h2, h3, h4, h5, h6, li, ul, ol {
+ direction: rtl;
+ font-family: UKIJ Ekran;
+ }
+ }
+ &.post-title {
+ font-family: UKIJ Ekran;
+ }
+}
diff --git a/themes/Next/source/css/_common/components/post/post-tags.styl b/themes/Next/source/css/_common/components/post/post-tags.styl
new file mode 100644
index 0000000..8c04ec7
--- /dev/null
+++ b/themes/Next/source/css/_common/components/post/post-tags.styl
@@ -0,0 +1,10 @@
+.posts-expand .post-tags {
+ margin-top: 40px;
+ text-align: center;
+
+ a {
+ display: inline-block;
+ margin-right: 10px;
+ font-size: 13px;
+ }
+}
diff --git a/themes/Next/source/css/_common/components/post/post-title.styl b/themes/Next/source/css/_common/components/post/post-title.styl
new file mode 100644
index 0000000..dcd1c06
--- /dev/null
+++ b/themes/Next/source/css/_common/components/post/post-title.styl
@@ -0,0 +1,33 @@
+.posts-expand .post-title {
+ text-align: center;
+ word-break: break-word;
+ font-weight: $posts-expand-title-font-weight
+}
+.posts-expand .post-title-link {
+ display: inline-block;
+ position: relative;
+ color: $black-light;
+ border-bottom: none;
+ line-height: 1.2;
+ vertical-align: top;
+
+ &::before {
+ content: "";
+ position: absolute;
+ width: 100%;
+ height: 2px;
+ bottom: 0;
+ left: 0;
+ background-color: #000;
+ visibility: hidden;
+ transform: scaleX(0);
+ the-transition();
+ }
+
+ &:hover::before {
+ visibility: visible;
+ transform: scaleX(1);
+ }
+
+ .fa { font-size: 16px; }
+}
diff --git a/themes/Next/source/css/_common/components/post/post-type.styl b/themes/Next/source/css/_common/components/post/post-type.styl
new file mode 100644
index 0000000..c3d2510
--- /dev/null
+++ b/themes/Next/source/css/_common/components/post/post-type.styl
@@ -0,0 +1,14 @@
+// TODO: Refactor.
+
+.page-home, .page-post-detail {
+ .post-type-quote {
+ .post-header,
+ .post-tags {
+ display: none;
+ }
+
+ blockquote {
+ @extend .blockquote-center
+ }
+ }
+}
diff --git a/themes/Next/source/css/_common/components/post/post-widgets.styl b/themes/Next/source/css/_common/components/post/post-widgets.styl
new file mode 100644
index 0000000..4914c5a
--- /dev/null
+++ b/themes/Next/source/css/_common/components/post/post-widgets.styl
@@ -0,0 +1,41 @@
+.post-widgets {
+ border-top: 1px solid #eee;
+ padding-top: 9px;
+ margin-top: 45px;
+ display: flex;
+ justify-content: center;
+ flex-wrap: wrap;
+ align-items: center;
+
+ .post-meta-divider {
+ height: 28px;
+ color: $grey-dark;
+ }
+}
+
+.wp_rating {
+ height: 20px;
+ margin-right: 10px;
+ text-align: center;
+ line-height: 20px;
+ padding-top: 6px;
+}
+
+.social-like {
+ font-size: 14px;
+ text-align: center;
+ display: flex;
+ justify-content: center;
+}
+
+.vk_like {
+ width: 85px;
+ height: 21px;
+ padding-top: 7px;
+ align-self: center;
+}
+
+.fb_like {
+ height: 30px;
+ align-self: center;
+}
diff --git a/themes/Next/source/css/_common/components/post/post.styl b/themes/Next/source/css/_common/components/post/post.styl
new file mode 100644
index 0000000..c03d318
--- /dev/null
+++ b/themes/Next/source/css/_common/components/post/post.styl
@@ -0,0 +1,74 @@
+.post-body {
+ font-family: $font-family-posts;
+ +mobile() {
+ word-break: break-word;
+ }
+}
+
+.post-body .fancybox img {
+ display: block !important;
+ margin: 0 auto;
+ cursor: pointer;
+ cursor: zoom-in;
+ cursor: -webkit-zoom-in;
+}
+
+.post-body .image-caption {
+ margin: -20px auto 15px;
+ text-align: center;
+ font-size: $font-size-base;
+ color: $grey-dark;
+ font-weight: bold;
+ line-height: 1;
+}
+
+.post-body .figure .caption {
+ @extend .post-body .image-caption;
+}
+
+.post-sticky-flag {
+ display: inline-block;
+ font-size: 16px;
+ -ms-transform: rotate(30deg);
+ transform: rotate(30deg);
+}
+
+.use-motion {
+ if hexo-config('motion.transition.post_block') {
+ .post-block,
+ .pagination,
+ .comments { opacity: 0; }
+ }
+ if hexo-config('motion.transition.post_header') { .post-header { opacity: 0; } }
+ if hexo-config('motion.transition.post_body') { .post-body { opacity: 0; } }
+ if hexo-config('motion.transition.coll_header') { .collection-title { opacity: 0; } }
+}
+
+@import "post-expand";
+@import "post-collapse";
+@import "post-type";
+@import "post-title";
+@import "post-meta";
+@import "post-button";
+@import "post-tags";
+@import "post-nav";
+@import "post-eof";
+@import "post-gallery";
+@import "post-reward" if hexo-config('alipay') or hexo-config('wechatpay') or hexo-config('bitcoin');
+@import "post-copyright" if hexo-config('post_copyright.enable');
+@import "post-widgets" if (hexo-config('facebook_sdk.enable') and hexo-config('facebook_sdk.like_button')) or (hexo-config('vkontakte_api.enable') and hexo-config('vkontakte_api.like')) or hexo-config('rating.enable') or (hexo-config('needmoreshare2.enable') and hexo-config('needmoreshare2.postbottom.enable'));
+@import "post-rtl";
+
+// 文章内链接文本样式
+.post-body p a{
+ color: #0593d3;
+ border-bottom: none;
+ border-bottom: 1px solid #0593d3;
+ &:hover {
+ color: #fc6423;
+ border-bottom: none;
+ border-bottom: 1px solid #fc6423;
+ }
+}
+
+@import "my-post-copyright"
diff --git a/themes/Next/source/css/_common/components/sidebar/sidebar-author-links.styl b/themes/Next/source/css/_common/components/sidebar/sidebar-author-links.styl
new file mode 100644
index 0000000..227e839
--- /dev/null
+++ b/themes/Next/source/css/_common/components/sidebar/sidebar-author-links.styl
@@ -0,0 +1,23 @@
+.links-of-author {
+ margin-top: 20px;
+}
+
+.links-of-author a {
+ display: inline-block;
+ vertical-align: middle;
+ margin-right: 10px;
+ margin-bottom: 10px;
+ border-bottom-color: $black-light;
+ font-size: 13px;
+
+ &:before {
+ display: inline-block;
+ vertical-align: middle;
+ margin-right: 3px;
+ content: " ";
+ width: 4px;
+ height: 4px;
+ border-radius: 50%;
+ background: rgb(random-color(0, 255) - 50%, random-color(0, 255) - 50%, random-color(0, 255) - 50%);
+ }
+}
diff --git a/themes/Next/source/css/_common/components/sidebar/sidebar-author.styl b/themes/Next/source/css/_common/components/sidebar/sidebar-author.styl
new file mode 100644
index 0000000..14ac717
--- /dev/null
+++ b/themes/Next/source/css/_common/components/sidebar/sidebar-author.styl
@@ -0,0 +1,22 @@
+.site-author-image {
+ display: block;
+ margin: 0 auto;
+ padding: $site-author-image-padding;
+ max-width: $site-author-image-width;
+ height: $site-author-image-height;
+ border: $site-author-image-border-width solid $site-author-image-border-color;
+}
+
+.site-author-name {
+ margin: $site-author-name-margin;
+ text-align: $site-author-name-align;
+ color: $site-author-name-color;
+ font-weight: $site-author-name-weight;
+}
+
+.site-description {
+ margin-top: $site-description-margin-top;
+ text-align: $site-description-align;
+ font-size: $site-description-font-size;
+ color: $site-description-color;
+}
diff --git a/themes/Next/source/css/_common/components/sidebar/sidebar-blogroll.styl b/themes/Next/source/css/_common/components/sidebar/sidebar-blogroll.styl
new file mode 100644
index 0000000..b677e68
--- /dev/null
+++ b/themes/Next/source/css/_common/components/sidebar/sidebar-blogroll.styl
@@ -0,0 +1,25 @@
+.links-of-blogroll { font-size: 13px; }
+
+.links-of-blogroll-title {
+ margin-top: 20px;
+ font-size: 14px;
+ font-weight: $font-weight-bold;
+}
+.links-of-blogroll-list {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+.links-of-blogroll-item {
+ padding: 2px 10px;
+
+ a {
+ max-width: 280px;
+ box-sizing: border-box;
+ display: inline-block;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+}
diff --git a/themes/Next/source/css/_common/components/sidebar/sidebar-dimmer.styl b/themes/Next/source/css/_common/components/sidebar/sidebar-dimmer.styl
new file mode 100644
index 0000000..b2da3ce
--- /dev/null
+++ b/themes/Next/source/css/_common/components/sidebar/sidebar-dimmer.styl
@@ -0,0 +1,21 @@
+.sidebar-active #sidebar-dimmer {
+ opacity: .7;
+ -webkit-transform: translateX(-150%);
+ transform: translateX(-150%);
+ transition: opacity .2s;
+}
+
+#sidebar-dimmer {
+ display: none;
+ position: absolute;
+ top: 0;
+ left: 100%;
+ width: 200%;
+ height: 100%;
+ background: #000;
+ opacity: 0;
+ transition: opacity .2s,transform 0s .2s;
+ +mobile() {
+ display: block;
+ }
+}
diff --git a/themes/Next/source/css/_common/components/sidebar/sidebar-feed-link.styl b/themes/Next/source/css/_common/components/sidebar/sidebar-feed-link.styl
new file mode 100644
index 0000000..b3868a8
--- /dev/null
+++ b/themes/Next/source/css/_common/components/sidebar/sidebar-feed-link.styl
@@ -0,0 +1,23 @@
+.feed-link {
+ margin-top: 20px;
+
+ a {
+ display: inline-block;
+ padding: 0 15px;
+ color: rgb(252, 100, 35);
+ border: 1px solid rgb(252, 100, 35);
+ border-radius: 4px;
+
+ i {
+ color: rgb(252, 100, 35);
+ font-size: 14px;
+ }
+
+ &:hover {
+ color:white;
+ background: rgb(252, 100, 35);
+
+ i { color: white; }
+ }
+ }
+}
diff --git a/themes/Next/source/css/_common/components/sidebar/sidebar-nav.styl b/themes/Next/source/css/_common/components/sidebar/sidebar-nav.styl
new file mode 100644
index 0000000..973eda7
--- /dev/null
+++ b/themes/Next/source/css/_common/components/sidebar/sidebar-nav.styl
@@ -0,0 +1,29 @@
+// Sidebar Navigation
+
+.sidebar-nav {
+ margin: 0 0 20px;
+ padding-left: 0;
+}
+.sidebar-nav li {
+ display: inline-block;
+ cursor: pointer;
+ border-bottom: 1px solid transparent;
+ font-size: 14px;
+ color: $sidebar-nav-color;
+
+ &:hover { color: $sidebar-nav-hover-color; }
+}
+
+.page-post-detail .sidebar-nav-toc { padding: 0 5px; }
+
+.page-post-detail .sidebar-nav-overview { margin-left: 10px; }
+
+.sidebar-nav .sidebar-nav-active {
+ color: $sidebar-highlight;
+ border-bottom-color: $sidebar-highlight;
+
+ &:hover { color: $sidebar-highlight; }
+}
+
+.sidebar-panel { display: none; }
+.sidebar-panel-active { display: block; }
diff --git a/themes/Next/source/css/_common/components/sidebar/sidebar-toc.styl b/themes/Next/source/css/_common/components/sidebar/sidebar-toc.styl
new file mode 100644
index 0000000..552275a
--- /dev/null
+++ b/themes/Next/source/css/_common/components/sidebar/sidebar-toc.styl
@@ -0,0 +1,59 @@
+
+.post-toc-empty {
+ font-size: 14px;
+ color: $grey-dim;
+}
+
+.post-toc-wrap { overflow: hidden; }
+
+.post-toc { overflow: auto; }
+
+.post-toc ol {
+ margin: 0;
+ padding: 0 2px 5px 10px;
+ text-align: left;
+ list-style: none;
+ font-size: 14px;
+
+ & > ol { padding-left: 0; }
+
+ a {
+ the-transition();
+ transition-property: all;
+ color: $toc-link-color;
+ border-bottom-color: $toc-link-border-color;
+
+ &:hover {
+ color: $toc-link-hover-color;
+ border-bottom-color: $toc-link-hover-border-color;
+ }
+ }
+}
+
+.post-toc .nav-item {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap if !hexo-config('toc.wrap');
+ line-height: 1.8;
+}
+
+.post-toc .nav .nav-child { display: none; }
+
+.post-toc .nav .active > .nav-child { display: block; }
+
+.post-toc .nav .active-current > .nav-child {
+ display: block;
+ & > .nav-item { display: block; }
+}
+
+.post-toc .nav .active > a {
+ color: $toc-link-active-color;
+ border-bottom-color: $toc-link-active-border-color;
+}
+
+.post-toc .nav .active-current > a {
+ color: $toc-link-active-current-color;
+ &:hover {
+ color: $toc-link-active-current-border-color;
+ }
+}
diff --git a/themes/Next/source/css/_common/components/sidebar/sidebar-toggle.styl b/themes/Next/source/css/_common/components/sidebar/sidebar-toggle.styl
new file mode 100644
index 0000000..c4b6a06
--- /dev/null
+++ b/themes/Next/source/css/_common/components/sidebar/sidebar-toggle.styl
@@ -0,0 +1,36 @@
+.sidebar-toggle {
+ position: fixed;
+ right: $b2t-position-right;
+ bottom: 45px;
+ width: 14px;
+ height: 14px;
+ padding: 5px;
+ background: $black-deep;
+ line-height: 0;
+ z-index: $zindex-5;
+ cursor: pointer;
+ -webkit-transform: translateZ(0);
+
+ +tablet() {
+ fixbutton() if hexo-config('sidebar.onmobile');
+ hide() if not hexo-config('sidebar.onmobile');
+ }
+ +mobile() {
+ fixbutton() if hexo-config('sidebar.onmobile');
+ hide() if not hexo-config('sidebar.onmobile');
+ }
+}
+
+
+
+.sidebar-toggle-line {
+ position: relative;
+ display: inline-block;
+ vertical-align: top;
+ height: 2px;
+ width: 100%;
+ background: white;
+ margin-top: 3px;
+
+ &:first-child { margin-top: 0; }
+}
diff --git a/themes/Next/source/css/_common/components/sidebar/sidebar.styl b/themes/Next/source/css/_common/components/sidebar/sidebar.styl
new file mode 100644
index 0000000..635cc94
--- /dev/null
+++ b/themes/Next/source/css/_common/components/sidebar/sidebar.styl
@@ -0,0 +1,52 @@
+.sidebar {
+ position: fixed;
+ right: 0;
+ top: 0;
+ bottom: 0;
+
+ width: 0;
+ z-index: $zindex-4;
+ box-shadow: inset 0 2px 6px black;
+ background: $black-deep;
+ -webkit-transform: translateZ(0); // http://stackoverflow.com/questions/17079857/position-fixed-broken-in-chrome-with-flash-behind
+
+ a {
+ color: $grey-dark;
+ border-bottom-color: $black-light;
+ &:hover { color: $gainsboro; }
+ }
+
+ +tablet() {
+ hide() if not hexo-config('sidebar.onmobile');
+ }
+ +mobile() {
+ hide() if not hexo-config('sidebar.onmobile');
+ }
+
+}
+
+.sidebar-inner {
+ position: relative;
+ padding: 20px 10px;
+ color: $grey-dark;
+ text-align: center;
+}
+
+.site-overview-wrap {
+ overflow: hidden;
+}
+
+.site-overview {
+ overflow-y: auto;
+ overflow-x: hidden;
+}
+
+@import "sidebar-toggle";
+@import "sidebar-author";
+@import "site-state";
+@import "sidebar-feed-link";
+@import "sidebar-author-links";
+@import "sidebar-blogroll";
+@import "sidebar-nav";
+@import "sidebar-toc";
+@import "sidebar-dimmer" if hexo-config('sidebar.onmobile');
diff --git a/themes/Next/source/css/_common/components/sidebar/site-state.styl b/themes/Next/source/css/_common/components/sidebar/site-state.styl
new file mode 100644
index 0000000..c05b0ea
--- /dev/null
+++ b/themes/Next/source/css/_common/components/sidebar/site-state.styl
@@ -0,0 +1,28 @@
+.site-state {
+ overflow: hidden;
+ line-height: 1.4;
+ white-space: nowrap;
+ text-align: $site-state-align;
+}
+
+.site-state-item {
+ display: inline-block;
+ padding: 0 15px;
+ border-left: 1px solid $site-state-item-border-color;
+
+ &:first-child { border-left: none; }
+
+ a { border-bottom: none; }
+}
+.site-state-item-count {
+ display: block;
+ text-align: center;
+ color: $site-state-item-count-color;
+ font-weight: $font-weight-bold;
+ font-size: $site-state-item-count-font-size;
+}
+
+.site-state-item-name {
+ font-size: $site-state-item-name-font-size;
+ color: $site-state-item-name-color;
+}
diff --git a/themes/Next/source/css/_common/components/tag-cloud.styl b/themes/Next/source/css/_common/components/tag-cloud.styl
new file mode 100644
index 0000000..30b01c6
--- /dev/null
+++ b/themes/Next/source/css/_common/components/tag-cloud.styl
@@ -0,0 +1,8 @@
+.tag-cloud {
+ text-align: center;
+
+ a {
+ display: inline-block;
+ margin: 10px;
+ }
+}
\ No newline at end of file
diff --git a/themes/Next/source/css/_common/components/tags/blockquote-center.styl b/themes/Next/source/css/_common/components/tags/blockquote-center.styl
new file mode 100644
index 0000000..b0f3bcc
--- /dev/null
+++ b/themes/Next/source/css/_common/components/tags/blockquote-center.styl
@@ -0,0 +1,33 @@
+// Blockquote with all children centered.
+.blockquote-center {
+ position: relative;
+ margin: 40px 0;
+ padding: 0;
+ border-left: none;
+ text-align: center;
+
+ &::before, &::after {
+ position: absolute;
+ content: ' ';
+ display: block;
+ width: 100%;
+ height: 24px;
+ opacity: 0.2;
+ background-repeat: no-repeat;
+ background-position: 0 -6px;
+ background-size: 22px 22px;
+ }
+ &::before {
+ top: -20px;
+ background-image: url($center-quote-left);
+ border-top: 1px solid $grey-light;
+ }
+ &::after {
+ bottom: -20px;
+ background-image: url($center-quote-right);
+ border-bottom: 1px solid $grey-light;
+ background-position: 100% 8px;
+ }
+
+ p, div { text-align: center; }
+}
diff --git a/themes/Next/source/css/_common/components/tags/exturl.styl b/themes/Next/source/css/_common/components/tags/exturl.styl
new file mode 100644
index 0000000..49a1684
--- /dev/null
+++ b/themes/Next/source/css/_common/components/tags/exturl.styl
@@ -0,0 +1,18 @@
+.exturl {
+ // Remove the gray background color from active links in IE 10.
+ background-color: transparent;
+
+ cursor: pointer;
+ border-bottom: 1px solid #999;
+
+ .fa {
+ font-size: 14px;
+ }
+}
+
+// Improve readability when focused and also mouse hovered in all browsers.
+.exturl:active, .exturl:hover {
+ outline: 0;
+ color: $black-deep;
+ border-bottom-color: $black-deep;
+}
diff --git a/themes/Next/source/css/_common/components/tags/full-image.styl b/themes/Next/source/css/_common/components/tags/full-image.styl
new file mode 100644
index 0000000..3f79bec
--- /dev/null
+++ b/themes/Next/source/css/_common/components/tags/full-image.styl
@@ -0,0 +1,12 @@
+// Expand image to 126% with nagative margin-left/right on Desktop.
+.full-image.full-image.full-image {
+ border: none;
+ max-width: 100%;
+ width: auto;
+ margin: 20px auto;
+ +desktop() {
+ max-width: none;
+ width: $full-image-width;
+ margin: $full-image-margin-vertical $full-image-margin-horizontal;
+ }
+}
diff --git a/themes/Next/source/css/_common/components/tags/group-pictures.styl b/themes/Next/source/css/_common/components/tags/group-pictures.styl
new file mode 100644
index 0000000..ce1461d
--- /dev/null
+++ b/themes/Next/source/css/_common/components/tags/group-pictures.styl
@@ -0,0 +1,35 @@
+.post .post-body .group-picture {
+ img {
+ box-sizing: border-box;
+ padding: 0 3px;
+ border: none;
+ }
+}
+
+.post .group-picture-row {
+ overflow: hidden;
+ margin-top: 6px;
+ &:first-child { margin-top: 0; }
+}
+
+.post .group-picture-column { float: left; }
+
+.page-post-detail .post-body .group-picture-column {
+ float: none;
+ margin-top: 10px;
+ width: auto !important;
+ img { margin: 0 auto; }
+}
+
+.page-archive {
+ .group-picture-container { overflow: hidden; }
+ .group-picture-row {
+ float: left;
+ &:first-child { margin-top: 6px; }
+ }
+
+ .group-picture-column {
+ max-width: 150px;
+ max-height: 150px;
+ }
+}
diff --git a/themes/Next/source/css/_common/components/tags/label.styl b/themes/Next/source/css/_common/components/tags/label.styl
new file mode 100644
index 0000000..541dd2d
--- /dev/null
+++ b/themes/Next/source/css/_common/components/tags/label.styl
@@ -0,0 +1,12 @@
+.post-body .label {
+ display: inline;
+ padding: 0 2px;
+ white-space: nowrap;
+
+ &.default { background-color: $label-default; }
+ &.primary { background-color: $label-primary; }
+ &.info { background-color: $label-info; }
+ &.success { background-color: $label-success; }
+ &.warning { background-color: $label-warning; }
+ &.danger { background-color: $label-danger; }
+}
diff --git a/themes/Next/source/css/_common/components/tags/note-modern.styl b/themes/Next/source/css/_common/components/tags/note-modern.styl
new file mode 100644
index 0000000..cf7659e
--- /dev/null
+++ b/themes/Next/source/css/_common/components/tags/note-modern.styl
@@ -0,0 +1,183 @@
+.post-body .note {
+ note_icons = hexo-config('note.icons');
+
+ position: relative;
+ padding: 15px;
+ margin-bottom: 20px;
+
+ border: 1px solid transparent;
+ background-color: $whitesmoke;
+ border-radius: unit(hexo-config('note.border_radius'), px) if hexo-config('note.border_radius') is a 'unit';
+
+ h2, h3, h4, h5, h6 {
+ if note_icons {
+ margin-top: 3px;
+ } else {
+ margin-top: 0;
+ }
+ margin-bottom: 0;
+ border-bottom: initial;
+ padding-top: 0 !important;
+ }
+
+ p, ul, ol, table, pre, blockquote {
+ &:first-child {
+ margin-top: 0;
+ }
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ if note_icons {
+ &:not(.no-icon) {
+ padding-left: 45px;
+ &:before {
+ position: absolute;
+ font-family: 'FontAwesome';
+ font-size: larger;
+ top: 13px;
+ left: 15px;
+ }
+ }
+ }
+
+ &.default {
+ background-color: $note-modern-default-bg;
+ border-color: $note-modern-default-border;
+ color: $note-modern-default-text;
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-default-icon;
+ }
+ }
+ }
+ a {
+ &:not(.btn) {
+ color: $note-modern-default-text;
+ border-bottom: 1px solid $note-modern-default-text;
+ &:hover {
+ color: $note-modern-default-hover;
+ border-bottom: 1px solid $note-modern-default-hover;
+ }
+ }
+ }
+ }
+
+ &.primary {
+ background-color: $note-modern-primary-bg;
+ border-color: $note-modern-primary-border;
+ color: $note-modern-primary-text;
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-primary-icon;
+ }
+ }
+ }
+ a {
+ &:not(.btn) {
+ color: $note-modern-primary-text;
+ border-bottom: 1px solid $note-modern-primary-text;
+ &:hover {
+ color: $note-modern-primary-hover;
+ border-bottom: 1px solid $note-modern-primary-hover;
+ }
+ }
+ }
+ }
+
+ &.info {
+ background-color: $note-modern-info-bg;
+ border-color: $note-modern-info-border;
+ color: $note-modern-info-text;
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-info-icon;
+ }
+ }
+ }
+ a {
+ &:not(.btn) {
+ color: $note-modern-info-text;
+ border-bottom: 1px solid $note-modern-info-text;
+ &:hover {
+ color: $note-modern-info-hover;
+ border-bottom: 1px solid $note-modern-info-hover;
+ }
+ }
+ }
+ }
+
+ &.success {
+ background-color: $note-modern-success-bg;
+ border-color: $note-modern-success-border;
+ color: $note-modern-success-text;
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-success-icon;
+ }
+ }
+ }
+ a {
+ &:not(.btn) {
+ color: $note-modern-success-text;
+ border-bottom: 1px solid $note-modern-success-text;
+ &:hover {
+ color: $note-modern-success-hover;
+ border-bottom: 1px solid $note-modern-success-hover;
+ }
+ }
+ }
+ }
+
+ &.warning {
+ background-color: $note-modern-warning-bg;
+ border-color: $note-modern-warning-border;
+ color: $note-modern-warning-text;
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-warning-icon;
+ }
+ }
+ }
+ a {
+ &:not(.btn) {
+ color: $note-modern-warning-text;
+ border-bottom: 1px solid $note-modern-warning-text;
+ &:hover {
+ color: $note-modern-warning-hover;
+ border-bottom: 1px solid $note-modern-warning-hover;
+ }
+ }
+ }
+ }
+
+ &.danger {
+ background-color: $note-modern-danger-bg;
+ border-color: $note-modern-danger-border;
+ color: $note-modern-danger-text;
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-danger-icon;
+ }
+ }
+ }
+ a {
+ &:not(.btn) {
+ color: $note-modern-danger-text;
+ border-bottom: 1px solid $note-modern-danger-text;
+ &:hover {
+ color: $note-modern-danger-hover;
+ border-bottom: 1px solid $note-modern-danger-hover;
+ }
+ }
+ }
+ }
+
+}
diff --git a/themes/Next/source/css/_common/components/tags/note.styl b/themes/Next/source/css/_common/components/tags/note.styl
new file mode 100644
index 0000000..4b234b0
--- /dev/null
+++ b/themes/Next/source/css/_common/components/tags/note.styl
@@ -0,0 +1,161 @@
+.post-body .note {
+ note_style = hexo-config('note.style');
+ note_icons = hexo-config('note.icons');
+
+ position: relative;
+ padding: 15px;
+ margin-bottom: 20px;
+
+ if note_style == 'simple' {
+ border: 1px solid $gainsboro;
+ border-left-width: 5px;
+ }
+ if note_style == 'flat' {
+ border: initial;
+ border-left: 3px solid $gainsboro;
+ background-color: lighten($gainsboro, 65%);
+ }
+ border-radius: unit(hexo-config('note.border_radius'), px) if hexo-config('note.border_radius') is a 'unit';
+
+ h2, h3, h4, h5, h6 {
+ if note_icons {
+ margin-top: 3px;
+ } else {
+ margin-top: 0;
+ }
+ margin-bottom: 0;
+ border-bottom: initial;
+ padding-top: 0 !important;
+ }
+
+ p, ul, ol, table, pre, blockquote {
+ &:first-child {
+ margin-top: 0;
+ }
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ if note_icons {
+ &:not(.no-icon) {
+ padding-left: 45px;
+ &:before {
+ position: absolute;
+ font-family: 'FontAwesome';
+ font-size: larger;
+ top: 13px;
+ left: 15px;
+ }
+ }
+ }
+
+ &.default {
+ if note_style == 'flat' {
+ background-color: $note-default-bg;
+ }
+ border-left-color: $note-default-border;
+ h2, h3, h4, h5, h6 {
+ color: $note-default-text;
+ }
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-default-icon;
+ color : $note-default-text;
+ }
+ }
+ }
+ }
+
+ &.primary {
+ if note_style == 'flat' {
+ background-color: $note-primary-bg;
+ }
+ border-left-color: $note-primary-border;
+ h2, h3, h4, h5, h6 {
+ color: $note-primary-text;
+ }
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-primary-icon;
+ color : $note-primary-text;
+ }
+ }
+ }
+ }
+
+ &.info {
+ if note_style == 'flat' {
+ background-color: $note-info-bg;
+ }
+ border-left-color: $note-info-border;
+ h2, h3, h4, h5, h6 {
+ color: $note-info-text;
+ }
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-info-icon;
+ color : $note-info-text;
+ }
+ }
+ }
+ }
+
+ &.success {
+ if note_style == 'flat' {
+ background-color: $note-success-bg;
+ }
+ border-left-color: $note-success-border;
+ h2, h3, h4, h5, h6 {
+ color: $note-success-text;
+ }
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-success-icon;
+ color : $note-success-text;
+ }
+ }
+ }
+ }
+
+ &.warning {
+ if note_style == 'flat' {
+ background-color: $note-warning-bg;
+ }
+ border-left-color: $note-warning-border;
+ h2, h3, h4, h5, h6 {
+ color: $note-warning-text;
+ }
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-warning-icon;
+ color : $note-warning-text;
+ }
+ }
+ }
+ }
+
+ &.danger {
+ if note_style == 'flat' {
+ background-color: $note-danger-bg;
+ }
+ border-left-color: $note-danger-border;
+ h2, h3, h4, h5, h6 {
+ color: $note-danger-text;
+ }
+ if note_icons {
+ &:not(.no-icon) {
+ &:before {
+ content: $note-danger-icon;
+ color : $note-danger-text;
+ }
+ }
+ }
+ }
+
+}
diff --git a/themes/Next/source/css/_common/components/tags/tabs.styl b/themes/Next/source/css/_common/components/tags/tabs.styl
new file mode 100644
index 0000000..c3c27c4
--- /dev/null
+++ b/themes/Next/source/css/_common/components/tags/tabs.styl
@@ -0,0 +1,99 @@
+.post-body .tabs {
+ position: relative;
+ display: block;
+ margin-bottom: 20px;
+ padding-top: 10px;
+
+ // Read tabs border_radius from NexT config and set in "tbr px" to use it as string variable in this CSS section.
+ hexo-config('tabs.border_radius') is a 'unit' ? (tbr = unit(hexo-config('tabs.border_radius'), px)) : (tbr = 0)
+
+ ul.nav-tabs {
+ margin: 0;
+ padding: 0;
+ display: flex;
+ margin-bottom: -1px;
+
+ +mobile-smallest() {
+ display: block;
+ margin-bottom: 5px;
+ }
+
+ li.tab {
+ list-style-type: none !important;
+ margin: 0 .25em 0 0;
+ border-top: 3px solid transparent;
+ border-left: 1px solid transparent;
+ border-right: 1px solid transparent;
+
+ +mobile-smallest() {
+ margin: initial;
+ border-top: 1px solid transparent;
+ border-left: 3px solid transparent;
+ border-right: 1px solid transparent;
+ border-bottom: 1px solid transparent;
+ }
+
+ if tbr > 0 {
+ border-radius: tbr tbr 0 0;
+ +mobile-smallest() { border-radius: tbr; }
+ }
+ if hexo-config('tabs.transition.tabs') { the-transition-ease-out(); }
+
+ & a {
+ outline: 0;
+ border-bottom: initial;
+ display: block;
+ line-height: 1.8em;
+ padding: .25em .75em;
+ & i { width: (18em / 14); }
+ if hexo-config('tabs.transition.labels') { the-transition-ease-out(); }
+ }
+
+ &.active {
+ border-top: 3px solid $orange;
+ border-left: 1px solid $table-border-color;
+ border-right: 1px solid $table-border-color;
+ background-color: #fff;
+
+ +mobile-smallest() {
+ border-top: 1px solid $table-border-color;
+ border-left: 3px solid $orange;
+ border-right: 1px solid $table-border-color;
+ border-bottom: 1px solid $table-border-color;
+ }
+
+ & a {
+ cursor: default;
+ color: $link-color;
+ }
+ }
+ }
+
+ }
+
+ .tab-content {
+ background-color: #fff;
+
+ .tab-pane {
+ border: 1px solid $table-border-color;
+ padding: 20px 20px 0 20px;
+ if tbr > 0 { border-radius: tbr; }
+
+ &:not(.active) {
+ hide();
+ }
+ &.active {
+ show();
+ if tbr > 0 {
+ &:nth-of-type(1) {
+ border-radius: 0 tbr tbr tbr;
+ +mobile-smallest() { border-radius: tbr; }
+ }
+ }
+ }
+
+ }
+
+ }
+
+}
diff --git a/themes/Next/source/css/_common/components/tags/tags.styl b/themes/Next/source/css/_common/components/tags/tags.styl
new file mode 100644
index 0000000..e7e027a
--- /dev/null
+++ b/themes/Next/source/css/_common/components/tags/tags.styl
@@ -0,0 +1,8 @@
+@import "full-image";
+@import "blockquote-center";
+@import "group-pictures";
+@import "exturl" if hexo-config('exturl');
+@import "note" if hexo-config('note.style') == 'simple' || hexo-config('note.style') == 'flat';
+@import "note-modern" if hexo-config('note.style') == 'modern';
+@import "label" if hexo-config('label');
+@import "tabs" if hexo-config('tabs.enable');
diff --git a/themes/Next/source/css/_common/components/third-party/algolia-search.styl b/themes/Next/source/css/_common/components/third-party/algolia-search.styl
new file mode 100644
index 0000000..e2e9828
--- /dev/null
+++ b/themes/Next/source/css/_common/components/third-party/algolia-search.styl
@@ -0,0 +1,125 @@
+.algolia-pop-overlay
+ position: fixed
+ width: 100%
+ height: 100%
+ top: 0
+ left: 0
+ z-index: 2080
+ background-color: rgba(0, 0, 0, 0.3)
+
+.algolia-popup
+ overflow: hidden
+ padding: 0
+ display: none
+ position: fixed
+ top: 10%
+ left: 50%
+ width: 700px
+ height: 80%
+ margin-left: -350px
+ background: #fff
+ color: #333
+ z-index: 9999
+ border-radius: 5px
+ +mobile()
+ padding: 0
+ top: 0
+ left: 0
+ margin: 0
+ width: 100%
+ height: 100%
+ border-radius: 0
+
+ .popup-btn-close
+ position: absolute
+ right: 14px
+ color: #4EBD79
+ font-size: 14px
+ font-weight: bold
+ text-transform: uppercase
+ cursor: pointer
+ padding-left: 15px
+ border-left: 1px solid #eee
+ top: 10px
+ .fa
+ color: $grey-dark
+ font-size: 18px
+ &:hover .fa
+ color: $black-deep
+
+.algolia-search
+ padding: 10px 15px 5px
+ max-height: 50px
+ border-bottom: 1px solid #ccc
+ background: $whitesmoke
+ border-top-left-radius: 5px
+ border-top-right-radius: 5px
+
+.algolia-search-input-icon
+ display: inline-block
+ width: 20px
+ .fa
+ font-size: 18px
+
+.algolia-search-input
+ display: inline-block
+ width: calc(90% - 20px)
+ input
+ padding: 5px 0
+ width: 100%
+ outline: none
+ border: none
+ background: transparent
+
+.algolia-powered
+ float: right
+ img
+ display: inline-block
+ height: 18px
+ vertical-align: middle
+
+.algolia-results
+ position: relative
+ overflow: auto
+ padding: 10px 30px
+ height: calc(100% - 50px)
+
+ hr
+ margin: 10px 0
+
+ .highlight
+ font-style: normal
+ margin: 0
+ padding: 0 2px
+ font-size: inherit
+ color: red
+
+.algolia-hits
+ margin-top: 20px
+
+.algolia-hit-item
+ margin: 15px 0
+
+.algolia-hit-item-link
+ display: block
+ border-bottom: 1px dashed #ccc
+ the-transition()
+
+.algolia-pagination
+ .pagination
+ margin-top: 40px
+ border-top: none
+ padding: 0
+ .pagination-item
+ display: inline-block
+ .page-number
+ border-top: none
+ &:hover
+ border-bottom: 1px solid $black-deep
+
+ .current .page-number
+ @extend .pagination .page-number.current
+
+ .disabled-item
+ visibility: hidden
+
diff --git a/themes/Next/source/css/_common/components/third-party/baidushare.styl b/themes/Next/source/css/_common/components/third-party/baidushare.styl
new file mode 100644
index 0000000..fc42b71
--- /dev/null
+++ b/themes/Next/source/css/_common/components/third-party/baidushare.styl
@@ -0,0 +1,12 @@
+.post-spread {
+ margin-top: 20px;
+ text-align: center;
+}
+
+.bdshare-slide-button-box a { border: none; }
+
+.bdsharebuttonbox {
+ display: inline-block;
+
+ a { border: none; }
+}
diff --git a/themes/Next/source/css/_common/components/third-party/busuanzi-counter.styl b/themes/Next/source/css/_common/components/third-party/busuanzi-counter.styl
new file mode 100644
index 0000000..960fef6
--- /dev/null
+++ b/themes/Next/source/css/_common/components/third-party/busuanzi-counter.styl
@@ -0,0 +1,30 @@
+if hexo-config("scheme") == Pisces
+ .busuanzi-count {
+ +tablet() {
+ width: auto;
+ }
+ +mobile() {
+ width: auto;
+ }
+ }
+
+.site-uv,
+.site-pv,
+.page-pv {
+ display: inline-block;
+
+ .busuanzi-value {
+ margin: 0 5px;
+ }
+}
+
+if hexo-config("busuanzi_count.site_pv") and hexo-config("busuanzi_count.site_uv")
+ .site-uv
+ {
+ margin-right: 10px;
+
+ &::after {
+ content: "|";
+ padding-left: 10px;
+ }
+ }
diff --git a/themes/Next/source/css/_common/components/third-party/duoshuo.styl b/themes/Next/source/css/_common/components/third-party/duoshuo.styl
new file mode 100644
index 0000000..3359518
--- /dev/null
+++ b/themes/Next/source/css/_common/components/third-party/duoshuo.styl
@@ -0,0 +1,290 @@
+
+.theme-next {
+ $duoshuoBaseBorderColor = #c7d4e1;
+ $duoshuoBaseBgColor = #f6f8fa;
+
+ #ds-thread #ds-reset {
+ color: #555;
+ }
+
+ #ds-thread #ds-reset .ds-replybox {
+ margin-bottom: 30px;
+ }
+
+ #ds-thread #ds-reset .ds-replybox .ds-avatar, #ds-reset .ds-avatar img {
+ box-shadow: none;
+ }
+
+ #ds-thread #ds-reset .ds-textarea-wrapper {
+ border-color: $duoshuoBaseBorderColor;
+ background: none;
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+ }
+
+
+ #ds-thread #ds-reset .ds-textarea-wrapper textarea {
+ height: 60px;
+ }
+
+ #ds-reset .ds-rounded-top {
+ border-radius: 0;
+ }
+
+ #ds-thread #ds-reset .ds-post-toolbar {
+ box-sizing: border-box;
+ border: 1px solid $duoshuoBaseBorderColor;
+ background: $duoshuoBaseBgColor;
+ }
+
+ #ds-thread #ds-reset .ds-post-options {
+ height: 40px;
+ border: none;
+ background: none;
+ }
+
+ #ds-thread #ds-reset .ds-toolbar-buttons {
+ top: 11px;
+ }
+
+ #ds-thread #ds-reset .ds-sync {
+ top: 5px;
+ }
+
+ #ds-thread #ds-reset .ds-post-button {
+ top: 4px;
+ right: 5px;
+ width: 90px;
+ height: 30px;
+ border: 1px solid #c5ced7;
+ border-radius: 3px;
+ background-image: linear-gradient(#fbfbfc, #f5f7f9);
+ color: #60676d;
+ }
+
+ #ds-thread #ds-reset .ds-post-button:hover {
+ background-position: 0 -30px;
+ color: #60676d;
+ }
+
+ #ds-thread #ds-reset .ds-comments-info {
+ padding: 10px 0;
+ }
+
+ #ds-thread #ds-reset .ds-sort {
+ display: none;
+ }
+
+ #ds-thread #ds-reset li.ds-tab a.ds-current {
+ border: none;
+ background: $duoshuoBaseBgColor;
+ color: #60676d;
+
+ &:hover {
+ background-color: #e9f0f7;
+ color: #60676d;
+ }
+ }
+
+ #ds-thread #ds-reset li.ds-tab a {
+ border-radius: 2px;
+ padding: 5px;
+ }
+
+ #ds-thread #ds-reset .ds-login-buttons p {
+ color: #999;
+ line-height: 36px;
+ }
+
+ #ds-thread #ds-reset .ds-login-buttons .ds-service-list li {
+ height: 28px;
+ }
+
+ #ds-thread #ds-reset .ds-service-list a {
+ background: none;
+ padding: 5px;
+ border: 1px solid;
+ border-radius: 3px;
+ text-align: center;
+
+ &:hover {
+ color: #fff;
+ background: #666;
+ }
+ }
+
+ #ds-thread #ds-reset .ds-service-list .ds-weibo {
+ color: #fc9b00;
+ border-color: #fc9b00;
+
+ &:hover {
+ background: #fc9b00;
+ }
+ }
+
+ #ds-thread #ds-reset .ds-service-list .ds-qq {
+ color: #60a3ec;
+ border-color: #60a3ec;
+
+ &:hover {
+ background: #60a3ec;
+ }
+ }
+
+ #ds-thread #ds-reset .ds-service-list .ds-renren {
+ color: #2e7ac4;
+ border-color: #2e7ac4;
+
+ &:hover {
+ background: #2e7ac4;
+ }
+ }
+
+ #ds-thread #ds-reset .ds-service-list .ds-douban {
+ color: #37994c;
+ border-color: #37994c;
+
+ &:hover {
+ background: #37994c;
+ }
+ }
+ #ds-thread #ds-reset .ds-service-list .ds-kaixin {
+ color: #fef20d;
+ border-color: #fef20d;
+
+ &:hover {
+ background: #fef20d;
+ }
+ }
+
+ #ds-thread #ds-reset .ds-service-list .ds-netease {
+ color: #f00;
+ border-color: #f00;
+
+ &:hover {
+ background: #f00;
+ }
+ }
+
+ #ds-thread #ds-reset .ds-service-list .ds-sohu {
+ color: #ffcb05;
+ border-color: #ffcb05;
+
+ &:hover {
+ background: #ffcb05;
+ }
+ }
+
+ #ds-thread #ds-reset .ds-service-list .ds-baidu {
+ color: #2831e0;
+ border-color: #2831e0;
+
+ &:hover {
+ background: #2831e0;
+ }
+ }
+
+ #ds-thread #ds-reset .ds-service-list .ds-google {
+ color: #166bec;
+ border-color: #166bec;
+
+ &:hover {
+ background: #166bec;
+ }
+ }
+
+ #ds-thread #ds-reset .ds-service-list .ds-weixin {
+ color: #00CE0D;
+ border-color: #00CE0D;
+
+ &:hover {
+ background: #00CE0D;
+ }
+ }
+ #ds-thread #ds-reset .ds-service-list .ds-more-services {
+ border: none;
+ &:hover {
+ background: none;
+ }
+ }
+
+/*duoshuo UA style begin*/
+
+ #ds-reset .duoshuo-ua-admin {
+ display: inline-block;
+ color: red;
+ }
+
+ #ds-reset .duoshuo-ua-platform,
+ #ds-reset .duoshuo-ua-browser {
+ color: #ccc;
+
+ .fa {
+ display: inline-block;
+ margin-right: 3px;
+ }
+ }
+
+ #ds-reset .duoshuo-ua-separator {
+ display: inline-block;
+ margin-left: 5px;
+ }
+
+ .this_ua {
+ background-color: #ccc !important;
+ border-radius: 4px;
+ padding: 0 5px !important;
+ margin: 1px 1px !important;
+ border: 1px solid #BBB !important;
+ color: #fff;
+ display: inline-block !important;
+ }
+
+ .this_ua.admin {
+ background-color: #d9534f !important;
+ border-color: #d9534f !important;
+ }
+
+ .this_ua.platform.iOS, .this_ua.platform.Mac, .this_ua.platform.Windows {
+ background-color: #39b3d7 !important;
+ border-color: #46b8da !important;
+ }
+
+ .this_ua.platform.Linux {
+ background-color: #3A3A3A !important;
+ border-color: #1F1F1F !important;
+ }
+
+ .this_ua.platform.Android {
+ background-color: #00C47D !important;
+ border-color: #01B171 !important;
+ }
+
+ .this_ua.browser.Mobile, .this_ua.browser.Chrome {
+ background-color: #5cb85c !important;
+ border-color: #4cae4c !important;
+ }
+
+ .this_ua.browser.Firefox {
+ background-color: #f0ad4e !important;
+ border-color: #eea236 !important;
+ }
+
+ .this_ua.browser.Maxthon, .this_ua.browser.IE {
+ background-color: #428bca !important;
+ border-color: #357ebd !important;
+ }
+
+ .this_ua.browser.baidu, .this_ua.browser.UCBrowser, .this_ua.browser.Opera {
+ background-color: #d9534f !important;
+ border-color: #d43f3a !important;
+ }
+
+ .this_ua.browser.Android, .this_ua.browser.QQBrowser {
+ background-color: #78ACE9 !important;
+ border-color: #4cae4c !important;
+ }
+
+/*duoshuo UA style end*/
+
+}
diff --git a/themes/Next/source/css/_common/components/third-party/gitment.styl b/themes/Next/source/css/_common/components/third-party/gitment.styl
new file mode 100644
index 0000000..52babf0
--- /dev/null
+++ b/themes/Next/source/css/_common/components/third-party/gitment.styl
@@ -0,0 +1,13 @@
+#gitment-display-button{
+ display: inline-block;
+ padding: 0 15px;
+ color: #0a9caf;
+ cursor: pointer;
+ font-size: 14px;
+ border: 1px solid #0a9caf;
+ border-radius: 4px;
+}
+#gitment-display-button:hover{
+ color: #fff;
+ background: #0a9caf;
+}
\ No newline at end of file
diff --git a/themes/Next/source/css/_common/components/third-party/han.styl b/themes/Next/source/css/_common/components/third-party/han.styl
new file mode 100644
index 0000000..d02c969
--- /dev/null
+++ b/themes/Next/source/css/_common/components/third-party/han.styl
@@ -0,0 +1,3 @@
+.fa {
+ font-family: FontAwesome!important;
+}
diff --git a/themes/Next/source/css/_common/components/third-party/jiathis.styl b/themes/Next/source/css/_common/components/third-party/jiathis.styl
new file mode 100644
index 0000000..d501fb5
--- /dev/null
+++ b/themes/Next/source/css/_common/components/third-party/jiathis.styl
@@ -0,0 +1,10 @@
+.post-spread {
+ margin-top: 20px;
+ text-align: center;
+}
+
+.jiathis_style {
+ display: inline-block;
+
+ a { border: none; }
+}
\ No newline at end of file
diff --git a/themes/Next/source/css/_common/components/third-party/localsearch.styl b/themes/Next/source/css/_common/components/third-party/localsearch.styl
new file mode 100644
index 0000000..85f43cf
--- /dev/null
+++ b/themes/Next/source/css/_common/components/third-party/localsearch.styl
@@ -0,0 +1,102 @@
+.local-search-pop-overlay
+ position: fixed
+ width: 100%
+ height: 100%
+ top: 0
+ left: 0
+ z-index: 2080
+ background-color: rgba(0, 0, 0, 0.3)
+
+.local-search-popup
+ display: none
+ position: fixed
+ top: 10%
+ left: 50%
+ margin-left: -350px
+ width: 700px
+ height: 80%
+ padding: 0
+ background: #fff
+ color: #333
+ z-index: 9999
+ border-radius: 5px
+ +mobile()
+ padding: 0
+ top: 0
+ left: 0
+ margin: 0
+ width: 100%
+ height: 100%
+ border-radius: 0
+
+ ul.search-result-list
+ padding: 0
+ margin: 0 5px
+
+ p.search-result
+ border-bottom: 1px dashed #ccc
+ padding: 5px 0
+
+ a.search-result-title
+ font-weight: bold
+ font-size: 16px
+
+ .search-keyword
+ border-bottom: 1px dashed #f00
+ font-weight: bold
+ color: #f00
+
+ .local-search-header
+ padding: 5px
+ height: 36px
+ background: #f5f5f5
+ border-top-left-radius: 5px
+ border-top-right-radius: 5px
+
+ #local-search-result
+ overflow: auto
+ position: relative
+ padding: 5px 25px
+ height: calc(100% - 55px)
+
+ .local-search-input-wrapper
+ display: inline-block
+ width: calc(100% - 90px)
+ height: 36px
+ line-height: 36px
+ padding: 0 5px
+
+ .local-search-input-wrapper input
+ padding: 8px 0
+ height: 20px
+ display: block
+ width: 100%
+ outline: none
+ border: none
+ background: transparent
+ vertical-align: middle
+
+ .search-icon, .popup-btn-close
+ display: inline-block
+ font-size: 18px
+ color: #999
+ height: 36px
+ width: 18px
+ padding-left: 10px
+ padding-right: 10px
+
+ .search-icon
+ float: left
+
+ .popup-btn-close
+ border-left: 1px solid #eee
+ float: right
+ cursor: pointer
+
+ #no-result
+ position: absolute
+ left: 50%
+ top: 50%
+ -webkit-transform: translate(-50%, -50%)
+ transform: translate(-50%, -50%)
+ color: #ccc
diff --git a/themes/Next/source/css/_common/components/third-party/needsharebutton.styl b/themes/Next/source/css/_common/components/third-party/needsharebutton.styl
new file mode 100644
index 0000000..2caae44
--- /dev/null
+++ b/themes/Next/source/css/_common/components/third-party/needsharebutton.styl
@@ -0,0 +1,27 @@
+#needsharebutton-postbottom {
+ position: relative;
+ cursor: pointer;
+ height: 26px;
+
+ .btn {
+ display: initial;
+ padding: 1px 4px;
+ border: 1px solid $btn-default-border-color;
+ border-radius: 3px;
+ }
+}
+
+#needsharebutton-float {
+ position: fixed;
+ bottom: 38px;
+ left: -8px;
+ z-index: 9999;
+ cursor: pointer;
+
+ .btn {
+ //display: initial;
+ padding: 0 10px 0 14px
+ border: 1px solid $btn-default-border-color;
+ border-radius: 4px;
+ }
+}
diff --git a/themes/Next/source/css/_common/components/third-party/third-party.styl b/themes/Next/source/css/_common/components/third-party/third-party.styl
new file mode 100644
index 0000000..c2298d0
--- /dev/null
+++ b/themes/Next/source/css/_common/components/third-party/third-party.styl
@@ -0,0 +1,9 @@
+@import "duoshuo";
+@import "gitment" if hexo-config('gitment.enable');
+@import "jiathis";
+@import "han";
+@import "baidushare";
+@import "localsearch";
+@import "busuanzi-counter";
+@import "algolia-search" if hexo-config('algolia_search.enable');
+@import "needsharebutton" if hexo-config('needmoreshare2.enable');
diff --git a/themes/Next/source/css/_common/outline/outline.styl b/themes/Next/source/css/_common/outline/outline.styl
new file mode 100644
index 0000000..7337e18
--- /dev/null
+++ b/themes/Next/source/css/_common/outline/outline.styl
@@ -0,0 +1,58 @@
+//
+// Layout
+// Note: Must name this file "outline" instead of "layout"
+// Or Hexo will use it as template layout.
+// =================================================
+
+
+html, body { height: 100%; }
+
+.container {
+ position: relative;
+ min-height: 100%;
+}
+
+
+// Header Section
+// --------------------------------------------------
+.header-inner {
+ margin: 0 auto;
+ padding: 100px 0 70px;
+ width: $content-desktop;
+
+ +desktop-large() {
+ .container & { width: $content-desktop-large; }
+ }
+}
+
+// Main Section
+// --------------------------------------------------
+.main { padding-bottom: $footer-height + $gap-between-main-and-footer; }
+.main-inner {
+ margin: 0 auto;
+ width: $content-desktop;
+
+ +desktop-large() {
+ .container & { width: $content-desktop-large; }
+ }
+}
+
+
+// Footer Section
+// --------------------------------------------------
+.footer {
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ width: 100%;
+ min-height: $footer-height;
+}
+.footer-inner {
+ box-sizing: border-box;
+ margin: 20px auto;
+ width: $content-desktop;
+
+ +desktop-large() {
+ .container & { width: $content-desktop-large; }
+ }
+}
diff --git a/themes/Next/source/css/_common/scaffolding/base.styl b/themes/Next/source/css/_common/scaffolding/base.styl
new file mode 100644
index 0000000..74c77e3
--- /dev/null
+++ b/themes/Next/source/css/_common/scaffolding/base.styl
@@ -0,0 +1,111 @@
+
+::selection {
+ background: $selection-bg;
+ color: $selection-color;
+}
+
+body {
+ position: relative; // Required by scrollspy
+ font-family: $font-family-base;
+ font-size: $font-size-base;
+ line-height: $line-height-base;
+ color: $text-color;
+ background: $body-bg-color;
+
+ +mobile() { padding-right: 0 !important; }
+ +tablet() { padding-right: 0 !important; }
+ +desktop-large() { font-size: $font-size-large; }
+}
+
+h1, h2, h3, h4, h5, h6 {
+ margin: 0;
+ padding: 0;
+ font-weight: bold;
+ line-height: 1.5;
+ font-family: $font-family-headings;
+}
+
+h2, h3, h4, h5, h6 { margin: 20px 0 15px; }
+
+for headline in (1..6) {
+ h{headline} {
+ font-size: $font-size-headings-base - $font-size-headings-step * headline;
+ }
+
+ +mobile() {
+ h{headline} {
+ font-size: $font-size-headings-base - $font-size-headings-step * headline - 4px;
+ }
+ }
+}
+
+p { margin: 0 0 20px 0; }
+
+a {
+ color: $link-color;
+ text-decoration: none;
+ outline: none;
+ border-bottom: 1px solid $grey-dark;
+ word-wrap: break-word;
+
+ &:hover {
+ color: $link-hover-color;
+ border-bottom-color: $link-decoration-hover-color;
+ }
+}
+
+blockquote {
+ margin: 0;
+ padding: 0;
+}
+
+img {
+ display: block;
+ margin: auto;
+ max-width: 100%;
+ height: auto;
+}
+
+
+hr {
+ margin: 40px 0;
+ height: 3px;
+ border: none;
+ background-color: $gray-lighter;
+ background-image: repeating-linear-gradient(
+ -45deg,
+ white,
+ white 4px,
+ transparent 4px,
+ transparent 8px
+ );
+}
+
+blockquote {
+ padding: 0 15px;
+ color: $grey-dim;
+ border-left: 4px solid $gray-lighter;
+
+ cite::before {
+ content: "-";
+ padding: 0 5px;
+ }
+}
+
+dt { font-weight: $font-weight-bolder; }
+
+dd {
+ margin: 0;
+ padding: 0;
+}
+
+kbd {
+ border: 1px solid $grey-light;
+ border-radius: 0.2em;
+ box-shadow: 0.1em 0.1em 0.2em rgba(0,0,0,0.1);
+ background-color: #f9f9f9;
+ font-family: inherit;
+ background-image: -webkit-linear-gradient(top, #eee, white, #eee);
+ padding: 0.1em 0.3em;
+ white-space: nowrap;
+}
diff --git a/themes/Next/source/css/_common/scaffolding/helpers.styl b/themes/Next/source/css/_common/scaffolding/helpers.styl
new file mode 100644
index 0000000..a00d0bb
--- /dev/null
+++ b/themes/Next/source/css/_common/scaffolding/helpers.styl
@@ -0,0 +1,67 @@
+//
+// Helpers
+// =================================================
+
+
+
+// Alignment
+.text-left { text-align: left; }
+.text-center { text-align: center; }
+.text-right { text-align: right; }
+.text-justify { text-align: justify; }
+.text-nowrap { white-space: nowrap; }
+
+
+// Transformation
+.text-lowercase { text-transform: lowercase; }
+.text-uppercase { text-transform: uppercase; }
+.text-capitalize { text-transform: capitalize; }
+
+
+// Center-align a block level element.
+.center-block {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+
+// Clearfix. http://nicolasgallagher.com/micro-clearfix-hack/
+.clearfix {
+ clearfix();
+}
+
+.pullquote {
+ width: 45%;
+
+ &.left {
+ float: left;
+ margin-left: 5px;
+ margin-right: 10px;
+ }
+
+ &.right {
+ float: right;
+ margin-left: 10px;
+ margin-right: 5px;
+ }
+}
+
+.affix.affix.affix { position: fixed; }
+
+.translation {
+ margin-top: -20px;
+ font-size: 14px;
+ color: $grey-dark;
+}
+
+// https://davidwalsh.name/detect-scrollbar-width
+.scrollbar-measure {
+ width: 100px;
+ height: 100px;
+ overflow: scroll;
+ position: absolute;
+ top: -9999px;
+}
+
+.use-motion .motion-element { opacity: 0; }
diff --git a/themes/Next/source/css/_common/scaffolding/mobile.styl b/themes/Next/source/css/_common/scaffolding/mobile.styl
new file mode 100644
index 0000000..191fbfd
--- /dev/null
+++ b/themes/Next/source/css/_common/scaffolding/mobile.styl
@@ -0,0 +1,121 @@
+/*
+// > 1600px
++desktop-large() {
+
+}
+
+// > 992px
++desktop() {
+
+}
+
+// > 768px & < 991px
++tablet() {
+
+}
+
+
+// < 767px
++mobile() {
+
+}
+*/
+
+// < 567px
++mobile-small() {
+
+ // For Muse & Mist schemes only vertical economy.
+ .header-inner {
+ margin-bottom: initial !important;
+ }
+ .main-inner {
+ margin-top: initial !important;
+ }
+
+ // For Pisces & Gemini schemes only wider width (remove main blocks in Gemini).
+ .content-wrap {
+ padding: initial !important;
+ }
+
+ // For all schemes wider width.
+ .posts-expand {
+ padding-top: $content-mobile-padding !important;
+ // For Muse & Mist & Pisces schemes only wider width.
+ margin: initial !important;
+
+ .post-header {
+ padding: 0 18px;
+ }
+
+ .post-meta {
+ margin: 3px 0 10px 0 !important;
+ }
+
+ }
+
+ .post-block {
+ // Inside posts blocks content padding (default 40px).
+ padding: $content-mobile-padding 0 !important;
+ }
+
+ .post-body {
+ // For headers narrow width.
+ h2, h3, h4, h5, h6 {
+ margin: 10px 18px 8px;
+ }
+ // Rewrite paddings & margins inside tags.
+ .note, .tabs .tab-content .tab-pane {
+ h2, h3, h4, h5, h6 {
+ margin: 0 5px;
+ }
+ }
+
+ // For paragraphs narrow width.
+ p {
+ margin: 0 0 10px 0;
+ padding: 0 18px;
+ }
+
+ // Rewrite paddings & margins inside tags.
+ .note > p, .tabs .tab-content .tab-pane > p {
+ padding: 0 5px;
+ }
+
+ .video-container .fluid-vids {
+ margin-bottom: 10px !important;
+ }
+
+ .note {
+ padding: 10px !important;
+ margin-bottom: 10px !important;
+
+ if hexo-config('note.icons') {
+ &:not(.no-icon) {
+ padding-left: 35px !important;
+ &:before {
+ top: 8px !important;
+ left: 12px !important;
+ }
+ }
+ }
+ }
+
+ .tabs .tab-content .tab-pane {
+ padding: 10px 10px 0 10px !important;
+ }
+ }
+
+ // Need to refactor into flex.
+ .post-nav {
+ padding-bottom: 2px;
+ //padding: 2px 8px;
+ }
+
+}
+
+/*
+// < 413px
++mobile-smallest() {
+
+}
+*/
diff --git a/themes/Next/source/css/_common/scaffolding/normalize.styl b/themes/Next/source/css/_common/scaffolding/normalize.styl
new file mode 100644
index 0000000..81c6f31
--- /dev/null
+++ b/themes/Next/source/css/_common/scaffolding/normalize.styl
@@ -0,0 +1,427 @@
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+
+/**
+ * 1. Set default font family to sans-serif.
+ * 2. Prevent iOS text size adjust after orientation change, without disabling
+ * user zoom.
+ */
+
+html {
+ font-family: sans-serif; /* 1 */
+ -ms-text-size-adjust: 100%; /* 2 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/**
+ * Remove default margin.
+ */
+
+body {
+ margin: 0;
+}
+
+/* HTML5 display definitions
+ ========================================================================== */
+
+/**
+ * Correct `block` display not defined for any HTML5 element in IE 8/9.
+ * Correct `block` display not defined for `details` or `summary` in IE 10/11
+ * and Firefox.
+ * Correct `block` display not defined for `main` in IE 11.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+ display: block;
+}
+
+/**
+ * 1. Correct `inline-block` display not defined in IE 8/9.
+ * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
+ */
+
+audio,
+canvas,
+progress,
+video {
+ display: inline-block; /* 1 */
+ vertical-align: baseline; /* 2 */
+}
+
+/**
+ * Prevent modern browsers from displaying `audio` without controls.
+ * Remove excess height in iOS 5 devices.
+ */
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+/**
+ * Address `[hidden]` styling not present in IE 8/9/10.
+ * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
+ */
+
+[hidden],
+template {
+ display: none;
+}
+
+/* Links
+ ========================================================================== */
+
+/**
+ * Remove the gray background color from active links in IE 10.
+ */
+
+a {
+ background-color: transparent;
+}
+
+/**
+ * Improve readability when focused and also mouse hovered in all browsers.
+ */
+
+a:active,
+a:hover {
+ outline: 0;
+}
+
+/* Text-level semantics
+ ========================================================================== */
+
+/**
+ * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
+ */
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+/**
+ * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
+ */
+
+b,
+strong {
+ font-weight: bold;
+}
+
+/**
+ * Address styling not present in Safari and Chrome.
+ */
+
+dfn {
+ font-style: italic;
+}
+
+/**
+ * Address variable `h1` font-size and margin within `section` and `article`
+ * contexts in Firefox 4+, Safari, and Chrome.
+ */
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+/**
+ * Address styling not present in IE 8/9.
+ */
+
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+/**
+ * Address inconsistent and variable font size in all browsers.
+ */
+
+small {
+ font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
+ */
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+/* Embedded content
+ ========================================================================== */
+
+/**
+ * Remove border when inside `a` element in IE 8/9/10.
+ */
+
+img {
+ border: 0;
+}
+
+/**
+ * Correct overflow not hidden in IE 9/10/11.
+ */
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+/* Grouping content
+ ========================================================================== */
+
+/**
+ * Address margin not present in IE 8/9 and Safari.
+ */
+
+figure {
+ margin: 1em 40px;
+}
+
+/**
+ * Address differences between Firefox and other browsers.
+ */
+
+hr {
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ height: 0;
+}
+
+/**
+ * Contain overflow in all browsers.
+ */
+
+pre {
+ overflow: auto;
+}
+
+/**
+ * Address odd `em`-unit font size rendering in all browsers.
+ */
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+
+/* Forms
+ ========================================================================== */
+
+/**
+ * Known limitation: by default, Chrome and Safari on OS X allow very limited
+ * styling of `select`, unless a `border` property is set.
+ */
+
+/**
+ * 1. Correct color not being inherited.
+ * Known issue: affects color of disabled elements.
+ * 2. Correct font properties not being inherited.
+ * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ color: inherit; /* 1 */
+ font: inherit; /* 2 */
+ margin: 0; /* 3 */
+}
+
+/**
+ * Address `overflow` set to `hidden` in IE 8/9/10/11.
+ */
+
+button {
+ overflow: visible;
+}
+
+/**
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
+ * All other form control elements do not inherit `text-transform` values.
+ * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
+ * Correct `select` style inheritance in Firefox.
+ */
+
+button,
+select {
+ text-transform: none;
+}
+
+/**
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+ * and `video` controls.
+ * 2. Correct inability to style clickable `input` types in iOS.
+ * 3. Improve usability and consistency of cursor style between image-type
+ * `input` and others.
+ */
+
+button,
+html input[type="button"], /* 1 */
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button; /* 2 */
+ cursor: pointer; /* 3 */
+}
+
+/**
+ * Re-set default cursor for disabled elements.
+ */
+
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+
+/**
+ * Remove inner padding and border in Firefox 4+.
+ */
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+/**
+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in
+ * the UA stylesheet.
+ */
+
+input {
+ line-height: normal;
+}
+
+/**
+ * It's recommended that you don't attempt to style these elements.
+ * Firefox's implementation doesn't respect box-sizing, padding, or width.
+ *
+ * 1. Address box sizing set to `content-box` in IE 8/9/10.
+ * 2. Remove excess padding in IE 8/9/10.
+ */
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Fix the cursor style for Chrome's increment/decrement buttons. For certain
+ * `font-size` values of the `input`, it causes the cursor style of the
+ * decrement button to change from `default` to `text`.
+ */
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/**
+ * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
+ * 2. Address `box-sizing` set to `border-box` in Safari and Chrome
+ * (include `-moz` to future-proof).
+ */
+
+input[type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ -moz-box-sizing: content-box;
+ -webkit-box-sizing: content-box; /* 2 */
+ box-sizing: content-box;
+}
+
+/**
+ * Remove inner padding and search cancel button in Safari and Chrome on OS X.
+ * Safari (but not Chrome) clips the cancel button when the search input has
+ * padding (and `textfield` appearance).
+ */
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/**
+ * Define consistent border, margin, and padding.
+ */
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+/**
+ * 1. Correct `color` not being inherited in IE 8/9/10/11.
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
+ */
+
+legend {
+ border: 0; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Remove default vertical scrollbar in IE 8/9/10/11.
+ */
+
+textarea {
+ overflow: auto;
+}
+
+/**
+ * Don't inherit the `font-weight` (applied by a rule above).
+ * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
+ */
+
+optgroup {
+ font-weight: bold;
+}
+
+/* Tables
+ ========================================================================== */
+
+/**
+ * Remove most spacing between table cells.
+ */
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+td,
+th {
+ padding: 0;
+}
\ No newline at end of file
diff --git a/themes/Next/source/css/_common/scaffolding/scaffolding.styl b/themes/Next/source/css/_common/scaffolding/scaffolding.styl
new file mode 100644
index 0000000..b5d3500
--- /dev/null
+++ b/themes/Next/source/css/_common/scaffolding/scaffolding.styl
@@ -0,0 +1,9 @@
+//
+// Scaffolding
+// =================================================
+
+@import "normalize";
+@import "base";
+@import "helpers";
+@import "tables";
+@import "mobile" if hexo-config('mobile_layout_economy');
diff --git a/themes/Next/source/css/_common/scaffolding/tables.styl b/themes/Next/source/css/_common/scaffolding/tables.styl
new file mode 100644
index 0000000..c653b81
--- /dev/null
+++ b/themes/Next/source/css/_common/scaffolding/tables.styl
@@ -0,0 +1,33 @@
+table {
+ margin: 20px 0;
+ width: $table-width;
+ border-collapse: collapse;
+ border-spacing: 0;
+ border: 1px solid $table-border-color;
+ font-size: $table-font-size;
+ table-layout: fixed;
+ word-wrap: break-all;
+}
+table>tbody>tr {
+ &:nth-of-type(odd) { background-color: $table-row-odd-bg-color; }
+ &:hover { background-color: $table-row-hover-bg-color; }
+}
+
+caption, th, td {
+ padding: $table-cell-padding;
+ text-align: $table-content-alignment;
+ vertical-align: $table-content-vertical;
+ font-weight: normal;
+}
+
+th, td {
+ border-bottom: 3px solid $table-cell-border-bottom-color;
+ border-right: 1px solid $table-cell-border-right-color;
+}
+
+th {
+ padding-bottom: 10px;
+ font-weight: $table-th-font-weight;
+}
+
+td { border-bottom-width: 1px; }
diff --git a/themes/Next/source/css/_custom/custom.styl b/themes/Next/source/css/_custom/custom.styl
new file mode 100644
index 0000000..d39efb3
--- /dev/null
+++ b/themes/Next/source/css/_custom/custom.styl
@@ -0,0 +1,26 @@
+// Custom styles.
+
+// 主页文章添加阴影效果
+ .post {
+ margin-top: 60px;
+ margin-bottom: 60px;
+ padding: 25px;
+ -webkit-box-shadow: 0 0 5px rgba(202, 203, 203, .5);
+ -moz-box-shadow: 0 0 5px rgba(202, 203, 204, .5);
+ }
+
+// Custom styles.
+code {
+ color: #ff7600;
+ background: #fbf7f8;
+ margin: 2px;
+}
+// 大代码块的自定义样式
+.highlight, pre {
+ margin: 5px 0;
+ padding: 5px;
+ border-radius: 3px;
+}
+.highlight, code, pre {
+ border: 1px solid #d6d6d6;
+}
diff --git a/themes/Next/source/css/_mixins/Gemini.styl b/themes/Next/source/css/_mixins/Gemini.styl
new file mode 100644
index 0000000..eb4102e
--- /dev/null
+++ b/themes/Next/source/css/_mixins/Gemini.styl
@@ -0,0 +1 @@
+@import "Pisces.styl";
diff --git a/themes/Next/source/css/_mixins/Mist.styl b/themes/Next/source/css/_mixins/Mist.styl
new file mode 100644
index 0000000..e69de29
diff --git a/themes/Next/source/css/_mixins/Muse.styl b/themes/Next/source/css/_mixins/Muse.styl
new file mode 100644
index 0000000..e69de29
diff --git a/themes/Next/source/css/_mixins/Pisces.styl b/themes/Next/source/css/_mixins/Pisces.styl
new file mode 100644
index 0000000..34543b1
--- /dev/null
+++ b/themes/Next/source/css/_mixins/Pisces.styl
@@ -0,0 +1,17 @@
+sidebar-inline-links-item() {
+ margin: 5px 0 0;
+ if !hexo-config('social_icons.icons_only') { width: 50%; }
+
+ & a {
+ max-width: 216px;
+ box-sizing: border-box;
+ display: inline-block;
+ margin-right: 0;
+ margin-bottom: 0;
+ padding: 0 5px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ if hexo-config('social_icons.transition') { the-transition(); }
+ }
+}
diff --git a/themes/Next/source/css/_mixins/base.styl b/themes/Next/source/css/_mixins/base.styl
new file mode 100644
index 0000000..0e787f7
--- /dev/null
+++ b/themes/Next/source/css/_mixins/base.styl
@@ -0,0 +1,92 @@
+the-transition() {
+ transition-duration: 0.2s;
+ transition-timing-function: ease-in-out;
+ transition-delay: 0s;
+}
+
+the-transition-ease-in() {
+ transition-duration: 0.2s;
+ transition-timing-function: ease-in;
+ transition-delay: 0s;
+}
+
+the-transition-ease-out() {
+ transition-duration: 0.2s;
+ transition-timing-function: ease-out;
+ transition-delay: 0s;
+}
+
+mobile-smallest() {
+ @media (max-width: 413px) {
+ {block}
+ }
+}
+
+mobile-small() {
+ @media (max-width: 567px) {
+ {block}
+ }
+}
+
+mobile() {
+ @media (max-width: 767px) {
+ {block}
+ }
+}
+
+tablet() {
+ @media (min-width: 768px) and (max-width: 991px) {
+ {block}
+ }
+}
+
+desktop() {
+ @media (min-width: 992px) {
+ {block}
+ }
+}
+
+desktop-large() {
+ @media (min-width: 1600px) {
+ {block}
+ }
+}
+
+circle() {
+ border-radius: 50%;
+}
+
+transform() {
+ -webkit-transform: arguments
+ -moz-transform: arguments
+ -ms-transform: arguments
+ -o-transform: arguments
+ transform: arguments
+}
+
+hide() {
+ display: none !important;
+}
+
+show() {
+ display: block !important;
+}
+
+fixbutton() {
+ right: 20px;
+ opacity: 0.8;
+}
+
+random-color($min, $max) {
+ return floor(math(0, 'random') * ($max - $min + 1) + $min);
+}
+
+// Clearfix. http://nicolasgallagher.com/micro-clearfix-hack/
+clearfix() {
+ &:before,
+ &:after {
+ content: " ";
+ display: table;
+ }
+ &:after { clear: both; }
+}
diff --git a/themes/Next/source/css/_mixins/custom.styl b/themes/Next/source/css/_mixins/custom.styl
new file mode 100644
index 0000000..e69de29
diff --git a/themes/Next/source/css/_schemes/Gemini/index.styl b/themes/Next/source/css/_schemes/Gemini/index.styl
new file mode 100644
index 0000000..95dd34d
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Gemini/index.styl
@@ -0,0 +1,243 @@
+@import "../Pisces/_layout";
+@import "../Pisces/_brand";
+@import "../Pisces/_menu";
+@import "../Pisces/_sidebar";
+// Import _posts if want to justify text-align on mobile.
+//@import "../Pisces/_posts";
+
+// =================================================
+// Rewrite _layout.styl
+// =================================================
+// Sidebar padding used as main desktop content padding for sidebar padding and post blocks padding too.
+
+// In main NexT config set `sidebar: offset: 12` option as main padding.
+// In `source/css/_variables/Gemini.styl` there are variables for other resolutions:
+// $content-tablet-paddin = 10px;
+// $content-mobile-padding = 8px;
+// P.S. If u want to change this paddings u may set this variables into `source/css/_variables/custom.styl`.
+
+// So, it will 12px in Desktop, 10px in Tablets and 8px in Mobiles for all possible paddings.
+// =================================================
+// Read values from NexT config and set they as local variables to use as string variables (in any CSS section).
+hexo-config('sidebar.offset') is a 'unit' ? (sboffset = unit(hexo-config('sidebar.offset'), px)) : (sboffset = 0)
+use_seo = hexo-config('seo');
+
+// =================================================
+// Desktop layout styles.
+// =================================================
+// Post blocks.
+.content-wrap {
+ padding: initial;
+ background: initial;
+ box-shadow: initial;
+ border-radius: initial;
+}
+
+// Post & Comments blocks.
+.post-block {
+ padding: $content-desktop-padding;
+ background: white;
+ box-shadow: $box-shadow-inner;
+ border-radius: $border-radius-inner;
+}
+
+// When blocks are siblings (homepage).
+#posts > article + article {
+ .post-block {
+ margin-top: sboffset;
+ // Rewrite shadows & borders because all blocks have offsets.
+ box-shadow: $box-shadow;
+ border-radius: $border-radius;
+ }
+}
+
+// Comments blocks.
+.comments {
+ padding: $content-desktop-padding;
+ margin: initial;
+ margin-top: sboffset;
+ background: white;
+ box-shadow: $box-shadow;
+ border-radius: $border-radius;
+}
+
+// Top main padding from header to posts (default 40px).
+.posts-expand {
+ padding-top: initial;
+}
+
+// Post navigation items.
+.post-nav-divider {
+ width: 4%;
+}
+.post-nav-item {
+ width: 48%;
+}
+
+// Post delimiters.
+.post-eof,
+.post-spread {
+ hide();
+}
+
+// Pagination.
+.pagination {
+ .prev, .next, .page-number {
+ margin-bottom: initial;
+ top: initial;
+ }
+ margin: sboffset 0 0;
+ border-top: initial;
+ background: white;
+ box-shadow: $box-shadow;
+ border-radius: $border-radius;
+ padding: 10px 0 10px;
+}
+
+// Footer alignment.
+.main {
+ padding-bottom: initial;
+}
+.footer {
+ bottom: auto;
+}
+
+// =================================================
+// Headers.
+// =================================================
+// No need anymore?
+.post-header {
+ h1, h2 {
+ margin: initial;
+ }
+}
+.posts-expand .post-title-link {
+ line-height: inherit;
+}
+.posts-expand .post-title {
+ font-size: 1.7em;
+}
+.post-body {
+ h1 {
+ font-size: 1.6em;
+ border-bottom: 1px solid $body-bg-color;
+ }
+ h2 {
+ font-size: 1.45em;
+ border-bottom: 1px solid $body-bg-color;
+ }
+ h3 {
+ font-size: 1.3em;
+ if use_seo {
+ border-bottom: 1px solid $body-bg-color;
+ } else {
+ border-bottom: 1px dotted $body-bg-color;
+ }
+ }
+ h4 {
+ font-size: 1.2em;
+ if use_seo {
+ border-bottom: 1px dotted $body-bg-color;
+ }
+ }
+ h5 {
+ font-size: 1.07em;
+ }
+ h6 {
+ font-size: 1.03em;
+ }
+}
+
+// =================================================
+// > 768px & < 991px
+// =================================================
++tablet() {
+
+ // Posts in blocks.
+ .content-wrap {
+ padding: $content-tablet-padding;
+ }
+ .posts-expand {
+ margin: initial;
+
+ // Components inside Posts.
+ .post-button {
+ margin-top: ($content-tablet-padding * 2);
+ }
+ }
+
+ .post-block {
+ // Inside posts blocks content padding (default 40px).
+ padding: ($content-tablet-padding * 2);
+ // Rewrite shadows & borders because all blocks have offsets.
+ box-shadow: $box-shadow;
+ border-radius: $border-radius;
+ }
+
+ // Only if blocks are siblings need bottom margin (homepage).
+ #posts > article + article {
+ .post-block {
+ margin-top: $content-tablet-padding;
+ }
+ }
+
+ .comments {
+ margin-top: $content-tablet-padding;
+ padding: $content-tablet-padding ($content-tablet-padding * 2);
+ //padding: initial;
+ //padding-top: $content-tablet-padding;
+ }
+
+ .pagination {
+ margin: $content-tablet-padding 0 0;
+ }
+
+}
+// =================================================
+// < 767px
+// =================================================
++mobile() {
+
+ // Posts in blocks.
+ .content-wrap {
+ padding: $content-mobile-padding;
+ }
+ .posts-expand {
+ margin: initial;
+
+ // Components inside Posts.
+ .post-button {
+ margin-top: sboffset;
+ //padding-bottom : 15px;
+ }
+ img {
+ padding: initial !important;
+ }
+ }
+
+ .post-block {
+ // Inside posts blocks content padding (default 40px).
+ padding: sboffset;
+ min-height: auto;
+ // Rewrite shadows & borders because all blocks have offsets.
+ box-shadow: $box-shadow;
+ border-radius: $border-radius;
+ }
+
+ // Only if blocks are siblings need bottom margin (homepage).
+ #posts > article + article {
+ .post-block {
+ margin-top: $content-mobile-padding;
+ }
+ }
+
+ .comments {
+ margin-top: $content-mobile-padding;
+ padding: 0 sboffset;
+ }
+
+ .pagination {
+ margin: $content-mobile-padding 0 0;
+ }
+
+}
diff --git a/themes/Next/source/css/_schemes/Mist/_base.styl b/themes/Next/source/css/_schemes/Mist/_base.styl
new file mode 100644
index 0000000..97dc4cb
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Mist/_base.styl
@@ -0,0 +1,12 @@
+// Tags
+// --------------------------------------------------
+h1, h2, h3, h4, h5, h6 { margin: 20px 0 10px; }
+
+p { margin: 0 0 25px 0; }
+
+a { border-bottom-color: $grey-light; }
+
+hr {
+ margin: 20px 0;
+ height: 2px;
+}
diff --git a/themes/Next/source/css/_schemes/Mist/_header.styl b/themes/Next/source/css/_schemes/Mist/_header.styl
new file mode 100644
index 0000000..a191649
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Mist/_header.styl
@@ -0,0 +1,63 @@
+// Header
+// --------------------------------------------------
+.header { background: $whitesmoke; }
+.header-inner {
+ padding: 25px 0 20px;
+ clearfix();
+
+ +mobile() {
+ width: auto;
+ margin-bottom: 50px;
+ padding: 10px;
+ }
+}
+
+.site-meta {
+ float: left;
+ margin-left: -20px;
+ line-height: normal;
+
+ +mobile() {
+ margin-left: 10px;
+ }
+
+ .brand {
+ padding: 2px 1px;
+ background: none;
+
+ +mobile() { display: block; }
+ }
+
+ .logo { display: none; }
+
+ .site-title {
+ font-size: 22px;
+ font-weight: bolder;
+
+ +mobile() { line-height: 34px; }
+ }
+}
+
+
+.logo-line-before,
+.logo-line-after {
+ display: block;
+ overflow: hidden;
+ margin: 0 auto;
+ width: 75%;
+
+ +mobile() { display: none; }
+
+ i {
+ position: relative;
+ display: block;
+ height: 2px;
+ background: $black-deep;
+ +mobile() { height: 3px; }
+ }
+}
+
+.use-motion {
+ .logo-line-before i { left: -100%; }
+ .logo-line-after i { right: -100%; }
+}
diff --git a/themes/Next/source/css/_schemes/Mist/_logo.styl b/themes/Next/source/css/_schemes/Mist/_logo.styl
new file mode 100644
index 0000000..571b407
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Mist/_logo.styl
@@ -0,0 +1 @@
+.site-subtitle { display: none; }
diff --git a/themes/Next/source/css/_schemes/Mist/_menu.styl b/themes/Next/source/css/_schemes/Mist/_menu.styl
new file mode 100644
index 0000000..fa0cd4e
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Mist/_menu.styl
@@ -0,0 +1,46 @@
+// Menu
+// --------------------------------------------------
+.site-nav-toggle {
+ position: static;
+ float: right;
+}
+
+
+.menu {
+ float: right;
+ margin: 8px 0 0 0;
+
+ +mobile() {
+ margin: 20px 0 0 0;
+ padding: 0;
+ }
+
+ br { display: none; }
+
+ .menu-item {
+ margin: 0;
+ +mobile() { display: block; }
+ }
+
+ .menu-item a {
+ padding: 0 10px;
+ background: none;
+ border: none;
+ border-radius: 2px;
+ transition-property: background;
+
+ +mobile() {
+ text-align: left;
+ }
+
+ &:hover { background: #e1e1e1; }
+ }
+
+ a::before {
+ display: none;
+
+ +mobile() { display: block; }
+ }
+
+ +mobile() { float: none; }
+}
diff --git a/themes/Next/source/css/_schemes/Mist/_posts-expanded.styl b/themes/Next/source/css/_schemes/Mist/_posts-expanded.styl
new file mode 100644
index 0000000..4ca1b29
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Mist/_posts-expanded.styl
@@ -0,0 +1,67 @@
+// Post Expanded
+// --------------------------------------------------
+.posts-expand {
+ padding-top: 0;
+
+ .post-title,
+ .post-meta {
+ text-align: $site-meta-text-align;
+ +mobile() { text-align: center; }
+ }
+ .post-eof { display: none; }
+
+ .post { margin-top: 120px; }
+ .post:first-child { margin-top: 0; }
+
+ .post-meta {
+ margin-top: 5px;
+ margin-bottom: 20px;
+ }
+
+ .post-title {
+ position: relative;
+ font-size: $font-size-headings-base;
+ font-weight: 400;
+ +mobile() { font-size: $font-size-headings-small; }
+ +desktop-large() { font-size: $font-size-headings-large; }
+ }
+ .post-title:hover:before { background: $black-deep; }
+
+ .post-body {
+ +mobile() { font-size: $font-size-small; }
+ }
+
+ .post-body img { margin: 0; }
+
+ .post-tags {
+ text-align: left;
+ a {
+ padding: 1px 5px;
+ background: $whitesmoke;
+ border-bottom: none;
+ }
+ a:hover { background: $grey-light; }
+ }
+ .post-nav { margin-top: 40px; }
+}
+
+.post-button {
+ margin-top: 20px;
+ text-align: left;
+
+ a {
+ padding: 0;
+ font-size: $font-size-base;
+ //color: $grey-dim;
+ background: none;
+ border: none;
+ border-bottom: 2px solid $grey-dim;
+ transition-property: border;
+
+ +mobile() { font-size: $font-size-small; }
+ +desktop-large() { font-size: $font-size-large; }
+
+
+ &:hover { border-bottom-color: $black-deep; }
+ }
+}
diff --git a/themes/Next/source/css/_schemes/Mist/_search.styl b/themes/Next/source/css/_schemes/Mist/_search.styl
new file mode 100644
index 0000000..6cd7b2c
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Mist/_search.styl
@@ -0,0 +1,5 @@
+// Search
+// --------------------------------------------------
+.site-search form {
+ display: none;
+}
\ No newline at end of file
diff --git a/themes/Next/source/css/_schemes/Mist/index.styl b/themes/Next/source/css/_schemes/Mist/index.styl
new file mode 100644
index 0000000..7d047f4
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Mist/index.styl
@@ -0,0 +1,91 @@
+//
+// Mist scheme
+// =================================================
+
+@import "_base";
+@import "outline/outline";
+@import "_header";
+@import "_logo";
+@import "_menu";
+@import "_search.styl";
+@import "_posts-expanded";
+@import "sidebar/sidebar-blogroll";
+
+
+// Components
+// --------------------------------------------------
+.btn {
+ padding: 0 10px;
+ border-width: 2px;
+ border-radius: 0;
+}
+
+.headband { display: none; }
+
+
+// Search
+// --------------------------------------------------
+.site-search {
+ position: relative;
+ float: right;
+ margin-top: 5px;
+ padding-top: 3px;
+
+ +mobile() {
+ float: none;
+ padding: 0 10px;
+ }
+}
+
+
+// Page - Container
+// --------------------------------------------------
+.container .main-inner {
+ +mobile() { width: auto; }
+}
+
+
+// Page - Post details
+// --------------------------------------------------
+.page-post-detail {
+ .post-title,
+ .post-meta { text-align: center; }
+
+ .post-title:before { display: none; }
+
+ .post-meta { margin-bottom: 60px; }
+}
+
+
+// Pagination
+// --------------------------------------------------
+.pagination {
+ margin: 120px 0 0;
+ text-align: left;
+
+ +mobile() {
+ margin: 80px 10px 0;
+ text-align: center;
+ }
+}
+
+// Footer
+// --------------------------------------------------
+.footer {
+ margin-top: 80px;
+ padding: 10px 0;
+ background: $whitesmoke;
+ color: $grey-dim;
+}
+.footer-inner {
+ margin: 0 auto;
+ text-align: left;
+
+ +mobile() {
+ width: auto;
+ text-align: center;
+ }
+}
+
+// Helpers
+// --------------------------------------------------
diff --git a/themes/Next/source/css/_schemes/Mist/outline/outline.styl b/themes/Next/source/css/_schemes/Mist/outline/outline.styl
new file mode 100644
index 0000000..12c0bae
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Mist/outline/outline.styl
@@ -0,0 +1 @@
+.main-inner { margin-top: 80px; }
diff --git a/themes/Next/source/css/_schemes/Mist/sidebar/sidebar-blogroll.styl b/themes/Next/source/css/_schemes/Mist/sidebar/sidebar-blogroll.styl
new file mode 100644
index 0000000..6db1ed7
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Mist/sidebar/sidebar-blogroll.styl
@@ -0,0 +1 @@
+.links-of-blogroll-inline .links-of-blogroll-item { display: inline-block; }
diff --git a/themes/Next/source/css/_schemes/Muse/_layout.styl b/themes/Next/source/css/_schemes/Muse/_layout.styl
new file mode 100644
index 0000000..0107472
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Muse/_layout.styl
@@ -0,0 +1,9 @@
+.header-inner, .container .main-inner, .footer-inner {
+ +mobile() { width: auto; }
+}
+
+// embed tag
+embed {
+ display: block;
+ margin: 0px auto 25px auto;
+}
diff --git a/themes/Next/source/css/_schemes/Muse/_logo.styl b/themes/Next/source/css/_schemes/Muse/_logo.styl
new file mode 100644
index 0000000..1d0437a
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Muse/_logo.styl
@@ -0,0 +1,21 @@
+.custom-logo {
+ .site-meta-headline { text-align: center; }
+
+ .brand { background: none; }
+
+ .site-title {
+ margin: 10px auto 0;
+ font-size: 24px;
+ color: $black-deep;
+ a { border: none; }
+ }
+
+
+}
+
+.custom-logo-image {
+ margin: 0 auto;
+ padding: 5px;
+ max-width: 150px;
+ background: white;
+}
diff --git a/themes/Next/source/css/_schemes/Muse/_menu.styl b/themes/Next/source/css/_schemes/Muse/_menu.styl
new file mode 100644
index 0000000..b18fed9
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Muse/_menu.styl
@@ -0,0 +1,33 @@
+.site-nav {
+ +mobile() {
+ position: absolute;
+ left: 0;
+ top: 52px;
+ margin: 0;
+ width: 100%;
+ padding: 0;
+ background: white;
+ border-bottom: 1px solid $gray-lighter;
+ z-index: $zindex-5;
+ }
+}
+
+.menu {
+ +mobile() { text-align: left; }
+}
+.menu .menu-item {
+ +mobile() {
+ display: block;
+ margin: 0 10px;
+ vertical-align: top;
+ }
+
+ br {
+ +mobile() { display: none; }
+ }
+
+ a {
+ +mobile() { padding: 5px 10px; }
+ }
+ .fa { margin-right: 0; }
+}
diff --git a/themes/Next/source/css/_schemes/Muse/_search.styl b/themes/Next/source/css/_schemes/Muse/_search.styl
new file mode 100644
index 0000000..6cd7b2c
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Muse/_search.styl
@@ -0,0 +1,5 @@
+// Search
+// --------------------------------------------------
+.site-search form {
+ display: none;
+}
\ No newline at end of file
diff --git a/themes/Next/source/css/_schemes/Muse/index.styl b/themes/Next/source/css/_schemes/Muse/index.styl
new file mode 100644
index 0000000..35effe8
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Muse/index.styl
@@ -0,0 +1,5 @@
+@import "_layout.styl";
+@import "_logo.styl";
+@import "_menu.styl";
+@import "_search.styl";
+@import "sidebar/sidebar-blogroll";
diff --git a/themes/Next/source/css/_schemes/Muse/sidebar/sidebar-blogroll.styl b/themes/Next/source/css/_schemes/Muse/sidebar/sidebar-blogroll.styl
new file mode 100644
index 0000000..6db1ed7
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Muse/sidebar/sidebar-blogroll.styl
@@ -0,0 +1 @@
+.links-of-blogroll-inline .links-of-blogroll-item { display: inline-block; }
diff --git a/themes/Next/source/css/_schemes/Pisces/_brand.styl b/themes/Next/source/css/_schemes/Pisces/_brand.styl
new file mode 100644
index 0000000..c85ee8f
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Pisces/_brand.styl
@@ -0,0 +1,30 @@
+.site-brand-wrapper {
+ position: relative;
+}
+
+.site-meta {
+ padding: 20px 0;
+ color: white;
+ background: $black-deep;
+
+ +tablet() {
+ box-shadow: 0 0 16px rgba(0,0,0,0.5);
+ }
+ +mobile() {
+ box-shadow: 0 0 16px rgba(0,0,0,0.5);
+ }
+}
+
+.brand {
+ padding: 0;
+ background: none;
+
+ &:hover { color: white; }
+}
+
+.site-subtitle {
+ margin: 10px 10px 0;
+ font-weight: initial;
+}
+
+.site-search form { display: none; }
diff --git a/themes/Next/source/css/_schemes/Pisces/_layout.styl b/themes/Next/source/css/_schemes/Pisces/_layout.styl
new file mode 100644
index 0000000..ad51de5
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Pisces/_layout.styl
@@ -0,0 +1,130 @@
+.header {
+ position: relative;
+ margin: 0 auto;
+ width: $main-desktop;
+
+ +tablet() {
+ width: auto;
+ }
+ +mobile() {
+ width: auto;
+ }
+}
+
+.header-inner {
+ position: absolute;
+ top: 0;
+ overflow: hidden;
+ padding: 0;
+ width: 240px;
+ background: white;
+ box-shadow: $box-shadow-inner;
+ border-radius: $border-radius-inner;
+
+ +desktop-large() {
+ .container & { width: 240px; }
+ }
+ +tablet() {
+ position: relative;
+ width: auto;
+ border-radius: initial;
+ }
+ +mobile() {
+ position: relative;
+ width: auto;
+ border-radius: initial;
+ }
+}
+
+.main {
+ clearfix();
+ +tablet() {
+ padding-bottom: 100px;
+ }
+ +mobile() {
+ padding-bottom: 100px;
+ }
+}
+
+.container .main-inner {
+ width: $main-desktop;
+
+ +tablet() {
+ width: auto;
+ }
+ +mobile() {
+ width: auto;
+ }
+}
+
+.content-wrap {
+ float: right;
+ box-sizing: border-box;
+ padding: $content-desktop-padding;
+ width: $content-desktop;
+ background: initial;
+ min-height: 700px;
+ box-shadow: $box-shadow-inner;
+ border-radius: $border-radius-inner;
+
+ +tablet() {
+ width: 100%;
+ padding: 20px;
+ border-radius: initial;
+ }
+ +mobile() {
+ width: 100%;
+ padding: 20px;
+ min-height: auto;
+ border-radius: initial;
+ }
+}
+
+.sidebar {
+ position: static;
+ float: left;
+ margin-top: 300px;
+ width: $sidebar-desktop;
+ background: $body-bg-color;
+ box-shadow: none;
+
+ +tablet() {
+ display: none;
+ }
+ +mobile() {
+ display: none;
+ }
+}
+
+.sidebar-toggle { display: none; }
+
+
+.footer-inner {
+ width: $main-desktop;
+ padding-left: 260px;
+
+ +tablet() {
+ width: auto;
+ padding-left: 0 !important;
+ padding-right: 0 !important;
+ }
+ +mobile() {
+ width: auto;
+ padding-left: 0 !important;
+ padding-right: 0 !important;
+ }
+}
+
+
+
+.sidebar-position-right {
+ .header-inner { right: 0; }
+ .content-wrap { float: left; }
+ .sidebar { float: right; }
+
+ .footer-inner {
+ padding-left: 0;
+ padding-right: 260px;
+ }
+}
+
diff --git a/themes/Next/source/css/_schemes/Pisces/_menu.styl b/themes/Next/source/css/_schemes/Pisces/_menu.styl
new file mode 100644
index 0000000..5638f2c
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Pisces/_menu.styl
@@ -0,0 +1,67 @@
+.site-nav {
+ border-top: none;
+
+ +tablet() {
+ display: none !important;
+ }
+}
+
+.site-nav-on {
+ +tablet() {
+ display: block !important;
+ }
+}
+
+.menu .menu-item {
+ display: block;
+ margin: 0;
+
+ a {
+ position: relative;
+ box-sizing: border-box;
+ padding: 5px 20px;
+ text-align: left;
+ line-height: inherit;
+ transition-property: background-color;
+ the-transition();
+
+ &:hover {
+ background: #6495ED;
+ border-bottom-color: white;
+ }
+ }
+
+ br { display: none; }
+}
+
+.menu-item-active a {
+ @extend .menu .menu-item a:hover;
+
+ &:after {
+ content: " ";
+ position: absolute;
+ top: 50%;
+ margin-top: -3px;
+ right: 15px;
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ background-color: $grey;
+ }
+}
+
+.btn-bar {
+ background-color: white;
+}
+
+.site-nav-toggle {
+ left: 20px;
+ top: 50%;
+
+ -webkit-transform: translateY(-50%);
+ transform: translateY(-50%);
+
+ +tablet() {
+ display: block;
+ }
+}
diff --git a/themes/Next/source/css/_schemes/Pisces/_posts.styl b/themes/Next/source/css/_schemes/Pisces/_posts.styl
new file mode 100644
index 0000000..498409d
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Pisces/_posts.styl
@@ -0,0 +1,5 @@
+.post-body {
+ +mobile() {
+ text-align: justify;
+ }
+}
diff --git a/themes/Next/source/css/_schemes/Pisces/_sidebar.styl b/themes/Next/source/css/_schemes/Pisces/_sidebar.styl
new file mode 100644
index 0000000..03c1023
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Pisces/_sidebar.styl
@@ -0,0 +1,124 @@
+.use-motion .sidebar .motion-element { opacity: 1; }
+
+.sidebar {
+ margin-left: -50%;
+ right: auto;
+ bottom: auto;
+
+ // Do NOT delete this line
+ // or Affix (position: fixed) will not work in Google Chrome.
+ -webkit-transform: none;
+}
+
+
+.sidebar-inner {
+//padding: 20px 10px 0;
+ box-sizing: border-box;
+ width: 240px;
+ color: $text-color;
+ background: white;
+ box-shadow: $box-shadow;
+ border-radius: $border-radius;
+ if (hexo-config('motion.enable') and hexo-config('motion.transition.sidebar')) { opacity: 0; }
+
+ &.affix {
+ position: fixed;
+ top: $sidebar-offset;
+ }
+
+ &.affix-bottom {
+ position: absolute;
+ }
+
+}
+
+.site-overview {
+ margin: 0 2px;
+ text-align: left;
+}
+
+.site-author {
+ clearfix();
+}
+
+.sidebar a {
+ color: $black-light;
+
+ &:hover { color: $black-deep; }
+}
+
+.site-state-item {
+ padding: 0 10px;
+}
+
+.links-of-author-item {
+ a:before { display: none; }
+ a {
+ border-bottom: none;
+ text-decoration: underline;
+ }
+}
+
+.feed-link {
+ border-top: 1px dotted $grey-light;
+ border-bottom: 1px dotted $grey-light;
+ text-align: center;
+}
+
+.feed-link a {
+ display: block;
+ color: $orange;
+ border: none;
+
+ &:hover {
+ background: none;
+ color: darken($orange, 20%);
+
+ i { color: darken($orange, 20%); }
+ }
+}
+
+.links-of-author {
+ //clearfix();
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+}
+.links-of-author-item {
+ sidebar-inline-links-item();
+
+ a {
+ display: block;
+ text-decoration: none;
+
+ &:hover {
+ border-radius: 4px;
+ background: $gainsboro;
+ }
+ }
+
+ .fa {
+ margin-right: 2px;
+ font-size: 16px;
+ }
+ .fa-globe { font-size: 15px; }
+}
+
+
+.links-of-blogroll {
+ text-align: center;
+ margin-top: 20px;
+ padding: 3px 0 0;
+ border-top: 1px dotted $grey-light;
+}
+.links-of-blogroll-title { margin-top: 0; }
+.links-of-blogroll-item { padding: 0; }
+.links-of-blogroll-inline {
+ clearfix();
+
+ .links-of-blogroll-item {
+ sidebar-inline-links-item();
+ display: inline-block;
+ if !hexo-config('social_icons.icons_only') { width: unset; }
+ }
+}
diff --git a/themes/Next/source/css/_schemes/Pisces/index.styl b/themes/Next/source/css/_schemes/Pisces/index.styl
new file mode 100644
index 0000000..cda4936
--- /dev/null
+++ b/themes/Next/source/css/_schemes/Pisces/index.styl
@@ -0,0 +1,5 @@
+@import "_layout";
+@import "_brand";
+@import "_menu";
+@import "_sidebar";
+@import "_posts";
diff --git a/themes/Next/source/css/_variables/Gemini.styl b/themes/Next/source/css/_variables/Gemini.styl
new file mode 100644
index 0000000..4d6e7e0
--- /dev/null
+++ b/themes/Next/source/css/_variables/Gemini.styl
@@ -0,0 +1,21 @@
+// Variables of Gemini scheme
+// =================================================
+
+@import "Pisces.styl";
+
+// Settings for some of the most global styles.
+// --------------------------------------------------
+$body-bg-color = #eee
+$main-desktop = 75%
+$sidebar-desktop = 240px
+$content-desktop = calc(100% - 252px)
+
+// Borders.
+// --------------------------------------------------
+$box-shadow-inner = 0 2px 2px 0 rgba(0,0,0,.12), 0 3px 1px -2px rgba(0,0,0,.06), 0 1px 5px 0 rgba(0,0,0,.12)
+$box-shadow = 0 2px 2px 0 rgba(0,0,0,.12), 0 3px 1px -2px rgba(0,0,0,.06), 0 1px 5px 0 rgba(0,0,0,.12), 0 -1px .5px 0 rgba(0,0,0,.09)
+
+$border-radius-inner = initial
+$border-radius = initial
+//$border-radius-inner = 0 0 3px 3px;
+//$border-radius = 3px;
diff --git a/themes/Next/source/css/_variables/Mist.styl b/themes/Next/source/css/_variables/Mist.styl
new file mode 100644
index 0000000..8ead36e
--- /dev/null
+++ b/themes/Next/source/css/_variables/Mist.styl
@@ -0,0 +1,13 @@
+// Variables of Mist scheme
+// =================================================
+
+$font-size-headings-base = 26px
+
+$brand-color = $black-deep
+$brand-hover-color = $brand-color
+
+$site-meta-text-align = left
+$posts-collapse-left = 0
+
+$btn-default-color = $link-color
+$btn-default-bg = transparent
diff --git a/themes/Next/source/css/_variables/Muse.styl b/themes/Next/source/css/_variables/Muse.styl
new file mode 100644
index 0000000..e69de29
diff --git a/themes/Next/source/css/_variables/Pisces.styl b/themes/Next/source/css/_variables/Pisces.styl
new file mode 100644
index 0000000..320aeb1
--- /dev/null
+++ b/themes/Next/source/css/_variables/Pisces.styl
@@ -0,0 +1,77 @@
+// Variables of Pisces scheme
+// =================================================
+
+// Settings for some of the most global styles.
+// --------------------------------------------------
+$body-bg-color = #f5f7f9
+
+
+// Borders
+// --------------------------------------------------
+$box-shadow-inner = initial;
+$box-shadow = initial;
+
+$border-radius-inner = initial;
+$border-radius = initial;
+
+
+// Header
+// --------------------------------------------------
+$subtitle-color = $gray-lighter
+
+// Sidebar
+// --------------------------------------------------
+$sidebar-offset = unit(hexo-config('sidebar.offset'), px) if hexo-config('sidebar.offset') is a 'unit'
+
+$sidebar-nav-hover-color = $orange
+$sidebar-highlight = $orange
+
+$site-author-image-width = 120px
+$site-author-image-border-width = 1px
+$site-author-image-border-color = $gainsboro
+
+$site-author-name-margin = 0
+$site-author-name-color = $black-deep
+$site-author-name-align = center
+$site-author-name-weight = $font-weight-bold
+
+$site-description-font-size = 13px
+$site-description-color = $grey-dark
+$site-description-margin-top = 0
+$site-description-align = center
+
+$site-state-item-count-font-size = 16px
+$site-state-item-name-font-size = 13px
+$site-state-item-name-color = $grey-dark
+$site-state-item-border-color = $gainsboro
+
+$toc-link-color = $grey-dim
+$toc-link-border-color = $grey-light
+$toc-link-hover-color = black
+$toc-link-hover-border-color = black
+$toc-link-active-color = $sidebar-highlight
+$toc-link-active-border-color = $sidebar-highlight
+$toc-link-active-current-color = $sidebar-highlight
+$toc-link-active-current-border-color = $sidebar-highlight
+
+
+// Components
+// --------------------------------------------------
+
+// Button
+$btn-default-radius = 2px
+$btn-default-bg = white
+$btn-default-color = $text-color
+$btn-default-border-color = $text-color
+$btn-default-hover-color = white
+$btn-default-hover-bg = $black-deep
+
+// Full Image Tag
+$full-image-width = 118%
+$full-image-margin-horizontal = -9%
+$full-image-margin-vertical = 0
+
+// Back to top
+$b2t-opacity = .6
+$b2t-position-bottom = -100px
+$b2t-position-bottom-on = 30px
diff --git a/themes/Next/source/css/_variables/base.styl b/themes/Next/source/css/_variables/base.styl
new file mode 100644
index 0000000..fcd7830
--- /dev/null
+++ b/themes/Next/source/css/_variables/base.styl
@@ -0,0 +1,416 @@
+//
+// Variables
+// =================================================
+
+
+
+// Colors
+// colors for use across theme.
+// --------------------------------------------------
+
+$whitesmoke = #f5f5f5
+$gainsboro = #eee
+$gray-lighter = #ddd
+$grey-light = #ccc
+$grey = #bbb
+$grey-dark = #999
+$grey-dim = #666
+$black-light = #555
+$black-dim = #333
+$black-deep = #222
+$red = #ff2a2a
+$blue-bright = #87daff
+$blue = #0684bd
+$blue-deep = #262a30
+$orange = #fc6423
+
+
+
+// Scaffolding
+// Settings for some of the most global styles.
+// --------------------------------------------------
+
+// Global text color on
+$text-color = $black-light
+
+// Global link color.
+$link-color = $black-light
+$link-hover-color = $black-deep
+$link-decoration-color = $grey-light
+$link-decoration-hover-color = $black-deep
+
+// Global border color.
+$border-color = $grey-light
+
+// Background color for
+$body-bg-color = white
+
+// Selection
+$selection-bg = $blue-deep
+$selection-color = white
+
+
+
+// Typography
+// Font, line-height, and elements colors.
+// --------------------------------------------------
+
+
+get_font_family(config) {
+ custom_family = hexo-config('font.' + config + '.family')
+ return custom_family is a 'string' ? custom_family : null
+}
+
+// Font families.
+$font-family-chinese = "PingFang SC", "Microsoft YaHei"
+
+$font-family-base = $font-family-chinese, sans-serif
+$font-family-base = get_font_family('global'), $font-family-chinese, sans-serif if get_font_family('global')
+
+$font-family-logo = $font-family-base
+$font-family-logo = get_font_family('logo'), $font-family-base if get_font_family('logo')
+
+$font-family-headings = $font-family-base
+$font-family-headings = get_font_family('headings'), $font-family-base if get_font_family('headings')
+
+$font-family-posts = $font-family-base
+$font-family-posts = get_font_family('posts'), $font-family-base if get_font_family('posts')
+
+$font-family-monospace = consolas, Menlo, $font-family-chinese, monospace
+$font-family-monospace = get_font_family('codes'), consolas, Menlo, $font-family-chinese, monospace if get_font_family('codes')
+
+$font-family-icons = 'FontAwesome'
+
+
+// Font Weight
+$font-weight-lighter = 200
+$font-weight-light = 300
+$font-weight-normal = 400
+$font-weight-bold = 600
+$font-weight-bolder = 700
+
+
+// Font size
+$font-size-base = 14px
+$font-size-base = unit(hexo-config('font.global.size'), px) if hexo-config('font.global.size') is a 'unit'
+$font-size-small = $font-size-base - 2px
+$font-size-smaller = $font-size-base - 4px
+$font-size-large = $font-size-base + 2px
+$font-size-larger = $font-size-base + 4px
+
+
+// Headings font size
+$font-size-headings-step = 2px
+$font-size-headings-base = 24px
+$font-size-headings-base = unit(hexo-config('font.headings.size'), px) if hexo-config('font.headings.size') is a 'unit'
+$font-size-headings-small = $font-size-headings-base - $font-size-headings-step
+$font-size-headings-smaller = $font-size-headings-small - $font-size-headings-step
+$font-size-headings-large = $font-size-headings-base + $font-size-headings-step
+$font-size-headings-larger = $font-size-headings-large + $font-size-headings-step
+
+// Global line height
+$line-height-base = 2
+$line-height-code-block = 1.6 // Can't be less than 1.3
+
+
+
+// Z-index master list
+// --------------------------------------------------
+$zindex-bottom = -1
+$zindex-1 = 1010
+$zindex-2 = 1020
+$zindex-3 = 1030
+$zindex-4 = 1040
+$zindex-5 = 1050
+
+
+
+// Table
+// --------------------------------------------------
+$table-width = 100%
+$table-border-color = $gray-lighter
+$table-font-size = 14px
+$table-content-alignment = left
+$table-content-vertical = middle
+$table-th-font-weight = 700
+$table-cell-padding = 8px
+$table-cell-border-right-color = $gainsboro
+$table-cell-border-bottom-color = $gray-lighter
+$table-row-odd-bg-color = #f9f9f9
+$table-row-hover-bg-color = $whitesmoke
+
+
+
+// Code & Code Blocks
+// --------------------------------------------------
+$code-font-family = $font-family-monospace
+$code-font-size = 13px
+$code-font-size = unit(hexo-config('font.codes.size'), px) if hexo-config('font.codes.size') is a 'unit'
+$code-border-radius = 3px
+$code-foreground = $black-light
+$code-background = $gainsboro
+
+
+
+// Buttons
+// --------------------------------------------------
+
+$btn-font-weight = normal
+
+$btn-default-radius = 0
+$btn-default-bg = $black-deep
+$btn-default-color = white
+$btn-default-font-size = 14px
+$btn-default-border-width = 2px
+$btn-default-border-color = $black-deep
+$btn-default-hover-bg = white
+$btn-default-hover-color = $black-deep
+$btn-default-hover-border-color = $black-deep
+
+
+
+// Pagination
+// --------------------------------------------------
+
+$pagination-border = $gainsboro
+
+$pagination-link-bg = transparent
+$pagination-link-color = $link-color
+$pagination-link-border = $gainsboro
+
+$pagination-link-hover-bg = transparent
+$pagination-link-hover-color = $link-color
+$pagination-link-hover-border = $black-deep
+
+$pagination-active-bg = $grey-light
+$pagination-active-color = white
+$pagination-active-border = $grey-light
+
+
+
+// Layout sizes
+// --------------------------------------------------
+
+$main-desktop = 960px
+$main-desktop-large = 1200px
+
+$content-desktop = 700px
+$content-desktop-large = 900px
+
+$content-desktop-padding = 40px
+$content-tablet-padding = 10px
+$content-mobile-padding = 8px
+
+$sidebar-desktop = 240px
+
+$footer-height = 50px
+
+$gap-between-main-and-footer = 100px
+
+
+
+// Headband
+// --------------------------------------------------
+$headband-height = 3px
+$headband-bg = $black-deep
+
+
+
+// Section Header
+// Variables for header section elements.
+// --------------------------------------------------
+
+$head-bg = transparent
+
+// Site Meta
+$site-meta-text-align = center
+$brand-color = white
+$brand-hover-color = white
+$brand-bg = $black-deep
+
+$logo-font-size = 20px
+$logo-font-size = unit(hexo-config('font.logo.size'), px) if hexo-config('font.logo.size') is a 'unit'
+
+$site-subtitle-color = $grey-dark
+$subtitle-font-size = 13px
+$subtitle-color = $grey-dark
+
+// Menu
+$menu-link-border = transparent
+$menu-link-hover-border = $black-deep
+
+
+
+// Posts Expand
+// --------------------------------------------------
+$posts-expand-title-font-weight = $font-weight-normal
+$post-copyright = {
+ margin: 2em 0 0,
+ padding: .5em 1em,
+ bg: #f9f9f9,
+ border: {
+ width: 3px,
+ style: solid,
+ color: #ff1700
+ }
+}
+
+
+// Posts Collpase
+// --------------------------------------------------
+$posts-collapse-left = 55px
+$posts-collapse-left-mobile = 5px
+
+
+// Sidebar
+// Variables for sidebar section elements.
+// --------------------------------------------------
+$sidebar-nav-color = $black-light
+$sidebar-nav-hover-color = $whitesmoke
+$sidebar-highlight = $blue-bright
+
+$site-author-image-padding = 2px
+$site-author-image-width = 96px
+$site-author-image-height = auto
+$site-author-image-border-width = 2px
+$site-author-image-border-color = $black-dim
+
+$site-author-name-margin = 5px 0 0
+$site-author-name-color = $whitesmoke
+$site-author-name-align = center
+$site-author-name-weight = normal
+
+$site-description-font-size = 14px
+$site-description-color = $grey-dark
+$site-description-margin-top = 5px
+$site-description-align = center
+
+$site-state-align = center
+$site-state-item-count-font-size = 18px
+$site-state-item-count-color = inherit
+$site-state-item-name-font-size = 13px
+$site-state-item-name-color = inherit
+$site-state-item-border-color = $black-dim
+
+$toc-link-color = $grey-dark
+$toc-link-border-color = $black-light
+$toc-link-hover-color = $grey-light
+$toc-link-hover-border-color = $grey-light
+$toc-link-active-color = $sidebar-highlight
+$toc-link-active-border-color = $sidebar-highlight
+$toc-link-active-current-color = $sidebar-highlight
+$toc-link-active-current-border-color = $sidebar-highlight
+
+
+// Components
+// --------------------------------------------------
+
+// Back to top
+$b2t-opacity = 1
+$b2t-position-bottom = -100px
+$b2t-position-bottom-on = 19px
+$b2t-position-right = 30px
+$b2t-font-size = 12px
+$b2t-color = white
+$b2t-bg-color = $black-deep
+
+// full-image
+$full-image-width = 110%
+$full-image-margin-horizontal = -5%
+$full-image-margin-vertical = 25px
+
+// .post-expand .post-eof
+// In Muse scheme, margin above and below the post separator
+$post-eof-margin-top = 80px // or 160px for more white space
+$post-eof-margin-bottom = 60px // or 120px for less white space
+
+
+// Iconography
+// Icons SVG Base64
+// --------------------------------------------------
+
+// blockquote-center icon
+$center-quote-left = '../images/quote-l.svg'
+$center-quote-right = '../images/quote-r.svg'
+
+
+// Note colors
+// --------------------------------------------------
+// Read note light_bg_offset from NexT config and set in "lbg%" to use it as string variable.
+hexo-config('note.light_bg_offset') is a 'unit' ? (lbg = unit(hexo-config('note.light_bg_offset'),"%")) : (lbg = 0)
+
+// Default
+$note-default-border = #777
+$note-default-bg = lighten(spin($note-default-border, 0), 94% + lbg)
+$note-default-text = $note-default-border
+$note-default-icon = "\f0a9"
+
+$note-modern-default-border = #e1e1e1
+$note-modern-default-bg = lighten(spin($note-modern-default-border, 10), 60% + (lbg * 4))
+$note-modern-default-text = $grey-dim
+$note-modern-default-hover = darken(spin($note-modern-default-text, -10), 32%)
+
+// Primary
+$note-primary-border = #6f42c1
+$note-primary-bg = lighten(spin($note-primary-border, 10), 92% + lbg)
+$note-primary-text = $note-primary-border
+$note-primary-icon = "\f055"
+
+$note-modern-primary-border = #e1c2ff
+$note-modern-primary-bg = lighten(spin($note-modern-primary-border, 10), 40% + (lbg * 4))
+$note-modern-primary-text = #6f42c1
+$note-modern-primary-hover = darken(spin($note-modern-primary-text, -10), 22%)
+
+// Info
+$note-info-border = #428bca
+$note-info-bg = lighten(spin($note-info-border, -10), 91% + lbg)
+$note-info-text = $note-info-border
+$note-info-icon = "\f05a"
+
+$note-modern-info-border = #b3e5ef
+$note-modern-info-bg = lighten(spin($note-modern-info-border, 10), 50% + (lbg * 4))
+$note-modern-info-text = #31708f
+$note-modern-info-hover = darken(spin($note-modern-info-text, -10), 32%)
+
+// Success
+$note-success-border = #5cb85c
+$note-success-bg = lighten(spin($note-success-border, 10), 90% + lbg)
+$note-success-text = $note-success-border
+$note-success-icon = "\f058"
+
+$note-modern-success-border = #d0e6be
+$note-modern-success-bg = lighten(spin($note-modern-success-border, 10), 40% + (lbg * 4))
+$note-modern-success-text = #3c763d
+$note-modern-success-hover = darken(spin($note-modern-success-text, -10), 27%)
+
+// Warning
+$note-warning-border = #f0ad4e
+$note-warning-bg = lighten(spin($note-warning-border, 10), 88% + lbg)
+$note-warning-text = $note-warning-border
+$note-warning-icon = "\f06a"
+
+$note-modern-warning-border = #fae4cd
+$note-modern-warning-bg = lighten(spin($note-modern-warning-border, 10), 43% + (lbg * 4))
+$note-modern-warning-text = #8a6d3b
+$note-modern-warning-hover = darken(spin($note-modern-warning-text, -10), 18%)
+
+// Danger
+$note-danger-border = #d9534f
+$note-danger-bg = lighten(spin($note-danger-border, -10), 92% + lbg)
+$note-danger-text = $note-danger-border
+$note-danger-icon = "\f056"
+
+$note-modern-danger-border = #ebcdd2
+$note-modern-danger-bg = lighten(spin($note-modern-danger-border, 10), 35% + (lbg * 4))
+$note-modern-danger-text = #a94442
+$note-modern-danger-hover = darken(spin($note-modern-danger-text, -10), 22%)
+
+
+// Label colors
+// --------------------------------------------------
+$label-default = lighten(spin($note-default-border, 0), 89% + lbg)
+$label-primary = lighten(spin($note-primary-border, 10), 87% + lbg)
+$label-info = lighten(spin($note-info-border, -10), 86% + lbg)
+$label-success = lighten(spin($note-success-border, 10), 85% + lbg)
+$label-warning = lighten(spin($note-warning-border, 10), 83% + lbg)
+$label-danger = lighten(spin($note-danger-border, -10), 87% + lbg)
diff --git a/themes/Next/source/css/_variables/custom.styl b/themes/Next/source/css/_variables/custom.styl
new file mode 100644
index 0000000..e69de29
diff --git a/themes/Next/source/css/main.styl b/themes/Next/source/css/main.styl
new file mode 100644
index 0000000..d46298d
--- /dev/null
+++ b/themes/Next/source/css/main.styl
@@ -0,0 +1,45 @@
+// CSS Style Guide: http://codeguide.co/#css
+
+
+
+$scheme = hexo-config('scheme') ? hexo-config('scheme') : 'Muse';
+$variables = base $scheme custom;
+$mixins = base $scheme custom;
+
+
+
+// Variables Layer
+// --------------------------------------------------
+for $variable in $variables
+ @import "_variables/" + $variable
+
+
+// Mixins Layer
+// --------------------------------------------------
+for $mixin in $mixins
+ @import "_mixins/" + $mixin;
+
+
+
+// Common Layer
+// --------------------------------------------------
+
+// Scaffolding
+@import "_common/scaffolding";
+
+// Layout
+@import "_common/outline";
+
+// Components
+@import "_common/components";
+
+
+// Schemes Layer
+// --------------------------------------------------
+@import "_schemes/" + $scheme;
+
+
+
+// Custom Layer
+// --------------------------------------------------
+@import "_custom/custom";
diff --git a/themes/Next/source/fonts/.gitkeep b/themes/Next/source/fonts/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/themes/Next/source/images/algolia_logo.svg b/themes/Next/source/images/algolia_logo.svg
new file mode 100644
index 0000000..4702423
--- /dev/null
+++ b/themes/Next/source/images/algolia_logo.svg
@@ -0,0 +1,9 @@
+
diff --git a/themes/Next/source/images/alipay.jpg b/themes/Next/source/images/alipay.jpg
new file mode 100644
index 0000000..d5cfaa8
Binary files /dev/null and b/themes/Next/source/images/alipay.jpg differ
diff --git a/themes/Next/source/images/apple-touch-icon-next.png b/themes/Next/source/images/apple-touch-icon-next.png
new file mode 100644
index 0000000..86a0d1d
Binary files /dev/null and b/themes/Next/source/images/apple-touch-icon-next.png differ
diff --git a/themes/Next/source/images/avatar.png b/themes/Next/source/images/avatar.png
new file mode 100644
index 0000000..75844e6
Binary files /dev/null and b/themes/Next/source/images/avatar.png differ
diff --git a/themes/Next/source/images/cc-by-nc-nd.svg b/themes/Next/source/images/cc-by-nc-nd.svg
new file mode 100644
index 0000000..79a4f2e
--- /dev/null
+++ b/themes/Next/source/images/cc-by-nc-nd.svg
@@ -0,0 +1,121 @@
+
+
+
diff --git a/themes/Next/source/images/cc-by-nc-sa.svg b/themes/Next/source/images/cc-by-nc-sa.svg
new file mode 100644
index 0000000..bf6bc26
--- /dev/null
+++ b/themes/Next/source/images/cc-by-nc-sa.svg
@@ -0,0 +1,121 @@
+
+
+
diff --git a/themes/Next/source/images/cc-by-nc.svg b/themes/Next/source/images/cc-by-nc.svg
new file mode 100644
index 0000000..3697349
--- /dev/null
+++ b/themes/Next/source/images/cc-by-nc.svg
@@ -0,0 +1,121 @@
+
+
+
diff --git a/themes/Next/source/images/cc-by-nd.svg b/themes/Next/source/images/cc-by-nd.svg
new file mode 100644
index 0000000..934c61e
--- /dev/null
+++ b/themes/Next/source/images/cc-by-nd.svg
@@ -0,0 +1,117 @@
+
+
+
diff --git a/themes/Next/source/images/cc-by-sa.svg b/themes/Next/source/images/cc-by-sa.svg
new file mode 100644
index 0000000..463276a
--- /dev/null
+++ b/themes/Next/source/images/cc-by-sa.svg
@@ -0,0 +1,121 @@
+
+
+
diff --git a/themes/Next/source/images/cc-by.svg b/themes/Next/source/images/cc-by.svg
new file mode 100644
index 0000000..4bccd14
--- /dev/null
+++ b/themes/Next/source/images/cc-by.svg
@@ -0,0 +1,121 @@
+
+
+
diff --git a/themes/Next/source/images/cc-zero.svg b/themes/Next/source/images/cc-zero.svg
new file mode 100644
index 0000000..0f86639
--- /dev/null
+++ b/themes/Next/source/images/cc-zero.svg
@@ -0,0 +1,72 @@
+
+
+
+
diff --git a/themes/Next/source/images/favicon-16x16-next.png b/themes/Next/source/images/favicon-16x16-next.png
new file mode 100644
index 0000000..de8c5d3
Binary files /dev/null and b/themes/Next/source/images/favicon-16x16-next.png differ
diff --git a/themes/Next/source/images/favicon-32x32-next.png b/themes/Next/source/images/favicon-32x32-next.png
new file mode 100644
index 0000000..e02f5f4
Binary files /dev/null and b/themes/Next/source/images/favicon-32x32-next.png differ
diff --git a/themes/Next/source/images/loading.gif b/themes/Next/source/images/loading.gif
new file mode 100644
index 0000000..efb6768
Binary files /dev/null and b/themes/Next/source/images/loading.gif differ
diff --git a/themes/Next/source/images/logo.svg b/themes/Next/source/images/logo.svg
new file mode 100644
index 0000000..cbb3937
--- /dev/null
+++ b/themes/Next/source/images/logo.svg
@@ -0,0 +1,23 @@
+
+
diff --git a/themes/Next/source/images/placeholder.gif b/themes/Next/source/images/placeholder.gif
new file mode 100644
index 0000000..efb6768
Binary files /dev/null and b/themes/Next/source/images/placeholder.gif differ
diff --git a/themes/Next/source/images/quote-l.svg b/themes/Next/source/images/quote-l.svg
new file mode 100644
index 0000000..6dd94a4
--- /dev/null
+++ b/themes/Next/source/images/quote-l.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
diff --git a/themes/Next/source/images/quote-r.svg b/themes/Next/source/images/quote-r.svg
new file mode 100644
index 0000000..312b64d
--- /dev/null
+++ b/themes/Next/source/images/quote-r.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
diff --git a/themes/Next/source/images/searchicon.png b/themes/Next/source/images/searchicon.png
new file mode 100644
index 0000000..14a16ca
Binary files /dev/null and b/themes/Next/source/images/searchicon.png differ
diff --git a/themes/Next/source/images/wechatpay.jpg b/themes/Next/source/images/wechatpay.jpg
new file mode 100644
index 0000000..88a871c
Binary files /dev/null and b/themes/Next/source/images/wechatpay.jpg differ
diff --git a/themes/Next/source/js/src/affix.js b/themes/Next/source/js/src/affix.js
new file mode 100644
index 0000000..11a3d39
--- /dev/null
+++ b/themes/Next/source/js/src/affix.js
@@ -0,0 +1,162 @@
+/* ========================================================================
+ * Bootstrap: affix.js v3.3.5
+ * http://getbootstrap.com/javascript/#affix
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // AFFIX CLASS DEFINITION
+ // ======================
+
+ var Affix = function (element, options) {
+ this.options = $.extend({}, Affix.DEFAULTS, options)
+
+ this.$target = $(this.options.target)
+ .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+ .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
+
+ this.$element = $(element)
+ this.affixed = null
+ this.unpin = null
+ this.pinnedOffset = null
+
+ this.checkPosition()
+ }
+
+ Affix.VERSION = '3.3.5'
+
+ Affix.RESET = 'affix affix-top affix-bottom'
+
+ Affix.DEFAULTS = {
+ offset: 0,
+ target: window
+ }
+
+ Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
+ var scrollTop = this.$target.scrollTop()
+ var position = this.$element.offset()
+ var targetHeight = this.$target.height()
+
+ if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
+
+ if (this.affixed == 'bottom') {
+ if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
+ return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
+ }
+
+ var initializing = this.affixed == null
+ var colliderTop = initializing ? scrollTop : position.top
+ var colliderHeight = initializing ? targetHeight : height
+
+ if (offsetTop != null && scrollTop <= offsetTop) return 'top'
+ if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
+
+ return false
+ }
+
+ Affix.prototype.getPinnedOffset = function () {
+ if (this.pinnedOffset) return this.pinnedOffset
+ this.$element.removeClass(Affix.RESET).addClass('affix')
+ var scrollTop = this.$target.scrollTop()
+ var position = this.$element.offset()
+ return (this.pinnedOffset = position.top - scrollTop)
+ }
+
+ Affix.prototype.checkPositionWithEventLoop = function () {
+ setTimeout($.proxy(this.checkPosition, this), 1)
+ }
+
+ Affix.prototype.checkPosition = function () {
+ if (!this.$element.is(':visible')) return
+
+ var height = this.$element.height()
+ var offset = this.options.offset
+ var offsetTop = offset.top
+ var offsetBottom = offset.bottom
+ var scrollHeight = Math.max($(document).height(), $(document.body).height())
+
+ if (typeof offset != 'object') offsetBottom = offsetTop = offset
+ if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
+ if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
+
+ var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
+
+ if (this.affixed != affix) {
+ if (this.unpin != null) this.$element.css('top', '')
+
+ var affixType = 'affix' + (affix ? '-' + affix : '')
+ var e = $.Event(affixType + '.bs.affix')
+
+ this.$element.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ this.affixed = affix
+ this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
+
+ this.$element
+ .removeClass(Affix.RESET)
+ .addClass(affixType)
+ .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
+ }
+
+ if (affix == 'bottom') {
+ this.$element.offset({
+ top: scrollHeight - height - offsetBottom
+ })
+ }
+ }
+
+
+ // AFFIX PLUGIN DEFINITION
+ // =======================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.affix')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.affix
+
+ $.fn.affix = Plugin
+ $.fn.affix.Constructor = Affix
+
+
+ // AFFIX NO CONFLICT
+ // =================
+
+ $.fn.affix.noConflict = function () {
+ $.fn.affix = old
+ return this
+ }
+
+
+ // AFFIX DATA-API
+ // ==============
+
+ $(window).on('load', function () {
+ $('[data-spy="affix"]').each(function () {
+ var $spy = $(this)
+ var data = $spy.data()
+
+ data.offset = data.offset || {}
+
+ if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
+ if (data.offsetTop != null) data.offset.top = data.offsetTop
+
+ Plugin.call($spy, data)
+ })
+ })
+
+}(jQuery);
diff --git a/themes/Next/source/js/src/algolia-search.js b/themes/Next/source/js/src/algolia-search.js
new file mode 100644
index 0000000..9787e2a
--- /dev/null
+++ b/themes/Next/source/js/src/algolia-search.js
@@ -0,0 +1,115 @@
+/* global instantsearch: true */
+/*jshint camelcase: false */
+
+$(document).ready(function () {
+ var algoliaSettings = CONFIG.algolia;
+ var isAlgoliaSettingsValid = algoliaSettings.applicationID &&
+ algoliaSettings.apiKey &&
+ algoliaSettings.indexName;
+
+ if (!isAlgoliaSettingsValid) {
+ window.console.error('Algolia Settings are invalid.');
+ return;
+ }
+
+ var search = instantsearch({
+ appId: algoliaSettings.applicationID,
+ apiKey: algoliaSettings.apiKey,
+ indexName: algoliaSettings.indexName,
+ searchFunction: function (helper) {
+ var searchInput = $('#algolia-search-input').find('input');
+
+ if (searchInput.val()) {
+ helper.search();
+ }
+ }
+ });
+
+ // Registering Widgets
+ [
+ instantsearch.widgets.searchBox({
+ container: '#algolia-search-input',
+ placeholder: algoliaSettings.labels.input_placeholder
+ }),
+
+ instantsearch.widgets.hits({
+ container: '#algolia-hits',
+ hitsPerPage: algoliaSettings.hits.per_page || 10,
+ templates: {
+ item: function (data) {
+ var link = data.permalink ? data.permalink : (CONFIG.root + data.path);
+ return (
+ '' +
+ data._highlightResult.title.value +
+ ''
+ );
+ },
+ empty: function (data) {
+ return (
+ '' +
+ algoliaSettings.labels.hits_empty.replace(/\$\{query}/, data.query) +
+ ''
+ );
+ }
+ },
+ cssClasses: {
+ item: 'algolia-hit-item'
+ }
+ }),
+
+ instantsearch.widgets.stats({
+ container: '#algolia-stats',
+ templates: {
+ body: function (data) {
+ var stats = algoliaSettings.labels.hits_stats
+ .replace(/\$\{hits}/, data.nbHits)
+ .replace(/\$\{time}/, data.processingTimeMS);
+ return (
+ stats +
+ '' +
+ '
' +
+ '' +
+ '
'
+ );
+ }
+ }
+ }),
+
+ instantsearch.widgets.pagination({
+ container: '#algolia-pagination',
+ scrollTo: false,
+ showFirstLast: false,
+ labels: {
+ first: '',
+ last: '',
+ previous: '',
+ next: ''
+ },
+ cssClasses: {
+ root: 'pagination',
+ item: 'pagination-item',
+ link: 'page-number',
+ active: 'current',
+ disabled: 'disabled-item'
+ }
+ })
+ ].forEach(search.addWidget, search);
+
+ search.start();
+
+ $('.popup-trigger').on('click', function(e) {
+ e.stopPropagation();
+ $('body')
+ .append('')
+ .css('overflow', 'hidden');
+ $('.popup').toggle();
+ $('#algolia-search-input').find('input').focus();
+ });
+
+ $('.popup-btn-close').click(function(){
+ $('.popup').hide();
+ $('.algolia-pop-overlay').remove();
+ $('body').css('overflow', '');
+ });
+
+});
diff --git a/themes/Next/source/js/src/bootstrap.js b/themes/Next/source/js/src/bootstrap.js
new file mode 100644
index 0000000..d9c33ed
--- /dev/null
+++ b/themes/Next/source/js/src/bootstrap.js
@@ -0,0 +1,52 @@
+/* global NexT: true */
+
+$(document).ready(function () {
+
+ $(document).trigger('bootstrap:before');
+
+ NexT.utils.isMobile() && window.FastClick.attach(document.body);
+
+ NexT.utils.lazyLoadPostsImages();
+
+ NexT.utils.registerESCKeyEvent();
+
+ NexT.utils.registerBackToTop();
+
+ // Mobile top menu bar.
+ $('.site-nav-toggle button').on('click', function () {
+ var $siteNav = $('.site-nav');
+ var ON_CLASS_NAME = 'site-nav-on';
+ var isSiteNavOn = $siteNav.hasClass(ON_CLASS_NAME);
+ var animateAction = isSiteNavOn ? 'slideUp' : 'slideDown';
+ var animateCallback = isSiteNavOn ? 'removeClass' : 'addClass';
+
+ $siteNav.stop()[animateAction]('fast', function () {
+ $siteNav[animateCallback](ON_CLASS_NAME);
+ });
+ });
+
+ /**
+ * Register JS handlers by condition option.
+ * Need to add config option in Front-End at 'layout/_partials/head.swig' file.
+ */
+ CONFIG.fancybox && NexT.utils.wrapImageWithFancyBox();
+ CONFIG.tabs && NexT.utils.registerTabsTag();
+
+ NexT.utils.embeddedVideoTransformer();
+ NexT.utils.addActiveClassToMenuItem();
+
+
+ // Define Motion Sequence.
+ NexT.motion.integrator
+ .add(NexT.motion.middleWares.logo)
+ .add(NexT.motion.middleWares.menu)
+ .add(NexT.motion.middleWares.postList)
+ .add(NexT.motion.middleWares.sidebar);
+
+ $(document).trigger('motion:before');
+
+ // Bootstrap Motion.
+ CONFIG.motion.enable && NexT.motion.integrator.bootstrap();
+
+ $(document).trigger('bootstrap:after');
+});
diff --git a/themes/Next/source/js/src/exturl.js b/themes/Next/source/js/src/exturl.js
new file mode 100644
index 0000000..b85062a
--- /dev/null
+++ b/themes/Next/source/js/src/exturl.js
@@ -0,0 +1,15 @@
+/* global NexT: true */
+
+$(document).ready(function () {
+
+ // Create Base64 Object
+ var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9+/=]/g,"");while(f>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/rn/g,"n");var t="";for(var n=0;n127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}};
+
+ $('.exturl').on('click', function () {
+ var $exturl = $(this).attr('data-url');
+ var $decurl = Base64.decode($exturl);
+ window.open($decurl, '_blank');
+ return false;
+ });
+
+});
diff --git a/themes/Next/source/js/src/hook-duoshuo.js b/themes/Next/source/js/src/hook-duoshuo.js
new file mode 100644
index 0000000..ca64dbd
--- /dev/null
+++ b/themes/Next/source/js/src/hook-duoshuo.js
@@ -0,0 +1,115 @@
+/* global DUOSHUO: true */
+/* jshint camelcase: false */
+
+typeof DUOSHUO !== 'undefined' ?
+ hookTemplate() :
+ ($('#duoshuo-script')[0].onload = hookTemplate);
+
+
+function hookTemplate() {
+ var post = DUOSHUO.templates.post;
+
+ DUOSHUO.templates.post = function (e, t) {
+ var rs = post(e, t);
+ var agent = e.post.agent;
+ var userId = e.post.author.user_id;
+ var admin = '';
+
+ if (userId && (userId == CONFIG.duoshuo.userId)) {
+ admin = '' + CONFIG.duoshuo.author + '';
+ }
+
+ if (agent && /^Mozilla/.test(agent)) {
+ rs = rs.replace(/<\/div>/, admin + getAgentInfo(agent) + '
');
+ }
+
+ return rs;
+ };
+}
+
+function getAgentInfo(string) {
+ $.ua.set(string);
+
+ var UNKNOWN = 'Unknown';
+ var sua = $.ua;
+ var separator = isMobile() ? '
' : '';
+ var osName = sua.os.name || UNKNOWN;
+ var osVersion = sua.os.version || UNKNOWN;
+ var browserName = sua.browser.name || UNKNOWN;
+ var browserVersion = sua.browser.version || UNKNOWN;
+ var iconMapping = {
+ os: {
+ android : 'android',
+ linux : 'linux',
+ windows : 'windows',
+ ios : 'apple',
+ 'mac os': 'apple',
+ unknown : 'desktop'
+ },
+ browser: {
+ chrome : 'chrome',
+ chromium : 'chrome',
+ firefox : 'firefox',
+ opera : 'opera',
+ safari : 'safari',
+ ie : 'internet-explorer',
+ wechat : 'wechat',
+ qq : 'qq',
+ unknown : 'globe'
+ }
+ };
+ var osIcon = iconMapping.os[osName.toLowerCase()];
+ var browserIcon = iconMapping.browser[getBrowserKey()];
+
+ return separator +
+ '' +
+ '' +
+ osName + ' ' + osVersion +
+ '' + separator +
+ '' +
+ '' +
+ browserName + ' ' + browserVersion +
+ '';
+
+ function getBrowserKey () {
+ var key = browserName.toLowerCase();
+
+ if (key.match(/WeChat/i)) {
+ return 'wechat';
+ }
+
+ if (key.match(/QQBrowser/i)) {
+ return 'qq';
+ }
+
+ return key;
+ }
+
+ function isMobile() {
+ var userAgent = window.navigator.userAgent;
+
+ var isiPad = userAgent.match(/iPad/i) !== null;
+ var mobileUA = [
+ 'iphone', 'android', 'phone', 'mobile',
+ 'wap', 'netfront', 'x11', 'java', 'opera mobi',
+ 'opera mini', 'ucweb', 'windows ce', 'symbian',
+ 'symbianos', 'series', 'webos', 'sony',
+ 'blackberry', 'dopod', 'nokia', 'samsung',
+ 'palmsource', 'xda', 'pieplus', 'meizu',
+ 'midp' ,'cldc' , 'motorola', 'foma',
+ 'docomo', 'up.browser', 'up.link', 'blazer',
+ 'helio', 'hosin', 'huawei', 'novarra',
+ 'coolpad', 'webos', 'techfaith', 'palmsource',
+ 'alcatel', 'amoi', 'ktouch', 'nexian',
+ 'ericsson', 'philips', 'sagem', 'wellcom',
+ 'bunjalloo', 'maui', 'smartphone', 'iemobile',
+ 'spice', 'bird', 'zte-', 'longcos',
+ 'pantech', 'gionee', 'portalmmm', 'jig browser',
+ 'hiptop', 'benq', 'haier', '^lct',
+ '320x320', '240x320', '176x220'
+ ];
+ var pattern = new RegExp(mobileUA.join('|'), 'i');
+
+ return !isiPad && userAgent.match(pattern);
+ }
+}
diff --git a/themes/Next/source/js/src/js.cookie.js b/themes/Next/source/js/src/js.cookie.js
new file mode 100644
index 0000000..c6c3975
--- /dev/null
+++ b/themes/Next/source/js/src/js.cookie.js
@@ -0,0 +1,165 @@
+/*!
+ * JavaScript Cookie v2.1.4
+ * https://github.com/js-cookie/js-cookie
+ *
+ * Copyright 2006, 2015 Klaus Hartl & Fagner Brack
+ * Released under the MIT license
+ */
+;(function (factory) {
+ var registeredInModuleLoader = false;
+ if (typeof define === 'function' && define.amd) {
+ define(factory);
+ registeredInModuleLoader = true;
+ }
+ if (typeof exports === 'object') {
+ module.exports = factory();
+ registeredInModuleLoader = true;
+ }
+ if (!registeredInModuleLoader) {
+ var OldCookies = window.Cookies;
+ var api = window.Cookies = factory();
+ api.noConflict = function () {
+ window.Cookies = OldCookies;
+ return api;
+ };
+ }
+}(function () {
+ function extend () {
+ var i = 0;
+ var result = {};
+ for (; i < arguments.length; i++) {
+ var attributes = arguments[ i ];
+ for (var key in attributes) {
+ result[key] = attributes[key];
+ }
+ }
+ return result;
+ }
+
+ function init (converter) {
+ function api (key, value, attributes) {
+ var result;
+ if (typeof document === 'undefined') {
+ return;
+ }
+
+ // Write
+
+ if (arguments.length > 1) {
+ attributes = extend({
+ path: '/'
+ }, api.defaults, attributes);
+
+ if (typeof attributes.expires === 'number') {
+ var expires = new Date();
+ expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);
+ attributes.expires = expires;
+ }
+
+ // We're using "expires" because "max-age" is not supported by IE
+ attributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';
+
+ try {
+ result = JSON.stringify(value);
+ if (/^[\{\[]/.test(result)) {
+ value = result;
+ }
+ } catch (e) {}
+
+ if (!converter.write) {
+ value = encodeURIComponent(String(value))
+ .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);
+ } else {
+ value = converter.write(value, key);
+ }
+
+ key = encodeURIComponent(String(key));
+ key = key.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent);
+ key = key.replace(/[\(\)]/g, escape);
+
+ var stringifiedAttributes = '';
+
+ for (var attributeName in attributes) {
+ if (!attributes[attributeName]) {
+ continue;
+ }
+ stringifiedAttributes += '; ' + attributeName;
+ if (attributes[attributeName] === true) {
+ continue;
+ }
+ stringifiedAttributes += '=' + attributes[attributeName];
+ }
+ return (document.cookie = key + '=' + value + stringifiedAttributes);
+ }
+
+ // Read
+
+ if (!key) {
+ result = {};
+ }
+
+ // To prevent the for loop in the first place assign an empty array
+ // in case there are no cookies at all. Also prevents odd result when
+ // calling "get()"
+ var cookies = document.cookie ? document.cookie.split('; ') : [];
+ var rdecode = /(%[0-9A-Z]{2})+/g;
+ var i = 0;
+
+ for (; i < cookies.length; i++) {
+ var parts = cookies[i].split('=');
+ var cookie = parts.slice(1).join('=');
+
+ if (cookie.charAt(0) === '"') {
+ cookie = cookie.slice(1, -1);
+ }
+
+ try {
+ var name = parts[0].replace(rdecode, decodeURIComponent);
+ cookie = converter.read ?
+ converter.read(cookie, name) : converter(cookie, name) ||
+ cookie.replace(rdecode, decodeURIComponent);
+
+ if (this.json) {
+ try {
+ cookie = JSON.parse(cookie);
+ } catch (e) {}
+ }
+
+ if (key === name) {
+ result = cookie;
+ break;
+ }
+
+ if (!key) {
+ result[name] = cookie;
+ }
+ } catch (e) {}
+ }
+
+ return result;
+ }
+
+ api.set = api;
+ api.get = function (key) {
+ return api.call(api, key);
+ };
+ api.getJSON = function () {
+ return api.apply({
+ json: true
+ }, [].slice.call(arguments));
+ };
+ api.defaults = {};
+
+ api.remove = function (key, attributes) {
+ api(key, '', extend(attributes, {
+ expires: -1
+ }));
+ };
+
+ api.withConverter = init;
+
+ return api;
+ }
+
+ return init(function () {});
+}));
diff --git a/themes/Next/source/js/src/motion.js b/themes/Next/source/js/src/motion.js
new file mode 100644
index 0000000..1129179
--- /dev/null
+++ b/themes/Next/source/js/src/motion.js
@@ -0,0 +1,352 @@
+/* global NexT: true */
+
+$(document).ready(function () {
+ NexT.motion = {};
+
+ var sidebarToggleLines = {
+ lines: [],
+ push: function (line) {
+ this.lines.push(line);
+ },
+ init: function () {
+ this.lines.forEach(function (line) {
+ line.init();
+ });
+ },
+ arrow: function () {
+ this.lines.forEach(function (line) {
+ line.arrow();
+ });
+ },
+ close: function () {
+ this.lines.forEach(function (line) {
+ line.close();
+ });
+ }
+ };
+
+ function SidebarToggleLine(settings) {
+ this.el = $(settings.el);
+ this.status = $.extend({}, {
+ init: {
+ width: '100%',
+ opacity: 1,
+ left: 0,
+ rotateZ: 0,
+ top: 0
+ }
+ }, settings.status);
+ }
+
+ SidebarToggleLine.prototype.init = function () {
+ this.transform('init');
+ };
+ SidebarToggleLine.prototype.arrow = function () {
+ this.transform('arrow');
+ };
+ SidebarToggleLine.prototype.close = function () {
+ this.transform('close');
+ };
+ SidebarToggleLine.prototype.transform = function (status) {
+ this.el.velocity('stop').velocity(this.status[status]);
+ };
+
+ var sidebarToggleLine1st = new SidebarToggleLine({
+ el: '.sidebar-toggle-line-first',
+ status: {
+ arrow: {width: '50%', rotateZ: '-45deg', top: '2px'},
+ close: {width: '100%', rotateZ: '-45deg', top: '5px'}
+ }
+ });
+ var sidebarToggleLine2nd = new SidebarToggleLine({
+ el: '.sidebar-toggle-line-middle',
+ status: {
+ arrow: {width: '90%'},
+ close: {opacity: 0}
+ }
+ });
+ var sidebarToggleLine3rd = new SidebarToggleLine({
+ el: '.sidebar-toggle-line-last',
+ status: {
+ arrow: {width: '50%', rotateZ: '45deg', top: '-2px'},
+ close: {width: '100%', rotateZ: '45deg', top: '-5px'}
+ }
+ });
+
+ sidebarToggleLines.push(sidebarToggleLine1st);
+ sidebarToggleLines.push(sidebarToggleLine2nd);
+ sidebarToggleLines.push(sidebarToggleLine3rd);
+
+ var SIDEBAR_WIDTH = '320px';
+ var SIDEBAR_DISPLAY_DURATION = 200;
+ var xPos, yPos;
+
+ var sidebarToggleMotion = {
+ toggleEl: $('.sidebar-toggle'),
+ dimmerEl: $('#sidebar-dimmer'),
+ sidebarEl: $('.sidebar'),
+ isSidebarVisible: false,
+ init: function () {
+ this.toggleEl.on('click', this.clickHandler.bind(this));
+ this.dimmerEl.on('click', this.clickHandler.bind(this));
+ this.toggleEl.on('mouseenter', this.mouseEnterHandler.bind(this));
+ this.toggleEl.on('mouseleave', this.mouseLeaveHandler.bind(this));
+ this.sidebarEl.on('touchstart', this.touchstartHandler.bind(this));
+ this.sidebarEl.on('touchend', this.touchendHandler.bind(this));
+ this.sidebarEl.on('touchmove', function(e){e.preventDefault();});
+
+ $(document)
+ .on('sidebar.isShowing', function () {
+ NexT.utils.isDesktop() && $('body').velocity('stop').velocity(
+ {paddingRight: SIDEBAR_WIDTH},
+ SIDEBAR_DISPLAY_DURATION
+ );
+ })
+ .on('sidebar.isHiding', function () {
+ });
+ },
+ clickHandler: function () {
+ this.isSidebarVisible ? this.hideSidebar() : this.showSidebar();
+ this.isSidebarVisible = !this.isSidebarVisible;
+ },
+ mouseEnterHandler: function () {
+ if (this.isSidebarVisible) {
+ return;
+ }
+ sidebarToggleLines.arrow();
+ },
+ mouseLeaveHandler: function () {
+ if (this.isSidebarVisible) {
+ return;
+ }
+ sidebarToggleLines.init();
+ },
+ touchstartHandler: function(e) {
+ xPos = e.originalEvent.touches[0].clientX;
+ yPos = e.originalEvent.touches[0].clientY;
+ },
+ touchendHandler: function(e) {
+ var _xPos = e.originalEvent.changedTouches[0].clientX;
+ var _yPos = e.originalEvent.changedTouches[0].clientY;
+ if (_xPos-xPos > 30 && Math.abs(_yPos-yPos) < 20) {
+ this.clickHandler();
+ }
+ },
+ showSidebar: function () {
+ var self = this;
+
+ sidebarToggleLines.close();
+
+ this.sidebarEl.velocity('stop').velocity({
+ width: SIDEBAR_WIDTH
+ }, {
+ display: 'block',
+ duration: SIDEBAR_DISPLAY_DURATION,
+ begin: function () {
+ $('.sidebar .motion-element').velocity(
+ 'transition.slideRightIn',
+ {
+ stagger: 50,
+ drag: true,
+ complete: function () {
+ self.sidebarEl.trigger('sidebar.motion.complete');
+ }
+ }
+ );
+ },
+ complete: function () {
+ self.sidebarEl.addClass('sidebar-active');
+ self.sidebarEl.trigger('sidebar.didShow');
+ }
+ }
+ );
+
+ this.sidebarEl.trigger('sidebar.isShowing');
+ },
+ hideSidebar: function () {
+ NexT.utils.isDesktop() && $('body').velocity('stop').velocity({paddingRight: 0});
+ this.sidebarEl.find('.motion-element').velocity('stop').css('display', 'none');
+ this.sidebarEl.velocity('stop').velocity({width: 0}, {display: 'none'});
+
+ sidebarToggleLines.init();
+
+ this.sidebarEl.removeClass('sidebar-active');
+ this.sidebarEl.trigger('sidebar.isHiding');
+
+ // Prevent adding TOC to Overview if Overview was selected when close & open sidebar.
+ if (!!$('.post-toc-wrap')) {
+ if ($('.site-overview-wrap').css('display') === 'block') {
+ $('.post-toc-wrap').removeClass('motion-element');
+ } else {
+ $('.post-toc-wrap').addClass('motion-element');
+ }
+ }
+ }
+ };
+ sidebarToggleMotion.init();
+
+ NexT.motion.integrator = {
+ queue: [],
+ cursor: -1,
+ add: function (fn) {
+ this.queue.push(fn);
+ return this;
+ },
+ next: function () {
+ this.cursor++;
+ var fn = this.queue[this.cursor];
+ $.isFunction(fn) && fn(NexT.motion.integrator);
+ },
+ bootstrap: function () {
+ this.next();
+ }
+ };
+
+ NexT.motion.middleWares = {
+ logo: function (integrator) {
+ var sequence = [];
+ var $brand = $('.brand');
+ var $title = $('.site-title');
+ var $subtitle = $('.site-subtitle');
+ var $logoLineTop = $('.logo-line-before i');
+ var $logoLineBottom = $('.logo-line-after i');
+
+ $brand.size() > 0 && sequence.push({
+ e: $brand,
+ p: {opacity: 1},
+ o: {duration: 200}
+ });
+
+ NexT.utils.isMist() && hasElement([$logoLineTop, $logoLineBottom]) &&
+ sequence.push(
+ getMistLineSettings($logoLineTop, '100%'),
+ getMistLineSettings($logoLineBottom, '-100%')
+ );
+
+ hasElement($title) && sequence.push({
+ e: $title,
+ p: {opacity: 1, top: 0},
+ o: { duration: 200 }
+ });
+
+ hasElement($subtitle) && sequence.push({
+ e: $subtitle,
+ p: {opacity: 1, top: 0},
+ o: {duration: 200}
+ });
+
+ if (CONFIG.motion.async) {
+ integrator.next();
+ }
+
+ if (sequence.length > 0) {
+ sequence[sequence.length - 1].o.complete = function () {
+ integrator.next();
+ };
+ $.Velocity.RunSequence(sequence);
+ } else {
+ integrator.next();
+ }
+
+
+ function getMistLineSettings (element, translateX) {
+ return {
+ e: $(element),
+ p: {translateX: translateX},
+ o: {
+ duration: 500,
+ sequenceQueue: false
+ }
+ };
+ }
+
+ /**
+ * Check if $elements exist.
+ * @param {jQuery|Array} $elements
+ * @returns {boolean}
+ */
+ function hasElement ($elements) {
+ $elements = Array.isArray($elements) ? $elements : [$elements];
+ return $elements.every(function ($element) {
+ return $.isFunction($element.size) && $element.size() > 0;
+ });
+ }
+ },
+
+ menu: function (integrator) {
+
+ if (CONFIG.motion.async) {
+ integrator.next();
+ }
+
+ $('.menu-item').velocity('transition.slideDownIn', {
+ display: null,
+ duration: 200,
+ complete: function () {
+ integrator.next();
+ }
+ });
+ },
+
+ postList: function (integrator) {
+ //var $post = $('.post');
+ var $postBlock = $('.post-block, .pagination, .comments');
+ var $postBlockTransition = CONFIG.motion.transition.post_block;
+ var $postHeader = $('.post-header');
+ var $postHeaderTransition = CONFIG.motion.transition.post_header;
+ var $postBody = $('.post-body');
+ var $postBodyTransition = CONFIG.motion.transition.post_body;
+ var $collHeader = $('.collection-title, .archive-year');
+ var $collHeaderTransition = CONFIG.motion.transition.coll_header;
+ var $sidebarAffix = $('.sidebar-inner');
+ var $sidebarAffixTransition = CONFIG.motion.transition.sidebar;
+ var hasPost = $postBlock.size() > 0;
+
+ hasPost ? postMotion() : integrator.next();
+
+ if (CONFIG.motion.async) {
+ integrator.next();
+ }
+
+ function postMotion () {
+ var postMotionOptions = window.postMotionOptions || {
+ stagger: 100,
+ drag: true
+ };
+ postMotionOptions.complete = function () {
+ // After motion complete need to remove transform from sidebar to let affix work on Pisces | Gemini.
+ if (CONFIG.motion.transition.sidebar && (NexT.utils.isPisces() || NexT.utils.isGemini())) {
+ $sidebarAffix.css({ 'transform': 'initial' });
+ }
+ integrator.next();
+ };
+
+ //$post.velocity('transition.slideDownIn', postMotionOptions);
+ if (CONFIG.motion.transition.post_block) {
+ $postBlock.velocity('transition.' + $postBlockTransition, postMotionOptions);
+ }
+ if (CONFIG.motion.transition.post_header) {
+ $postHeader.velocity('transition.' + $postHeaderTransition, postMotionOptions);
+ }
+ if (CONFIG.motion.transition.post_body) {
+ $postBody.velocity('transition.' + $postBodyTransition, postMotionOptions);
+ }
+ if (CONFIG.motion.transition.coll_header) {
+ $collHeader.velocity('transition.' + $collHeaderTransition, postMotionOptions);
+ }
+ // Only for Pisces | Gemini.
+ if (CONFIG.motion.transition.sidebar && (NexT.utils.isPisces() || NexT.utils.isGemini())) {
+ $sidebarAffix.velocity('transition.' + $sidebarAffixTransition, postMotionOptions);
+ }
+ }
+ },
+
+ sidebar: function (integrator) {
+ if (CONFIG.sidebar.display === 'always') {
+ NexT.utils.displaySidebar();
+ }
+ integrator.next();
+ }
+ };
+
+});
diff --git a/themes/Next/source/js/src/post-details.js b/themes/Next/source/js/src/post-details.js
new file mode 100644
index 0000000..a82bcc2
--- /dev/null
+++ b/themes/Next/source/js/src/post-details.js
@@ -0,0 +1,99 @@
+/* global NexT: true */
+
+$(document).ready(function () {
+
+ initScrollSpy();
+
+ function initScrollSpy () {
+ var tocSelector = '.post-toc';
+ var $tocElement = $(tocSelector);
+ var activeCurrentSelector = '.active-current';
+
+ $tocElement
+ .on('activate.bs.scrollspy', function () {
+ var $currentActiveElement = $(tocSelector + ' .active').last();
+
+ removeCurrentActiveClass();
+ $currentActiveElement.addClass('active-current');
+
+ // Scrolling to center active TOC element if TOC content is taller then viewport.
+ $tocElement.scrollTop($currentActiveElement.offset().top - $tocElement.offset().top + $tocElement.scrollTop() - ($tocElement.height() / 2));
+ })
+ .on('clear.bs.scrollspy', removeCurrentActiveClass);
+
+ $('body').scrollspy({ target: tocSelector });
+
+ function removeCurrentActiveClass () {
+ $(tocSelector + ' ' + activeCurrentSelector)
+ .removeClass(activeCurrentSelector.substring(1));
+ }
+ }
+
+});
+
+$(document).ready(function () {
+ var html = $('html');
+ var TAB_ANIMATE_DURATION = 200;
+ var hasVelocity = $.isFunction(html.velocity);
+
+ $('.sidebar-nav li').on('click', function () {
+ var item = $(this);
+ var activeTabClassName = 'sidebar-nav-active';
+ var activePanelClassName = 'sidebar-panel-active';
+ if (item.hasClass(activeTabClassName)) {
+ return;
+ }
+
+ var currentTarget = $('.' + activePanelClassName);
+ var target = $('.' + item.data('target'));
+
+ hasVelocity ?
+ currentTarget.velocity('transition.slideUpOut', TAB_ANIMATE_DURATION, function () {
+ target
+ .velocity('stop')
+ .velocity('transition.slideDownIn', TAB_ANIMATE_DURATION)
+ .addClass(activePanelClassName);
+ }) :
+ currentTarget.animate({ opacity: 0 }, TAB_ANIMATE_DURATION, function () {
+ currentTarget.hide();
+ target
+ .stop()
+ .css({'opacity': 0, 'display': 'block'})
+ .animate({ opacity: 1 }, TAB_ANIMATE_DURATION, function () {
+ currentTarget.removeClass(activePanelClassName);
+ target.addClass(activePanelClassName);
+ });
+ });
+
+ item.siblings().removeClass(activeTabClassName);
+ item.addClass(activeTabClassName);
+ });
+
+ // TOC item animation navigate & prevent #item selector in adress bar.
+ $('.post-toc a').on('click', function (e) {
+ e.preventDefault();
+ var targetSelector = NexT.utils.escapeSelector(this.getAttribute('href'));
+ var offset = $(targetSelector).offset().top;
+
+ hasVelocity ?
+ html.velocity('stop').velocity('scroll', {
+ offset: offset + 'px',
+ mobileHA: false
+ }) :
+ $('html, body').stop().animate({
+ scrollTop: offset
+ }, 500);
+ });
+
+ // Expand sidebar on post detail page by default, when post has a toc.
+ var $tocContent = $('.post-toc-content');
+ var isSidebarCouldDisplay = CONFIG.sidebar.display === 'post' ||
+ CONFIG.sidebar.display === 'always';
+ var hasTOC = $tocContent.length > 0 && $tocContent.html().trim().length > 0;
+ if (isSidebarCouldDisplay && hasTOC) {
+ CONFIG.motion.enable ?
+ (NexT.motion.middleWares.sidebar = function () {
+ NexT.utils.displaySidebar();
+ }) : NexT.utils.displaySidebar();
+ }
+});
diff --git a/themes/Next/source/js/src/schemes/pisces.js b/themes/Next/source/js/src/schemes/pisces.js
new file mode 100644
index 0000000..0e6e426
--- /dev/null
+++ b/themes/Next/source/js/src/schemes/pisces.js
@@ -0,0 +1,57 @@
+$(document).ready(function () {
+
+ var sidebarInner = $('.sidebar-inner');
+
+ initAffix();
+ resizeListener();
+
+ function initAffix () {
+ var headerOffset = getHeaderOffset(),
+ footerOffset = getFooterOffset(),
+ sidebarHeight = $('#sidebar').height() + NexT.utils.getSidebarb2tHeight(),
+ contentHeight = $('#content').height();
+
+ // Not affix if sidebar taller then content (to prevent bottom jumping).
+ if (headerOffset + sidebarHeight < contentHeight) {
+ sidebarInner.affix({
+ offset: {
+ top: headerOffset - CONFIG.sidebar.offset,
+ bottom: footerOffset
+ }
+ });
+ }
+
+ setSidebarMarginTop(headerOffset).css({ 'margin-left': 'initial' });
+ }
+
+ function resizeListener () {
+ var mql = window.matchMedia('(min-width: 991px)');
+ mql.addListener(function(e){
+ if(e.matches){
+ recalculateAffixPosition();
+ }
+ });
+ }
+
+ function getHeaderOffset () {
+ return $('.header-inner').height() + CONFIG.sidebar.offset;
+ }
+
+ function getFooterOffset () {
+ var footerInner = $('.footer-inner'),
+ footerMargin = footerInner.outerHeight(true) - footerInner.outerHeight(),
+ footerOffset = footerInner.outerHeight(true) + footerMargin;
+ return footerOffset;
+ }
+
+ function setSidebarMarginTop (headerOffset) {
+ return $('#sidebar').css({ 'margin-top': headerOffset });
+ }
+
+ function recalculateAffixPosition () {
+ $(window).off('.affix');
+ sidebarInner.removeData('bs.affix').removeClass('affix affix-top affix-bottom');
+ initAffix();
+ }
+
+});
diff --git a/themes/Next/source/js/src/scroll-cookie.js b/themes/Next/source/js/src/scroll-cookie.js
new file mode 100644
index 0000000..34ff200
--- /dev/null
+++ b/themes/Next/source/js/src/scroll-cookie.js
@@ -0,0 +1,23 @@
+$(document).ready(function() {
+
+ // Set relative link path (without domain)
+ var rpath = window.location.href.replace(window.location.origin, "");
+
+ // Write position in cookie
+ var timeout;
+ $(window).on("scroll", function() {
+ clearTimeout(timeout);
+ timeout = setTimeout(function () {
+ Cookies.set("scroll-cookie", ($(window).scrollTop() + "|" + rpath), { expires: 365, path: '' });
+ }, 250);
+ });
+
+ // Read position from cookie
+ if (Cookies.get("scroll-cookie") !== undefined) {
+ var cvalues = Cookies.get("scroll-cookie").split('|');
+ if (cvalues[1] == rpath) {
+ $(window).scrollTop(cvalues[0]);
+ }
+ }
+
+});
diff --git a/themes/Next/source/js/src/scrollspy.js b/themes/Next/source/js/src/scrollspy.js
new file mode 100644
index 0000000..f5c5c6c
--- /dev/null
+++ b/themes/Next/source/js/src/scrollspy.js
@@ -0,0 +1,182 @@
+/* ========================================================================
+* Bootstrap: scrollspy.js v3.3.2
+* http://getbootstrap.com/javascript/#scrollspy
+* ========================================================================
+* Copyright 2011-2015 Twitter, Inc.
+* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+* ======================================================================== */
+
+/**
+ * Custom by iissnan
+ *
+ * - Add a `clear.bs.scrollspy` event.
+ * - Esacpe targets selector.
+ */
+
+
++function ($) {
+ 'use strict';
+
+ // SCROLLSPY CLASS DEFINITION
+ // ==========================
+
+ function ScrollSpy(element, options) {
+ this.$body = $(document.body)
+ this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
+ this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
+ this.selector = (this.options.target || '') + ' .nav li > a'
+ this.offsets = []
+ this.targets = []
+ this.activeTarget = null
+ this.scrollHeight = 0
+
+ this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
+ this.refresh()
+ this.process()
+ }
+
+ ScrollSpy.VERSION = '3.3.2'
+
+ ScrollSpy.DEFAULTS = {
+ offset: 10
+ }
+
+ ScrollSpy.prototype.getScrollHeight = function () {
+ return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
+ }
+
+ ScrollSpy.prototype.refresh = function () {
+ var that = this
+ var offsetMethod = 'offset'
+ var offsetBase = 0
+
+ this.offsets = []
+ this.targets = []
+ this.scrollHeight = this.getScrollHeight()
+
+ if (!$.isWindow(this.$scrollElement[0])) {
+ offsetMethod = 'position'
+ offsetBase = this.$scrollElement.scrollTop()
+ }
+
+ this.$body
+ .find(this.selector)
+ .map(function () {
+ var $el = $(this)
+ var href = $el.data('target') || $el.attr('href')
+ var $href = /^#./.test(href) && $(NexT.utils.escapeSelector(href)) // Need to escape selector.
+
+ return ($href
+ && $href.length
+ && $href.is(':visible')
+ && [[$href[offsetMethod]().top + offsetBase, href]]) || null
+ })
+ .sort(function (a, b) { return a[0] - b[0] })
+ .each(function () {
+ that.offsets.push(this[0])
+ that.targets.push(this[1])
+ })
+
+
+ }
+
+ ScrollSpy.prototype.process = function () {
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
+ var scrollHeight = this.getScrollHeight()
+ var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
+ var offsets = this.offsets
+ var targets = this.targets
+ var activeTarget = this.activeTarget
+ var i
+
+ if (this.scrollHeight != scrollHeight) {
+ this.refresh()
+ }
+
+ if (scrollTop >= maxScroll) {
+ return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
+ }
+
+ if (activeTarget && scrollTop < offsets[0]) {
+ $(this.selector).trigger('clear.bs.scrollspy') // Add a custom event.
+ this.activeTarget = null
+ return this.clear()
+ }
+
+ for (i = offsets.length; i--;) {
+ activeTarget != targets[i]
+ && scrollTop >= offsets[i]
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+ && this.activate(targets[i])
+ }
+ }
+
+ ScrollSpy.prototype.activate = function (target) {
+ this.activeTarget = target
+
+ this.clear()
+
+ var selector = this.selector +
+ '[data-target="' + target + '"],' +
+ this.selector + '[href="' + target + '"]'
+
+ var active = $(selector)
+ .parents('li')
+ .addClass('active')
+
+ if (active.parent('.dropdown-menu').length) {
+ active = active
+ .closest('li.dropdown')
+ .addClass('active')
+ }
+
+ active.trigger('activate.bs.scrollspy')
+ }
+
+ ScrollSpy.prototype.clear = function () {
+ $(this.selector)
+ .parentsUntil(this.options.target, '.active')
+ .removeClass('active')
+ }
+
+
+ // SCROLLSPY PLUGIN DEFINITION
+ // ===========================
+
+ function Plugin(option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.scrollspy')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ var old = $.fn.scrollspy
+
+ $.fn.scrollspy = Plugin
+ $.fn.scrollspy.Constructor = ScrollSpy
+
+
+ // SCROLLSPY NO CONFLICT
+ // =====================
+
+ $.fn.scrollspy.noConflict = function () {
+ $.fn.scrollspy = old
+ return this
+ }
+
+
+ // SCROLLSPY DATA-API
+ // ==================
+
+ $(window).on('load.bs.scrollspy.data-api', function () {
+ $('[data-spy="scroll"]').each(function () {
+ var $spy = $(this)
+ Plugin.call($spy, $spy.data())
+ })
+ })
+
+}(jQuery);
diff --git a/themes/Next/source/js/src/utils.js b/themes/Next/source/js/src/utils.js
new file mode 100644
index 0000000..33c50e8
--- /dev/null
+++ b/themes/Next/source/js/src/utils.js
@@ -0,0 +1,337 @@
+/* global NexT: true */
+
+NexT.utils = NexT.$u = {
+ /**
+ * Wrap images with fancybox support.
+ */
+ wrapImageWithFancyBox: function () {
+ $('.content img')
+ .not('[hidden]')
+ .not('.group-picture img, .post-gallery img')
+ .each(function () {
+ var $image = $(this);
+ var imageTitle = $image.attr('title');
+ var $imageWrapLink = $image.parent('a');
+
+ if ($imageWrapLink.size() < 1) {
+ var imageLink = ($image.attr('data-original')) ? this.getAttribute('data-original') : this.getAttribute('src');
+ $imageWrapLink = $image.wrap('').parent('a');
+ }
+
+ $imageWrapLink.addClass('fancybox fancybox.image');
+ $imageWrapLink.attr('rel', 'group');
+
+ if (imageTitle) {
+ $imageWrapLink.append('
' + imageTitle + '
');
+
+ //make sure img title tag will show correctly in fancybox
+ $imageWrapLink.attr('title', imageTitle);
+ }
+ });
+
+ $('.fancybox').fancybox({
+ helpers: {
+ overlay: {
+ locked: false
+ }
+ }
+ });
+ },
+
+ lazyLoadPostsImages: function () {
+ $('#posts').find('img').lazyload({
+ //placeholder: '/images/loading.gif',
+ effect: 'fadeIn',
+ threshold : 0
+ });
+ },
+
+ /**
+ * Tabs tag listener (without twitter bootstrap).
+ */
+ registerTabsTag: function () {
+ var tNav = '.tabs ul.nav-tabs ';
+
+ // Binding `nav-tabs` & `tab-content` by real time permalink changing.
+ $(function() {
+ $(window).bind('hashchange', function() {
+ var tHash = location.hash;
+ if (tHash !== '') {
+ $(tNav + 'li:has(a[href="' + tHash + '"])').addClass('active').siblings().removeClass('active');
+ $(tHash).addClass('active').siblings().removeClass('active');
+ }
+ }).trigger('hashchange');
+ });
+
+ $(tNav + '.tab').on('click', function (href) {
+ href.preventDefault();
+ // Prevent selected tab to select again.
+ if(!$(this).hasClass('active')){
+
+ // Add & Remove active class on `nav-tabs` & `tab-content`.
+ $(this).addClass('active').siblings().removeClass('active');
+ var tActive = $(this).find('a').attr('href');
+ $(tActive).addClass('active').siblings().removeClass('active');
+
+ // Clear location hash in browser if #permalink exists.
+ if (location.hash !== '') {
+ history.pushState('', document.title, window.location.pathname + window.location.search);
+ }
+ }
+ });
+
+ },
+
+ registerESCKeyEvent: function () {
+ $(document).on('keyup', function (event) {
+ var shouldDismissSearchPopup = event.which === 27 &&
+ $('.search-popup').is(':visible');
+ if (shouldDismissSearchPopup) {
+ $('.search-popup').hide();
+ $('.search-popup-overlay').remove();
+ $('body').css('overflow', '');
+ }
+ });
+ },
+
+ registerBackToTop: function () {
+ var THRESHOLD = 50;
+ var $top = $('.back-to-top');
+
+ $(window).on('scroll', function () {
+ $top.toggleClass('back-to-top-on', window.pageYOffset > THRESHOLD);
+
+ var scrollTop = $(window).scrollTop();
+ var contentVisibilityHeight = NexT.utils.getContentVisibilityHeight();
+ var scrollPercent = (scrollTop) / (contentVisibilityHeight);
+ var scrollPercentRounded = Math.round(scrollPercent*100);
+ var scrollPercentMaxed = (scrollPercentRounded > 100) ? 100 : scrollPercentRounded;
+ $('#scrollpercent>span').html(scrollPercentMaxed);
+ });
+
+ $top.on('click', function () {
+ $('body').velocity('scroll');
+ });
+ },
+
+ /**
+ * Transform embedded video to support responsive layout.
+ * @see http://toddmotto.com/fluid-and-responsive-youtube-and-vimeo-videos-with-fluidvids-js/
+ */
+ embeddedVideoTransformer: function () {
+ var $iframes = $('iframe');
+
+ // Supported Players. Extend this if you need more players.
+ var SUPPORTED_PLAYERS = [
+ 'www.youtube.com',
+ 'player.vimeo.com',
+ 'player.youku.com',
+ 'music.163.com',
+ 'www.tudou.com'
+ ];
+ var pattern = new RegExp( SUPPORTED_PLAYERS.join('|') );
+
+ $iframes.each(function () {
+ var iframe = this;
+ var $iframe = $(this);
+ var oldDimension = getDimension($iframe);
+ var newDimension;
+
+ if (this.src.search(pattern) > 0) {
+
+ // Calculate the video ratio based on the iframe's w/h dimensions
+ var videoRatio = getAspectRadio(oldDimension.width, oldDimension.height);
+
+ // Replace the iframe's dimensions and position the iframe absolute
+ // This is the trick to emulate the video ratio
+ $iframe.width('100%').height('100%')
+ .css({
+ position: 'absolute',
+ top: '0',
+ left: '0'
+ });
+
+
+ // Wrap the iframe in a new which uses a dynamically fetched padding-top property
+ // based on the video's w/h dimensions
+ var wrap = document.createElement('div');
+ wrap.className = 'fluid-vids';
+ wrap.style.position = 'relative';
+ wrap.style.marginBottom = '20px';
+ wrap.style.width = '100%';
+ wrap.style.paddingTop = videoRatio + '%';
+ // Fix for appear inside tabs tag.
+ (wrap.style.paddingTop === '') && (wrap.style.paddingTop = '50%');
+
+ // Add the iframe inside our newly created
+ var iframeParent = iframe.parentNode;
+ iframeParent.insertBefore(wrap, iframe);
+ wrap.appendChild(iframe);
+
+ // Additional adjustments for 163 Music
+ if (this.src.search('music.163.com') > 0) {
+ newDimension = getDimension($iframe);
+ var shouldRecalculateAspect = newDimension.width > oldDimension.width ||
+ newDimension.height < oldDimension.height;
+
+ // 163 Music Player has a fixed height, so we need to reset the aspect radio
+ if (shouldRecalculateAspect) {
+ wrap.style.paddingTop = getAspectRadio(newDimension.width, oldDimension.height) + '%';
+ }
+ }
+ }
+ });
+
+ function getDimension($element) {
+ return {
+ width: $element.width(),
+ height: $element.height()
+ };
+ }
+
+ function getAspectRadio(width, height) {
+ return height / width * 100;
+ }
+ },
+
+ /**
+ * Add `menu-item-active` class name to menu item
+ * via comparing location.path with menu item's href.
+ */
+ addActiveClassToMenuItem: function () {
+ var path = window.location.pathname;
+ path = path === '/' ? path : path.substring(0, path.length - 1);
+ $('.menu-item a[href^="' + path + '"]:first').parent().addClass('menu-item-active');
+ },
+
+ hasMobileUA: function () {
+ var nav = window.navigator;
+ var ua = nav.userAgent;
+ var pa = /iPad|iPhone|Android|Opera Mini|BlackBerry|webOS|UCWEB|Blazer|PSP|IEMobile|Symbian/g;
+
+ return pa.test(ua);
+ },
+
+ isTablet: function () {
+ return window.screen.width < 992 && window.screen.width > 767 && this.hasMobileUA();
+ },
+
+ isMobile: function () {
+ return window.screen.width < 767 && this.hasMobileUA();
+ },
+
+ isDesktop: function () {
+ return !this.isTablet() && !this.isMobile();
+ },
+
+ /**
+ * Escape meta symbols in jQuery selectors.
+ *
+ * @param selector
+ * @returns {string|void|XML|*}
+ */
+ escapeSelector: function (selector) {
+ return selector.replace(/[!"$%&'()*+,.\/:;<=>?@[\\\]^`{|}~]/g, '\\$&');
+ },
+
+ displaySidebar: function () {
+ if (!this.isDesktop() || this.isPisces() || this.isGemini()) {
+ return;
+ }
+ $('.sidebar-toggle').trigger('click');
+ },
+
+ isMist: function () {
+ return CONFIG.scheme === 'Mist';
+ },
+
+ isPisces: function () {
+ return CONFIG.scheme === 'Pisces';
+ },
+
+ isGemini: function () {
+ return CONFIG.scheme === 'Gemini';
+ },
+
+ getScrollbarWidth: function () {
+ var $div = $('').addClass('scrollbar-measure').prependTo('body');
+ var div = $div[0];
+ var scrollbarWidth = div.offsetWidth - div.clientWidth;
+
+ $div.remove();
+
+ return scrollbarWidth;
+ },
+
+ getContentVisibilityHeight: function () {
+ var docHeight = $('#content').height(),
+ winHeight = $(window).height(),
+ contentVisibilityHeight = (docHeight > winHeight) ? (docHeight - winHeight) : ($(document).height() - winHeight);
+ return contentVisibilityHeight;
+ },
+
+ getSidebarb2tHeight: function () {
+ //var sidebarb2tHeight = (CONFIG.sidebar.b2t) ? document.getElementsByClassName('back-to-top')[0].clientHeight : 0;
+ var sidebarb2tHeight = (CONFIG.sidebar.b2t) ? $('.back-to-top').height() : 0;
+ //var sidebarb2tHeight = (CONFIG.sidebar.b2t) ? 24 : 0;
+ return sidebarb2tHeight;
+ },
+
+ getSidebarSchemePadding: function () {
+ var sidebarNavHeight = ($('.sidebar-nav').css('display') == 'block') ? $('.sidebar-nav').outerHeight(true) : 0,
+ sidebarInner = $('.sidebar-inner'),
+ sidebarPadding = sidebarInner.innerWidth() - sidebarInner.width(),
+ sidebarSchemePadding = this.isPisces() || this.isGemini() ?
+ ((sidebarPadding * 2) + sidebarNavHeight + (CONFIG.sidebar.offset * 2) + this.getSidebarb2tHeight()) :
+ ((sidebarPadding * 2) + (sidebarNavHeight / 2));
+ return sidebarSchemePadding;
+ }
+
+ /**
+ * Affix behaviour for Sidebar.
+ *
+ * @returns {Boolean}
+ */
+// needAffix: function () {
+// return this.isPisces() || this.isGemini();
+// }
+};
+
+$(document).ready(function () {
+
+ initSidebarDimension();
+
+ /**
+ * Init Sidebar & TOC inner dimensions on all pages and for all schemes.
+ * Need for Sidebar/TOC inner scrolling if content taller then viewport.
+ */
+ function initSidebarDimension () {
+ var updateSidebarHeightTimer;
+
+ $(window).on('resize', function () {
+ updateSidebarHeightTimer && clearTimeout(updateSidebarHeightTimer);
+
+ updateSidebarHeightTimer = setTimeout(function () {
+ var sidebarWrapperHeight = document.body.clientHeight - NexT.utils.getSidebarSchemePadding();
+
+ updateSidebarHeight(sidebarWrapperHeight);
+ }, 0);
+ });
+
+ // Initialize Sidebar & TOC Width.
+ var scrollbarWidth = NexT.utils.getScrollbarWidth();
+ if ($('.sidebar-panel').height() > (document.body.clientHeight - NexT.utils.getSidebarSchemePadding())) {
+ $('.site-overview').css('width', 'calc(100% + ' + scrollbarWidth + 'px)');
+ }
+ $('.post-toc').css('width', 'calc(100% + ' + scrollbarWidth + 'px)');
+
+ // Initialize Sidebar & TOC Height.
+ updateSidebarHeight(document.body.clientHeight - NexT.utils.getSidebarSchemePadding());
+ }
+
+ function updateSidebarHeight (height) {
+ height = height || 'auto';
+ $('.site-overview, .post-toc').css('max-height', height);
+ }
+
+});
diff --git a/themes/Next/source/lib/Han/dist/font/han-space.otf b/themes/Next/source/lib/Han/dist/font/han-space.otf
new file mode 100644
index 0000000..845b1bc
Binary files /dev/null and b/themes/Next/source/lib/Han/dist/font/han-space.otf differ
diff --git a/themes/Next/source/lib/Han/dist/font/han-space.woff b/themes/Next/source/lib/Han/dist/font/han-space.woff
new file mode 100644
index 0000000..6ccc84f
Binary files /dev/null and b/themes/Next/source/lib/Han/dist/font/han-space.woff differ
diff --git a/themes/Next/source/lib/Han/dist/font/han.otf b/themes/Next/source/lib/Han/dist/font/han.otf
new file mode 100644
index 0000000..2ce2f46
Binary files /dev/null and b/themes/Next/source/lib/Han/dist/font/han.otf differ
diff --git a/themes/Next/source/lib/Han/dist/font/han.woff b/themes/Next/source/lib/Han/dist/font/han.woff
new file mode 100644
index 0000000..011e06c
Binary files /dev/null and b/themes/Next/source/lib/Han/dist/font/han.woff differ
diff --git a/themes/Next/source/lib/Han/dist/font/han.woff2 b/themes/Next/source/lib/Han/dist/font/han.woff2
new file mode 100644
index 0000000..02c49af
Binary files /dev/null and b/themes/Next/source/lib/Han/dist/font/han.woff2 differ
diff --git a/themes/Next/source/lib/Han/dist/han.css b/themes/Next/source/lib/Han/dist/han.css
new file mode 100644
index 0000000..9bafab6
--- /dev/null
+++ b/themes/Next/source/lib/Han/dist/han.css
@@ -0,0 +1,1168 @@
+@charset "UTF-8";
+
+/*! 漢字標準格式 v3.3.0 | MIT License | css.hanzi.co */
+/*! Han.css: the CSS typography framework optimised for Hanzi */
+
+/* normalize.css v4.0.0 | MIT License | github.com/necolas/normalize.css */
+html {
+ font-family: sans-serif; /* 1 */
+ -ms-text-size-adjust: 100%; /* 2 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+body {
+ margin: 0;
+}
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+main,
+menu,
+nav,
+section,
+summary {
+ /* 1 */
+ display: block;
+}
+audio,
+canvas,
+progress,
+video {
+ display: inline-block;
+}
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+progress {
+ vertical-align: baseline;
+}
+template,
+[hidden] {
+ display: none;
+}
+a {
+ background-color: transparent;
+}
+a:active,
+a:hover {
+ outline-width: 0;
+}
+abbr[title] {
+ border-bottom: none; /* 1 */
+ text-decoration: underline; /* 2 */
+ text-decoration: underline dotted; /* 2 */
+}
+b,
+strong {
+ font-weight: inherit;
+}
+b,
+strong {
+ font-weight: bolder;
+}
+dfn {
+ font-style: italic;
+}
+h1 {
+ font-size: 2em;
+ margin: .67em 0;
+}
+mark {
+ background-color: #ff0;
+ color: #000;
+}
+small {
+ font-size: 80%;
+}
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+sub {
+ bottom: -.25em;
+}
+sup {
+ top: -.5em;
+}
+img {
+ border-style: none;
+}
+svg:not(:root) {
+ overflow: hidden;
+}
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+}
+figure {
+ margin: 1em 40px;
+}
+hr {
+ box-sizing: content-box; /* 1 */
+ height: 0; /* 1 */
+ overflow: visible; /* 2 */
+}
+button,
+input,
+select,
+textarea {
+ font: inherit;
+}
+optgroup {
+ font-weight: bold;
+}
+button,
+input,
+select {
+ /* 2 */
+ overflow: visible;
+}
+button,
+input,
+select,
+textarea {
+ /* 1 */
+ margin: 0;
+}
+button,
+select {
+ /* 1 */
+ text-transform: none;
+}
+button,
+[type="button"],
+[type="reset"],
+[type="submit"] {
+ cursor: pointer;
+}
+[disabled] {
+ cursor: default;
+}
+button,
+html [type="button"],
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button; /* 2 */
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+button:-moz-focusring,
+input:-moz-focusring {
+ outline: 1px dotted ButtonText;
+}
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: .35em .625em .75em;
+}
+legend {
+ box-sizing: border-box; /* 1 */
+ color: inherit; /* 2 */
+ display: table; /* 1 */
+ max-width: 100%; /* 1 */
+ padding: 0; /* 3 */
+ white-space: normal; /* 1 */
+}
+textarea {
+ overflow: auto;
+}
+[type="checkbox"],
+[type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+}
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+[type="search"] {
+ -webkit-appearance: textfield;
+}
+[type="search"]::-webkit-search-cancel-button,
+[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+@font-face {
+ font-family: "Han Heiti";
+ src: local("Hiragino Sans GB"), local("Lantinghei TC Extralight"), local("Lantinghei SC Extralight"), local(FZLTXHB--B51-0), local(FZLTZHK--GBK1-0), local("Pingfang SC Light"), local("Pingfang TC Light"), local("Pingfang-SC-Light"), local("Pingfang-TC-Light"), local("Pingfang SC"), local("Pingfang TC"), local("Heiti SC Light"), local(STHeitiSC-Light), local("Heiti SC"), local("Heiti TC Light"), local(STHeitiTC-Light), local("Heiti TC"), local("Microsoft Yahei"), local("Microsoft Jhenghei"), local("Noto Sans CJK KR"), local("Noto Sans CJK JP"), local("Noto Sans CJK SC"), local("Noto Sans CJK TC"), local("Source Han Sans K"), local("Source Han Sans KR"), local("Source Han Sans JP"), local("Source Han Sans CN"), local("Source Han Sans HK"), local("Source Han Sans TW"), local("Source Han Sans TWHK"), local("Droid Sans Fallback");
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Heiti";
+ src: local(YuGothic), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro");
+}
+@font-face {
+ font-family: "Han Heiti CNS";
+ src: local("Pingfang TC Light"), local("Pingfang-TC-Light"), local("Pingfang TC"), local("Heiti TC Light"), local(STHeitiTC-Light), local("Heiti TC"), local("Lantinghei TC Extralight"), local(FZLTXHB--B51-0), local("Lantinghei TC"), local("Microsoft Jhenghei"), local("Microsoft Yahei"), local("Noto Sans CJK TC"), local("Source Han Sans TC"), local("Source Han Sans TW"), local("Source Han Sans TWHK"), local("Source Han Sans HK"), local("Droid Sans Fallback");
+}
+@font-face {
+ font-family: "Han Heiti GB";
+ src: local("Hiragino Sans GB"), local("Pingfang SC Light"), local("Pingfang-SC-Light"), local("Pingfang SC"), local("Lantinghei SC Extralight"), local(FZLTXHK--GBK1-0), local("Lantinghei SC"), local("Heiti SC Light"), local(STHeitiSC-Light), local("Heiti SC"), local("Microsoft Yahei"), local("Noto Sans CJK SC"), local("Source Han Sans SC"), local("Source Han Sans CN"), local("Droid Sans Fallback");
+}
+@font-face {
+ font-family: "Han Heiti";
+ font-weight: 600;
+ src: local("Hiragino Sans GB W6"), local(HiraginoSansGB-W6), local("Lantinghei TC Demibold"), local("Lantinghei SC Demibold"), local(FZLTZHB--B51-0), local(FZLTZHK--GBK1-0), local("Pingfang-SC-Semibold"), local("Pingfang-TC-Semibold"), local("Heiti SC Medium"), local("STHeitiSC-Medium"), local("Heiti SC"), local("Heiti TC Medium"), local("STHeitiTC-Medium"), local("Heiti TC"), local("Microsoft Yahei Bold"), local("Microsoft Jhenghei Bold"), local(MicrosoftYahei-Bold), local(MicrosoftJhengHeiBold), local("Microsoft Yahei"), local("Microsoft Jhenghei"), local("Noto Sans CJK KR Bold"), local("Noto Sans CJK JP Bold"), local("Noto Sans CJK SC Bold"), local("Noto Sans CJK TC Bold"), local(NotoSansCJKkr-Bold), local(NotoSansCJKjp-Bold), local(NotoSansCJKsc-Bold), local(NotoSansCJKtc-Bold), local("Source Han Sans K Bold"), local(SourceHanSansK-Bold), local("Source Han Sans K"), local("Source Han Sans KR Bold"), local("Source Han Sans JP Bold"), local("Source Han Sans CN Bold"), local("Source Han Sans HK Bold"), local("Source Han Sans TW Bold"), local("Source Han Sans TWHK Bold"), local("SourceHanSansKR-Bold"), local("SourceHanSansJP-Bold"), local("SourceHanSansCN-Bold"), local("SourceHanSansHK-Bold"), local("SourceHanSansTW-Bold"), local("SourceHanSansTWHK-Bold"), local("Source Han Sans KR"), local("Source Han Sans CN"), local("Source Han Sans HK"), local("Source Han Sans TW"), local("Source Han Sans TWHK");
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Heiti";
+ font-weight: 600;
+ src: local("YuGothic Bold"), local("Hiragino Kaku Gothic ProN W6"), local("Hiragino Kaku Gothic Pro W6"), local(YuGo-Bold), local(HiraKakuProN-W6), local(HiraKakuPro-W6);
+}
+@font-face {
+ font-family: "Han Heiti CNS";
+ font-weight: 600;
+ src: local("Pingfang TC Semibold"), local("Pingfang-TC-Semibold"), local("Heiti TC Medium"), local("STHeitiTC-Medium"), local("Heiti TC"), local("Lantinghei TC Demibold"), local(FZLTXHB--B51-0), local("Microsoft Jhenghei Bold"), local(MicrosoftJhengHeiBold), local("Microsoft Jhenghei"), local("Microsoft Yahei Bold"), local(MicrosoftYahei-Bold), local("Noto Sans CJK TC Bold"), local(NotoSansCJKtc-Bold), local("Noto Sans CJK TC"), local("Source Han Sans TC Bold"), local("SourceHanSansTC-Bold"), local("Source Han Sans TC"), local("Source Han Sans TW Bold"), local("SourceHanSans-TW"), local("Source Han Sans TW"), local("Source Han Sans TWHK Bold"), local("SourceHanSans-TWHK"), local("Source Han Sans TWHK"), local("Source Han Sans HK"), local("SourceHanSans-HK"), local("Source Han Sans HK");
+}
+@font-face {
+ font-family: "Han Heiti GB";
+ font-weight: 600;
+ src: local("Hiragino Sans GB W6"), local(HiraginoSansGB-W6), local("Pingfang SC Semibold"), local("Pingfang-SC-Semibold"), local("Lantinghei SC Demibold"), local(FZLTZHK--GBK1-0), local("Heiti SC Medium"), local("STHeitiSC-Medium"), local("Heiti SC"), local("Microsoft Yahei Bold"), local(MicrosoftYahei-Bold), local("Microsoft Yahei"), local("Noto Sans CJK SC Bold"), local(NotoSansCJKsc-Bold), local("Noto Sans CJK SC"), local("Source Han Sans SC Bold"), local("SourceHanSansSC-Bold"), local("Source Han Sans CN Bold"), local("SourceHanSansCN-Bold"), local("Source Han Sans SC"), local("Source Han Sans CN");
+}
+@font-face {
+ font-family: "Han Songti";
+ src: local("Songti SC Regular"), local(STSongti-SC-Regular), local("Songti SC"), local("Songti TC Regular"), local(STSongti-TC-Regular), local("Songti TC"), local(STSong), local("Lisong Pro"), local(SimSun), local(PMingLiU);
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Songti";
+ src: local(YuMincho), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("MS Mincho");
+}
+@font-face {
+ font-family: "Han Songti CNS";
+ src: local("Songti TC Regular"), local(STSongti-TC-Regular), local("Songti TC"), local("Lisong Pro"), local("Songti SC Regular"), local(STSongti-SC-Regular), local("Songti SC"), local(STSong), local(PMingLiU), local(SimSun);
+}
+@font-face {
+ font-family: "Han Songti GB";
+ src: local("Songti SC Regular"), local(STSongti-SC-Regular), local("Songti SC"), local(STSong), local(SimSun), local(PMingLiU);
+}
+@font-face {
+ font-family: "Han Songti";
+ font-weight: 600;
+ src: local("STSongti SC Bold"), local("STSongti TC Bold"), local(STSongti-SC-Bold), local(STSongti-TC-Bold), local("STSongti SC"), local("STSongti TC");
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Songti";
+ font-weight: 600;
+ src: local("YuMincho Demibold"), local("Hiragino Mincho ProN W6"), local("Hiragino Mincho Pro W6"), local(YuMin-Demibold), local(HiraMinProN-W6), local(HiraMinPro-W6), local(YuMincho), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro");
+}
+@font-face {
+ font-family: "Han Songti CNS";
+ font-weight: 600;
+ src: local("STSongti TC Bold"), local("STSongti SC Bold"), local(STSongti-TC-Bold), local(STSongti-SC-Bold), local("STSongti TC"), local("STSongti SC");
+}
+@font-face {
+ font-family: "Han Songti GB";
+ font-weight: 600;
+ src: local("STSongti SC Bold"), local(STSongti-SC-Bold), local("STSongti SC");
+}
+@font-face {
+ font-family: cursive;
+ src: local("Kaiti TC Regular"), local(STKaiTi-TC-Regular), local("Kaiti TC"), local("Kaiti SC"), local(STKaiti), local(BiauKai), local("標楷體"), local(DFKaiShu-SB-Estd-BF), local(Kaiti), local(DFKai-SB);
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Kaiti";
+ src: local("Kaiti TC Regular"), local(STKaiTi-TC-Regular), local("Kaiti TC"), local("Kaiti SC"), local(STKaiti), local(BiauKai), local("標楷體"), local(DFKaiShu-SB-Estd-BF), local(Kaiti), local(DFKai-SB);
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Kaiti CNS";
+ src: local(BiauKai), local("標楷體"), local(DFKaiShu-SB-Estd-BF), local("Kaiti TC Regular"), local(STKaiTi-TC-Regular), local("Kaiti TC");
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Kaiti GB";
+ src: local("Kaiti SC Regular"), local(STKaiTi-SC-Regular), local("Kaiti SC"), local(STKaiti), local(Kai), local(Kaiti), local(DFKai-SB);
+}
+@font-face {
+ font-family: cursive;
+ font-weight: 600;
+ src: local("Kaiti TC Bold"), local(STKaiTi-TC-Bold), local("Kaiti SC Bold"), local(STKaiti-SC-Bold), local("Kaiti TC"), local("Kaiti SC");
+}
+@font-face {
+ font-family: "Han Kaiti";
+ font-weight: 600;
+ src: local("Kaiti TC Bold"), local(STKaiTi-TC-Bold), local("Kaiti SC Bold"), local(STKaiti-SC-Bold), local("Kaiti TC"), local("Kaiti SC");
+}
+@font-face {
+ font-family: "Han Kaiti CNS";
+ font-weight: 600;
+ src: local("Kaiti TC Bold"), local(STKaiTi-TC-Bold), local("Kaiti TC");
+}
+@font-face {
+ font-family: "Han Kaiti GB";
+ font-weight: 600;
+ src: local("Kaiti SC Bold"), local(STKaiti-SC-Bold);
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Fangsong";
+ src: local(STFangsong), local(FangSong);
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Fangsong CNS";
+ src: local(STFangsong), local(FangSong);
+}
+@font-face {
+ unicode-range: U+4E00-9FFF, U+3400-4DB5, U+20000-2A6D6, U+2A700-2B734, U+2B740-2B81D, U+FA0E-FA0F, U+FA11, U+FA13-FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27-FA29, U+3040-309F, U+30A0-30FF, U+3099-309E, U+FF66-FF9F, U+3007, U+31C0-31E3, U+2F00-2FD5, U+2E80-2EF3;
+ font-family: "Han Fangsong GB";
+ src: local(STFangsong), local(FangSong);
+}
+@font-face {
+ font-family: "Biaodian Sans";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local("MS Gothic"), local(SimSun);
+ unicode-range: U+FF0E;
+}
+@font-face {
+ font-family: "Biaodian Serif";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local(SimSun);
+ unicode-range: U+FF0E;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local("MS Gothic"), local(SimSun);
+ unicode-range: U+FF0E;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local(SimSun);
+ unicode-range: U+FF0E;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local("MS Gothic"), local(SimSun);
+ unicode-range: U+FF0E;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif CNS";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local(SimSun);
+ unicode-range: U+FF0E;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local("MS Gothic"), local(SimSun);
+ unicode-range: U+FF0E;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local(SimSun);
+ unicode-range: U+FF0E;
+}
+@font-face {
+ font-family: "Biaodian Sans";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun);
+ unicode-range: U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Serif";
+ src: local("Songti SC"), local(STSong), local("Heiti SC"), local(SimSun);
+ unicode-range: U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun);
+ unicode-range: U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif";
+ src: local("Songti SC"), local(STSong), local("Heiti SC"), local(SimSun);
+ unicode-range: U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun);
+ unicode-range: U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif CNS";
+ src: local("Songti SC"), local(STSong), local("Heiti SC"), local(SimSun);
+ unicode-range: U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun);
+ unicode-range: U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ src: local("Songti SC"), local(STSong), local("Heiti SC"), local(SimSun);
+ unicode-range: U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Sans";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Microsoft Yahei"), local(SimSun);
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Biaodian Serif";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local("Microsoft Yahei"), local(SimSun);
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Yakumono Sans";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Arial Unicode MS"), local("MS Gothic");
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Yakumono Serif";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("MS Mincho"), local("Microsoft Yahei");
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Microsoft Yahei"), local(SimSun);
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local("Microsoft Yahei"), local(SimSun);
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Microsoft Yahei"), local(SimSun);
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif CNS";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local("Microsoft Yahei"), local(SimSun);
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Microsoft Yahei"), local(SimSun);
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSong), local("Microsoft Yahei"), local(SimSun);
+ unicode-range: U+2014;
+}
+@font-face {
+ font-family: "Biaodian Sans";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(Meiryo), local("MS Gothic"), local(SimSun), local(PMingLiU);
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Biaodian Serif";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local("MS Mincho"), local(SimSun), local(PMingLiU);
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Yakumono Sans";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(Meiryo), local("MS Gothic");
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Yakumono Serif";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("MS Mincho");
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(SimSun), local(PMingLiU);
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(SimSun), local(PMingLiU);
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(SimSun), local(PMingLiU);
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif CNS";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSongti), local(SimSun), local(PMingLiU);
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Sans GB"), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(SimSun), local(PMingLiU);
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype"), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Songti SC"), local(STSongti), local(SimSun), local(PMingLiU);
+ unicode-range: U+2026;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun), local(PMingLiU);
+ unicode-range: U+201C-201D, U+2018-2019;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ font-weight: bold;
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun), local(PMingLiU);
+ unicode-range: U+201C-201D, U+2018-2019;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ src: local("Lisong Pro"), local("Heiti SC"), local(STHeiti), local(SimSun), local(PMingLiU);
+ unicode-range: U+201C-201D, U+2018-2019;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ font-weight: bold;
+ src: local("Lisong Pro"), local("Heiti SC"), local(STHeiti), local(SimSun), local(PMingLiU);
+ unicode-range: U+201C-201D, U+2018-2019;
+}
+@font-face {
+ font-family: "Biaodian Sans";
+ src: local(Georgia), local("Times New Roman"), local(Arial), local("Droid Sans Fallback");
+ unicode-range: U+25CF;
+}
+@font-face {
+ font-family: "Biaodian Serif";
+ src: local(Georgia), local("Times New Roman"), local(Arial), local("Droid Sans Fallback");
+ unicode-range: U+25CF;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans";
+ src: local(Georgia), local("Times New Roman"), local(Arial), local("Droid Sans Fallback");
+ unicode-range: U+25CF;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif";
+ src: local(Georgia), local("Times New Roman"), local(Arial), local("Droid Sans Fallback");
+ unicode-range: U+25CF;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ src: local(Georgia), local("Times New Roman"), local(Arial), local("Droid Sans Fallback");
+ unicode-range: U+25CF;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif CNS";
+ src: local(Georgia), local("Times New Roman"), local(Arial), local("Droid Sans Fallback");
+ unicode-range: U+25CF;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ src: local(Georgia), local("Times New Roman"), local(Arial), local("Droid Sans Fallback");
+ unicode-range: U+25CF;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ src: local(Georgia), local("Times New Roman"), local(Arial), local("Droid Sans Fallback");
+ unicode-range: U+25CF;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans";
+ src: local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("MS Gothic");
+ unicode-range: U+3002, U+FF0C, U+3001, U+FF1B, U+FF1A, U+FF1F, U+FF01, U+FF0D, U+FF0F, U+FF3C;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("MS Mincho");
+ unicode-range: U+3002, U+FF0C, U+3001, U+FF1B, U+FF1A, U+FF1F, U+FF01, U+FF0D, U+FF0F, U+FF3C;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ src: local("Heiti TC"), local("Lihei Pro"), local("Microsoft Jhenghei"), local(PMingLiU);
+ unicode-range: U+3002, U+FF0C, U+3001;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ src: local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Heiti TC"), local("Lihei Pro"), local("Microsoft Jhenghei"), local(PMingLiU), local("MS Gothic");
+ unicode-range: U+FF1B, U+FF1A, U+FF1F, U+FF01;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("MS Mincho");
+ unicode-range: U+FF0D, U+FF0F, U+FF3C;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif CNS";
+ src: local(STSongti-TC-Regular), local("Lisong Pro"), local("Heiti TC"), local(PMingLiU);
+ unicode-range: U+3002, U+FF0C, U+3001;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif CNS";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local(PMingLiU), local("MS Mincho");
+ unicode-range: U+FF1B, U+FF1A, U+FF1F, U+FF01, U+FF0D, U+FF0F, U+FF3C;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ src: local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local(SimSun), local("MS Gothic");
+ unicode-range: U+3002, U+FF0C, U+3001, U+FF1B, U+FF1A, U+FF1F, U+FF01, U+FF0D, U+FF0F, U+FF3C;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ src: local("Songti SC"), local(STSongti), local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Hiragino Sans GB"), local("Heiti SC"), local(STHeiti), local(SimSun), local("MS Mincho");
+ unicode-range: U+3002, U+FF0C, U+3001, U+FF1B, U+FF1A, U+FF1F, U+FF01;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local(PMingLiU), local("MS Mincho");
+ unicode-range: U+FF0D, U+FF0F, U+FF3C;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans";
+ src: local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Yu Gothic"), local(YuGothic), local(SimSun), local(PMingLiU);
+ unicode-range: U+300C-300F, U+300A-300B, U+3008-3009, U+FF08-FF09, U+3014-3015;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Yu Mincho"), local(YuMincho), local(SimSun), local(PMingLiU);
+ unicode-range: U+300C-300F, U+300A-300B, U+3008-3009, U+FF08-FF09, U+3014-3015;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ src: local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Yu Gothic"), local(YuGothic), local(SimSun), local(PMingLiU);
+ unicode-range: U+300C-300F, U+300A-300B, U+3008-3009, U+FF08-FF09, U+3014-3015;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif CNS";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Yu Mincho"), local(YuMincho), local(SimSun), local(PMingLiU);
+ unicode-range: U+300C-300F, U+300A-300B, U+3008-3009, U+FF08-FF09, U+3014-3015;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ src: local("Hiragino Kaku Gothic ProN"), local("Hiragino Kaku Gothic Pro"), local("Yu Gothic"), local(YuGothic), local(SimSun), local(PMingLiU);
+ unicode-range: U+300C-300F, U+300A-300B, U+3008-3009, U+FF08-FF09, U+3014-3015;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ src: local("Hiragino Mincho ProN"), local("Hiragino Mincho Pro"), local("Yu Mincho"), local(YuMincho), local(SimSun), local(PMingLiU);
+ unicode-range: U+300C-300F, U+300A-300B, U+3008-3009, U+FF08-FF09, U+3014-3015;
+}
+@font-face {
+ font-family: "Biaodian Basic";
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Basic";
+ font-weight: bold;
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Sans";
+ font-weight: bold;
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans";
+ font-weight: bold;
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans";
+ font-weight: bold;
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans CNS";
+ font-weight: bold;
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Sans GB";
+ font-weight: bold;
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif";
+ font-weight: bold;
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif CNS";
+ font-weight: bold;
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Biaodian Pro Serif GB";
+ font-weight: bold;
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+2014, U+2026, U+00B7;
+}
+@font-face {
+ font-family: "Latin Italic Serif";
+ src: local("Georgia Italic"), local("Times New Roman Italic"), local(Georgia-Italic), local(TimesNewRomanPS-ItalicMT), local(Times-Italic);
+}
+@font-face {
+ font-family: "Latin Italic Serif";
+ font-weight: 700;
+ src: local("Georgia Bold Italic"), local("Times New Roman Bold Italic"), local(Georgia-BoldItalic), local(TimesNewRomanPS-BoldItalicMT), local(Times-Italic);
+}
+@font-face {
+ font-family: "Latin Italic Sans";
+ src: local("Helvetica Neue Italic"), local("Helvetica Oblique"), local("Arial Italic"), local(HelveticaNeue-Italic), local(Helvetica-LightOblique), local(Arial-ItalicMT);
+}
+@font-face {
+ font-family: "Latin Italic Sans";
+ font-weight: 700;
+ src: local("Helvetica Neue Bold Italic"), local("Helvetica Bold Oblique"), local("Arial Bold Italic"), local(HelveticaNeue-BoldItalic), local(Helvetica-BoldOblique), local(Arial-BoldItalicMT);
+}
+@font-face {
+ unicode-range: U+0030-0039;
+ font-family: "Numeral TF Sans";
+ src: local(Skia), local("Neutraface 2 Text"), local(Candara), local(Corbel);
+}
+@font-face {
+ unicode-range: U+0030-0039;
+ font-family: "Numeral TF Serif";
+ src: local(Georgia), local("Hoefler Text"), local("Big Caslon");
+}
+@font-face {
+ unicode-range: U+0030-0039;
+ font-family: "Numeral TF Italic Serif";
+ src: local("Georgia Italic"), local("Hoefler Text Italic"), local(Georgia-Italic), local(HoeflerText-Italic);
+}
+@font-face {
+ unicode-range: U+0030-0039;
+ font-family: "Numeral LF Sans";
+ src: local("Helvetica Neue"), local(Helvetica), local(Arial);
+}
+@font-face {
+ unicode-range: U+0030-0039;
+ font-family: "Numeral LF Italic Sans";
+ src: local("Helvetica Neue Italic"), local("Helvetica Oblique"), local("Arial Italic"), local(HelveticaNeue-Italic), local(Helvetica-LightOblique), local(Arial-ItalicMT);
+}
+@font-face {
+ unicode-range: U+0030-0039;
+ font-family: "Numeral LF Italic Sans";
+ font-weight: bold;
+ src: local("Helvetica Neue Bold Italic"), local("Helvetica Bold Oblique"), local("Arial Bold Italic"), local(HelveticaNeue-BoldItalic), local(Helvetica-BoldOblique), local(Arial-BoldItalicMT);
+}
+@font-face {
+ unicode-range: U+0030-0039;
+ font-family: "Numeral LF Serif";
+ src: local(Palatino), local("Palatino Linotype"), local("Times New Roman");
+}
+@font-face {
+ unicode-range: U+0030-0039;
+ font-family: "Numeral LF Italic Serif";
+ src: local("Palatino Italic"), local("Palatino Italic Linotype"), local("Times New Roman Italic"), local(Palatino-Italic), local(Palatino-Italic-Linotype), local(TimesNewRomanPS-ItalicMT);
+}
+@font-face {
+ unicode-range: U+0030-0039;
+ font-family: "Numeral LF Italic Serif";
+ font-weight: bold;
+ src: local("Palatino Bold Italic"), local("Palatino Bold Italic Linotype"), local("Times New Roman Bold Italic"), local(Palatino-BoldItalic), local(Palatino-BoldItalic-Linotype), local(TimesNewRomanPS-BoldItalicMT);
+}
+@font-face {
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+3105-312D, U+31A0-31BA, U+02D9, U+02CA, U+02C5, U+02C7, U+02CB, U+02EA-02EB, U+0307, U+030D, U+0358, U+F31B4-F31B7, U+F0061, U+F0065, U+F0069, U+F006F, U+F0075;
+ font-family: "Zhuyin Kaiti";
+}
+@font-face {
+ unicode-range: U+3105-312D, U+31A0-31BA, U+02D9, U+02CA, U+02C5, U+02C7, U+02CB, U+02EA-02EB, U+0307, U+030D, U+0358, U+F31B4-F31B7, U+F0061, U+F0065, U+F0069, U+F006F, U+F0075;
+ font-family: "Zhuyin Heiti";
+ src: local("Hiragino Sans GB"), local("Heiti TC"), local("Microsoft Jhenghei"), url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+}
+@font-face {
+ font-family: "Zhuyin Heiti";
+ src: local("Heiti TC"), local("Microsoft Jhenghei"), url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ unicode-range: U+3127;
+}
+@font-face {
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ font-family: "Zhuyin Heiti";
+ unicode-range: U+02D9, U+02CA, U+02C5, U+02C7, U+02CB, U+02EA-02EB, U+31B4, U+31B5, U+31B6, U+31B7, U+0307, U+030D, U+0358, U+F31B4-F31B7, U+F0061, U+F0065, U+F0069, U+F006F, U+F0075;
+}
+@font-face {
+ src: url("./font/han.woff2?v3.3.0") format("woff2"), url("./font/han.woff?v3.3.0") format("woff"), url("./font/han.otf?v3.3.0") format("opentype");
+ font-family: "Romanization Sans";
+ unicode-range: U+0307, U+030D, U+0358, U+F31B4-F31B7, U+F0061, U+F0065, U+F0069, U+F006F, U+F0075;
+}
+html:lang(zh-Latn),
+html:lang(ja-Latn),
+html:not(:lang(zh)):not(:lang(ja)),
+html *:lang(zh-Latn),
+html *:lang(ja-Latn),
+html *:not(:lang(zh)):not(:lang(ja)),
+article strong:lang(zh-Latn),
+article strong:lang(ja-Latn),
+article strong:not(:lang(zh)):not(:lang(ja)),
+article strong *:lang(zh-Latn),
+article strong *:lang(ja-Latn),
+article strong *:not(:lang(zh)):not(:lang(ja)) {
+ font-family: "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif;
+}
+html:lang(zh),
+html:lang(zh-Hant),
+[lang^="zh"],
+[lang*="Hant"],
+[lang="zh-TW"],
+[lang="zh-HK"],
+article strong:lang(zh),
+article strong:lang(zh-Hant) {
+ font-family: "Biaodian Pro Sans CNS", "Helvetica Neue", Helvetica, Arial, "Zhuyin Heiti", "Han Heiti", sans-serif;
+}
+html:lang(zh).no-unicoderange,
+html:lang(zh-Hant).no-unicoderange,
+.no-unicoderange [lang^="zh"],
+.no-unicoderange [lang*="Hant"],
+.no-unicoderange [lang="zh-TW"],
+.no-unicoderange [lang="zh-HK"],
+.no-unicoderange article strong:lang(zh),
+.no-unicoderange article strong:lang(zh-Hant) {
+ font-family: "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif;
+}
+html:lang(zh-Hans),
+html:lang(zh-CN),
+[lang*="Hans"],
+[lang="zh-CN"],
+article strong:lang(zh-Hans),
+article strong:lang(zh-CN) {
+ font-family: "Biaodian Pro Sans GB", "Helvetica Neue", Helvetica, Arial, "Han Heiti GB", sans-serif;
+}
+html:lang(zh-Hans).no-unicoderange,
+html:lang(zh-CN).no-unicoderange,
+.no-unicoderange [lang*="Hans"],
+.no-unicoderange [lang="zh-CN"],
+.no-unicoderange article strong:lang(zh-Hans),
+.no-unicoderange article strong:lang(zh-CN) {
+ font-family: "Helvetica Neue", Helvetica, Arial, "Han Heiti GB", sans-serif;
+}
+html:lang(ja),
+[lang^="ja"],
+article strong:lang(ja) {
+ font-family: "Yakumono Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+html:lang(ja).no-unicoderange,
+.no-unicoderange [lang^="ja"],
+.no-unicoderange article strong:lang(ja) {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+article blockquote i:lang(zh-Latn),
+article blockquote var:lang(zh-Latn),
+article blockquote i:lang(ja-Latn),
+article blockquote var:lang(ja-Latn),
+article blockquote i:not(:lang(zh)):not(:lang(ja)),
+article blockquote var:not(:lang(zh)):not(:lang(ja)),
+article blockquote i *:lang(zh-Latn),
+article blockquote var *:lang(zh-Latn),
+article blockquote i *:lang(ja-Latn),
+article blockquote var *:lang(ja-Latn),
+article blockquote i *:not(:lang(zh)):not(:lang(ja)),
+article blockquote var *:not(:lang(zh)):not(:lang(ja)) {
+ font-family: "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif;
+}
+article blockquote i:lang(zh),
+article blockquote var:lang(zh),
+article blockquote i:lang(zh-Hant),
+article blockquote var:lang(zh-Hant) {
+ font-family: "Biaodian Pro Sans CNS", "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, "Zhuyin Heiti", "Han Heiti", sans-serif;
+}
+.no-unicoderange article blockquote i:lang(zh),
+.no-unicoderange article blockquote var:lang(zh),
+.no-unicoderange article blockquote i:lang(zh-Hant),
+.no-unicoderange article blockquote var:lang(zh-Hant) {
+ font-family: "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif;
+}
+.no-unicoderange article blockquote i:lang(zh),
+.no-unicoderange article blockquote var:lang(zh),
+.no-unicoderange article blockquote i:lang(zh-Hant),
+.no-unicoderange article blockquote var:lang(zh-Hant) {
+ font-family: "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif;
+}
+article blockquote i:lang(zh-Hans),
+article blockquote var:lang(zh-Hans),
+article blockquote i:lang(zh-CN),
+article blockquote var:lang(zh-CN) {
+ font-family: "Biaodian Pro Sans GB", "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti GB", sans-serif;
+}
+.no-unicoderange article blockquote i:lang(zh-Hans),
+.no-unicoderange article blockquote var:lang(zh-Hans),
+.no-unicoderange article blockquote i:lang(zh-CN),
+.no-unicoderange article blockquote var:lang(zh-CN) {
+ font-family: "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti GB", sans-serif;
+}
+article blockquote i:lang(ja),
+article blockquote var:lang(ja) {
+ font-family: "Yakumono Sans", "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+.no-unicoderange article blockquote i:lang(ja),
+.no-unicoderange article blockquote var:lang(ja) {
+ font-family: "Latin Italic Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+article figure blockquote:lang(zh-Latn),
+article figure blockquote:lang(ja-Latn),
+article figure blockquote:not(:lang(zh)):not(:lang(ja)),
+article figure blockquote *:lang(zh-Latn),
+article figure blockquote *:lang(ja-Latn),
+article figure blockquote *:not(:lang(zh)):not(:lang(ja)) {
+ font-family: Georgia, "Times New Roman", "Han Songti", cursive, serif;
+}
+article figure blockquote:lang(zh),
+article figure blockquote:lang(zh-Hant) {
+ font-family: "Biaodian Pro Serif CNS", "Numeral LF Serif", Georgia, "Times New Roman", "Zhuyin Kaiti", "Han Songti", serif;
+}
+.no-unicoderange article figure blockquote:lang(zh),
+.no-unicoderange article figure blockquote:lang(zh-Hant) {
+ font-family: "Numeral LF Serif", Georgia, "Times New Roman", "Han Songti", serif;
+}
+article figure blockquote:lang(zh-Hans),
+article figure blockquote:lang(zh-CN) {
+ font-family: "Biaodian Pro Serif GB", "Numeral LF Serif", Georgia, "Times New Roman", "Han Songti GB", serif;
+}
+.no-unicoderange article figure blockquote:lang(zh-Hans),
+.no-unicoderange article figure blockquote:lang(zh-CN) {
+ font-family: "Numeral LF Serif", Georgia, "Times New Roman", "Han Songti GB", serif;
+}
+article figure blockquote:lang(ja) {
+ font-family: "Yakumono Serif", "Numeral LF Serif", Georgia, "Times New Roman", serif;
+}
+.no-unicoderange article figure blockquote:lang(ja) {
+ font-family: "Numeral LF Serif", Georgia, "Times New Roman", serif;
+}
+article blockquote:lang(zh-Latn),
+article blockquote:lang(ja-Latn),
+article blockquote:not(:lang(zh)):not(:lang(ja)),
+article blockquote *:lang(zh-Latn),
+article blockquote *:lang(ja-Latn),
+article blockquote *:not(:lang(zh)):not(:lang(ja)) {
+ font-family: Georgia, "Times New Roman", "Han Kaiti", cursive, serif;
+}
+article blockquote:lang(zh),
+article blockquote:lang(zh-Hant) {
+ font-family: "Biaodian Pro Serif CNS", "Numeral LF Serif", Georgia, "Times New Roman", "Zhuyin Kaiti", "Han Kaiti", cursive, serif;
+}
+.no-unicoderange article blockquote:lang(zh),
+.no-unicoderange article blockquote:lang(zh-Hant) {
+ font-family: "Numeral LF Serif", Georgia, "Times New Roman", "Han Kaiti", cursive, serif;
+}
+article blockquote:lang(zh-Hans),
+article blockquote:lang(zh-CN) {
+ font-family: "Biaodian Pro Serif GB", "Numeral LF Serif", Georgia, "Times New Roman", "Han Kaiti GB", cursive, serif;
+}
+.no-unicoderange article blockquote:lang(zh-Hans),
+.no-unicoderange article blockquote:lang(zh-CN) {
+ font-family: "Numeral LF Serif", Georgia, "Times New Roman", "Han Kaiti GB", cursive, serif;
+}
+article blockquote:lang(ja) {
+ font-family: "Yakumono Serif", "Numeral LF Serif", Georgia, "Times New Roman", cursive, serif;
+}
+.no-unicoderange article blockquote:lang(ja) {
+ font-family: "Numeral LF Serif", Georgia, "Times New Roman", cursive, serif;
+}
+i:lang(zh-Latn),
+var:lang(zh-Latn),
+i:lang(ja-Latn),
+var:lang(ja-Latn),
+i:not(:lang(zh)):not(:lang(ja)),
+var:not(:lang(zh)):not(:lang(ja)),
+i *:lang(zh-Latn),
+var *:lang(zh-Latn),
+i *:lang(ja-Latn),
+var *:lang(ja-Latn),
+i *:not(:lang(zh)):not(:lang(ja)),
+var *:not(:lang(zh)):not(:lang(ja)) {
+ font-family: "Latin Italic Serif", Georgia, "Times New Roman", "Han Kaiti", cursive, serif;
+}
+i:lang(zh),
+var:lang(zh),
+i:lang(zh-Hant),
+var:lang(zh-Hant) {
+ font-family: "Biaodian Pro Serif CNS", "Numeral LF Italic Serif", "Latin Italic Serif", Georgia, "Times New Roman", "Zhuyin Kaiti", "Han Kaiti", cursive, serif;
+}
+.no-unicoderange i:lang(zh),
+.no-unicoderange var:lang(zh),
+.no-unicoderange i:lang(zh-Hant),
+.no-unicoderange var:lang(zh-Hant) {
+ font-family: "Numeral LF Italic Serif", "Latin Italic Serif", Georgia, "Times New Roman", "Han Kaiti", cursive, serif;
+}
+i:lang(zh-Hans),
+var:lang(zh-Hans),
+i:lang(zh-CN),
+var:lang(zh-CN) {
+ font-family: "Biaodian Pro Serif GB", "Numeral LF Italic Serif", "Latin Italic Serif", Georgia, "Times New Roman", "Han Kaiti GB", cursive, serif;
+}
+.no-unicoderange i:lang(zh-Hans),
+.no-unicoderange var:lang(zh-Hans),
+.no-unicoderange i:lang(zh-CN),
+.no-unicoderange var:lang(zh-CN) {
+ font-family: "Numeral LF Italic Serif", "Latin Italic Serif", Georgia, "Times New Roman", "Han Kaiti GB", cursive, serif;
+}
+i:lang(ja),
+var:lang(ja) {
+ font-family: "Yakumono Serif", "Numeral LF Italic Serif", "Latin Italic Serif", Georgia, "Times New Roman", cursive, serif;
+}
+.no-unicoderange i:lang(ja),
+.no-unicoderange var:lang(ja) {
+ font-family: "Numeral LF Italic Serif", "Latin Italic Serif", Georgia, "Times New Roman", cursive, serif;
+}
+code:lang(zh-Latn),
+kbd:lang(zh-Latn),
+samp:lang(zh-Latn),
+pre:lang(zh-Latn),
+code:lang(ja-Latn),
+kbd:lang(ja-Latn),
+samp:lang(ja-Latn),
+pre:lang(ja-Latn),
+code:not(:lang(zh)):not(:lang(ja)),
+kbd:not(:lang(zh)):not(:lang(ja)),
+samp:not(:lang(zh)):not(:lang(ja)),
+pre:not(:lang(zh)):not(:lang(ja)),
+code *:lang(zh-Latn),
+kbd *:lang(zh-Latn),
+samp *:lang(zh-Latn),
+pre *:lang(zh-Latn),
+code *:lang(ja-Latn),
+kbd *:lang(ja-Latn),
+samp *:lang(ja-Latn),
+pre *:lang(ja-Latn),
+code *:not(:lang(zh)):not(:lang(ja)),
+kbd *:not(:lang(zh)):not(:lang(ja)),
+samp *:not(:lang(zh)):not(:lang(ja)),
+pre *:not(:lang(zh)):not(:lang(ja)) {
+ font-family: Menlo, Consolas, Courier, "Han Heiti", monospace, monospace, sans-serif;
+}
+code:lang(zh),
+kbd:lang(zh),
+samp:lang(zh),
+pre:lang(zh),
+code:lang(zh-Hant),
+kbd:lang(zh-Hant),
+samp:lang(zh-Hant),
+pre:lang(zh-Hant) {
+ font-family: "Biaodian Pro Sans CNS", Menlo, Consolas, Courier, "Zhuyin Heiti", "Han Heiti", monospace, monospace, sans-serif;
+}
+.no-unicoderange code:lang(zh),
+.no-unicoderange kbd:lang(zh),
+.no-unicoderange samp:lang(zh),
+.no-unicoderange pre:lang(zh),
+.no-unicoderange code:lang(zh-Hant),
+.no-unicoderange kbd:lang(zh-Hant),
+.no-unicoderange samp:lang(zh-Hant),
+.no-unicoderange pre:lang(zh-Hant) {
+ font-family: Menlo, Consolas, Courier, "Han Heiti", monospace, monospace, sans-serif;
+}
+code:lang(zh-Hans),
+kbd:lang(zh-Hans),
+samp:lang(zh-Hans),
+pre:lang(zh-Hans),
+code:lang(zh-CN),
+kbd:lang(zh-CN),
+samp:lang(zh-CN),
+pre:lang(zh-CN) {
+ font-family: "Biaodian Pro Sans GB", Menlo, Consolas, Courier, "Han Heiti GB", monospace, monospace, sans-serif;
+}
+.no-unicoderange code:lang(zh-Hans),
+.no-unicoderange kbd:lang(zh-Hans),
+.no-unicoderange samp:lang(zh-Hans),
+.no-unicoderange pre:lang(zh-Hans),
+.no-unicoderange code:lang(zh-CN),
+.no-unicoderange kbd:lang(zh-CN),
+.no-unicoderange samp:lang(zh-CN),
+.no-unicoderange pre:lang(zh-CN) {
+ font-family: Menlo, Consolas, Courier, "Han Heiti GB", monospace, monospace, sans-serif;
+}
+code:lang(ja),
+kbd:lang(ja),
+samp:lang(ja),
+pre:lang(ja) {
+ font-family: "Yakumono Sans", Menlo, Consolas, Courier, monospace, monospace, sans-serif;
+}
+.no-unicoderange code:lang(ja),
+.no-unicoderange kbd:lang(ja),
+.no-unicoderange samp:lang(ja),
+.no-unicoderange pre:lang(ja) {
+ font-family: Menlo, Consolas, Courier, monospace, monospace, sans-serif;
+}
+html,
+.no-unicoderange h-char.bd-liga,
+.no-unicoderange h-char[unicode="b7"],
+ruby h-zhuyin,
+h-ruby h-zhuyin,
+ruby h-zhuyin h-diao,
+h-ruby h-zhuyin h-diao,
+ruby.romanization rt,
+h-ruby.romanization rt,
+ruby [annotation] rt,
+h-ruby [annotation] rt {
+ -moz-font-feature-settings: "liga";
+ -ms-font-feature-settings: "liga";
+ -webkit-font-feature-settings: "liga";
+ font-feature-settings: "liga";
+}
+html,
+[lang^="zh"],
+[lang*="Hant"],
+[lang="zh-TW"],
+[lang="zh-HK"],
+[lang*="Hans"],
+[lang="zh-CN"],
+article strong,
+code,
+kbd,
+samp,
+pre,
+article blockquote i,
+article blockquote var {
+ -moz-font-feature-settings: "liga=1, locl=0";
+ -ms-font-feature-settings: "liga", "locl" 0;
+ -webkit-font-feature-settings: "liga", "locl" 0;
+ font-feature-settings: "liga", "locl" 0;
+}
+.no-unicoderange h-char.bd-cop:lang(zh-Hant),
+.no-unicoderange h-char.bd-cop:lang(zh-TW),
+.no-unicoderange h-char.bd-cop:lang(zh-HK) {
+ font-family: -apple-system, "Han Heiti CNS";
+}
+.no-unicoderange h-char.bd-liga,
+.no-unicoderange h-char[unicode="b7"] {
+ font-family: "Biaodian Basic", "Han Heiti";
+}
+.no-unicoderange h-char[unicode="2018"]:lang(zh-Hans),
+.no-unicoderange h-char[unicode="2019"]:lang(zh-Hans),
+.no-unicoderange h-char[unicode="201c"]:lang(zh-Hans),
+.no-unicoderange h-char[unicode="201d"]:lang(zh-Hans),
+.no-unicoderange h-char[unicode="2018"]:lang(zh-CN),
+.no-unicoderange h-char[unicode="2019"]:lang(zh-CN),
+.no-unicoderange h-char[unicode="201c"]:lang(zh-CN),
+.no-unicoderange h-char[unicode="201d"]:lang(zh-CN) {
+ font-family: "Han Heiti GB";
+}
+i,
+var {
+ font-style: inherit;
+}
+.no-unicoderange ruby h-zhuyin,
+.no-unicoderange h-ruby h-zhuyin,
+.no-unicoderange ruby h-zhuyin h-diao,
+.no-unicoderange h-ruby h-zhuyin h-diao {
+ font-family: "Zhuyin Kaiti", cursive, serif;
+}
+ruby h-diao,
+h-ruby h-diao {
+ font-family: "Zhuyin Kaiti", cursive, serif;
+}
+ruby.romanization rt,
+h-ruby.romanization rt,
+ruby [annotation] rt,
+h-ruby [annotation] rt {
+ font-family: "Romanization Sans", "Helvetica Neue", Helvetica, Arial, "Han Heiti", sans-serif;
+}
diff --git a/themes/Next/source/lib/Han/dist/han.js b/themes/Next/source/lib/Han/dist/han.js
new file mode 100644
index 0000000..75976c6
--- /dev/null
+++ b/themes/Next/source/lib/Han/dist/han.js
@@ -0,0 +1,3005 @@
+/*!
+ * 漢字標準格式 v3.3.0 | MIT License | css.hanzi.co
+ * Han.css: the CSS typography framework optimised for Hanzi
+ */
+
+void function( global, factory ) {
+
+ // CommonJS
+ if ( typeof module === 'object' && typeof module.exports === 'object' ) {
+ module.exports = factory( global, true )
+ // AMD
+ } else if ( typeof define === 'function' && define.amd ) {
+ define(function() { return factory( global, true ) })
+ // Global namespace
+ } else {
+ factory( global )
+ }
+
+}( typeof window !== 'undefined' ? window : this, function( window, noGlobalNS ) {
+
+'use strict'
+
+var document = window.document
+
+var root = document.documentElement
+
+var body = document.body
+
+var VERSION = '3.3.0'
+
+var ROUTINE = [
+ // Initialise the condition with feature-detecting
+ // classes (Modernizr-alike), binding onto the root
+ // element, possibly ``.
+ 'initCond',
+
+ // Address element normalisation
+ 'renderElem',
+
+ // Handle Biaodian
+ /* 'jinzify', */
+ 'renderJiya',
+ 'renderHanging',
+
+ // Address Biaodian correction
+ 'correctBiaodian',
+
+ // Address Hanzi and Western script mixed spacing
+ 'renderHWS',
+
+ // Address presentational correction to combining ligatures
+ 'substCombLigaWithPUA'
+
+ // Address semantic correction to inaccurate characters
+ // **Note:** inactivated by default
+ /* 'substInaccurateChar', */
+]
+
+// Define Han
+var Han = function( context, condition ) {
+ return new Han.fn.init( context, condition )
+}
+
+var init = function() {
+ if ( arguments[ 0 ] ) {
+ this.context = arguments[ 0 ]
+ }
+ if ( arguments[ 1 ] ) {
+ this.condition = arguments[ 1 ]
+ }
+ return this
+}
+
+Han.version = VERSION
+
+Han.fn = Han.prototype = {
+ version: VERSION,
+
+ constructor: Han,
+
+ // Body as the default target context
+ context: body,
+
+ // Root element as the default condition
+ condition: root,
+
+ // Default rendering routine
+ routine: ROUTINE,
+
+ init: init,
+
+ setRoutine: function( routine ) {
+ if ( Array.isArray( routine )) {
+ this.routine = routine
+ }
+ return this
+ },
+
+ // Note that the routine set up here will execute
+ // only once. The method won't alter the routine in
+ // the instance or in the prototype chain.
+ render: function( routine ) {
+ var it = this
+ var routine = Array.isArray( routine )
+ ? routine
+ : this.routine
+
+ routine
+ .forEach(function( method ) {
+ if (
+ typeof method === 'string' &&
+ typeof it[ method ] === 'function'
+ ) {
+ it[ method ]()
+ } else if (
+ Array.isArray( method ) &&
+ typeof it[ method[0] ] === 'function'
+ ) {
+ it[ method.shift() ].apply( it, method )
+ }
+ })
+ return this
+ }
+}
+
+Han.fn.init.prototype = Han.fn
+
+/**
+ * Shortcut for `render()` under the default
+ * situation.
+ *
+ * Once initialised, replace `Han.init` with the
+ * instance for future usage.
+ */
+Han.init = function() {
+ return Han.init = Han().render()
+}
+
+var UNICODE = {
+ /**
+ * Western punctuation (西文標點符號)
+ */
+ punct: {
+ base: '[\u2026,.;:!?\u203D_]',
+ sing: '[\u2010-\u2014\u2026]',
+ middle: '[\\\/~\\-&\u2010-\u2014_]',
+ open: '[\'"‘“\\(\\[\u00A1\u00BF\u2E18\u00AB\u2039\u201A\u201C\u201E]',
+ close: '[\'"”’\\)\\]\u00BB\u203A\u201B\u201D\u201F]',
+ end: '[\'"”’\\)\\]\u00BB\u203A\u201B\u201D\u201F\u203C\u203D\u2047-\u2049,.;:!?]',
+ },
+
+ /**
+ * CJK biaodian (CJK標點符號)
+ */
+ biaodian: {
+ base: '[︰.、,。:;?!ー]',
+ liga: '[—…⋯]',
+ middle: '[·\/-゠\uFF06\u30FB\uFF3F]',
+ open: '[「『《〈(〔[{【〖]',
+ close: '[」』》〉)〕]}】〗]',
+ end: '[」』》〉)〕]}】〗︰.、,。:;?!ー]'
+ },
+
+ /**
+ * CJK-related blocks (CJK相關字符區段)
+ *
+ * 1. 中日韓統一意音文字:[\u4E00-\u9FFF]
+ Basic CJK unified ideographs
+ * 2. 擴展-A區:[\u3400-\u4DB5]
+ Extended-A
+ * 3. 擴展-B區:[\u20000-\u2A6D6]([\uD840-\uD869][\uDC00-\uDED6])
+ Extended-B
+ * 4. 擴展-C區:[\u2A700-\u2B734](\uD86D[\uDC00-\uDF3F]|[\uD86A-\uD86C][\uDC00-\uDFFF]|\uD869[\uDF00-\uDFFF])
+ Extended-C
+ * 5. 擴展-D區:[\u2B740-\u2B81D](急用漢字,\uD86D[\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1F])
+ Extended-D
+ * 6. 擴展-E區:[\u2B820-\u2F7FF](暫未支援)
+ Extended-E (not supported yet)
+ * 7. 擴展-F區(暫未支援)
+ Extended-F (not supported yet)
+ * 8. 筆畫區:[\u31C0-\u31E3]
+ Strokes
+ * 9. 意音數字「〇」:[\u3007]
+ Ideographic number zero
+ * 10. 相容意音文字及補充:[\uF900-\uFAFF][\u2F800-\u2FA1D](不使用)
+ Compatibility ideograph and supplement (not supported)
+
+ 12 exceptions:
+ [\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]
+
+ https://zh.wikipedia.org/wiki/中日韓統一表意文字#cite_note-1
+
+ * 11. 康熙字典及簡化字部首:[\u2F00-\u2FD5\u2E80-\u2EF3]
+ Kangxi and supplement radicals
+ * 12. 意音文字描述字元:[\u2FF0-\u2FFA]
+ Ideographic description characters
+ */
+ hanzi: {
+ base: '[\u4E00-\u9FFF\u3400-\u4DB5\u31C0-\u31E3\u3007\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\uD800-\uDBFF][\uDC00-\uDFFF]',
+ desc: '[\u2FF0-\u2FFA]',
+ radical: '[\u2F00-\u2FD5\u2E80-\u2EF3]'
+ },
+
+ /**
+ * Latin script blocks (拉丁字母區段)
+ *
+ * 1. 基本拉丁字母:A-Za-z
+ Basic Latin
+ * 2. 阿拉伯數字:0-9
+ Digits
+ * 3. 補充-1:[\u00C0-\u00FF]
+ Latin-1 supplement
+ * 4. 擴展-A區:[\u0100-\u017F]
+ Extended-A
+ * 5. 擴展-B區:[\u0180-\u024F]
+ Extended-B
+ * 5. 擴展-C區:[\u2C60-\u2C7F]
+ Extended-C
+ * 5. 擴展-D區:[\uA720-\uA7FF]
+ Extended-D
+ * 6. 附加區:[\u1E00-\u1EFF]
+ Extended additional
+ * 7. 變音組字符:[\u0300-\u0341\u1DC0-\u1DFF]
+ Combining diacritical marks
+ */
+ latin: {
+ base: '[A-Za-z0-9\u00C0-\u00FF\u0100-\u017F\u0180-\u024F\u2C60-\u2C7F\uA720-\uA7FF\u1E00-\u1EFF]',
+ combine: '[\u0300-\u0341\u1DC0-\u1DFF]'
+ },
+
+ /**
+ * Elli̱niká (Greek) script blocks (希臘字母區段)
+ *
+ * 1. 希臘字母及擴展:[\u0370–\u03FF\u1F00-\u1FFF]
+ Basic Greek & Greek Extended
+ * 2. 阿拉伯數字:0-9
+ Digits
+ * 3. 希臘字母變音組字符:[\u0300-\u0345\u1DC0-\u1DFF]
+ Combining diacritical marks
+ */
+ ellinika: {
+ base: '[0-9\u0370-\u03FF\u1F00-\u1FFF]',
+ combine: '[\u0300-\u0345\u1DC0-\u1DFF]'
+ },
+
+ /**
+ * Kirillica (Cyrillic) script blocks (西里爾字母區段)
+ *
+ * 1. 西里爾字母及補充:[\u0400-\u0482\u048A-\u04FF\u0500-\u052F]
+ Basic Cyrillic and supplement
+ * 2. 擴展B區:[\uA640-\uA66E\uA67E-\uA697]
+ Extended-B
+ * 3. 阿拉伯數字:0-9
+ Digits
+ * 4. 西里爾字母組字符:[\u0483-\u0489\u2DE0-\u2DFF\uA66F-\uA67D\uA69F](位擴展A、B區)
+ Cyrillic combining diacritical marks (in extended-A, B)
+ */
+ kirillica: {
+ base: '[0-9\u0400-\u0482\u048A-\u04FF\u0500-\u052F\uA640-\uA66E\uA67E-\uA697]',
+ combine: '[\u0483-\u0489\u2DE0-\u2DFF\uA66F-\uA67D\uA69F]'
+ },
+
+ /**
+ * Kana (假名)
+ *
+ * 1. 日文假名:[\u30A2\u30A4\u30A6\u30A8\u30AA-\u30FA\u3042\u3044\u3046\u3048\u304A-\u3094\u309F\u30FF]
+ Japanese Kana
+ * 2. 假名補充[\u1B000\u1B001](\uD82C[\uDC00-\uDC01])
+ Kana supplement
+ * 3. 日文假名小寫:[\u3041\u3043\u3045\u3047\u3049\u30A1\u30A3\u30A5\u30A7\u30A9\u3063\u3083\u3085\u3087\u308E\u3095\u3096\u30C3\u30E3\u30E5\u30E7\u30EE\u30F5\u30F6\u31F0-\u31FF]
+ Japanese small Kana
+ * 4. 假名組字符:[\u3099-\u309C]
+ Kana combining characters
+ * 5. 半形假名:[\uFF66-\uFF9F]
+ Halfwidth Kana
+ * 6. 符號:[\u309D\u309E\u30FB-\u30FE]
+ Marks
+ */
+ kana: {
+ base: '[\u30A2\u30A4\u30A6\u30A8\u30AA-\u30FA\u3042\u3044\u3046\u3048\u304A-\u3094\u309F\u30FF]|\uD82C[\uDC00-\uDC01]',
+ small: '[\u3041\u3043\u3045\u3047\u3049\u30A1\u30A3\u30A5\u30A7\u30A9\u3063\u3083\u3085\u3087\u308E\u3095\u3096\u30C3\u30E3\u30E5\u30E7\u30EE\u30F5\u30F6\u31F0-\u31FF]',
+ combine: '[\u3099-\u309C]',
+ half: '[\uFF66-\uFF9F]',
+ mark: '[\u30A0\u309D\u309E\u30FB-\u30FE]'
+ },
+
+ /**
+ * Eonmun (Hangul, 諺文)
+ *
+ * 1. 諺文音節:[\uAC00-\uD7A3]
+ Eonmun (Hangul) syllables
+ * 2. 諺文字母:[\u1100-\u11FF\u314F-\u3163\u3131-\u318E\uA960-\uA97C\uD7B0-\uD7FB]
+ Eonmun (Hangul) letters
+ * 3. 半形諺文字母:[\uFFA1-\uFFDC]
+ Halfwidth Eonmun (Hangul) letters
+ */
+ eonmun: {
+ base: '[\uAC00-\uD7A3]',
+ letter: '[\u1100-\u11FF\u314F-\u3163\u3131-\u318E\uA960-\uA97C\uD7B0-\uD7FB]',
+ half: '[\uFFA1-\uFFDC]'
+ },
+
+ /**
+ * Zhuyin (注音符號, Mandarin & Dialect Phonetic Symbols)
+ *
+ * 1. 國語注音、方言音符號:[\u3105-\u312D][\u31A0-\u31BA]
+ Bopomofo phonetic symbols
+ * 2. 平上去聲調號:[\u02D9\u02CA\u02C5\u02C7\u02EA\u02EB\u02CB] (**註:**國語三聲包含乙個不合規範的符號)
+ Level, rising, departing tones
+ * 3. 入聲調號:[\u31B4-\u31B7][\u0358\u030d]?
+ Checked (entering) tones
+ */
+ zhuyin: {
+ base: '[\u3105-\u312D\u31A0-\u31BA]',
+ initial: '[\u3105-\u3119\u312A-\u312C\u31A0-\u31A3]',
+ medial: '[\u3127-\u3129]',
+ final: '[\u311A-\u3129\u312D\u31A4-\u31B3\u31B8-\u31BA]',
+ tone: '[\u02D9\u02CA\u02C5\u02C7\u02CB\u02EA\u02EB]',
+ checked: '[\u31B4-\u31B7][\u0358\u030d]?'
+ }
+}
+
+var TYPESET = (function() {
+ var rWhite = '[\\x20\\t\\r\\n\\f]'
+ // Whitespace characters
+ // http://www.w3.org/TR/css3-selectors/#whitespace
+
+ var rPtOpen = UNICODE.punct.open
+ var rPtClose = UNICODE.punct.close
+ var rPtEnd = UNICODE.punct.end
+ var rPtMid = UNICODE.punct.middle
+ var rPtSing = UNICODE.punct.sing
+ var rPt = rPtOpen + '|' + rPtEnd + '|' + rPtMid
+
+ var rBDOpen = UNICODE.biaodian.open
+ var rBDClose = UNICODE.biaodian.close
+ var rBDEnd = UNICODE.biaodian.end
+ var rBDMid = UNICODE.biaodian.middle
+ var rBDLiga = UNICODE.biaodian.liga + '{2}'
+ var rBD = rBDOpen + '|' + rBDEnd + '|' + rBDMid
+
+ var rKana = UNICODE.kana.base + UNICODE.kana.combine + '?'
+ var rKanaS = UNICODE.kana.small + UNICODE.kana.combine + '?'
+ var rKanaH = UNICODE.kana.half
+ var rEon = UNICODE.eonmun.base + '|' + UNICODE.eonmun.letter
+ var rEonH = UNICODE.eonmun.half
+
+ var rHan = UNICODE.hanzi.base + '|' + UNICODE.hanzi.desc + '|' + UNICODE.hanzi.radical + '|' + rKana
+
+ var rCbn = UNICODE.ellinika.combine
+ var rLatn = UNICODE.latin.base + rCbn + '*'
+ var rGk = UNICODE.ellinika.base + rCbn + '*'
+
+ var rCyCbn = UNICODE.kirillica.combine
+ var rCy = UNICODE.kirillica.base + rCyCbn + '*'
+
+ var rAlph = rLatn + '|' + rGk + '|' + rCy
+
+ // For words like `it's`, `Jones’s` or `'99`
+ var rApo = '[\u0027\u2019]'
+ var rChar = rHan + '|(?:' + rAlph + '|' + rApo + ')+'
+
+ var rZyS = UNICODE.zhuyin.initial
+ var rZyJ = UNICODE.zhuyin.medial
+ var rZyY = UNICODE.zhuyin.final
+ var rZyD = UNICODE.zhuyin.tone + '|' + UNICODE.zhuyin.checked
+
+ return {
+ /* Character-level selector (字級選擇器)
+ */
+ char: {
+ punct: {
+ all: new RegExp( '(' + rPt + ')', 'g' ),
+ open: new RegExp( '(' + rPtOpen + ')', 'g' ),
+ end: new RegExp( '(' + rPtEnd + ')', 'g' ),
+ sing: new RegExp( '(' + rPtSing + ')', 'g' )
+ },
+
+ biaodian: {
+ all: new RegExp( '(' + rBD + ')', 'g' ),
+ open: new RegExp( '(' + rBDOpen + ')', 'g' ),
+ close: new RegExp( '(' + rBDClose + ')', 'g' ),
+ end: new RegExp( '(' + rBDEnd + ')', 'g' ),
+ liga: new RegExp( '(' + rBDLiga + ')', 'g' )
+ },
+
+ hanzi: new RegExp( '(' + rHan + ')', 'g' ),
+
+ latin: new RegExp( '(' + rLatn + ')', 'ig' ),
+ ellinika: new RegExp( '(' + rGk + ')', 'ig' ),
+ kirillica: new RegExp( '(' + rCy + ')', 'ig' ),
+
+ kana: new RegExp( '(' + rKana + '|' + rKanaS + '|' + rKanaH + ')', 'g' ),
+ eonmun: new RegExp( '(' + rEon + '|' + rEonH + ')', 'g' )
+ },
+
+ /* Word-level selectors (詞級選擇器)
+ */
+ group: {
+ biaodian: [
+ new RegExp( '((' + rBD + '){2,})', 'g' ),
+ new RegExp( '(' + rBDLiga + rBDOpen + ')', 'g' )
+ ],
+ punct: null,
+ hanzi: new RegExp( '(' + rHan + ')+', 'g' ),
+ western: new RegExp( '(' + rLatn + '|' + rGk + '|' + rCy + '|' + rPt + ')+', 'ig' ),
+ kana: new RegExp( '(' + rKana + '|' + rKanaS + '|' + rKanaH + ')+', 'g' ),
+ eonmun: new RegExp( '(' + rEon + '|' + rEonH + '|' + rPt + ')+', 'g' )
+ },
+
+ /* Punctuation Rules (禁則)
+ */
+ jinze: {
+ hanging: new RegExp( rWhite + '*([、,。.])(?!' + rBDEnd + ')', 'ig' ),
+ touwei: new RegExp( '(' + rBDOpen + '+)(' + rChar + ')(' + rBDEnd + '+)', 'ig' ),
+ tou: new RegExp( '(' + rBDOpen + '+)(' + rChar + ')', 'ig' ),
+ wei: new RegExp( '(' + rChar + ')(' + rBDEnd + '+)', 'ig' ),
+ middle: new RegExp( '(' + rChar + ')(' + rBDMid + ')(' + rChar + ')', 'ig' )
+ },
+
+ zhuyin: {
+ form: new RegExp( '^\u02D9?(' + rZyS + ')?(' + rZyJ + ')?(' + rZyY + ')?(' + rZyD + ')?$' ),
+ diao: new RegExp( '(' + rZyD + ')', 'g' )
+ },
+
+ /* Hanzi and Western mixed spacing (漢字西文混排間隙)
+ * - Basic mode
+ * - Strict mode
+ */
+ hws: {
+ base: [
+ new RegExp( '('+ rHan + ')(' + rAlph + '|' + rPtOpen + ')', 'ig' ),
+ new RegExp( '('+ rAlph + '|' + rPtEnd + ')(' + rHan + ')', 'ig' )
+ ],
+
+ strict: [
+ new RegExp( '('+ rHan + ')' + rWhite + '?(' + rAlph + '|' + rPtOpen + ')', 'ig' ),
+ new RegExp( '('+ rAlph + '|' + rPtEnd + ')' + rWhite + '?(' + rHan + ')', 'ig' )
+ ]
+ },
+
+ // The feature displays the following characters
+ // in its variant form for font consistency and
+ // presentational reason. Meanwhile, this won't
+ // alter the original character in the DOM.
+ 'display-as': {
+ 'ja-font-for-hant': [
+ // '夠 够',
+ '查 査',
+ '啟 啓',
+ '鄉 鄕',
+ '值 値',
+ '污 汚'
+ ],
+
+ 'comb-liga-pua': [
+ [ '\u0061[\u030d\u0358]', '\uDB80\uDC61' ],
+ [ '\u0065[\u030d\u0358]', '\uDB80\uDC65' ],
+ [ '\u0069[\u030d\u0358]', '\uDB80\uDC69' ],
+ [ '\u006F[\u030d\u0358]', '\uDB80\uDC6F' ],
+ [ '\u0075[\u030d\u0358]', '\uDB80\uDC75' ],
+
+ [ '\u31B4[\u030d\u0358]', '\uDB8C\uDDB4' ],
+ [ '\u31B5[\u030d\u0358]', '\uDB8C\uDDB5' ],
+ [ '\u31B6[\u030d\u0358]', '\uDB8C\uDDB6' ],
+ [ '\u31B7[\u030d\u0358]', '\uDB8C\uDDB7' ]
+ ],
+
+ 'comb-liga-vowel': [
+ [ '\u0061[\u030d\u0358]', '\uDB80\uDC61' ],
+ [ '\u0065[\u030d\u0358]', '\uDB80\uDC65' ],
+ [ '\u0069[\u030d\u0358]', '\uDB80\uDC69' ],
+ [ '\u006F[\u030d\u0358]', '\uDB80\uDC6F' ],
+ [ '\u0075[\u030d\u0358]', '\uDB80\uDC75' ]
+ ],
+
+ 'comb-liga-zhuyin': [
+ [ '\u31B4[\u030d\u0358]', '\uDB8C\uDDB4' ],
+ [ '\u31B5[\u030d\u0358]', '\uDB8C\uDDB5' ],
+ [ '\u31B6[\u030d\u0358]', '\uDB8C\uDDB6' ],
+ [ '\u31B7[\u030d\u0358]', '\uDB8C\uDDB7' ]
+ ]
+ },
+
+ // The feature actually *converts* the character
+ // in the DOM for semantic reason.
+ //
+ // Note that this could be aggressive.
+ 'inaccurate-char': [
+ [ '[\u2022\u2027]', '\u00B7' ],
+ [ '\u22EF\u22EF', '\u2026\u2026' ],
+ [ '\u2500\u2500', '\u2014\u2014' ],
+ [ '\u2035', '\u2018' ],
+ [ '\u2032', '\u2019' ],
+ [ '\u2036', '\u201C' ],
+ [ '\u2033', '\u201D' ]
+ ]
+ }
+})()
+
+Han.UNICODE = UNICODE
+Han.TYPESET = TYPESET
+
+// Aliases
+Han.UNICODE.cjk = Han.UNICODE.hanzi
+Han.UNICODE.greek = Han.UNICODE.ellinika
+Han.UNICODE.cyrillic = Han.UNICODE.kirillica
+Han.UNICODE.hangul = Han.UNICODE.eonmun
+Han.UNICODE.zhuyin.ruyun = Han.UNICODE.zhuyin.checked
+
+Han.TYPESET.char.cjk = Han.TYPESET.char.hanzi
+Han.TYPESET.char.greek = Han.TYPESET.char.ellinika
+Han.TYPESET.char.cyrillic = Han.TYPESET.char.kirillica
+Han.TYPESET.char.hangul = Han.TYPESET.char.eonmun
+
+Han.TYPESET.group.hangul = Han.TYPESET.group.eonmun
+Han.TYPESET.group.cjk = Han.TYPESET.group.hanzi
+
+var $ = {
+ /**
+ * Query selectors which return arrays of the resulted
+ * node lists.
+ */
+ id: function( selector, $context ) {
+ return ( $context || document ).getElementById( selector )
+ },
+
+ tag: function( selector, $context ) {
+ return this.makeArray(
+ ( $context || document ).getElementsByTagName( selector )
+ )
+ },
+
+ qs: function( selector, $context ) {
+ return ( $context || document ).querySelector( selector )
+ },
+
+ qsa: function( selector, $context ) {
+ return this.makeArray(
+ ( $context || document ).querySelectorAll( selector )
+ )
+ },
+
+ parent: function( $node, selector ) {
+ return selector
+ ? (function() {
+ if ( typeof $.matches !== 'function' ) return
+
+ while (!$.matches( $node, selector )) {
+ if (
+ !$node ||
+ $node === document.documentElement
+ ) {
+ $node = undefined
+ break
+ }
+ $node = $node.parentNode
+ }
+ return $node
+ })()
+ : $node
+ ? $node.parentNode : undefined
+ },
+
+ /**
+ * Create a document fragment, a text node with text
+ * or an element with/without classes.
+ */
+ create: function( name, clazz ) {
+ var $elmt = '!' === name
+ ? document.createDocumentFragment()
+ : '' === name
+ ? document.createTextNode( clazz || '' )
+ : document.createElement( name )
+
+ try {
+ if ( clazz ) {
+ $elmt.className = clazz
+ }
+ } catch (e) {}
+
+ return $elmt
+ },
+
+ /**
+ * Clone a DOM node (text, element or fragment) deeply
+ * or childlessly.
+ */
+ clone: function( $node, deep ) {
+ return $node.cloneNode(
+ typeof deep === 'boolean'
+ ? deep
+ : true
+ )
+ },
+
+ /**
+ * Remove a node (text, element or fragment).
+ */
+ remove: function( $node ) {
+ return $node.parentNode.removeChild( $node )
+ },
+
+ /**
+ * Set attributes all in once with an object.
+ */
+ setAttr: function( target, attr ) {
+ if ( typeof attr !== 'object' ) return
+ var len = attr.length
+
+ // Native `NamedNodeMap``:
+ if (
+ typeof attr[0] === 'object' &&
+ 'name' in attr[0]
+ ) {
+ for ( var i = 0; i < len; i++ ) {
+ if ( attr[ i ].value !== undefined ) {
+ target.setAttribute( attr[ i ].name, attr[ i ].value )
+ }
+ }
+
+ // Plain object:
+ } else {
+ for ( var name in attr ) {
+ if (
+ attr.hasOwnProperty( name ) &&
+ attr[ name ] !== undefined
+ ) {
+ target.setAttribute( name, attr[ name ] )
+ }
+ }
+ }
+ return target
+ },
+
+ /**
+ * Indicate whether or not the given node is an
+ * element.
+ */
+ isElmt: function( $node ) {
+ return $node && $node.nodeType === Node.ELEMENT_NODE
+ },
+
+ /**
+ * Indicate whether or not the given node should
+ * be ignored (`` or comments).
+ */
+ isIgnorable: function( $node ) {
+ if ( !$node ) return false
+
+ return (
+ $node.nodeName === 'WBR' ||
+ $node.nodeType === Node.COMMENT_NODE
+ )
+ },
+
+ /**
+ * Convert array-like objects into real arrays.
+ */
+ makeArray: function( object ) {
+ return Array.prototype.slice.call( object )
+ },
+
+ /**
+ * Extend target with an object.
+ */
+ extend: function( target, object ) {
+ if ((
+ typeof target === 'object' ||
+ typeof target === 'function' ) &&
+ typeof object === 'object'
+ ) {
+ for ( var name in object ) {
+ if (object.hasOwnProperty( name )) {
+ target[ name ] = object[ name ]
+ }
+ }
+ }
+ return target
+ }
+}
+
+var Fibre =
+/*!
+ * Fibre.js v0.2.1 | MIT License | github.com/ethantw/fibre.js
+ * Based on findAndReplaceDOMText
+ */
+
+function( Finder ) {
+
+'use strict'
+
+var VERSION = '0.2.1'
+var NON_INLINE_PROSE = Finder.NON_INLINE_PROSE
+var AVOID_NON_PROSE = Finder.PRESETS.prose.filterElements
+
+var global = window || {}
+var document = global.document || undefined
+
+function matches( node, selector, bypassNodeType39 ) {
+ var Efn = Element.prototype
+ var matches = Efn.matches || Efn.mozMatchesSelector || Efn.msMatchesSelector || Efn.webkitMatchesSelector
+
+ if ( node instanceof Element ) {
+ return matches.call( node, selector )
+ } else if ( bypassNodeType39 ) {
+ if ( /^[39]$/.test( node.nodeType )) return true
+ }
+ return false
+}
+
+if ( typeof document === 'undefined' ) throw new Error( 'Fibre requires a DOM-supported environment.' )
+
+var Fibre = function( context, preset ) {
+ return new Fibre.fn.init( context, preset )
+}
+
+Fibre.version = VERSION
+Fibre.matches = matches
+
+Fibre.fn = Fibre.prototype = {
+ constructor: Fibre,
+
+ version: VERSION,
+
+ finder: [],
+
+ context: undefined,
+
+ portionMode: 'retain',
+
+ selector: {},
+
+ preset: 'prose',
+
+ init: function( context, noPreset ) {
+ if ( !!noPreset ) this.preset = null
+
+ this.selector = {
+ context: null,
+ filter: [],
+ avoid: [],
+ boundary: []
+ }
+
+ if ( !context ) {
+ throw new Error( 'A context is required for Fibre to initialise.' )
+ } else if ( context instanceof Node ) {
+ if ( context instanceof Document ) this.context = context.body || context
+ else this.context = context
+ } else if ( typeof context === 'string' ) {
+ this.context = document.querySelector( context )
+ this.selector.context = context
+ }
+ return this
+ },
+
+ filterFn: function( node ) {
+ var filter = this.selector.filter.join( ', ' ) || '*'
+ var avoid = this.selector.avoid.join( ', ' ) || null
+ var result = matches( node, filter, true ) && !matches( node, avoid )
+ return ( this.preset === 'prose' ) ? AVOID_NON_PROSE( node ) && result : result
+ },
+
+ boundaryFn: function( node ) {
+ var boundary = this.selector.boundary.join( ', ' ) || null
+ var result = matches( node, boundary )
+ return ( this.preset === 'prose' ) ? NON_INLINE_PROSE( node ) || result : result
+ },
+
+ filter: function( selector ) {
+ if ( typeof selector === 'string' ) {
+ this.selector.filter.push( selector )
+ }
+ return this
+ },
+
+ endFilter: function( all ) {
+ if ( all ) {
+ this.selector.filter = []
+ } else {
+ this.selector.filter.pop()
+ }
+ return this
+ },
+
+ avoid: function( selector ) {
+ if ( typeof selector === 'string' ) {
+ this.selector.avoid.push( selector )
+ }
+ return this
+ },
+
+ endAvoid: function( all ) {
+ if ( all ) {
+ this.selector.avoid = []
+ } else {
+ this.selector.avoid.pop()
+ }
+ return this
+ },
+
+ addBoundary: function( selector ) {
+ if ( typeof selector === 'string' ) {
+ this.selector.boundary.push( selector )
+ }
+ return this
+ },
+
+ removeBoundary: function() {
+ this.selector.boundary = []
+ return this
+ },
+
+ setMode: function( portionMode ) {
+ this.portionMode = portionMode === 'first' ? 'first' : 'retain'
+ return this
+ },
+
+ replace: function( regexp, newSubStr ) {
+ var it = this
+ it.finder.push(Finder( it.context, {
+ find: regexp,
+ replace: newSubStr,
+ filterElements: function( currentNode ) {
+ return it.filterFn( currentNode )
+ },
+ forceContext: function( currentNode ) {
+ return it.boundaryFn( currentNode )
+ },
+ portionMode: it.portionMode
+ }))
+ return it
+ },
+
+ wrap: function( regexp, strElemName ) {
+ var it = this
+ it.finder.push(Finder( it.context, {
+ find: regexp,
+ wrap: strElemName,
+ filterElements: function( currentNode ) {
+ return it.filterFn( currentNode )
+ },
+ forceContext: function( currentNode ) {
+ return it.boundaryFn( currentNode )
+ },
+ portionMode: it.portionMode
+ }))
+ return it
+ },
+
+ revert: function( level ) {
+ var max = this.finder.length
+ var level = Number( level ) || ( level === 0 ? Number(0) :
+ ( level === 'all' ? max : 1 ))
+
+ if ( typeof max === 'undefined' || max === 0 ) return this
+ else if ( level > max ) level = max
+
+ for ( var i = level; i > 0; i-- ) {
+ this.finder.pop().revert()
+ }
+ return this
+ }
+}
+
+// Deprecated API(s)
+Fibre.fn.filterOut = Fibre.fn.avoid
+
+// Make sure init() inherit from Fibre()
+Fibre.fn.init.prototype = Fibre.fn
+
+return Fibre
+
+}(
+
+/**
+ * findAndReplaceDOMText v 0.4.3
+ * @author James Padolsey http://james.padolsey.com
+ * @license http://unlicense.org/UNLICENSE
+ *
+ * Matches the text of a DOM node against a regular expression
+ * and replaces each match (or node-separated portions of the match)
+ * in the specified element.
+ */
+ (function() {
+
+ var PORTION_MODE_RETAIN = 'retain'
+ var PORTION_MODE_FIRST = 'first'
+ var doc = document
+ var toString = {}.toString
+ var hasOwn = {}.hasOwnProperty
+ function isArray(a) {
+ return toString.call(a) == '[object Array]'
+ }
+
+ function escapeRegExp(s) {
+ return String(s).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1')
+ }
+
+ function exposed() {
+ // Try deprecated arg signature first:
+ return deprecated.apply(null, arguments) || findAndReplaceDOMText.apply(null, arguments)
+ }
+
+ function deprecated(regex, node, replacement, captureGroup, elFilter) {
+ if ((node && !node.nodeType) && arguments.length <= 2) {
+ return false
+ }
+ var isReplacementFunction = typeof replacement == 'function'
+ if (isReplacementFunction) {
+ replacement = (function(original) {
+ return function(portion, match) {
+ return original(portion.text, match.startIndex)
+ }
+ }(replacement))
+ }
+
+ // Awkward support for deprecated argument signature (<0.4.0)
+ var instance = findAndReplaceDOMText(node, {
+
+ find: regex,
+
+ wrap: isReplacementFunction ? null : replacement,
+ replace: isReplacementFunction ? replacement : '$' + (captureGroup || '&'),
+
+ prepMatch: function(m, mi) {
+
+ // Support captureGroup (a deprecated feature)
+
+ if (!m[0]) throw 'findAndReplaceDOMText cannot handle zero-length matches'
+ if (captureGroup > 0) {
+ var cg = m[captureGroup]
+ m.index += m[0].indexOf(cg)
+ m[0] = cg
+ }
+
+ m.endIndex = m.index + m[0].length
+ m.startIndex = m.index
+ m.index = mi
+ return m
+ },
+ filterElements: elFilter
+ })
+ exposed.revert = function() {
+ return instance.revert()
+ }
+ return true
+ }
+
+ /**
+ * findAndReplaceDOMText
+ *
+ * Locates matches and replaces with replacementNode
+ *
+ * @param {Node} node Element or Text node to search within
+ * @param {RegExp} options.find The regular expression to match
+ * @param {String|Element} [options.wrap] A NodeName, or a Node to clone
+ * @param {String|Function} [options.replace='$&'] What to replace each match with
+ * @param {Function} [options.filterElements] A Function to be called to check whether to
+ * process an element. (returning true = process element,
+ * returning false = avoid element)
+ */
+ function findAndReplaceDOMText(node, options) {
+ return new Finder(node, options)
+ }
+
+ exposed.NON_PROSE_ELEMENTS = {
+ br:1, hr:1,
+ // Media / Source elements:
+ script:1, style:1, img:1, video:1, audio:1, canvas:1, svg:1, map:1, object:1,
+ // Input elements
+ input:1, textarea:1, select:1, option:1, optgroup: 1, button:1
+ }
+ exposed.NON_CONTIGUOUS_PROSE_ELEMENTS = {
+
+ // Elements that will not contain prose or block elements where we don't
+ // want prose to be matches across element borders:
+
+ // Block Elements
+ address:1, article:1, aside:1, blockquote:1, dd:1, div:1,
+ dl:1, fieldset:1, figcaption:1, figure:1, footer:1, form:1, h1:1, h2:1, h3:1,
+ h4:1, h5:1, h6:1, header:1, hgroup:1, hr:1, main:1, nav:1, noscript:1, ol:1,
+ output:1, p:1, pre:1, section:1, ul:1,
+ // Other misc. elements that are not part of continuous inline prose:
+ br:1, li: 1, summary: 1, dt:1, details:1, rp:1, rt:1, rtc:1,
+ // Media / Source elements:
+ script:1, style:1, img:1, video:1, audio:1, canvas:1, svg:1, map:1, object:1,
+ // Input elements
+ input:1, textarea:1, select:1, option:1, optgroup: 1, button:1,
+ // Table related elements:
+ table:1, tbody:1, thead:1, th:1, tr:1, td:1, caption:1, col:1, tfoot:1, colgroup:1
+
+ }
+ exposed.NON_INLINE_PROSE = function(el) {
+ return hasOwn.call(exposed.NON_CONTIGUOUS_PROSE_ELEMENTS, el.nodeName.toLowerCase())
+ }
+ // Presets accessed via `options.preset` when calling findAndReplaceDOMText():
+ exposed.PRESETS = {
+ prose: {
+ forceContext: exposed.NON_INLINE_PROSE,
+ filterElements: function(el) {
+ return !hasOwn.call(exposed.NON_PROSE_ELEMENTS, el.nodeName.toLowerCase())
+ }
+ }
+ }
+ exposed.Finder = Finder
+ /**
+ * Finder -- encapsulates logic to find and replace.
+ */
+ function Finder(node, options) {
+
+ var preset = options.preset && exposed.PRESETS[options.preset]
+ options.portionMode = options.portionMode || PORTION_MODE_RETAIN
+ if (preset) {
+ for (var i in preset) {
+ if (hasOwn.call(preset, i) && !hasOwn.call(options, i)) {
+ options[i] = preset[i]
+ }
+ }
+ }
+
+ this.node = node
+ this.options = options
+ // ENable match-preparation method to be passed as option:
+ this.prepMatch = options.prepMatch || this.prepMatch
+ this.reverts = []
+ this.matches = this.search()
+ if (this.matches.length) {
+ this.processMatches()
+ }
+
+ }
+
+ Finder.prototype = {
+
+ /**
+ * Searches for all matches that comply with the instance's 'match' option
+ */
+ search: function() {
+
+ var match
+ var matchIndex = 0
+ var offset = 0
+ var regex = this.options.find
+ var textAggregation = this.getAggregateText()
+ var matches = []
+ var self = this
+ regex = typeof regex === 'string' ? RegExp(escapeRegExp(regex), 'g') : regex
+ matchAggregation(textAggregation)
+ function matchAggregation(textAggregation) {
+ for (var i = 0, l = textAggregation.length; i < l; ++i) {
+
+ var text = textAggregation[i]
+ if (typeof text !== 'string') {
+ // Deal with nested contexts: (recursive)
+ matchAggregation(text)
+ continue
+ }
+
+ if (regex.global) {
+ while (match = regex.exec(text)) {
+ matches.push(self.prepMatch(match, matchIndex++, offset))
+ }
+ } else {
+ if (match = text.match(regex)) {
+ matches.push(self.prepMatch(match, 0, offset))
+ }
+ }
+
+ offset += text.length
+ }
+ }
+
+ return matches
+ },
+
+ /**
+ * Prepares a single match with useful meta info:
+ */
+ prepMatch: function(match, matchIndex, characterOffset) {
+
+ if (!match[0]) {
+ throw new Error('findAndReplaceDOMText cannot handle zero-length matches')
+ }
+
+ match.endIndex = characterOffset + match.index + match[0].length
+ match.startIndex = characterOffset + match.index
+ match.index = matchIndex
+ return match
+ },
+
+ /**
+ * Gets aggregate text within subject node
+ */
+ getAggregateText: function() {
+
+ var elementFilter = this.options.filterElements
+ var forceContext = this.options.forceContext
+ return getText(this.node)
+ /**
+ * Gets aggregate text of a node without resorting
+ * to broken innerText/textContent
+ */
+ function getText(node, txt) {
+
+ if (node.nodeType === 3) {
+ return [node.data]
+ }
+
+ if (elementFilter && !elementFilter(node)) {
+ return []
+ }
+
+ var txt = ['']
+ var i = 0
+ if (node = node.firstChild) do {
+
+ if (node.nodeType === 3) {
+ txt[i] += node.data
+ continue
+ }
+
+ var innerText = getText(node)
+ if (
+ forceContext &&
+ node.nodeType === 1 &&
+ (forceContext === true || forceContext(node))
+ ) {
+ txt[++i] = innerText
+ txt[++i] = ''
+ } else {
+ if (typeof innerText[0] === 'string') {
+ // Bridge nested text-node data so that they're
+ // not considered their own contexts:
+ // I.e. ['some', ['thing']] -> ['something']
+ txt[i] += innerText.shift()
+ }
+ if (innerText.length) {
+ txt[++i] = innerText
+ txt[++i] = ''
+ }
+ }
+ } while (node = node.nextSibling)
+ return txt
+ }
+
+ },
+
+ /**
+ * Steps through the target node, looking for matches, and
+ * calling replaceFn when a match is found.
+ */
+ processMatches: function() {
+
+ var matches = this.matches
+ var node = this.node
+ var elementFilter = this.options.filterElements
+ var startPortion,
+ endPortion,
+ innerPortions = [],
+ curNode = node,
+ match = matches.shift(),
+ atIndex = 0, // i.e. nodeAtIndex
+ matchIndex = 0,
+ portionIndex = 0,
+ doAvoidNode,
+ nodeStack = [node]
+ out: while (true) {
+
+ if (curNode.nodeType === 3) {
+
+ if (!endPortion && curNode.length + atIndex >= match.endIndex) {
+
+ // We've found the ending
+ endPortion = {
+ node: curNode,
+ index: portionIndex++,
+ text: curNode.data.substring(match.startIndex - atIndex, match.endIndex - atIndex),
+ indexInMatch: atIndex - match.startIndex,
+ indexInNode: match.startIndex - atIndex, // always zero for end-portions
+ endIndexInNode: match.endIndex - atIndex,
+ isEnd: true
+ }
+ } else if (startPortion) {
+ // Intersecting node
+ innerPortions.push({
+ node: curNode,
+ index: portionIndex++,
+ text: curNode.data,
+ indexInMatch: atIndex - match.startIndex,
+ indexInNode: 0 // always zero for inner-portions
+ })
+ }
+
+ if (!startPortion && curNode.length + atIndex > match.startIndex) {
+ // We've found the match start
+ startPortion = {
+ node: curNode,
+ index: portionIndex++,
+ indexInMatch: 0,
+ indexInNode: match.startIndex - atIndex,
+ endIndexInNode: match.endIndex - atIndex,
+ text: curNode.data.substring(match.startIndex - atIndex, match.endIndex - atIndex)
+ }
+ }
+
+ atIndex += curNode.data.length
+ }
+
+ doAvoidNode = curNode.nodeType === 1 && elementFilter && !elementFilter(curNode)
+ if (startPortion && endPortion) {
+
+ curNode = this.replaceMatch(match, startPortion, innerPortions, endPortion)
+ // processMatches has to return the node that replaced the endNode
+ // and then we step back so we can continue from the end of the
+ // match:
+
+ atIndex -= (endPortion.node.data.length - endPortion.endIndexInNode)
+ startPortion = null
+ endPortion = null
+ innerPortions = []
+ match = matches.shift()
+ portionIndex = 0
+ matchIndex++
+ if (!match) {
+ break; // no more matches
+ }
+
+ } else if (
+ !doAvoidNode &&
+ (curNode.firstChild || curNode.nextSibling)
+ ) {
+ // Move down or forward:
+ if (curNode.firstChild) {
+ nodeStack.push(curNode)
+ curNode = curNode.firstChild
+ } else {
+ curNode = curNode.nextSibling
+ }
+ continue
+ }
+
+ // Move forward or up:
+ while (true) {
+ if (curNode.nextSibling) {
+ curNode = curNode.nextSibling
+ break
+ }
+ curNode = nodeStack.pop()
+ if (curNode === node) {
+ break out
+ }
+ }
+
+ }
+
+ },
+
+ /**
+ * Reverts ... TODO
+ */
+ revert: function() {
+ // Reversion occurs backwards so as to avoid nodes subsequently
+ // replaced during the matching phase (a forward process):
+ for (var l = this.reverts.length; l--;) {
+ this.reverts[l]()
+ }
+ this.reverts = []
+ },
+
+ prepareReplacementString: function(string, portion, match, matchIndex) {
+ var portionMode = this.options.portionMode
+ if (
+ portionMode === PORTION_MODE_FIRST &&
+ portion.indexInMatch > 0
+ ) {
+ return ''
+ }
+ string = string.replace(/\$(\d+|&|`|')/g, function($0, t) {
+ var replacement
+ switch(t) {
+ case '&':
+ replacement = match[0]
+ break
+ case '`':
+ replacement = match.input.substring(0, match.startIndex)
+ break
+ case '\'':
+ replacement = match.input.substring(match.endIndex)
+ break
+ default:
+ replacement = match[+t]
+ }
+ return replacement
+ })
+ if (portionMode === PORTION_MODE_FIRST) {
+ return string
+ }
+
+ if (portion.isEnd) {
+ return string.substring(portion.indexInMatch)
+ }
+
+ return string.substring(portion.indexInMatch, portion.indexInMatch + portion.text.length)
+ },
+
+ getPortionReplacementNode: function(portion, match, matchIndex) {
+
+ var replacement = this.options.replace || '$&'
+ var wrapper = this.options.wrap
+ if (wrapper && wrapper.nodeType) {
+ // Wrapper has been provided as a stencil-node for us to clone:
+ var clone = doc.createElement('div')
+ clone.innerHTML = wrapper.outerHTML || new XMLSerializer().serializeToString(wrapper)
+ wrapper = clone.firstChild
+ }
+
+ if (typeof replacement == 'function') {
+ replacement = replacement(portion, match, matchIndex)
+ if (replacement && replacement.nodeType) {
+ return replacement
+ }
+ return doc.createTextNode(String(replacement))
+ }
+
+ var el = typeof wrapper == 'string' ? doc.createElement(wrapper) : wrapper
+ replacement = doc.createTextNode(
+ this.prepareReplacementString(
+ replacement, portion, match, matchIndex
+ )
+ )
+ if (!replacement.data) {
+ return replacement
+ }
+
+ if (!el) {
+ return replacement
+ }
+
+ el.appendChild(replacement)
+ return el
+ },
+
+ replaceMatch: function(match, startPortion, innerPortions, endPortion) {
+
+ var matchStartNode = startPortion.node
+ var matchEndNode = endPortion.node
+ var preceedingTextNode
+ var followingTextNode
+ if (matchStartNode === matchEndNode) {
+
+ var node = matchStartNode
+ if (startPortion.indexInNode > 0) {
+ // Add `before` text node (before the match)
+ preceedingTextNode = doc.createTextNode(node.data.substring(0, startPortion.indexInNode))
+ node.parentNode.insertBefore(preceedingTextNode, node)
+ }
+
+ // Create the replacement node:
+ var newNode = this.getPortionReplacementNode(
+ endPortion,
+ match
+ )
+ node.parentNode.insertBefore(newNode, node)
+ if (endPortion.endIndexInNode < node.length) { // ?????
+ // Add `after` text node (after the match)
+ followingTextNode = doc.createTextNode(node.data.substring(endPortion.endIndexInNode))
+ node.parentNode.insertBefore(followingTextNode, node)
+ }
+
+ node.parentNode.removeChild(node)
+ this.reverts.push(function() {
+ if (preceedingTextNode === newNode.previousSibling) {
+ preceedingTextNode.parentNode.removeChild(preceedingTextNode)
+ }
+ if (followingTextNode === newNode.nextSibling) {
+ followingTextNode.parentNode.removeChild(followingTextNode)
+ }
+ newNode.parentNode.replaceChild(node, newNode)
+ })
+ return newNode
+ } else {
+ // Replace matchStartNode -> [innerMatchNodes...] -> matchEndNode (in that order)
+
+ preceedingTextNode = doc.createTextNode(
+ matchStartNode.data.substring(0, startPortion.indexInNode)
+ )
+ followingTextNode = doc.createTextNode(
+ matchEndNode.data.substring(endPortion.endIndexInNode)
+ )
+ var firstNode = this.getPortionReplacementNode(
+ startPortion,
+ match
+ )
+ var innerNodes = []
+ for (var i = 0, l = innerPortions.length; i < l; ++i) {
+ var portion = innerPortions[i]
+ var innerNode = this.getPortionReplacementNode(
+ portion,
+ match
+ )
+ portion.node.parentNode.replaceChild(innerNode, portion.node)
+ this.reverts.push((function(portion, innerNode) {
+ return function() {
+ innerNode.parentNode.replaceChild(portion.node, innerNode)
+ }
+ }(portion, innerNode)))
+ innerNodes.push(innerNode)
+ }
+
+ var lastNode = this.getPortionReplacementNode(
+ endPortion,
+ match
+ )
+ matchStartNode.parentNode.insertBefore(preceedingTextNode, matchStartNode)
+ matchStartNode.parentNode.insertBefore(firstNode, matchStartNode)
+ matchStartNode.parentNode.removeChild(matchStartNode)
+ matchEndNode.parentNode.insertBefore(lastNode, matchEndNode)
+ matchEndNode.parentNode.insertBefore(followingTextNode, matchEndNode)
+ matchEndNode.parentNode.removeChild(matchEndNode)
+ this.reverts.push(function() {
+ preceedingTextNode.parentNode.removeChild(preceedingTextNode)
+ firstNode.parentNode.replaceChild(matchStartNode, firstNode)
+ followingTextNode.parentNode.removeChild(followingTextNode)
+ lastNode.parentNode.replaceChild(matchEndNode, lastNode)
+ })
+ return lastNode
+ }
+ }
+
+ }
+ return exposed
+}())
+
+);
+
+var isNodeNormalizeNormal = (function() {
+ //// Disabled `Node.normalize()` for temp due to
+ //// issue below in IE11.
+ //// See: http://stackoverflow.com/questions/22337498/why-does-ie11-handle-node-normalize-incorrectly-for-the-minus-symbol
+ var div = $.create( 'div' )
+
+ div.appendChild($.create( '', '0-' ))
+ div.appendChild($.create( '', '2' ))
+ div.normalize()
+
+ return div.firstChild.length !== 2
+})()
+
+function getFuncOrElmt( obj ) {
+ return (
+ typeof obj === 'function' ||
+ obj instanceof Element
+ )
+ ? obj
+ : undefined
+}
+
+function createBDGroup( portion ) {
+ var clazz = portion.index === 0 && portion.isEnd
+ ? 'biaodian cjk'
+ : 'biaodian cjk portion ' + (
+ portion.index === 0
+ ? 'is-first'
+ : portion.isEnd
+ ? 'is-end'
+ : 'is-inner'
+ )
+
+ var $elmt = $.create( 'h-char-group', clazz )
+ $elmt.innerHTML = portion.text
+ return $elmt
+}
+
+function createBDChar( char ) {
+ var div = $.create( 'div' )
+ var unicode = char.charCodeAt( 0 ).toString( 16 )
+
+ div.innerHTML = (
+ '' + char + ' '
+ )
+ return div.firstChild
+}
+
+function getBDType( char ) {
+ return char.match( TYPESET.char.biaodian.open )
+ ? 'bd-open'
+ : char.match( TYPESET.char.biaodian.close )
+ ? 'bd-close bd-end'
+ : char.match( TYPESET.char.biaodian.end )
+ ? (
+ /(?:\u3001|\u3002|\uff0c)/i.test( char )
+ ? 'bd-end bd-cop'
+ : 'bd-end'
+ )
+ : char.match(new RegExp( UNICODE.biaodian.liga ))
+ ? 'bd-liga'
+ : char.match(new RegExp( UNICODE.biaodian.middle ))
+ ? 'bd-middle'
+ : ''
+}
+
+$.extend( Fibre.fn, {
+ normalize: function() {
+ if ( isNodeNormalizeNormal ) {
+ this.context.normalize()
+ }
+ return this
+ },
+
+ // Force punctuation & biaodian typesetting rules to be applied.
+ jinzify: function( selector ) {
+ return (
+ this
+ .filter( selector || null )
+ .avoid( 'h-jinze' )
+ .replace(
+ TYPESET.jinze.touwei,
+ function( portion, match ) {
+ var elem = $.create( 'h-jinze', 'touwei' )
+ elem.innerHTML = match[0]
+ return (( portion.index === 0 && portion.isEnd ) || portion.index === 1 ) ? elem : ''
+ }
+ )
+ .replace(
+ TYPESET.jinze.wei,
+ function( portion, match ) {
+ var elem = $.create( 'h-jinze', 'wei' )
+ elem.innerHTML = match[0]
+ return portion.index === 0 ? elem : ''
+ }
+ )
+ .replace(
+ TYPESET.jinze.tou,
+ function( portion, match ) {
+ var elem = $.create( 'h-jinze', 'tou' )
+ elem.innerHTML = match[0]
+ return (( portion.index === 0 && portion.isEnd ) || portion.index === 1 )
+ ? elem : ''
+ }
+ )
+ .replace(
+ TYPESET.jinze.middle,
+ function( portion, match ) {
+ var elem = $.create( 'h-jinze', 'middle' )
+ elem.innerHTML = match[0]
+ return (( portion.index === 0 && portion.isEnd ) || portion.index === 1 )
+ ? elem : ''
+ }
+ )
+ .endAvoid()
+ .endFilter()
+ )
+ },
+
+ groupify: function( option ) {
+ var option = $.extend({
+ biaodian: false,
+ //punct: false,
+ hanzi: false, // Includes Kana
+ kana: false,
+ eonmun: false,
+ western: false // Includes Latin, Greek and Cyrillic
+ }, option || {})
+
+ this.avoid( 'h-word, h-char-group' )
+
+ if ( option.biaodian ) {
+ this.replace(
+ TYPESET.group.biaodian[0], createBDGroup
+ ).replace(
+ TYPESET.group.biaodian[1], createBDGroup
+ )
+ }
+
+ if ( option.hanzi || option.cjk ) {
+ this.wrap(
+ TYPESET.group.hanzi, $.clone($.create( 'h-char-group', 'hanzi cjk' ))
+ )
+ }
+ if ( option.western ) {
+ this.wrap(
+ TYPESET.group.western, $.clone($.create( 'h-word', 'western' ))
+ )
+ }
+ if ( option.kana ) {
+ this.wrap(
+ TYPESET.group.kana, $.clone($.create( 'h-char-group', 'kana' ))
+ )
+ }
+ if ( option.eonmun || option.hangul ) {
+ this.wrap(
+ TYPESET.group.eonmun, $.clone($.create( 'h-word', 'eonmun hangul' ))
+ )
+ }
+
+ this.endAvoid()
+ return this
+ },
+
+ charify: function( option ) {
+ var option = $.extend({
+ avoid: true,
+ biaodian: false,
+ punct: false,
+ hanzi: false, // Includes Kana
+ latin: false,
+ ellinika: false,
+ kirillica: false,
+ kana: false,
+ eonmun: false
+ }, option || {})
+
+ if ( option.avoid ) {
+ this.avoid( 'h-char' )
+ }
+
+ if ( option.biaodian ) {
+ this.replace(
+ TYPESET.char.biaodian.all,
+ getFuncOrElmt( option.biaodian )
+ ||
+ function( portion ) { return createBDChar( portion.text ) }
+ ).replace(
+ TYPESET.char.biaodian.liga,
+ getFuncOrElmt( option.biaodian )
+ ||
+ function( portion ) { return createBDChar( portion.text ) }
+ )
+ }
+ if ( option.hanzi || option.cjk ) {
+ this.wrap(
+ TYPESET.char.hanzi,
+ getFuncOrElmt( option.hanzi || option.cjk )
+ ||
+ $.clone($.create( 'h-char', 'hanzi cjk' ))
+ )
+ }
+ if ( option.punct ) {
+ this.wrap(
+ TYPESET.char.punct.all,
+ getFuncOrElmt( option.punct )
+ ||
+ $.clone($.create( 'h-char', 'punct' ))
+ )
+ }
+ if ( option.latin ) {
+ this.wrap(
+ TYPESET.char.latin,
+ getFuncOrElmt( option.latin )
+ ||
+ $.clone($.create( 'h-char', 'alphabet latin' ))
+ )
+ }
+ if ( option.ellinika || option.greek ) {
+ this.wrap(
+ TYPESET.char.ellinika,
+ getFuncOrElmt( option.ellinika || option.greek )
+ ||
+ $.clone($.create( 'h-char', 'alphabet ellinika greek' ))
+ )
+ }
+ if ( option.kirillica || option.cyrillic ) {
+ this.wrap(
+ TYPESET.char.kirillica,
+ getFuncOrElmt( option.kirillica || option.cyrillic )
+ ||
+ $.clone($.create( 'h-char', 'alphabet kirillica cyrillic' ))
+ )
+ }
+ if ( option.kana ) {
+ this.wrap(
+ TYPESET.char.kana,
+ getFuncOrElmt( option.kana )
+ ||
+ $.clone($.create( 'h-char', 'kana' ))
+ )
+ }
+ if ( option.eonmun || option.hangul ) {
+ this.wrap(
+ TYPESET.char.eonmun,
+ getFuncOrElmt( option.eonmun || option.hangul )
+ ||
+ $.clone($.create( 'h-char', 'eonmun hangul' ))
+ )
+ }
+
+ this.endAvoid()
+ return this
+ }
+})
+
+$.extend( Han, {
+ isNodeNormalizeNormal: isNodeNormalizeNormal,
+ find: Fibre,
+ createBDGroup: createBDGroup,
+ createBDChar: createBDChar
+})
+
+$.matches = Han.find.matches
+
+void [
+ 'setMode',
+ 'wrap', 'replace', 'revert',
+ 'addBoundary', 'removeBoundary',
+ 'avoid', 'endAvoid',
+ 'filter', 'endFilter',
+ 'jinzify', 'groupify', 'charify'
+].forEach(function( method ) {
+ Han.fn[ method ] = function() {
+ if ( !this.finder ) {
+ // Share the same selector
+ this.finder = Han.find( this.context )
+ }
+
+ this.finder[ method ]( arguments[ 0 ], arguments[ 1 ] )
+ return this
+ }
+})
+
+var Locale = {}
+
+function writeOnCanvas( text, font ) {
+ var canvas = $.create( 'canvas' )
+ var context
+
+ canvas.width = '50'
+ canvas.height = '20'
+ canvas.style.display = 'none'
+
+ body.appendChild( canvas )
+
+ context = canvas.getContext( '2d' )
+ context.textBaseline = 'top'
+ context.font = '15px ' + font + ', sans-serif'
+ context.fillStyle = 'black'
+ context.strokeStyle = 'black'
+ context.fillText( text, 0, 0 )
+
+ return {
+ node: canvas,
+ context: context,
+ remove: function() {
+ $.remove( canvas, body )
+ }
+ }
+}
+
+function compareCanvases( treat, control ) {
+ var ret
+ var a = treat.context
+ var b = control.context
+
+ try {
+ for ( var j = 1; j <= 20; j++ ) {
+ for ( var i = 1; i <= 50; i++ ) {
+ if (
+ typeof ret === 'undefined' &&
+ a.getImageData(i, j, 1, 1).data[3] !== b.getImageData(i, j, 1, 1).data[3]
+ ) {
+ ret = false
+ break
+ } else if ( typeof ret === 'boolean' ) {
+ break
+ }
+
+ if ( i === 50 && j === 20 && typeof ret === 'undefined' ) {
+ ret = true
+ }
+ }
+ }
+
+ // Remove and clean from memory
+ treat.remove()
+ control.remove()
+ treat = null
+ control = null
+
+ return ret
+ } catch (e) {}
+ return false
+}
+
+function detectFont( treat, control, text ) {
+ var treat = treat
+ var control = control || 'sans-serif'
+ var text = text || '辭Q'
+ var ret
+
+ control = writeOnCanvas( text, control )
+ treat = writeOnCanvas( text, treat )
+
+ return !compareCanvases( treat, control )
+}
+
+Locale.writeOnCanvas = writeOnCanvas
+Locale.compareCanvases = compareCanvases
+Locale.detectFont = detectFont
+
+Locale.support = (function() {
+
+ var PREFIX = 'Webkit Moz ms'.split(' ')
+
+ // Create an element for feature detecting
+ // (in `testCSSProp`)
+ var elem = $.create( 'h-test' )
+
+ function testCSSProp( prop ) {
+ var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1)
+ var allProp = ( prop + ' ' + PREFIX.join( ucProp + ' ' ) + ucProp ).split(' ')
+ var ret
+
+ allProp.forEach(function( prop ) {
+ if ( typeof elem.style[ prop ] === 'string' ) {
+ ret = true
+ }
+ })
+ return ret || false
+ }
+
+ function injectElementWithStyle( rule, callback ) {
+ var fakeBody = body || $.create( 'body' )
+ var div = $.create( 'div' )
+ var container = body ? div : fakeBody
+ var callback = typeof callback === 'function' ? callback : function() {}
+ var style, ret, docOverflow
+
+ style = [ '' ].join('')
+
+ container.innerHTML += style
+ fakeBody.appendChild( div )
+
+ if ( !body ) {
+ fakeBody.style.background = ''
+ fakeBody.style.overflow = 'hidden'
+ docOverflow = root.style.overflow
+
+ root.style.overflow = 'hidden'
+ root.appendChild( fakeBody )
+ }
+
+ // Callback
+ ret = callback( container, rule )
+
+ // Remove the injected scope
+ $.remove( container )
+ if ( !body ) {
+ root.style.overflow = docOverflow
+ }
+ return !!ret
+ }
+
+ function getStyle( elem, prop ) {
+ var ret
+
+ if ( window.getComputedStyle ) {
+ ret = document.defaultView.getComputedStyle( elem, null ).getPropertyValue( prop )
+ } else if ( elem.currentStyle ) {
+ // for IE
+ ret = elem.currentStyle[ prop ]
+ }
+ return ret
+ }
+
+ return {
+ columnwidth: testCSSProp( 'columnWidth' ),
+
+ fontface: (function() {
+ var ret
+
+ injectElementWithStyle(
+ '@font-face { font-family: font; src: url("//"); }',
+ function( node, rule ) {
+ var style = $.qsa( 'style', node )[0]
+ var sheet = style.sheet || style.styleSheet
+ var cssText = sheet ?
+ ( sheet.cssRules && sheet.cssRules[0] ?
+ sheet.cssRules[0].cssText : sheet.cssText || ''
+ ) : ''
+
+ ret = /src/i.test( cssText ) &&
+ cssText.indexOf( rule.split(' ')[0] ) === 0
+ }
+ )
+
+ return ret
+ })(),
+
+ ruby: (function() {
+ var ruby = $.create( 'ruby' )
+ var rt = $.create( 'rt' )
+ var rp = $.create( 'rp' )
+ var ret
+
+ ruby.appendChild( rp )
+ ruby.appendChild( rt )
+ root.appendChild( ruby )
+
+ // Browsers that support ruby hide the `