mirror of https://github.com/Nofated095/blog
Delete themes/icarus directory
This commit is contained in:
parent
e68dbd9800
commit
759ca14177
|
@ -1 +0,0 @@
|
||||||
node_modules/
|
|
|
@ -1,68 +0,0 @@
|
||||||
{
|
|
||||||
"extends": [
|
|
||||||
"hexo",
|
|
||||||
"plugin:react/recommended",
|
|
||||||
"plugin:json/recommended"
|
|
||||||
],
|
|
||||||
"settings": {
|
|
||||||
"node": {
|
|
||||||
"tryExtensions": [
|
|
||||||
".js",
|
|
||||||
".jsx",
|
|
||||||
".json"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"react": {
|
|
||||||
"version": "16.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"parserOptions": {
|
|
||||||
"ecmaFeatures": {
|
|
||||||
"jsx": true
|
|
||||||
},
|
|
||||||
"sourceType": "module"
|
|
||||||
},
|
|
||||||
"plugins": [
|
|
||||||
"react"
|
|
||||||
],
|
|
||||||
"rules": {
|
|
||||||
"react/jsx-uses-vars": "error",
|
|
||||||
"indent": [
|
|
||||||
"error",
|
|
||||||
4,
|
|
||||||
{
|
|
||||||
"SwitchCase": 1
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"react/no-unknown-property": [
|
|
||||||
"error",
|
|
||||||
{
|
|
||||||
"ignore": [
|
|
||||||
"class",
|
|
||||||
"onclick",
|
|
||||||
"onload",
|
|
||||||
"onsubmit",
|
|
||||||
"crossorigin"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"react/react-in-jsx-scope": [
|
|
||||||
"off"
|
|
||||||
],
|
|
||||||
"react/prop-types": [
|
|
||||||
"off"
|
|
||||||
],
|
|
||||||
"react/display-name": [
|
|
||||||
"off"
|
|
||||||
],
|
|
||||||
"react/jsx-key": [
|
|
||||||
"off"
|
|
||||||
],
|
|
||||||
"react/jsx-no-target-blank": [
|
|
||||||
"error",
|
|
||||||
{
|
|
||||||
"allowReferrer": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
---
|
|
||||||
name: Bug反馈
|
|
||||||
about: 请按照模板填写Bug反馈,否则你的Issue可能会被直接关闭。
|
|
||||||
title: [Bug] 问题概述
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
> 确保你在提交Bug反馈之前仔细阅读了[Hexo文档](https://hexo.io/zh-cn/),[Icarus用户指南](https://ppoffice.github.io/hexo-theme-icarus/tags/Icarus%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/),和[GitHub issues](https://github.com/ppoffice/hexo-theme-icarus/issues)来了解你的问题是否已经被他人提出过。
|
|
||||||
|
|
||||||
**Bug描述**
|
|
||||||
简洁清晰地描述你遇到的Bug是什么。
|
|
||||||
|
|
||||||
**系统与环境**
|
|
||||||
列出你的Hexo和Icarus的版本和配置。
|
|
||||||
|
|
||||||
- Hexo,操作系统,和Node.js的版本(使用`hexo version`命令来查看)
|
|
||||||
- 站点配置文件`_config.yml`
|
|
||||||
- 主题配置文件`_config.icarus.yml`或`themes/icarus/_config.yml`
|
|
||||||
- 其他额外的配置文件(文章front-matter,`_config.post.yml`,或`_config.page.yml`)
|
|
||||||
- 浏览器版本(如Firefox 70.0,Chrome Android 80.0)
|
|
||||||
|
|
||||||
**复现方式**
|
|
||||||
列出复现这个Bug的步骤,如:
|
|
||||||
|
|
||||||
1. 访问‘...’
|
|
||||||
2. 点击’...‘
|
|
||||||
3. 下拉到‘...’
|
|
||||||
4. 出现‘...’的错误
|
|
||||||
|
|
||||||
**期望行为**
|
|
||||||
简洁清晰地描述没有这个情况下你期望得到的结果。
|
|
||||||
|
|
||||||
**截图**
|
|
||||||
如果可以的话,请附上几张截图来帮助说明你遇到的问题。
|
|
||||||
|
|
||||||
**额外上下文**
|
|
||||||
附上与问题有关的其他上下文信息。
|
|
|
@ -1,39 +0,0 @@
|
||||||
---
|
|
||||||
name: Bug Report
|
|
||||||
about: Please follow this template if you are reporting a bug, or your issue may be closed without further notice.
|
|
||||||
title: [Bug] Bug summary
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
> Make sure you go through the [Hexo docs](https://hexo.io), [Icarus user manual](https://ppoffice.github.io/hexo-theme-icarus/tags/Icarus-User-Guide/), and [GitHub issues](https://github.com/ppoffice/hexo-theme-icarus/issues) to see if the bug you are reporting has been already addressed by others.
|
|
||||||
|
|
||||||
**Describe the bug**
|
|
||||||
A clear and concise description of what the bug is.
|
|
||||||
|
|
||||||
**System and Environment**
|
|
||||||
The version and configuration of Hexo and Icarus.
|
|
||||||
|
|
||||||
- Hexo, OS, and node version (use `hexo version` command to view these information)
|
|
||||||
- Site configuration file `_config.yml`
|
|
||||||
- Theme configuration file `_config.icarus.yml` or `themes/icarus/_config.yml`
|
|
||||||
- Any additional theme configuration files (post front-matter, `_config.post.yml`, or `_config.page.yml`)
|
|
||||||
- Browser and version (e.g., Firefox 70.0, Chrome Android 80.0)
|
|
||||||
|
|
||||||
**To Reproduce**
|
|
||||||
Steps to reproduce the behavior, such as:
|
|
||||||
|
|
||||||
1. Go to '...'
|
|
||||||
2. Click on '...'
|
|
||||||
3. Scroll down to '...'
|
|
||||||
4. '...' error appears
|
|
||||||
|
|
||||||
**Expected behavior**
|
|
||||||
A clear and concise description of what you expected to happen.
|
|
||||||
|
|
||||||
**Screenshots**
|
|
||||||
If applicable, add screenshots to help explain your problem.
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
Add any other context about the problem here.
|
|
|
@ -1,20 +0,0 @@
|
||||||
blank_issues_enabled: false
|
|
||||||
contact_links:
|
|
||||||
- name: Gitter
|
|
||||||
url: https://gitter.im/hexo-theme-icarus/community
|
|
||||||
about: Redirect your Icarus usage questions to Gitter.
|
|
||||||
- name: Gitter
|
|
||||||
url: https://gitter.im/hexo-theme-icarus/community
|
|
||||||
about: 与Icarus使用相关的问题请转至这里。
|
|
||||||
- name: Bug Report
|
|
||||||
url: https://github.com/ppoffice/hexo-theme-icarus/issues/new?template=bug_report.md
|
|
||||||
about: Please follow this template if you are reporting a bug, or your issue may be closed without further notice.
|
|
||||||
- name: Bug反馈
|
|
||||||
url: https://github.com/ppoffice/hexo-theme-icarus/issues/new?template=Bug反馈.md
|
|
||||||
about: 请按照模板填写Bug反馈,否则你的Issue可能会被直接关闭。
|
|
||||||
- name: Feature Request
|
|
||||||
url: https://github.com/ppoffice/hexo-theme-icarus/issues/new?template=feature_request.md
|
|
||||||
about: Please follow this template if you are requesting a new feature, or your issue may be closed without further notice.
|
|
||||||
- name: 功能建议
|
|
||||||
url: https://github.com/ppoffice/hexo-theme-icarus/issues/new?template=功能建议.md
|
|
||||||
about: 请按照模板填写功能建议,否则你的Issue可能会被直接关闭。
|
|
|
@ -1,26 +0,0 @@
|
||||||
---
|
|
||||||
name: Feature Request
|
|
||||||
about: Please follow this template if you are requesting a new feature, or your issue may be closed without further notice.
|
|
||||||
title: [FEAT] Feature request summary
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
> Make sure you go through the [Hexo docs](https://hexo.io), [Icarus user manual](https://ppoffice.github.io/hexo-theme-icarus/tags/Icarus-User-Guide/), and [GitHub issues](https://github.com/ppoffice/hexo-theme-icarus/issues) to see if the feature you are requesting has been already addressed by others.
|
|
||||||
|
|
||||||
**Is your feature request related to a problem? Please describe.**
|
|
||||||
|
|
||||||
A clear and concise description of what the problem is (e.g., I'm always frustrated when [...]).
|
|
||||||
|
|
||||||
**Describe the solution you'd like**
|
|
||||||
|
|
||||||
A clear and concise description of what you want to happen.
|
|
||||||
|
|
||||||
**Describe alternatives you've considered**
|
|
||||||
|
|
||||||
A clear and concise description of any alternative solutions or features you've considered.
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
|
|
||||||
Add any other context or screenshots about the feature request here.
|
|
|
@ -1,26 +0,0 @@
|
||||||
---
|
|
||||||
name: 功能建议
|
|
||||||
about: 请按照模板填写功能建议,否则你的Issue可能会被直接关闭。
|
|
||||||
title: [FEAT] 功能建议概述
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
> 确保你在提交功能建议之前仔细阅读了[Hexo文档](https://hexo.io/zh-cn/),[Icarus用户指南](https://ppoffice.github.io/hexo-theme-icarus/tags/Icarus%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97/),和[GitHub issues](https://github.com/ppoffice/hexo-theme-icarus/issues)来了解你的建议是否已经被他人提出过。
|
|
||||||
|
|
||||||
**你的功能建议与某个使用问题相关么?请详述。**
|
|
||||||
|
|
||||||
简洁清晰地描述你遇到的问题是什么(如:我在使用...的时候遇到了...)。
|
|
||||||
|
|
||||||
**描述你想要的解决方案**
|
|
||||||
|
|
||||||
简洁清晰地描述你想要的解决方案可以达到的效果。
|
|
||||||
|
|
||||||
**描述你考虑过的替代办法**
|
|
||||||
|
|
||||||
简洁清晰地描述你考虑过的替代解决方案或是新功能。
|
|
||||||
|
|
||||||
**额外上下文**
|
|
||||||
|
|
||||||
附上与功能请求有关的其他上下文信息或者截图。
|
|
|
@ -1,30 +0,0 @@
|
||||||
---
|
|
||||||
name: Pull Request
|
|
||||||
about: Suggest a code change to this project.
|
|
||||||
title: ''
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Note 0**
|
|
||||||
Please review [the contributing guide](https://github.com/ppoffice/hexo-theme-icarus/blob/master/CONTRIBUTING.md) before making this pull request.
|
|
||||||
|
|
||||||
**Note 1**
|
|
||||||
|
|
||||||
Please break up your pull request into multiple smaller requests if it contains multiple bug fixes
|
|
||||||
or new features.
|
|
||||||
Each pull request should have one bug fix or new feature only for better code maintainability.
|
|
||||||
|
|
||||||
**Note 2**
|
|
||||||
|
|
||||||
Many components of this theme, including core functions, some Hexo extensions, widgets and plugins,
|
|
||||||
have been moved to [ppoffice/hexo-component-inferno](https://github.com/ppoffice/hexo-component-inferno).
|
|
||||||
Please make a pull request to that repository instead of this one if your changes are related to
|
|
||||||
the above components.
|
|
||||||
|
|
||||||
**Detailed description**
|
|
||||||
|
|
||||||
> Please use the [Icarus issue template](https://github.com/ppoffice/hexo-theme-icarus/blob/master/.github/ISSUE_TEMPLATE/bug_report.md) if it is a bug fix.
|
|
||||||
|
|
||||||
> Please use the [Icarus feature request template](https://github.com/ppoffice/hexo-theme-icarus/blob/master/.github/ISSUE_TEMPLATE/feature_request.md) if it is a bug fix.
|
|
|
@ -1,6 +0,0 @@
|
||||||
version: 2
|
|
||||||
updates:
|
|
||||||
- package-ecosystem: 'npm'
|
|
||||||
directory: '/'
|
|
||||||
schedule:
|
|
||||||
interval: 'daily'
|
|
|
@ -1,32 +0,0 @@
|
||||||
# Number of days of inactivity before an issue becomes stale
|
|
||||||
daysUntilStale: 14
|
|
||||||
# Number of days of inactivity before a stale issue is closed
|
|
||||||
daysUntilClose: 7
|
|
||||||
# Issues with these labels will never be considered stale
|
|
||||||
exemptLabels:
|
|
||||||
- bug:core
|
|
||||||
- bug:extension
|
|
||||||
- bug:general
|
|
||||||
- feature:core
|
|
||||||
- feature:extension
|
|
||||||
- feature:general
|
|
||||||
- tutorial:v1
|
|
||||||
- tutorial:v2
|
|
||||||
- tutorial:v3
|
|
||||||
- tutorial:v4
|
|
||||||
- tutorial:v5
|
|
||||||
- tutorial:v6
|
|
||||||
- tutorial:v7
|
|
||||||
- tutorial:v8
|
|
||||||
- tutorial:v9
|
|
||||||
- Gitalk
|
|
||||||
- utterances
|
|
||||||
# Label to use when marking an issue as stale
|
|
||||||
staleLabel: wontfix
|
|
||||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
|
||||||
markComment: >
|
|
||||||
This issue has been automatically marked as stale because it has not had
|
|
||||||
recent activity. It will be closed if no further activity occurs. Thank you
|
|
||||||
for your contributions.
|
|
||||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
|
||||||
closeComment: false
|
|
|
@ -1,20 +0,0 @@
|
||||||
name: GitHub Release
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- "*"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
publish:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- uses: actions/create-release@v1
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
|
||||||
tag_name: ${{ github.ref }}
|
|
||||||
release_name: ${{ github.ref }}
|
|
||||||
draft: true
|
|
||||||
prerelease: false
|
|
|
@ -1,15 +0,0 @@
|
||||||
name: Code Linting
|
|
||||||
|
|
||||||
on: [push, pull_request]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lint:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- uses: actions/setup-node@v1
|
|
||||||
- run: npm install
|
|
||||||
- run: >
|
|
||||||
npm install $(node -e "const deps=require('./package.json').peerDependencies;
|
|
||||||
console.log(Object.keys(deps).map(key=>key+'@'+deps[key]).join(' '));")
|
|
||||||
- run: npm run lint
|
|
|
@ -1,18 +0,0 @@
|
||||||
name: Node.js Package
|
|
||||||
|
|
||||||
on:
|
|
||||||
release:
|
|
||||||
types: [published]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
publish:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- uses: actions/setup-node@v1
|
|
||||||
with:
|
|
||||||
node-version: 12
|
|
||||||
registry-url: https://registry.npmjs.org/
|
|
||||||
- run: npm publish
|
|
||||||
env:
|
|
||||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
|
@ -1,39 +0,0 @@
|
||||||
name: Test
|
|
||||||
|
|
||||||
on: [push, pull_request]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version: [12, 14]
|
|
||||||
fail-fast: false
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
repository: hexojs/hexo-starter
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
path: themes/icarus
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
repository: SukkaLab/hexo-many-posts
|
|
||||||
path: source/_posts/hexo-many-posts
|
|
||||||
- uses: actions/setup-node@v1
|
|
||||||
with:
|
|
||||||
node-version: ${{ matrix.node-version }}
|
|
||||||
- uses: actions/cache@v1
|
|
||||||
with:
|
|
||||||
path: node_modules
|
|
||||||
key: npm-cache
|
|
||||||
restore-keys: npm-cache
|
|
||||||
- run: npm install
|
|
||||||
- run: >
|
|
||||||
npm install $(node -e "const deps=require('./themes/icarus/package.json').dependencies;
|
|
||||||
console.log(Object.keys(deps).map(key=>key+'@'+deps[key]).join(' '));")
|
|
||||||
- run: >
|
|
||||||
npm install $(node -e "const deps=require('./themes/icarus/package.json').peerDependencies;
|
|
||||||
console.log(Object.keys(deps).map(key=>key+'@'+deps[key]).join(' '));")
|
|
||||||
- run: npx hexo config theme icarus
|
|
||||||
- run: time NODE_ENV=production npx hexo g -b
|
|
|
@ -1,116 +0,0 @@
|
||||||
# Logs
|
|
||||||
logs
|
|
||||||
*.log
|
|
||||||
npm-debug.log*
|
|
||||||
yarn-debug.log*
|
|
||||||
yarn-error.log*
|
|
||||||
lerna-debug.log*
|
|
||||||
|
|
||||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
|
||||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
|
||||||
|
|
||||||
# Runtime data
|
|
||||||
pids
|
|
||||||
*.pid
|
|
||||||
*.seed
|
|
||||||
*.pid.lock
|
|
||||||
|
|
||||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
|
||||||
lib-cov
|
|
||||||
|
|
||||||
# Coverage directory used by tools like istanbul
|
|
||||||
coverage
|
|
||||||
*.lcov
|
|
||||||
|
|
||||||
# nyc test coverage
|
|
||||||
.nyc_output
|
|
||||||
|
|
||||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
|
||||||
.grunt
|
|
||||||
|
|
||||||
# Bower dependency directory (https://bower.io/)
|
|
||||||
bower_components
|
|
||||||
|
|
||||||
# node-waf configuration
|
|
||||||
.lock-wscript
|
|
||||||
|
|
||||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
|
||||||
build/Release
|
|
||||||
|
|
||||||
# Dependency directories
|
|
||||||
node_modules/
|
|
||||||
jspm_packages/
|
|
||||||
|
|
||||||
# TypeScript v1 declaration files
|
|
||||||
typings/
|
|
||||||
|
|
||||||
# TypeScript cache
|
|
||||||
*.tsbuildinfo
|
|
||||||
|
|
||||||
# Optional npm cache directory
|
|
||||||
.npm
|
|
||||||
|
|
||||||
# Optional eslint cache
|
|
||||||
.eslintcache
|
|
||||||
|
|
||||||
# Microbundle cache
|
|
||||||
.rpt2_cache/
|
|
||||||
.rts2_cache_cjs/
|
|
||||||
.rts2_cache_es/
|
|
||||||
.rts2_cache_umd/
|
|
||||||
|
|
||||||
# Optional REPL history
|
|
||||||
.node_repl_history
|
|
||||||
|
|
||||||
# Output of 'npm pack'
|
|
||||||
*.tgz
|
|
||||||
|
|
||||||
# Yarn Integrity file
|
|
||||||
.yarn-integrity
|
|
||||||
|
|
||||||
# dotenv environment variables file
|
|
||||||
.env
|
|
||||||
.env.test
|
|
||||||
|
|
||||||
# parcel-bundler cache (https://parceljs.org/)
|
|
||||||
.cache
|
|
||||||
|
|
||||||
# Next.js build output
|
|
||||||
.next
|
|
||||||
|
|
||||||
# Nuxt.js build / generate output
|
|
||||||
.nuxt
|
|
||||||
dist
|
|
||||||
|
|
||||||
# Gatsby files
|
|
||||||
.cache/
|
|
||||||
# Comment in the public line in if your project uses Gatsby and not Next.js
|
|
||||||
# https://nextjs.org/blog/next-9-1#public-directory-support
|
|
||||||
# public
|
|
||||||
|
|
||||||
# vuepress build output
|
|
||||||
.vuepress/dist
|
|
||||||
|
|
||||||
# Serverless directories
|
|
||||||
.serverless/
|
|
||||||
|
|
||||||
# FuseBox cache
|
|
||||||
.fusebox/
|
|
||||||
|
|
||||||
# DynamoDB Local files
|
|
||||||
.dynamodb/
|
|
||||||
|
|
||||||
# TernJS port file
|
|
||||||
.tern-port
|
|
||||||
|
|
||||||
# Stores VSCode versions used for testing VSCode extensions
|
|
||||||
.vscode-test
|
|
||||||
|
|
||||||
_config*.yml*
|
|
||||||
yarn.lock
|
|
||||||
|
|
||||||
# Intellij Idea config file
|
|
||||||
.idea
|
|
||||||
*.ipr
|
|
||||||
*.iws
|
|
||||||
*.iml
|
|
|
@ -1,5 +0,0 @@
|
||||||
.github/
|
|
||||||
.eslintignore
|
|
||||||
.eslintrc.json
|
|
||||||
.travis.yml
|
|
||||||
yarn.lock
|
|
|
@ -1,40 +0,0 @@
|
||||||
# Contributing Guidelines
|
|
||||||
|
|
||||||
## Code styles
|
|
||||||
|
|
||||||
Please refer to the [.eslintrc.json](https://github.com/ppoffice/hexo-theme-icarus/blob/master/.eslintrc.json).
|
|
||||||
You can also use `npm run lint` or `yarn lint` to fix code style issues.
|
|
||||||
|
|
||||||
## Project versioning
|
|
||||||
|
|
||||||
We use [SemVer](http://semver.org/) for versioning.
|
|
||||||
Any changes to the code base should not be released using an existing version.
|
|
||||||
|
|
||||||
## Commit message format
|
|
||||||
|
|
||||||
The commit message should follow the [Bluejava commit message format](https://github.com/bluejava/git-commit-guide).
|
|
||||||
The supported scopes are:
|
|
||||||
|
|
||||||
- **core** for changes related to Hexo extensions and theme-specific functions
|
|
||||||
- **comment** for comment plugin layout, schema, style, or script changes
|
|
||||||
- **share** for share plugin layout, schema, style, or script changes
|
|
||||||
- **donate** for donation plugin layout, schema, style, or script changes
|
|
||||||
- **search** for search plugin layout, schema, style, or script changes
|
|
||||||
- **widget** for widget layout, schema, style, or script changes
|
|
||||||
- **plugin** for other plugin layout, schema, style, or script changes
|
|
||||||
- **i18n** for adding or updating translations
|
|
||||||
- **test** for testing or linting-related commits
|
|
||||||
- **build** for build scripts, CI, other development or deployment related commits
|
|
||||||
- use __\*__ or leave empty to refer to commits that do not have a clear scope
|
|
||||||
|
|
||||||
## Submit changes
|
|
||||||
|
|
||||||
1. Fork this repository, make changes to it, and run it against some actual Hexo sites to see if
|
|
||||||
anything is broken.
|
|
||||||
You should also run `npm run lint` or `yarn lint` to find and fix any code formatting issue.
|
|
||||||
2. Submit a pull request to our repository. Please make sure you followed the instructions
|
|
||||||
above.
|
|
||||||
3. We will review the pull request regularly and inform you of our questions and any changes
|
|
||||||
that need to be made before we can merge your pull request.
|
|
||||||
4. We expect your response within two weeks, after which your pull request may be closed if
|
|
||||||
no activity is shown.
|
|
|
@ -1,21 +0,0 @@
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2020 PPOffice
|
|
||||||
|
|
||||||
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.
|
|
|
@ -1,158 +0,0 @@
|
||||||
<p align="center" class="mb-2">
|
|
||||||
<img class="not-gallery-item" height="48" src="https://ppoffice.github.io/hexo-theme-icarus/img/logo.svg">
|
|
||||||
<br> A simple, delicate, and modern theme for the static site generator Hexo.
|
|
||||||
<br>
|
|
||||||
<a href="https://ppoffice.github.io/hexo-theme-icarus/">Preview</a> |
|
|
||||||
<a href="https://ppoffice.github.io/hexo-theme-icarus/categories/">Documentation</a> |
|
|
||||||
<a href="https://gitter.im/hexo-theme-icarus/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge">Chat on Gitter</a>
|
|
||||||
<br>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
![](https://ppoffice.github.io/hexo-theme-icarus/gallery/preview.png?1 "Icarus Preview")
|
|
||||||
|
|
||||||
## :cd: Installation
|
|
||||||
|
|
||||||
```shell
|
|
||||||
$ npm install hexo-theme-icarus
|
|
||||||
$ hexo config theme icarus
|
|
||||||
```
|
|
||||||
|
|
||||||
Please refer to [Getting Started with Icarus](https://ppoffice.github.io/hexo-theme-icarus/uncategorized/getting-started-with-icarus/)
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
## :gift: Features
|
|
||||||
|
|
||||||
### Cyberpunk Theme Variant
|
|
||||||
|
|
||||||
Tap into the future cyber world with the newly added Cyberpunk theme variant.
|
|
||||||
Inspired by [Cyberpunk 2077](https://www.cyberpunk.net).
|
|
||||||
|
|
||||||
![Icarus Cyberpunk](https://ppoffice.github.io/hexo-theme-icarus/gallery/screenshots/cyberpunk.png "Icarus Cyberpunk")
|
|
||||||
|
|
||||||
### Extensive Plugin Support
|
|
||||||
|
|
||||||
Icarus includes plentiful search, comment, sharing and other plugins out of the box that makes your
|
|
||||||
blog feature-rich and powerful.
|
|
||||||
|
|
||||||
**[Comment](https://ppoffice.github.io/hexo-theme-icarus/categories/Plugins/Comment/)**
|
|
||||||
|
|
||||||
Changyan · Disqus · DisqusJS · Facebook · Gitalk · Gitment ·
|
|
||||||
Isso · LiveRe · Utterance · Valine
|
|
||||||
|
|
||||||
**[Donate Button](https://ppoffice.github.io/hexo-theme-icarus/categories/Plugins/Donation/)**
|
|
||||||
|
|
||||||
Afdian.net · Alipay · Buy me a coffee · Patreon · Paypal · Wecat
|
|
||||||
|
|
||||||
**[Search](https://ppoffice.github.io/hexo-theme-icarus/categories/Plugins/Search/)**
|
|
||||||
|
|
||||||
Algolia · Baidu · Google CSE · Insight
|
|
||||||
|
|
||||||
**[Share](https://ppoffice.github.io/hexo-theme-icarus/categories/Plugins/Share/)**
|
|
||||||
|
|
||||||
AddThis · AddToAny · Baidu Share · Share.js · ShareThis
|
|
||||||
|
|
||||||
**[Widgets](https://ppoffice.github.io/hexo-theme-icarus/categories/Widgets/)**
|
|
||||||
|
|
||||||
Google Adsense · Archives · Categories · External Site Links ·
|
|
||||||
Recent Posts · Google Feedburner · Tags · Table of Contents
|
|
||||||
|
|
||||||
**[Analytics](https://ppoffice.github.io/hexo-theme-icarus/Plugins/Analytics/icarus-user-guide-web-analytics-plugins/)**
|
|
||||||
|
|
||||||
Baidu Statistics · Bing Webmaster · BuSuanZi Web Counter · CNZZ Statistics ·
|
|
||||||
Google Analytics · Hotjar · StatCounter · Twitter Conversion Tracking
|
|
||||||
|
|
||||||
**[Other Plugins](https://ppoffice.github.io/hexo-theme-icarus/categories/Plugins/)**
|
|
||||||
|
|
||||||
Cookie Consent · LightGallery · Justified Gallery · KaTeX · MathJax ·
|
|
||||||
Oudated Browser · Page Loading Animations
|
|
||||||
|
|
||||||
### Colorful Code Highlight
|
|
||||||
|
|
||||||
Icarus directly import stylesheets from the [highlight.js](https://highlightjs.org/) package and makes more than
|
|
||||||
90 code highlight themes available to you.
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<th>Atom One Light</th>
|
|
||||||
<th>Monokai</th>
|
|
||||||
<th>Kimbie Dark</th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><img width="266" src="https://ppoffice.github.io/hexo-theme-icarus/gallery/code-highlight/atom-one-light.png?2"></td>
|
|
||||||
<td><img width="266" src="https://ppoffice.github.io/hexo-theme-icarus/gallery/code-highlight/monokai.png?2"></td>
|
|
||||||
<td><img width="266" src="https://ppoffice.github.io/hexo-theme-icarus/gallery/code-highlight/kimbie-dark.png?2"></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
### Flexible Theme Configuration
|
|
||||||
|
|
||||||
Icarus allows you to configure your site on a per-page or per-layout basis.
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<th>_config.yml</th>
|
|
||||||
<th>post.md</th>
|
|
||||||
<th>_config.page.yml</th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<pre>widgets:
|
|
||||||
- type: profile
|
|
||||||
position: left
|
|
||||||
- type: recent_posts
|
|
||||||
position: right</pre>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<pre>widgets:
|
|
||||||
- type: profile
|
|
||||||
position: left
|
|
||||||
- type: recent_posts
|
|
||||||
position: left</pre>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<pre>widgets: null
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</pre>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><img width="266" src="https://ppoffice.github.io/hexo-theme-icarus/gallery/screenshots/default-config.png"></td>
|
|
||||||
<td><img width="266" src="https://ppoffice.github.io/hexo-theme-icarus/gallery/screenshots/post-config.png"></td>
|
|
||||||
<td><img width="266" src="https://ppoffice.github.io/hexo-theme-icarus/gallery/screenshots/layout-config.png"></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
### Responsive Layout
|
|
||||||
|
|
||||||
Give your audiences best viewing experience with Icarus's mobile-friendly responsive layout.
|
|
||||||
|
|
||||||
![Responsive Layout](https://ppoffice.github.io/hexo-theme-icarus/gallery/responsive.png)
|
|
||||||
|
|
||||||
## :hammer: Development
|
|
||||||
|
|
||||||
This project is built with
|
|
||||||
|
|
||||||
- [Hexo](https://hexo.io/)
|
|
||||||
- [Inferno.js](https://infernojs.org/)
|
|
||||||
- [Stylus](https://stylus-lang.com/)
|
|
||||||
- [Bulma](https://bulma.io/)
|
|
||||||
|
|
||||||
Please refer to the [documentation](https://ppoffice.github.io/hexo-theme-icarus/categories/) and
|
|
||||||
[contributing guide](https://github.com/ppoffice/hexo-theme-icarus/blob/master/CONTRIBUTING.md) for implementation details.
|
|
||||||
|
|
||||||
## :tada: Contribute
|
|
||||||
|
|
||||||
If you feel like to help us build a better Icarus, you can
|
|
||||||
|
|
||||||
:black_nib: [Submit a tutorial](https://github.com/ppoffice/hexo-theme-icarus/new/site/source/_posts) |
|
|
||||||
:earth_asia: [Add a translation](https://github.com/ppoffice/hexo-theme-icarus/tree/master/languages) |
|
|
||||||
:triangular_flag_on_post: [Report a bug](https://github.com/ppoffice/hexo-theme-icarus/issues/new) |
|
|
||||||
:electric_plug: [Suggest a new feature](https://github.com/ppoffice/hexo-theme-icarus/pulls)
|
|
||||||
|
|
||||||
## :memo: License
|
|
||||||
|
|
||||||
This project is licensed under the MIT License - see the [LICENSE](https://github.com/ppoffice/hexo-theme-icarus/blob/master/LICENSE) file for details.
|
|
|
@ -1,107 +0,0 @@
|
||||||
/* eslint no-process-exit: "off" */
|
|
||||||
const fs = require('fs');
|
|
||||||
const path = require('path');
|
|
||||||
const util = require('util');
|
|
||||||
const crypto = require('crypto');
|
|
||||||
const logger = require('hexo-log')();
|
|
||||||
const yaml = require('hexo-component-inferno/lib/util/yaml');
|
|
||||||
const { Migrator } = require('hexo-component-inferno/lib/core/migrate');
|
|
||||||
const { SchemaLoader } = require('hexo-component-inferno/lib/core/schema');
|
|
||||||
const { yellow } = require('./util/console');
|
|
||||||
|
|
||||||
function loadThemeConfig(hexo, cfgPaths) {
|
|
||||||
const configs = cfgPaths.map(cfgPath => fs.readFileSync(cfgPath))
|
|
||||||
.map(cfgPath => yaml.parse(cfgPath));
|
|
||||||
return Object.assign({}, ...configs, hexo.config.theme_config);
|
|
||||||
}
|
|
||||||
|
|
||||||
function generateThemeConfigFile(schema, cfgPath) {
|
|
||||||
const defaultValue = schema.getDefaultValue();
|
|
||||||
fs.writeFileSync(cfgPath, defaultValue.toYaml());
|
|
||||||
}
|
|
||||||
|
|
||||||
function hashConfigFile(cfgPath) {
|
|
||||||
const content = fs.readFileSync(cfgPath);
|
|
||||||
return crypto.createHash('md5').update(content).digest('hex');
|
|
||||||
}
|
|
||||||
|
|
||||||
function checkConfig(hexo) {
|
|
||||||
if (!process.argv.includes('--icarus-dont-check-config')) {
|
|
||||||
logger.info('=== Checking theme configurations ===');
|
|
||||||
|
|
||||||
const siteCfgFile = path.join(hexo.base_dir, '_config.yml');
|
|
||||||
const themeSiteCfg = path.join(hexo.base_dir, '_config.icarus.yml');
|
|
||||||
const themeDirCfg = path.join(hexo.theme_dir, '_config.yml');
|
|
||||||
const themeCfgPaths = [themeDirCfg, themeSiteCfg].filter(cfgPath => fs.existsSync(cfgPath));
|
|
||||||
const themeSiteCfgExample = themeSiteCfg + '.example';
|
|
||||||
|
|
||||||
const schemaDir = path.join(hexo.theme_dir, 'include/schema/');
|
|
||||||
const loader = SchemaLoader.load(require(path.join(schemaDir, 'config.json')), schemaDir);
|
|
||||||
const schema = loader.getSchema('/config.json');
|
|
||||||
|
|
||||||
if (!process.argv.includes('--icarus-dont-generate-config')) {
|
|
||||||
if (!themeCfgPaths.length) {
|
|
||||||
logger.warn('None of the following configuration files is found:');
|
|
||||||
logger.warn(`- ${yellow(themeSiteCfg)}`);
|
|
||||||
logger.warn(`- ${yellow(themeDirCfg)}`);
|
|
||||||
logger.info('Generating theme configuration file...');
|
|
||||||
generateThemeConfigFile(schema, themeSiteCfg);
|
|
||||||
themeCfgPaths.push(themeSiteCfg);
|
|
||||||
logger.info(`${yellow(themeSiteCfg)} created successfully.`);
|
|
||||||
logger.info('To skip configuration generation, use "--icarus-dont-generate-config".');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let cfg = loadThemeConfig(hexo, themeCfgPaths);
|
|
||||||
|
|
||||||
if (!process.argv.includes('--icarus-dont-upgrade-config')) {
|
|
||||||
const migrator = new Migrator(require(path.join(hexo.theme_dir, 'include/migration/head')));
|
|
||||||
if (cfg.version && migrator.isOudated(cfg.version)) {
|
|
||||||
logger.warn(`Your theme configuration is outdated (${cfg.version} < ${migrator.getLatestVersion()}).`);
|
|
||||||
logger.info('To skip the configuration upgrade, use "--icarus-dont-upgrade-config".');
|
|
||||||
|
|
||||||
logger.info('Backing up theme configuration files...');
|
|
||||||
for (const cfgPath of themeCfgPaths) {
|
|
||||||
const backupPath = cfgPath + '.' + hashConfigFile(cfgPath);
|
|
||||||
const relCfgPath = path.relative(hexo.base_dir, cfgPath);
|
|
||||||
const relBackupPath = path.relative(hexo.base_dir, backupPath);
|
|
||||||
fs.renameSync(cfgPath, backupPath);
|
|
||||||
logger.info(`${yellow(relCfgPath)} => ${yellow(relBackupPath)}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.info('Upgrading theme configurations...');
|
|
||||||
cfg = migrator.migrate(cfg);
|
|
||||||
fs.writeFileSync(themeSiteCfg, yaml.stringify(cfg));
|
|
||||||
logger.info(`Theme configurations are written to ${yellow(themeSiteCfg)}.`);
|
|
||||||
|
|
||||||
generateThemeConfigFile(schema, themeSiteCfgExample);
|
|
||||||
logger.info(`Example configurations is at ${yellow(themeSiteCfgExample)}.`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const validation = schema.validate(cfg);
|
|
||||||
if (validation !== true) {
|
|
||||||
logger.warn('Theme configurations failed one or more checks.');
|
|
||||||
logger.warn('Icarus may still run, but you will encounter unexcepted results.');
|
|
||||||
logger.warn('Here is some information for you to correct the configuration file.');
|
|
||||||
logger.warn(util.inspect(validation));
|
|
||||||
}
|
|
||||||
|
|
||||||
const rootCfg = yaml.parse(fs.readFileSync(siteCfgFile));
|
|
||||||
if (rootCfg.theme_config) {
|
|
||||||
logger.warn(`"theme_config" found in ${yellow(siteCfgFile)}.`);
|
|
||||||
logger.warn(`Please remove theme configurations from ${yellow(siteCfgFile)}.`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = hexo => {
|
|
||||||
try {
|
|
||||||
checkConfig(hexo);
|
|
||||||
} catch (e) {
|
|
||||||
logger.error(e);
|
|
||||||
logger.error('Theme configuration checking failed.');
|
|
||||||
logger.info('You may use \'--icarus-dont-check-config\' to skip configuration checking.');
|
|
||||||
process.exit(-1);
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,34 +0,0 @@
|
||||||
/* eslint no-process-exit: "off" */
|
|
||||||
const semver = require('semver');
|
|
||||||
const logger = require('hexo-log')();
|
|
||||||
const packageInfo = require('../package.json');
|
|
||||||
const { yellow, red, green } = require('./util/console');
|
|
||||||
|
|
||||||
module.exports = hexo => {
|
|
||||||
function checkDependency(name, reqVer) {
|
|
||||||
try {
|
|
||||||
require.resolve(name);
|
|
||||||
const version = require(name + '/package.json').version;
|
|
||||||
if (!semver.satisfies(version, reqVer)) {
|
|
||||||
logger.error(`Package ${yellow(name)}'s version (${yellow(version)}) does not satisfy the required version (${red(reqVer)}).`);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} catch (e) {
|
|
||||||
logger.error(`Package ${yellow(name)} is not installed.`);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.info('=== Checking package dependencies ===');
|
|
||||||
const dependencies = Object.assign({}, packageInfo.peerDependencies, packageInfo.dependencies);
|
|
||||||
const missingDeps = Object.keys(dependencies)
|
|
||||||
.filter(name => !checkDependency(name, dependencies[name]));
|
|
||||||
if (missingDeps && missingDeps.length) {
|
|
||||||
logger.error('Please install the missing dependencies your Hexo site root directory:');
|
|
||||||
logger.error(green('npm install --save ' + missingDeps.map(name => `${name}@${dependencies[name]}`).join(' ')));
|
|
||||||
logger.error('or:');
|
|
||||||
logger.error(green('yarn add ' + missingDeps.map(name => `${name}@${dependencies[name]}`).join(' ')));
|
|
||||||
process.exit(-1);
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1 +0,0 @@
|
||||||
module.exports = require('./v3_v4');
|
|
|
@ -1,102 +0,0 @@
|
||||||
const logger = require('hexo-log')();
|
|
||||||
const deepmerge = require('deepmerge');
|
|
||||||
const Migration = require('hexo-component-inferno/lib/core/migrate').Migration;
|
|
||||||
|
|
||||||
module.exports = class extends Migration {
|
|
||||||
constructor() {
|
|
||||||
super('3.0.0', null);
|
|
||||||
}
|
|
||||||
|
|
||||||
upgrade(config) {
|
|
||||||
const result = deepmerge({}, config);
|
|
||||||
result.head = {
|
|
||||||
favicon: config.favicon || null,
|
|
||||||
canonical_url: config.canonical_url || null,
|
|
||||||
open_graph: config.open_graph || null,
|
|
||||||
meta: config.meta || null,
|
|
||||||
rss: config.rss || null
|
|
||||||
};
|
|
||||||
delete result.favicon;
|
|
||||||
delete result.canonical_url;
|
|
||||||
delete result.open_graph;
|
|
||||||
delete result.meta;
|
|
||||||
delete result.rss;
|
|
||||||
|
|
||||||
if (result.logo === '/images/logo.svg') {
|
|
||||||
result.logo = result.logo.replace(/^\/images/, '/img');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result.head.favicon === '/img/favicon.svg') {
|
|
||||||
result.head.favicon = result.head.favicon.replace(/^\/images/, '/img');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result.search && Object.prototype.hasOwnProperty.call(result.search, 'type')) {
|
|
||||||
switch (result.search.type) {
|
|
||||||
case 'google-cse':
|
|
||||||
result.search.type = 'google_cse';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result.comment && Object.prototype.hasOwnProperty.call(result.comment, 'type')) {
|
|
||||||
switch (result.comment.type) {
|
|
||||||
case 'changyan':
|
|
||||||
result.comment.app_id = config.comment.appid;
|
|
||||||
delete result.comment.appid;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Array.isArray(result.donate) && result.donate.length) {
|
|
||||||
result.donates = result.donate;
|
|
||||||
delete result.donate;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Array.isArray(result.widgets) && result.widgets.length) {
|
|
||||||
for (const widget of result.widgets) {
|
|
||||||
if (Object.prototype.hasOwnProperty.call(widget, 'type')) {
|
|
||||||
switch (widget.type) {
|
|
||||||
case 'archive':
|
|
||||||
widget.type = 'archives';
|
|
||||||
break;
|
|
||||||
case 'category':
|
|
||||||
widget.type = 'categories';
|
|
||||||
break;
|
|
||||||
case 'tag':
|
|
||||||
widget.type = 'tags';
|
|
||||||
break;
|
|
||||||
case 'tagcloud':
|
|
||||||
logger.warn('The tagcloud widget has been removed from Icarus in version 3.0.0.');
|
|
||||||
logger.warn('Please remove it from your configuration file.');
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result.plugins && typeof result.plugins === 'object') {
|
|
||||||
for (const name in result.plugins) {
|
|
||||||
switch (name) {
|
|
||||||
case 'outdated-browser':
|
|
||||||
result.plugins.outdated_browser = result.plugins[name];
|
|
||||||
delete result.plugins[name];
|
|
||||||
break;
|
|
||||||
case 'back-to-top':
|
|
||||||
result.plugins.back_to_top = result.plugins[name];
|
|
||||||
delete result.plugins[name];
|
|
||||||
break;
|
|
||||||
case 'baidu-analytics':
|
|
||||||
result.plugins.baidu_analytics = result.plugins[name];
|
|
||||||
delete result.plugins[name];
|
|
||||||
break;
|
|
||||||
case 'google-analytics':
|
|
||||||
result.plugins.google_analytics = result.plugins[name];
|
|
||||||
delete result.plugins[name];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,14 +0,0 @@
|
||||||
const Migration = require('hexo-component-inferno/lib/core/migrate').Migration;
|
|
||||||
|
|
||||||
module.exports = class extends Migration {
|
|
||||||
constructor() {
|
|
||||||
super('4.0.0', null);
|
|
||||||
}
|
|
||||||
|
|
||||||
upgrade(config) {
|
|
||||||
if (typeof config.article === 'object') {
|
|
||||||
delete config.article.thumbnail;
|
|
||||||
}
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,15 +0,0 @@
|
||||||
const logger = require('hexo-log')();
|
|
||||||
|
|
||||||
module.exports = hexo => {
|
|
||||||
logger.info('=== Registering Hexo extensions ===');
|
|
||||||
require('hexo-component-inferno/lib/hexo/filter/locals')(hexo);
|
|
||||||
require('hexo-component-inferno/lib/hexo/generator/assets')(hexo);
|
|
||||||
require('hexo-component-inferno/lib/hexo/generator/insight')(hexo);
|
|
||||||
require('hexo-component-inferno/lib/hexo/generator/categories')(hexo);
|
|
||||||
require('hexo-component-inferno/lib/hexo/generator/category')(hexo);
|
|
||||||
require('hexo-component-inferno/lib/hexo/generator/manifest')(hexo);
|
|
||||||
require('hexo-component-inferno/lib/hexo/generator/tags')(hexo);
|
|
||||||
require('hexo-component-inferno/lib/hexo/helper/cdn')(hexo);
|
|
||||||
require('hexo-component-inferno/lib/hexo/helper/page')(hexo);
|
|
||||||
require('hexo-component-inferno/lib/core/view').init(hexo);
|
|
||||||
};
|
|
|
@ -1,64 +0,0 @@
|
||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
||||||
"$id": "/common/article.json",
|
|
||||||
"description": "Article related configurations",
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"highlight": {
|
|
||||||
"type": "object",
|
|
||||||
"description": "Code highlight settings",
|
|
||||||
"properties": {
|
|
||||||
"theme": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "Code highlight themes\nhttps://github.com/highlightjs/highlight.js/tree/master/src/styles",
|
|
||||||
"default": "atom-one-light",
|
|
||||||
"nullable": true
|
|
||||||
},
|
|
||||||
"clipboard": {
|
|
||||||
"type": "boolean",
|
|
||||||
"description": "Show copy code button",
|
|
||||||
"default": true,
|
|
||||||
"nullable": true
|
|
||||||
},
|
|
||||||
"fold": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "Default folding status of the code blocks. Can be \"\", \"folded\", \"unfolded\"",
|
|
||||||
"enum": [
|
|
||||||
"",
|
|
||||||
"folded",
|
|
||||||
"unfolded"
|
|
||||||
],
|
|
||||||
"default": "unfolded",
|
|
||||||
"nullable": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nullable": true
|
|
||||||
},
|
|
||||||
"readtime": {
|
|
||||||
"type": "boolean",
|
|
||||||
"description": "Whether to show estimated article reading time",
|
|
||||||
"default": true,
|
|
||||||
"nullable": true
|
|
||||||
},
|
|
||||||
"licenses": {
|
|
||||||
"$ref": "/misc/poly_links.json",
|
|
||||||
"description": "Article licensing block",
|
|
||||||
"examples": [
|
|
||||||
{
|
|
||||||
"Creative Commons": {
|
|
||||||
"icon": "fab fa-creative-commons",
|
|
||||||
"url": "https://creativecommons.org/"
|
|
||||||
},
|
|
||||||
"Attribution": {
|
|
||||||
"icon": "fab fa-creative-commons-by",
|
|
||||||
"url": "https://creativecommons.org/licenses/by/4.0/"
|
|
||||||
},
|
|
||||||
"Noncommercial": {
|
|
||||||
"icon": "fab fa-creative-commons-nc",
|
|
||||||
"url": "https://creativecommons.org/licenses/by-nc/4.0/"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
||||||
"$id": "/common/comment.json",
|
|
||||||
"description": "Comment plugin configurations\nhttps://ppoffice.github.io/hexo-theme-icarus/categories/Plugins/Comment/",
|
|
||||||
"type": "object",
|
|
||||||
"oneOf": [
|
|
||||||
{
|
|
||||||
"$ref": "/comment/disqus.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/comment/changyan.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/comment/disqusjs.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/comment/facebook.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/comment/gitalk.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/comment/gitment.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/comment/isso.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/comment/livere.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/comment/utterances.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/comment/valine.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/comment/waline.json"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
||||||
"$id": "/common/donates.json",
|
|
||||||
"description": "Donate plugin configurations\nhttps://ppoffice.github.io/hexo-theme-icarus/categories/Plugins/Donation/",
|
|
||||||
"type": "array",
|
|
||||||
"items": {
|
|
||||||
"type": "object",
|
|
||||||
"oneOf": [
|
|
||||||
{
|
|
||||||
"$ref": "/donate/afdian.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/donate/alipay.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/donate/buymeacoffee.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/donate/patreon.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/donate/paypal.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/donate/wechat.json"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
||||||
"$id": "/common/footer.json",
|
|
||||||
"description": "Page footer configurations",
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"links": {
|
|
||||||
"$ref": "/misc/poly_links.json",
|
|
||||||
"description": "Links to be shown on the right of the footer section",
|
|
||||||
"examples": [
|
|
||||||
{
|
|
||||||
"Creative Commons": {
|
|
||||||
"icon": "fab fa-creative-commons",
|
|
||||||
"url": "https://creativecommons.org/"
|
|
||||||
},
|
|
||||||
"Attribution 4.0 International": {
|
|
||||||
"icon": "fab fa-creative-commons-by",
|
|
||||||
"url": "https://creativecommons.org/licenses/by/4.0/"
|
|
||||||
},
|
|
||||||
"Download on GitHub": {
|
|
||||||
"icon": "fab fa-github",
|
|
||||||
"url": "https://github.com/ppoffice/hexo-theme-icarus"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,31 +0,0 @@
|
||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
||||||
"$id": "/common/head.json",
|
|
||||||
"description": "Page metadata configurations",
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"favicon": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "URL or path to the website's icon",
|
|
||||||
"default": "/img/favicon.svg",
|
|
||||||
"nullable": true
|
|
||||||
},
|
|
||||||
"manifest": {
|
|
||||||
"$ref": "/misc/manifest.json"
|
|
||||||
},
|
|
||||||
"open_graph": {
|
|
||||||
"$ref": "/misc/open_graph.json"
|
|
||||||
},
|
|
||||||
"structured_data": {
|
|
||||||
"$ref": "/misc/structured_data.json"
|
|
||||||
},
|
|
||||||
"meta": {
|
|
||||||
"$ref": "/misc/meta.json"
|
|
||||||
},
|
|
||||||
"rss": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "URL or path to the website's RSS atom.xml",
|
|
||||||
"nullable": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,40 +0,0 @@
|
||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
||||||
"$id": "/common/navbar.json",
|
|
||||||
"description": "Page top navigation bar configurations",
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"menu": {
|
|
||||||
"type": "object",
|
|
||||||
"description": "Navigation menu items",
|
|
||||||
"patternProperties": {
|
|
||||||
".+": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "URL or path of the menu link"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"examples": [
|
|
||||||
{
|
|
||||||
"Home": "/",
|
|
||||||
"Archives": "/archives",
|
|
||||||
"Categories": "/categories",
|
|
||||||
"Tags": "/tags",
|
|
||||||
"About": "/about"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"nullable": true
|
|
||||||
},
|
|
||||||
"links": {
|
|
||||||
"$ref": "/misc/poly_links.json",
|
|
||||||
"description": "Links to be shown on the right of the navigation bar",
|
|
||||||
"examples": [
|
|
||||||
{
|
|
||||||
"Download on GitHub": {
|
|
||||||
"icon": "fab fa-github",
|
|
||||||
"url": "https://github.com/ppoffice/hexo-theme-icarus"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,56 +0,0 @@
|
||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
||||||
"$id": "/common/plugins.json",
|
|
||||||
"description": "Plugin configurations\nhttps://ppoffice.github.io/hexo-theme-icarus/categories/Plugins/",
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"animejs": {
|
|
||||||
"$ref": "/plugin/animejs.json"
|
|
||||||
},
|
|
||||||
"back_to_top": {
|
|
||||||
"$ref": "/plugin/back_to_top.json"
|
|
||||||
},
|
|
||||||
"baidu_analytics": {
|
|
||||||
"$ref": "/plugin/baidu_analytics.json"
|
|
||||||
},
|
|
||||||
"bing_webmaster": {
|
|
||||||
"$ref": "/plugin/bing_webmaster.json"
|
|
||||||
},
|
|
||||||
"busuanzi": {
|
|
||||||
"$ref": "/plugin/busuanzi.json"
|
|
||||||
},
|
|
||||||
"cnzz": {
|
|
||||||
"$ref": "/plugin/cnzz.json"
|
|
||||||
},
|
|
||||||
"cookie_consent": {
|
|
||||||
"$ref": "/plugin/cookie_consent.json"
|
|
||||||
},
|
|
||||||
"gallery": {
|
|
||||||
"$ref": "/plugin/gallery.json"
|
|
||||||
},
|
|
||||||
"google_analytics": {
|
|
||||||
"$ref": "/plugin/google_analytics.json"
|
|
||||||
},
|
|
||||||
"hotjar": {
|
|
||||||
"$ref": "/plugin/hotjar.json"
|
|
||||||
},
|
|
||||||
"katex": {
|
|
||||||
"$ref": "/plugin/katex.json"
|
|
||||||
},
|
|
||||||
"mathjax": {
|
|
||||||
"$ref": "/plugin/mathjax.json"
|
|
||||||
},
|
|
||||||
"outdated_browser": {
|
|
||||||
"$ref": "/plugin/outdated_browser.json"
|
|
||||||
},
|
|
||||||
"progressbar": {
|
|
||||||
"$ref": "/plugin/progressbar.json"
|
|
||||||
},
|
|
||||||
"statcounter": {
|
|
||||||
"$ref": "/plugin/statcounter.json"
|
|
||||||
},
|
|
||||||
"twitter_conversion_tracking": {
|
|
||||||
"$ref": "/plugin/twitter_conversion_tracking.json"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
||||||
"$id": "/common/providers.json",
|
|
||||||
"description": "CDN provider settings\nhttps://ppoffice.github.io/hexo-theme-icarus/Configuration/Theme/speed-up-your-site-with-custom-cdn/",
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"cdn": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "Name or URL template of the JavaScript and/or stylesheet CDN provider",
|
|
||||||
"default": "jsdelivr",
|
|
||||||
"nullable": true
|
|
||||||
},
|
|
||||||
"fontcdn": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "Name or URL template of the webfont CDN provider",
|
|
||||||
"default": "google",
|
|
||||||
"nullable": true
|
|
||||||
},
|
|
||||||
"iconcdn": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "Name or URL of the fontawesome icon font CDN provider",
|
|
||||||
"default": "fontawesome",
|
|
||||||
"nullable": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
||||||
"$id": "/common/search.json",
|
|
||||||
"description": "Search plugin configurations\nhttps://ppoffice.github.io/hexo-theme-icarus/categories/Plugins/Search/",
|
|
||||||
"type": "object",
|
|
||||||
"oneOf": [
|
|
||||||
{
|
|
||||||
"$ref": "/search/insight.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/search/baidu.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/search/google_cse.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/search/algolia.json"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -1,23 +0,0 @@
|
||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
||||||
"$id": "/common/share.json",
|
|
||||||
"description": "Share plugin configurations\nhttps://ppoffice.github.io/hexo-theme-icarus/categories/Plugins/Share/",
|
|
||||||
"type": "object",
|
|
||||||
"oneOf": [
|
|
||||||
{
|
|
||||||
"$ref": "/share/sharethis.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/share/addthis.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/share/addtoany.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/share/bdshare.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/share/sharejs.json"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -1,30 +0,0 @@
|
||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
||||||
"$id": "/common/sidebar.json",
|
|
||||||
"description": "Sidebar configurations.\nPlease be noted that a sidebar is only visible when it has at least one widget",
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"left": {
|
|
||||||
"type": "object",
|
|
||||||
"description": "Left sidebar configurations",
|
|
||||||
"properties": {
|
|
||||||
"sticky": {
|
|
||||||
"type": "boolean",
|
|
||||||
"description": "Whether the sidebar sticks to the top when page scrolls",
|
|
||||||
"default": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"right": {
|
|
||||||
"type": "object",
|
|
||||||
"description": "Right sidebar configurations",
|
|
||||||
"properties": {
|
|
||||||
"sticky": {
|
|
||||||
"type": "boolean",
|
|
||||||
"description": "Whether the sidebar sticks to the top when page scrolls",
|
|
||||||
"default": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,48 +0,0 @@
|
||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
||||||
"$id": "/common/widgets.json",
|
|
||||||
"description": "Sidebar widget configurations\nhttp://ppoffice.github.io/hexo-theme-icarus/categories/Widgets/",
|
|
||||||
"type": "array",
|
|
||||||
"items": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"position": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "Where should the widget be placed, left sidebar or right sidebar",
|
|
||||||
"default": "left"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"oneOf": [
|
|
||||||
{
|
|
||||||
"$ref": "/widget/profile.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/widget/toc.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/widget/links.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/widget/categories.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/widget/recent_posts.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/widget/archives.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/widget/tags.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/widget/subscribe_email.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$ref": "/widget/adsense.json"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"required": [
|
|
||||||
"position"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,78 +0,0 @@
|
||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
||||||
"$id": "/config.json",
|
|
||||||
"description": "The configuration file definition",
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"version": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "Version of the configuration file",
|
|
||||||
"default": "4.0.0"
|
|
||||||
},
|
|
||||||
"variant": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "Icarus theme variant, can be \"default\" or \"cyberpunk\"",
|
|
||||||
"enum": [
|
|
||||||
"default",
|
|
||||||
"cyberpunk"
|
|
||||||
],
|
|
||||||
"default": "default"
|
|
||||||
},
|
|
||||||
"logo": {
|
|
||||||
"type": [
|
|
||||||
"string",
|
|
||||||
"object"
|
|
||||||
],
|
|
||||||
"description": "Path or URL to the website's logo",
|
|
||||||
"default": "/img/logo.svg",
|
|
||||||
"properties": {
|
|
||||||
"text": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "Text to be shown in place of the logo image"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"required": [
|
|
||||||
"text"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"head": {
|
|
||||||
"$ref": "/common/head.json"
|
|
||||||
},
|
|
||||||
"navbar": {
|
|
||||||
"$ref": "/common/navbar.json"
|
|
||||||
},
|
|
||||||
"footer": {
|
|
||||||
"$ref": "/common/footer.json"
|
|
||||||
},
|
|
||||||
"article": {
|
|
||||||
"$ref": "/common/article.json"
|
|
||||||
},
|
|
||||||
"search": {
|
|
||||||
"$ref": "/common/search.json"
|
|
||||||
},
|
|
||||||
"comment": {
|
|
||||||
"$ref": "/common/comment.json"
|
|
||||||
},
|
|
||||||
"donates": {
|
|
||||||
"$ref": "/common/donates.json"
|
|
||||||
},
|
|
||||||
"share": {
|
|
||||||
"$ref": "/common/share.json"
|
|
||||||
},
|
|
||||||
"sidebar": {
|
|
||||||
"$ref": "/common/sidebar.json"
|
|
||||||
},
|
|
||||||
"widgets": {
|
|
||||||
"$ref": "/common/widgets.json"
|
|
||||||
},
|
|
||||||
"plugins": {
|
|
||||||
"$ref": "/common/plugins.json"
|
|
||||||
},
|
|
||||||
"providers": {
|
|
||||||
"$ref": "/common/providers.json"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"required": [
|
|
||||||
"version"
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
||||||
"$id": "/plugin/animejs.json",
|
|
||||||
"description": "Enable page startup animations",
|
|
||||||
"type": "boolean",
|
|
||||||
"default": true
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
||||||
"$id": "/plugin/back_to_top.json",
|
|
||||||
"description": "Show the \"back to top\" button",
|
|
||||||
"type": "boolean",
|
|
||||||
"default": true
|
|
||||||
}
|
|
|
@ -1,92 +0,0 @@
|
||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
||||||
"$id": "/widget/profile.json",
|
|
||||||
"description": "Profile widget configurations",
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"type": {
|
|
||||||
"type": "string",
|
|
||||||
"const": "profile",
|
|
||||||
"nullable": true
|
|
||||||
},
|
|
||||||
"author": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "Author name",
|
|
||||||
"examples": [
|
|
||||||
"Your name"
|
|
||||||
],
|
|
||||||
"nullable": true
|
|
||||||
},
|
|
||||||
"author_title": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "Author title",
|
|
||||||
"examples": [
|
|
||||||
"Your title"
|
|
||||||
],
|
|
||||||
"nullable": true
|
|
||||||
},
|
|
||||||
"location": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "Author's current location",
|
|
||||||
"examples": [
|
|
||||||
"Your location"
|
|
||||||
],
|
|
||||||
"nullable": true
|
|
||||||
},
|
|
||||||
"avatar": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "URL or path to the avatar image",
|
|
||||||
"nullable": true
|
|
||||||
},
|
|
||||||
"avatar_rounded": {
|
|
||||||
"type": "boolean",
|
|
||||||
"description": "Whether show the rounded avatar image",
|
|
||||||
"default": false,
|
|
||||||
"nullable": true
|
|
||||||
},
|
|
||||||
"gravatar": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "Email address for the Gravatar",
|
|
||||||
"nullable": true
|
|
||||||
},
|
|
||||||
"follow_link": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "URL or path for the follow button",
|
|
||||||
"examples": [
|
|
||||||
"https://github.com/ppoffice"
|
|
||||||
],
|
|
||||||
"nullable": true
|
|
||||||
},
|
|
||||||
"social_links": {
|
|
||||||
"$ref": "/misc/poly_links.json",
|
|
||||||
"description": "Links to be shown on the bottom of the profile widget",
|
|
||||||
"examples": [
|
|
||||||
{
|
|
||||||
"Github": {
|
|
||||||
"icon": "fab fa-github",
|
|
||||||
"url": "https://github.com/ppoffice"
|
|
||||||
},
|
|
||||||
"Facebook": {
|
|
||||||
"icon": "fab fa-facebook",
|
|
||||||
"url": "https://facebook.com"
|
|
||||||
},
|
|
||||||
"Twitter": {
|
|
||||||
"icon": "fab fa-twitter",
|
|
||||||
"url": "https://twitter.com"
|
|
||||||
},
|
|
||||||
"Dribbble": {
|
|
||||||
"icon": "fab fa-dribbble",
|
|
||||||
"url": "https://dribbble.com"
|
|
||||||
},
|
|
||||||
"RSS": {
|
|
||||||
"icon": "fas fa-rss",
|
|
||||||
"url": "/"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"required": [
|
|
||||||
"type"
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -1,194 +0,0 @@
|
||||||
/* ---------------------------------
|
|
||||||
* Article Summary and Content
|
|
||||||
* --------------------------------- */
|
|
||||||
$article-font-size ?= 1.1rem
|
|
||||||
|
|
||||||
article
|
|
||||||
&.media
|
|
||||||
color: $text-light
|
|
||||||
|
|
||||||
a
|
|
||||||
color: inherit
|
|
||||||
|
|
||||||
&:hover
|
|
||||||
color: $primary
|
|
||||||
|
|
||||||
.image
|
|
||||||
width: 64px
|
|
||||||
height: 64px
|
|
||||||
|
|
||||||
img
|
|
||||||
object-fit: cover
|
|
||||||
width: 100%
|
|
||||||
height: 100%
|
|
||||||
|
|
||||||
.title
|
|
||||||
@extend .is-size-6
|
|
||||||
margin-bottom: .25em
|
|
||||||
|
|
||||||
.date, .categories
|
|
||||||
@extend .is-size-7
|
|
||||||
|
|
||||||
.categories
|
|
||||||
@extend .is-uppercase
|
|
||||||
|
|
||||||
.media-content
|
|
||||||
color: $text-light
|
|
||||||
|
|
||||||
.title
|
|
||||||
margin: 0
|
|
||||||
line-height: inherit
|
|
||||||
|
|
||||||
&.article
|
|
||||||
.article-meta, .article-tags
|
|
||||||
color: $text-light
|
|
||||||
|
|
||||||
.article-meta
|
|
||||||
overflow-x: auto
|
|
||||||
margin-bottom: .5rem
|
|
||||||
|
|
||||||
.article-more
|
|
||||||
@extend .button.is-light
|
|
||||||
|
|
||||||
.content
|
|
||||||
word-wrap: break-word
|
|
||||||
font-size: $article-font-size
|
|
||||||
|
|
||||||
h1
|
|
||||||
font-size: 1.75em
|
|
||||||
|
|
||||||
h2
|
|
||||||
font-size: 1.5em
|
|
||||||
|
|
||||||
h3
|
|
||||||
font-size: 1.25em
|
|
||||||
|
|
||||||
h4
|
|
||||||
font-size: 1.125em
|
|
||||||
|
|
||||||
h5
|
|
||||||
font-size: 1em
|
|
||||||
|
|
||||||
pre
|
|
||||||
font-size: .85em
|
|
||||||
|
|
||||||
code
|
|
||||||
padding: 0
|
|
||||||
background: transparent
|
|
||||||
overflow-wrap: break-word
|
|
||||||
|
|
||||||
blockquote
|
|
||||||
&.pullquote
|
|
||||||
float: right
|
|
||||||
max-width: 50%
|
|
||||||
font-size: 1.15rem
|
|
||||||
position: relative
|
|
||||||
|
|
||||||
footer
|
|
||||||
strong + cite
|
|
||||||
margin-left: .5em
|
|
||||||
|
|
||||||
.message.message-immersive
|
|
||||||
border-radius: 0
|
|
||||||
margin: 0 0 - $card-content-padding $card-content-padding 0 - $card-content-padding
|
|
||||||
|
|
||||||
.message-body
|
|
||||||
border: none
|
|
||||||
|
|
||||||
.rtl
|
|
||||||
direction: rtl
|
|
||||||
|
|
||||||
.level
|
|
||||||
&, &.is-mobile
|
|
||||||
.level-item:not(:last-child)
|
|
||||||
margin-left: .75rem
|
|
||||||
margin-right: 0
|
|
||||||
|
|
||||||
// Overflow table
|
|
||||||
.table-overflow
|
|
||||||
overflow-x: auto
|
|
||||||
|
|
||||||
table
|
|
||||||
width: auto !important
|
|
||||||
|
|
||||||
th
|
|
||||||
word-break: keep-all
|
|
||||||
|
|
||||||
// Video container
|
|
||||||
.video-container
|
|
||||||
position: relative
|
|
||||||
padding-bottom: 56.25%
|
|
||||||
padding-top: 25px
|
|
||||||
height: 0
|
|
||||||
|
|
||||||
iframe
|
|
||||||
position: absolute
|
|
||||||
top: 0
|
|
||||||
left: 0
|
|
||||||
width: 100%
|
|
||||||
height: 100%
|
|
||||||
|
|
||||||
.article-licensing
|
|
||||||
position: relative
|
|
||||||
z-index: 1
|
|
||||||
box-shadow: none
|
|
||||||
background: $white-ter
|
|
||||||
border-radius: $radius
|
|
||||||
overflow: hidden
|
|
||||||
|
|
||||||
&:after
|
|
||||||
position: absolute
|
|
||||||
z-index: -1
|
|
||||||
right: -50px
|
|
||||||
top: -87.87px
|
|
||||||
content: '\f25e'
|
|
||||||
font-size: 200px
|
|
||||||
font-family: 'Font Awesome 5 Brands'
|
|
||||||
opacity: .1
|
|
||||||
|
|
||||||
.level-left
|
|
||||||
flex-wrap: wrap
|
|
||||||
max-width: 100%
|
|
||||||
|
|
||||||
.licensing-title
|
|
||||||
@extend .mb-3
|
|
||||||
line-height: 1.2
|
|
||||||
|
|
||||||
p:not(:last-child)
|
|
||||||
@extend .mb-1
|
|
||||||
|
|
||||||
a
|
|
||||||
@extend .is-size-7, .has-text-grey
|
|
||||||
|
|
||||||
.licensing-meta
|
|
||||||
.level-item
|
|
||||||
@extend .mr-4
|
|
||||||
|
|
||||||
.icons
|
|
||||||
.icon
|
|
||||||
@extend .ml-1
|
|
||||||
width: 1.2em
|
|
||||||
height: 1.2em
|
|
||||||
font-size: 1.2em
|
|
||||||
vertical-align: bottom
|
|
||||||
|
|
||||||
h6
|
|
||||||
@extend .is-size-7
|
|
||||||
|
|
||||||
a
|
|
||||||
color: inherit
|
|
||||||
|
|
||||||
a
|
|
||||||
&.article-nav-prev
|
|
||||||
span
|
|
||||||
text-align: left
|
|
||||||
flex-shrink: 1
|
|
||||||
word-wrap: break-word
|
|
||||||
white-space: normal
|
|
||||||
|
|
||||||
&.article-nav-next
|
|
||||||
span
|
|
||||||
text-align: right
|
|
||||||
flex-shrink: 1
|
|
||||||
word-wrap: break-word
|
|
||||||
white-space: normal
|
|
|
@ -1,99 +0,0 @@
|
||||||
bulma-stylus-root = '../../../../node_modules/bulma-stylus/stylus'
|
|
||||||
|
|
||||||
/* ---------------------------------
|
|
||||||
* Override Bulma CSS Framework
|
|
||||||
* --------------------------------- */
|
|
||||||
$body-size ?= 14px
|
|
||||||
$body-background-color ?= #f7f7f7
|
|
||||||
|
|
||||||
$family-sans-serif ?= Ubuntu, Roboto, 'Open Sans', 'Microsoft YaHei', sans-serif
|
|
||||||
$family-code ?= 'Source Code Pro', monospace, 'Microsoft YaHei'
|
|
||||||
|
|
||||||
$size-7 ?= .85rem
|
|
||||||
$size-small ?= .75rem
|
|
||||||
|
|
||||||
$primary ?= $blue
|
|
||||||
$custom-colors ?= {
|
|
||||||
grey-lightest: {
|
|
||||||
'1': $grey-lightest
|
|
||||||
'2': $grey-darker
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$navbar-item-active-color ?= $primary
|
|
||||||
$footer-background-color ?= $scheme-main
|
|
||||||
|
|
||||||
$gap ?= 64px
|
|
||||||
$tablet ?= 769px
|
|
||||||
$desktop ?= 1088px
|
|
||||||
$widescreen ?= 1280px
|
|
||||||
$fullhd ?= 1472px
|
|
||||||
|
|
||||||
$shadow ?= 0 4px 10px rgba(0, 0, 0, 0.05)
|
|
||||||
|
|
||||||
$title-weight ?= $weight-normal
|
|
||||||
|
|
||||||
$control-height ?= 2.25em
|
|
||||||
$button-padding-vertical ?= calc(0.375em - 1px)
|
|
||||||
|
|
||||||
$card-radius ?= $radius
|
|
||||||
$card-media-margin ?= 0.75rem
|
|
||||||
$card-shadow ?= $shadow, 0 0 1px rgba(0, 0, 0, 0.1)
|
|
||||||
|
|
||||||
$menu-item-active-color ?= $link
|
|
||||||
$menu-item-active-background-color ?= hsl(219, 70%, 96%)
|
|
||||||
|
|
||||||
$content-heading-weight ?= $weight-normal
|
|
||||||
|
|
||||||
|
|
||||||
$logo-height ?= 1.75rem
|
|
||||||
|
|
||||||
// FIXME: https://github.com/groenroos/bulma-stylus/issues/11
|
|
||||||
@import bulma-stylus-root + '/utilities/initial-variables'
|
|
||||||
@import bulma-stylus-root + '/utilities/functions'
|
|
||||||
@import bulma-stylus-root + '/utilities/derived-variables'
|
|
||||||
|
|
||||||
$colors = merge($colors, $custom-colors)
|
|
||||||
|
|
||||||
@import bulma-stylus-root + '/utilities/animations'
|
|
||||||
@import bulma-stylus-root + '/utilities/mixins'
|
|
||||||
@import bulma-stylus-root + '/utilities/controls'
|
|
||||||
@import bulma-stylus-root + '/base/_all'
|
|
||||||
@import bulma-stylus-root + '/components/_all'
|
|
||||||
@import bulma-stylus-root + '/elements/_all'
|
|
||||||
@import bulma-stylus-root + '/form/_all'
|
|
||||||
@import bulma-stylus-root + '/grid/_all'
|
|
||||||
@import bulma-stylus-root + '/layout/_all'
|
|
||||||
|
|
||||||
html
|
|
||||||
height: 100%
|
|
||||||
-webkit-text-size-adjust: 100%
|
|
||||||
-moz-text-size-adjust: 100%
|
|
||||||
-ms-text-size-adjust: 100%
|
|
||||||
text-size-adjust: 100%
|
|
||||||
|
|
||||||
body
|
|
||||||
min-height: 100%
|
|
||||||
display: flex
|
|
||||||
flex-direction: column
|
|
||||||
|
|
||||||
body > .section
|
|
||||||
flex-grow: 1
|
|
||||||
|
|
||||||
+desktop()
|
|
||||||
::-webkit-scrollbar
|
|
||||||
width: 8px
|
|
||||||
height: 8px
|
|
||||||
|
|
||||||
::-webkit-scrollbar-track
|
|
||||||
border-radius: 3px
|
|
||||||
background: rgba(0,0,0,0.06)
|
|
||||||
box-shadow: inset 0 0 5px rgba(0,0,0,0.1)
|
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb
|
|
||||||
border-radius: 3px
|
|
||||||
background: rgba(0,0,0,0.12)
|
|
||||||
box-shadow: inset 0 0 10px rgba(0,0,0,0.2)
|
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb:hover
|
|
||||||
background: rgba(0,0,0,0.24)
|
|
|
@ -1,8 +0,0 @@
|
||||||
/* ---------------------------------
|
|
||||||
* Buttons
|
|
||||||
* --------------------------------- */
|
|
||||||
.button
|
|
||||||
&.is-transparent
|
|
||||||
color: inherit
|
|
||||||
background: transparent
|
|
||||||
border-color: transparent
|
|
|
@ -1,18 +0,0 @@
|
||||||
/* ---------------------------------
|
|
||||||
* Card
|
|
||||||
* --------------------------------- */
|
|
||||||
.card
|
|
||||||
overflow: visible
|
|
||||||
border-radius: $card-radius
|
|
||||||
|
|
||||||
& + .card, & + .column-right-shadow
|
|
||||||
margin-top: 1.5rem
|
|
||||||
|
|
||||||
.card-image
|
|
||||||
overflow: hidden
|
|
||||||
border-top-left-radius: $card-radius
|
|
||||||
border-top-right-radius: $card-radius
|
|
||||||
|
|
||||||
.media + .media
|
|
||||||
border: none
|
|
||||||
margin-top: 0
|
|
|
@ -1,105 +0,0 @@
|
||||||
/* ---------------------------------
|
|
||||||
* Code Highlight
|
|
||||||
* --------------------------------- */
|
|
||||||
$codeblock-caption-bg ?= rgba(200, 200, 200, .15)
|
|
||||||
|
|
||||||
figure.highlight
|
|
||||||
padding: 0
|
|
||||||
width: 100%
|
|
||||||
position: relative
|
|
||||||
margin: 1em 0 1em !important
|
|
||||||
border-radius: $radius
|
|
||||||
|
|
||||||
&.folded
|
|
||||||
.highlight-body
|
|
||||||
height: 0
|
|
||||||
|
|
||||||
.copy
|
|
||||||
opacity: .7
|
|
||||||
|
|
||||||
pre, table tr:hover
|
|
||||||
color: inherit
|
|
||||||
background: transparent
|
|
||||||
|
|
||||||
table
|
|
||||||
width: auto
|
|
||||||
|
|
||||||
tr td
|
|
||||||
border: none
|
|
||||||
|
|
||||||
tr:not(:first-child) td
|
|
||||||
padding-top: 0
|
|
||||||
|
|
||||||
tr:not(:last-child) td
|
|
||||||
padding-bottom: 0
|
|
||||||
|
|
||||||
pre
|
|
||||||
padding: 0
|
|
||||||
overflow: visible
|
|
||||||
|
|
||||||
.line, code .hljs
|
|
||||||
line-height: 1.5rem
|
|
||||||
|
|
||||||
figcaption, .gutter
|
|
||||||
background: $codeblock-caption-bg
|
|
||||||
|
|
||||||
figcaption
|
|
||||||
margin: 0 !important
|
|
||||||
padding: .3em 0em .3em .75em
|
|
||||||
font-style: normal
|
|
||||||
font-size: .8em
|
|
||||||
|
|
||||||
*
|
|
||||||
color: inherit
|
|
||||||
|
|
||||||
span
|
|
||||||
font-weight: 500
|
|
||||||
font-family: $family-code
|
|
||||||
|
|
||||||
.level-left *:not(:last-child)
|
|
||||||
margin-right: .5em
|
|
||||||
|
|
||||||
.level-right *:not(:first-child)
|
|
||||||
margin-left: .5em
|
|
||||||
|
|
||||||
.fold
|
|
||||||
cursor: pointer
|
|
||||||
|
|
||||||
&.level
|
|
||||||
overflow: auto
|
|
||||||
|
|
||||||
.level-right
|
|
||||||
a
|
|
||||||
padding: 0em .75em
|
|
||||||
|
|
||||||
.highlight-body
|
|
||||||
overflow: auto
|
|
||||||
|
|
||||||
.gutter
|
|
||||||
text-align: right
|
|
||||||
|
|
||||||
.tag, .title, .number, .section
|
|
||||||
display: inherit
|
|
||||||
font: inherit
|
|
||||||
margin: inherit
|
|
||||||
padding: inherit
|
|
||||||
background: inherit
|
|
||||||
height: inherit
|
|
||||||
text-align: inherit
|
|
||||||
vertical-align: inherit
|
|
||||||
min-width: inherit
|
|
||||||
border-radius: inherit
|
|
||||||
|
|
||||||
/* ---------------------------------
|
|
||||||
* Fix Gist Snippet
|
|
||||||
* --------------------------------- */
|
|
||||||
.gist
|
|
||||||
table
|
|
||||||
tr:hover
|
|
||||||
background: transparent
|
|
||||||
|
|
||||||
td
|
|
||||||
border: none
|
|
||||||
|
|
||||||
.file
|
|
||||||
all: initial
|
|
|
@ -1,58 +0,0 @@
|
||||||
/* ---------------------------------
|
|
||||||
* Donate Buttons
|
|
||||||
* --------------------------------- */
|
|
||||||
$donate-qrcode-max-width ?= 280px
|
|
||||||
$donate-qrcode-shadow ?= $card-shadow
|
|
||||||
$donate-qrcode-box-radius ?= $card-radius
|
|
||||||
|
|
||||||
$donate-button-colors ?= {
|
|
||||||
'afdian': rgb(136, 95, 217),
|
|
||||||
'alipay': rgb(0, 160, 232),
|
|
||||||
'buymeacoffee': rgb(255, 221, 0),
|
|
||||||
'paypal': rgb(254, 183, 0),
|
|
||||||
'patreon': rgb(255, 66, 77),
|
|
||||||
'wechat': rgb(26, 173, 25),
|
|
||||||
}
|
|
||||||
|
|
||||||
.donate
|
|
||||||
position: relative
|
|
||||||
|
|
||||||
.qrcode
|
|
||||||
display: none
|
|
||||||
position: absolute
|
|
||||||
z-index: 99
|
|
||||||
bottom: 2.5em
|
|
||||||
line-height: 0
|
|
||||||
overflow: hidden
|
|
||||||
box-shadow: $donate-qrcode-shadow
|
|
||||||
border-radius: $donate-qrcode-box-radius
|
|
||||||
|
|
||||||
img
|
|
||||||
max-width: $donate-qrcode-max-width
|
|
||||||
|
|
||||||
&:hover
|
|
||||||
.qrcode
|
|
||||||
display: block
|
|
||||||
|
|
||||||
&:first-child:not(:last-child)
|
|
||||||
.qrcode
|
|
||||||
left: -.75rem
|
|
||||||
|
|
||||||
&:last-child:not(:first-child)
|
|
||||||
.qrcode
|
|
||||||
right: -.75rem
|
|
||||||
|
|
||||||
for $name, $color in $donate-button-colors
|
|
||||||
&[data-type={'"' + $name + '"'}]
|
|
||||||
color: findColorInvert($color)
|
|
||||||
background-color: $color
|
|
||||||
border-color: transparent
|
|
||||||
|
|
||||||
&:active
|
|
||||||
background-color: darken($color, 5%)
|
|
||||||
|
|
||||||
&:hover
|
|
||||||
background-color: darken($color, 2.5%)
|
|
||||||
|
|
||||||
&:focus:not(:active)
|
|
||||||
box-shadow: 0 0 0 .125em rgba($color, .25)
|
|
|
@ -1,20 +0,0 @@
|
||||||
/* ---------------------------------
|
|
||||||
* Page Footer
|
|
||||||
* --------------------------------- */
|
|
||||||
footer.footer
|
|
||||||
.level-start
|
|
||||||
+mobile()
|
|
||||||
text-align: center
|
|
||||||
|
|
||||||
.level-end
|
|
||||||
.field
|
|
||||||
flex-wrap: wrap
|
|
||||||
align-items: center
|
|
||||||
|
|
||||||
+mobile()
|
|
||||||
justify-content: center
|
|
||||||
margin-top: 1rem
|
|
||||||
|
|
||||||
.footer-logo
|
|
||||||
img
|
|
||||||
max-height: $logo-height
|
|
|
@ -1,162 +0,0 @@
|
||||||
/* ---------------------------------
|
|
||||||
* Spacing helpers
|
|
||||||
* --------------------------------- */
|
|
||||||
$spacer ?= 1rem
|
|
||||||
$spacers ?= 0, $spacer * .25, $spacer * .5, $spacer, $spacer * 1.5, $spacer * 3
|
|
||||||
|
|
||||||
for n in (0 .. 5)
|
|
||||||
.ml-{n}
|
|
||||||
margin-left: $spacers[n] !important
|
|
||||||
|
|
||||||
.mr-{n}
|
|
||||||
margin-right: $spacers[n] !important
|
|
||||||
|
|
||||||
.mx-{n}
|
|
||||||
@extend .ml-{n}, .mr-{n}
|
|
||||||
|
|
||||||
.ml-n{n}
|
|
||||||
margin-left: - $spacers[n] !important
|
|
||||||
|
|
||||||
.mr-n{n}
|
|
||||||
margin-right: - $spacers[n] !important
|
|
||||||
|
|
||||||
.mx-n{n}
|
|
||||||
@extend .ml-n{n}, .mr-n{n}
|
|
||||||
|
|
||||||
.mt-{n}
|
|
||||||
margin-top: $spacers[n] !important
|
|
||||||
|
|
||||||
.mb-{n}
|
|
||||||
margin-bottom: $spacers[n] !important
|
|
||||||
|
|
||||||
.my-{n}
|
|
||||||
@extend .mt-{n}, .mb-{n}
|
|
||||||
|
|
||||||
.mt-n{n}
|
|
||||||
margin-top: - $spacers[n] !important
|
|
||||||
|
|
||||||
.mb-n{n}
|
|
||||||
margin-bottom: - $spacers[n] !important
|
|
||||||
|
|
||||||
.my-n{n}
|
|
||||||
@extend .mt-n{n}, .mb-n{n}
|
|
||||||
|
|
||||||
.pl-{n}
|
|
||||||
padding-left: $spacers[n] !important
|
|
||||||
|
|
||||||
.pr-{n}
|
|
||||||
padding-right: $spacers[n] !important
|
|
||||||
|
|
||||||
.px-{n}
|
|
||||||
@extend .pl-{n}, .pr-{n}
|
|
||||||
|
|
||||||
.pl-n{n}
|
|
||||||
padding-left: - $spacers[n] !important
|
|
||||||
|
|
||||||
.pr-n{n}
|
|
||||||
padding-right: - $spacers[n] !important
|
|
||||||
|
|
||||||
.px-n{n}
|
|
||||||
@extend .pl-n{n}, .pr-n{n}
|
|
||||||
|
|
||||||
.pt-{n}
|
|
||||||
padding-top: $spacers[n] !important
|
|
||||||
|
|
||||||
.pb-{n}
|
|
||||||
padding-bottom: $spacers[n] !important
|
|
||||||
|
|
||||||
.py-{n}
|
|
||||||
@extend .pt-{n}, .pb-{n}
|
|
||||||
|
|
||||||
.pt-n{n}
|
|
||||||
padding-top: - $spacers[n] !important
|
|
||||||
|
|
||||||
.pb-n{n}
|
|
||||||
padding-bottom: - $spacers[n] !important
|
|
||||||
|
|
||||||
.py-n{n}
|
|
||||||
@extend .pt-n{n}, .pb-n{n}
|
|
||||||
|
|
||||||
.ml-auto
|
|
||||||
margin-left: auto !important
|
|
||||||
|
|
||||||
.mr-auto
|
|
||||||
margin-right: auto !important
|
|
||||||
|
|
||||||
.mx-auto
|
|
||||||
@extend .ml-auto, .mr-auto
|
|
||||||
|
|
||||||
.mt-auto
|
|
||||||
margin-top: auto !important
|
|
||||||
|
|
||||||
.mb-auto
|
|
||||||
margin-bottom: auto !important
|
|
||||||
|
|
||||||
.my-auto
|
|
||||||
@extend .mt-auto, .mb-auto
|
|
||||||
|
|
||||||
.pl-auto
|
|
||||||
margin-left: auto !important
|
|
||||||
|
|
||||||
.pr-auto
|
|
||||||
margin-right: auto !important
|
|
||||||
|
|
||||||
.px-auto
|
|
||||||
@extend .pl-auto, .pr-auto
|
|
||||||
|
|
||||||
.pt-auto
|
|
||||||
margin-top: auto !important
|
|
||||||
|
|
||||||
.pb-auto
|
|
||||||
margin-bottom: auto !important
|
|
||||||
|
|
||||||
.py-auto
|
|
||||||
@extend .pt-auto, .pb-auto
|
|
||||||
|
|
||||||
/* ---------------------------------
|
|
||||||
* Flex helpers
|
|
||||||
* --------------------------------- */
|
|
||||||
for n in (0 .. 5)
|
|
||||||
.order-{n}
|
|
||||||
order: n !important
|
|
||||||
|
|
||||||
.justify-content-start
|
|
||||||
justify-content: start !important
|
|
||||||
|
|
||||||
.justify-content-center
|
|
||||||
justify-content: center !important
|
|
||||||
|
|
||||||
.flex-shrink-1
|
|
||||||
flex-shrink: 1 !important
|
|
||||||
|
|
||||||
/* ---------------------------------
|
|
||||||
* Color helpers
|
|
||||||
* --------------------------------- */
|
|
||||||
.link-muted
|
|
||||||
color: inherit
|
|
||||||
|
|
||||||
&:hover
|
|
||||||
color: $primary !important
|
|
||||||
|
|
||||||
/* ---------------------------------
|
|
||||||
* Image helpers
|
|
||||||
* --------------------------------- */
|
|
||||||
.image
|
|
||||||
&.is-7by3
|
|
||||||
padding-top: 42.8%
|
|
||||||
|
|
||||||
img
|
|
||||||
bottom: 0
|
|
||||||
left: 0
|
|
||||||
position: absolute
|
|
||||||
right: 0
|
|
||||||
top: 0
|
|
||||||
|
|
||||||
.avatar
|
|
||||||
height: 100%
|
|
||||||
object-fit: cover
|
|
||||||
|
|
||||||
.fill
|
|
||||||
object-fit: cover
|
|
||||||
width: 100% !important
|
|
||||||
height: 100% !important
|
|
|
@ -1,53 +0,0 @@
|
||||||
/* ---------------------------------
|
|
||||||
* Top Navigation
|
|
||||||
* --------------------------------- */
|
|
||||||
$navbar-item-padding-v ?= 1.25rem
|
|
||||||
$navbar-item-padding-h ?= .75rem
|
|
||||||
$navbar-item-margin-v ?= 0
|
|
||||||
$navbar-item-margin-h ?= 0
|
|
||||||
|
|
||||||
.navbar-main
|
|
||||||
box-shadow: $shadow
|
|
||||||
|
|
||||||
.navbar-menu, .navbar-start, .navbar-end
|
|
||||||
align-items: stretch
|
|
||||||
display: flex
|
|
||||||
padding: 0
|
|
||||||
flex-shrink: 0
|
|
||||||
|
|
||||||
.navbar-menu
|
|
||||||
flex-grow: 1
|
|
||||||
flex-shrink: 0
|
|
||||||
overflow-x: auto
|
|
||||||
|
|
||||||
.navbar-start
|
|
||||||
justify-content: flex-start
|
|
||||||
margin-right: auto
|
|
||||||
|
|
||||||
.navbar-end
|
|
||||||
justify-content: flex-end
|
|
||||||
margin-left: auto
|
|
||||||
|
|
||||||
.navbar-item
|
|
||||||
display: flex
|
|
||||||
align-items: center
|
|
||||||
padding: $navbar-item-padding-v $navbar-item-padding-h
|
|
||||||
margin: $navbar-item-margin-v $navbar-item-margin-h
|
|
||||||
|
|
||||||
&.is-active
|
|
||||||
background-color: transparent
|
|
||||||
|
|
||||||
+until($navbar-breakpoint)
|
|
||||||
.navbar-menu
|
|
||||||
justify-content: center
|
|
||||||
box-shadow: none
|
|
||||||
|
|
||||||
.navbar-start
|
|
||||||
margin-right: 0
|
|
||||||
|
|
||||||
.navbar-end
|
|
||||||
margin-left: 0
|
|
||||||
|
|
||||||
.navbar-logo
|
|
||||||
img
|
|
||||||
max-height: $logo-height
|
|
|
@ -1,32 +0,0 @@
|
||||||
/* ---------------------------------
|
|
||||||
* Pagination and Post Navigation
|
|
||||||
* --------------------------------- */
|
|
||||||
$pagination-box-shadow ?= $card-shadow
|
|
||||||
$pagination-background-color ?= $button-background-color
|
|
||||||
$post-navigation-fg ?= $grey
|
|
||||||
|
|
||||||
.pagination
|
|
||||||
@extend .pagination.is-centered
|
|
||||||
margin-top: 1.5rem
|
|
||||||
|
|
||||||
.pagination-link,
|
|
||||||
.pagination-ellipsis,
|
|
||||||
.pagination-previous,
|
|
||||||
.pagination-next
|
|
||||||
a
|
|
||||||
color: $pagination-color
|
|
||||||
.pagination-link,
|
|
||||||
.pagination-previous,
|
|
||||||
.pagination-next
|
|
||||||
border: none
|
|
||||||
background: $pagination-background-color
|
|
||||||
box-shadow: $pagination-box-shadow
|
|
||||||
.pagination-link.is-current
|
|
||||||
background: $pagination-current-background-color
|
|
||||||
|
|
||||||
.post-navigation
|
|
||||||
color: $post-navigation-fg
|
|
||||||
flex-wrap: wrap
|
|
||||||
justify-content: space-around
|
|
||||||
.level-item
|
|
||||||
margin-bottom: 0
|
|
|
@ -1,128 +0,0 @@
|
||||||
/* ---------------------------------
|
|
||||||
* Back to Top Button
|
|
||||||
* --------------------------------- */
|
|
||||||
#back-to-top
|
|
||||||
position: fixed
|
|
||||||
opacity: 0
|
|
||||||
outline: none
|
|
||||||
padding: 8px 0
|
|
||||||
line-height: 24px
|
|
||||||
border-radius: $card-radius
|
|
||||||
transform: translateY(120px)
|
|
||||||
transition: .4s ease opacity, .4s ease width, .4s ease transform, .4s ease border-radius
|
|
||||||
|
|
||||||
&.is-rounded
|
|
||||||
border-radius: 50%
|
|
||||||
|
|
||||||
&.fade-in
|
|
||||||
opacity: 1
|
|
||||||
|
|
||||||
&.rise-up
|
|
||||||
transform: translateY(0)
|
|
||||||
|
|
||||||
/* ---------------------------------
|
|
||||||
* Gallery Plugin
|
|
||||||
* --------------------------------- */
|
|
||||||
.gallery-item
|
|
||||||
.caption
|
|
||||||
color: $grey
|
|
||||||
|
|
||||||
/* ---------------------------------
|
|
||||||
* Page Loading Progressbar
|
|
||||||
* --------------------------------- */
|
|
||||||
.pace
|
|
||||||
user-select: none
|
|
||||||
pointer-events: none
|
|
||||||
|
|
||||||
.pace-progress
|
|
||||||
top: 0
|
|
||||||
right: 100%
|
|
||||||
width: 100%
|
|
||||||
height: 2px
|
|
||||||
z-index: 2000
|
|
||||||
position: fixed
|
|
||||||
background: $primary
|
|
||||||
|
|
||||||
.pace-inactive
|
|
||||||
display: none
|
|
||||||
|
|
||||||
/* ---------------------------------
|
|
||||||
* Fix FontAwesome Icons
|
|
||||||
* --------------------------------- */
|
|
||||||
.fa, .fab, .fal, .far, .fas
|
|
||||||
line-height: inherit
|
|
||||||
|
|
||||||
/* ---------------------------------
|
|
||||||
* MathJax and KaTeX
|
|
||||||
* --------------------------------- */
|
|
||||||
.MathJax, .katex-display
|
|
||||||
overflow-x: auto
|
|
||||||
overflow-y: hidden
|
|
||||||
|
|
||||||
.katex
|
|
||||||
white-space: nowrap
|
|
||||||
|
|
||||||
.katex-display
|
|
||||||
margin-top: -1em !important
|
|
||||||
|
|
||||||
.katex-html
|
|
||||||
padding-top: 1em
|
|
||||||
|
|
||||||
.tag
|
|
||||||
align-items: unset
|
|
||||||
background-color: unset
|
|
||||||
border-radius: unset
|
|
||||||
color: unset
|
|
||||||
display: unset
|
|
||||||
font-size: unset
|
|
||||||
height: unset
|
|
||||||
justify-content: unset
|
|
||||||
line-height: unset
|
|
||||||
padding-left: unset
|
|
||||||
padding-right: unset
|
|
||||||
white-space: unset
|
|
||||||
|
|
||||||
/* ---------------------------------
|
|
||||||
* Cookie Consent
|
|
||||||
* --------------------------------- */
|
|
||||||
.cc-window, .cc-revoke
|
|
||||||
font-size: 1.1rem !important
|
|
||||||
font-family: $family-sans-serif !important
|
|
||||||
|
|
||||||
.cc-window
|
|
||||||
color: $text !important
|
|
||||||
background-color: $scheme-main !important
|
|
||||||
|
|
||||||
&.cc-floating
|
|
||||||
border-radius: $card-radius
|
|
||||||
box-shadow: $card-shadow
|
|
||||||
|
|
||||||
&.cc-banner
|
|
||||||
background-color: darken($scheme-main, 2.5%) !important
|
|
||||||
|
|
||||||
&.cc-theme-block, &.cc-theme-classic
|
|
||||||
.cc-compliance > .cc-btn
|
|
||||||
border-radius: $radius-rounded
|
|
||||||
|
|
||||||
.cc-compliance > .cc-btn
|
|
||||||
font-weight: 400
|
|
||||||
border: none
|
|
||||||
color: $primary-invert
|
|
||||||
background-color: $primary
|
|
||||||
|
|
||||||
&:hover, &:focus
|
|
||||||
background-color: darken($primary, 2.5%)
|
|
||||||
|
|
||||||
&.cc-deny
|
|
||||||
&:hover
|
|
||||||
color: $primary
|
|
||||||
text-decoration: none
|
|
||||||
|
|
||||||
.cc-revoke
|
|
||||||
padding: .5rem 1rem !important
|
|
||||||
color: $primary-invert !important
|
|
||||||
background-color: $primary !important
|
|
||||||
|
|
||||||
&:hover
|
|
||||||
text-decoration: none !important
|
|
||||||
background-color: darken($primary, 2.5%)
|
|
|
@ -1,32 +0,0 @@
|
||||||
/* ---------------------------------
|
|
||||||
* Responsive Layout
|
|
||||||
* --------------------------------- */
|
|
||||||
+widescreen()
|
|
||||||
.is-1-column .container, .is-2-column .container
|
|
||||||
max-width: $desktop - 2 * $gap
|
|
||||||
width: $desktop - 2 * $gap
|
|
||||||
|
|
||||||
+fullhd()
|
|
||||||
.is-2-column .container
|
|
||||||
max-width: $widescreen - 2 * $gap
|
|
||||||
width: $widescreen - 2 * $gap
|
|
||||||
|
|
||||||
.is-1-column .container
|
|
||||||
max-width: $desktop - 2 * $gap
|
|
||||||
width: $desktop - 2 * $gap
|
|
||||||
|
|
||||||
+tablet()
|
|
||||||
.is-sticky
|
|
||||||
position: -webkit-sticky
|
|
||||||
position: sticky
|
|
||||||
top: 1.5rem
|
|
||||||
z-index: 99
|
|
||||||
|
|
||||||
.column-main, .column-left, .column-right, .column-right-shadow
|
|
||||||
&.is-sticky
|
|
||||||
top: .75rem
|
|
||||||
align-self: flex-start
|
|
||||||
|
|
||||||
+mobile()
|
|
||||||
.section
|
|
||||||
padding: 1.5rem 1rem
|
|
|
@ -1,204 +0,0 @@
|
||||||
/* ---------------------------------
|
|
||||||
* Search Box
|
|
||||||
* --------------------------------- */
|
|
||||||
// container sizes
|
|
||||||
$searchbox-container-width ?= 540px
|
|
||||||
$searchbox-container-margin ?= 100px
|
|
||||||
$searchbox-breakpoint-width ?= 559px
|
|
||||||
$searchbox-breakpoint-height ?= 479px
|
|
||||||
// overlay and container styles
|
|
||||||
$searchbox-box-shadow ?= $card-shadow
|
|
||||||
$searchbox-border-radius ?= $radius
|
|
||||||
$searchbox-bg-overlay ?= $modal-background-background-color
|
|
||||||
$searchbox-bg-container ?= $white-ter
|
|
||||||
$searchbox-border ?= $border
|
|
||||||
// header styles
|
|
||||||
$searchbox-bg-input ?= $white
|
|
||||||
$searchbox-bg-close-hover ?= $searchbox-bg-container
|
|
||||||
$searchbox-bg-close-active ?= $grey-lighter
|
|
||||||
// body styles
|
|
||||||
$searchbox-fg-result-header ?= $grey-light
|
|
||||||
$searchbox-fg-result-item-secondary ?= $grey-light
|
|
||||||
$searchbox-bg-result-item-hover ?= $searchbox-bg-input
|
|
||||||
$searchbox-fg-result-item-active ?= findColorInvert($primary)
|
|
||||||
$searchbox-bg-result-item-active ?= $primary
|
|
||||||
$searchbox-bg-result-item-highlight ?= $yellow
|
|
||||||
// footer styles
|
|
||||||
$searchbox-bg-pagination-item ?= $searchbox-bg-input
|
|
||||||
$searchbox-bg-pagination-item-hover ?= $searchbox-bg-container
|
|
||||||
$searchbox-fg-pagination-item-active ?= findColorInvert($primary)
|
|
||||||
$searchbox-bg-pagination-item-active ?= $primary
|
|
||||||
$searchbox-bg-pagination-item-disabled ?= $searchbox-bg-container
|
|
||||||
|
|
||||||
.searchbox
|
|
||||||
display: none
|
|
||||||
top: 0
|
|
||||||
left: 0
|
|
||||||
width: 100%
|
|
||||||
height: 100%
|
|
||||||
z-index: 100
|
|
||||||
font-size: 1rem
|
|
||||||
line-height: 0
|
|
||||||
background: $searchbox-bg-overlay
|
|
||||||
|
|
||||||
&.show
|
|
||||||
display: flex
|
|
||||||
|
|
||||||
a, a:hover
|
|
||||||
color: inherit
|
|
||||||
text-decoration: none
|
|
||||||
|
|
||||||
input
|
|
||||||
font-size: 1rem
|
|
||||||
border: none
|
|
||||||
outline: none
|
|
||||||
box-shadow: none
|
|
||||||
border-radius: 0
|
|
||||||
|
|
||||||
&, .searchbox-container
|
|
||||||
position: fixed
|
|
||||||
align-items: center
|
|
||||||
flex-direction: column
|
|
||||||
line-height: 1.25em
|
|
||||||
|
|
||||||
.searchbox-container
|
|
||||||
z-index: 101
|
|
||||||
display: flex
|
|
||||||
overflow: hidden
|
|
||||||
box-shadow: $searchbox-box-shadow
|
|
||||||
border-radius: $searchbox-border-radius
|
|
||||||
background-color: $searchbox-bg-container
|
|
||||||
width: $searchbox-container-width
|
|
||||||
top: $searchbox-container-margin
|
|
||||||
bottom: $searchbox-container-margin
|
|
||||||
|
|
||||||
.searchbox-header, .searchbox-body, .searchbox-footer
|
|
||||||
width: 100%
|
|
||||||
|
|
||||||
.searchbox-header
|
|
||||||
display: flex
|
|
||||||
flex-direction: row
|
|
||||||
line-height: 1.5em
|
|
||||||
font-weight: normal
|
|
||||||
background-color: $searchbox-bg-input
|
|
||||||
// fix Chrome 71 height issue
|
|
||||||
// https://github.com/ppoffice/hexo-theme-icarus/issues/719
|
|
||||||
min-height: 3rem
|
|
||||||
|
|
||||||
.searchbox-input-container
|
|
||||||
display: flex
|
|
||||||
flex-grow: 1
|
|
||||||
|
|
||||||
.searchbox-input
|
|
||||||
flex-grow: 1
|
|
||||||
color: inherit
|
|
||||||
box-sizing: border-box
|
|
||||||
padding: .75em 0 .75em 1.25em
|
|
||||||
background: $searchbox-bg-input
|
|
||||||
|
|
||||||
.searchbox-close
|
|
||||||
display: inline-block
|
|
||||||
font-size: 1.5em
|
|
||||||
padding: .5em .75em
|
|
||||||
cursor: pointer
|
|
||||||
|
|
||||||
&:hover
|
|
||||||
background: $searchbox-bg-close-hover
|
|
||||||
|
|
||||||
&:active
|
|
||||||
background: $searchbox-bg-close-active
|
|
||||||
|
|
||||||
.searchbox-body
|
|
||||||
flex-grow: 1
|
|
||||||
overflow-y: auto
|
|
||||||
border-top: 1px solid $searchbox-border
|
|
||||||
|
|
||||||
.searchbox-result-section header, .searchbox-result-item
|
|
||||||
padding: .75em 1em
|
|
||||||
|
|
||||||
.searchbox-result-section
|
|
||||||
border-bottom: 1px solid $searchbox-border
|
|
||||||
|
|
||||||
header
|
|
||||||
color: $searchbox-fg-result-header
|
|
||||||
|
|
||||||
.searchbox-result-item
|
|
||||||
display: flex
|
|
||||||
flex-direction: row
|
|
||||||
|
|
||||||
&:not(.disabled):not(.active):not(:active):hover
|
|
||||||
background-color: $searchbox-bg-result-item-hover
|
|
||||||
|
|
||||||
&:active, &.active
|
|
||||||
color: $searchbox-fg-result-item-active
|
|
||||||
background-color: $searchbox-bg-result-item-active
|
|
||||||
|
|
||||||
em
|
|
||||||
font-style: normal
|
|
||||||
background: $searchbox-bg-result-item-highlight
|
|
||||||
|
|
||||||
.searchbox-result-icon
|
|
||||||
margin-right: 1em
|
|
||||||
|
|
||||||
.searchbox-result-content
|
|
||||||
overflow: hidden
|
|
||||||
|
|
||||||
.searchbox-result-title, .searchbox-result-preview
|
|
||||||
display: block
|
|
||||||
overflow: hidden
|
|
||||||
white-space: nowrap
|
|
||||||
text-overflow: ellipsis
|
|
||||||
|
|
||||||
.searchbox-result-title-secondary
|
|
||||||
color: $searchbox-fg-result-item-secondary
|
|
||||||
|
|
||||||
.searchbox-result-preview
|
|
||||||
margin-top: .25em
|
|
||||||
|
|
||||||
.searchbox-result-item:not(:active):not(.active)
|
|
||||||
.searchbox-result-preview
|
|
||||||
color: $searchbox-fg-result-item-secondary
|
|
||||||
|
|
||||||
.searchbox-footer
|
|
||||||
padding: .5em 1em
|
|
||||||
|
|
||||||
.searchbox-pagination
|
|
||||||
margin: 0
|
|
||||||
padding: 0
|
|
||||||
list-style: none
|
|
||||||
text-align: center
|
|
||||||
|
|
||||||
.searchbox-pagination-item
|
|
||||||
margin: 0 .25rem
|
|
||||||
|
|
||||||
.searchbox-pagination-item, .searchbox-pagination-link
|
|
||||||
display: inline-block
|
|
||||||
|
|
||||||
.searchbox-pagination-link
|
|
||||||
overflow: hidden
|
|
||||||
padding: .5em .8em
|
|
||||||
box-shadow: $searchbox-box-shadow
|
|
||||||
border-radius: $searchbox-border-radius
|
|
||||||
background-color: $searchbox-bg-pagination-item
|
|
||||||
|
|
||||||
.searchbox-pagination-item.active
|
|
||||||
.searchbox-pagination-link
|
|
||||||
color: $searchbox-fg-pagination-item-active
|
|
||||||
background-color: $searchbox-bg-pagination-item-active
|
|
||||||
|
|
||||||
.searchbox-pagination-item.disabled
|
|
||||||
.searchbox-pagination-link
|
|
||||||
cursor: not-allowed
|
|
||||||
background-color: $searchbox-bg-pagination-item-disabled
|
|
||||||
|
|
||||||
.searchbox-pagination-item:not(.active):not(.disabled)
|
|
||||||
.searchbox-pagination-link:hover
|
|
||||||
background-color: $searchbox-bg-pagination-item-hover
|
|
||||||
|
|
||||||
@media screen and (max-width: $searchbox-breakpoint-width), screen and (max-height: $searchbox-breakpoint-height)
|
|
||||||
.searchbox .searchbox-container
|
|
||||||
top: 0
|
|
||||||
left: 0
|
|
||||||
width: 100%
|
|
||||||
height: 100%
|
|
||||||
border-radius: 0
|
|
|
@ -1,38 +0,0 @@
|
||||||
/* ---------------------------------
|
|
||||||
* Archive Timeline
|
|
||||||
* --------------------------------- */
|
|
||||||
$timeline-fg-line ?= $grey-lighter
|
|
||||||
$timeline-bg-line ?= $card-background-color
|
|
||||||
|
|
||||||
.timeline
|
|
||||||
margin-left: 1rem
|
|
||||||
padding: 1rem 0 0 1.5rem
|
|
||||||
border-left: 1px solid $timeline-fg-line
|
|
||||||
|
|
||||||
.media
|
|
||||||
position: relative
|
|
||||||
|
|
||||||
&:before, &:last-child:after
|
|
||||||
content: ''
|
|
||||||
display: block
|
|
||||||
position: absolute
|
|
||||||
left: calc(-.375rem - 1.5rem - .25px)
|
|
||||||
|
|
||||||
&:before
|
|
||||||
width: .75rem
|
|
||||||
height: .75rem
|
|
||||||
top: calc(1rem + 1.5 * .85rem / 2 - .75rem / 2)
|
|
||||||
background: $timeline-fg-line
|
|
||||||
border-radius: 50%
|
|
||||||
|
|
||||||
&:first-child:before
|
|
||||||
top: calc(1.5 * .85rem / 2 - .75rem / 2)
|
|
||||||
|
|
||||||
&:last-child:after
|
|
||||||
width: .75rem
|
|
||||||
top: calc(1rem + 1.5 * .85rem / 2 + .75rem / 2)
|
|
||||||
bottom: 0
|
|
||||||
background: $timeline-bg-line
|
|
||||||
|
|
||||||
&:first-child:last-child:after
|
|
||||||
top: calc(1.5 * .85rem / 2 + .75rem / 2)
|
|
|
@ -1,65 +0,0 @@
|
||||||
.widget
|
|
||||||
.menu-list
|
|
||||||
li
|
|
||||||
ul
|
|
||||||
margin-right: 0
|
|
||||||
|
|
||||||
.level
|
|
||||||
margin-bottom: 0
|
|
||||||
|
|
||||||
.level-left, .level-right, .level-item
|
|
||||||
flex-shrink: 1
|
|
||||||
|
|
||||||
.level-left, .level-right
|
|
||||||
align-items: flex-start
|
|
||||||
|
|
||||||
.tag
|
|
||||||
background: $light-grey
|
|
||||||
color: $white-invert
|
|
||||||
|
|
||||||
.tags
|
|
||||||
.tag:first-child
|
|
||||||
background: $primary
|
|
||||||
color: $primary-invert
|
|
||||||
|
|
||||||
.tag:last-child
|
|
||||||
background: $light-grey
|
|
||||||
color: $white-invert
|
|
||||||
|
|
||||||
.level.is-multiline
|
|
||||||
flex-wrap: wrap
|
|
||||||
|
|
||||||
/* ---------------------------------
|
|
||||||
* Table of Content Widget
|
|
||||||
* --------------------------------- */
|
|
||||||
+mobile()
|
|
||||||
.widget.card#toc
|
|
||||||
display: none
|
|
||||||
position: fixed
|
|
||||||
margin: 1rem
|
|
||||||
left: 0
|
|
||||||
right: 0
|
|
||||||
bottom: 0
|
|
||||||
z-index: 100
|
|
||||||
|
|
||||||
.card-content
|
|
||||||
padding: 0
|
|
||||||
|
|
||||||
.menu
|
|
||||||
padding: 1.5rem
|
|
||||||
max-height: calc(100vh - 2rem)
|
|
||||||
overflow-y: auto
|
|
||||||
|
|
||||||
#toc-mask
|
|
||||||
display: none
|
|
||||||
position: fixed
|
|
||||||
top: 0
|
|
||||||
left: 0
|
|
||||||
right: 0
|
|
||||||
bottom: 0
|
|
||||||
z-index: 99
|
|
||||||
background: rgba(0, 0, 0, .7)
|
|
||||||
|
|
||||||
.widget.card#toc, #toc-mask
|
|
||||||
&.is-active
|
|
||||||
display: block
|
|
|
@ -1,15 +0,0 @@
|
||||||
let chalk;
|
|
||||||
try {
|
|
||||||
chalk = require('chalk'); // eslint-disable-line node/no-extraneous-require
|
|
||||||
} catch (e) { }
|
|
||||||
|
|
||||||
module.exports = new Proxy({}, {
|
|
||||||
get(obj, prop) {
|
|
||||||
if (chalk) {
|
|
||||||
return chalk[prop];
|
|
||||||
}
|
|
||||||
return function() {
|
|
||||||
return arguments.length === 1 ? arguments[0] : arguments;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
});
|
|
|
@ -1,65 +0,0 @@
|
||||||
common:
|
|
||||||
archive:
|
|
||||||
one: 'Archiv'
|
|
||||||
other: 'Archive'
|
|
||||||
category:
|
|
||||||
one: 'Kategorie'
|
|
||||||
other: 'Kategorien'
|
|
||||||
tag:
|
|
||||||
one: 'Tag'
|
|
||||||
other: 'Tags'
|
|
||||||
post:
|
|
||||||
one: 'Seite'
|
|
||||||
other: 'Seiten'
|
|
||||||
page:
|
|
||||||
one: 'Page'
|
|
||||||
other: 'Pages'
|
|
||||||
prev: 'Zurück'
|
|
||||||
next: 'Weiter'
|
|
||||||
widget:
|
|
||||||
follow: 'Folgen'
|
|
||||||
recents: 'Letzte Einträge'
|
|
||||||
links: 'Links'
|
|
||||||
catalogue: 'Katalog'
|
|
||||||
subscribe_email: 'Abonnieren Sie Updates'
|
|
||||||
subscribe: 'Abonnieren'
|
|
||||||
adsense: 'Werbung'
|
|
||||||
article:
|
|
||||||
created_at: 'Gepostet vor %s'
|
|
||||||
updated_at: 'Aktualisiert vor %s'
|
|
||||||
more: 'Mehr lesen'
|
|
||||||
comments: 'Kommentare'
|
|
||||||
read_time: '%s lesen'
|
|
||||||
word_count:
|
|
||||||
one: 'Über %d Wort'
|
|
||||||
other: 'Über %d Wörter'
|
|
||||||
licensing:
|
|
||||||
author: 'Author'
|
|
||||||
created_at: 'Posted on'
|
|
||||||
updated_at: 'Updated on'
|
|
||||||
licensed_under: 'Licensed under'
|
|
||||||
donate:
|
|
||||||
title: 'Gefällt Ihnen der Artikel? Unterstützen Sie den Autor mit'
|
|
||||||
afdian: 'Afdian.net'
|
|
||||||
alipay: 'Alipay'
|
|
||||||
wechat: 'Wechat'
|
|
||||||
paypal: 'Paypal'
|
|
||||||
patreon: 'Patreon'
|
|
||||||
buymeacoffee: 'Kauf mir einen Kaffee'
|
|
||||||
plugin:
|
|
||||||
backtotop: 'Zurück nach oben'
|
|
||||||
visit_count: '%s Besuche'
|
|
||||||
visitor_count: 'Von %s Nutzern besucht'
|
|
||||||
cookie_consent:
|
|
||||||
message: Diese Website verwendet Cookies, um Ihre Erfahrung zu verbessern.
|
|
||||||
dismiss: Verstanden!
|
|
||||||
allow: Cookies zulassen
|
|
||||||
deny: Ablehnen
|
|
||||||
link: Mehr erfahren
|
|
||||||
policy: Cookie-Richtlinie
|
|
||||||
search:
|
|
||||||
search: 'Suche'
|
|
||||||
hint: 'Tippen Sie etwas...'
|
|
||||||
no_result: 'Keine Ergebnisse für'
|
|
||||||
untitled: '(Ohne Titel)'
|
|
||||||
empty_preview: '(Keine Vorschau)'
|
|
|
@ -1,65 +0,0 @@
|
||||||
common:
|
|
||||||
archive:
|
|
||||||
one: 'Archive'
|
|
||||||
other: 'Archives'
|
|
||||||
category:
|
|
||||||
one: 'Category'
|
|
||||||
other: 'Categories'
|
|
||||||
tag:
|
|
||||||
one: 'Tag'
|
|
||||||
other: 'Tags'
|
|
||||||
post:
|
|
||||||
one: 'Post'
|
|
||||||
other: 'Posts'
|
|
||||||
page:
|
|
||||||
one: 'Page'
|
|
||||||
other: 'Pages'
|
|
||||||
prev: 'Previous'
|
|
||||||
next: 'Next'
|
|
||||||
widget:
|
|
||||||
follow: 'Follow'
|
|
||||||
recents: 'Recents'
|
|
||||||
links: 'Links'
|
|
||||||
catalogue: 'Catalogue'
|
|
||||||
subscribe_email: 'Subscribe for updates'
|
|
||||||
subscribe: 'Subscribe'
|
|
||||||
adsense: 'Advertisement'
|
|
||||||
article:
|
|
||||||
created_at: 'Posted %s'
|
|
||||||
updated_at: 'Updated %s'
|
|
||||||
more: 'Read more'
|
|
||||||
comments: 'Comments'
|
|
||||||
read_time: '%s read'
|
|
||||||
word_count:
|
|
||||||
one: 'About %d word'
|
|
||||||
other: 'About %d words'
|
|
||||||
licensing:
|
|
||||||
author: 'Author'
|
|
||||||
created_at: 'Posted on'
|
|
||||||
updated_at: 'Updated on'
|
|
||||||
licensed_under: 'Licensed under'
|
|
||||||
donate:
|
|
||||||
title: 'Like this article? Support the author with'
|
|
||||||
afdian: 'Afdian.net'
|
|
||||||
alipay: 'Alipay'
|
|
||||||
wechat: 'Wechat'
|
|
||||||
paypal: 'Paypal'
|
|
||||||
patreon: 'Patreon'
|
|
||||||
buymeacoffee: 'Buy me a coffee'
|
|
||||||
plugin:
|
|
||||||
backtotop: 'Back to top'
|
|
||||||
visit_count: '%s visits'
|
|
||||||
visitor_count: 'Visited by %s users'
|
|
||||||
cookie_consent:
|
|
||||||
message: This website uses cookies to improve your experience.
|
|
||||||
dismiss: Got it!
|
|
||||||
allow: Allow cookies
|
|
||||||
deny: Decline
|
|
||||||
link: Learn more
|
|
||||||
policy: Cookie Policy
|
|
||||||
search:
|
|
||||||
search: 'Search'
|
|
||||||
hint: 'Type something...'
|
|
||||||
no_result: 'No results for'
|
|
||||||
untitled: '(Untitled)'
|
|
||||||
empty_preview: '(No preview)'
|
|
|
@ -1,66 +0,0 @@
|
||||||
#By SrWoOoW
|
|
||||||
common:
|
|
||||||
archive:
|
|
||||||
one: 'Archivo'
|
|
||||||
other: 'Archivos'
|
|
||||||
category:
|
|
||||||
one: 'Categoría'
|
|
||||||
other: 'Categorías'
|
|
||||||
tag:
|
|
||||||
one: 'Etiqueta'
|
|
||||||
other: 'Etiquetas'
|
|
||||||
post:
|
|
||||||
one: 'Entrada'
|
|
||||||
other: 'Entradas'
|
|
||||||
page:
|
|
||||||
one: 'Página'
|
|
||||||
other: 'Páginas'
|
|
||||||
prev: 'Anterior'
|
|
||||||
next: 'Siguiente'
|
|
||||||
widget:
|
|
||||||
follow: 'SEGUIR'
|
|
||||||
recents: 'Recientes'
|
|
||||||
links: 'Enlaces'
|
|
||||||
catalogue: 'Catálogo'
|
|
||||||
subscribe_email: 'Suscríbete para recibir actualizaciones'
|
|
||||||
subscribe: 'Suscribir'
|
|
||||||
adsense: 'Anuncio'
|
|
||||||
article:
|
|
||||||
created_at: 'Publicado hace %s'
|
|
||||||
updated_at: 'Actualizado hace %s'
|
|
||||||
more: 'Leer más'
|
|
||||||
comments: 'Comentarios'
|
|
||||||
read_time: '%s de lectura'
|
|
||||||
word_count:
|
|
||||||
one: 'Aproximadamente %d palabra'
|
|
||||||
other: 'Aproximadamente %d palabras'
|
|
||||||
licensing:
|
|
||||||
author: 'Author'
|
|
||||||
created_at: 'Posted on'
|
|
||||||
updated_at: 'Updated on'
|
|
||||||
licensed_under: 'Licensed under'
|
|
||||||
donate:
|
|
||||||
title: '¿Te gusta este artículo? Apoya al autor con'
|
|
||||||
afdian: 'Afdian.net'
|
|
||||||
alipay: 'Alipay'
|
|
||||||
wechat: 'Wechat'
|
|
||||||
paypal: 'Paypal'
|
|
||||||
patreon: 'Patreon'
|
|
||||||
buymeacoffee: 'Cómprame un café'
|
|
||||||
plugin:
|
|
||||||
backtotop: 'Volver arriba'
|
|
||||||
visit_count: '%s visitas'
|
|
||||||
visitor_count: 'Visitado por %s usuarios'
|
|
||||||
cookie_consent:
|
|
||||||
message: Este sitio web utiliza cookies para mejorar su experiencia.
|
|
||||||
dismiss: ¡Entendido!
|
|
||||||
allow: Permitir cookies
|
|
||||||
deny: Descenso
|
|
||||||
link: Aprende más
|
|
||||||
policy: Política de cookies
|
|
||||||
search:
|
|
||||||
search: 'Buscar'
|
|
||||||
hint: 'Teclea algo...'
|
|
||||||
no_result: 'No hay resultados para'
|
|
||||||
untitled: '(Sin título)'
|
|
||||||
empty_preview: '(Sin vista previa)'
|
|
|
@ -1,65 +0,0 @@
|
||||||
common:
|
|
||||||
archive:
|
|
||||||
one: 'Archive'
|
|
||||||
other: 'Archives'
|
|
||||||
category:
|
|
||||||
one: 'Catégorie'
|
|
||||||
other: 'Catégories'
|
|
||||||
tag:
|
|
||||||
one: 'Tag'
|
|
||||||
other: 'Tags'
|
|
||||||
post:
|
|
||||||
one: 'Article'
|
|
||||||
other: 'Articles'
|
|
||||||
page:
|
|
||||||
one: 'Page'
|
|
||||||
other: 'Pages'
|
|
||||||
prev: 'Préc'
|
|
||||||
next: 'Suiv'
|
|
||||||
widget:
|
|
||||||
follow: 'Suivre'
|
|
||||||
recents: 'Récents'
|
|
||||||
links: 'Liens'
|
|
||||||
catalogue: 'Catalogue'
|
|
||||||
subscribe_email: 'Abonnez-vous aux mises à jour'
|
|
||||||
subscribe: 'Abonnez-vous'
|
|
||||||
adsense: 'Annonce'
|
|
||||||
article:
|
|
||||||
created_at: 'Publié il y a %s'
|
|
||||||
updated_at: 'Mis à jour il y a %s'
|
|
||||||
more: 'Lire la suite'
|
|
||||||
comments: 'Commentaires'
|
|
||||||
read_time: '%s de lecture'
|
|
||||||
word_count:
|
|
||||||
one: 'Environ %d mot'
|
|
||||||
other: 'Environ %d mots'
|
|
||||||
licensing:
|
|
||||||
author: 'Author'
|
|
||||||
created_at: 'Posted on'
|
|
||||||
updated_at: 'Updated on'
|
|
||||||
licensed_under: 'Licensed under'
|
|
||||||
donate:
|
|
||||||
title: "Vous aimez cet article? Soutenez l'auteur avec"
|
|
||||||
afdian: 'Afdian.net'
|
|
||||||
alipay: 'Alipay'
|
|
||||||
wechat: 'Wechat'
|
|
||||||
paypal: 'Paypal'
|
|
||||||
patreon: 'Patreon'
|
|
||||||
buymeacoffee: 'Achetez-moi un café'
|
|
||||||
plugin:
|
|
||||||
backtotop: 'Retour au sommet'
|
|
||||||
visit_count: '%s visites'
|
|
||||||
visitor_count: 'Visité par %s utilisateurs'
|
|
||||||
cookie_consent:
|
|
||||||
message: Ce site Web utilise des cookies pour améliorer votre expérience.
|
|
||||||
dismiss: Je l'ai!
|
|
||||||
allow: Autorise les cookies
|
|
||||||
deny: Déclin
|
|
||||||
link: Apprendre encore plus
|
|
||||||
policy: Politique relative aux cookies
|
|
||||||
search:
|
|
||||||
search: 'Search'
|
|
||||||
hint: 'Type something...'
|
|
||||||
no_result: 'Aucun résultat pour'
|
|
||||||
untitled: '(Sans titre)'
|
|
||||||
empty_preview: '(Pas de prévisualisation)'
|
|
|
@ -1,65 +0,0 @@
|
||||||
common:
|
|
||||||
archive:
|
|
||||||
one: 'Arsip'
|
|
||||||
other: 'Arsip'
|
|
||||||
category:
|
|
||||||
one: 'Kategori'
|
|
||||||
other: 'Kategori'
|
|
||||||
tag:
|
|
||||||
one: 'Tag'
|
|
||||||
other: 'Tag'
|
|
||||||
post:
|
|
||||||
one: 'Artikel'
|
|
||||||
other: 'Artikel'
|
|
||||||
page:
|
|
||||||
one: 'Halaman'
|
|
||||||
other: 'Halaman'
|
|
||||||
prev: 'Sebelumnya'
|
|
||||||
next: 'Berikutnya'
|
|
||||||
widget:
|
|
||||||
follow: 'IKUTI'
|
|
||||||
recents: 'Terbaru'
|
|
||||||
links: 'Tautan'
|
|
||||||
catalogue: 'Katalog'
|
|
||||||
subscribe_email: 'Berlangganan untuk pembaruan'
|
|
||||||
subscribe: 'Berlangganan'
|
|
||||||
adsense: 'Iklan'
|
|
||||||
article:
|
|
||||||
created_at: 'Diposting %s'
|
|
||||||
updated_at: 'Diperbarui %s'
|
|
||||||
more: 'Selengkapnya'
|
|
||||||
comments: 'Komentar'
|
|
||||||
read_time: '%s membaca'
|
|
||||||
word_count:
|
|
||||||
one: 'Sekitar %d kata'
|
|
||||||
other: 'Sekitar %d kata'
|
|
||||||
licensing:
|
|
||||||
author: 'Author'
|
|
||||||
created_at: 'Posted on'
|
|
||||||
updated_at: 'Updated on'
|
|
||||||
licensed_under: 'Licensed under'
|
|
||||||
donate:
|
|
||||||
title: 'Suka dengan artikel ini? Bantu penulis dengan donasi melalui'
|
|
||||||
afdian: 'Afdian.net'
|
|
||||||
alipay: 'Alipay'
|
|
||||||
wechat: 'Wechat'
|
|
||||||
paypal: 'Paypal'
|
|
||||||
patreon: 'Patreon'
|
|
||||||
buymeacoffee: 'Belikan aku kopi'
|
|
||||||
plugin:
|
|
||||||
backtotop: 'Kembali ke atas'
|
|
||||||
visit_count: '%s kunjungan'
|
|
||||||
visitor_count: 'Dikunjungi oleh %s pengguna'
|
|
||||||
cookie_consent:
|
|
||||||
message: Situs web ini menggunakan cookie untuk meningkatkan pengalaman Anda.
|
|
||||||
dismiss: Mengerti!
|
|
||||||
allow: Izinkan cookie
|
|
||||||
deny: Menolak
|
|
||||||
link: Belajarlah lagi
|
|
||||||
policy: Kebijakan Cookie
|
|
||||||
search:
|
|
||||||
search: 'Pencarian'
|
|
||||||
hint: 'Tulis Sesuatu..'
|
|
||||||
no_result: 'Tidak ada hasil untuk'
|
|
||||||
untitled: '(Tanpa judul)'
|
|
||||||
empty_preview: '(Tidak ada preview)'
|
|
|
@ -1,65 +0,0 @@
|
||||||
common:
|
|
||||||
archive:
|
|
||||||
one: 'アーカイブ'
|
|
||||||
other: 'アーカイブ'
|
|
||||||
category:
|
|
||||||
one: 'カテゴリ'
|
|
||||||
other: 'カテゴリ'
|
|
||||||
tag:
|
|
||||||
one: 'タグ'
|
|
||||||
other: 'タグ'
|
|
||||||
post:
|
|
||||||
one: '投稿'
|
|
||||||
other: '投稿'
|
|
||||||
page:
|
|
||||||
one: 'ページ'
|
|
||||||
other: 'ページ'
|
|
||||||
prev: '前'
|
|
||||||
next: '次'
|
|
||||||
widget:
|
|
||||||
follow: 'フォローする'
|
|
||||||
recents: '最近の記事'
|
|
||||||
links: 'リンク'
|
|
||||||
catalogue: 'カタログ'
|
|
||||||
subscribe_email: '更新を購読する'
|
|
||||||
subscribe: '購読する'
|
|
||||||
adsense: '広告'
|
|
||||||
article:
|
|
||||||
created_at: '%sに投稿'
|
|
||||||
updated_at: '%sに更新'
|
|
||||||
more: '続きを読む'
|
|
||||||
comments: 'コメント'
|
|
||||||
read_time: '%sで読む'
|
|
||||||
word_count:
|
|
||||||
one: '約%d語'
|
|
||||||
other: '約%d語'
|
|
||||||
licensing:
|
|
||||||
author: 'Author'
|
|
||||||
created_at: 'Posted on'
|
|
||||||
updated_at: 'Updated on'
|
|
||||||
licensed_under: 'Licensed under'
|
|
||||||
donate:
|
|
||||||
title: 'この記事は気に入りましたか? 著者をサポートする'
|
|
||||||
afdian: 'Afdian.net'
|
|
||||||
alipay: 'Alipay'
|
|
||||||
wechat: 'Wechat'
|
|
||||||
paypal: 'Paypal'
|
|
||||||
patreon: 'Patreon'
|
|
||||||
buymeacoffee: 'コーヒーを買って'
|
|
||||||
plugin:
|
|
||||||
backtotop: 'トップに戻る'
|
|
||||||
visit_count: '%s回の訪問'
|
|
||||||
visitor_count: '%s人のユーザーがアクセス'
|
|
||||||
cookie_consent:
|
|
||||||
message: このウェブサイトはあなたの経験を改善するためにCookieを使用しています。
|
|
||||||
dismiss: 了解しました
|
|
||||||
allow: Cookiesを許可する
|
|
||||||
deny: 拒否する
|
|
||||||
link: もっと詳しく知る
|
|
||||||
policy: Cookieポリシー
|
|
||||||
search:
|
|
||||||
search: '検索'
|
|
||||||
hint: '何かを入力してください...'
|
|
||||||
no_result: 'の結果はありません'
|
|
||||||
untitled: '(無題)'
|
|
||||||
empty_preview: '(プレビューなし)'
|
|
|
@ -1,65 +0,0 @@
|
||||||
common:
|
|
||||||
archive:
|
|
||||||
one: '아카이브'
|
|
||||||
other: '아카이브'
|
|
||||||
category:
|
|
||||||
one: '카테고리'
|
|
||||||
other: '카테고리'
|
|
||||||
tag:
|
|
||||||
one: '태그'
|
|
||||||
other: '태그'
|
|
||||||
post:
|
|
||||||
one: '포스트'
|
|
||||||
other: '포스트'
|
|
||||||
page:
|
|
||||||
one: '페이지'
|
|
||||||
other: '페이지'
|
|
||||||
prev: '이전'
|
|
||||||
next: '다음'
|
|
||||||
widget:
|
|
||||||
follow: '팔로우'
|
|
||||||
recents: '최근 글'
|
|
||||||
links: '링크'
|
|
||||||
catalogue: '카탈로그'
|
|
||||||
subscribe_email: '업데이트 소식 받기'
|
|
||||||
subscribe: '구독'
|
|
||||||
adsense: '광고'
|
|
||||||
article:
|
|
||||||
created_at: '%s 게시 됨'
|
|
||||||
updated_at: '%s 업데이트 됨'
|
|
||||||
more: '자세히 보기'
|
|
||||||
comments: '댓글'
|
|
||||||
read_time: '%s안에 읽기'
|
|
||||||
word_count:
|
|
||||||
one: '약 %d 단어'
|
|
||||||
other: '약 %d 단어'
|
|
||||||
licensing:
|
|
||||||
author: 'Author'
|
|
||||||
created_at: 'Posted on'
|
|
||||||
updated_at: 'Updated on'
|
|
||||||
licensed_under: 'Licensed under'
|
|
||||||
donate:
|
|
||||||
title: '이 글이 마음에 드시나요? 다음을 통해 후원하실 수 있습니다: '
|
|
||||||
afdian: 'Afdian.net'
|
|
||||||
alipay: 'Alipay'
|
|
||||||
wechat: 'Wechat'
|
|
||||||
paypal: 'Paypal'
|
|
||||||
patreon: 'Patreon'
|
|
||||||
buymeacoffee: '커피 한 잔 사주기'
|
|
||||||
plugin:
|
|
||||||
backtotop: '맨 위로'
|
|
||||||
visit_count: '%s회 방문'
|
|
||||||
visitor_count: '%s명의 사용자가 방문 함'
|
|
||||||
cookie_consent:
|
|
||||||
message: 이 웹 사이트는 귀하의 경험을 향상시키기 위해 Cookie를 사용합니다.
|
|
||||||
dismiss: 무시
|
|
||||||
allow: 허용
|
|
||||||
deny: 거부
|
|
||||||
link: 더 알아보기
|
|
||||||
policy: Cookie 정책
|
|
||||||
search:
|
|
||||||
search: '검색'
|
|
||||||
hint: '입력 하세요...'
|
|
||||||
no_result: '에 대한 결과 없음'
|
|
||||||
untitled: '(제목 없음)'
|
|
||||||
empty_preview: '(미리보기 없음)'
|
|
|
@ -1,65 +0,0 @@
|
||||||
common:
|
|
||||||
archive:
|
|
||||||
one: 'Archiwum'
|
|
||||||
other: 'Archiwum'
|
|
||||||
category:
|
|
||||||
one: 'Kategoria'
|
|
||||||
other: 'Kategorie'
|
|
||||||
tag:
|
|
||||||
one: 'Tag'
|
|
||||||
other: 'Tagi'
|
|
||||||
post:
|
|
||||||
one: 'Artykuł'
|
|
||||||
other: 'Artykuły'
|
|
||||||
page:
|
|
||||||
one: 'Strona'
|
|
||||||
other: 'Strony'
|
|
||||||
prev: 'Poprzedni'
|
|
||||||
next: 'Następny'
|
|
||||||
widget:
|
|
||||||
follow: 'SUBSKRYBUJ'
|
|
||||||
recents: 'Najnowsze wpisy'
|
|
||||||
links: 'Linki'
|
|
||||||
catalogue: 'Spis treści'
|
|
||||||
subscribe_email: 'Zapisz się, aby otrzymywać aktualizacje'
|
|
||||||
subscribe: 'Subskrybuj'
|
|
||||||
adsense: 'Reklama'
|
|
||||||
article:
|
|
||||||
created_at: 'Opublikowano %s'
|
|
||||||
updated_at: 'Zaktualizowano %s'
|
|
||||||
more: 'Czytaj dalej'
|
|
||||||
comments: 'Komentarze'
|
|
||||||
read_time: '%s czytania'
|
|
||||||
word_count:
|
|
||||||
one: 'Około %d słowa'
|
|
||||||
other: 'Około %d słów'
|
|
||||||
licensing:
|
|
||||||
author: 'Author'
|
|
||||||
created_at: 'Posted on'
|
|
||||||
updated_at: 'Updated on'
|
|
||||||
licensed_under: 'Licensed under'
|
|
||||||
donate:
|
|
||||||
title: 'Podoba Ci się ten artykuł? Wesprzyj autora za pomocą'
|
|
||||||
afdian: 'Afdian.net'
|
|
||||||
alipay: 'Alipay'
|
|
||||||
wechat: 'Wechat'
|
|
||||||
paypal: 'Paypal'
|
|
||||||
patreon: 'Patreon'
|
|
||||||
buymeacoffee: 'Kup mi kawę'
|
|
||||||
plugin:
|
|
||||||
backtotop: 'Powrót do góry'
|
|
||||||
visit_count: '%s wizyty'
|
|
||||||
visitor_count: 'Odwiedzone przez %s użytkowników'
|
|
||||||
cookie_consent:
|
|
||||||
message: Ta strona korzysta z plików cookie, aby poprawić Twoje doświadczenia.
|
|
||||||
dismiss: Rozumiem!
|
|
||||||
allow: Zezwól na pliki cookie
|
|
||||||
deny: Odrzucać
|
|
||||||
link: Ucz się więcej
|
|
||||||
policy: Polityka Cookie
|
|
||||||
search:
|
|
||||||
search: 'szukaj'
|
|
||||||
hint: 'Wpisz coś...'
|
|
||||||
no_result: 'Brak wyników dla'
|
|
||||||
untitled: '(Bez tytułu)'
|
|
||||||
empty_preview: '(Brak podglądu)'
|
|
|
@ -1,65 +0,0 @@
|
||||||
common:
|
|
||||||
archive:
|
|
||||||
one: 'Arquivo'
|
|
||||||
other: 'Arquivos'
|
|
||||||
category:
|
|
||||||
one: 'Categoria'
|
|
||||||
other: 'Categorias'
|
|
||||||
tag:
|
|
||||||
one: 'Tag'
|
|
||||||
other: 'Tags'
|
|
||||||
post:
|
|
||||||
one: 'Artigo'
|
|
||||||
other: 'Artigos'
|
|
||||||
page:
|
|
||||||
one: 'Página'
|
|
||||||
other: 'Páginas'
|
|
||||||
prev: 'Anterior'
|
|
||||||
next: 'Próximo'
|
|
||||||
widget:
|
|
||||||
follow: 'Seguir'
|
|
||||||
recents: 'Recentes'
|
|
||||||
links: 'Links'
|
|
||||||
catalogue: 'Catálogo'
|
|
||||||
subscribe_email: 'Subscrição de atualizações'
|
|
||||||
subscribe: 'Se inscrever'
|
|
||||||
adsense: 'Anúncio'
|
|
||||||
article:
|
|
||||||
created_at: 'Postado %s'
|
|
||||||
updated_at: 'Atualizado %s'
|
|
||||||
more: 'Ler Mais'
|
|
||||||
comments: 'Comentarios'
|
|
||||||
read_time: '%s lidos'
|
|
||||||
word_count:
|
|
||||||
one: 'Cerca de %d palavra'
|
|
||||||
other: 'Cerca de %d palavras'
|
|
||||||
licensing:
|
|
||||||
author: 'Author'
|
|
||||||
created_at: 'Posted on'
|
|
||||||
updated_at: 'Updated on'
|
|
||||||
licensed_under: 'Licensed under'
|
|
||||||
donate:
|
|
||||||
title: 'Gostou deste artigo? Apoie o autor com'
|
|
||||||
afdian: 'Afdian.net'
|
|
||||||
alipay: 'Alipay'
|
|
||||||
wechat: 'Wechat'
|
|
||||||
paypal: 'Paypal'
|
|
||||||
patreon: 'Patreon'
|
|
||||||
buymeacoffee: 'Me compra um café'
|
|
||||||
plugin:
|
|
||||||
backtotop: 'De volta ao topo'
|
|
||||||
visit_count: '%s visitas'
|
|
||||||
visitor_count: 'Visitado por %s usuários'
|
|
||||||
cookie_consent:
|
|
||||||
message: Este site usa cookies para melhorar sua experiência.
|
|
||||||
dismiss: Entendi!
|
|
||||||
allow: Permitir cookies
|
|
||||||
deny: Declínio
|
|
||||||
link: Saber mais
|
|
||||||
policy: Política de Cookies
|
|
||||||
search:
|
|
||||||
search: 'Procurar'
|
|
||||||
hint: 'Digite alguma coisa...'
|
|
||||||
no_result: 'Sem resultados para'
|
|
||||||
untitled: '(Sem título)'
|
|
||||||
empty_preview: '(Não há visualização)'
|
|
|
@ -1,65 +0,0 @@
|
||||||
common:
|
|
||||||
archive:
|
|
||||||
one: 'архив'
|
|
||||||
other: 'архивы'
|
|
||||||
category:
|
|
||||||
one: 'категории'
|
|
||||||
other: 'категории'
|
|
||||||
tag:
|
|
||||||
one: 'тег'
|
|
||||||
other: 'теги'
|
|
||||||
post:
|
|
||||||
one: 'пост'
|
|
||||||
other: 'посты'
|
|
||||||
page:
|
|
||||||
one: 'страница'
|
|
||||||
other: 'страницы'
|
|
||||||
prev: 'Назад'
|
|
||||||
next: 'Далее'
|
|
||||||
widget:
|
|
||||||
follow: 'Подписаться'
|
|
||||||
recents: 'недавние'
|
|
||||||
links: 'ссылки'
|
|
||||||
catalogue: 'Каталог'
|
|
||||||
subscribe_email: 'Подпишитесь на обновления'
|
|
||||||
subscribe: 'Подписывайся'
|
|
||||||
adsense: 'Рекламное объявление'
|
|
||||||
article:
|
|
||||||
created_at: 'Опубликовано %s'
|
|
||||||
updated_at: 'Обновлено %s'
|
|
||||||
more: 'Читать дальше'
|
|
||||||
comments: 'Комментарии'
|
|
||||||
read_time: '%s на чтение'
|
|
||||||
word_count:
|
|
||||||
one: 'Около %d слова'
|
|
||||||
other: 'Примерно %d слова'
|
|
||||||
licensing:
|
|
||||||
author: 'Author'
|
|
||||||
created_at: 'Posted on'
|
|
||||||
updated_at: 'Updated on'
|
|
||||||
licensed_under: 'Licensed under'
|
|
||||||
donate:
|
|
||||||
title: 'Понравилась эта статья? Поддержите автора'
|
|
||||||
afdian: 'Afdian.net'
|
|
||||||
alipay: 'Alipay'
|
|
||||||
wechat: 'Wechat'
|
|
||||||
paypal: 'Paypal'
|
|
||||||
patreon: 'Patreon'
|
|
||||||
buymeacoffee: 'Купи мне кофе'
|
|
||||||
plugin:
|
|
||||||
backtotop: 'Вернуться наверх'
|
|
||||||
visit_count: '%s посещения'
|
|
||||||
visitor_count: 'Посетили %s пользователя'
|
|
||||||
cookie_consent:
|
|
||||||
message: Этот веб-сайт использует файлы cookie для улучшения вашего опыта.
|
|
||||||
dismiss: Понял!
|
|
||||||
allow: Разрешить cookies
|
|
||||||
deny: Отказаться
|
|
||||||
link: Учить больше
|
|
||||||
policy: Политика Cookie
|
|
||||||
search:
|
|
||||||
search: 'Поиск'
|
|
||||||
hint: 'Введите что-нибудь...'
|
|
||||||
no_result: 'Нет результатов по запросу'
|
|
||||||
untitled: '(Без названия)'
|
|
||||||
empty_preview: '(Нет предварительного просмотра)'
|
|
|
@ -1,65 +0,0 @@
|
||||||
common:
|
|
||||||
archive:
|
|
||||||
one: 'Arhiw'
|
|
||||||
other: 'Arhiwler'
|
|
||||||
category:
|
|
||||||
one: 'Bölüm'
|
|
||||||
other: 'Bölümler'
|
|
||||||
tag:
|
|
||||||
one: 'Teg'
|
|
||||||
other: 'Tegler'
|
|
||||||
post:
|
|
||||||
one: 'Post'
|
|
||||||
other: 'Postlar'
|
|
||||||
page:
|
|
||||||
one: 'Sahypa'
|
|
||||||
other: 'Sahypalar'
|
|
||||||
prev: 'Öňki'
|
|
||||||
next: 'Indiki'
|
|
||||||
widget:
|
|
||||||
follow: 'Abuna bol'
|
|
||||||
recents: 'Täze habarlar'
|
|
||||||
links: 'Linkler'
|
|
||||||
catalogue: 'Katalog'
|
|
||||||
subscribe_email: 'Täzelikler üçin ýazyl'
|
|
||||||
subscribe: 'Ýazyl'
|
|
||||||
adsense: 'Mahabat'
|
|
||||||
article:
|
|
||||||
created_at: 'Paýlaşyldy %s'
|
|
||||||
updated_at: 'Üýtgedildi %s'
|
|
||||||
more: 'Dowamy...'
|
|
||||||
comments: 'Kommentariýa'
|
|
||||||
read_time: '%s okaldy'
|
|
||||||
word_count:
|
|
||||||
one: 'Ortaça %d söz'
|
|
||||||
other: 'Ortaça %d söz'
|
|
||||||
licensing:
|
|
||||||
author: 'Awtor'
|
|
||||||
created_at: 'Paýlaşdy'
|
|
||||||
updated_at: 'Üýtgetdi'
|
|
||||||
licensed_under: 'Resmileşdirilen'
|
|
||||||
donate:
|
|
||||||
title: 'Haladynmy? Awtory gollaň'
|
|
||||||
afdian: 'Afdian.net'
|
|
||||||
alipay: 'Alipay'
|
|
||||||
wechat: 'Wechat'
|
|
||||||
paypal: 'Paypal'
|
|
||||||
patreon: 'Patreon'
|
|
||||||
buymeacoffee: 'Buy me a coffee'
|
|
||||||
plugin:
|
|
||||||
backtotop: 'Ýokaryk'
|
|
||||||
visit_count: '%s görüldi'
|
|
||||||
visitor_count: '%s adam gördi'
|
|
||||||
cookie_consent:
|
|
||||||
message: Bu web saýt siziň üçin kuki ulanýar.
|
|
||||||
dismiss: Düşündim!
|
|
||||||
allow: Kukini kabul et!
|
|
||||||
deny: Närazylyk bildir
|
|
||||||
link: Dowamy...
|
|
||||||
policy: Kuki syýasaty
|
|
||||||
search:
|
|
||||||
search: 'Gözle'
|
|
||||||
hint: 'Birzatlar ýazyň...'
|
|
||||||
no_result: 'Tapylmady'
|
|
||||||
untitled: 'Atlandyrylmadyk'
|
|
||||||
empty_preview: 'Boş'
|
|
|
@ -1,65 +0,0 @@
|
||||||
common:
|
|
||||||
archive:
|
|
||||||
one: 'Arşiv'
|
|
||||||
other: 'Arşivler'
|
|
||||||
category:
|
|
||||||
one: 'Kategori'
|
|
||||||
other: 'Kategoriler'
|
|
||||||
tag:
|
|
||||||
one: 'Etiket'
|
|
||||||
other: 'Etiketler'
|
|
||||||
post:
|
|
||||||
one: 'Gönderi'
|
|
||||||
other: 'Gönderiler'
|
|
||||||
page:
|
|
||||||
one: 'Sayfa'
|
|
||||||
other: 'Sayfalar'
|
|
||||||
prev: 'Önceki'
|
|
||||||
next: 'Sonraki'
|
|
||||||
widget:
|
|
||||||
follow: 'TAKİP ET'
|
|
||||||
recents: 'Son'
|
|
||||||
links: 'Linkler'
|
|
||||||
catalogue: 'Katalog'
|
|
||||||
subscribe_email: 'Güncellemeler için abone olun'
|
|
||||||
subscribe: 'Abone ol'
|
|
||||||
adsense: 'İlan'
|
|
||||||
article:
|
|
||||||
created_at: '%s yayınlandı'
|
|
||||||
updated_at: '%s güncellendi'
|
|
||||||
more: 'Daha fazla oku'
|
|
||||||
comments: 'Yorumlar'
|
|
||||||
read_time: '%s okundu'
|
|
||||||
word_count:
|
|
||||||
one: 'Yaklaşık %d kelime'
|
|
||||||
other: 'Yaklaşık %d kelime'
|
|
||||||
licensing:
|
|
||||||
author: 'Author'
|
|
||||||
created_at: 'Posted on'
|
|
||||||
updated_at: 'Updated on'
|
|
||||||
licensed_under: 'Licensed under'
|
|
||||||
donate:
|
|
||||||
title: 'Bu makaleyi beğendiniz mi? Yazarı şununla destekleyin'
|
|
||||||
afdian: 'Afdian.net'
|
|
||||||
alipay: 'Alipay'
|
|
||||||
wechat: 'Wechat'
|
|
||||||
paypal: 'Paypal'
|
|
||||||
patreon: 'Patreon'
|
|
||||||
buymeacoffee: 'Bana bir kahve al'
|
|
||||||
plugin:
|
|
||||||
backtotop: 'Başa dönüş'
|
|
||||||
visit_count: '%s ziyaret'
|
|
||||||
visitor_count: '%s kullanıcı tarafından ziyaret edildi'
|
|
||||||
cookie_consent:
|
|
||||||
message: Bu web sitesi, deneyiminizi geliştirmek için çerezler kullanır.
|
|
||||||
dismiss: Anladım!
|
|
||||||
allow: Çerezlere izin ver
|
|
||||||
deny: Reddet
|
|
||||||
link: Daha fazla bilgi edin
|
|
||||||
policy: Çerez politikası
|
|
||||||
search:
|
|
||||||
search: 'Search'
|
|
||||||
hint: 'Bir şeyler yaz...'
|
|
||||||
no_result: 'İçin sonuç yok'
|
|
||||||
untitled: '(Başlıksız)'
|
|
||||||
empty_preview: '(Önizleme yok)'
|
|
|
@ -1,65 +0,0 @@
|
||||||
common:
|
|
||||||
archive:
|
|
||||||
one: 'Lưu trữ'
|
|
||||||
other: 'Lưu trữ'
|
|
||||||
category:
|
|
||||||
one: 'Thể loại'
|
|
||||||
other: 'Thể loại'
|
|
||||||
tag:
|
|
||||||
one: 'Nhãn'
|
|
||||||
other: 'Nhãn'
|
|
||||||
post:
|
|
||||||
one: 'Bài viết'
|
|
||||||
other: 'Bài viết'
|
|
||||||
page:
|
|
||||||
one: 'Trang'
|
|
||||||
other: 'Trang'
|
|
||||||
prev: 'Trước'
|
|
||||||
next: 'Sau'
|
|
||||||
widget:
|
|
||||||
follow: 'Theo dõi'
|
|
||||||
recents: 'Gần đây'
|
|
||||||
links: 'Link'
|
|
||||||
catalogue: 'Mục lục'
|
|
||||||
subscribe_email: 'Theo dõi các bản cập nhật'
|
|
||||||
subscribe: 'Theo dõi'
|
|
||||||
adsense: 'Quảng cáo'
|
|
||||||
article:
|
|
||||||
created_at: 'Đã đăng %s'
|
|
||||||
updated_at: 'Đã cập nhật %s'
|
|
||||||
more: 'Đọc thêm'
|
|
||||||
comments: 'Bình luận'
|
|
||||||
read_time: '%s đọc'
|
|
||||||
word_count:
|
|
||||||
one: 'Khoảng %d từ'
|
|
||||||
other: 'Khoảng %d từ'
|
|
||||||
licensing:
|
|
||||||
author: 'Author'
|
|
||||||
created_at: 'Posted on'
|
|
||||||
updated_at: 'Updated on'
|
|
||||||
licensed_under: 'Licensed under'
|
|
||||||
donate:
|
|
||||||
title: 'Bạn đọc có thể ủng hộ blog qua'
|
|
||||||
afdian: 'Afdian.net'
|
|
||||||
alipay: 'Alipay'
|
|
||||||
wechat: 'Wechat'
|
|
||||||
paypal: 'Paypal'
|
|
||||||
patreon: 'Patreon'
|
|
||||||
buymeacoffee: 'Mua cho tôi một ly cà phê'
|
|
||||||
plugin:
|
|
||||||
backtotop: 'Trở lai đầu trang'
|
|
||||||
visit_count: '%s Bạn đọc'
|
|
||||||
visitor_count: 'Thăm bởi %s bạn đọc'
|
|
||||||
cookie_consent:
|
|
||||||
message: Trang web này sử dụng cookie để cải thiện trải nghiệm của bạn.
|
|
||||||
dismiss: Hiểu rồi!
|
|
||||||
allow: Cho phép cookie
|
|
||||||
deny: Từ chối
|
|
||||||
link: Tìm hiểu thêm
|
|
||||||
policy: Chính sách Cookie
|
|
||||||
search:
|
|
||||||
search: 'Tìm kiếm'
|
|
||||||
hint: 'Gõ gì đó...'
|
|
||||||
no_result: 'Không có kết quả cho'
|
|
||||||
untitled: '(Không có tiêu đề)'
|
|
||||||
empty_preview: '(Không có xem trước)'
|
|
|
@ -1,65 +0,0 @@
|
||||||
common:
|
|
||||||
archive:
|
|
||||||
one: '归档'
|
|
||||||
other: '归档'
|
|
||||||
category:
|
|
||||||
one: '分类'
|
|
||||||
other: '分类'
|
|
||||||
tag:
|
|
||||||
one: '标签'
|
|
||||||
other: '标签'
|
|
||||||
post:
|
|
||||||
one: '文章'
|
|
||||||
other: '文章'
|
|
||||||
page:
|
|
||||||
one: '页面'
|
|
||||||
other: '页面'
|
|
||||||
prev: '上一页'
|
|
||||||
next: '下一页'
|
|
||||||
widget:
|
|
||||||
follow: '关注我'
|
|
||||||
recents: '最新文章'
|
|
||||||
links: '链接'
|
|
||||||
catalogue: '目录'
|
|
||||||
subscribe_email: '订阅更新'
|
|
||||||
subscribe: '订阅'
|
|
||||||
adsense: '广告'
|
|
||||||
article:
|
|
||||||
created_at: '%s发表'
|
|
||||||
updated_at: '%s更新'
|
|
||||||
more: '阅读更多'
|
|
||||||
comments: '评论'
|
|
||||||
read_time: '%s读完'
|
|
||||||
word_count:
|
|
||||||
one: '大约%d个字'
|
|
||||||
other: '大约%d个字'
|
|
||||||
licensing:
|
|
||||||
author: '作者'
|
|
||||||
created_at: '发布于'
|
|
||||||
updated_at: '更新于'
|
|
||||||
licensed_under: '许可协议'
|
|
||||||
donate:
|
|
||||||
title: '喜欢这篇文章?打赏一下作者吧'
|
|
||||||
afdian: '爱发电'
|
|
||||||
alipay: '支付宝'
|
|
||||||
wechat: '微信'
|
|
||||||
paypal: 'Paypal'
|
|
||||||
patreon: 'Patreon'
|
|
||||||
buymeacoffee: '送我杯咖啡'
|
|
||||||
plugin:
|
|
||||||
backtotop: '回到顶端'
|
|
||||||
visit_count: '%s次访问'
|
|
||||||
visitor_count: '共%s个访客'
|
|
||||||
cookie_consent:
|
|
||||||
message: 此网站使用Cookie来改善您的体验。
|
|
||||||
dismiss: 知道了!
|
|
||||||
allow: 允许使用Cookie
|
|
||||||
deny: 拒绝
|
|
||||||
link: 了解更多
|
|
||||||
policy: Cookie政策
|
|
||||||
search:
|
|
||||||
search: '搜索'
|
|
||||||
hint: '想要查找什么...'
|
|
||||||
no_result: '未找到搜索结果'
|
|
||||||
untitled: '(无标题)'
|
|
||||||
empty_preview: '(无内容预览)'
|
|
|
@ -1,65 +0,0 @@
|
||||||
common:
|
|
||||||
archive:
|
|
||||||
one: '彙整'
|
|
||||||
other: '彙整'
|
|
||||||
category:
|
|
||||||
one: '分類'
|
|
||||||
other: '分類'
|
|
||||||
tag:
|
|
||||||
one: '標籤'
|
|
||||||
other: '標籤'
|
|
||||||
post:
|
|
||||||
one: '文章'
|
|
||||||
other: '文章'
|
|
||||||
page:
|
|
||||||
one: '頁面'
|
|
||||||
other: '頁面'
|
|
||||||
prev: '上一頁'
|
|
||||||
next: '下一頁'
|
|
||||||
widget:
|
|
||||||
follow: '追蹤'
|
|
||||||
recents: '最新文章'
|
|
||||||
links: '連結'
|
|
||||||
catalogue: '文章目錄'
|
|
||||||
subscribe_email: '訂閱 Email'
|
|
||||||
subscribe: '訂閱'
|
|
||||||
adsense: '廣告'
|
|
||||||
article:
|
|
||||||
created_at: '%s發表'
|
|
||||||
updated_at: '%s更新'
|
|
||||||
more: '繼續閱讀'
|
|
||||||
comments: '評論'
|
|
||||||
read_time: '%s讀完'
|
|
||||||
word_count:
|
|
||||||
one: '大約%d個字'
|
|
||||||
other: '大約%d個字'
|
|
||||||
licensing:
|
|
||||||
author: '作者'
|
|
||||||
created_at: '發表於'
|
|
||||||
updated_at: '更新於'
|
|
||||||
licensed_under: '許可協議'
|
|
||||||
donate:
|
|
||||||
title: '喜歡這篇文章嗎? 贊助一下作者吧!'
|
|
||||||
afdian: '愛發電'
|
|
||||||
alipay: '支付寶'
|
|
||||||
wechat: 'WeChat'
|
|
||||||
paypal: 'PayPal'
|
|
||||||
patreon: 'Patreon'
|
|
||||||
buymeacoffee: '送我杯咖啡'
|
|
||||||
plugin:
|
|
||||||
backtotop: '回到頁首'
|
|
||||||
visit_count: '%s次訪問'
|
|
||||||
visitor_count: '共%s個訪客'
|
|
||||||
cookie_consent:
|
|
||||||
message: 此網站使用Cookie來改善您的體驗。
|
|
||||||
dismiss: 知道了!
|
|
||||||
allow: 允許使用Cookie
|
|
||||||
deny: 拒絕
|
|
||||||
link: 了解更多
|
|
||||||
policy: Cookie政策
|
|
||||||
search:
|
|
||||||
search: '搜尋'
|
|
||||||
hint: '請輸入關鍵字...'
|
|
||||||
no_result: '未找到搜索結果'
|
|
||||||
untitled: '(無標題)'
|
|
||||||
empty_preview: '(無內容預覽)'
|
|
|
@ -1,62 +0,0 @@
|
||||||
const moment = require('moment');
|
|
||||||
const { Component, Fragment } = require('inferno');
|
|
||||||
const Paginator = require('hexo-component-inferno/lib/view/misc/paginator');
|
|
||||||
const ArticleMedia = require('hexo-component-inferno/lib/view/common/article_media');
|
|
||||||
|
|
||||||
module.exports = class extends Component {
|
|
||||||
render() {
|
|
||||||
const { config, page, helper } = this.props;
|
|
||||||
const { url_for, __, date_xml, date } = helper;
|
|
||||||
|
|
||||||
const language = page.lang || page.language || config.language;
|
|
||||||
|
|
||||||
function renderArticleList(posts, year, month = null) {
|
|
||||||
const time = moment([page.year, page.month ? page.month - 1 : null].filter(i => i !== null));
|
|
||||||
|
|
||||||
return <div class="card">
|
|
||||||
<div class="card-content">
|
|
||||||
<h3 class="tag is-primary">{month === null ? year : time.locale(language).format('MMMM YYYY')}</h3>
|
|
||||||
<div class="timeline">
|
|
||||||
{posts.map(post => {
|
|
||||||
const categories = post.categories.map(category => ({
|
|
||||||
url: url_for(category.path),
|
|
||||||
name: category.name
|
|
||||||
}));
|
|
||||||
return <ArticleMedia
|
|
||||||
url={url_for(post.link || post.path)}
|
|
||||||
title={post.title}
|
|
||||||
date={date(post.date)}
|
|
||||||
dateXml={date_xml(post.date)}
|
|
||||||
categories={categories}
|
|
||||||
thumbnail={post.thumbnail ? url_for(post.thumbnail) : null} />;
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>;
|
|
||||||
}
|
|
||||||
|
|
||||||
let articleList;
|
|
||||||
if (!page.year) {
|
|
||||||
const years = {};
|
|
||||||
page.posts.each(p => { years[p.date.year()] = null; });
|
|
||||||
articleList = Object.keys(years).sort((a, b) => b - a).map(year => {
|
|
||||||
const posts = page.posts.filter(p => p.date.year() === parseInt(year, 10));
|
|
||||||
return renderArticleList(posts, year, null);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
articleList = renderArticleList(page.posts, page.year, page.month);
|
|
||||||
}
|
|
||||||
|
|
||||||
return <Fragment>
|
|
||||||
{articleList}
|
|
||||||
{page.total > 1 ? <Paginator
|
|
||||||
current={page.current}
|
|
||||||
total={page.total}
|
|
||||||
baseUrl={page.base}
|
|
||||||
path={config.pagination_dir}
|
|
||||||
urlFor={url_for}
|
|
||||||
prevTitle={__('common.prev')}
|
|
||||||
nextTitle={__('common.next')} /> : null}
|
|
||||||
</Fragment>;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,10 +0,0 @@
|
||||||
const { Component } = require('inferno');
|
|
||||||
const Categories = require('hexo-component-inferno/lib/view/widget/categories');
|
|
||||||
|
|
||||||
module.exports = class extends Component {
|
|
||||||
render() {
|
|
||||||
const { site, page, helper } = this.props;
|
|
||||||
|
|
||||||
return <Categories.Cacheable site={site} page={page} helper={helper} />;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,26 +0,0 @@
|
||||||
const { Component, Fragment } = require('inferno');
|
|
||||||
const Index = require('./index');
|
|
||||||
|
|
||||||
module.exports = class extends Component {
|
|
||||||
render() {
|
|
||||||
const { config, page, helper } = this.props;
|
|
||||||
const { url_for, _p } = helper;
|
|
||||||
|
|
||||||
return <Fragment>
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-content">
|
|
||||||
<nav class="breadcrumb" aria-label="breadcrumbs">
|
|
||||||
<ul>
|
|
||||||
<li><a href={url_for('/categories')}>{_p('common.category', Infinity)}</a></li>
|
|
||||||
{page.parents.map(category => {
|
|
||||||
return <li><a href={url_for(category.path)}>{category.name}</a></li>;
|
|
||||||
})}
|
|
||||||
<li class="is-active"><a href="#" aria-current="page">{page.category}</a></li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<Index config={config} page={page} helper={helper} />
|
|
||||||
</Fragment>;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,125 +0,0 @@
|
||||||
const moment = require('moment');
|
|
||||||
const { Component, Fragment } = require('inferno');
|
|
||||||
const Share = require('./share');
|
|
||||||
const Donates = require('./donates');
|
|
||||||
const Comment = require('./comment');
|
|
||||||
const ArticleLicensing = require('hexo-component-inferno/lib/view/misc/article_licensing');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the word count of text.
|
|
||||||
*/
|
|
||||||
function getWordCount(content) {
|
|
||||||
if (typeof content === 'undefined') {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
content = content.replace(/<\/?[a-z][^>]*>/gi, '');
|
|
||||||
content = content.trim();
|
|
||||||
return content ? (content.match(/[\u00ff-\uffff]|[a-zA-Z]+/g) || []).length : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = class extends Component {
|
|
||||||
render() {
|
|
||||||
const { config, helper, page, index } = this.props;
|
|
||||||
const { article, plugins } = config;
|
|
||||||
const { url_for, date, date_xml, __, _p } = helper;
|
|
||||||
|
|
||||||
const indexLaunguage = config.language || 'en';
|
|
||||||
const language = page.lang || page.language || config.language || 'en';
|
|
||||||
const cover = page.cover ? url_for(page.cover) : null;
|
|
||||||
|
|
||||||
return <Fragment>
|
|
||||||
{/* Main content */}
|
|
||||||
<div class="card">
|
|
||||||
{/* Thumbnail */}
|
|
||||||
{cover ? <div class="card-image">
|
|
||||||
{index ? <a href={url_for(page.link || page.path)} class="image is-7by3">
|
|
||||||
<img class="fill" src={cover} alt={page.title || cover} />
|
|
||||||
</a> : <span class="image is-7by3">
|
|
||||||
<img class="fill" src={cover} alt={page.title || cover} />
|
|
||||||
</span>}
|
|
||||||
</div> : null}
|
|
||||||
<article class={`card-content article${'direction' in page ? ' ' + page.direction : ''}`} role="article">
|
|
||||||
{/* Metadata */}
|
|
||||||
{page.layout !== 'page' ? <div class="article-meta is-size-7 is-uppercase level is-mobile">
|
|
||||||
<div class="level-left">
|
|
||||||
{/* Creation Date */}
|
|
||||||
{page.date && <span class="level-item" dangerouslySetInnerHTML={{
|
|
||||||
__html: _p('article.created_at', `<time dateTime="${date_xml(page.date)}" title="${new Date(page.date).toLocaleString()}">${date(page.date)}</time>`)
|
|
||||||
}}></span>}
|
|
||||||
{/* Last Update Date */}
|
|
||||||
{page.updated && <span class="level-item" dangerouslySetInnerHTML={{
|
|
||||||
__html: _p('article.updated_at', `<time dateTime="${date_xml(page.updated)}" title="${new Date(page.updated).toLocaleString()}">${date(page.updated)}</time>`)
|
|
||||||
}}></span>}
|
|
||||||
{/* author */}
|
|
||||||
{page.author ? <span class="level-item"> {page.author} </span> : null}
|
|
||||||
{/* Categories */}
|
|
||||||
{page.categories && page.categories.length ? <span class="level-item">
|
|
||||||
{(() => {
|
|
||||||
const categories = [];
|
|
||||||
page.categories.forEach((category, i) => {
|
|
||||||
categories.push(<a class="link-muted" href={url_for(category.path)}>{category.name}</a>);
|
|
||||||
if (i < page.categories.length - 1) {
|
|
||||||
categories.push(<span> / </span>);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return categories;
|
|
||||||
})()}
|
|
||||||
</span> : null}
|
|
||||||
{/* Read time */}
|
|
||||||
{article && article.readtime && article.readtime === true ? <span class="level-item">
|
|
||||||
{(() => {
|
|
||||||
const words = getWordCount(page._content);
|
|
||||||
const time = moment.duration((words / 150.0) * 60, 'seconds');
|
|
||||||
return `${_p('article.read_time', time.locale(index ? indexLaunguage : language).humanize())} (${_p('article.word_count', words)})`;
|
|
||||||
})()}
|
|
||||||
</span> : null}
|
|
||||||
{/* Visitor counter */}
|
|
||||||
{!index && plugins && plugins.busuanzi === true ? <span class="level-item" id="busuanzi_container_page_pv" dangerouslySetInnerHTML={{
|
|
||||||
__html: _p('plugin.visit_count', '<span id="busuanzi_value_page_pv">0</span>')
|
|
||||||
}}></span> : null}
|
|
||||||
</div>
|
|
||||||
</div> : null}
|
|
||||||
{/* Title */}
|
|
||||||
{page.title !== '' ? <h1 class="title is-3 is-size-4-mobile">
|
|
||||||
{index ? <a class="link-muted" href={url_for(page.link || page.path)}>{page.title}</a> : page.title}
|
|
||||||
</h1> : null}
|
|
||||||
{/* Content/Excerpt */}
|
|
||||||
<div class="content" dangerouslySetInnerHTML={{ __html: index && page.excerpt ? page.excerpt : page.content }}></div>
|
|
||||||
{/* Licensing block */}
|
|
||||||
{!index && article && article.licenses && Object.keys(article.licenses)
|
|
||||||
? <ArticleLicensing.Cacheable page={page} config={config} helper={helper} /> : null}
|
|
||||||
{/* Tags */}
|
|
||||||
{!index && page.tags && page.tags.length ? <div class="article-tags is-size-7 mb-4">
|
|
||||||
<span class="mr-2">#</span>
|
|
||||||
{page.tags.map(tag => {
|
|
||||||
return <a class="link-muted mr-2" rel="tag" href={url_for(tag.path)}>{tag.name}</a>;
|
|
||||||
})}
|
|
||||||
</div> : null}
|
|
||||||
{/* "Read more" button */}
|
|
||||||
{index && page.excerpt ? <a class="article-more button is-small is-size-7" href={`${url_for(page.link || page.path)}#more`}>{__('article.more')}</a> : null}
|
|
||||||
{/* Share button */}
|
|
||||||
{!index ? <Share config={config} page={page} helper={helper} /> : null}
|
|
||||||
</article>
|
|
||||||
</div>
|
|
||||||
{/* Donate button */}
|
|
||||||
{!index ? <Donates config={config} helper={helper} /> : null}
|
|
||||||
{/* Post navigation */}
|
|
||||||
{!index && (page.prev || page.next) ? <nav class="post-navigation mt-4 level is-mobile">
|
|
||||||
{page.prev ? <div class="level-start">
|
|
||||||
<a class={`article-nav-prev level level-item${!page.prev ? ' is-hidden-mobile' : ''} link-muted`} href={url_for(page.prev.path)}>
|
|
||||||
<i class="level-item fas fa-chevron-left"></i>
|
|
||||||
<span class="level-item">{page.prev.title}</span>
|
|
||||||
</a>
|
|
||||||
</div> : null}
|
|
||||||
{page.next ? <div class="level-end">
|
|
||||||
<a class={`article-nav-next level level-item${!page.next ? ' is-hidden-mobile' : ''} link-muted`} href={url_for(page.next.path)}>
|
|
||||||
<span class="level-item">{page.next.title}</span>
|
|
||||||
<i class="level-item fas fa-chevron-right"></i>
|
|
||||||
</a>
|
|
||||||
</div> : null}
|
|
||||||
</nav> : null}
|
|
||||||
{/* Comment */}
|
|
||||||
{!index ? <Comment config={config} page={page} helper={helper} /> : null}
|
|
||||||
</Fragment>;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,30 +0,0 @@
|
||||||
const logger = require('hexo-log')();
|
|
||||||
const { Component } = require('inferno');
|
|
||||||
const view = require('hexo-component-inferno/lib/core/view');
|
|
||||||
|
|
||||||
module.exports = class extends Component {
|
|
||||||
render() {
|
|
||||||
const { config, page, helper } = this.props;
|
|
||||||
const { __ } = helper;
|
|
||||||
const { comment } = config;
|
|
||||||
if (!comment || typeof comment.type !== 'string') {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return <div class="card">
|
|
||||||
<div class="card-content">
|
|
||||||
<h3 class="title is-5">{__('article.comments')}</h3>
|
|
||||||
{(() => {
|
|
||||||
try {
|
|
||||||
let Comment = view.require('comment/' + comment.type);
|
|
||||||
Comment = Comment.Cacheable ? Comment.Cacheable : Comment;
|
|
||||||
return <Comment config={config} page={page} helper={helper} comment={comment} />;
|
|
||||||
} catch (e) {
|
|
||||||
logger.w(`Icarus cannot load comment "${comment.type}"`);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
})()}
|
|
||||||
</div>
|
|
||||||
</div>;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,34 +0,0 @@
|
||||||
const logger = require('hexo-log')();
|
|
||||||
const { Component } = require('inferno');
|
|
||||||
const view = require('hexo-component-inferno/lib/core/view');
|
|
||||||
|
|
||||||
module.exports = class extends Component {
|
|
||||||
render() {
|
|
||||||
const { config, helper } = this.props;
|
|
||||||
const { __ } = helper;
|
|
||||||
const { donates = [] } = config;
|
|
||||||
if (!Array.isArray(donates) || !donates.length) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return <div class="card">
|
|
||||||
<div class="card-content">
|
|
||||||
<h3 class="menu-label has-text-centered">{__('donate.title')}</h3>
|
|
||||||
<div class="buttons is-centered">
|
|
||||||
{donates.map(service => {
|
|
||||||
const type = service.type;
|
|
||||||
if (typeof type === 'string') {
|
|
||||||
try {
|
|
||||||
let Donate = view.require('donate/' + type);
|
|
||||||
Donate = Donate.Cacheable ? Donate.Cacheable : Donate;
|
|
||||||
return <Donate helper={helper} donate={service} />;
|
|
||||||
} catch (e) {
|
|
||||||
logger.w(`Icarus cannot load donate button "${type}"`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,92 +0,0 @@
|
||||||
const { Component } = require('inferno');
|
|
||||||
const { cacheComponent } = require('hexo-component-inferno/lib/util/cache');
|
|
||||||
|
|
||||||
class Footer extends Component {
|
|
||||||
render() {
|
|
||||||
const {
|
|
||||||
logo,
|
|
||||||
logoUrl,
|
|
||||||
siteUrl,
|
|
||||||
siteTitle,
|
|
||||||
siteYear,
|
|
||||||
author,
|
|
||||||
links,
|
|
||||||
showVisitorCounter,
|
|
||||||
visitorCounterTitle
|
|
||||||
} = this.props;
|
|
||||||
|
|
||||||
let footerLogo = '';
|
|
||||||
if (logo) {
|
|
||||||
if (logo.text) {
|
|
||||||
footerLogo = logo.text;
|
|
||||||
} else {
|
|
||||||
footerLogo = <img src={logoUrl} alt={siteTitle} height="28" />;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
footerLogo = siteTitle;
|
|
||||||
}
|
|
||||||
|
|
||||||
return <footer class="footer">
|
|
||||||
<div class="container">
|
|
||||||
<div class="level">
|
|
||||||
<div class="level-start">
|
|
||||||
<a class="footer-logo is-block mb-2" href={siteUrl}>
|
|
||||||
{footerLogo}
|
|
||||||
</a>
|
|
||||||
<p class="is-size-7">
|
|
||||||
<span dangerouslySetInnerHTML={{ __html: `© ${siteYear} ${author || siteTitle}` }}></span>
|
|
||||||
Powered by <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a> &
|
|
||||||
<a href="https://github.com/ppoffice/hexo-theme-icarus" target="_blank" rel="noopener">Icarus</a>
|
|
||||||
<br/>
|
|
||||||
<a href="https://icp.gov.moe/?keyword=20214514">萌ICP备20214514号</a>
|
|
||||||
{showVisitorCounter ? <br /> : null}
|
|
||||||
{showVisitorCounter ? <span id="busuanzi_container_site_uv"
|
|
||||||
dangerouslySetInnerHTML={{ __html: visitorCounterTitle }}></span> : null}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="level-end">
|
|
||||||
{Object.keys(links).length ? <div class="field has-addons">
|
|
||||||
{Object.keys(links).map(name => {
|
|
||||||
const link = links[name];
|
|
||||||
return <p class="control">
|
|
||||||
<a class={`button is-transparent ${link.icon ? 'is-large' : ''}`} target="_blank" rel="noopener" title={name} href={link.url}>
|
|
||||||
{link.icon ? <i class={link.icon}></i> : name}
|
|
||||||
</a>
|
|
||||||
</p>;
|
|
||||||
})}
|
|
||||||
</div> : null}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</footer>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = cacheComponent(Footer, 'common.footer', props => {
|
|
||||||
const { config, helper } = props;
|
|
||||||
const { url_for, _p, date } = helper;
|
|
||||||
const { logo, title, author, footer, plugins } = config;
|
|
||||||
|
|
||||||
const links = {};
|
|
||||||
if (footer && footer.links) {
|
|
||||||
Object.keys(footer.links).forEach(name => {
|
|
||||||
const link = footer.links[name];
|
|
||||||
links[name] = {
|
|
||||||
url: url_for(typeof link === 'string' ? link : link.url),
|
|
||||||
icon: link.icon
|
|
||||||
};
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
logo,
|
|
||||||
logoUrl: url_for(logo),
|
|
||||||
siteUrl: url_for('/'),
|
|
||||||
siteTitle: title,
|
|
||||||
siteYear: date(new Date(), 'YYYY'),
|
|
||||||
author,
|
|
||||||
links,
|
|
||||||
showVisitorCounter: plugins && plugins.busuanzi === true,
|
|
||||||
visitorCounterTitle: _p('plugin.visitor_count', '<span id="busuanzi_value_site_uv">0</span>')
|
|
||||||
};
|
|
||||||
});
|
|
|
@ -1,167 +0,0 @@
|
||||||
const { Component } = require('inferno');
|
|
||||||
const MetaTags = require('hexo-component-inferno/lib/view/misc/meta');
|
|
||||||
const WebApp = require('hexo-component-inferno/lib/view/misc/web_app');
|
|
||||||
const OpenGraph = require('hexo-component-inferno/lib/view/misc/open_graph');
|
|
||||||
const StructuredData = require('hexo-component-inferno/lib/view/misc/structured_data');
|
|
||||||
const Plugins = require('./plugins');
|
|
||||||
|
|
||||||
function getPageTitle(page, siteTitle, helper) {
|
|
||||||
let title = page.title;
|
|
||||||
|
|
||||||
if (helper.is_archive()) {
|
|
||||||
title = helper._p('common.archive', Infinity);
|
|
||||||
if (helper.is_month()) {
|
|
||||||
title += ': ' + page.year + '/' + page.month;
|
|
||||||
} else if (helper.is_year()) {
|
|
||||||
title += ': ' + page.year;
|
|
||||||
}
|
|
||||||
} else if (helper.is_category()) {
|
|
||||||
title = helper._p('common.category', 1) + ': ' + page.category;
|
|
||||||
} else if (helper.is_tag()) {
|
|
||||||
title = helper._p('common.tag', 1) + ': ' + page.tag;
|
|
||||||
} else if (helper.is_categories()) {
|
|
||||||
title = helper._p('common.category', Infinity);
|
|
||||||
} else if (helper.is_tags()) {
|
|
||||||
title = helper._p('common.tag', Infinity);
|
|
||||||
}
|
|
||||||
|
|
||||||
return [title, siteTitle].filter(str => typeof str !== 'undefined' && str.trim() !== '').join(' - ');
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = class extends Component {
|
|
||||||
render() {
|
|
||||||
const { site, config, helper, page } = this.props;
|
|
||||||
const { url_for, cdn, fontcdn, iconcdn, is_post } = helper;
|
|
||||||
const {
|
|
||||||
url,
|
|
||||||
head = {},
|
|
||||||
article,
|
|
||||||
highlight,
|
|
||||||
variant = 'default'
|
|
||||||
} = config;
|
|
||||||
const {
|
|
||||||
meta = [],
|
|
||||||
manifest = {},
|
|
||||||
open_graph = {},
|
|
||||||
structured_data = {},
|
|
||||||
canonical_url = page.permalink,
|
|
||||||
rss,
|
|
||||||
favicon
|
|
||||||
} = head;
|
|
||||||
|
|
||||||
const language = page.lang || page.language || config.language;
|
|
||||||
const fontCssUrl = {
|
|
||||||
default: fontcdn('Ubuntu:wght@400;600&family=Source+Code+Pro', 'css2'),
|
|
||||||
cyberpunk: fontcdn('Oxanium:wght@300;400;600&family=Roboto+Mono', 'css2')
|
|
||||||
};
|
|
||||||
|
|
||||||
let hlTheme, images;
|
|
||||||
if (highlight && highlight.enable === false) {
|
|
||||||
hlTheme = null;
|
|
||||||
} else if (article && article.highlight && article.highlight.theme) {
|
|
||||||
hlTheme = article.highlight.theme;
|
|
||||||
} else {
|
|
||||||
hlTheme = 'atom-one-light';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof page.og_image === 'string') {
|
|
||||||
images = [page.og_image];
|
|
||||||
} else if (typeof page.cover === 'string') {
|
|
||||||
images = [url_for(page.cover)];
|
|
||||||
} else if (typeof page.thumbnail === 'string') {
|
|
||||||
images = [url_for(page.thumbnail)];
|
|
||||||
} else if (article && typeof article.og_image === 'string') {
|
|
||||||
images = [article.og_image];
|
|
||||||
} else if (page.content && page.content.includes('<img')) {
|
|
||||||
let img;
|
|
||||||
images = [];
|
|
||||||
const imgPattern = /<img [^>]*src=['"]([^'"]+)([^>]*>)/gi;
|
|
||||||
while ((img = imgPattern.exec(page.content)) !== null) {
|
|
||||||
images.push(img[1]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
images = [url_for('/img/og_image.png')];
|
|
||||||
}
|
|
||||||
|
|
||||||
let adsenseClientId = null;
|
|
||||||
if (Array.isArray(config.widgets)) {
|
|
||||||
const widget = config.widgets.find(widget => widget.type === 'adsense');
|
|
||||||
if (widget) {
|
|
||||||
adsenseClientId = widget.client_id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let openGraphImages = images;
|
|
||||||
if ((typeof open_graph === 'object' && open_graph !== null)
|
|
||||||
&& ((Array.isArray(open_graph.image) && open_graph.image.length > 0) || typeof open_graph.image === 'string')) {
|
|
||||||
openGraphImages = open_graph.image;
|
|
||||||
} else if ((Array.isArray(page.photos) && page.photos.length > 0) || typeof page.photos === 'string') {
|
|
||||||
openGraphImages = page.photos;
|
|
||||||
}
|
|
||||||
|
|
||||||
let structuredImages = images;
|
|
||||||
if ((typeof structured_data === 'object' && structured_data !== null)
|
|
||||||
&& ((Array.isArray(structured_data.image) && structured_data.image.length > 0) || typeof structured_data.image === 'string')) {
|
|
||||||
structuredImages = structured_data.image;
|
|
||||||
} else if ((Array.isArray(page.photos) && page.photos.length > 0) || typeof page.photos === 'string') {
|
|
||||||
structuredImages = page.photos;
|
|
||||||
}
|
|
||||||
|
|
||||||
return <head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
|
|
||||||
{meta && meta.length ? <MetaTags meta={meta} /> : null}
|
|
||||||
|
|
||||||
<title>{getPageTitle(page, config.title, helper)}</title>
|
|
||||||
|
|
||||||
<WebApp.Cacheable
|
|
||||||
helper={helper}
|
|
||||||
favicon={favicon}
|
|
||||||
icons={manifest.icons}
|
|
||||||
themeColor={manifest.theme_color}
|
|
||||||
name={manifest.name || config.title} />
|
|
||||||
|
|
||||||
{typeof open_graph === 'object' && open_graph !== null ? <OpenGraph
|
|
||||||
type={open_graph.type || (is_post(page) ? 'article' : 'website')}
|
|
||||||
title={open_graph.title || page.title || config.title}
|
|
||||||
date={page.date}
|
|
||||||
updated={page.updated}
|
|
||||||
author={open_graph.author || config.author}
|
|
||||||
description={open_graph.description || page.description || page.excerpt || page.content || config.description}
|
|
||||||
keywords={(page.tags && page.tags.length ? page.tags : undefined) || config.keywords}
|
|
||||||
url={open_graph.url || page.permalink || url}
|
|
||||||
images={openGraphImages}
|
|
||||||
siteName={open_graph.site_name || config.title}
|
|
||||||
language={language}
|
|
||||||
twitterId={open_graph.twitter_id}
|
|
||||||
twitterCard={open_graph.twitter_card}
|
|
||||||
twitterSite={open_graph.twitter_site}
|
|
||||||
googlePlus={open_graph.google_plus}
|
|
||||||
facebookAdmins={open_graph.fb_admins}
|
|
||||||
facebookAppId={open_graph.fb_app_id} /> : null}
|
|
||||||
|
|
||||||
{typeof structured_data === 'object' && structured_data !== null ? <StructuredData
|
|
||||||
title={structured_data.title || page.title || config.title}
|
|
||||||
description={structured_data.description || page.description || page.excerpt || page.content || config.description}
|
|
||||||
url={structured_data.url || page.permalink || url}
|
|
||||||
author={structured_data.author || config.author}
|
|
||||||
publisher={structured_data.publisher || config.title}
|
|
||||||
publisherLogo={structured_data.publisher_logo || config.logo}
|
|
||||||
date={page.date}
|
|
||||||
updated={page.updated}
|
|
||||||
images={structuredImages} /> : null}
|
|
||||||
|
|
||||||
{canonical_url ? <link rel="canonical" href={canonical_url} /> : null}
|
|
||||||
{rss ? <link rel="alternate" href={url_for(rss)} title={config.title} type="application/atom+xml" /> : null}
|
|
||||||
{favicon ? <link rel="icon" href={url_for(favicon)} /> : null}
|
|
||||||
<link rel="stylesheet" href={iconcdn()} />
|
|
||||||
{hlTheme ? <link rel="stylesheet" href={cdn('highlight.js', '9.12.0', 'styles/' + hlTheme + '.css')} /> : null}
|
|
||||||
<link rel="stylesheet" href={fontCssUrl[variant]} />
|
|
||||||
<link rel="stylesheet" href={url_for('/css/' + variant + '.css')} />
|
|
||||||
<Plugins site={site} config={config} helper={helper} page={page} head={true} />
|
|
||||||
|
|
||||||
{adsenseClientId ? <script data-ad-client={adsenseClientId}
|
|
||||||
src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" async></script> : null}
|
|
||||||
</head>;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,119 +0,0 @@
|
||||||
const { Component, Fragment } = require('inferno');
|
|
||||||
const { cacheComponent } = require('hexo-component-inferno/lib/util/cache');
|
|
||||||
const classname = require('hexo-component-inferno/lib/util/classname');
|
|
||||||
|
|
||||||
function isSameLink(a, b) {
|
|
||||||
function santize(url) {
|
|
||||||
let paths = url.replace(/(^\w+:|^)\/\//, '').split('#')[0].split('/').filter(p => p.trim() !== '');
|
|
||||||
if (paths.length > 0 && paths[paths.length - 1].trim() === 'index.html') {
|
|
||||||
paths = paths.slice(0, paths.length - 1);
|
|
||||||
}
|
|
||||||
return paths.join('/');
|
|
||||||
}
|
|
||||||
return santize(a) === santize(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Navbar extends Component {
|
|
||||||
render() {
|
|
||||||
const {
|
|
||||||
logo,
|
|
||||||
logoUrl,
|
|
||||||
siteUrl,
|
|
||||||
siteTitle,
|
|
||||||
menu,
|
|
||||||
links,
|
|
||||||
showToc,
|
|
||||||
tocTitle,
|
|
||||||
showSearch,
|
|
||||||
searchTitle
|
|
||||||
} = this.props;
|
|
||||||
|
|
||||||
let navbarLogo = '';
|
|
||||||
if (logo) {
|
|
||||||
if (logo.text) {
|
|
||||||
navbarLogo = logo.text;
|
|
||||||
} else {
|
|
||||||
navbarLogo = <img src={logoUrl} alt={siteTitle} height="28" />;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
navbarLogo = siteTitle;
|
|
||||||
}
|
|
||||||
|
|
||||||
return <nav class="navbar navbar-main">
|
|
||||||
<div class="container">
|
|
||||||
<div class="navbar-brand justify-content-center">
|
|
||||||
<a class="navbar-item navbar-logo" href={siteUrl}>
|
|
||||||
{navbarLogo}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="navbar-menu">
|
|
||||||
{Object.keys(menu).length ? <div class="navbar-start">
|
|
||||||
{Object.keys(menu).map(name => {
|
|
||||||
const item = menu[name];
|
|
||||||
return <a class={classname({ 'navbar-item': true, 'is-active': item.active })} href={item.url}>{name}</a>;
|
|
||||||
})}
|
|
||||||
</div> : null}
|
|
||||||
<div class="navbar-end">
|
|
||||||
{Object.keys(links).length ? <Fragment>
|
|
||||||
{Object.keys(links).map(name => {
|
|
||||||
const link = links[name];
|
|
||||||
return <a class="navbar-item" target="_blank" rel="noopener" title={name} href={link.url}>
|
|
||||||
{link.icon ? <i class={link.icon}></i> : name}
|
|
||||||
</a>;
|
|
||||||
})}
|
|
||||||
</Fragment> : null}
|
|
||||||
{showToc ? <a class="navbar-item is-hidden-tablet catalogue" title={tocTitle} href="javascript:;">
|
|
||||||
<i class="fas fa-list-ul"></i>
|
|
||||||
</a> : null}
|
|
||||||
{showSearch ? <a class="navbar-item search" title={searchTitle} href="javascript:;">
|
|
||||||
<i class="fas fa-search"></i>
|
|
||||||
</a> : null}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = cacheComponent(Navbar, 'common.navbar', props => {
|
|
||||||
const { config, helper, page } = props;
|
|
||||||
const { url_for, _p, __ } = helper;
|
|
||||||
const { logo, title, navbar, widgets, search } = config;
|
|
||||||
|
|
||||||
const hasTocWidget = Array.isArray(widgets) && widgets.find(widget => widget.type === 'toc');
|
|
||||||
const showToc = (config.toc === true || page.toc) && hasTocWidget && ['page', 'post'].includes(page.layout);
|
|
||||||
|
|
||||||
const menu = {};
|
|
||||||
if (navbar && navbar.menu) {
|
|
||||||
const pageUrl = typeof page.path !== 'undefined' ? url_for(page.path) : '';
|
|
||||||
Object.keys(navbar.menu).forEach(name => {
|
|
||||||
const url = url_for(navbar.menu[name]);
|
|
||||||
const active = isSameLink(url, pageUrl);
|
|
||||||
menu[name] = { url, active };
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const links = {};
|
|
||||||
if (navbar && navbar.links) {
|
|
||||||
Object.keys(navbar.links).forEach(name => {
|
|
||||||
const link = navbar.links[name];
|
|
||||||
links[name] = {
|
|
||||||
url: url_for(typeof link === 'string' ? link : link.url),
|
|
||||||
icon: link.icon
|
|
||||||
};
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
logo,
|
|
||||||
logoUrl: url_for(logo),
|
|
||||||
siteUrl: url_for('/'),
|
|
||||||
siteTitle: title,
|
|
||||||
menu,
|
|
||||||
links,
|
|
||||||
showToc,
|
|
||||||
tocTitle: _p('widget.catalogue', Infinity),
|
|
||||||
showSearch: search && search.type,
|
|
||||||
searchTitle: __('search.search')
|
|
||||||
};
|
|
||||||
});
|
|
|
@ -1,27 +0,0 @@
|
||||||
const logger = require('hexo-log')();
|
|
||||||
const { Component, Fragment } = require('inferno');
|
|
||||||
const view = require('hexo-component-inferno/lib/core/view');
|
|
||||||
|
|
||||||
module.exports = class extends Component {
|
|
||||||
render() {
|
|
||||||
const { site, config, page, helper, head } = this.props;
|
|
||||||
const { plugins = [] } = config;
|
|
||||||
|
|
||||||
return <Fragment>
|
|
||||||
{Object.keys(plugins).map(name => {
|
|
||||||
// plugin is not enabled
|
|
||||||
if (!plugins[name]) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
let Plugin = view.require('plugin/' + name);
|
|
||||||
Plugin = Plugin.Cacheable ? Plugin.Cacheable : Plugin;
|
|
||||||
return <Plugin site={site} config={config} page={page} helper={helper} plugin={plugins[name]} head={head} />;
|
|
||||||
} catch (e) {
|
|
||||||
logger.w(`Icarus cannot load plugin "${name}"`);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
})}
|
|
||||||
</Fragment>;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,42 +0,0 @@
|
||||||
const { Component, Fragment } = require('inferno');
|
|
||||||
const Plugins = require('./plugins');
|
|
||||||
|
|
||||||
module.exports = class extends Component {
|
|
||||||
render() {
|
|
||||||
const { site, config, helper, page } = this.props;
|
|
||||||
const { url_for, cdn } = helper;
|
|
||||||
const { article } = config;
|
|
||||||
const language = page.lang || page.language || config.language || 'en';
|
|
||||||
|
|
||||||
let fold = 'unfolded';
|
|
||||||
let clipboard = true;
|
|
||||||
if (article && article.highlight) {
|
|
||||||
if (typeof article.highlight.clipboard !== 'undefined') {
|
|
||||||
clipboard = !!article.highlight.clipboard;
|
|
||||||
}
|
|
||||||
if (typeof article.highlight.fold === 'string') {
|
|
||||||
fold = article.highlight.fold;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const embeddedConfig = `var IcarusThemeSettings = {
|
|
||||||
article: {
|
|
||||||
highlight: {
|
|
||||||
clipboard: ${clipboard},
|
|
||||||
fold: '${fold}'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};`;
|
|
||||||
|
|
||||||
return <Fragment>
|
|
||||||
<script src={cdn('jquery', '3.3.1', 'dist/jquery.min.js')}></script>
|
|
||||||
<script src={cdn('moment', '2.22.2', 'min/moment-with-locales.min.js')}></script>
|
|
||||||
{clipboard && <script src={cdn('clipboard', '2.0.4', 'dist/clipboard.min.js')} defer></script>}
|
|
||||||
<script dangerouslySetInnerHTML={{ __html: `moment.locale("${language}");` }}></script>
|
|
||||||
<script dangerouslySetInnerHTML={{ __html: embeddedConfig }}></script>
|
|
||||||
<script src={url_for('/js/column.js')}></script>
|
|
||||||
<Plugins site={site} config={config} page={page} helper={helper} head={false} />
|
|
||||||
<script src={url_for('/js/main.js')} defer></script>
|
|
||||||
</Fragment>;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,22 +0,0 @@
|
||||||
const logger = require('hexo-log')();
|
|
||||||
const { Component } = require('inferno');
|
|
||||||
const view = require('hexo-component-inferno/lib/core/view');
|
|
||||||
|
|
||||||
module.exports = class extends Component {
|
|
||||||
render() {
|
|
||||||
const { config, helper } = this.props;
|
|
||||||
const { search } = config;
|
|
||||||
if (!search || typeof search.type !== 'string') {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
let Search = view.require('search/' + search.type);
|
|
||||||
Search = Search.Cacheable ? Search.Cacheable : Search;
|
|
||||||
return <Search config={config} helper={helper} search={search} />;
|
|
||||||
} catch (e) {
|
|
||||||
logger.w(`Icarus cannot load search "${search.type}"`);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,22 +0,0 @@
|
||||||
const logger = require('hexo-log')();
|
|
||||||
const { Component } = require('inferno');
|
|
||||||
const view = require('hexo-component-inferno/lib/core/view');
|
|
||||||
|
|
||||||
module.exports = class extends Component {
|
|
||||||
render() {
|
|
||||||
const { config, page, helper } = this.props;
|
|
||||||
const { share } = config;
|
|
||||||
if (!share || typeof share.type !== 'string') {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
let Share = view.require('share/' + share.type);
|
|
||||||
Share = Share.Cacheable ? Share.Cacheable : Share;
|
|
||||||
return <Share config={config} page={page} helper={helper} share={share} />;
|
|
||||||
} catch (e) {
|
|
||||||
logger.w(`Icarus cannot load share button "${share.type}"`);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,103 +0,0 @@
|
||||||
const logger = require('hexo-log')();
|
|
||||||
const { Component } = require('inferno');
|
|
||||||
const view = require('hexo-component-inferno/lib/core/view');
|
|
||||||
const classname = require('hexo-component-inferno/lib/util/classname');
|
|
||||||
|
|
||||||
function formatWidgets(widgets) {
|
|
||||||
const result = {};
|
|
||||||
if (Array.isArray(widgets)) {
|
|
||||||
widgets.filter(widget => typeof widget === 'object').forEach(widget => {
|
|
||||||
if ('position' in widget && (widget.position === 'left' || widget.position === 'right')) {
|
|
||||||
if (!(widget.position in result)) {
|
|
||||||
result[widget.position] = [widget];
|
|
||||||
} else {
|
|
||||||
result[widget.position].push(widget);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function hasColumn(widgets, position) {
|
|
||||||
if (Array.isArray(widgets)) {
|
|
||||||
return typeof widgets.find(widget => widget.position === position) !== 'undefined';
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getColumnCount(widgets) {
|
|
||||||
return [hasColumn(widgets, 'left'), hasColumn(widgets, 'right')].filter(v => !!v).length + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getColumnSizeClass(columnCount) {
|
|
||||||
switch (columnCount) {
|
|
||||||
case 2:
|
|
||||||
return 'is-4-tablet is-4-desktop is-4-widescreen';
|
|
||||||
case 3:
|
|
||||||
return 'is-4-tablet is-4-desktop is-3-widescreen';
|
|
||||||
}
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
function getColumnVisibilityClass(columnCount, position) {
|
|
||||||
if (columnCount === 3 && position === 'right') {
|
|
||||||
return 'is-hidden-touch is-hidden-desktop-only';
|
|
||||||
}
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
function getColumnOrderClass(position) {
|
|
||||||
return position === 'left' ? 'order-1' : 'order-3';
|
|
||||||
}
|
|
||||||
|
|
||||||
function isColumnSticky(config, position) {
|
|
||||||
return typeof config.sidebar === 'object'
|
|
||||||
&& position in config.sidebar
|
|
||||||
&& config.sidebar[position].sticky === true;
|
|
||||||
}
|
|
||||||
|
|
||||||
class Widgets extends Component {
|
|
||||||
render() {
|
|
||||||
const { site, config, helper, page, position } = this.props;
|
|
||||||
const widgets = formatWidgets(config.widgets)[position] || [];
|
|
||||||
const columnCount = getColumnCount(config.widgets);
|
|
||||||
|
|
||||||
if (!widgets.length) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return <div class={classname({
|
|
||||||
'column': true,
|
|
||||||
['column-' + position]: true,
|
|
||||||
[getColumnSizeClass(columnCount)]: true,
|
|
||||||
[getColumnVisibilityClass(columnCount, position)]: true,
|
|
||||||
[getColumnOrderClass(position)]: true,
|
|
||||||
'is-sticky': isColumnSticky(config, position)
|
|
||||||
})}>
|
|
||||||
{widgets.map(widget => {
|
|
||||||
// widget type is not defined
|
|
||||||
if (!widget.type) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
let Widget = view.require('widget/' + widget.type);
|
|
||||||
Widget = Widget.Cacheable ? Widget.Cacheable : Widget;
|
|
||||||
return <Widget site={site} helper={helper} config={config} page={page} widget={widget} />;
|
|
||||||
} catch (e) {
|
|
||||||
logger.w(`Icarus cannot load widget "${widget.type}"`);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
})}
|
|
||||||
{position === 'left' && hasColumn(config.widgets, 'right') ? <div class={classname({
|
|
||||||
'column-right-shadow': true,
|
|
||||||
'is-hidden-widescreen': true,
|
|
||||||
'is-sticky': isColumnSticky(config, 'right')
|
|
||||||
})}></div> : null}
|
|
||||||
</div>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Widgets.getColumnCount = getColumnCount;
|
|
||||||
|
|
||||||
module.exports = Widgets;
|
|
|
@ -1,22 +0,0 @@
|
||||||
const { Component, Fragment } = require('inferno');
|
|
||||||
const Paginator = require('hexo-component-inferno/lib/view/misc/paginator');
|
|
||||||
const Article = require('./common/article');
|
|
||||||
|
|
||||||
module.exports = class extends Component {
|
|
||||||
render() {
|
|
||||||
const { config, page, helper } = this.props;
|
|
||||||
const { __, url_for } = helper;
|
|
||||||
|
|
||||||
return <Fragment>
|
|
||||||
{page.posts.map(post => <Article config={config} page={post} helper={helper} index={true} />)}
|
|
||||||
{page.total > 1 ? <Paginator
|
|
||||||
current={page.current}
|
|
||||||
total={page.total}
|
|
||||||
baseUrl={page.base}
|
|
||||||
path={config.pagination_dir}
|
|
||||||
urlFor={url_for}
|
|
||||||
prevTitle={__('common.prev')}
|
|
||||||
nextTitle={__('common.next')} /> : null}
|
|
||||||
</Fragment>;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,43 +0,0 @@
|
||||||
const { Component } = require('inferno');
|
|
||||||
const classname = require('hexo-component-inferno/lib/util/classname');
|
|
||||||
const Head = require('./common/head');
|
|
||||||
const Navbar = require('./common/navbar');
|
|
||||||
const Widgets = require('./common/widgets');
|
|
||||||
const Footer = require('./common/footer');
|
|
||||||
const Scripts = require('./common/scripts');
|
|
||||||
const Search = require('./common/search');
|
|
||||||
|
|
||||||
module.exports = class extends Component {
|
|
||||||
render() {
|
|
||||||
const { site, config, page, helper, body } = this.props;
|
|
||||||
|
|
||||||
const language = page.lang || page.language || config.language;
|
|
||||||
const columnCount = Widgets.getColumnCount(config.widgets);
|
|
||||||
|
|
||||||
return <html lang={language ? language.substr(0, 2) : ''}>
|
|
||||||
<Head site={site} config={config} helper={helper} page={page} />
|
|
||||||
<body class={`is-${columnCount}-column`}>
|
|
||||||
<Navbar config={config} helper={helper} page={page} />
|
|
||||||
<section class="section">
|
|
||||||
<div class="container">
|
|
||||||
<div class="columns">
|
|
||||||
<div class={classname({
|
|
||||||
column: true,
|
|
||||||
'order-2': true,
|
|
||||||
'column-main': true,
|
|
||||||
'is-12': columnCount === 1,
|
|
||||||
'is-8-tablet is-8-desktop is-8-widescreen': columnCount === 2,
|
|
||||||
'is-8-tablet is-8-desktop is-6-widescreen': columnCount === 3
|
|
||||||
})} dangerouslySetInnerHTML={{ __html: body }}></div>
|
|
||||||
<Widgets site={site} config={config} helper={helper} page={page} position={'left'} />
|
|
||||||
<Widgets site={site} config={config} helper={helper} page={page} position={'right'} />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
<Footer config={config} helper={helper} />
|
|
||||||
<Scripts site={site} config={config} helper={helper} page={page} />
|
|
||||||
<Search config={config} helper={helper} />
|
|
||||||
</body>
|
|
||||||
</html>;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,10 +0,0 @@
|
||||||
const { Component } = require('inferno');
|
|
||||||
const Article = require('./common/article');
|
|
||||||
|
|
||||||
module.exports = class extends Component {
|
|
||||||
render() {
|
|
||||||
const { config, page, helper } = this.props;
|
|
||||||
|
|
||||||
return <Article config={config} page={page} helper={helper} index={false} />;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,22 +0,0 @@
|
||||||
const { Component } = require('inferno');
|
|
||||||
const { cacheComponent } = require('hexo-component-inferno/lib/util/cache');
|
|
||||||
|
|
||||||
class AnimeJs extends Component {
|
|
||||||
render() {
|
|
||||||
if (this.props.head) {
|
|
||||||
return <style dangerouslySetInnerHTML={{ __html: 'body>.footer,body>.navbar,body>.section{opacity:0}' }}></style>;
|
|
||||||
}
|
|
||||||
return <script src={this.props.jsUrl}></script>;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AnimeJs.Cacheable = cacheComponent(AnimeJs, 'plugin.animejs', props => {
|
|
||||||
const { helper, head } = props;
|
|
||||||
return {
|
|
||||||
head,
|
|
||||||
jsUrl: helper.url_for('/js/animation.js')
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports = AnimeJs;
|
|
|
@ -1,29 +0,0 @@
|
||||||
const { Component, Fragment } = require('inferno');
|
|
||||||
const { cacheComponent } = require('hexo-component-inferno/lib/util/cache');
|
|
||||||
|
|
||||||
class BackToTop extends Component {
|
|
||||||
render() {
|
|
||||||
const { title, jsUrl } = this.props;
|
|
||||||
|
|
||||||
return <Fragment>
|
|
||||||
<a id="back-to-top" title={title} href="javascript:;">
|
|
||||||
<i class="fas fa-chevron-up"></i>
|
|
||||||
</a>
|
|
||||||
<script src={jsUrl} defer></script>
|
|
||||||
</Fragment>;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
BackToTop.Cacheable = cacheComponent(BackToTop, 'plugin.backtotop', props => {
|
|
||||||
const { helper, head } = props;
|
|
||||||
if (head) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
title: helper.__('plugin.backtotop'),
|
|
||||||
jsUrl: helper.url_for('/js/back_to_top.js')
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports = BackToTop;
|
|
|
@ -1,10 +0,0 @@
|
||||||
const { Component } = require('inferno');
|
|
||||||
const Article = require('./common/article');
|
|
||||||
|
|
||||||
module.exports = class extends Component {
|
|
||||||
render() {
|
|
||||||
const { config, page, helper } = this.props;
|
|
||||||
|
|
||||||
return <Article config={config} page={page} helper={helper} index={false} />;
|
|
||||||
}
|
|
||||||
};
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue