hexo-theme-solitude 1.6.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +1 -1
  2. package/README_zh-cn.md +1 -1
  3. package/README_zh-tw.md +1 -1
  4. package/SECURITY.md +5 -5
  5. package/_config.yml +30 -15
  6. package/languages/en.yml +15 -1
  7. package/languages/zh-CN.yml +21 -1
  8. package/languages/zh-TW.yml +21 -1
  9. package/layout/category.pug +1 -1
  10. package/layout/includes/console.pug +8 -7
  11. package/layout/includes/head/config.pug +66 -40
  12. package/layout/includes/inject/body.pug +7 -3
  13. package/layout/includes/inject/head.pug +35 -1
  14. package/layout/includes/widgets/post/postMeta.pug +7 -0
  15. package/layout/includes/widgets/third-party/comments/comment.pug +5 -7
  16. package/layout/includes/widgets/third-party/comments/valine.pug +44 -0
  17. package/layout/includes/widgets/third-party/comments/waline.pug +40 -12
  18. package/layout/includes/widgets/third-party/news-comment/newest-comment.pug +5 -3
  19. package/layout/includes/widgets/third-party/news-comment/twikoo.pug +12 -10
  20. package/layout/includes/widgets/third-party/news-comment/valine.pug +79 -0
  21. package/layout/includes/widgets/third-party/news-comment/waline.pug +25 -20
  22. package/layout/page.pug +3 -0
  23. package/layout/tag.pug +1 -1
  24. package/package.json +1 -1
  25. package/plugins.yml +15 -3
  26. package/scripts/event/cdn.js +7 -2
  27. package/scripts/event/init.js +4 -2
  28. package/scripts/event/merge_config.js +6 -5
  29. package/scripts/helper/related_post.js +2 -2
  30. package/scripts/tags/tabs.js +1 -1
  31. package/source/css/_comments/{index.styl → comment.styl} +4 -24
  32. package/source/css/_comments/valine.styl +245 -0
  33. package/source/css/_global/index.styl +3 -0
  34. package/source/css/_highlight/highlight/index.styl +1 -1
  35. package/source/css/_page/index.styl +1 -4
  36. package/source/css/_post/content.styl +13 -7
  37. package/source/css/index.styl +1 -3
  38. package/source/js/commentBarrage/twikoo.js +4 -4
  39. package/source/js/commentBarrage/valine.js +156 -0
  40. package/source/js/commentBarrage/waline.js +3 -3
  41. package/source/js/main.js +28 -33
  42. package/source/js/third_party/efu_ai.min.js +6 -0
  43. package/source/js/utils.js +14 -1
  44. package/source/css/_comments/waline.styl +0 -455
  45. package/source/js/third_party/sco-ai.min.js +0 -8
@@ -15,12 +15,12 @@ script.
15
15
  return content.length > 150 ? content.substring(0, 150) + '...' : content;
16
16
  }
17
17
 
18
- const getComment = () => {
19
- const $dom = document.querySelector('#card-newest-comments .aside-list')
18
+ const $asideList = document.querySelector('#card-newest-comments .aside-list')
20
19
 
20
+ const getComment = () => {
21
21
  const runTwikoo = () => {
22
22
  twikoo.getRecentComments({
23
- envId: GLOBAL_CONFIG.comment.twikoo.url,
23
+ envId: GLOBAL_CONFIG.comment.url,
24
24
  region: '',
25
25
  pageSize: 6,
26
26
  includeReply: true
@@ -32,18 +32,18 @@ script.
32
32
  'url': `${e.url}#${e.id}`,
33
33
  'date': new Date(e.created).toISOString()
34
34
  }))
35
+ saveToLocal.set('twikoo-newest-comment', JSON.stringify(twikooArray), !{theme.comment.newest_comment.storage}/(60*24))
35
36
  generateHtml(twikooArray)
36
37
  }).catch(function (err) {
37
38
  console.error(err)
38
- $dom.innerHTML = "无法获取评论,请确认相关配置是否正确"
39
+ $asideList.textContent = "!{_p('newest_comment.error')}"
39
40
  })
