Repository: iissnan/hexo-theme-next Branch: master Commit: 9c8cea69bf0d Files: 273 Total size: 919.8 KB Directory structure: gitextract_e71ipyj3/ ├── .bowerrc ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── CONTRIBUTING.md │ ├── ISSUE_TEMPLATE.md │ └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── .hound.yml ├── .javascript_ignore ├── .jshintrc ├── .stylintrc ├── .travis.yml ├── LICENSE ├── README.cn.md ├── README.md ├── _config.yml ├── bower.json ├── gulpfile.coffee ├── languages/ │ ├── de.yml │ ├── default.yml │ ├── en.yml │ ├── fr-FR.yml │ ├── id.yml │ ├── it.yml │ ├── ja.yml │ ├── ko.yml │ ├── nl-NL.yml │ ├── pt-BR.yml │ ├── pt.yml │ ├── ru.yml │ ├── vi.yml │ ├── zh-Hans.yml │ ├── zh-hk.yml │ └── zh-tw.yml ├── layout/ │ ├── _custom/ │ │ ├── header.swig │ │ └── sidebar.swig │ ├── _layout.swig │ ├── _macro/ │ │ ├── post-collapse.swig │ │ ├── post-copyright.swig │ │ ├── post.swig │ │ ├── reward.swig │ │ ├── sidebar.swig │ │ └── wechat-subscriber.swig │ ├── _partials/ │ │ ├── comments.swig │ │ ├── footer.swig │ │ ├── head/ │ │ │ ├── custom-head.swig │ │ │ └── external-fonts.swig │ │ ├── head.swig │ │ ├── header.swig │ │ ├── page-header.swig │ │ ├── pagination.swig │ │ ├── search/ │ │ │ ├── localsearch.swig │ │ │ ├── swiftype.swig │ │ │ └── tinysou.swig │ │ ├── search.swig │ │ └── share/ │ │ ├── add-this.swig │ │ ├── baidushare.swig │ │ ├── duoshuo_share.swig │ │ └── jiathis.swig │ ├── _scripts/ │ │ ├── boostrap.swig │ │ ├── commons.swig │ │ ├── pages/ │ │ │ └── post-details.swig │ │ ├── schemes/ │ │ │ ├── gemini.swig │ │ │ ├── mist.swig │ │ │ ├── muse.swig │ │ │ └── pisces.swig │ │ └── vendors.swig │ ├── _third-party/ │ │ ├── analytics/ │ │ │ ├── analytics-with-widget.swig │ │ │ ├── application-insights.swig │ │ │ ├── baidu-analytics.swig │ │ │ ├── busuanzi-counter.swig │ │ │ ├── cnzz-analytics.swig │ │ │ ├── facebook-sdk.swig │ │ │ ├── firestore.swig │ │ │ ├── google-analytics.swig │ │ │ ├── index.swig │ │ │ ├── lean-analytics.swig │ │ │ ├── tencent-analytics.swig │ │ │ ├── tencent-mta.swig │ │ │ └── vkontakte-api.swig │ │ ├── comments/ │ │ │ ├── changyan.swig │ │ │ ├── disqus.swig │ │ │ ├── duoshuo.swig │ │ │ ├── gitment.swig │ │ │ ├── hypercomments.swig │ │ │ ├── index.swig │ │ │ ├── livere.swig │ │ │ ├── valine.swig │ │ │ └── youyan.swig │ │ ├── duoshuo-hot-articles.swig │ │ ├── exturl.swig │ │ ├── mathjax.swig │ │ ├── needsharebutton.swig │ │ ├── rating.swig │ │ ├── schedule.swig │ │ ├── scroll-cookie.swig │ │ ├── search/ │ │ │ ├── algolia-search/ │ │ │ │ ├── assets.swig │ │ │ │ └── dom.swig │ │ │ ├── index.swig │ │ │ ├── localsearch.swig │ │ │ └── tinysou.swig │ │ └── seo/ │ │ └── baidu-push.swig │ ├── archive.swig │ ├── category.swig │ ├── index.swig │ ├── page.swig │ ├── post.swig │ ├── schedule.swig │ └── tag.swig ├── package.json ├── scripts/ │ ├── merge-configs.js │ ├── merge.js │ └── tags/ │ ├── button.js │ ├── center-quote.js │ ├── exturl.js │ ├── full-image.js │ ├── group-pictures.js │ ├── label.js │ ├── lazy-image.js │ ├── note.js │ └── tabs.js ├── source/ │ ├── css/ │ │ ├── _common/ │ │ │ ├── components/ │ │ │ │ ├── back-to-top-sidebar.styl │ │ │ │ ├── back-to-top.styl │ │ │ │ ├── buttons.styl │ │ │ │ ├── comments.styl │ │ │ │ ├── components.styl │ │ │ │ ├── footer/ │ │ │ │ │ └── footer.styl │ │ │ │ ├── header/ │ │ │ │ │ ├── header.styl │ │ │ │ │ ├── headerband.styl │ │ │ │ │ ├── menu.styl │ │ │ │ │ ├── site-meta.styl │ │ │ │ │ └── site-nav.styl │ │ │ │ ├── highlight/ │ │ │ │ │ ├── diff.styl │ │ │ │ │ ├── highlight.styl │ │ │ │ │ └── theme.styl │ │ │ │ ├── pages/ │ │ │ │ │ ├── archive.styl │ │ │ │ │ ├── categories.styl │ │ │ │ │ ├── pages.styl │ │ │ │ │ ├── post-detail.styl │ │ │ │ │ └── schedule.styl │ │ │ │ ├── pagination.styl │ │ │ │ ├── post/ │ │ │ │ │ ├── post-button.styl │ │ │ │ │ ├── post-collapse.styl │ │ │ │ │ ├── post-copyright.styl │ │ │ │ │ ├── post-eof.styl │ │ │ │ │ ├── post-expand.styl │ │ │ │ │ ├── post-gallery.styl │ │ │ │ │ ├── post-meta.styl │ │ │ │ │ ├── post-nav.styl │ │ │ │ │ ├── post-reward.styl │ │ │ │ │ ├── post-rtl.styl │ │ │ │ │ ├── post-tags.styl │ │ │ │ │ ├── post-title.styl │ │ │ │ │ ├── post-type.styl │ │ │ │ │ ├── post-widgets.styl │ │ │ │ │ └── post.styl │ │ │ │ ├── sidebar/ │ │ │ │ │ ├── sidebar-author-links.styl │ │ │ │ │ ├── sidebar-author.styl │ │ │ │ │ ├── sidebar-blogroll.styl │ │ │ │ │ ├── sidebar-dimmer.styl │ │ │ │ │ ├── sidebar-feed-link.styl │ │ │ │ │ ├── sidebar-nav.styl │ │ │ │ │ ├── sidebar-toc.styl │ │ │ │ │ ├── sidebar-toggle.styl │ │ │ │ │ ├── sidebar.styl │ │ │ │ │ └── site-state.styl │ │ │ │ ├── tag-cloud.styl │ │ │ │ ├── tags/ │ │ │ │ │ ├── blockquote-center.styl │ │ │ │ │ ├── exturl.styl │ │ │ │ │ ├── full-image.styl │ │ │ │ │ ├── group-pictures.styl │ │ │ │ │ ├── label.styl │ │ │ │ │ ├── note-modern.styl │ │ │ │ │ ├── note.styl │ │ │ │ │ ├── tabs.styl │ │ │ │ │ └── tags.styl │ │ │ │ └── third-party/ │ │ │ │ ├── algolia-search.styl │ │ │ │ ├── baidushare.styl │ │ │ │ ├── busuanzi-counter.styl │ │ │ │ ├── duoshuo.styl │ │ │ │ ├── gitment.styl │ │ │ │ ├── han.styl │ │ │ │ ├── jiathis.styl │ │ │ │ ├── localsearch.styl │ │ │ │ ├── needsharebutton.styl │ │ │ │ └── third-party.styl │ │ │ ├── outline/ │ │ │ │ └── outline.styl │ │ │ └── scaffolding/ │ │ │ ├── base.styl │ │ │ ├── helpers.styl │ │ │ ├── mobile.styl │ │ │ ├── normalize.styl │ │ │ ├── scaffolding.styl │ │ │ └── tables.styl │ │ ├── _custom/ │ │ │ └── custom.styl │ │ ├── _mixins/ │ │ │ ├── Gemini.styl │ │ │ ├── Mist.styl │ │ │ ├── Muse.styl │ │ │ ├── Pisces.styl │ │ │ ├── base.styl │ │ │ └── custom.styl │ │ ├── _schemes/ │ │ │ ├── Gemini/ │ │ │ │ └── index.styl │ │ │ ├── Mist/ │ │ │ │ ├── _base.styl │ │ │ │ ├── _header.styl │ │ │ │ ├── _logo.styl │ │ │ │ ├── _menu.styl │ │ │ │ ├── _posts-expanded.styl │ │ │ │ ├── _search.styl │ │ │ │ ├── index.styl │ │ │ │ ├── outline/ │ │ │ │ │ └── outline.styl │ │ │ │ └── sidebar/ │ │ │ │ └── sidebar-blogroll.styl │ │ │ ├── Muse/ │ │ │ │ ├── _layout.styl │ │ │ │ ├── _logo.styl │ │ │ │ ├── _menu.styl │ │ │ │ ├── _search.styl │ │ │ │ ├── index.styl │ │ │ │ └── sidebar/ │ │ │ │ └── sidebar-blogroll.styl │ │ │ └── Pisces/ │ │ │ ├── _brand.styl │ │ │ ├── _layout.styl │ │ │ ├── _menu.styl │ │ │ ├── _posts.styl │ │ │ ├── _sidebar.styl │ │ │ └── index.styl │ │ ├── _variables/ │ │ │ ├── Gemini.styl │ │ │ ├── Mist.styl │ │ │ ├── Muse.styl │ │ │ ├── Pisces.styl │ │ │ ├── base.styl │ │ │ └── custom.styl │ │ └── main.styl │ ├── fonts/ │ │ └── .gitkeep │ ├── js/ │ │ └── src/ │ │ ├── affix.js │ │ ├── algolia-search.js │ │ ├── bootstrap.js │ │ ├── exturl.js │ │ ├── hook-duoshuo.js │ │ ├── js.cookie.js │ │ ├── motion.js │ │ ├── post-details.js │ │ ├── schemes/ │ │ │ └── pisces.js │ │ ├── scroll-cookie.js │ │ ├── scrollspy.js │ │ └── utils.js │ └── lib/ │ ├── canvas-ribbon/ │ │ └── canvas-ribbon.js │ ├── fastclick/ │ │ ├── .bower.json │ │ ├── LICENSE │ │ ├── README.md │ │ ├── bower.json │ │ └── lib/ │ │ └── fastclick.js │ ├── font-awesome/ │ │ ├── .bower.json │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── HELP-US-OUT.txt │ │ ├── bower.json │ │ ├── css/ │ │ │ └── font-awesome.css │ │ └── fonts/ │ │ └── FontAwesome.otf │ ├── jquery/ │ │ ├── .bower.json │ │ └── index.js │ ├── jquery_lazyload/ │ │ ├── .bower.json │ │ ├── CONTRIBUTING.md │ │ ├── README.md │ │ ├── bower.json │ │ ├── jquery.lazyload.js │ │ └── jquery.scrollstop.js │ ├── needsharebutton/ │ │ ├── font-embedded.css │ │ ├── needsharebutton.css │ │ └── needsharebutton.js │ └── velocity/ │ ├── .bower.json │ ├── bower.json │ ├── velocity.js │ └── velocity.ui.js └── test/ ├── .jshintrc ├── helpers.js └── intern.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .bowerrc ================================================ { "directory": "source/lib" } ================================================ FILE: .editorconfig ================================================ # editorconfig.org root = true [*] charset = utf-8 end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true indent_style = space indent_size = 2 [*.py] indent_size = 4 ================================================ FILE: .gitattributes ================================================ source/lib/* linguist-vendored scripts/merge.js linguist-vendored ================================================ FILE: .github/CONTRIBUTING.md ================================================ Before submitting an issue, please search for the issue [here](https://github.com/iissnan/hexo-theme-next/issues?utf8=%E2%9C%93&q=) to find if the issue is already reported. Also, you can search for answers on the [NexT Documentation Site](http://theme-next.iissnan.com/): - [常见问题 - 中文文档](http://theme-next.iissnan.com/faqs.html) - FAQs (Work in progress) ================================================ FILE: .github/ISSUE_TEMPLATE.md ================================================ THIS REPO IS NOT SUPPORTED ANYMORE! DON'T NEED CREATE ISSUE HERE! NEXT MOVED HERE: https://github.com/theme-next/hexo-theme-next NexT is rebased into organization repo https://github.com/theme-next If you want new feature, fix, or support, create new issue in NexT v6.x repo (desirable in English). There is instructions on English: https://github.com/theme-next/hexo-theme-next/blob/master/docs/UPDATE-FROM-5.1.X.md or Chinese: https://github.com/theme-next/hexo-theme-next/blob/master/docs/zh-CN/UPDATE-FROM-5.1.X.md how to update from v5.1.x to v 6.x You also may read this for details: https://github.com/iissnan/hexo-theme-next/issues/2061 *** 该工程已不再提供任何支持与维护! 请大家不要再在这里创建issue了! NexT主题仓库已移动到此处: https://github.com/theme-next/hexo-theme-next NexT已经rebase到theme-next组织(https://github.com/theme-next) 的repo中. 如果你想要求新的特性,bug修复或其他支持,请在新的v6.x的仓库下创建新issue(最好用英文,谢谢) 英文文档: (https://github.com/theme-next/hexo-theme-next/blob/master/docs/UPDATE-FROM-5.1.X.md) 或中文文档: (https://github.com/theme-next/hexo-theme-next/blob/master/docs/zh-CN/UPDATE-FROM-5.1.X.md) 如何从 v5.1.x 更新到 v 6.x 相关细节参考这里: https://github.com/iissnan/hexo-theme-next/issues/2061 ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ ## PR Checklist **Please check if your PR fulfills the following requirements:** - [ ] The commit message follows [our guidelines](https://github.com/iissnan/hexo-theme-next/blob/master/.github/CONTRIBUTING.md). - [ ] Tests for the changes have been added (for bug fixes / features). - [ ] Muse | Mist have been tested. - [ ] Pisces | Gemini have been tested. - [ ] Docs have been added / updated (for bug fixes / features). ## PR Type **What kind of change does this PR introduce?** - [ ] Bugfix. - [ ] Feature. - [ ] Code style update (formatting, local variables). - [ ] Refactoring (no functional changes, no api changes). - [ ] Build related changes. - [ ] CI related changes. - [ ] Documentation content changes. - [ ] Other... Please describe: ## What is the current behavior? Issue Number(s): N/A ## What is the new behavior? Description about this pull, in several words... * Screens with this changes: N/A * Link to demo site with this changes: N/A ### How to use? In NexT `_config.yml`: ```yml ... ``` ## Does this PR introduce a breaking change? - [ ] Yes. - [ ] No. ================================================ FILE: .gitignore ================================================ .DS_Store .idea/ *.log *.iml yarn.lock package-lock.json node_modules/ # Ignore unused verdors' files source/lib/fancybox/* !source/lib/fancybox/source/ source/lib/font-awesome/less/ source/lib/font-awesome/scss/ source/lib/ua-parser-js/* !source/lib/ua-parser-js/dist/ source/lib/Han/* !source/lib/Han/dist/ ================================================ FILE: .hound.yml ================================================ javascript: enabled: true config_file: .jshintrc ignore_file: .javascript_ignore ================================================ FILE: .javascript_ignore ================================================ source/vendors/* source/lib/* source/js/src/affix.js source/js/src/scrollspy.js source/js/src/js.cookie.js ================================================ FILE: .jshintrc ================================================ { "asi": false, "bitwise": true, "browser": true, "camelcase": true, "curly": true, "forin": true, "immed": true, "latedef": "nofunc", "maxlen": 120, "newcap": true, "noarg": true, "noempty": true, "nonew": true, "predef": [ "$", "jQuery", "NexT", "CONFIG" ], "quotmark": true, "trailing": true, "undef": true, "unused": true, "expr": true } ================================================ FILE: .stylintrc ================================================ { "blocks": false, "brackets": "always", "colons": "always", "colors": "always", "commaSpace": "always", "commentSpace": "always", "cssLiteral": "never", "customProperties": [], "depthLimit": false, "duplicates": true, "efficient": "always", "exclude": [], "extendPref": false, "globalDupe": false, "groupOutputByFile": true, "indentPref": false, "leadingZero": "never", "maxErrors": false, "maxWarnings": false, "mixed": false, "mixins": [], "namingConvention": "lowercase-dash", "namingConventionStrict": false, "none": "never", "noImportant": true, "parenSpace": false, "placeholders": "always", "prefixVarsWithDollar": "always", "quotePref": false, "reporterOptions": { "columns": ["lineData", "severity", "description", "rule"], "columnSplitter": " ", "showHeaders": false, "truncate": true }, "semicolons": "always", "sortOrder": "grouped", "stackedProperties": false, "trailingWhitespace": "never", "universal": false, "valid": true, "zeroUnits": "never", "zIndexNormalize": false } ================================================ FILE: .travis.yml ================================================ language: node_js node_js: node cache: directories: - node_modules install: npm install before_script: - npm install -g gulp addons: browserstack: username: "ivannginx1" access_key: secure: "NutOhdgtUdBUXMPZhy8X1F1Jq+tan1LeNOV0FArBt15SNlxtNArqhiyTi4XnG9MPruX4306aGF2RBrKso+OiGNRdGtRGngH613Q0GWNtlC/boMqnI7fHqLIyCs6S12y2uA8PK4Ifxg9bZ0VtCTYYbMy+p1KvBM//L12vmtfdnby8z5Qvex3tB3dLoPOR50CKkINHJVDLm+iVRFrdz4/83oDsulZSRRGIaxu5taDWPIcp3fYZtre2Nc+RXcsyFDyjN7U0Hvr5tKBbloJxXEQEBv2xLkMOtp85nmCPD06s1Il8Wus1ux3raVsfUyaW5FpNX37Jeb5e00RQUM1wgU5m75H6qiGwDvQswbugJG0i/a2nNfsgVmbrSZdMnkHcx2Uxmrw4ejyEP5NSrJSBi05Ck1fQ4UsZ4Qkdf1fd04SI0LpLWt43eoNO/7rHKsQoP4LCX9gxKUuC075NEBLODyJ529RYfA6dKKwwH6o0ZbOgASmCoAWaM65g4+FHRnJcKL/Kj9ZWklQtRa7/ynlHaA65jefFS2lB8Ut6d3rXDDBih9mIrwV1uUaEH96xgAN42bgU/vY6FGzNkDOYZqj4YfsepDM0wbOsslFie7JZq7iFjsYvrXqLvYUMk37AZwQ2Sb6uH4tIT4Qw/4oZfDzA1En3/8HdZJ28nKW/lzjwMSqheIY=" ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2014-2017 iissnan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.cn.md ================================================

本项目已停止维护。:warning:

社区维护的版本请移步这里:NexT v6 and v7 :triangular_flag_on_post:

NexT

NexT 是一个高质量并且优雅的Hexo 主题。这是精心制作做出来的 hexo 主题。

