Compare commits

...

17 Commits
3.7.6 ... 3.8.2

Author SHA1 Message Date
Jerry
641fb56b22 improvement: 修改配置文件註釋 2021-07-20 23:19:14 +08:00
Jerry
7c859ef66d fix: 修復 footer 在部分瀏覽器沒有顯示在底部的 bug close #616 2021-07-20 23:09:57 +08:00
Jerry
42bc175718 Merge branch 'dev' 2021-07-10 22:32:24 +08:00
Jerry
bbb9beb8f9 Dependencies: update hexo-renderer-pug 2021-07-10 22:29:20 +08:00
Jerry
eca1487a5e fix: 修復 inline mathjax 有滾動條的 bug 2021-07-06 15:52:21 +08:00
Jerry Wong
3f796adc88 Merge pull request #607 from Android-KitKat/fix-flink
fix: 修复友情链接的头像带有灯箱的问题
2021-07-06 00:12:53 +08:00
Android
32b83a0d81 fix: 修复友情链接的头像带有 Medium Zoom 灯箱的问题 2021-07-05 03:14:48 +08:00
Android
ad87304302 fix: 修复友情链接的头像带有 FancyBox 灯箱的问题 2021-07-05 00:23:19 +08:00
Jerry
7b520c62f6 label 3.8.0 2021-07-04 18:40:01 +08:00
Jerry
026a348482 label 3.8.0 2021-07-04 18:34:42 +08:00
Jerry
829a3dbf32 breaking changes: 移除最新評論的評論服務商選擇,默認為第一個評論服務商
feat: 增加 waline avatarCDN 配置(最新評論也會更新)
feat: archives 的 標題 在 menu 配置中獲取
fix: 修復文章頁 mathjax 因字體小導致顯示重疊的 bug close #587
fix: 修復 mathjax 在列表下,導致 列表沒有樣式的 bug  close #586
improvement: 減少卡頓,apple 裝置首頁背景 background-attachment 設為 scroll
2021-06-09 14:33:55 +08:00
Jerry
54c6a509c7 breaking changes: 移除 waline 的 emojiCDN 和 emojiMaps 配置
fix: 修復 升級到 waline 1.x 而出現的 bug
2021-06-05 00:35:23 +08:00
Jerry
c214da4515 breaking changes: 移除 waline 的 emojiCDN 和 emojiMaps 配置
fix: 修復 升級到 waline 1.x 而出現的 bug
2021-05-31 22:23:14 +08:00
Jerry
de4037106b breaking changes: widget 寫法更改/可添加非sticky區域widget
feat: 升級facebook comment js 到 v10
fix: 修復當內容過少時, footer 沒有底部靠攏的bug
improvement: 404頁面不再顯示 rightside
2021-05-21 16:15:25 +08:00
Jerry
f0eaf2d8b0 label 3.7.7 2021-05-11 22:25:04 +08:00
Jerry
9e6958f25b improvement: 适配新版的 waline 夜间模式 2021-05-11 22:17:03 +08:00
Jerry
36527a3b81 fix: 修復標題/博客名有 ‘ 時,pjax 會報錯的bug
improvement: css調整
2021-05-09 00:53:56 +08:00
39 changed files with 328 additions and 273 deletions

View File

@@ -274,6 +274,7 @@ comments:
# https://disqus.com/ # https://disqus.com/
disqus: disqus:
shortname: shortname:
apikey: # For newest comments widget
# Alternative Disqus - Render comments with Disqus API # Alternative Disqus - Render comments with Disqus API
# DisqusJS 評論系統,可以實現在網路審查地區載入 Disqus 評論列表,兼容原版 # DisqusJS 評論系統,可以實現在網路審查地區載入 Disqus 評論列表,兼容原版
@@ -331,7 +332,7 @@ valine:
waline: waline:
serverURL: # Waline server address url serverURL: # Waline server address url
avatar: monsterid # gravatar style https://zh-tw.gravatar.com/site/implement/images/#default-image avatar: monsterid # gravatar style https://zh-tw.gravatar.com/site/implement/images/#default-image
emojiCDN: # emoji CDN avatarCDN: # Gravatar CDN baseURL
bg: # waline background bg: # waline background
visitor: false visitor: false
option: option:
@@ -460,9 +461,9 @@ google_adsense:
# -------------------------------------- # --------------------------------------
site_verification: site_verification:
# - name: google_site_verification # - name: google-site-verification
# content: xxxxxx # content: xxxxxx
# - name: baidu_site_verification # - name: baidu-site-verification
# content: xxxxxxx # content: xxxxxxx
# Beautify/Effect (美化/效果) # Beautify/Effect (美化/效果)
@@ -694,17 +695,6 @@ newest_comments:
limit: 6 limit: 6
storage: 10 # unit: mins, save data to localStorage storage: 10 # unit: mins, save data to localStorage
avatar: true avatar: true
# You can only choose one, or neither
valine: false
github_issues:
enable: false
repo:
disqus:
enable: false
forum:
api_key:
twikoo: false
waline: false
# Bottom right button (右下角按鈕) # Bottom right button (右下角按鈕)
# -------------------------------------- # --------------------------------------
@@ -756,7 +746,7 @@ fancybox: true
# -------------------------------------- # --------------------------------------
# mermaid # mermaid
# see https://github.com/knsv/mermaid # see https://github.com/mermaid-js/mermaid
mermaid: mermaid:
enable: false enable: false
# built-in themes: default/forest/dark/neutral # built-in themes: default/forest/dark/neutral