40
41
  }
41
42
  runTwikoo()
42
43
  }
43
44
 
44
45
  const generateHtml = array => {
45
- const $dom = document.querySelector('#card-newest-comments .aside-list')
46
- $dom.innerHTML = array.length ? array.map(item => `
46
+ $asideList.innerHTML = array.length ? array.map(item => `
47
47
  <div class='aside-list-item'>
48
48
  <a onclick='pjax.loadUrl("${item.url}")' class='thumbnail'>
49
49
  <img src='${item.avatar}' alt='${item.nick}'>
@@ -54,15 +54,17 @@ script.
54
54
  <time class="datetime" datetime="${item.date}"></time>
55
55
  </div>
56
56
  </div>
57
- `).join('') : '没有评论'
57
+ `).join('') : "!{_p('newest_comment.zero')}"
58
58
  window.lazyLoadInstance && window.lazyLoadInstance.update()
59
- window.pjax && window.pjax.refresh($dom)
59
+ window.pjax && window.pjax.refresh()
60
60
  utils && utils.changeTimeFormat()
61
61
  }
62
62
 
63
63
  const newestCommentInit = () => {
64
- const $asideList = document.querySelector('#card-newest-comments .aside-list')
65
- if ($asideList) {
64
+ const data = saveToLocal.get('twikoo-newest-comment')
65
+ if (data) {
66
+ generateHtml(JSON.parse(data))
67
+ } else {
66
68
  getComment()
67
69
  }
68
70
  }
@@ -0,0 +1,79 @@
1
+ script.
2
+ window.addEventListener('load', () => {
3
+ const changeContent = (content) => {
4
+ if (content === '') return content;
5
+
6
+ const replacements = [
7
+ {regex: /<img.*?src="(.*?)"?[^\>]+>/ig, replacement: '[Image]'},
8
+ {regex: /<a[^>]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, replacement: '[URL]'},
9
+ {regex: /```[\s\S]*?```/g, replacement: '[Code]'},
10
+ {regex: /<[^>]+>/g, replacement: ""}
11
+ ];
12
+
13
+ content = replacements.reduce((str, {regex, replacement}) => str.replace(regex, replacement), content);
14
+
15
+ return content.length > 150 ? content.substring(0, 150) + '...' : content;
16
+ }
17
+
18
+ const $asideList = document.querySelector('#card-newest-comments .aside-list')
19
+ const newestCommentInit = () => {
20
+ const data = saveToLocal.get('valine-newest-comment')
21
+ if (data) {
22
+ generateHtml(JSON.parse(data))
23
+ } else {
24
+ getComment()
25
+ }
26
+ }
27
+
28
+ const getComment = async () => {
29
+ try {
30
+ const settings = {
31
+ "method": "GET",
32
+ "headers": {
33
+ "X-LC-Id": '!{theme.comment.valine.appId}',
34
+ "X-LC-Key": '!{theme.comment.valine.appKey}',
35
+ "Content-Type": "application/json"
36
+ },
37
+ }
38
+
39
+ const res = await fetch('!{theme.comment.valine.serverURLs}/1.1/classes/Comment?limit=8&order=-createdAt', settings)
40
+ const result = await res.json()
41
+ window.res = result
42
+ const valineArray = result.results.map(e => {
43
+ return {
44
+ 'content': changeContent(e.comment),
45
+ 'avatar': '!{theme.comment.avatar}' + '/avatar/' + md5(e.mail.toLowerCase()),
46
+ 'nick': e.nick,
47
+ 'url': e.url + '#' + e.objectId,
48
+ 'date': e.updatedAt || e.createdAt
49
+ }
50
+ })
51
+ saveToLocal.set('valine-newest-comment', JSON.stringify(valineArray), !{theme.comment.newest_comment.storage} / (60 * 24))
52
+ generateHtml(valineArray)
53
+ } catch (err) {
54
+ console.error(err)
55
+ $asideList.textContent = "!{_p('newest_comment.error')}"
56
+ }
57
+ }
58
+
59
+ const generateHtml = array => {
60
+ const $dom = document.querySelector('#card-newest-comments .aside-list')
61
+ $dom.innerHTML = array.length ? array.map(item => `
62
+ <div class='aside-list-item'>
63
+ <a onclick='pjax.loadUrl("${item.url}")' class='thumbnail'>
64
+ <img src='${item.avatar}' alt='${item.nick}'>
65
+ <div class='name'><span>${item.nick}</span></div>
66
+ </a>
67
+ <div class='content'>
68
+ <a class='comment' onclick='pjax.loadUrl("${item.url}")'>${item.content}</a>
69
+ <time class="datetime" datetime="${item.date}"></time>
70
+ </div>
71
+ </div>
72
+ `).join('') : "!{_p('newest_comment.zero')}"
73
+ window.lazyLoadInstance && window.lazyLoadInstance.update()
74
+ window.pjax && window.pjax.refresh()
75
+ utils && utils.changeTimeFormat()
76
+ }
77
+
78
+ newestCommentInit()
79
+ })
@@ -17,28 +17,33 @@ script.
17
17
 
18
18
  const $asideList = document.querySelector('#card-newest-comments .aside-list')
19
19
  const newestCommentInit = () => {
20
- if ($asideList) {
20
+ const data = saveToLocal.get('waline-newest-comment')
21
+ if (data) {
22
+ generateHtml(JSON.parse(data))
23
+ } else {
21
24
  getComment()
22
25
  }
23
26
  }
24
- const getComment = () => {
25
- Waline.RecentComments(
26
- options = {
27
- serverURL: GLOBAL_CONFIG.comment.waline.url,
28
- count: 6,
29
- }
30
- ).then(function (res) {
31
- const walineArray = res.comments.map(item => ({
32
- 'content': changeContent(item.comment),
33
- 'avatar': item.avatar,
34
- 'nick': item.nick,
35
- 'url': `${item.url}#${item.objectId}`,
36
- 'date': new Date(item.insertedAt).toISOString()
37
- }))
27
+
28
+ const getComment = async () => {
29
+ try {
30
+ const res = await fetch('!{theme.comment.waline.envId}/api/comment?type=recent&count=8', {method: 'GET'})
31
+ const result = await res.json()
32
+ const walineArray = result.data.map(e => {
33
+ return {
34
+ 'content': changeContent(e.comment),
35
+ 'avatar': e.avatar,
36
+ 'nick': e.nick,
37
+ 'url': e.url + '#' + e.objectId,
38
+ 'date': e.time || e.insertedAt
39
+ }
40
+ })
41
+ saveToLocal.set('waline-newest-comment', JSON.stringify(walineArray), !{theme.comment.newest_comment.storage} / (60 * 24))
38
42
  generateHtml(walineArray)
39
- }).catch(
40
- $asideList.innerHTML = "无法获取评论,请确认相关配置是否正确"
41
- )
43
+ } catch (err) {
44
+ console.error(err)
45
+ $asideList.textContent = "!{_p('newest_comment.error')}"
46
+ }
42
47
  }
43
48
 
44
49
  const generateHtml = array => {
@@ -54,9 +59,9 @@ script.
54
59
  <time class="datetime" datetime="${item.date}"></time>
55
60
  </div>
56
61
  </div>
57
- `).join('') : '没有评论'
62
+ `).join('') : "!{_p('newest_comment.zero')}"
58
63
  window.lazyLoadInstance && window.lazyLoadInstance.update()
59
- window.pjax && window.pjax.refresh($dom)
64
+ window.pjax && window.pjax.refresh()
60
65
  utils && utils.changeTimeFormat()
61
66
  }
62
67
 
package/layout/page.pug CHANGED
@@ -25,6 +25,9 @@ block content
25
25
  != page.content
26
26
  when 'music'
27
27
  include includes/page/music
28
+ when 'banner'
29
+ include includes/widgets/page/banner
30
+ include includes/page/default
28
31
  default
29
32
  include includes/page/default
30
33
  if page.comment
package/layout/tag.pug CHANGED
@@ -10,7 +10,7 @@ block content
10
10
  | #{tag.name}
11
11
  span.tagsPageCount #{tag.length}
12
12
  .recent-posts#recent-posts
13
- each post in page.posts.find({ parent: { $exists: false } }).data
13
+ each post,index in page.posts.find({ parent: { $exists: false } }).data
14
14
  include includes/widgets/home/postList
15
15
  include includes/mixins/pagination
16
16
  include includes/widgets/aside/aside
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hexo-theme-solitude",
3
- "version": "1.6.1",
3
+ "version": "1.7.0",
4
4
  "description": "A beautiful, powerful, and efficient Hexo theme developed by the wleelw",
5
5
  "main": "package.json",
6
6
  "scripts": {
package/plugins.yml CHANGED
@@ -15,10 +15,18 @@ twikoo:
15
15
  file: dist/twikoo.all.min.js
16
16
  version: 1.6.31
17
17
  waline_js:
18
- name: '@waline/client'
18
+ name: 'waline'
19
19
  file: dist/waline.js
20
20
  other_name: waline
21
- version: 2.15.8
21
+ version: 3.1.3
22
+ waline_css:
23
+ name: 'waline'
24
+ file: dist/waline.css
25
+ version: 3.1.3
26
+ valine:
27
+ name: valine
28
+ file: dist/Valine.min.js
29
+ version: 1.5.1
22
30
  sharejs:
23
31
  name: butterfly-extsrc
24
32
  file: sharejs/dist/js/social-share.min.js
@@ -97,4 +105,8 @@ fancyapps_css:
97
105
  mermaid_js:
98
106
  name: mermaid
99
107
  file: dist/mermaid.min.js
100
- version: 10.8.0
108
+ version: 10.8.0
109
+ blueimp_md5:
110
+ name: blueimp-md5
111
+ file: js/md5.min.js
112
+ version: 2.19.0
@@ -54,9 +54,9 @@ hexo.extend.filter.register('before_generate', () => {
54
54
  file: 'js/tw_cn.js',
55
55
  version
56
56
  },
57
- sco_ai_js: {
57
+ efu_ai: {
58
58
  name: 'hexo-theme-solitude',
59
- file: 'js/third_party/sco-ai.min.js',
59
+ file: 'js/third_party/efu_ai.min.js',
60
60
  version
61
61
  },
62
62
  twikoo_commentBarrage: {
@@ -69,6 +69,11 @@ hexo.extend.filter.register('before_generate', () => {
69
69
  file: 'js/commentBarrage/waline.js',
70
70
  version
71
71
  },
72
+ valine_commentBarrage: {
73
+ name: 'hexo-theme-solitude',
74
+ file: 'js/commentBarrage/valine.js',
75
+ version
76
+ },
72
77
  waterfall: {
73
78
  name: 'hexo-theme-solitude',
74
79
  file: 'js/third_party/waterfall.min.js',
@@ -5,13 +5,15 @@ hexo.extend.filter.register('before_generate', () => {
5
5
  const logger = hexo.log;
6
6
  const config = hexo.config;
7
7
 
8
- if (hexoVer < 6.3) {
9
- logger.error('请把 Hexo 升级到 V6.3.0 或更高的版本!');
8
+ if (hexoVer < 7.0) {
9
+ logger.error('请把 Hexo 升级到 V7.0.0 或更高的版本!');
10
+ logger.error('Please upgrade your Hexo to V7.0.0 or higher!');
10
11
  process.exit(-1);
11
12
  }
12
13
 
13
14
  if (Number(majorVer) < 14) {
14
15
  logger.error('请将 Node.js 升级到 v14.0.0 或更高的版本!');
16
+ logger.error('Please upgrade Node.js to v14.0.0 or later!');
15
17
  process.exit(-1);
16
18
  }
17
19
  });
@@ -129,7 +129,8 @@ hexo.extend.filter.register('before_generate', () => {
129
129
  randompostjs: 'https://cdn.cbd.int/st-source/js/moment/random_post.min.js'
130
130
  }, keyboard: {
131
131
  enable: false, list: []
132
- }, lazyload: {
132
+ }
133
+ ,lazyload: {
133
134
  enable: false, field: 'site', placeholder: '/img/loading.gif', errorimg: '/img/error_load.png'
134
135
  }, loading: {
135
136
  fullpage: false, pace: true,
@@ -150,7 +151,7 @@ hexo.extend.filter.register('before_generate', () => {
150
151
  enable: true,
151
152
  copyright: {
152
153
  enable: false,
153
- limit_count: 50
154
+ limit: 50
154
155
  }
155
156
  }
156
157
  , post_ai: {
@@ -164,7 +165,7 @@ hexo.extend.filter.register('before_generate', () => {
164
165
  enable: false, per_page: false, copytex: false,
165
166
  }, comment: {
166
167
  enable: false,
167
- type: 'twikoo',
168
+ type: '',
168
169
  commentBarrage: false,
169
170
  newComment: false,
170
171
  randomInfoStart: [`baby's`, `little`, `my`,],
@@ -180,8 +181,8 @@ hexo.extend.filter.register('before_generate', () => {
180
181
  font: {
181
182
  'font-size': '16px',
182
183
  'code-font-size': '16px',
183
- 'font-family': '"PingFang SC","Hiragino Sans GB","Microsoft YaHei"',
184
- 'code-font-family': '"monospace", "monospace"',
184
+ 'font-family': 'PingFang SC, Hiragino Sans GB,Microsoft YaHei',
185
+ 'code-font-family': 'monospace, monospace',
185
186
  },
186
187
  extends: {
187
188
  head: [], body: [],
@@ -5,7 +5,7 @@ hexo.extend.helper.register('related_posts', function (currentPost, allPosts) {
5
5
  const config = hexo.theme.config
6
6
  const limitNum = config.related_post.limit || 6
7
7
  const dateType = config.related_post.date_type || 'created'
8
- const headlineLang = this._p('喜欢这篇的人也看了')
8
+ const headlineLang = this._p('star')
9
9
 
10
10
  currentPost.tags.forEach(function (tag) {
11
11
  allPosts.forEach(function (post) {
@@ -36,7 +36,7 @@ hexo.extend.helper.register('related_posts', function (currentPost, allPosts) {
36
36
  relatedPosts.sort(compare('weight', dateType))
37
37
 
38
38
  let result = '<div class="relatedPosts">'
39
- result += `<div class="headline"><i class="solitude st-star-smile-fill"></i><span>${headlineLang}</span><div class="relatedPosts-link"><a onclick="event.preventDefault(); toRandomPost();" href="javascript:void(0);" rel="external nofollow" data-pjax-state="">随便逛逛</a></div></div>`
39
+ result += `<div class="headline"><i class="solitude st-star-smile-fill"></i><span>${headlineLang}</span><div class="relatedPosts-link"><a onclick="event.preventDefault(); toRandomPost();" href="javascript:void(0);" rel="external nofollow" data-pjax-state="">${this._p('random')}</a></div></div>`
40
40
  result += '<div class="relatedPosts-list">'
41
41
 
42
42
  for (let i = 0; i < Math.min(relatedPosts.length, limitNum); i++) {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Tabs
3
- * from butterfly
3
+ * from solitude
4
4
  */
5
5
 
6
6
  'use strict'
@@ -72,21 +72,6 @@ div#post-comment
72
72
  a:hover
73
73
  color var(--efu-main)
74
74
 
75
- .comment-tips
76
- background-color rgba(103, 194, 58, 0.13)
77
- border var(--style-border-always)
78
- border-color var(--efu-green)
79
- color var(--efu-green)
80
- border-radius 8px
81
- padding 8px 12px
82
- margin-top 0.5rem
83
- display none
84
- width 100%
85
-
86
- &.show
87
- display flex
88
- font-weight 700
89
-
90
75
  blockquote
91
76
  background var(--efu-secondbg)
92
77
  border var(--style-border)
@@ -104,14 +89,6 @@ div#post-comment
104
89
  flex-wrap wrap
105
90
  position relative
106
91
 
107
- .comment-randomInfo
108
- margin-left auto
109
- font-size 13px
110
-
111
- &:hover
112
- a
113
- color var(--efu-theme)
114
-
115
92
  #owo-big
116
93
  position fixed
117
94
  align-items center
@@ -123,4 +100,7 @@ div#post-comment
123
100
  transform translate(0, -105%)
124
101
  overflow hidden
125
102
  animation owoIn .3s cubic-bezier(.42,0,.3,1.11)
126
- padding 1rem
103
+ padding 1rem
104
+
105
+ @import 'twikoo.styl' when hexo-config('comment.type') == 'twikoo'
106
+ @import 'valine.styl' when hexo-config('comment.type') == 'valine'
@@ -0,0 +1,245 @@
1
+ #comment
2
+ .vcount
3
+ display none !important
4
+
5
+ .vpreview-btn
6
+ display none
7
+
8
+ .vemoji-btn
9
+ position absolute
10
+ bottom 4.5px
11
+ left 50px
12
+
13
+ .vpanel
14
+ display flex
15
+ flex-direction column
16
+ position relative
17
+
18
+ .vemojis
19
+ display: none;
20
+ position: absolute;
21
+ left: 0;
22
+ right: 0;
23
+ max-width: 500px;
24
+ color: #4a4a4a;
25
+ border: 1px solid rgba(144, 147, 153, 0.31);
26
+ top: 6.7rem
27
+ z-index: 1000;
28
+ animation: .3s ease .1s 1 normal both running donate_effcet
29
+ width: 500px;
30
+ border: var(--style-border-always)
31
+ border-radius: 8px !important;
32
+ overflow: hidden;
33
+ background-color: var(--efu-maskbg)
34
+ backdrop-filter: saturate(180%) blur(10px);
35
+ transform: translateZ(0);
36
+ overflow-y: auto;
37
+ padding: 10px;
38
+
39
+ .vwrap
40
+ flex 1
41
+ display flex
42
+ border none !important
43
+ padding 0
44
+ overflow: inherit;
45
+ flex-direction column-reverse
46
+
47
+ .vheader
48
+ display flex
49
+ margin .5rem 0
50
+ position relative
51
+ width calc(100% - 5.5rem)
52
+ gap .5rem
53
+
54
+ +maxWidth768()
55
+ flex-direction column
56
+
57
+ input
58
+ border-radius 12px
59
+ width calc((100% - 1rem) / 3)
60
+ flex 1
61
+ position relative
62
+ font-size 13px
63
+ background var(--efu-secondbg)
64
+ border var(--style-border-always)
65
+ padding 6px 10px
66
+ line-height 1
67
+
68
+ +maxWidth768()
69
+ width 100%
70
+
71
+ .vquote
72
+
73
+ .vcard
74
+ background: var(--efu-card-bg);
75
+ border none
76
+ border-top: var(--style-border-dashed);
77
+ border-radius: 12px;
78
+ transition: .3s;
79
+ padding: 1rem 0 0;
80
+ margin-top: 0;
81
+ box-shadow: none;
82
+
83
+ .vreply-wrapper
84
+
85
+ .vrow .vcol:first-child
86
+ bottom 78px
87
+
88
+ +maxWidth768()
89
+ bottom 164px
90
+
91
+ .vrow .vcol.text-right:not(.vctrl)
92
+ bottom 31px
93
+
94
+ +maxWidth768()
95
+ bottom 117px
96
+
97
+ .cancel-reply
98
+ display flex !important
99
+ flex-direction row
100
+ justify-content center
101
+ margin 0
102
+
103
+ .cancel-reply-btn
104
+ position inherit
105
+
106
+ .vrow
107
+ padding 0
108
+
109
+ .vcol
110
+ position absolute
111
+
112
+ &:first-child
113
+ bottom 56px
114
+ left 20px
115
+ width auto
116
+
117
+ +maxWidth768()
118
+ bottom 141px
119
+
120
+ &.text-right:not(.vctrl)
121
+ bottom 9px
122
+ right 0
123
+ transition .3s
124
+ border 0 solid var(--efu-main)
125
+ width 5rem
126
+ margin-left .5rem
127
+ border-radius 12px
128
+ height 34px
129
+
130
+ +maxWidth768()
131
+ bottom 94px
132
+
133
+ button
134
+ background-color var(--efu-fontcolor)
135
+ width 100%
136
+ height 100%
137
+ color var(--efu-card-bg)
138
+ border-radius 12px
139
+ opacity .2
140
+
141
+ +maxWidth768()
142
+ height 119px
143
+
144
+ svg
145
+ width 18px
146
+ height 18px
147
+
148
+ #veditor
149
+ display block
150
+ padding 16px 16px 40px 16px
151
+ line-height 1.5
152
+ width 100%
153
+ font-size 14px
154
+ background var(--efu-secondbg)
155
+ color var(--efu-fontcolor)
156
+ border-radius 12px
157
+ min-height 121px
158
+ border var(--style-border-always)
159
+
160
+ &:focus
161
+ border var(--style-border-hover-always)
162
+ box-shadow var(--efu-shadow-main)
163
+
164
+ .vcard
165
+ margin-top: 0
166
+ margin-bottom: .5rem
167
+ background: var(--efu-card-bg);
168
+ transition: .3s;
169
+ border-radius: 12px;
170
+ padding: 0;
171
+ padding-top: .5rem;
172
+ border: none;
173
+ border-top: var(--style-border-dashed);
174
+ display: flex;
175
+ flex-direction: row;
176
+ word-break: break-all;
177
+
178
+ +maxWidth768()
179
+ padding: 1rem;
180
+ border: var(--style-border-always);
181
+ box-shadow: var(--efu-shadow-border)
182
+
183
+ .vimg
184
+ width 32px
185
+ height 32px
186
+ border-radius 32px
187
+ cursor pointer
188
+ margin-right 16px
189
+
190
+ &:hover
191
+ transform: rotate(360deg)
192
+
193
+ .vh
194
+ flex 1
195
+ padding 0
196
+ border 0
197
+
198
+ .vhead
199
+ display flex
200
+ align-items center
201
+ gap: 5px;
202
+
203
+ .vnick
204
+ font-size 1rem
205
+ line-height 32px
206
+ margin-right 0
207
+
208
+ .vsys
209
+ background: var(--efu-card-bg);
210
+ border: var(--style-border-always);
211
+ padding: 3px 5px
212
+ border-radius: 8px;
213
+ color: var(--efu-secondtext)
214
+ display: inline
215
+ font-size: .5rem;
216
+
217
+ .vat
218
+ display: flex;
219
+ align-items: center;
220
+ color: var(--efu-lighttext)
221
+ padding: 3px 12px
222
+ transition: all .3s;
223
+ border-radius: 8px;
224
+ background-color: var(--efu-secondbg);
225
+ border: var(--style-border-always);
226
+ position: absolute;
227
+ right: 0;
228
+ bottom: 18px
229
+
230
+ &:hover
231
+ background-color: var(--efu-lighttext)
232
+ color: var(--efu-card-bg)
233
+
234
+ .vquote
235
+ border-left none
236
+
237
+ .vicon.actived
238
+ fill var(--efu-main)
239
+
240
+ #page
241
+ .vcard
242
+ padding: 1rem 1rem 1.5rem;
243
+ border: var(--style-border);
244
+ border-top: var(--style-border);
245
+ box-shadow: var(--efu-shadow-border);
@@ -66,6 +66,9 @@ body
66
66
  line-height 2
67
67
  -webkit-tap-highlight-color transparent
68
68
  margin 0
69
+ if !hexo-config('copy.enable')
70
+ user-select none
71
+ -webkit-user-select none
69
72
 
70
73
  *
71
74
  box-sizing border-box