[![Join the chat at https://gitter.im/iissnan/hexo-theme-next](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/iissnan/hexo-theme-next?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![mnt-image]][commits-url] [![travis-image]][travis-url] [![rel-image]][releases-url] [![hexo-image]][hexo-url] [![lic-image]](LICENSE) * NexT 使用文档 | [English Documentation](README.md) ## 实时预览 Live Preview * :heart_decoration: Muse 方案: [LEAFERx](https://leaferx.online) | [XiaMo](https://notes.wanghao.work) | [OAwan](https://oawan.me) * :six_pointed_star: Mist 方案: [Jeff](https://blog.zzbd.org) | [uchuhimo](http://uchuhimo.me) | [xirong](http://www.ixirong.com) * :pisces: Pisces 方案: [Vi](http://notes.iissnan.com) | [Acris](https://acris.me) | [Rainy](https://rainylog.com) * :gemini: Gemini 方案: [Ivan.Nginx](https://almostover.ru) | [Raincal](https://raincal.com) | [Dandy](https://dandyxu.me) 更多 NexT 例子点击 [这里](https://github.com/iissnan/hexo-theme-next/issues/119). ## 安装 Installation **1.** 在终端切换到**hexo 根**目录. 在hexo目录下一定有 `node_modules`, `source`, `themes` 和其他文件夹: ```sh $ cd hexo $ ls _config.yml node_modules package.json public scaffolds source themes ``` **2.** 从 github 上获取主题 。这里有几种方式来获取主题: ### 下载[最新发布的版本][releases-latest-url] Download tagged release version   在大多数情况下 **稳定**。 推荐用户下载这个。 [![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 ``` ### 下载[标签发布版本][releases-url] Download tagged release version   您必须定义版本。从[标签列表][tags-url]里选择版本替换`v5.1.2`。 [![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 ``` ### 下载[最新的 master 分支][download-latest-url] Download latest master branch  可能会 **不稳定**, 但是包含最新的特色,推荐开发者下载. [![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 ``` 使用克隆命令,你将得到**整个存储库**。而且在任何时候你都可以切换到任何标签发布版本。 获取标签列表: ```sh $ cd themes/next $ git tag -l … v5.0.0 v5.0.1 v5.1.0 v5.1.1 v5.1.2 ```   例如, 你想要切换到`v5.1.0` [标签发布版本][tags-url]. 输入以下命令: ```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 ```   如果你想切换回 [master 分支][commits-url]的话, 输入这个命令: ```sh $ git checkout master ``` **3.** 在 **hexo 根目录下** 的配置文件`_config.yml`里设置主题: theme: next ### Bugs 对于那些遇到 **Error: Cannot find module 'hexo-util'** [问题](https://github.com/iissnan/hexo-theme-next/issues/1490)的人, 请检查你的NPM 版本. - `版本 > 3`: 如果仍然不行的话,请移除 `node_modules` 文件 然后重新安装,使用 `npm install`命令。 - `版本 < 3`: 请通过`npm install --save-dev hexo-util`命令添加`hexo-util`到你的站点包依赖里 ## 更新 Update ```sh $ cd themes/next $ git pull ``` ### Bugs > 提交您的更改或存储它们,然后才能合并。 您必须提交,存储或放弃本地更改. 看 [here](https://stackoverflow.com/a/15745424/5861495) 是如何做的。 ### 使用Hexo data files([#328](https://github.com/iissnan/hexo-theme-next/issues/328))配置主题 Theme configurations using Hexo data files #328 目前升级 NexT 主题的时候并不是非常的流畅。若使用 `git pull` 的方式,很多时候可能会产生冲突;而下载新版本覆盖安装的方式又需要手动合并主题的 `_config.yml` 文件。 在此修改之前, NexT 建议将配置分离,一部分在 站点的配置文件中,另外一部分在主题的配置文件中。将需要自定的选项放置在 站点配置文件中,从而脱离避免更新主题时可能遇到的麻烦。这种方式是可行,但是有一些缺点: 1. 配置分离成了两个部分 2. 用户可能会疑惑一些选项该放置在哪里比较合适 为了解决这个问题, NexT 将会使用 Hexo 的 [Data Files](https://hexo.io/docs/data-files.html) 。然而由于 Data Files 是在 Hexo 3 版本时引进的,所以要使用这个特性,需要 Hexo 的版本不低于 3。 若你比较喜欢 Hexo 2.x 版本,可以继续使用原先的配置方式。 NexT 保持着向下兼容。 #### 特性 Benefits 通过这个特性,你可以将所有的主题配置放置在站点的 `source/_data/next.yml` 文件中。原先放置在 站点配置文件 中的选项可以迁移到新的位置,同时,主题配置文件可以不用做任何修改。若后续版本有配置相关的改动时,你仅需在 `next.yml` 中做相应调整即可 #### 如何使用这个特性 How to use this feature 1. 请先确保你所使用的 Hexo 版本在 3 以上 2. 在站点的 `source/_data` 目录下新建 `next.yml` 文件(`_data`目录可能需要新建) 3. 迁移站点配置文件和主题配置文件中的配置到 `next.yml` 中 4. 使用 `--config source/_data/next.yml` 参数启动服务器, 生成或者部署。\   例如: `hexo clean --config source/_data/next.yml && hexo g --config source/_data/next.yml`。 ## 特色 Features ### 支持多国语言, 包括: :cn: 简体中文 & 繁体中文
:us: 英语
:ru: 俄语
:fr: 法语
:de: 德语
:jp: 日语
:indonesia: 印度尼西亚语
:portugal: 葡萄牙语 (巴西)
:kr: 朝鲜语
:it: 意大利语
:netherlands: 荷兰语 默认语言是英语。 ```yml language: en # language: zh-Hans # language: zh-hk # language: zh-tw # language: ru # language: fr-FR # language: de # language: ja # language: id # language: pt # language: pt-BR # language: ko # language: it # language: nl-NL ``` 在站点配置文件`_config.yml`中可以将语言切换成中文 ```yml language: zh-Hans ``` ### 评论支持 Comment support NexT 已经原生支持 `多说` and `Disqus` 评论系统。 添加以下代码到你的主题配置文件 `_config.yml`: ```yml duoshuo: enable: true shortname: your-duoshuo-shortname ``` 或者 ```yml disqus_shortname: your-disqus-shortname ``` ### 标签页 Tags page > 添加一个标签页面,里面包含您网站中的所有标签。 - 创建一个名为 `tags` 页面 hexo new page "tags" - 编辑标签页, 设置页面类型为`tags`. title: All tags date: 2014-12-22 12:39:04 type: "tags" - 添加 `tags` 到主题配置文件 `_config.yml` 里: menu: home: / archives: /archives tags: /tags ### 分类页 Categories page > 添加一个分类页面,里面包含您网站中的所有分类。 - 创建一个名为 `categories` 页面 hexo new page "categories" - 编辑分类页, 设置页面类型为 `categories`. title: All categories date: 2014-12-22 12:39:04 type: "categories" - 添加 `categories` 到主题配置文件 `_config.yml` 里: menu: home: / archives: /archives categories: /categories ### 社交媒体 Social Media NexT 可以自动添加链接到您的社交媒体帐户里: ```yml social: GitHub: your-github-url Twitter: your-twitter-url Weibo: your-weibo-url DouBan: your-douban-url ZhiHu: your-zhihu-url ``` ### Feed 链接 Feed link > 显示 feed 链接。 在主题配置文件`_config.yml`里设置`rss` , 如下所示: 1. `rss: false` 会禁用 feed 链接。 2. `rss: ` 使用站点 feed 链接。这是默认的选项。    按照插件[hexo-generator-feed](https://github.com/hexojs/hexo-generator-feed)的README中的安装说明进行操作。在完成这个插件的配置后,Feed链接也生成好了 3. `rss: http://your-feed-url` 设置你的 feed 链接. ### 内置5种代码高亮主题 Up to 5 code highlight themes built-in NexT 使用的是 [Tomorrow 主题](https://github.com/chriskempson/tomorrow-theme) ,一共有5种主题供你选择。 Next 默认使用 `normal`. 下面是 `normal` 和 `night` 主题的预览: ![Tomorrow Normal Preview](http://iissnan.com/nexus/next/tomorrow-normal.png) ![Tomorrow Night Preview](http://iissnan.com/nexus/next/tomorrow-night.png) 查看更多信息点击[Tomorrow 主题](https://github.com/chriskempson/tomorrow-theme)。 ## 配置 Configuration NexT 的配置很少 ```yml # Menu configuration. menu: home: / archives: /archives # Favicon favicon: /favicon.ico # Avatar (put the image into next/source/images/) # can be any image format supported by web browsers (JPEG,PNG,GIF,SVG,..) avatar: /default_avatar.png # Code highlight theme # available: normal | night | night eighties | night blue | night bright highlight_theme: normal # Fancybox for image gallery fancybox: true # Specify the date when the site was setup since: 2013 ``` ## 浏览器支持 Browser support ![Browser support](http://iissnan.com/nexus/next/browser-support.png) [![Browser Stack](.github/browserstack_logo.png)](https://www.browserstack.com/) >**BrowserStack** is a cloud-based cross-browser testing tool that enables developers to test their websites across various browsers on different operating systems and mobile devices, without requiring users to install virtual machines, devices or emulators. ## 贡献 Contributing 接受各种形式的贡献,包括不限于提交问题与需求,修复代码。等待您的`Pull Request`。 Any types of contribution are welcome. Thanks. **ATTENTION! Contributors on Chinese docs needed!**\ Need to translate from [English docs](README.md) to Chinese docs.\ Any help wanted!\ Thank's a lot! ## 开发 Development NexT 主旨在于简洁优雅且易于使用,所以首先要尽量确保 NexT 的简洁易用性。 NexT is built for easily use with elegant appearance. First things first, always keep things simple. ## [开发历史 Changelog](https://github.com/iissnan/hexo-theme-next/wiki/Changelog) [browser-image]: https://img.shields.io/badge/browser-%20chrome%20%7C%20firefox%20%7C%20opera%20%7C%20safari%20%7C%20ie%20%3E%3D%209-lightgrey.svg [browser-url]: https://www.browserstack.com [gitter-image]: https://badges.gitter.im/Join%20Chat.svg [gitter-url]: https://gitter.im/iissnan/hexo-theme-next?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge [travis-image]: https://travis-ci.org/iissnan/hexo-theme-next.svg?branch=master [travis-url]: https://travis-ci.org/iissnan/hexo-theme-next?branch=master "Travis CI" [hexo-image]: https://img.shields.io/badge/hexo-%3E%3D%203.0-blue.svg [hexo-url]: http://hexo.io [mnt-image]: https://img.shields.io/maintenance/yes/2017.svg [rel-image]: https://img.shields.io/github/release/iissnan/hexo-theme-next.svg [lic-image]: https://img.shields.io/dub/l/vibe-d.svg [git-image]: https://img.shields.io/badge/install%20with%20-git-blue.svg [curl-tar-image]: https://img.shields.io/badge/install%20with%20-curl%20%7C%20tar-blue.svg [curl-tar-wget-image]: https://img.shields.io/badge/install%20with%20-curl%20%7C%20tar%20%7C%20wget-blue.svg [git-url]: http://lmgtfy.com/?q=linux+git+install [curl-tar-url]: http://lmgtfy.com/?q=linux+curl+tar+install [curl-tar-wget-url]: http://lmgtfy.com/?q=linux+curl+tar+wget+install [download-latest-url]: https://github.com/iissnan/hexo-theme-next/archive/master.zip [releases-latest-url]: https://github.com/iissnan/hexo-theme-next/releases/latest [releases-url]: https://github.com/iissnan/hexo-theme-next/releases [tags-url]: https://github.com/iissnan/hexo-theme-next/tags [commits-url]: https://github.com/iissnan/hexo-theme-next/commits/master ================================================ FILE: README.md ================================================

This repository is no longer maintained! :warning:

The community-maintained version is here: NexT v6 and v7 :triangular_flag_on_post:

NexT

NexT is a high quality elegant Hexo theme. It is crafted from scratch, with love.

[![gitter-image]][gitter-url] [![mnt-image]](https://github.com/theme-next/hexo-theme-next) [![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: [LEAFERx](https://leaferx.online) | [XiaMo](https://notes.wanghao.work) | [OAwan](https://oawan.me) * :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://acris.me) | [Rainy](https://rainylog.com) * :gemini: Gemini scheme: [Ivan.Nginx](https://almostover.ru) | [Raincal](https://raincal.com) | [Dandy](https://dandyxu.me) 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.
:us: English
:ru: Russian
:fr: French
:de: German
:jp: Japanese
:indonesia: Indonesian
:portugal: Portuguese (Brazil)
:kr: Korean
:it: Italian
:netherlands: Dutch
:vietnam: Vietnamese Default language is English. ```yml language: en # language: zh-Hans # language: zh-hk # language: zh-tw # language: ru # language: fr-FR # language: de # language: ja # language: id # language: pt # language: pt-BR # language: ko # language: it # language: nl-NL # language: vi ``` Set `language` field as following in site `_config.yml` to change to Chinese. ```yml language: zh-Hans ``` ### Comment support. NexT has native support for `DuoShuo` and `Disqus` comment systems. Add the following snippets to your `_config.yml`: ```yml duoshuo: enable: true shortname: your-duoshuo-shortname ``` OR ```yml disqus_shortname: your-disqus-shortname ``` ### Tags page. > Add a tags page contains all tags in your site. - Create a page named `tags` hexo new page "tags" - Edit tags page, set page type to `tags`. title: All tags date: 2014-12-22 12:39:04 type: "tags" - Add `tags` to theme `_config.yml`: menu: home: / archives: /archives tags: /tags ### Categories page. > Add a categories page contains all categories in your site. - Create a page named `categories` hexo new page "categories" - Edit categories page, set page type to `categories`. title: All categories date: 2014-12-22 12:39:04 type: "categories" - Add `categories` to theme `_config.yml`: menu: home: / archives: /archives categories: /categories ### Social Media NexT can automatically add links to your Social Media accounts: ```yml social: GitHub: your-github-url Twitter: your-twitter-url Weibo: your-weibo-url DouBan: your-douban-url ZhiHu: your-zhihu-url ``` ### Feed link. > Show a feed link. Set `rss` field in theme's `_config.yml`, as the following value: 1. `rss: false` will totally disable feed link. 2. `rss: ` use sites' feed link. This is the default option. Follow the installation instruction in the plugin's README. After the configuration is done for this plugin, the feed link is ready too. 3. `rss: http://your-feed-url` set specific feed link. ### Up to 5 code highlight themes built-in. NexT uses [Tomorrow Theme](https://github.com/chriskempson/tomorrow-theme) with 5 themes for you to choose from. Next use `normal` by default. Have a preview about `normal` and `night`: ![Tomorrow Normal Preview](http://iissnan.com/nexus/next/tomorrow-normal.png) ![Tomorrow Night Preview](http://iissnan.com/nexus/next/tomorrow-night.png) Head over to [Tomorrow Theme](https://github.com/chriskempson/tomorrow-theme) for more details. ## Configuration NexT comes with few configurations. ```yml # Menu configuration. menu: home: / archives: /archives # Favicon favicon: /favicon.ico # Avatar (put the image into next/source/images/) # can be any image format supported by web browsers (JPEG,PNG,GIF,SVG,..) avatar: /default_avatar.png # Code highlight theme # available: normal | night | night eighties | night blue | night bright highlight_theme: normal # Fancybox for image gallery fancybox: true # Specify the date when the site was setup since: 2013 ``` ## Browser support ![browser-image] [![Browser Stack](.github/browserstack_logo.png)](https://www.browserstack.com/) >**BrowserStack** is a cloud-based cross-browser testing tool that enables developers to test their websites across various browsers on different operating systems and mobile devices, without requiring users to install virtual machines, devices or emulators. ## Contributing Contribution is welcome, feel free to open an issue and fork. Waiting for your pull request. [browser-image]: https://img.shields.io/badge/browser-%20chrome%20%7C%20firefox%20%7C%20opera%20%7C%20safari%20%7C%20ie%20%3E%3D%209-lightgrey.svg [browser-url]: https://www.browserstack.com [gitter-image]: https://badges.gitter.im/Join%20Chat.svg [gitter-url]: https://gitter.im/iissnan/hexo-theme-next?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge [travis-image]: https://travis-ci.org/iissnan/hexo-theme-next.svg?branch=master [travis-url]: https://travis-ci.org/iissnan/hexo-theme-next?branch=master "Travis CI" [hexo-image]: https://img.shields.io/badge/hexo-%3E%3D%203.0-blue.svg [hexo-url]: http://hexo.io [mnt-image]: https://img.shields.io/maintenance/yes/2017.svg [rel-image]: https://img.shields.io/github/release/iissnan/hexo-theme-next.svg [lic-image]: https://img.shields.io/dub/l/vibe-d.svg [git-image]: https://img.shields.io/badge/install%20with%20-git-blue.svg [curl-tar-image]: https://img.shields.io/badge/install%20with%20-curl%20%7C%20tar-blue.svg [curl-tar-wget-image]: https://img.shields.io/badge/install%20with%20-curl%20%7C%20tar%20%7C%20wget-blue.svg [git-url]: http://lmgtfy.com/?q=linux+git+install [curl-tar-url]: http://lmgtfy.com/?q=linux+curl+tar+install [curl-tar-wget-url]: http://lmgtfy.com/?q=linux+curl+tar+wget+install [download-latest-url]: https://github.com/iissnan/hexo-theme-next/archive/master.zip [releases-latest-url]: https://github.com/iissnan/hexo-theme-next/releases/latest [releases-url]: https://github.com/iissnan/hexo-theme-next/releases [tags-url]: https://github.com/iissnan/hexo-theme-next/tags [commits-url]: https://github.com/iissnan/hexo-theme-next/commits/master ================================================ FILE: _config.yml ================================================ # =============================================================== # ========================= ATTENTION! ========================== # =============================================================== # NexT repository is moving here: https://github.com/theme-next # =============================================================== # It's rebase to v6.0.0 and future maintenance will resume there # =============================================================== # --------------------------------------------------------------- # Theme Core Configuration Settings # --------------------------------------------------------------- # Set to true, if you want to fully override the default configuration. # Useful if you don't want to inherit the theme _config.yml configurations. override: false # --------------------------------------------------------------- # Site Information Settings # --------------------------------------------------------------- # To get or check favicons visit: https://realfavicongenerator.net # Put your favicons into `hexo-site/source/` (recommend) or `hexo-site/themes/next/source/images/` directory. # Default NexT favicons placed in `hexo-site/themes/next/source/images/` directory. # And if you want to place your icons in `hexo-site/source/` root directory, you must remove `/images` prefix from pathes. # For example, you put your favicons into `hexo-site/source/images` directory. # Then need to rename & redefine they on any other names, otherwise icons from Next will rewrite your custom icons in Hexo. favicon: small: /images/favicon-16x16-next.png medium: /images/favicon-32x32-next.png apple_touch_icon: /images/apple-touch-icon-next.png safari_pinned_tab: /images/logo.svg #android_manifest: /images/manifest.json #ms_browserconfig: /images/browserconfig.xml # Set default keywords (Use a comma to separate) keywords: "Hexo, NexT" # Set rss to false to disable feed link. # Leave rss as empty to use site's feed link. # Set rss to specific value if you have burned your feed already. rss: footer: # Specify the date when the site was setup. # If not defined, current year will be used. #since: 2015 # Icon between year and copyright info. icon: user # If not defined, will be used `author` from Hexo main config. copyright: # ------------------------------------------------------------- # Hexo link (Powered by Hexo). powered: true theme: # Theme & scheme info link (Theme - NexT.scheme). enable: true # Version info of NexT after scheme info (vX.X.X). version: true # ------------------------------------------------------------- # Any custom text can be defined here. #custom_text: Hosted by GitHub Pages # --------------------------------------------------------------- # SEO Settings # --------------------------------------------------------------- # Canonical, set a canonical link tag in your hexo, you could use it for your SEO of blog. # See: https://support.google.com/webmasters/answer/139066 # Tips: Before you open this tag, remember set up your URL in hexo _config.yml ( ex. url: http://yourdomain.com ) canonical: true # Change headers hierarchy on site-subtitle (will be main site description) and on all post/pages titles for better SEO-optimization. seo: false # If true, will add site-subtitle to index page, added in main hexo config. # subtitle: Subtitle index_with_subtitle: false # --------------------------------------------------------------- # Menu Settings # --------------------------------------------------------------- # When running the site in a subdirectory (e.g. domain.tld/blog), remove the leading slash from link value (/archives -> archives). # Usage: `Key: /link/ || icon` # Key is the name of menu item. If translate for this menu will find in languages - this translate will be loaded; if not - Key name will be used. Key is case-senstive. # Value before `||` delimeter is the target link. # Value after `||` delimeter is the name of FontAwesome icon. If icon (with or without delimeter) is not specified, question icon will be loaded. menu: home: / || home #about: /about/ || user #tags: /tags/ || tags #categories: /categories/ || th archives: /archives/ || archive #schedule: /schedule/ || calendar #sitemap: /sitemap.xml || sitemap #commonweal: /404/ || heartbeat # Enable/Disable menu icons. menu_icons: enable: true # --------------------------------------------------------------- # Scheme Settings # --------------------------------------------------------------- # Schemes scheme: Muse #scheme: Mist #scheme: Pisces #scheme: Gemini # --------------------------------------------------------------- # Sidebar Settings # --------------------------------------------------------------- # Social Links. # Usage: `Key: permalink || icon` # Key is the link label showing to end users. # Value before `||` delimeter is the target permalink. # Value after `||` delimeter is the name of FontAwesome icon. If icon (with or without delimeter) is not specified, globe icon will be loaded. #social: #GitHub: https://github.com/yourname || github #E-Mail: mailto:yourname@gmail.com || envelope #Google: https://plus.google.com/yourname || google #Twitter: https://twitter.com/yourname || twitter #FB Page: https://www.facebook.com/yourname || facebook #VK Group: https://vk.com/yourname || vk #StackOverflow: https://stackoverflow.com/yourname || stack-overflow #YouTube: https://youtube.com/yourname || youtube #Instagram: https://instagram.com/yourname || instagram #Skype: skype:yourname?call|chat || skype social_icons: enable: true icons_only: false transition: false # Blog rolls links_icon: link links_title: Links links_layout: block #links_layout: inline #links: #Title: http://example.com/ # Sidebar Avatar # in theme directory(source/images): /images/avatar.gif # in site directory(source/uploads): /uploads/avatar.gif #avatar: /images/avatar.gif # Table Of Contents in the Sidebar toc: enable: true # Automatically add list number to toc. number: true # If true, all words will placed on next lines if header width longer then sidebar width. wrap: false # Creative Commons 4.0 International License. # http://creativecommons.org/ # Available: by | by-nc | by-nc-nd | by-nc-sa | by-nd | by-sa | zero #creative_commons: by-nc-sa #creative_commons: sidebar: # Sidebar Position, available value: left | right (only for Pisces | Gemini). position: left #position: right # Sidebar Display, available value (only for Muse | Mist): # - post expand on posts automatically. Default. # - always expand for all pages automatically # - hide expand only when click on the sidebar toggle icon. # - remove Totally remove sidebar including sidebar toggle. display: post #display: always #display: hide #display: remove # Sidebar offset from top menubar in pixels (only for Pisces | Gemini). offset: 12 # Back to top in sidebar (only for Pisces | Gemini). b2t: false # Scroll percent label in b2t button. scrollpercent: false # Enable sidebar on narrow view (only for Muse | Mist). onmobile: false # --------------------------------------------------------------- # Post Settings # --------------------------------------------------------------- # Automatically scroll page to section which is under mark. scroll_to_more: true # Automatically saving scroll position on each post/page in cookies. save_scroll: false # Automatically excerpt description in homepage as preamble text. excerpt_description: true # Automatically Excerpt. Not recommend. # Please use in the post to control excerpt accurately. auto_excerpt: enable: false length: 150 # Post meta display settings post_meta: item_text: true created_at: true updated_at: false categories: true # Post wordcount display settings # Dependencies: https://github.com/willin/hexo-wordcount post_wordcount: item_text: true wordcount: false min2read: false totalcount: false separated_meta: true # Wechat Subscriber #wechat_subscriber: #enabled: true #qcode: /path/to/your/wechatqcode ex. /uploads/wechat-qcode.jpg #description: ex. subscribe to my blog by scanning my public wechat account # Reward #reward_comment: Donate comment here #wechatpay: /images/wechatpay.jpg #alipay: /images/alipay.jpg #bitcoin: /images/bitcoin.png # Declare license on posts post_copyright: enable: false license: CC BY-NC-SA 3.0 license_url: https://creativecommons.org/licenses/by-nc-sa/3.0/ # --------------------------------------------------------------- # Misc Theme Settings # --------------------------------------------------------------- # Reduce padding / margin indents on devices with narrow width. mobile_layout_economy: false # Android Chrome header panel color ($black-deep). android_chrome_color: "#222" # Custom Logo. # !!Only available for Default Scheme currently. # Options: # enabled: [true/false] - Replace with specific image # image: url-of-image - Images's url custom_logo: enabled: false image: # Code Highlight theme # Available value: # normal | night | night eighties | night blue | night bright # https://github.com/chriskempson/tomorrow-theme highlight_theme: normal # --------------------------------------------------------------- # Font Settings # - Find fonts on Google Fonts (https://www.google.com/fonts) # - All fonts set here will have the following styles: # light, light italic, normal, normal italic, bold, bold italic # - Be aware that setting too much fonts will cause site running slowly # - Introduce in 5.0.1 # --------------------------------------------------------------- # CAUTION! Safari Version 10.1.2 bug: https://github.com/iissnan/hexo-theme-next/issues/1844 # To avoid space between header and sidebar in Pisces / Gemini themes recommended to use Web Safe fonts for `global` (and `logo`): # Arial | Tahoma | Helvetica | Times New Roman | Courier New | Verdana | Georgia | Palatino | Garamond | Comic Sans MS | Trebuchet MS # --------------------------------------------------------------- font: enable: false # Uri of fonts host. E.g. //fonts.googleapis.com (Default). host: # Font options: # `external: true` will load this font family from `host` above. # `family: Times New Roman`. Without any quotes. # `size: xx`. Use `px` as unit. # Global font settings used on element. global: external: true family: Lato size: # Font settings for Headlines (h1, h2, h3, h4, h5, h6). # Fallback to `global` font settings. headings: external: true family: size: # Font settings for posts. # Fallback to `global` font settings. posts: external: true family: # Font settings for Logo. # Fallback to `global` font settings. logo: external: true family: size: # Font settings for and code blocks. codes: external: true family: size: # --------------------------------------------------------------- # 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://valine.js.org valine: enable: false appid: # your leancloud application appid appkey: # your leancloud application appkey notify: false # mail notifier , https://github.com/xCss/Valine/wiki verify: false # Verification code placeholder: Just go go # comment box placeholder avatar: mm # gravatar style guest_info: nick,mail,link # custom comment header pageSize: 10 # pagination size # 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 # Gitment # Introduction: https://imsun.net/posts/gitment-introduction/ # You can get your Github ID from https://api.github.com/users/ gitment: enable: false mint: true # RECOMMEND, A mint on Gitment, to support count, language and proxy_gateway count: true # Show comments count in post meta area lazy: false # Comments lazy loading with a button cleanly: false # Hide 'Powered by ...' on footer, and more language: # Force language, or auto switch by theme github_user: # MUST HAVE, Your Github ID github_repo: # MUST HAVE, The repo you use to store Gitment comments client_id: # MUST HAVE, Github client id for the Gitment client_secret: # EITHER this or proxy_gateway, Github access secret token for the Gitment proxy_gateway: # Address of api proxy, See: https://github.com/aimingoo/intersect redirect_protocol: # Protocol of redirect_uri with force_redirect_protocol when mint enabled # 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: false postbottom: enable: false options: iconStyle: box boxForm: horizontal position: bottomCenter networks: Weibo,Wechat,Douban,QQZone,Twitter,Facebook float: enable: false 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: false app_id: # app_key: # # Another tool to show number of visitors to each article. # visit https://console.firebase.google.com/u/0/ to get apiKey and projectId # visit https://firebase.google.com/docs/firestore/ to get more information about firestore firestore: enable: false collection: articles #required, a string collection name to access firestore database apiKey: #required projectId: #required bluebird: false #enable this if you want to include bluebird 3.5.1(core version) Promise polyfill # 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: false # 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: false # 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: false # 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: false # 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: false # three_waves three_waves: false # canvas_lines canvas_lines: false # canvas_sphere canvas_sphere: false # Only fit scheme Pisces # Canvas-ribbon # size: The width of the ribbon. # alpha: The transparency of the ribbon. # zIndex: The display level of the ribbon. canvas_ribbon: enable: false size: 300 alpha: 0.6 zIndex: -1 # 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: # needMoreShare2 # https://github.com/revir/need-more-share2 needMoreShare2: # Assets css: css js: js images: images # Theme version version: 5.1.4 ================================================ FILE: bower.json ================================================ { "name": "isn-next", "version": "5.1.4", "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" } } ================================================ FILE: gulpfile.coffee ================================================ 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'] ================================================ FILE: languages/de.yml ================================================ 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 ================================================ FILE: languages/default.yml ================================================ 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 ================================================ FILE: languages/en.yml ================================================ 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 ================================================ FILE: languages/fr-FR.yml ================================================ 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 ================================================ FILE: languages/id.yml ================================================ 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 ================================================ FILE: languages/it.yml ================================================ 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 ================================================ FILE: languages/ja.yml ================================================ 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 ================================================ FILE: languages/ko.yml ================================================ 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 ================================================ FILE: languages/nl-NL.yml ================================================ 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 ================================================ FILE: languages/pt-BR.yml ================================================ 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 ================================================ FILE: languages/pt.yml ================================================ 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 ================================================ FILE: languages/ru.yml ================================================ 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 ================================================ FILE: languages/vi.yml ================================================ title: archive: Lưu Trữ category: Phân Loại tag: Thẻ schedule: Danh Mục author: Tác giả menu: home: Trang Chủ archives: Lưu Trữ categories: Đầu Mục tags: Thẻ about: Giới Thiệu search: Tìm Kiếm schedule: Danh Mục sitemap: Bản đồ trang commonweal: Commonweal 404 sidebar: overview: Tổng Quan toc: Mục Lục post: created: Được tạo modified: Được thay đổi sticky: Đính posted: Tạo lúc in: Trong more: thêm read_more: Đọc tiếp untitled: Không có tiêu đề toc_empty: Bài viết này không có mục lục visitors: Người xem wordcount: Số từ trong bài viết min2read: Thời gian đọc totalcount: Số từ trong trang copyright: author: Người viết link: Liên kết bài viết license_title: Chú ý bản quyền license_content: 'Tất cả bài viết trong blog này được đăng ký bởi %s trừ khi có thông báo bổ sung.' page: totally: Toàn bộ tags: thẻ footer: powered: "Cung cấp bởi %s" theme: Giao Diện counter: tag_cloud: zero: Không có thẻ nào one: có 1 thẻ tất cả other: "có %d thẻ tất cả" categories: zero: Không có trong mục nào one: có 1 mục tất cả other: "có %d mục tất cả" archive_posts: zero: Không có bài viết. one: 1 bài viết. other: "tổng số %d bài viết." state: posts: bài viết pages: trang tags: thẻ categories: mục search: placeholder: Đang tìm... cheers: um: Um.. ok: Đồng Ý nice: Hay good: Tốt great: Tuyệt vời excellent: Tuyệt cú mèo keep_on: Giữ tiến độ nha. symbol: comma: ', ' period: '. ' colon: ':' reward: donate: Tài trợ wechatpay: WeChat Pay alipay: Alipay bitcoin: Bitcoin gitmentbutton: Hiển thị bình luận từ Gitment ================================================ FILE: languages/zh-Hans.yml ================================================ 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: 本文作者 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 评论 ================================================ FILE: languages/zh-hk.yml ================================================ 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 評論 ================================================ FILE: languages/zh-tw.yml ================================================ 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 評論 ================================================ FILE: layout/_custom/header.swig ================================================ ================================================ FILE: layout/_custom/sidebar.swig ================================================ ================================================ FILE: layout/_layout.swig ================================================ {% 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 %}
{% 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/analytics/firestore.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' %} ================================================ FILE: layout/_macro/post-collapse.swig ================================================ {% macro render(post) %} {% endmacro %} ================================================ FILE: layout/_macro/post-copyright.swig ================================================
  • {{ __('post.copyright.author') + __('symbol.colon') }} {{ post.author | default(config.author) }}
  • {{ __('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) }}
================================================ FILE: layout/_macro/post.swig ================================================ {% 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 %} {% else %}{# #}{% if is_index %} {% if post.sticky > 0 %} {% endif %} {# #}{% else %}{{ post.title }}{% endif %}{# #}{% 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 }}
{{ __('post.read_more') }} »
{% elif post.excerpt %} {{ post.excerpt }}
{{ __('post.read_more') }} »
{% 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 %}
{{ __('post.read_more') }} »
{% 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 (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 post.tags and post.tags.length and not is_index %} {% endif %} {% if not is_index %} {% if theme.rating.enable or (theme.vkontakte_api.enable and theme.vkontakte_api.like) or (theme.facebook_sdk.enable and theme.facebook_sdk.like_button) or (theme.needmoreshare2.enable and theme.needmoreshare2.postbottom.enable) %}
{% if theme.rating.enable %}
{% endif %} {% if (theme.vkontakte_api.enable and theme.vkontakte_api.like) or (theme.facebook_sdk.enable and theme.facebook_sdk.like_button) %} {% endif %} {% if theme.needmoreshare2.enable and theme.needmoreshare2.postbottom.enable %} {% if (theme.vkontakte_api.enable and theme.vkontakte_api.like) or (theme.facebook_sdk.enable and theme.facebook_sdk.like_button) %} {% endif %}
{% endif %}
{% endif %} {% endif %} {% if not is_index and (post.prev or post.next) %}
{% if post.next %} {% endif %}
{% if post.prev %} {% endif %}
{% endif %} {% set isLast = loop.index % page.per_page === 0 %} {% if is_index and not isLast %}
{% endif %}
{######################} {### END POST BLOCK ###} {######################}
{% endmacro %} ================================================ FILE: layout/_macro/reward.swig ================================================
{{ theme.reward_comment }}
================================================ FILE: layout/_macro/sidebar.swig ================================================ {% macro render(is_post) %} {% endmacro %} ================================================ FILE: layout/_macro/wechat-subscriber.swig ================================================
{{ theme.author }} wechat
{{ theme.wechat_subscriber.description }}
================================================ FILE: layout/_partials/comments.swig ================================================ {% 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 %}
{{ __('gitmentbutton') }}
{% else %}
{% endif %}
{% elseif theme.valine.appid and theme.valine.appkey %}
{% endif %} {% endif %} ================================================ FILE: layout/_partials/footer.swig ================================================ {% 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 %} ================================================ FILE: layout/_partials/head/custom-head.swig ================================================ {# Custom head. #} ================================================ FILE: layout/_partials/head/external-fonts.swig ================================================ {% 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 %} ================================================ FILE: layout/_partials/head.swig ================================================ {% 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' %} ================================================ FILE: layout/_partials/header.swig ================================================
{% if theme.custom_logo.image and theme.scheme === 'Muse' %} {% endif %} {% if theme.seo %}

{{ config.subtitle }}

{% else %}

{{ config.subtitle }}

{% endif %}
{% include '../_custom/header.swig' %} ================================================ FILE: layout/_partials/page-header.swig ================================================
<{% if theme.seo %}h2{% else %}h1{% endif %} class="post-title" itemprop="name headline">{{ page.title }} {% if page.description %} {% endif %}
================================================ FILE: layout/_partials/pagination.swig ================================================ {% if page.prev or page.next %} {% endif %} ================================================ FILE: layout/_partials/search/localsearch.swig ================================================ ================================================ FILE: layout/_partials/search/swiftype.swig ================================================
================================================ FILE: layout/_partials/search/tinysou.swig ================================================
================================================ FILE: layout/_partials/search.swig ================================================ {% 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 %} ================================================ FILE: layout/_partials/share/add-this.swig ================================================
================================================ FILE: layout/_partials/share/baidushare.swig ================================================ {% if theme.baidushare.type === "button" %}
{% elseif theme.baidushare.type === "slide" %} {% endif %} ================================================ FILE: layout/_partials/share/duoshuo_share.swig ================================================ ================================================ FILE: layout/_partials/share/jiathis.swig ================================================ ================================================ FILE: layout/_scripts/boostrap.swig ================================================ {% set boot_scripts = [ 'src/bootstrap.js' ] %} {% for bs in boot_scripts %} {% endfor %} ================================================ FILE: layout/_scripts/commons.swig ================================================ {% set js_commons = [ 'src/utils.js', 'src/motion.js' ] %} {% for common in js_commons %} {% endfor %} ================================================ FILE: layout/_scripts/pages/post-details.swig ================================================ ================================================ FILE: layout/_scripts/schemes/gemini.swig ================================================ {% set scripts = [ 'src/affix.js', 'src/schemes/pisces.js' ] %} {% for script in scripts %} {% endfor %} ================================================ FILE: layout/_scripts/schemes/mist.swig ================================================ ================================================ FILE: layout/_scripts/schemes/muse.swig ================================================ ================================================ FILE: layout/_scripts/schemes/pisces.swig ================================================ {% set scripts = [ 'src/affix.js', 'src/schemes/pisces.js' ] %} {% for script in scripts %} {% endfor %} ================================================ FILE: layout/_scripts/vendors.swig ================================================ {# 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 %} ================================================ FILE: layout/_third-party/analytics/analytics-with-widget.swig ================================================ {% include 'busuanzi-counter.swig' %} {% include 'tencent-mta.swig' %} {% include 'tencent-analytics.swig' %} {% include 'cnzz-analytics.swig' %} ================================================ FILE: layout/_third-party/analytics/application-insights.swig ================================================ {% if theme.application_insights %} {% endif %} ================================================ FILE: layout/_third-party/analytics/baidu-analytics.swig ================================================ {% if theme.baidu_analytics %} {% endif %} ================================================ FILE: layout/_third-party/analytics/busuanzi-counter.swig ================================================ {% 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 %} ================================================ FILE: layout/_third-party/analytics/cnzz-analytics.swig ================================================ {% if theme.cnzz_siteid %}
{% endif %} ================================================ FILE: layout/_third-party/analytics/facebook-sdk.swig ================================================ {% if theme.facebook_sdk.enable %} {% endif %} ================================================ FILE: layout/_third-party/analytics/firestore.swig ================================================ {% if theme.firestore.enable %} {% if theme.firestore.bluebird %} {% endif %} {% endif %} ================================================ FILE: layout/_third-party/analytics/google-analytics.swig ================================================ {% if theme.google_analytics %} {% endif %} ================================================ FILE: layout/_third-party/analytics/index.swig ================================================ {% include 'facebook-sdk.swig' %} {% include 'vkontakte-api.swig' %} {% include 'google-analytics.swig' %} {% include 'baidu-analytics.swig' %} {% include 'application-insights.swig' %} ================================================ FILE: layout/_third-party/analytics/lean-analytics.swig ================================================ {% if theme.leancloud_visitors.enable %} {# custom analytics part create by xiamo #} {% endif %} ================================================ FILE: layout/_third-party/analytics/tencent-analytics.swig ================================================ {% if theme.tencent_analytics %} {% endif %} ================================================ FILE: layout/_third-party/analytics/tencent-mta.swig ================================================ {% if theme.tencent_mta %} {% endif %} ================================================ FILE: layout/_third-party/analytics/vkontakte-api.swig ================================================ {% if theme.vkontakte_api.enable %}
{% endif %} ================================================ FILE: layout/_third-party/comments/changyan.swig ================================================ {% if theme.changyan.enable and theme.changyan.appid and theme.changyan.appkey %} {% if is_home() %} {% else %} {% endif %} {% endif %} ================================================ FILE: layout/_third-party/comments/disqus.swig ================================================ {% 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 %} ================================================ FILE: layout/_third-party/comments/duoshuo.swig ================================================ {% 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 %} ================================================ FILE: layout/_third-party/comments/gitment.swig ================================================ {% 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 %} ================================================ FILE: layout/_third-party/comments/hypercomments.swig ================================================ {% if not (theme.duoshuo and theme.duoshuo.shortname) and not theme.duoshuo_shortname and not theme.disqus_shortname %} {% if theme.hypercomments_id %} {% endif %} {% endif %} ================================================ FILE: layout/_third-party/comments/index.swig ================================================ {% include 'duoshuo.swig' %} {% include 'disqus.swig' %} {% include 'hypercomments.swig' %} {% include 'youyan.swig' %} {% include 'livere.swig' %} {% include 'changyan.swig' %} {% include 'gitment.swig' %} {% include 'valine.swig' %} ================================================ FILE: layout/_third-party/comments/livere.swig ================================================ {% 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 %} ================================================ FILE: layout/_third-party/comments/valine.swig ================================================ {% if theme.valine.enable and theme.valine.appid and theme.valine.appkey %} {% endif %} ================================================ FILE: layout/_third-party/comments/youyan.swig ================================================ {% 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 %} ================================================ FILE: layout/_third-party/duoshuo-hot-articles.swig ================================================ {# 多说热评文章 #} {% if (theme.duoshuo_hotartical and page.title) %}

热评文章

{% endif %} ================================================ FILE: layout/_third-party/exturl.swig ================================================ {% if theme.exturl %} {% endif %} ================================================ FILE: layout/_third-party/mathjax.swig ================================================ {% if theme.mathjax.enable %} {% if not theme.mathjax.per_page or (page.total or page.mathjax) %} {% endif %} {% endif %} ================================================ FILE: layout/_third-party/needsharebutton.swig ================================================ {% 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 %} ================================================ FILE: layout/_third-party/rating.swig ================================================ {% if theme.rating.enable and (not is_home() and is_post()) %} {% endif %} ================================================ FILE: layout/_third-party/schedule.swig ================================================ {% if theme.calendar.enable %} {% if page.type == 'schedule' %} {% endif %} {% endif %} ================================================ FILE: layout/_third-party/scroll-cookie.swig ================================================ {% if theme.save_scroll %} {% endif %} ================================================ FILE: layout/_third-party/search/algolia-search/assets.swig ================================================ {% 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 %} ================================================ FILE: layout/_third-party/search/algolia-search/dom.swig ================================================ {% if theme.algolia_search.enable %} {% endif %} ================================================ FILE: layout/_third-party/search/index.swig ================================================ {% include 'tinysou.swig' %} {% include 'localsearch.swig' %} {% include 'algolia-search/assets.swig' %} ================================================ FILE: layout/_third-party/search/localsearch.swig ================================================ {% if theme.local_search.enable %} {% endif %} ================================================ FILE: layout/_third-party/search/tinysou.swig ================================================ {% if config.tinysou_Key %} {% endif %} ================================================ FILE: layout/_third-party/seo/baidu-push.swig ================================================ {% if theme.baidu_push %} {% endif %} ================================================ FILE: layout/archive.swig ================================================ {% 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 }}
{% endif %} {# endshow #} {{ post_template.render(post) }} {% endfor %}
{#########################} {### END ARCHIVE BLOCK ###} {#########################} {% include '_partials/pagination.swig' %} {% endblock %} {% block sidebar %} {{ sidebar_template.render(false) }} {% endblock %} ================================================ FILE: layout/category.swig ================================================ {% 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') }}
{% 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 %} ================================================ FILE: layout/index.swig ================================================ {% 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 %}
{% for post in page.posts %} {{ post_template.render(post, true) }} {% endfor %}
{% include '_partials/pagination.swig' %} {% endblock %} {% block sidebar %} {{ sidebar_template.render(false) }} {% endblock %} ================================================ FILE: layout/page.swig ================================================ {% 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 %}
{##################} {### PAGE BLOCK ###} {##################}
{% include '_partials/page-header.swig' %} {#################} {### PAGE BODY ###} {#################}
{# tagcloud page support #} {% if page.type === "tags" %}
{{ _p('counter.tag_cloud', site.tags.length) }}
{{ tagcloud({min_font: 12, max_font: 30, amount: 300, color: true, start_color: '#ccc', end_color: '#111'}) }}
{% elif page.type === 'categories' %}
{{ _p('counter.categories', site.categories.length) }}
{{ list_categories() }}
{% else %} {{ page.content }} {% endif %}
{#####################} {### END PAGE BODY ###} {#####################}
{######################} {### END PAGE BLOCK ###} {######################}
{% endblock %} {% block sidebar %} {{ sidebar_template.render(false) }} {% endblock %} {% block script_extra %} {% include '_scripts/pages/post-details.swig' %} {% endblock %} ================================================ FILE: layout/post.swig ================================================ {% 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 %}
{{ post_template.render(page) }}
{% if theme.jiathis %} {% include '_partials/share/jiathis.swig' %} {% elseif theme.baidushare %} {% include '_partials/share/baidushare.swig' %} {% elseif theme.add_this_id %} {% include '_partials/share/add-this.swig' %} {% elseif theme.duoshuo_shortname and theme.duoshuo_share %} {% include '_partials/share/duoshuo_share.swig' %} {% endif %}
{% endblock %} {% block sidebar %} {{ sidebar_template.render(true) }} {% endblock %} {% block script_extra %} {% include '_scripts/pages/post-details.swig' %} {% endblock %} ================================================ FILE: layout/schedule.swig ================================================ {% 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 %} ================================================ FILE: layout/tag.swig ================================================ {% 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') }}
{% 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 %} ================================================ FILE: package.json ================================================ { "name": "hexo-theme-next", "version": "5.1.4", "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" } } ================================================ FILE: scripts/merge-configs.js ================================================ /* 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); } } } }); hexo.on('generateAfter', function () { hexo.log.warn("==============================================================="); hexo.log.warn("========================= ATTENTION! =========================="); hexo.log.warn("==============================================================="); hexo.log.warn(" NexT repository is moving here: https://github.com/theme-next "); hexo.log.warn("==============================================================="); hexo.log.warn(" It's rebase to v6.0.0 and future maintenance will resume there"); hexo.log.warn("==============================================================="); }); ================================================ FILE: scripts/merge.js ================================================ /** * 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; ================================================ FILE: scripts/tags/button.js ================================================ /* 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); ================================================ FILE: scripts/tags/center-quote.js ================================================ /* 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}); ================================================ FILE: scripts/tags/exturl.js ================================================ /* 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 }; return htmlTag('span', attrs, text.join(' ')); } hexo.extend.tag.register('exturl', extURL, {ends: false}); hexo.extend.tag.register('extlink', extURL, {ends: false}); ================================================ FILE: scripts/tags/full-image.js ================================================ /* 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); ================================================ FILE: scripts/tags/group-pictures.js ================================================ /* 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}); ================================================ FILE: scripts/tags/label.js ================================================ /** * 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 }); ================================================ FILE: scripts/tags/lazy-image.js ================================================ /* 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); ================================================ FILE: scripts/tags/note.js ================================================ /** * 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}); ================================================ FILE: scripts/tags/tabs.js ================================================ /** * 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}); ================================================ FILE: source/css/_common/components/back-to-top-sidebar.styl ================================================ .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; } } ================================================ FILE: source/css/_common/components/back-to-top.styl ================================================ .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; } } ================================================ FILE: source/css/_common/components/buttons.styl ================================================ .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; } } ================================================ FILE: source/css/_common/components/comments.styl ================================================ .comments { margin: 60px 20px 0; } ================================================ FILE: source/css/_common/components/components.styl ================================================ @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"; ================================================ FILE: source/css/_common/components/footer/footer.styl ================================================ .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; } } ================================================ FILE: source/css/_common/components/header/header.styl ================================================ .header { background: $head-bg; } .header-inner { position: relative; } @import "headerband"; @import "site-meta"; @import "site-nav"; @import "menu"; ================================================ FILE: source/css/_common/components/header/headerband.styl ================================================ .headband { height: $headband-height; background: $headband-bg; } ================================================ FILE: source/css/_common/components/header/menu.styl ================================================ // 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; } ================================================ FILE: source/css/_common/components/header/site-meta.styl ================================================ .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; } } ================================================ FILE: source/css/_common/components/header/site-nav.styl ================================================ .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; } } ================================================ FILE: source/css/_common/components/highlight/diff.styl ================================================ $highlight_theme = hexo-config("highlight_theme") if $highlight_theme == "normal" $highlight-deletion = #fdd $highlight-addition = #dfd else $highlight-deletion = #008000 $highlight-addition = #800000 ================================================ FILE: source/css/_common/components/highlight/highlight.styl ================================================ // 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; } } ================================================ FILE: source/css/_common/components/highlight/theme.styl ================================================ $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%) } ================================================ FILE: source/css/_common/components/pages/archive.styl ================================================ .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(); } } } ================================================ FILE: source/css/_common/components/pages/categories.styl ================================================ .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; } } ================================================ FILE: source/css/_common/components/pages/pages.styl ================================================ // Page specific styles @import "archive"; @import "categories"; @import "schedule"; @import "post-detail"; ================================================ FILE: source/css/_common/components/pages/post-detail.styl ================================================ .page-post-detail { .sidebar-toggle-line { background: $sidebar-highlight; } .comments { overflow: hidden; } } ================================================ FILE: source/css/_common/components/pages/schedule.styl ================================================ @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 } } } } ================================================ FILE: source/css/_common/components/pagination.styl ================================================ .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; } } } ================================================ FILE: source/css/_common/components/post/post-button.styl ================================================ .post-button { margin-top: 40px; } ================================================ FILE: source/css/_common/components/post/post-collapse.styl ================================================ // 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; } } } ================================================ FILE: source/css/_common/components/post/post-copyright.styl ================================================ .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; } ================================================ FILE: source/css/_common/components/post/post-eof.styl ================================================ .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; } } ================================================ FILE: source/css/_common/components/post/post-expand.styl ================================================ // 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; } ================================================ FILE: source/css/_common/components/post/post-gallery.styl ================================================ .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; } ================================================ FILE: source/css/_common/components/post/post-meta.styl ================================================ .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; } } ================================================ FILE: source/css/_common/components/post/post-nav.styl ================================================ .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; } } ================================================ FILE: source/css/_common/components/post/post-reward.styl ================================================ #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)); } } ================================================ FILE: source/css/_common/components/post/post-rtl.styl ================================================ .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; } } ================================================ FILE: source/css/_common/components/post/post-tags.styl ================================================ .posts-expand .post-tags { margin-top: 40px; text-align: center; a { display: inline-block; margin-right: 10px; font-size: 13px; } } ================================================ FILE: source/css/_common/components/post/post-title.styl ================================================ .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; } } ================================================ FILE: source/css/_common/components/post/post-type.styl ================================================ // TODO: Refactor. .page-home, .page-post-detail { .post-type-quote { .post-header, .post-tags { display: none; } blockquote { @extend .blockquote-center } } } ================================================ FILE: source/css/_common/components/post/post-widgets.styl ================================================ .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; } ================================================ FILE: source/css/_common/components/post/post.styl ================================================ .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"; ================================================ FILE: source/css/_common/components/sidebar/sidebar-author-links.styl ================================================ .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%); } } ================================================ FILE: source/css/_common/components/sidebar/sidebar-author.styl ================================================ .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; } ================================================ FILE: source/css/_common/components/sidebar/sidebar-blogroll.styl ================================================ .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; } } ================================================ FILE: source/css/_common/components/sidebar/sidebar-dimmer.styl ================================================ .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; } } ================================================ FILE: source/css/_common/components/sidebar/sidebar-feed-link.styl ================================================ .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; } } } } ================================================ FILE: source/css/_common/components/sidebar/sidebar-nav.styl ================================================ // 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; } ================================================ FILE: source/css/_common/components/sidebar/sidebar-toc.styl ================================================ .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; text-align: justify; 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; } } ================================================ FILE: source/css/_common/components/sidebar/sidebar-toggle.styl ================================================ .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; } } ================================================ FILE: source/css/_common/components/sidebar/sidebar.styl ================================================ .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'); ================================================ FILE: source/css/_common/components/sidebar/site-state.styl ================================================ .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; } ================================================ FILE: source/css/_common/components/tag-cloud.styl ================================================ .tag-cloud { text-align: center; a { display: inline-block; margin: 10px; } } ================================================ FILE: source/css/_common/components/tags/blockquote-center.styl ================================================ // 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; } } ================================================ FILE: source/css/_common/components/tags/exturl.styl ================================================ .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; } ================================================ FILE: source/css/_common/components/tags/full-image.styl ================================================ // Expand image to 126% with nagative margin-left/right on Desktop. .full-image.full-image.full-image.full-image { border: none; max-width: 100%; width: auto; margin: 20px auto 25px; +desktop() { max-width: none; width: $full-image-width; margin: $full-image-margin-vertical $full-image-margin-horizontal; } } ================================================ FILE: source/css/_common/components/tags/group-pictures.styl ================================================ .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; } } ================================================ FILE: source/css/_common/components/tags/label.styl ================================================ .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; } } ================================================ FILE: source/css/_common/components/tags/note-modern.styl ================================================ .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; } } } } } ================================================ FILE: source/css/_common/components/tags/note.styl ================================================ .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; } } } } } ================================================ FILE: source/css/_common/components/tags/tabs.styl ================================================ .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; } } } } } } } ================================================ FILE: source/css/_common/components/tags/tags.styl ================================================ @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'); ================================================ FILE: source/css/_common/components/third-party/algolia-search.styl ================================================ .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 ================================================ FILE: source/css/_common/components/third-party/baidushare.styl ================================================ .post-spread { margin-top: 20px; text-align: center; } .bdshare-slide-button-box a { border: none; } .bdsharebuttonbox { display: inline-block; a { border: none; } } ================================================ FILE: source/css/_common/components/third-party/busuanzi-counter.styl ================================================ 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; } } ================================================ FILE: source/css/_common/components/third-party/duoshuo.styl ================================================ .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*/ } ================================================ FILE: source/css/_common/components/third-party/gitment.styl ================================================ #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; } ================================================ FILE: source/css/_common/components/third-party/han.styl ================================================ .fa { font-family: FontAwesome!important; } ================================================ FILE: source/css/_common/components/third-party/jiathis.styl ================================================ .post-spread { margin-top: 20px; text-align: center; } .jiathis_style { display: inline-block; a { border: none; } } ================================================ FILE: source/css/_common/components/third-party/localsearch.styl ================================================ .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 ================================================ FILE: source/css/_common/components/third-party/needsharebutton.styl ================================================ #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; } } ================================================ FILE: source/css/_common/components/third-party/third-party.styl ================================================ @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'); ================================================ FILE: source/css/_common/outline/outline.styl ================================================ // // 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; } } } ================================================ FILE: source/css/_common/scaffolding/base.styl ================================================ ::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; } ================================================ FILE: source/css/_common/scaffolding/helpers.styl ================================================ // // 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; } ================================================ FILE: source/css/_common/scaffolding/mobile.styl ================================================ /* // > 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() { } */ ================================================ FILE: source/css/_common/scaffolding/normalize.styl ================================================ /*! 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; } ================================================ FILE: source/css/_common/scaffolding/scaffolding.styl ================================================ // // Scaffolding // ================================================= @import "normalize"; @import "base"; @import "helpers"; @import "tables"; @import "mobile" if hexo-config('mobile_layout_economy'); ================================================ FILE: source/css/_common/scaffolding/tables.styl ================================================ 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; } ================================================ FILE: source/css/_custom/custom.styl ================================================ // Custom styles. ================================================ FILE: source/css/_mixins/Gemini.styl ================================================ @import "Pisces.styl"; ================================================ FILE: source/css/_mixins/Mist.styl ================================================ ================================================ FILE: source/css/_mixins/Muse.styl ================================================ ================================================ FILE: source/css/_mixins/Pisces.styl ================================================ 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(); } } } ================================================ FILE: source/css/_mixins/base.styl ================================================ 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; } } ================================================ FILE: source/css/_mixins/custom.styl ================================================ ================================================ FILE: source/css/_schemes/Gemini/index.styl ================================================ @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; } } ================================================ FILE: source/css/_schemes/Mist/_base.styl ================================================ // 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; } ================================================ FILE: source/css/_schemes/Mist/_header.styl ================================================ // 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%; } } ================================================ FILE: source/css/_schemes/Mist/_logo.styl ================================================ .site-subtitle { display: none; } ================================================ FILE: source/css/_schemes/Mist/_menu.styl ================================================ // 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; } } ================================================ FILE: source/css/_schemes/Mist/_posts-expanded.styl ================================================ // 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; } } } ================================================ FILE: source/css/_schemes/Mist/_search.styl ================================================ // Search // -------------------------------------------------- .site-search form { display: none; } ================================================ FILE: source/css/_schemes/Mist/index.styl ================================================ // // 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 // -------------------------------------------------- ================================================ FILE: source/css/_schemes/Mist/outline/outline.styl ================================================ .main-inner { margin-top: 80px; } ================================================ FILE: source/css/_schemes/Mist/sidebar/sidebar-blogroll.styl ================================================ .links-of-blogroll-inline .links-of-blogroll-item { display: inline-block; } ================================================ FILE: source/css/_schemes/Muse/_layout.styl ================================================ .header-inner, .container .main-inner, .footer-inner { +mobile() { width: auto; } } // embed tag embed { display: block; margin: 0px auto 25px auto; } ================================================ FILE: source/css/_schemes/Muse/_logo.styl ================================================ .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; } ================================================ FILE: source/css/_schemes/Muse/_menu.styl ================================================ .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-3; } } .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; } } ================================================ FILE: source/css/_schemes/Muse/_search.styl ================================================ // Search // -------------------------------------------------- .site-search form { display: none; } ================================================ FILE: source/css/_schemes/Muse/index.styl ================================================ @import "_layout.styl"; @import "_logo.styl"; @import "_menu.styl"; @import "_search.styl"; @import "sidebar/sidebar-blogroll"; ================================================ FILE: source/css/_schemes/Muse/sidebar/sidebar-blogroll.styl ================================================ .links-of-blogroll-inline .links-of-blogroll-item { display: inline-block; } ================================================ FILE: source/css/_schemes/Pisces/_brand.styl ================================================ .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; } ================================================ FILE: source/css/_schemes/Pisces/_layout.styl ================================================ .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: white; 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; } } ================================================ FILE: source/css/_schemes/Pisces/_menu.styl ================================================ .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: #f9f9f9; 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; } } ================================================ FILE: source/css/_schemes/Pisces/_posts.styl ================================================ .post-body { +mobile() { text-align: justify; } } ================================================ FILE: source/css/_schemes/Pisces/_sidebar.styl ================================================ .use-motion .sidebar .motion-element { opacity: 1; } .sidebar { margin-left: -100%; 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; } } } ================================================ FILE: source/css/_schemes/Pisces/index.styl ================================================ @import "_layout"; @import "_brand"; @import "_menu"; @import "_sidebar"; @import "_posts"; ================================================ FILE: source/css/_variables/Gemini.styl ================================================ // 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; ================================================ FILE: source/css/_variables/Mist.styl ================================================ // 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 ================================================ FILE: source/css/_variables/Muse.styl ================================================ ================================================ FILE: source/css/_variables/Pisces.styl ================================================ // 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 ================================================ FILE: source/css/_variables/base.styl ================================================ // // 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) ================================================ FILE: source/css/_variables/custom.styl ================================================ ================================================ FILE: source/css/main.styl ================================================ // 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"; ================================================ FILE: source/fonts/.gitkeep ================================================ ================================================ FILE: source/js/src/affix.js ================================================ /* ======================================================================== * 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); ================================================ FILE: source/js/src/algolia-search.js ================================================ /* 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 + '' + ' Algolia' + '' + '
    ' ); } } }), 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', ''); }); }); ================================================ FILE: source/js/src/bootstrap.js ================================================ /* 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'); }); ================================================ FILE: source/js/src/exturl.js ================================================ /* 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; }); }); ================================================ FILE: source/js/src/hook-duoshuo.js ================================================ /* 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); } } ================================================ FILE: source/js/src/js.cookie.js ================================================ /*! * 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 () {}); })); ================================================ FILE: source/js/src/motion.js ================================================ /* 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(); } }; }); ================================================ FILE: source/js/src/post-details.js ================================================ /* 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(); } }); ================================================ FILE: source/js/src/schemes/pisces.js ================================================ $(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(); } }); ================================================ FILE: source/js/src/scroll-cookie.js ================================================ $(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]); } } }); ================================================ FILE: source/js/src/scrollspy.js ================================================ /* ======================================================================== * 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); ================================================ FILE: source/js/src/utils.js ================================================ /* 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 ($('.site-overview-wrap').height() > (document.body.clientHeight - NexT.utils.getSidebarSchemePadding())) { $('.site-overview').css('width', 'calc(100% + ' + scrollbarWidth + 'px)'); } if ($('.post-toc-wrap').height() > (document.body.clientHeight - NexT.utils.getSidebarSchemePadding())) { $('.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); } }); ================================================ FILE: source/lib/canvas-ribbon/canvas-ribbon.js ================================================ /** * Created by zproo on 2017/4/8. */ !function () { function getAttr(script, attr, default_val) { return Number(script.getAttribute(attr)) || default_val; } // 获取自定义配置 var ribbon = document.getElementById('ribbon'); // 当前加载的script config = { zIndex: getAttr(ribbon, "zIndex", -1), // z-index alpha: getAttr(ribbon, "alpha", 0.6), // alpha ribbon_width: getAttr(ribbon, "size", 90), // size }; var canvas = document.createElement("canvas"); canvas.style.cssText = "position:fixed;top:0;left:0;z-index:"+config.zIndex; document.getElementsByTagName("body")[0].appendChild(canvas); var canvasRibbon = canvas, ctx = canvasRibbon.getContext('2d'), // 获取canvas 2d上下文 dpr = window.devicePixelRatio || 1, // the size of one CSS pixel to the size of one physical pixel. width = window.innerWidth, // 返回窗口的文档显示区的宽高 height = window.innerHeight, RIBBON_WIDTH = config.ribbon_width, path, math = Math, r = 0, PI_2 = math.PI * 2, // 圆周率*2 cos = math.cos, // cos函数返回一个数值的余弦值(-1~1) random = math.random; // 返回0-1随机数 canvasRibbon.width = width * dpr; // 返回实际宽高 canvasRibbon.height = height * dpr; ctx.scale(dpr, dpr); // 水平、竖直方向缩放 ctx.globalAlpha = config.alpha; // 图形透明度 function init() { ctx.clearRect(0, 0, width, height); // 擦除之前绘制内容 path = [{x: 0, y: height * 0.7 + RIBBON_WIDTH}, {x: 0, y: height * 0.7 - RIBBON_WIDTH}]; // 路径没有填满屏幕宽度时,绘制路径 while (path[1].x < width + RIBBON_WIDTH) { draw(path[0], path[1]) } } function draw(start, end) { ctx.beginPath(); // 创建一个新的路径 ctx.moveTo(start.x, start.y); // path起点 ctx.lineTo(end.x, end.y); // path终点 var nextX = end.x + (random() * 2 - 0.25) * RIBBON_WIDTH, nextY = geneY(end.y); ctx.lineTo(nextX, nextY); ctx.closePath(); r -= PI_2 / -50; // 随机生成并设置canvas路径16进制颜色 ctx.fillStyle = '#' + (cos(r) * 127 + 128 << 16 | cos(r + PI_2 / 3) * 127 + 128 << 8 | cos(r + PI_2 / 3 * 2) * 127 + 128).toString(16); ctx.fill(); // 根据当前样式填充路径 path[0] = path[1]; // 起点更新为当前终点 path[1] = {x: nextX, y: nextY} // 更新终点 } function geneY(y) { var temp = y + (random() * 2 - 1.1) * RIBBON_WIDTH; return (temp > height || temp < 0) ? geneY(y) : temp; } document.onclick = init; document.ontouchstart = init; init(); }(); ================================================ FILE: source/lib/fastclick/.bower.json ================================================ { "name": "fastclick", "main": "lib/fastclick.js", "ignore": [ "**/.*", "component.json", "package.json", "Makefile", "tests", "examples" ], "homepage": "https://github.com/ftlabs/fastclick", "version": "1.0.6", "_release": "1.0.6", "_resolution": { "type": "version", "tag": "v1.0.6", "commit": "2ac7258407619398005ca720596f0d36ce66a6c8" }, "_source": "git://github.com/ftlabs/fastclick.git", "_target": "~1.0.6", "_originalSource": "fastclick", "_direct": true } ================================================ FILE: source/lib/fastclick/LICENSE ================================================ Copyright (c) 2014 The Financial Times Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: source/lib/fastclick/README.md ================================================ # FastClick # FastClick is a simple, easy-to-use library for eliminating the 300ms delay between a physical tap and the firing of a `click` event on mobile browsers. The aim is to make your application feel less laggy and more responsive while avoiding any interference with your current logic. FastClick is developed by [FT Labs](http://labs.ft.com/), part of the Financial Times. [Explication en français](http://maxime.sh/2013/02/supprimer-le-lag-des-clics-sur-mobile-avec-fastclick/). [日本語で説明](https://developer.mozilla.org/ja/docs/Mozilla/Firefox_OS/Apps/Tips_and_techniques#Make_events_immediate)。 ## Why does the delay exist? ## According to [Google](https://developers.google.com/mobile/articles/fast_buttons): > ...mobile browsers will wait approximately 300ms from the time that you tap the button to fire the click event. The reason for this is that the browser is waiting to see if you are actually performing a double tap. ## Compatibility ## The library has been deployed as part of the [FT Web App](http://app.ft.com/) and is tried and tested on the following mobile browsers: * Mobile Safari on iOS 3 and upwards * Chrome on iOS 5 and upwards * Chrome on Android (ICS) * Opera Mobile 11.5 and upwards * Android Browser since Android 2 * PlayBook OS 1 and upwards ## When it isn't needed ## FastClick doesn't attach any listeners on desktop browsers. Chrome 32+ on Android with `width=device-width` in the [viewport meta tag](https://developer.mozilla.org/en-US/docs/Mobile/Viewport_meta_tag) doesn't have a 300ms delay, therefore listeners aren't attached. ```html ``` Same goes for Chrome on Android (all versions) with `user-scalable=no` in the viewport meta tag. But be aware that `user-scalable=no` also disables pinch zooming, which may be an accessibility concern. For IE11+, you can use `touch-action: manipulation;` to disable double-tap-to-zoom on certain elements (like links and buttons). For IE10 use `-ms-touch-action: manipulation`. ## Usage ## Include fastclick.js in your JavaScript bundle or add it to your HTML page like this: ```html ``` The script must be loaded prior to instantiating FastClick on any element of the page. To instantiate FastClick on the `body`, which is the recommended method of use: ```js if ('addEventListener' in document) { document.addEventListener('DOMContentLoaded', function() { FastClick.attach(document.body); }, false); } ``` Or, if you're using jQuery: ```js $(function() { FastClick.attach(document.body); }); ``` If you're using Browserify or another CommonJS-style module system, the `FastClick.attach` function will be returned when you call `require('fastclick')`. As a result, the easiest way to use FastClick with these loaders is as follows: ```js var attachFastClick = require('fastclick'); attachFastClick(document.body); ``` ### Minified ### Run `make` to build a minified version of FastClick using the Closure Compiler REST API. The minified file is saved to `build/fastclick.min.js` or you can [download a pre-minified version](http://build.origami.ft.com/bundles/js?modules=fastclick). Note: the pre-minified version is built using [our build service](http://origami.ft.com/docs/developer-guide/build-service/) which exposes the `FastClick` object through `Origami.fastclick` and will have the Browserify/CommonJS API (see above). ```js var attachFastClick = Origami.fastclick; attachFastClick(document.body); ``` ### AMD ### FastClick has AMD (Asynchronous Module Definition) support. This allows it to be lazy-loaded with an AMD loader, such as [RequireJS](http://requirejs.org/). Note that when using the AMD style require, the full `FastClick` object will be returned, _not_ `FastClick.attach` ```js var FastClick = require('fastclick'); FastClick.attach(document.body, options); ``` ### Package managers ### You can install FastClick using [Component](https://github.com/component/component), [npm](https://npmjs.org/package/fastclick) or [Bower](http://bower.io/). For Ruby, there's a third-party gem called [fastclick-rails](http://rubygems.org/gems/fastclick-rails). For .NET there's a [NuGet package](http://nuget.org/packages/FastClick). ## Advanced ## ### Ignore certain elements with `needsclick` ### Sometimes you need FastClick to ignore certain elements. You can do this easily by adding the `needsclick` class. ```html Ignored by FastClick ``` #### Use case 1: non-synthetic click required #### Internally, FastClick uses `document.createEvent` to fire a synthetic `click` event as soon as `touchend` is fired by the browser. It then suppresses the additional `click` event created by the browser after that. In some cases, the non-synthetic `click` event created by the browser is required, as described in the [triggering focus example](http://ftlabs.github.com/fastclick/examples/focus.html). This is where the `needsclick` class comes in. Add the class to any element that requires a non-synthetic click. #### Use case 2: Twitter Bootstrap 2.2.2 dropdowns #### Another example of when to use the `needsclick` class is with dropdowns in Twitter Bootstrap 2.2.2. Bootstrap add its own `touchstart` listener for dropdowns, so you want to tell FastClick to ignore those. If you don't, touch devices will automatically close the dropdown as soon as it is clicked, because both FastClick and Bootstrap execute the synthetic click, one opens the dropdown, the second closes it immediately after. ```html Dropdown ``` ## Examples ## FastClick is designed to cope with many different browser oddities. Here are some examples to illustrate this: * [basic use](http://ftlabs.github.com/fastclick/examples/layer.html) showing the increase in perceived responsiveness * [triggering focus](http://ftlabs.github.com/fastclick/examples/focus.html) on an input element from a `click` handler * [input element](http://ftlabs.github.com/fastclick/examples/input.html) which never receives clicks but gets fast focus ## Tests ## There are no automated tests. The files in `tests/` are manual reduced test cases. We've had a think about how best to test these cases, but they tend to be very browser/device specific and sometimes subjective which means it's not so trivial to test. ## Credits and collaboration ## FastClick is maintained by [Rowan Beentje](http://twitter.com/rowanbeentje), [Matthew Caruana Galizia](http://twitter.com/mcaruanagalizia) and [Matthew Andrews](http://twitter.com/andrewsmatt) at [FT Labs](http://labs.ft.com). All open source code released by FT Labs is licenced under the MIT licence. We welcome comments, feedback and suggestions. Please feel free to raise an issue or pull request. ================================================ FILE: source/lib/fastclick/bower.json ================================================ { "name": "fastclick", "main": "lib/fastclick.js", "ignore": [ "**/.*", "component.json", "package.json", "Makefile", "tests", "examples" ] } ================================================ FILE: source/lib/fastclick/lib/fastclick.js ================================================ ;(function () { 'use strict'; /** * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs. * * @codingstandard ftlabs-jsv2 * @copyright The Financial Times Limited [All Rights Reserved] * @license MIT License (see LICENSE.txt) */ /*jslint browser:true, node:true*/ /*global define, Event, Node*/ /** * Instantiate fast-clicking listeners on the specified layer. * * @constructor * @param {Element} layer The layer to listen on * @param {Object} [options={}] The options to override the defaults */ function FastClick(layer, options) { var oldOnClick; options = options || {}; /** * Whether a click is currently being tracked. * * @type boolean */ this.trackingClick = false; /** * Timestamp for when click tracking started. * * @type number */ this.trackingClickStart = 0; /** * The element being tracked for a click. * * @type EventTarget */ this.targetElement = null; /** * X-coordinate of touch start event. * * @type number */ this.touchStartX = 0; /** * Y-coordinate of touch start event. * * @type number */ this.touchStartY = 0; /** * ID of the last touch, retrieved from Touch.identifier. * * @type number */ this.lastTouchIdentifier = 0; /** * Touchmove boundary, beyond which a click will be cancelled. * * @type number */ this.touchBoundary = options.touchBoundary || 10; /** * The FastClick layer. * * @type Element */ this.layer = layer; /** * The minimum time between tap(touchstart and touchend) events * * @type number */ this.tapDelay = options.tapDelay || 200; /** * The maximum time for a tap * * @type number */ this.tapTimeout = options.tapTimeout || 700; if (FastClick.notNeeded(layer)) { return; } // Some old versions of Android don't have Function.prototype.bind function bind(method, context) { return function() { return method.apply(context, arguments); }; } var methods = ['onMouse', 'onClick', 'onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel']; var context = this; for (var i = 0, l = methods.length; i < l; i++) { context[methods[i]] = bind(context[methods[i]], context); } // Set up event handlers as required if (deviceIsAndroid) { layer.addEventListener('mouseover', this.onMouse, true); layer.addEventListener('mousedown', this.onMouse, true); layer.addEventListener('mouseup', this.onMouse, true); } layer.addEventListener('click', this.onClick, true); layer.addEventListener('touchstart', this.onTouchStart, false); layer.addEventListener('touchmove', this.onTouchMove, false); layer.addEventListener('touchend', this.onTouchEnd, false); layer.addEventListener('touchcancel', this.onTouchCancel, false); // Hack is required for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2) // which is how FastClick normally stops click events bubbling to callbacks registered on the FastClick // layer when they are cancelled. if (!Event.prototype.stopImmediatePropagation) { layer.removeEventListener = function(type, callback, capture) { var rmv = Node.prototype.removeEventListener; if (type === 'click') { rmv.call(layer, type, callback.hijacked || callback, capture); } else { rmv.call(layer, type, callback, capture); } }; layer.addEventListener = function(type, callback, capture) { var adv = Node.prototype.addEventListener; if (type === 'click') { adv.call(layer, type, callback.hijacked || (callback.hijacked = function(event) { if (!event.propagationStopped) { callback(event); } }), capture); } else { adv.call(layer, type, callback, capture); } }; } // If a handler is already declared in the element's onclick attribute, it will be fired before // FastClick's onClick handler. Fix this by pulling out the user-defined handler function and // adding it as listener. if (typeof layer.onclick === 'function') { // Android browser on at least 3.2 requires a new reference to the function in layer.onclick // - the old one won't work if passed to addEventListener directly. oldOnClick = layer.onclick; layer.addEventListener('click', function(event) { oldOnClick(event); }, false); layer.onclick = null; } } /** * Windows Phone 8.1 fakes user agent string to look like Android and iPhone. * * @type boolean */ var deviceIsWindowsPhone = navigator.userAgent.indexOf("Windows Phone") >= 0; /** * Android requires exceptions. * * @type boolean */ var deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0 && !deviceIsWindowsPhone; /** * iOS requires exceptions. * * @type boolean */ var deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent) && !deviceIsWindowsPhone; /** * iOS 4 requires an exception for select elements. * * @type boolean */ var deviceIsIOS4 = deviceIsIOS && (/OS 4_\d(_\d)?/).test(navigator.userAgent); /** * iOS 6.0-7.* requires the target element to be manually derived * * @type boolean */ var deviceIsIOSWithBadTarget = deviceIsIOS && (/OS [6-7]_\d/).test(navigator.userAgent); /** * BlackBerry requires exceptions. * * @type boolean */ var deviceIsBlackBerry10 = navigator.userAgent.indexOf('BB10') > 0; /** * Determine whether a given element requires a native click. * * @param {EventTarget|Element} target Target DOM element * @returns {boolean} Returns true if the element needs a native click */ FastClick.prototype.needsClick = function(target) { switch (target.nodeName.toLowerCase()) { // Don't send a synthetic click to disabled inputs (issue #62) case 'button': case 'select': case 'textarea': if (target.disabled) { return true; } break; case 'input': // File inputs need real clicks on iOS 6 due to a browser bug (issue #68) if ((deviceIsIOS && target.type === 'file') || target.disabled) { return true; } break; case 'label': case 'iframe': // iOS8 homescreen apps can prevent events bubbling into frames case 'video': return true; } return (/\bneedsclick\b/).test(target.className); }; /** * Determine whether a given element requires a call to focus to simulate click into element. * * @param {EventTarget|Element} target Target DOM element * @returns {boolean} Returns true if the element requires a call to focus to simulate native click. */ FastClick.prototype.needsFocus = function(target) { switch (target.nodeName.toLowerCase()) { case 'textarea': return true; case 'select': return !deviceIsAndroid; case 'input': switch (target.type) { case 'button': case 'checkbox': case 'file': case 'image': case 'radio': case 'submit': return false; } // No point in attempting to focus disabled inputs return !target.disabled && !target.readOnly; default: return (/\bneedsfocus\b/).test(target.className); } }; /** * Send a click event to the specified element. * * @param {EventTarget|Element} targetElement * @param {Event} event */ FastClick.prototype.sendClick = function(targetElement, event) { var clickEvent, touch; // On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24) if (document.activeElement && document.activeElement !== targetElement) { document.activeElement.blur(); } touch = event.changedTouches[0]; // Synthesise a click event, with an extra attribute so it can be tracked clickEvent = document.createEvent('MouseEvents'); clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); clickEvent.forwardedTouchEvent = true; targetElement.dispatchEvent(clickEvent); }; FastClick.prototype.determineEventType = function(targetElement) { //Issue #159: Android Chrome Select Box does not open with a synthetic click event if (deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') { return 'mousedown'; } return 'click'; }; /** * @param {EventTarget|Element} targetElement */ FastClick.prototype.focus = function(targetElement) { var length; // Issue #160: on iOS 7, some input elements (e.g. date datetime month) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724. if (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month') { length = targetElement.value.length; targetElement.setSelectionRange(length, length); } else { targetElement.focus(); } }; /** * Check whether the given target element is a child of a scrollable layer and if so, set a flag on it. * * @param {EventTarget|Element} targetElement */ FastClick.prototype.updateScrollParent = function(targetElement) { var scrollParent, parentElement; scrollParent = targetElement.fastClickScrollParent; // Attempt to discover whether the target element is contained within a scrollable layer. Re-check if the // target element was moved to another parent. if (!scrollParent || !scrollParent.contains(targetElement)) { parentElement = targetElement; do { if (parentElement.scrollHeight > parentElement.offsetHeight) { scrollParent = parentElement; targetElement.fastClickScrollParent = parentElement; break; } parentElement = parentElement.parentElement; } while (parentElement); } // Always update the scroll top tracker if possible. if (scrollParent) { scrollParent.fastClickLastScrollTop = scrollParent.scrollTop; } }; /** * @param {EventTarget} targetElement * @returns {Element|EventTarget} */ FastClick.prototype.getTargetElementFromEventTarget = function(eventTarget) { // On some older browsers (notably Safari on iOS 4.1 - see issue #56) the event target may be a text node. if (eventTarget.nodeType === Node.TEXT_NODE) { return eventTarget.parentNode; } return eventTarget; }; /** * On touch start, record the position and scroll offset. * * @param {Event} event * @returns {boolean} */ FastClick.prototype.onTouchStart = function(event) { var targetElement, touch, selection; // Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111). if (event.targetTouches.length > 1) { return true; } targetElement = this.getTargetElementFromEventTarget(event.target); touch = event.targetTouches[0]; if (deviceIsIOS) { // Only trusted events will deselect text on iOS (issue #49) selection = window.getSelection(); if (selection.rangeCount && !selection.isCollapsed) { return true; } if (!deviceIsIOS4) { // Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23): // when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched // with the same identifier as the touch event that previously triggered the click that triggered the alert. // Sadly, there is an issue on iOS 4 that causes some normal touch events to have the same identifier as an // immediately preceeding touch event (issue #52), so this fix is unavailable on that platform. // Issue 120: touch.identifier is 0 when Chrome dev tools 'Emulate touch events' is set with an iOS device UA string, // which causes all touch events to be ignored. As this block only applies to iOS, and iOS identifiers are always long, // random integers, it's safe to to continue if the identifier is 0 here. if (touch.identifier && touch.identifier === this.lastTouchIdentifier) { event.preventDefault(); return false; } this.lastTouchIdentifier = touch.identifier; // If the target element is a child of a scrollable layer (using -webkit-overflow-scrolling: touch) and: // 1) the user does a fling scroll on the scrollable layer // 2) the user stops the fling scroll with another tap // then the event.target of the last 'touchend' event will be the element that was under the user's finger // when the fling scroll was started, causing FastClick to send a click event to that layer - unless a check // is made to ensure that a parent layer was not scrolled before sending a synthetic click (issue #42). this.updateScrollParent(targetElement); } } this.trackingClick = true; this.trackingClickStart = event.timeStamp; this.targetElement = targetElement; this.touchStartX = touch.pageX; this.touchStartY = touch.pageY; // Prevent phantom clicks on fast double-tap (issue #36) if ((event.timeStamp - this.lastClickTime) < this.tapDelay) { event.preventDefault(); } return true; }; /** * Based on a touchmove event object, check whether the touch has moved past a boundary since it started. * * @param {Event} event * @returns {boolean} */ FastClick.prototype.touchHasMoved = function(event) { var touch = event.changedTouches[0], boundary = this.touchBoundary; if (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) { return true; } return false; }; /** * Update the last position. * * @param {Event} event * @returns {boolean} */ FastClick.prototype.onTouchMove = function(event) { if (!this.trackingClick) { return true; } // If the touch has moved, cancel the click tracking if (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) { this.trackingClick = false; this.targetElement = null; } return true; }; /** * Attempt to find the labelled control for the given label element. * * @param {EventTarget|HTMLLabelElement} labelElement * @returns {Element|null} */ FastClick.prototype.findControl = function(labelElement) { // Fast path for newer browsers supporting the HTML5 control attribute if (labelElement.control !== undefined) { return labelElement.control; } // All browsers under test that support touch events also support the HTML5 htmlFor attribute if (labelElement.htmlFor) { return document.getElementById(labelElement.htmlFor); } // If no for attribute exists, attempt to retrieve the first labellable descendant element // the list of which is defined here: http://www.w3.org/TR/html5/forms.html#category-label return labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea'); }; /** * On touch end, determine whether to send a click event at once. * * @param {Event} event * @returns {boolean} */ FastClick.prototype.onTouchEnd = function(event) { var forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement; if (!this.trackingClick) { return true; } // Prevent phantom clicks on fast double-tap (issue #36) if ((event.timeStamp - this.lastClickTime) < this.tapDelay) { this.cancelNextClick = true; return true; } if ((event.timeStamp - this.trackingClickStart) > this.tapTimeout) { return true; } // Reset to prevent wrong click cancel on input (issue #156). this.cancelNextClick = false; this.lastClickTime = event.timeStamp; trackingClickStart = this.trackingClickStart; this.trackingClick = false; this.trackingClickStart = 0; // On some iOS devices, the targetElement supplied with the event is invalid if the layer // is performing a transition or scroll, and has to be re-detected manually. Note that // for this to function correctly, it must be called *after* the event target is checked! // See issue #57; also filed as rdar://13048589 . if (deviceIsIOSWithBadTarget) { touch = event.changedTouches[0]; // In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null targetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement; targetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent; } targetTagName = targetElement.tagName.toLowerCase(); if (targetTagName === 'label') { forElement = this.findControl(targetElement); if (forElement) { this.focus(targetElement); if (deviceIsAndroid) { return false; } targetElement = forElement; } } else if (this.needsFocus(targetElement)) { // Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through. // Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37). if ((event.timeStamp - trackingClickStart) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) { this.targetElement = null; return false; } this.focus(targetElement); this.sendClick(targetElement, event); // Select elements need the event to go through on iOS 4, otherwise the selector menu won't open. // Also this breaks opening selects when VoiceOver is active on iOS6, iOS7 (and possibly others) if (!deviceIsIOS || targetTagName !== 'select') { this.targetElement = null; event.preventDefault(); } return false; } if (deviceIsIOS && !deviceIsIOS4) { // Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled // and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42). scrollParent = targetElement.fastClickScrollParent; if (scrollParent && scrollParent.fastClickLastScrollTop !== scrollParent.scrollTop) { return true; } } // Prevent the actual click from going though - unless the target node is marked as requiring // real clicks or if it is in the whitelist in which case only non-programmatic clicks are permitted. if (!this.needsClick(targetElement)) { event.preventDefault(); this.sendClick(targetElement, event); } return false; }; /** * On touch cancel, stop tracking the click. * * @returns {void} */ FastClick.prototype.onTouchCancel = function() { this.trackingClick = false; this.targetElement = null; }; /** * Determine mouse events which should be permitted. * * @param {Event} event * @returns {boolean} */ FastClick.prototype.onMouse = function(event) { // If a target element was never set (because a touch event was never fired) allow the event if (!this.targetElement) { return true; } if (event.forwardedTouchEvent) { return true; } // Programmatically generated events targeting a specific element should be permitted if (!event.cancelable) { return true; } // Derive and check the target element to see whether the mouse event needs to be permitted; // unless explicitly enabled, prevent non-touch click events from triggering actions, // to prevent ghost/doubleclicks. if (!this.needsClick(this.targetElement) || this.cancelNextClick) { // Prevent any user-added listeners declared on FastClick element from being fired. if (event.stopImmediatePropagation) { event.stopImmediatePropagation(); } else { // Part of the hack for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2) event.propagationStopped = true; } // Cancel the event event.stopPropagation(); event.preventDefault(); return false; } // If the mouse event is permitted, return true for the action to go through. return true; }; /** * On actual clicks, determine whether this is a touch-generated click, a click action occurring * naturally after a delay after a touch (which needs to be cancelled to avoid duplication), or * an actual click which should be permitted. * * @param {Event} event * @returns {boolean} */ FastClick.prototype.onClick = function(event) { var permitted; // It's possible for another FastClick-like library delivered with third-party code to fire a click event before FastClick does (issue #44). In that case, set the click-tracking flag back to false and return early. This will cause onTouchEnd to return early. if (this.trackingClick) { this.targetElement = null; this.trackingClick = false; return true; } // Very odd behaviour on iOS (issue #18): if a submit element is present inside a form and the user hits enter in the iOS simulator or clicks the Go button on the pop-up OS keyboard the a kind of 'fake' click event will be triggered with the submit-type input element as the target. if (event.target.type === 'submit' && event.detail === 0) { return true; } permitted = this.onMouse(event); // Only unset targetElement if the click is not permitted. This will ensure that the check for !targetElement in onMouse fails and the browser's click doesn't go through. if (!permitted) { this.targetElement = null; } // If clicks are permitted, return true for the action to go through. return permitted; }; /** * Remove all FastClick's event listeners. * * @returns {void} */ FastClick.prototype.destroy = function() { var layer = this.layer; if (deviceIsAndroid) { layer.removeEventListener('mouseover', this.onMouse, true); layer.removeEventListener('mousedown', this.onMouse, true); layer.removeEventListener('mouseup', this.onMouse, true); } layer.removeEventListener('click', this.onClick, true); layer.removeEventListener('touchstart', this.onTouchStart, false); layer.removeEventListener('touchmove', this.onTouchMove, false); layer.removeEventListener('touchend', this.onTouchEnd, false); layer.removeEventListener('touchcancel', this.onTouchCancel, false); }; /** * Check whether FastClick is needed. * * @param {Element} layer The layer to listen on */ FastClick.notNeeded = function(layer) { var metaViewport; var chromeVersion; var blackberryVersion; var firefoxVersion; // Devices that don't support touch don't need FastClick if (typeof window.ontouchstart === 'undefined') { return true; } // Chrome version - zero for other browsers chromeVersion = +(/Chrome\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1]; if (chromeVersion) { if (deviceIsAndroid) { metaViewport = document.querySelector('meta[name=viewport]'); if (metaViewport) { // Chrome on Android with user-scalable="no" doesn't need FastClick (issue #89) if (metaViewport.content.indexOf('user-scalable=no') !== -1) { return true; } // Chrome 32 and above with width=device-width or less don't need FastClick if (chromeVersion > 31 && document.documentElement.scrollWidth <= window.outerWidth) { return true; } } // Chrome desktop doesn't need FastClick (issue #15) } else { return true; } } if (deviceIsBlackBerry10) { blackberryVersion = navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/); // BlackBerry 10.3+ does not require Fastclick library. // https://github.com/ftlabs/fastclick/issues/251 if (blackberryVersion[1] >= 10 && blackberryVersion[2] >= 3) { metaViewport = document.querySelector('meta[name=viewport]'); if (metaViewport) { // user-scalable=no eliminates click delay. if (metaViewport.content.indexOf('user-scalable=no') !== -1) { return true; } // width=device-width (or less than device-width) eliminates click delay. if (document.documentElement.scrollWidth <= window.outerWidth) { return true; } } } } // IE10 with -ms-touch-action: none or manipulation, which disables double-tap-to-zoom (issue #97) if (layer.style.msTouchAction === 'none' || layer.style.touchAction === 'manipulation') { return true; } // Firefox version - zero for other browsers firefoxVersion = +(/Firefox\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1]; if (firefoxVersion >= 27) { // Firefox 27+ does not have tap delay if the content is not zoomable - https://bugzilla.mozilla.org/show_bug.cgi?id=922896 metaViewport = document.querySelector('meta[name=viewport]'); if (metaViewport && (metaViewport.content.indexOf('user-scalable=no') !== -1 || document.documentElement.scrollWidth <= window.outerWidth)) { return true; } } // IE11: prefixed -ms-touch-action is no longer supported and it's recomended to use non-prefixed version // http://msdn.microsoft.com/en-us/library/windows/apps/Hh767313.aspx if (layer.style.touchAction === 'none' || layer.style.touchAction === 'manipulation') { return true; } return false; }; /** * Factory method for creating a FastClick object * * @param {Element} layer The layer to listen on * @param {Object} [options={}] The options to override the defaults */ FastClick.attach = function(layer, options) { return new FastClick(layer, options); }; if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) { // AMD. Register as an anonymous module. define(function() { return FastClick; }); } else if (typeof module !== 'undefined' && module.exports) { module.exports = FastClick.attach; module.exports.FastClick = FastClick; } else { window.FastClick = FastClick; } }()); ================================================ FILE: source/lib/font-awesome/.bower.json ================================================ { "name": "font-awesome", "description": "Font Awesome", "keywords": [], "homepage": "http://fontawesome.io", "dependencies": {}, "devDependencies": {}, "license": [ "OFL-1.1", "MIT", "CC-BY-3.0" ], "main": [ "less/font-awesome.less", "scss/font-awesome.scss" ], "ignore": [ "*/.*", "*.json", "src", "*.yml", "Gemfile", "Gemfile.lock", "*.md" ], "version": "4.7.0", "_release": "4.7.0", "_resolution": { "type": "version", "tag": "v4.7.0", "commit": "a3fe90fa5f6fac55d197f9cbd18e3f57dafb716c" }, "_source": "https://github.com/FortAwesome/Font-Awesome.git", "_target": "*", "_originalSource": "fontawesome" } ================================================ FILE: source/lib/font-awesome/.gitignore ================================================ *.pyc *.egg-info *.db *.db.old *.swp *.db-journal .coverage .DS_Store .installed.cfg _gh_pages/* .idea/* .svn/* src/website/static/* src/website/media/* bin cfcache develop-eggs dist downloads eggs parts tmp .sass-cache node_modules src/website/settingslocal.py stunnel.log .ruby-version .bundle ================================================ FILE: source/lib/font-awesome/.npmignore ================================================ *.pyc *.egg-info *.db *.db.old *.swp *.db-journal .coverage .DS_Store .installed.cfg _gh_pages/* .idea/* .svn/* src/website/static/* src/website/media/* bin cfcache develop-eggs dist downloads eggs parts tmp .sass-cache node_modules src/website/settingslocal.py stunnel.log .ruby-version # don't need these in the npm package. src/ _config.yml bower.json component.json composer.json CONTRIBUTING.md Gemfile Gemfile.lock ================================================ FILE: source/lib/font-awesome/HELP-US-OUT.txt ================================================ I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, comprehensive icon sets or copy and paste your own. Please. Check it out. -Dave Gandy ================================================ FILE: source/lib/font-awesome/bower.json ================================================ { "name": "font-awesome", "description": "Font Awesome", "keywords": [], "homepage": "http://fontawesome.io", "dependencies": {}, "devDependencies": {}, "license": ["OFL-1.1", "MIT", "CC-BY-3.0"], "main": [ "less/font-awesome.less", "scss/font-awesome.scss" ], "ignore": [ "*/.*", "*.json", "src", "*.yml", "Gemfile", "Gemfile.lock", "*.md" ] } ================================================ FILE: source/lib/font-awesome/css/font-awesome.css ================================================ /*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ /* FONT PATH * -------------------------- */ @font-face { font-family: 'FontAwesome'; src: url('../fonts/fontawesome-webfont.eot?v=4.7.0'); src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg'); font-weight: normal; font-style: normal; } .fa { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* makes the font 33% larger relative to the icon container */ .fa-lg { font-size: 1.33333333em; line-height: 0.75em; vertical-align: -15%; } .fa-2x { font-size: 2em; } .fa-3x { font-size: 3em; } .fa-4x { font-size: 4em; } .fa-5x { font-size: 5em; } .fa-fw { width: 1.28571429em; text-align: center; } .fa-ul { padding-left: 0; margin-left: 2.14285714em; list-style-type: none; } .fa-ul > li { position: relative; } .fa-li { position: absolute; left: -2.14285714em; width: 2.14285714em; top: 0.14285714em; text-align: center; } .fa-li.fa-lg { left: -1.85714286em; } .fa-border { padding: .2em .25em .15em; border: solid 0.08em #eeeeee; border-radius: .1em; } .fa-pull-left { float: left; } .fa-pull-right { float: right; } .fa.fa-pull-left { margin-right: .3em; } .fa.fa-pull-right { margin-left: .3em; } /* Deprecated as of 4.4.0 */ .pull-right { float: right; } .pull-left { float: left; } .fa.pull-left { margin-right: .3em; } .fa.pull-right { margin-left: .3em; } .fa-spin { -webkit-animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear; } .fa-pulse { -webkit-animation: fa-spin 1s infinite steps(8); animation: fa-spin 1s infinite steps(8); } @-webkit-keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } @keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } .fa-rotate-90 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); } .fa-rotate-180 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; -webkit-transform: rotate(180deg); -ms-transform: rotate(180deg); transform: rotate(180deg); } .fa-rotate-270 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; -webkit-transform: rotate(270deg); -ms-transform: rotate(270deg); transform: rotate(270deg); } .fa-flip-horizontal { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; -webkit-transform: scale(-1, 1); -ms-transform: scale(-1, 1); transform: scale(-1, 1); } .fa-flip-vertical { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; -webkit-transform: scale(1, -1); -ms-transform: scale(1, -1); transform: scale(1, -1); } :root .fa-rotate-90, :root .fa-rotate-180, :root .fa-rotate-270, :root .fa-flip-horizontal, :root .fa-flip-vertical { filter: none; } .fa-stack { position: relative; display: inline-block; width: 2em; height: 2em; line-height: 2em; vertical-align: middle; } .fa-stack-1x, .fa-stack-2x { position: absolute; left: 0; width: 100%; text-align: center; } .fa-stack-1x { line-height: inherit; } .fa-stack-2x { font-size: 2em; } .fa-inverse { color: #ffffff; } /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .fa-glass:before { content: "\f000"; } .fa-music:before { content: "\f001"; } .fa-search:before { content: "\f002"; } .fa-envelope-o:before { content: "\f003"; } .fa-heart:before { content: "\f004"; } .fa-star:before { content: "\f005"; } .fa-star-o:before { content: "\f006"; } .fa-user:before { content: "\f007"; } .fa-film:before { content: "\f008"; } .fa-th-large:before { content: "\f009"; } .fa-th:before { content: "\f00a"; } .fa-th-list:before { content: "\f00b"; } .fa-check:before { content: "\f00c"; } .fa-remove:before, .fa-close:before, .fa-times:before { content: "\f00d"; } .fa-search-plus:before { content: "\f00e"; } .fa-search-minus:before { content: "\f010"; } .fa-power-off:before { content: "\f011"; } .fa-signal:before { content: "\f012"; } .fa-gear:before, .fa-cog:before { content: "\f013"; } .fa-trash-o:before { content: "\f014"; } .fa-home:before { content: "\f015"; } .fa-file-o:before { content: "\f016"; } .fa-clock-o:before { content: "\f017"; } .fa-road:before { content: "\f018"; } .fa-download:before { content: "\f019"; } .fa-arrow-circle-o-down:before { content: "\f01a"; } .fa-arrow-circle-o-up:before { content: "\f01b"; } .fa-inbox:before { content: "\f01c"; } .fa-play-circle-o:before { content: "\f01d"; } .fa-rotate-right:before, .fa-repeat:before { content: "\f01e"; } .fa-refresh:before { content: "\f021"; } .fa-list-alt:before { content: "\f022"; } .fa-lock:before { content: "\f023"; } .fa-flag:before { content: "\f024"; } .fa-headphones:before { content: "\f025"; } .fa-volume-off:before { content: "\f026"; } .fa-volume-down:before { content: "\f027"; } .fa-volume-up:before { content: "\f028"; } .fa-qrcode:before { content: "\f029"; } .fa-barcode:before { content: "\f02a"; } .fa-tag:before { content: "\f02b"; } .fa-tags:before { content: "\f02c"; } .fa-book:before { content: "\f02d"; } .fa-bookmark:before { content: "\f02e"; } .fa-print:before { content: "\f02f"; } .fa-camera:before { content: "\f030"; } .fa-font:before { content: "\f031"; } .fa-bold:before { content: "\f032"; } .fa-italic:before { content: "\f033"; } .fa-text-height:before { content: "\f034"; } .fa-text-width:before { content: "\f035"; } .fa-align-left:before { content: "\f036"; } .fa-align-center:before { content: "\f037"; } .fa-align-right:before { content: "\f038"; } .fa-align-justify:before { content: "\f039"; } .fa-list:before { content: "\f03a"; } .fa-dedent:before, .fa-outdent:before { content: "\f03b"; } .fa-indent:before { content: "\f03c"; } .fa-video-camera:before { content: "\f03d"; } .fa-photo:before, .fa-image:before, .fa-picture-o:before { content: "\f03e"; } .fa-pencil:before { content: "\f040"; } .fa-map-marker:before { content: "\f041"; } .fa-adjust:before { content: "\f042"; } .fa-tint:before { content: "\f043"; } .fa-edit:before, .fa-pencil-square-o:before { content: "\f044"; } .fa-share-square-o:before { content: "\f045"; } .fa-check-square-o:before { content: "\f046"; } .fa-arrows:before { content: "\f047"; } .fa-step-backward:before { content: "\f048"; } .fa-fast-backward:before { content: "\f049"; } .fa-backward:before { content: "\f04a"; } .fa-play:before { content: "\f04b"; } .fa-pause:before { content: "\f04c"; } .fa-stop:before { content: "\f04d"; } .fa-forward:before { content: "\f04e"; } .fa-fast-forward:before { content: "\f050"; } .fa-step-forward:before { content: "\f051"; } .fa-eject:before { content: "\f052"; } .fa-chevron-left:before { content: "\f053"; } .fa-chevron-right:before { content: "\f054"; } .fa-plus-circle:before { content: "\f055"; } .fa-minus-circle:before { content: "\f056"; } .fa-times-circle:before { content: "\f057"; } .fa-check-circle:before { content: "\f058"; } .fa-question-circle:before { content: "\f059"; } .fa-info-circle:before { content: "\f05a"; } .fa-crosshairs:before { content: "\f05b"; } .fa-times-circle-o:before { content: "\f05c"; } .fa-check-circle-o:before { content: "\f05d"; } .fa-ban:before { content: "\f05e"; } .fa-arrow-left:before { content: "\f060"; } .fa-arrow-right:before { content: "\f061"; } .fa-arrow-up:before { content: "\f062"; } .fa-arrow-down:before { content: "\f063"; } .fa-mail-forward:before, .fa-share:before { content: "\f064"; } .fa-expand:before { content: "\f065"; } .fa-compress:before { content: "\f066"; } .fa-plus:before { content: "\f067"; } .fa-minus:before { content: "\f068"; } .fa-asterisk:before { content: "\f069"; } .fa-exclamation-circle:before { content: "\f06a"; } .fa-gift:before { content: "\f06b"; } .fa-leaf:before { content: "\f06c"; } .fa-fire:before { content: "\f06d"; } .fa-eye:before { content: "\f06e"; } .fa-eye-slash:before { content: "\f070"; } .fa-warning:before, .fa-exclamation-triangle:before { content: "\f071"; } .fa-plane:before { content: "\f072"; } .fa-calendar:before { content: "\f073"; } .fa-random:before { content: "\f074"; } .fa-comment:before { content: "\f075"; } .fa-magnet:before { content: "\f076"; } .fa-chevron-up:before { content: "\f077"; } .fa-chevron-down:before { content: "\f078"; } .fa-retweet:before { content: "\f079"; } .fa-shopping-cart:before { content: "\f07a"; } .fa-folder:before { content: "\f07b"; } .fa-folder-open:before { content: "\f07c"; } .fa-arrows-v:before { content: "\f07d"; } .fa-arrows-h:before { content: "\f07e"; } .fa-bar-chart-o:before, .fa-bar-chart:before { content: "\f080"; } .fa-twitter-square:before { content: "\f081"; } .fa-facebook-square:before { content: "\f082"; } .fa-camera-retro:before { content: "\f083"; } .fa-key:before { content: "\f084"; } .fa-gears:before, .fa-cogs:before { content: "\f085"; } .fa-comments:before { content: "\f086"; } .fa-thumbs-o-up:before { content: "\f087"; } .fa-thumbs-o-down:before { content: "\f088"; } .fa-star-half:before { content: "\f089"; } .fa-heart-o:before { content: "\f08a"; } .fa-sign-out:before { content: "\f08b"; } .fa-linkedin-square:before { content: "\f08c"; } .fa-thumb-tack:before { content: "\f08d"; } .fa-external-link:before { content: "\f08e"; } .fa-sign-in:before { content: "\f090"; } .fa-trophy:before { content: "\f091"; } .fa-github-square:before { content: "\f092"; } .fa-upload:before { content: "\f093"; } .fa-lemon-o:before { content: "\f094"; } .fa-phone:before { content: "\f095"; } .fa-square-o:before { content: "\f096"; } .fa-bookmark-o:before { content: "\f097"; } .fa-phone-square:before { content: "\f098"; } .fa-twitter:before { content: "\f099"; } .fa-facebook-f:before, .fa-facebook:before { content: "\f09a"; } .fa-github:before { content: "\f09b"; } .fa-unlock:before { content: "\f09c"; } .fa-credit-card:before { content: "\f09d"; } .fa-feed:before, .fa-rss:before { content: "\f09e"; } .fa-hdd-o:before { content: "\f0a0"; } .fa-bullhorn:before { content: "\f0a1"; } .fa-bell:before { content: "\f0f3"; } .fa-certificate:before { content: "\f0a3"; } .fa-hand-o-right:before { content: "\f0a4"; } .fa-hand-o-left:before { content: "\f0a5"; } .fa-hand-o-up:before { content: "\f0a6"; } .fa-hand-o-down:before { content: "\f0a7"; } .fa-arrow-circle-left:before { content: "\f0a8"; } .fa-arrow-circle-right:before { content: "\f0a9"; } .fa-arrow-circle-up:before { content: "\f0aa"; } .fa-arrow-circle-down:before { content: "\f0ab"; } .fa-globe:before { content: "\f0ac"; } .fa-wrench:before { content: "\f0ad"; } .fa-tasks:before { content: "\f0ae"; } .fa-filter:before { content: "\f0b0"; } .fa-briefcase:before { content: "\f0b1"; } .fa-arrows-alt:before { content: "\f0b2"; } .fa-group:before, .fa-users:before { content: "\f0c0"; } .fa-chain:before, .fa-link:before { content: "\f0c1"; } .fa-cloud:before { content: "\f0c2"; } .fa-flask:before { content: "\f0c3"; } .fa-cut:before, .fa-scissors:before { content: "\f0c4"; } .fa-copy:before, .fa-files-o:before { content: "\f0c5"; } .fa-paperclip:before { content: "\f0c6"; } .fa-save:before, .fa-floppy-o:before { content: "\f0c7"; } .fa-square:before { content: "\f0c8"; } .fa-navicon:before, .fa-reorder:before, .fa-bars:before { content: "\f0c9"; } .fa-list-ul:before { content: "\f0ca"; } .fa-list-ol:before { content: "\f0cb"; } .fa-strikethrough:before { content: "\f0cc"; } .fa-underline:before { content: "\f0cd"; } .fa-table:before { content: "\f0ce"; } .fa-magic:before { content: "\f0d0"; } .fa-truck:before { content: "\f0d1"; } .fa-pinterest:before { content: "\f0d2"; } .fa-pinterest-square:before { content: "\f0d3"; } .fa-google-plus-square:before { content: "\f0d4"; } .fa-google-plus:before { content: "\f0d5"; } .fa-money:before { content: "\f0d6"; } .fa-caret-down:before { content: "\f0d7"; } .fa-caret-up:before { content: "\f0d8"; } .fa-caret-left:before { content: "\f0d9"; } .fa-caret-right:before { content: "\f0da"; } .fa-columns:before { content: "\f0db"; } .fa-unsorted:before, .fa-sort:before { content: "\f0dc"; } .fa-sort-down:before, .fa-sort-desc:before { content: "\f0dd"; } .fa-sort-up:before, .fa-sort-asc:before { content: "\f0de"; } .fa-envelope:before { content: "\f0e0"; } .fa-linkedin:before { content: "\f0e1"; } .fa-rotate-left:before, .fa-undo:before { content: "\f0e2"; } .fa-legal:before, .fa-gavel:before { content: "\f0e3"; } .fa-dashboard:before, .fa-tachometer:before { content: "\f0e4"; } .fa-comment-o:before { content: "\f0e5"; } .fa-comments-o:before { content: "\f0e6"; } .fa-flash:before, .fa-bolt:before { content: "\f0e7"; } .fa-sitemap:before { content: "\f0e8"; } .fa-umbrella:before { content: "\f0e9"; } .fa-paste:before, .fa-clipboard:before { content: "\f0ea"; } .fa-lightbulb-o:before { content: "\f0eb"; } .fa-exchange:before { content: "\f0ec"; } .fa-cloud-download:before { content: "\f0ed"; } .fa-cloud-upload:before { content: "\f0ee"; } .fa-user-md:before { content: "\f0f0"; } .fa-stethoscope:before { content: "\f0f1"; } .fa-suitcase:before { content: "\f0f2"; } .fa-bell-o:before { content: "\f0a2"; } .fa-coffee:before { content: "\f0f4"; } .fa-cutlery:before { content: "\f0f5"; } .fa-file-text-o:before { content: "\f0f6"; } .fa-building-o:before { content: "\f0f7"; } .fa-hospital-o:before { content: "\f0f8"; } .fa-ambulance:before { content: "\f0f9"; } .fa-medkit:before { content: "\f0fa"; } .fa-fighter-jet:before { content: "\f0fb"; } .fa-beer:before { content: "\f0fc"; } .fa-h-square:before { content: "\f0fd"; } .fa-plus-square:before { content: "\f0fe"; } .fa-angle-double-left:before { content: "\f100"; } .fa-angle-double-right:before { content: "\f101"; } .fa-angle-double-up:before { content: "\f102"; } .fa-angle-double-down:before { content: "\f103"; } .fa-angle-left:before { content: "\f104"; } .fa-angle-right:before { content: "\f105"; } .fa-angle-up:before { content: "\f106"; } .fa-angle-down:before { content: "\f107"; } .fa-desktop:before { content: "\f108"; } .fa-laptop:before { content: "\f109"; } .fa-tablet:before { content: "\f10a"; } .fa-mobile-phone:before, .fa-mobile:before { content: "\f10b"; } .fa-circle-o:before { content: "\f10c"; } .fa-quote-left:before { content: "\f10d"; } .fa-quote-right:before { content: "\f10e"; } .fa-spinner:before { content: "\f110"; } .fa-circle:before { content: "\f111"; } .fa-mail-reply:before, .fa-reply:before { content: "\f112"; } .fa-github-alt:before { content: "\f113"; } .fa-folder-o:before { content: "\f114"; } .fa-folder-open-o:before { content: "\f115"; } .fa-smile-o:before { content: "\f118"; } .fa-frown-o:before { content: "\f119"; } .fa-meh-o:before { content: "\f11a"; } .fa-gamepad:before { content: "\f11b"; } .fa-keyboard-o:before { content: "\f11c"; } .fa-flag-o:before { content: "\f11d"; } .fa-flag-checkered:before { content: "\f11e"; } .fa-terminal:before { content: "\f120"; } .fa-code:before { content: "\f121"; } .fa-mail-reply-all:before, .fa-reply-all:before { content: "\f122"; } .fa-star-half-empty:before, .fa-star-half-full:before, .fa-star-half-o:before { content: "\f123"; } .fa-location-arrow:before { content: "\f124"; } .fa-crop:before { content: "\f125"; } .fa-code-fork:before { content: "\f126"; } .fa-unlink:before, .fa-chain-broken:before { content: "\f127"; } .fa-question:before { content: "\f128"; } .fa-info:before { content: "\f129"; } .fa-exclamation:before { content: "\f12a"; } .fa-superscript:before { content: "\f12b"; } .fa-subscript:before { content: "\f12c"; } .fa-eraser:before { content: "\f12d"; } .fa-puzzle-piece:before { content: "\f12e"; } .fa-microphone:before { content: "\f130"; } .fa-microphone-slash:before { content: "\f131"; } .fa-shield:before { content: "\f132"; } .fa-calendar-o:before { content: "\f133"; } .fa-fire-extinguisher:before { content: "\f134"; } .fa-rocket:before { content: "\f135"; } .fa-maxcdn:before { content: "\f136"; } .fa-chevron-circle-left:before { content: "\f137"; } .fa-chevron-circle-right:before { content: "\f138"; } .fa-chevron-circle-up:before { content: "\f139"; } .fa-chevron-circle-down:before { content: "\f13a"; } .fa-html5:before { content: "\f13b"; } .fa-css3:before { content: "\f13c"; } .fa-anchor:before { content: "\f13d"; } .fa-unlock-alt:before { content: "\f13e"; } .fa-bullseye:before { content: "\f140"; } .fa-ellipsis-h:before { content: "\f141"; } .fa-ellipsis-v:before { content: "\f142"; } .fa-rss-square:before { content: "\f143"; } .fa-play-circle:before { content: "\f144"; } .fa-ticket:before { content: "\f145"; } .fa-minus-square:before { content: "\f146"; } .fa-minus-square-o:before { content: "\f147"; } .fa-level-up:before { content: "\f148"; } .fa-level-down:before { content: "\f149"; } .fa-check-square:before { content: "\f14a"; } .fa-pencil-square:before { content: "\f14b"; } .fa-external-link-square:before { content: "\f14c"; } .fa-share-square:before { content: "\f14d"; } .fa-compass:before { content: "\f14e"; } .fa-toggle-down:before, .fa-caret-square-o-down:before { content: "\f150"; } .fa-toggle-up:before, .fa-caret-square-o-up:before { content: "\f151"; } .fa-toggle-right:before, .fa-caret-square-o-right:before { content: "\f152"; } .fa-euro:before, .fa-eur:before { content: "\f153"; } .fa-gbp:before { content: "\f154"; } .fa-dollar:before, .fa-usd:before { content: "\f155"; } .fa-rupee:before, .fa-inr:before { content: "\f156"; } .fa-cny:before, .fa-rmb:before, .fa-yen:before, .fa-jpy:before { content: "\f157"; } .fa-ruble:before, .fa-rouble:before, .fa-rub:before { content: "\f158"; } .fa-won:before, .fa-krw:before { content: "\f159"; } .fa-bitcoin:before, .fa-btc:before { content: "\f15a"; } .fa-file:before { content: "\f15b"; } .fa-file-text:before { content: "\f15c"; } .fa-sort-alpha-asc:before { content: "\f15d"; } .fa-sort-alpha-desc:before { content: "\f15e"; } .fa-sort-amount-asc:before { content: "\f160"; } .fa-sort-amount-desc:before { content: "\f161"; } .fa-sort-numeric-asc:before { content: "\f162"; } .fa-sort-numeric-desc:before { content: "\f163"; } .fa-thumbs-up:before { content: "\f164"; } .fa-thumbs-down:before { content: "\f165"; } .fa-youtube-square:before { content: "\f166"; } .fa-youtube:before { content: "\f167"; } .fa-xing:before { content: "\f168"; } .fa-xing-square:before { content: "\f169"; } .fa-youtube-play:before { content: "\f16a"; } .fa-dropbox:before { content: "\f16b"; } .fa-stack-overflow:before { content: "\f16c"; } .fa-instagram:before { content: "\f16d"; } .fa-flickr:before { content: "\f16e"; } .fa-adn:before { content: "\f170"; } .fa-bitbucket:before { content: "\f171"; } .fa-bitbucket-square:before { content: "\f172"; } .fa-tumblr:before { content: "\f173"; } .fa-tumblr-square:before { content: "\f174"; } .fa-long-arrow-down:before { content: "\f175"; } .fa-long-arrow-up:before { content: "\f176"; } .fa-long-arrow-left:before { content: "\f177"; } .fa-long-arrow-right:before { content: "\f178"; } .fa-apple:before { content: "\f179"; } .fa-windows:before { content: "\f17a"; } .fa-android:before { content: "\f17b"; } .fa-linux:before { content: "\f17c"; } .fa-dribbble:before { content: "\f17d"; } .fa-skype:before { content: "\f17e"; } .fa-foursquare:before { content: "\f180"; } .fa-trello:before { content: "\f181"; } .fa-female:before { content: "\f182"; } .fa-male:before { content: "\f183"; } .fa-gittip:before, .fa-gratipay:before { content: "\f184"; } .fa-sun-o:before { content: "\f185"; } .fa-moon-o:before { content: "\f186"; } .fa-archive:before { content: "\f187"; } .fa-bug:before { content: "\f188"; } .fa-vk:before { content: "\f189"; } .fa-weibo:before { content: "\f18a"; } .fa-renren:before { content: "\f18b"; } .fa-pagelines:before { content: "\f18c"; } .fa-stack-exchange:before { content: "\f18d"; } .fa-arrow-circle-o-right:before { content: "\f18e"; } .fa-arrow-circle-o-left:before { content: "\f190"; } .fa-toggle-left:before, .fa-caret-square-o-left:before { content: "\f191"; } .fa-dot-circle-o:before { content: "\f192"; } .fa-wheelchair:before { content: "\f193"; } .fa-vimeo-square:before { content: "\f194"; } .fa-turkish-lira:before, .fa-try:before { content: "\f195"; } .fa-plus-square-o:before { content: "\f196"; } .fa-space-shuttle:before { content: "\f197"; } .fa-slack:before { content: "\f198"; } .fa-envelope-square:before { content: "\f199"; } .fa-wordpress:before { content: "\f19a"; } .fa-openid:before { content: "\f19b"; } .fa-institution:before, .fa-bank:before, .fa-university:before { content: "\f19c"; } .fa-mortar-board:before, .fa-graduation-cap:before { content: "\f19d"; } .fa-yahoo:before { content: "\f19e"; } .fa-google:before { content: "\f1a0"; } .fa-reddit:before { content: "\f1a1"; } .fa-reddit-square:before { content: "\f1a2"; } .fa-stumbleupon-circle:before { content: "\f1a3"; } .fa-stumbleupon:before { content: "\f1a4"; } .fa-delicious:before { content: "\f1a5"; } .fa-digg:before { content: "\f1a6"; } .fa-pied-piper-pp:before { content: "\f1a7"; } .fa-pied-piper-alt:before { content: "\f1a8"; } .fa-drupal:before { content: "\f1a9"; } .fa-joomla:before { content: "\f1aa"; } .fa-language:before { content: "\f1ab"; } .fa-fax:before { content: "\f1ac"; } .fa-building:before { content: "\f1ad"; } .fa-child:before { content: "\f1ae"; } .fa-paw:before { content: "\f1b0"; } .fa-spoon:before { content: "\f1b1"; } .fa-cube:before { content: "\f1b2"; } .fa-cubes:before { content: "\f1b3"; } .fa-behance:before { content: "\f1b4"; } .fa-behance-square:before { content: "\f1b5"; } .fa-steam:before { content: "\f1b6"; } .fa-steam-square:before { content: "\f1b7"; } .fa-recycle:before { content: "\f1b8"; } .fa-automobile:before, .fa-car:before { content: "\f1b9"; } .fa-cab:before, .fa-taxi:before { content: "\f1ba"; } .fa-tree:before { content: "\f1bb"; } .fa-spotify:before { content: "\f1bc"; } .fa-deviantart:before { content: "\f1bd"; } .fa-soundcloud:before { content: "\f1be"; } .fa-database:before { content: "\f1c0"; } .fa-file-pdf-o:before { content: "\f1c1"; } .fa-file-word-o:before { content: "\f1c2"; } .fa-file-excel-o:before { content: "\f1c3"; } .fa-file-powerpoint-o:before { content: "\f1c4"; } .fa-file-photo-o:before, .fa-file-picture-o:before, .fa-file-image-o:before { content: "\f1c5"; } .fa-file-zip-o:before, .fa-file-archive-o:before { content: "\f1c6"; } .fa-file-sound-o:before, .fa-file-audio-o:before { content: "\f1c7"; } .fa-file-movie-o:before, .fa-file-video-o:before { content: "\f1c8"; } .fa-file-code-o:before { content: "\f1c9"; } .fa-vine:before { content: "\f1ca"; } .fa-codepen:before { content: "\f1cb"; } .fa-jsfiddle:before { content: "\f1cc"; } .fa-life-bouy:before, .fa-life-buoy:before, .fa-life-saver:before, .fa-support:before, .fa-life-ring:before { content: "\f1cd"; } .fa-circle-o-notch:before { content: "\f1ce"; } .fa-ra:before, .fa-resistance:before, .fa-rebel:before { content: "\f1d0"; } .fa-ge:before, .fa-empire:before { content: "\f1d1"; } .fa-git-square:before { content: "\f1d2"; } .fa-git:before { content: "\f1d3"; } .fa-y-combinator-square:before, .fa-yc-square:before, .fa-hacker-news:before { content: "\f1d4"; } .fa-tencent-weibo:before { content: "\f1d5"; } .fa-qq:before { content: "\f1d6"; } .fa-wechat:before, .fa-weixin:before { content: "\f1d7"; } .fa-send:before, .fa-paper-plane:before { content: "\f1d8"; } .fa-send-o:before, .fa-paper-plane-o:before { content: "\f1d9"; } .fa-history:before { content: "\f1da"; } .fa-circle-thin:before { content: "\f1db"; } .fa-header:before { content: "\f1dc"; } .fa-paragraph:before { content: "\f1dd"; } .fa-sliders:before { content: "\f1de"; } .fa-share-alt:before { content: "\f1e0"; } .fa-share-alt-square:before { content: "\f1e1"; } .fa-bomb:before { content: "\f1e2"; } .fa-soccer-ball-o:before, .fa-futbol-o:before { content: "\f1e3"; } .fa-tty:before { content: "\f1e4"; } .fa-binoculars:before { content: "\f1e5"; } .fa-plug:before { content: "\f1e6"; } .fa-slideshare:before { content: "\f1e7"; } .fa-twitch:before { content: "\f1e8"; } .fa-yelp:before { content: "\f1e9"; } .fa-newspaper-o:before { content: "\f1ea"; } .fa-wifi:before { content: "\f1eb"; } .fa-calculator:before { content: "\f1ec"; } .fa-paypal:before { content: "\f1ed"; } .fa-google-wallet:before { content: "\f1ee"; } .fa-cc-visa:before { content: "\f1f0"; } .fa-cc-mastercard:before { content: "\f1f1"; } .fa-cc-discover:before { content: "\f1f2"; } .fa-cc-amex:before { content: "\f1f3"; } .fa-cc-paypal:before { content: "\f1f4"; } .fa-cc-stripe:before { content: "\f1f5"; } .fa-bell-slash:before { content: "\f1f6"; } .fa-bell-slash-o:before { content: "\f1f7"; } .fa-trash:before { content: "\f1f8"; } .fa-copyright:before { content: "\f1f9"; } .fa-at:before { content: "\f1fa"; } .fa-eyedropper:before { content: "\f1fb"; } .fa-paint-brush:before { content: "\f1fc"; } .fa-birthday-cake:before { content: "\f1fd"; } .fa-area-chart:before { content: "\f1fe"; } .fa-pie-chart:before { content: "\f200"; } .fa-line-chart:before { content: "\f201"; } .fa-lastfm:before { content: "\f202"; } .fa-lastfm-square:before { content: "\f203"; } .fa-toggle-off:before { content: "\f204"; } .fa-toggle-on:before { content: "\f205"; } .fa-bicycle:before { content: "\f206"; } .fa-bus:before { content: "\f207"; } .fa-ioxhost:before { content: "\f208"; } .fa-angellist:before { content: "\f209"; } .fa-cc:before { content: "\f20a"; } .fa-shekel:before, .fa-sheqel:before, .fa-ils:before { content: "\f20b"; } .fa-meanpath:before { content: "\f20c"; } .fa-buysellads:before { content: "\f20d"; } .fa-connectdevelop:before { content: "\f20e"; } .fa-dashcube:before { content: "\f210"; } .fa-forumbee:before { content: "\f211"; } .fa-leanpub:before { content: "\f212"; } .fa-sellsy:before { content: "\f213"; } .fa-shirtsinbulk:before { content: "\f214"; } .fa-simplybuilt:before { content: "\f215"; } .fa-skyatlas:before { content: "\f216"; } .fa-cart-plus:before { content: "\f217"; } .fa-cart-arrow-down:before { content: "\f218"; } .fa-diamond:before { content: "\f219"; } .fa-ship:before { content: "\f21a"; } .fa-user-secret:before { content: "\f21b"; } .fa-motorcycle:before { content: "\f21c"; } .fa-street-view:before { content: "\f21d"; } .fa-heartbeat:before { content: "\f21e"; } .fa-venus:before { content: "\f221"; } .fa-mars:before { content: "\f222"; } .fa-mercury:before { content: "\f223"; } .fa-intersex:before, .fa-transgender:before { content: "\f224"; } .fa-transgender-alt:before { content: "\f225"; } .fa-venus-double:before { content: "\f226"; } .fa-mars-double:before { content: "\f227"; } .fa-venus-mars:before { content: "\f228"; } .fa-mars-stroke:before { content: "\f229"; } .fa-mars-stroke-v:before { content: "\f22a"; } .fa-mars-stroke-h:before { content: "\f22b"; } .fa-neuter:before { content: "\f22c"; } .fa-genderless:before { content: "\f22d"; } .fa-facebook-official:before { content: "\f230"; } .fa-pinterest-p:before { content: "\f231"; } .fa-whatsapp:before { content: "\f232"; } .fa-server:before { content: "\f233"; } .fa-user-plus:before { content: "\f234"; } .fa-user-times:before { content: "\f235"; } .fa-hotel:before, .fa-bed:before { content: "\f236"; } .fa-viacoin:before { content: "\f237"; } .fa-train:before { content: "\f238"; } .fa-subway:before { content: "\f239"; } .fa-medium:before { content: "\f23a"; } .fa-yc:before, .fa-y-combinator:before { content: "\f23b"; } .fa-optin-monster:before { content: "\f23c"; } .fa-opencart:before { content: "\f23d"; } .fa-expeditedssl:before { content: "\f23e"; } .fa-battery-4:before, .fa-battery:before, .fa-battery-full:before { content: "\f240"; } .fa-battery-3:before, .fa-battery-three-quarters:before { content: "\f241"; } .fa-battery-2:before, .fa-battery-half:before { content: "\f242"; } .fa-battery-1:before, .fa-battery-quarter:before { content: "\f243"; } .fa-battery-0:before, .fa-battery-empty:before { content: "\f244"; } .fa-mouse-pointer:before { content: "\f245"; } .fa-i-cursor:before { content: "\f246"; } .fa-object-group:before { content: "\f247"; } .fa-object-ungroup:before { content: "\f248"; } .fa-sticky-note:before { content: "\f249"; } .fa-sticky-note-o:before { content: "\f24a"; } .fa-cc-jcb:before { content: "\f24b"; } .fa-cc-diners-club:before { content: "\f24c"; } .fa-clone:before { content: "\f24d"; } .fa-balance-scale:before { content: "\f24e"; } .fa-hourglass-o:before { content: "\f250"; } .fa-hourglass-1:before, .fa-hourglass-start:before { content: "\f251"; } .fa-hourglass-2:before, .fa-hourglass-half:before { content: "\f252"; } .fa-hourglass-3:before, .fa-hourglass-end:before { content: "\f253"; } .fa-hourglass:before { content: "\f254"; } .fa-hand-grab-o:before, .fa-hand-rock-o:before { content: "\f255"; } .fa-hand-stop-o:before, .fa-hand-paper-o:before { content: "\f256"; } .fa-hand-scissors-o:before { content: "\f257"; } .fa-hand-lizard-o:before { content: "\f258"; } .fa-hand-spock-o:before { content: "\f259"; } .fa-hand-pointer-o:before { content: "\f25a"; } .fa-hand-peace-o:before { content: "\f25b"; } .fa-trademark:before { content: "\f25c"; } .fa-registered:before { content: "\f25d"; } .fa-creative-commons:before { content: "\f25e"; } .fa-gg:before { content: "\f260"; } .fa-gg-circle:before { content: "\f261"; } .fa-tripadvisor:before { content: "\f262"; } .fa-odnoklassniki:before { content: "\f263"; } .fa-odnoklassniki-square:before { content: "\f264"; } .fa-get-pocket:before { content: "\f265"; } .fa-wikipedia-w:before { content: "\f266"; } .fa-safari:before { content: "\f267"; } .fa-chrome:before { content: "\f268"; } .fa-firefox:before { content: "\f269"; } .fa-opera:before { content: "\f26a"; } .fa-internet-explorer:before { content: "\f26b"; } .fa-tv:before, .fa-television:before { content: "\f26c"; } .fa-contao:before { content: "\f26d"; } .fa-500px:before { content: "\f26e"; } .fa-amazon:before { content: "\f270"; } .fa-calendar-plus-o:before { content: "\f271"; } .fa-calendar-minus-o:before { content: "\f272"; } .fa-calendar-times-o:before { content: "\f273"; } .fa-calendar-check-o:before { content: "\f274"; } .fa-industry:before { content: "\f275"; } .fa-map-pin:before { content: "\f276"; } .fa-map-signs:before { content: "\f277"; } .fa-map-o:before { content: "\f278"; } .fa-map:before { content: "\f279"; } .fa-commenting:before { content: "\f27a"; } .fa-commenting-o:before { content: "\f27b"; } .fa-houzz:before { content: "\f27c"; } .fa-vimeo:before { content: "\f27d"; } .fa-black-tie:before { content: "\f27e"; } .fa-fonticons:before { content: "\f280"; } .fa-reddit-alien:before { content: "\f281"; } .fa-edge:before { content: "\f282"; } .fa-credit-card-alt:before { content: "\f283"; } .fa-codiepie:before { content: "\f284"; } .fa-modx:before { content: "\f285"; } .fa-fort-awesome:before { content: "\f286"; } .fa-usb:before { content: "\f287"; } .fa-product-hunt:before { content: "\f288"; } .fa-mixcloud:before { content: "\f289"; } .fa-scribd:before { content: "\f28a"; } .fa-pause-circle:before { content: "\f28b"; } .fa-pause-circle-o:before { content: "\f28c"; } .fa-stop-circle:before { content: "\f28d"; } .fa-stop-circle-o:before { content: "\f28e"; } .fa-shopping-bag:before { content: "\f290"; } .fa-shopping-basket:before { content: "\f291"; } .fa-hashtag:before { content: "\f292"; } .fa-bluetooth:before { content: "\f293"; } .fa-bluetooth-b:before { content: "\f294"; } .fa-percent:before { content: "\f295"; } .fa-gitlab:before { content: "\f296"; } .fa-wpbeginner:before { content: "\f297"; } .fa-wpforms:before { content: "\f298"; } .fa-envira:before { content: "\f299"; } .fa-universal-access:before { content: "\f29a"; } .fa-wheelchair-alt:before { content: "\f29b"; } .fa-question-circle-o:before { content: "\f29c"; } .fa-blind:before { content: "\f29d"; } .fa-audio-description:before { content: "\f29e"; } .fa-volume-control-phone:before { content: "\f2a0"; } .fa-braille:before { content: "\f2a1"; } .fa-assistive-listening-systems:before { content: "\f2a2"; } .fa-asl-interpreting:before, .fa-american-sign-language-interpreting:before { content: "\f2a3"; } .fa-deafness:before, .fa-hard-of-hearing:before, .fa-deaf:before { content: "\f2a4"; } .fa-glide:before { content: "\f2a5"; } .fa-glide-g:before { content: "\f2a6"; } .fa-signing:before, .fa-sign-language:before { content: "\f2a7"; } .fa-low-vision:before { content: "\f2a8"; } .fa-viadeo:before { content: "\f2a9"; } .fa-viadeo-square:before { content: "\f2aa"; } .fa-snapchat:before { content: "\f2ab"; } .fa-snapchat-ghost:before { content: "\f2ac"; } .fa-snapchat-square:before { content: "\f2ad"; } .fa-pied-piper:before { content: "\f2ae"; } .fa-first-order:before { content: "\f2b0"; } .fa-yoast:before { content: "\f2b1"; } .fa-themeisle:before { content: "\f2b2"; } .fa-google-plus-circle:before, .fa-google-plus-official:before { content: "\f2b3"; } .fa-fa:before, .fa-font-awesome:before { content: "\f2b4"; } .fa-handshake-o:before { content: "\f2b5"; } .fa-envelope-open:before { content: "\f2b6"; } .fa-envelope-open-o:before { content: "\f2b7"; } .fa-linode:before { content: "\f2b8"; } .fa-address-book:before { content: "\f2b9"; } .fa-address-book-o:before { content: "\f2ba"; } .fa-vcard:before, .fa-address-card:before { content: "\f2bb"; } .fa-vcard-o:before, .fa-address-card-o:before { content: "\f2bc"; } .fa-user-circle:before { content: "\f2bd"; } .fa-user-circle-o:before { content: "\f2be"; } .fa-user-o:before { content: "\f2c0"; } .fa-id-badge:before { content: "\f2c1"; } .fa-drivers-license:before, .fa-id-card:before { content: "\f2c2"; } .fa-drivers-license-o:before, .fa-id-card-o:before { content: "\f2c3"; } .fa-quora:before { content: "\f2c4"; } .fa-free-code-camp:before { content: "\f2c5"; } .fa-telegram:before { content: "\f2c6"; } .fa-thermometer-4:before, .fa-thermometer:before, .fa-thermometer-full:before { content: "\f2c7"; } .fa-thermometer-3:before, .fa-thermometer-three-quarters:before { content: "\f2c8"; } .fa-thermometer-2:before, .fa-thermometer-half:before { content: "\f2c9"; } .fa-thermometer-1:before, .fa-thermometer-quarter:before { content: "\f2ca"; } .fa-thermometer-0:before, .fa-thermometer-empty:before { content: "\f2cb"; } .fa-shower:before { content: "\f2cc"; } .fa-bathtub:before, .fa-s15:before, .fa-bath:before { content: "\f2cd"; } .fa-podcast:before { content: "\f2ce"; } .fa-window-maximize:before { content: "\f2d0"; } .fa-window-minimize:before { content: "\f2d1"; } .fa-window-restore:before { content: "\f2d2"; } .fa-times-rectangle:before, .fa-window-close:before { content: "\f2d3"; } .fa-times-rectangle-o:before, .fa-window-close-o:before { content: "\f2d4"; } .fa-bandcamp:before { content: "\f2d5"; } .fa-grav:before { content: "\f2d6"; } .fa-etsy:before { content: "\f2d7"; } .fa-imdb:before { content: "\f2d8"; } .fa-ravelry:before { content: "\f2d9"; } .fa-eercast:before { content: "\f2da"; } .fa-microchip:before { content: "\f2db"; } .fa-snowflake-o:before { content: "\f2dc"; } .fa-superpowers:before { content: "\f2dd"; } .fa-wpexplorer:before { content: "\f2de"; } .fa-meetup:before { content: "\f2e0"; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } .sr-only-focusable:active, .sr-only-focusable:focus { position: static; width: auto; height: auto; margin: 0; overflow: visible; clip: auto; } ================================================ FILE: source/lib/jquery/.bower.json ================================================ { "name": "jquery", "_cacheHeaders": { "ETag": "\"5492efef-14960\"", "Last-Modified": "Thu, 18 Dec 2014 15:17:03 GMT", "Content-Length": "84320", "Content-Type": "application/x-javascript" }, "_release": "e-tag:5492efef-", "main": "index.js", "_source": "http://code.jquery.com/jquery-2.1.3.min.js", "_target": "*", "_originalSource": "http://code.jquery.com/jquery-2.1.3.min.js", "_direct": true } ================================================ FILE: source/lib/jquery/index.js ================================================ /*! jQuery v2.1.3 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.3",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=hb(),z=hb(),A=hb(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},eb=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fb){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function gb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+rb(o[l]);w=ab.test(a)&&pb(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function hb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ib(a){return a[u]=!0,a}function jb(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function kb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function lb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function nb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function ob(a){return ib(function(b){return b=+b,ib(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pb(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=gb.support={},f=gb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=gb.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",eb,!1):e.attachEvent&&e.attachEvent("onunload",eb)),p=!f(g),c.attributes=jb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=jb(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=jb(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(jb(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),jb(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&jb(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return lb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?lb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},gb.matches=function(a,b){return gb(a,null,null,b)},gb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return gb(b,n,null,[a]).length>0},gb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},gb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},gb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},gb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=gb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=gb.selectors={cacheLength:50,createPseudo:ib,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||gb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&gb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=gb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||gb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ib(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ib(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ib(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ib(function(a){return function(b){return gb(a,b).length>0}}),contains:ib(function(a){return a=a.replace(cb,db),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ib(function(a){return W.test(a||"")||gb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:ob(function(){return[0]}),last:ob(function(a,b){return[b-1]}),eq:ob(function(a,b,c){return[0>c?c+b:c]}),even:ob(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:ob(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:ob(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:ob(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function tb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ub(a,b,c){for(var d=0,e=b.length;e>d;d++)gb(a,b[d],c);return c}function vb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wb(a,b,c,d,e,f){return d&&!d[u]&&(d=wb(d)),e&&!e[u]&&(e=wb(e,f)),ib(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ub(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:vb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=vb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=vb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sb(function(a){return a===b},h,!0),l=sb(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sb(tb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wb(i>1&&tb(m),i>1&&rb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xb(a.slice(i,e)),f>e&&xb(a=a.slice(e)),f>e&&rb(a))}m.push(c)}return tb(m)}function yb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=vb(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&gb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ib(f):f}return h=gb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,yb(e,d)),f.selector=a}return f},i=gb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&pb(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&rb(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&pb(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=jb(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),jb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||kb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&jb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||kb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),jb(function(a){return null==a.getAttribute("disabled")})||kb(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),gb}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c) },removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*\s*$/g,ib={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n("