View File

@@ -1,7 +1,7 @@
- var top_img = theme.error_404.background || theme.default_top_img - var top_img = theme.error_404.background || theme.default_top_img
- var bg_img = `background-image: url('${url_for(top_img)}')` - var bg_img = `background-image: url('${url_for(top_img)}')`
#body-wrap.error #body-wrap.error404
div(style='display: none') div(style='display: none')
include ./header/index.pug include ./header/index.pug

View File

@@ -1,5 +1,5 @@
- var pageTitle - var pageTitle
- if (is_archive()) pageTitle = _p('page.archives') - if (is_archive()) pageTitle = fragment_cache('findArchivesTitle', function(){return findArchivesTitle(theme.menu);})
- else if (is_tag()) pageTitle = _p('page.tag') + ': ' + page.tag - else if (is_tag()) pageTitle = _p('page.tag') + ': ' + page.tag
- else if (is_category()) pageTitle = _p('page.category') + ': ' + page.category - else if (is_category()) pageTitle = _p('page.category') + ': ' + page.category
- else if (is_month()) pageTitle += ': ' + page.month + '/' + page.year - else if (is_month()) pageTitle += ': ' + page.month + '/' + page.year

View File

@@ -19,7 +19,7 @@ if !theme.disable_top_img && page.top_img !== false
if top_img !== false if top_img !== false
- var imgSource = top_img && top_img.indexOf('/') !== -1 ? `background-image: url('${url_for(top_img)}')` : `background: ${top_img}` - var imgSource = top_img && top_img.indexOf('/') !== -1 ? `background-image: url('${url_for(top_img)}')` : `background: ${top_img}`
- var bg_img = top_img ? imgSource : '' - var bg_img = top_img ? imgSource : ''
- var site_title = is_archive() ? _p('page.archives') : page.title || page.tag || page.category || config.title - var site_title = is_archive() ? fragment_cache('findArchivesTitle', function(){return findArchivesTitle(theme.menu);}) : page.title || page.tag || page.category || config.title
- var isHomeClass = is_home() ? 'full_page' : 'not-home-page' - var isHomeClass = is_home() ? 'full_page' : 'not-home-page'
- is_post() ? isHomeClass = 'post-bg' : isHomeClass - is_post() ? isHomeClass = 'post-bg' : isHomeClass
else else

View File

@@ -13,8 +13,9 @@
each item in i.link_list each item in i.link_list
.flink-list-item .flink-list-item
a(href=url_for(item.link) title=item.name target="_blank") a(href=url_for(item.link) title=item.name target="_blank")
.flink-item-icon
img(src=url_for(item.avatar) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt=item.name ) img(src=url_for(item.avatar) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt=item.name )
span.flink-item-name= item.name .flink-item-name= item.name
span.flink-item-desc(title=item.descr)= item.descr .flink-item-desc(title=item.descr)= item.descr
!= page.content != page.content

View File

@@ -1,8 +1,8 @@
#sidebar #sidebar
#menu-mask #menu-mask
#sidebar-menus #sidebar-menus
.author-avatar .avatar-img.is-center
img.avatar-img(src=url_for(theme.avatar.img) onerror=`onerror=null;src='${theme.error_img.flink}'` alt="avatar") img(src=url_for(theme.avatar.img) onerror=`onerror=null;src='${theme.error_img.flink}'` alt="avatar")
.site-data .site-data
if site.posts.length if site.posts.length
.data-item.is-center .data-item.is-center

View File

@@ -3,10 +3,9 @@ script.
function loadWaline () { function loadWaline () {
function initWaline () { function initWaline () {
let initData = { let initData = {
el: '#waline-wrap', el: null,
serverURL: '!{theme.waline.serverURL}', serverURL: '!{theme.waline.serverURL}',
} }
const waline = new Waline(initData) const waline = new Waline(initData)
} }

View File

@@ -7,7 +7,7 @@ script.
if (typeof FB === 'object') FB.XFBML.parse() if (typeof FB === 'object') FB.XFBML.parse()
else { else {
let ele = document.createElement('script') let ele = document.createElement('script')
ele.setAttribute('src','https://connect.facebook.net/!{theme.facebook_comments.lang}/sdk.js#xfbml=1&version=v9.0') ele.setAttribute('src','https://connect.facebook.net/!{theme.facebook_comments.lang}/sdk.js#xfbml=1&version=v10.0')
ele.setAttribute('async', 'true') ele.setAttribute('async', 'true')
ele.setAttribute('defer', 'true') ele.setAttribute('defer', 'true')
ele.setAttribute('crossorigin', 'anonymous') ele.setAttribute('crossorigin', 'anonymous')

View File

@@ -1,7 +1,3 @@
- let emojiMaps = '""'
if site.data.waline
- emojiMaps = JSON.stringify(site.data.waline)
script. script.
function loadWaline () { function loadWaline () {
function initWaline () { function initWaline () {
@@ -10,9 +6,8 @@ script.
serverURL: '!{theme.waline.serverURL}', serverURL: '!{theme.waline.serverURL}',
avatar: '#{theme.waline.avatar}', avatar: '#{theme.waline.avatar}',
path: location.pathname, path: location.pathname,
emojiCDN: '#{theme.waline.emojiCDN}', visitor: #{theme.waline.visitor},
emojiMaps: !{emojiMaps}, dark: 'html[data-theme="dark"]'
visitor: #{theme.waline.visitor}
}, !{JSON.stringify(theme.waline.option)})) }, !{JSON.stringify(theme.waline.option)}))
} }

View File

@@ -4,7 +4,7 @@ link(rel="stylesheet" type="text/css" href=theme.CDN.katex_copytex_css)
script. script.
(() => { (() => {
document.querySelectorAll('#article-container span.katex-display').forEach(item => { document.querySelectorAll('#article-container span.katex-display').forEach(item => {
btf.wrap(item, 'div', '', 'katex-wrap') btf.wrap(item, 'div', { class: 'katex-wrap'})
}) })
})() })()

View File

@@ -1,21 +1,14 @@
//- Mathjax 3 //- Mathjax 3
//- http://docs.mathjax.org/en/latest/upgrading/v2.html#changes-in-the-mathjax-api
//- https://github.com/mathjax/MathJax/issues/2209
//- http://docs.mathjax.org/en/latest/options/input/tex.html#the-configuration-block
//- http://docs.mathjax.org/en/latest/web/typeset.html#resetting-automatic-equation-numbering
script. script.
if (!window.MathJax) { if (!window.MathJax) {
window.MathJax = { window.MathJax = {
loader: {
source: {
'[tex]/amsCd': '[tex]/amscd'
}
},
tex: { tex: {
inlineMath: [ ['$','$'], ["\\(","\\)"]], inlineMath: [ ['$','$'], ["\\(","\\)"]],
tags: 'ams' tags: 'ams'
}, },
chtml: {
scale: 1.2
},
options: { options: {
renderActions: { renderActions: {
findScript: [10, doc => { findScript: [10, doc => {
@@ -29,13 +22,15 @@ script.
doc.math.push(math) doc.math.push(math)
} }
}, ''], }, ''],
addClass: [200,() => { insertScript: [200, () => {
document.querySelectorAll('mjx-container:not([display=\'true\']').forEach( node => { document.querySelectorAll('mjx-container:not\([display]\)').forEach(node => {
const target = node.parentNode const target = node.parentNode
if (!target.classList.contains('has-jax')) { if (target.nodeName.toLowerCase() === 'li') {
target.classList.add('mathjax-overflow') target.parentNode.classList.add('has-jax')
} else {
target.classList.add('has-jax')
} }
}) });
}, '', false] }, '', false]
} }
} }

View File

@@ -15,7 +15,7 @@ script.
} }
const getComment = () => { const getComment = () => {
fetch('https://disqus.com/api/3.0/forums/listPosts.json?forum=!{theme.newest_comments.disqus.forum}&related=thread&limit=!{theme.newest_comments.limit}&api_key=!{theme.newest_comments.disqus.api_key}') fetch('https://disqus.com/api/3.0/forums/listPosts.json?forum=!{forum}&related=thread&limit=!{theme.newest_comments.limit}&api_key=!{apiKey}')
.then(response => response.json()) .then(response => response.json())
.then(data => { .then(data => {
const disqusArray = data.response.map(item => { const disqusArray = data.response.map(item => {

View File

@@ -38,7 +38,7 @@ script.
} }
const getComment = () => { const getComment = () => {
fetch('https://api.github.com/repos/!{theme.newest_comments.github_issues.repo}/issues/comments?sort=updated&direction=desc&per_page=!{theme.newest_comments.limit}&page=1',{ fetch('https://api.github.com/repos/!{userRepo}/issues/comments?sort=updated&direction=desc&per_page=!{theme.newest_comments.limit}&page=1',{
"headers": { "headers": {
Accept: 'application/vnd.github.v3.html+json' Accept: 'application/vnd.github.v3.html+json'
} }

View File

@@ -1,12 +1,26 @@
- let config = theme.newest_comments - let { use } = theme.comments
if config.valine if use
- let forum,apiKey,userRepo
case use[0]
when 'Valine'
include ./valine.pug include ./valine.pug
else if config.waline when 'Waline'
include ./waline.pug include ./waline.pug
else if config.github_issues.enable when 'Twikoo'
include ./github-issues.pug
else if config.disqus.enable
include ./disqus-comment.pug
else if config.twikoo
include ./twikoo-comment.pug include ./twikoo-comment.pug
when 'Disqus'
- forum = theme.disqus.shortname
- apiKey = theme.disqus.apikey
include ./disqus-comment.pug
when 'Disqusjs'
- forum = theme.disqusjs.shortname
- apiKey = theme.disqusjs.apikey
include ./disqus-comment.pug
when 'Gitalk'
- let { repo,owner } = theme.gitalk
- userRepo = owner + '/' + repo
include ./github-issues.pug
when 'Utterances'
- userRepo = theme.utterances.repo
include ./github-issues.pug

View File

@@ -1,4 +1,4 @@
- let default_avatar = theme.waline.avatar - let { avatar,avatarCDN } = theme.waline
script. script.
window.addEventListener('load', () => { window.addEventListener('load', () => {
@@ -16,10 +16,10 @@ script.
return content return content
} }
const getIcon = (avatar,mail) => { const getIcon = (ava,mail) => {
if (avatar) return avatar if (ava) return ava
let defaultIcon = '!{ default_avatar ? `?d=${default_avatar}` : ''}' let defaultIcon = '!{ avatar ? `?d=${avatar}` : ''}'
let iconUrl = `https://gravatar.loli.net/avatar/${mail + defaultIcon}` let iconUrl = "!{avatarCDN ? avatarCDN : 'https://gravatar.loli.net/avatar/'}" + mail + defaultIcon
return iconUrl return iconUrl
} }
@@ -53,11 +53,10 @@ script.
const getComment = () => { const getComment = () => {
const loadWaline = () => { const loadWaline = () => {
Waline.Widget.RecentComments({ Waline.Widget.RecentComments({
el: '#card-newest-comments .aside-list',
serverURL: '!{theme.waline.serverURL}', serverURL: '!{theme.waline.serverURL}',
count: !{theme.newest_comments.limit} count: !{theme.newest_comments.limit}
}).then(comments => { }).then(res => {
const walineArray = comments.map(function (e) { const walineArray = res.comments.map(e => {
return { return {
'content': changeContent(e.comment), 'content': changeContent(e.comment),
'avatar': getIcon(e.QQAvatar,e.mail), 'avatar': getIcon(e.QQAvatar,e.mail),

View File

@@ -28,8 +28,9 @@ script.
document.addEventListener('pjax:send', function () { document.addEventListener('pjax:send', function () {
// removeEventListener toc scroll // removeEventListener scroll
window.removeEventListener('scroll', window.tocScrollFn) window.removeEventListener('scroll', window.tocScrollFn)
window.removeEventListener('scroll', scrollCollect)
typeof preloader === 'object' && preloader.initLoading() typeof preloader === 'object' && preloader.initLoading()

View File

@@ -1,7 +1,8 @@
if theme.aside.card_author.enable if theme.aside.card_author.enable
.card-widget.card-info .card-widget.card-info
.card-info-avatar.is-center .is-center
img.avatar-img(src=url_for(theme.avatar.img) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt="avatar") .avatar-img
img(src=url_for(theme.avatar.img) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt="avatar")
.author-info__name= config.author .author-info__name= config.author
.author-info__description!= theme.aside.card_author.description || config.description .author-info__description!= theme.aside.card_author.description || config.description

View File

@@ -1,5 +1,5 @@
if site.data.widget if site.data.widget && site.data.widget.bottom
each item in site.data.widget each item in site.data.widget.bottom
.card-widget(class=item.class_name id=item.id_name style=item.order ? `order: ${item.order}` : '') .card-widget(class=item.class_name id=item.id_name style=item.order ? `order: ${item.order}` : '')
.item-headline .item-headline
i(class=item.icon) i(class=item.icon)

View File

@@ -1,7 +1,7 @@
if theme.newest_comments.enable if theme.newest_comments.enable
.card-widget#card-newest-comments .card-widget#card-newest-comments
.item-headline .item-headline
i.fas.fa-bolt i.fas.fa-comment-dots
span= _p('aside.card_newest_comments.headline') span= _p('aside.card_newest_comments.headline')
.aside-list .aside-list
span= _p('aside.card_newest_comments.loading_text') span= _p('aside.card_newest_comments.loading_text')

View File

@@ -0,0 +1,8 @@
if site.data.widget && site.data.widget.top
each item in site.data.widget.top
.card-widget(class=item.class_name id=item.id_name)
.item-headline
i(class=item.icon)
span=item.name
.item-content
!=item.html

View File

@@ -7,6 +7,7 @@
else else
!=partial('includes/widget/card_author', {}, {cache: true}) !=partial('includes/widget/card_author', {}, {cache: true})
!=partial('includes/widget/card_announcement', {}, {cache: true}) !=partial('includes/widget/card_announcement', {}, {cache: true})
!=partial('includes/widget/card_top_self', {}, {cache: true})
.sticky_layout .sticky_layout
if showToc if showToc
include ./card_post_toc.pug include ./card_post_toc.pug
@@ -16,6 +17,8 @@
//- page //- page
!=partial('includes/widget/card_author', {}, {cache: true}) !=partial('includes/widget/card_author', {}, {cache: true})
!=partial('includes/widget/card_announcement', {}, {cache: true}) !=partial('includes/widget/card_announcement', {}, {cache: true})
!=partial('includes/widget/card_top_self', {}, {cache: true})
.sticky_layout .sticky_layout
!=partial('includes/widget/card_recent_post', {}, {cache: true}) !=partial('includes/widget/card_recent_post', {}, {cache: true})
!=partial('includes/widget/card_ad', {}, {cache: true}) !=partial('includes/widget/card_ad', {}, {cache: true})
@@ -24,4 +27,4 @@
!=partial('includes/widget/card_tags', {}, {cache: true}) !=partial('includes/widget/card_tags', {}, {cache: true})
!=partial('includes/widget/card_archives', {}, {cache: true}) !=partial('includes/widget/card_archives', {}, {cache: true})
!=partial('includes/widget/card_webinfo', {}, {cache: true}) !=partial('includes/widget/card_webinfo', {}, {cache: true})
!=partial('includes/widget/card_self', {}, {cache: true}) !=partial('includes/widget/card_bottom_self', {}, {cache: true})

View File

@@ -1,6 +1,6 @@
{ {
"name": "hexo-theme-butterfly", "name": "hexo-theme-butterfly",
"version": "3.7.6", "version": "3.8.2",
"description": "A Simple and Card UI Design theme for Hexo", "description": "A Simple and Card UI Design theme for Hexo",
"main": "package.json", "main": "package.json",
"scripts": { "scripts": {
@@ -24,9 +24,9 @@
}, },
"dependencies": { "dependencies": {
"hexo-renderer-stylus": "^2.0.1", "hexo-renderer-stylus": "^2.0.1",
"hexo-renderer-pug": "^1.0.0" "hexo-renderer-pug": "^2.0.0"
}, },
"homepage": "https://butterfly.js.org/", "homepage": "https://butterfly.js.org/",
"author": "Jerry <btf@immyw.com>", "author": "Jerry <i@immyw.com>",
"license": "Apache-2.0" "license": "Apache-2.0"
} }

View File

@@ -6,7 +6,7 @@
'use strict' 'use strict'
hexo.extend.helper.register('inject_head_js', function () { hexo.extend.helper.register('inject_head_js', function () {
const { darkmode, aside, change_font_size } = this.theme const { darkmode, aside, change_font_size, index_img, disable_top_img, pjax} = this.theme
const localStore = ` const localStore = `
win.saveToLocal = { win.saveToLocal = {
@@ -141,5 +141,21 @@ hexo.extend.helper.register('inject_head_js', function () {
` `
} }
return `<script>(win=>{${localStore + getScript + darkmodeJs + asideStatus + changFontAside}})(window)</script>` let detectApple = ''
if (!disable_top_img || index_img !== false) {
detectApple = `
const detectApple = () => {
if (GLOBAL_CONFIG_SITE.isHome && /iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){
document.documentElement.classList.add('apple')
}
}
detectApple()
`
if (pjax.enable) {
detectApple += 'document.addEventListener(\'pjax:complete\', detectApple)'
}
}
return `<script>(win=>{${localStore + getScript + darkmodeJs + asideStatus + changFontAside + detectApple}})(window)</script>`
}) })

View File

@@ -70,3 +70,22 @@ hexo.extend.helper.register('injectHtml', function (data) {
} }
return result return result
}) })
hexo.extend.helper.register('findArchivesTitle', function (menu) {
const defaultTitle = this._p('page.archives')
if (!menu) return defaultTitle
const loop = (m) => {
for (const key in m) {
if (typeof m[key] === 'object') {
loop(m[key])
}
if (/\/archives\//.test(m[key])) {
return key
}
}
}
return loop(menu) || defaultTitle
})

View File

@@ -19,7 +19,7 @@
--btn-hover-color: $button-hover-color --btn-hover-color: $button-hover-color
--btn-color: $button-color --btn-color: $button-color
--btn-bg: $button-bg --btn-bg: $button-bg
--text-bg-hover: $text-bg-hover --text-bg-hover: rgba($text-bg-hover, .7)
--light-grey: $light-grey --light-grey: $light-grey
--white: $white --white: $white
--text-highlight-color: $text-highlight-color --text-highlight-color: $text-highlight-color

View File

@@ -110,7 +110,7 @@ blockquote
color: var(--hltools-color) color: var(--hltools-color)
font-size: $code-font-size font-size: $code-font-size
&.closed + table &.closed ~ *
display: none display: none
.expand .expand

View File

@@ -1,82 +0,0 @@
if hexo-config('error_404.enable')
#error-wrap
position: absolute
top: 50%
right: 0
left: 0
margin: 0 auto
padding: 0 1rem
max-width: 1000px
transform: translate(0, -50%)
.error-content
display: flex
flex-direction: row
justify-content: center
align-items: center
margin: 0 1rem
height: 18rem
border-radius: 8px
background: var(--card-bg)
box-shadow: var(--card-box-shadow)
transition: all .3s
&:hover
box-shadow: var(--card-hover-box-shadow)
+maxWidth768()
flex-direction: column
margin: 0
height: 25rem
.error-img
flex: 1
height: 100%
border-top-left-radius: 8px
border-bottom-left-radius: 8px
background-color: $theme-color
background-position: center
background-size: cover
+maxWidth768()
flex: 1
width: 100%
border-top-right-radius: 8px
border-bottom-left-radius: 0
.error-info
flex: 1
padding: .5rem
text-align: center
font-size: 14px
if $site-name-font
font-family: $site-name-font
+maxWidth768()
flex: 1.1
width: 100%
.error_title
margin-top: -4rem
font-size: 9em
+maxWidth768()
margin-top: -3rem
.error_subtitle
@extend .limit-more-line
margin-top: -3.5rem
word-break: break-word
font-size: 1.6em
-webkit-line-clamp: 2
a
display: inline-block
margin-top: .5rem
padding: .3rem 1.5rem
background: var(--btn-bg)
color: var(--btn-color)
i
padding-right: .3rem

View File

@@ -35,15 +35,6 @@
display: none display: none
.card-info .card-info
img
width: 110px
height: 110px
border-radius: 70px
transition: all .5s
&:hover
transform: rotate(360deg)
.author-info .author-info
&__name &__name
font-weight: 500 font-weight: 500
@@ -103,7 +94,7 @@
font-size: 1.2em font-size: 1.2em
span span
margin-left: .5rem margin-left: .3rem
.sticky_layout .sticky_layout
+minWidth900() +minWidth900()
@@ -331,6 +322,21 @@
&:hover &:hover
animation: more-btn-move 1s infinite animation: more-btn-move 1s infinite
.avatar-img
overflow: hidden
margin: 0 auto
width: 110px
height: 110px
border-radius: 70px
img
height: 100%
transition: all .5s
object-fit: cover
&:hover
transform: rotate(360deg)
@keyframes more-btn-move @keyframes more-btn-move
0%, 0%,
100% 100%

View File

@@ -157,11 +157,8 @@
top: 70px top: 70px
transition: top .5s transition: top .5s
// css hack .apple
// all browser in ios and safari in all apple device #page-header.full_page
_::-webkit-full-page-media,
_:future,
:root #page-header.full_page
background-attachment: scroll !important background-attachment: scroll !important
#page #page

View File

@@ -22,22 +22,12 @@
&.open &.open
transform: translate3d(-100%, 0, 0) transform: translate3d(-100%, 0, 0)
& > .author-avatar & > .avatar-img
padding: 1.3rem 1.5rem 0 margin: 1rem auto
text-align: center
img
width: 110px
height: 110px
border-radius: 70px
transition: all .5s
&:hover
transform: rotate(360deg)
.site-data .site-data
display: table display: table
padding: .6rem .5rem 0 padding: 0 .5rem
width: 100% width: 100%
table-layout: fixed table-layout: fixed
@@ -65,25 +55,21 @@
@extend .limit-one-line @extend .limit-one-line
position: relative position: relative
display: block display: block
padding: .3rem 1.5rem padding: .3rem 1.5rem .3rem 1.1rem
color: var(--font-color) color: var(--font-color)
font-size: 1.15em font-size: 1.15em
cursor: pointer
i:first-child
width: 25%
text-align: left
span
width: 75%
&:hover &:hover
color: $light-blue background: var(--text-bg-hover)
i:first-child
width: 15%
text-align: left
.expand .expand
position: absolute position: absolute
top: .78em top: .78em
right: .4rem right: .9rem
transition: transform .3s transition: transform .3s
&.hide &.hide

View File

@@ -1,5 +1,4 @@
#vcomment, #vcomment
#waline
font-size: 1.1em font-size: 1.1em
.vbtn .vbtn
@@ -21,6 +20,18 @@
&:after &:after
z-index: 22 z-index: 22
#waline-wrap
--waline-font-size: 1.1em
--waline-theme-color: $button-bg
--waline-active-color: $button-hover-color
--waline-avatar-size: 2.75rem
.vuser
transition: all .5s
&:hover
transform: rotate(360deg)
if hexo-config('valine.bg') if hexo-config('valine.bg')
#vcomment #vcomment
textarea textarea
@@ -79,15 +90,11 @@ if hexo-config('waline.bg')
display: none display: none
// mathjax // mathjax
.mathjax-overflow mjx-container[display],
.has-jax
overflow-x: auto overflow-x: auto
overflow-y: hidden overflow-y: hidden
mjx-container[jax='CHTML'][display='true']
overflow-x: auto
overflow-y: hidden
padding-bottom: .3rem
.aplayer .aplayer
color: $font-black color: $font-black

86
source/css/_page/404.styl Normal file
View File

@@ -0,0 +1,86 @@
if hexo-config('error_404.enable')
.error404
#error-wrap
position: absolute
top: 50%
right: 0
left: 0
margin: 0 auto
padding: 0 1rem
max-width: 1000px
transform: translate(0, -50%)
.error-content
display: flex
flex-direction: row
justify-content: center
align-items: center
margin: 0 1rem
height: 18rem
border-radius: 8px
background: var(--card-bg)
box-shadow: var(--card-box-shadow)
transition: all .3s
&:hover
box-shadow: var(--card-hover-box-shadow)
+maxWidth768()
flex-direction: column
margin: 0
height: 25rem
.error-img
flex: 1
height: 100%
border-top-left-radius: 8px
border-bottom-left-radius: 8px
background-color: $theme-color
background-position: center
background-size: cover
+maxWidth768()
flex: 1
width: 100%
border-top-right-radius: 8px
border-bottom-left-radius: 0
.error-info
flex: 1
padding: .5rem
text-align: center
font-size: 14px
if $site-name-font
font-family: $site-name-font
+maxWidth768()
flex: 1.1
width: 100%
.error_title
margin-top: -4rem
font-size: 9em
+maxWidth768()
margin-top: -3rem
.error_subtitle
@extend .limit-more-line
margin-top: -3.5rem
word-break: break-word
font-size: 1.6em
-webkit-line-clamp: 2
a
display: inline-block
margin-top: .5rem
padding: .3rem 1.5rem
background: var(--btn-bg)
color: var(--btn-color)
i
padding-right: .3rem
& + #rightside
display: none

View File

@@ -1,8 +1,15 @@
#body-wrap
display: flex
flex-direction: column
min-height: 100vh
.layout .layout
display: flex display: flex
flex: 1 auto
margin: 0 auto margin: 0 auto
padding: 2rem 15px padding: 2rem 15px
max-width: 1200px max-width: 1200px
width: 100%
+maxWidth900() +maxWidth900()
flex-direction: column flex-direction: column

View File

@@ -50,12 +50,17 @@
color: var(--font-color) color: var(--font-color)
text-decoration: none text-decoration: none
img .flink-item-icon
float: left float: left
overflow: hidden
margin: 15px 10px margin: 15px 10px
width: 60px width: 60px
height: 60px height: 60px
border-radius: 35px border-radius: 35px
img
width: 100%
height: 100%
transition: all .3s transition: all .3s
.img-alt .img-alt
@@ -63,7 +68,6 @@
.flink-item-name .flink-item-name
@extend .limit-one-line @extend .limit-one-line
display: block
padding: 16px 10px 0 0 padding: 16px 10px 0 0
height: 40px height: 40px
font-weight: bold font-weight: bold
@@ -71,7 +75,6 @@
.flink-item-desc .flink-item-desc
@extend .limit-one-line @extend .limit-one-line
display: block
padding: 16px 10px 16px 0 padding: 16px 10px 16px 0
height: 50px height: 50px
font-size: .93em font-size: .93em

View File

@@ -1,7 +1,5 @@
#algolia-search #algolia-search
.search-dialog .search-dialog
animation: titlescale .5s
.ais-search-box .ais-search-box
margin: 0 auto margin: 0 auto
max-width: 100% max-width: 100%

View File

@@ -7,7 +7,9 @@
margin-left: -15rem margin-left: -15rem
padding: 1rem padding: 1rem
width: 30rem width: 30rem
border-radius: 8px
background: var(--search-bg) background: var(--search-bg)
animation: titlescale .5s
+maxWidth768() +maxWidth768()
top: 0 top: 0
@@ -15,6 +17,7 @@
margin: 0 margin: 0
width: 100% width: 100%
height: 100% height: 100%
border-radius: 0
hr hr
margin: 1rem auto margin: 1rem auto

View File

@@ -1,7 +1,5 @@
#local-search #local-search
.search-dialog .search-dialog
animation: titlescale .5s
.local-search-box .local-search-box
margin: 0 auto margin: 0 auto
max-width: 100% max-width: 100%

View File

@@ -194,7 +194,7 @@ document.addEventListener('DOMContentLoaded', function () {
$figureHighlight.forEach(function (item) { $figureHighlight.forEach(function (item) {
const langName = item.getAttribute('data-language') ? item.getAttribute('data-language') : 'Code' const langName = item.getAttribute('data-language') ? item.getAttribute('data-language') : 'Code'
const highlightLangEle = `<div class="code-lang">${langName}</div>` const highlightLangEle = `<div class="code-lang">${langName}</div>`
btf.wrap(item, 'figure', '', 'highlight') btf.wrap(item, 'figure', { class: 'highlight' })
createEle(highlightLangEle, item) createEle(highlightLangEle, item)
}) })
} else { } else {
@@ -208,7 +208,7 @@ document.addEventListener('DOMContentLoaded', function () {
} else { } else {
if (isPrismjs) { if (isPrismjs) {
$figureHighlight.forEach(function (item) { $figureHighlight.forEach(function (item) {
btf.wrap(item, 'figure', '', 'highlight') btf.wrap(item, 'figure', { class: 'highlight' })
createEle('', item) createEle('', item)
}) })
} else { } else {
@@ -294,7 +294,7 @@ document.addEventListener('DOMContentLoaded', function () {
} }
const addMediumZoom = () => { const addMediumZoom = () => {
const zoom = mediumZoom(document.querySelectorAll('#article-container :not(a)>img')) const zoom = mediumZoom(document.querySelectorAll('#article-container :not(a):not(.flink-item-icon) > img'))
zoom.on('open', e => { zoom.on('open', e => {
const photoBg = document.documentElement.getAttribute('data-theme') === 'dark' ? '#121212' : '#fff' const photoBg = document.documentElement.getAttribute('data-theme') === 'dark' ? '#121212' : '#fff'
zoom.update({ zoom.update({
@@ -305,7 +305,7 @@ document.addEventListener('DOMContentLoaded', function () {
const jqLoadAndRun = () => { const jqLoadAndRun = () => {
const $fancyboxEle = GLOBAL_CONFIG.lightbox === 'fancybox' const $fancyboxEle = GLOBAL_CONFIG.lightbox === 'fancybox'
? document.querySelectorAll('#article-container :not(a):not(.gallery-group) > img, #article-container > img') ? document.querySelectorAll('#article-container :not(a):not(.gallery-group):not(.flink-item-icon) > img, #article-container > img')
: [] : []
const fbLengthNoZero = $fancyboxEle.length > 0 const fbLengthNoZero = $fancyboxEle.length > 0
const $jgEle = document.querySelectorAll('#article-container .justified-gallery') const $jgEle = document.querySelectorAll('#article-container .justified-gallery')
@@ -332,12 +332,21 @@ document.addEventListener('DOMContentLoaded', function () {
return return
} }
// find the scroll direction
function scrollDirection (currentTop) {
const result = currentTop > initTop // true is down & false is up
initTop = currentTop
return result
}
let initTop = 0 let initTop = 0
let isChatShow = true let isChatShow = true
const $header = document.getElementById('page-header') const $header = document.getElementById('page-header')
const isChatBtnHide = typeof chatBtnHide === 'function' const isChatBtnHide = typeof chatBtnHide === 'function'
const isChatBtnShow = typeof chatBtnShow === 'function' const isChatBtnShow = typeof chatBtnShow === 'function'
window.addEventListener('scroll', btf.throttle(function (e) {
window.scrollCollect = () => {
return btf.throttle(function (e) {
const currentTop = window.scrollY || document.documentElement.scrollTop const currentTop = window.scrollY || document.documentElement.scrollTop
const isDown = scrollDirection(currentTop) const isDown = scrollDirection(currentTop)
if (currentTop > 56) { if (currentTop > 56) {
@@ -368,14 +377,10 @@ document.addEventListener('DOMContentLoaded', function () {
if (document.body.scrollHeight <= innerHeight) { if (document.body.scrollHeight <= innerHeight) {
$rightside.style.cssText = 'opacity: 1; transform: translateX(-38px)' $rightside.style.cssText = 'opacity: 1; transform: translateX(-38px)'
} }
}, 200)) }, 200)()
// find the scroll direction
function scrollDirection (currentTop) {
const result = currentTop > initTop // true is down & false is up
initTop = currentTop
return result
} }
window.addEventListener('scroll', scrollCollect)
} }
/** /**
@@ -687,7 +692,7 @@ document.addEventListener('DOMContentLoaded', function () {
const $table = document.querySelectorAll('#article-container :not(.highlight) > table, #article-container > table') const $table = document.querySelectorAll('#article-container :not(.highlight) > table, #article-container > table')
if ($table.length) { if ($table.length) {
$table.forEach(item => { $table.forEach(item => {
btf.wrap(item, 'div', '', 'table-wrap') btf.wrap(item, 'div', { class: 'table-wrap' })
}) })
} }
} }

View File

@@ -207,18 +207,18 @@ const btf = {
* *
* @param {*} selector * @param {*} selector
* @param {*} eleType the type of create element * @param {*} eleType the type of create element
* @param {*} id id * @param {*} options object key: value
* @param {*} cn class name
*/ */
wrap: function (selector, eleType, id = '', cn = '') { wrap: (selector, eleType, options) => {
const creatEle = document.createElement(eleType) const creatEle = document.createElement(eleType)
if (id) creatEle.id = id for (const [key, value] of Object.entries(options)) {
if (cn) creatEle.className = cn creatEle.setAttribute(key, value)
}
selector.parentNode.insertBefore(creatEle, selector) selector.parentNode.insertBefore(creatEle, selector)
creatEle.appendChild(selector) creatEle.appendChild(selector)
}, },
unwrap: function (el) { unwrap: el => {
const elParentNode = el.parentNode const elParentNode = el.parentNode
if (elParentNode !== document.body) { if (elParentNode !== document.body) {
elParentNode.parentNode.insertBefore(el, elParentNode) elParentNode.parentNode.insertBefore(el, elParentNode)
@@ -226,7 +226,7 @@ const btf = {
} }
}, },
isJqueryLoad: (fn) => { isJqueryLoad: fn => {
if (typeof jQuery === 'undefined') { if (typeof jQuery === 'undefined') {
getScript(GLOBAL_CONFIG.source.jQuery).then(fn) getScript(GLOBAL_CONFIG.source.jQuery).then(fn)
} else { } else {
@@ -234,9 +234,9 @@ const btf = {
} }
}, },
isHidden: (ele) => ele.offsetHeight === 0 && ele.offsetWidth === 0, isHidden: ele => ele.offsetHeight === 0 && ele.offsetWidth === 0,
getEleTop: (ele) => { getEleTop: ele => {
let actualTop = ele.offsetTop let actualTop = ele.offsetTop
let current = ele.offsetParent let current = ele.offsetParent