hexo-theme-solitude 3.0.21 → 4.0.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 (142) hide show
  1. package/.github/FUNDING.yml +3 -3
  2. package/README.md +11 -1
  3. package/README_en-US.md +11 -1
  4. package/_config.yml +16 -7
  5. package/languages/default.yml +56 -36
  6. package/languages/en.yml +90 -69
  7. package/languages/es.yml +94 -73
  8. package/languages/zh-CN.yml +56 -34
  9. package/languages/zh-TW.yml +80 -57
  10. package/layout/archive.pug +60 -14
  11. package/layout/category.pug +13 -11
  12. package/layout/includes/body/gadsense.pug +2 -2
  13. package/layout/includes/console.pug +71 -72
  14. package/layout/includes/footer.pug +24 -9
  15. package/layout/includes/head/config.pug +83 -39
  16. package/layout/includes/head/mode.pug +7 -7
  17. package/layout/includes/head/page_config.pug +20 -11
  18. package/layout/includes/inject/body.pug +14 -36
  19. package/layout/includes/keyboard.pug +3 -3
  20. package/layout/includes/loading.pug +1 -37
  21. package/layout/includes/mixins/articleSort.pug +3 -3
  22. package/layout/includes/mixins/common.pug +8 -4
  23. package/layout/includes/mixins/pace.pug +1 -1
  24. package/layout/includes/mixins/pagination.pug +3 -3
  25. package/layout/includes/nav.pug +4 -3
  26. package/layout/includes/page/about.pug +9 -8
  27. package/layout/includes/page/brevity.pug +2 -2
  28. package/layout/includes/page/links.pug +23 -11
  29. package/layout/includes/page/music.pug +0 -5
  30. package/layout/includes/rightmenu.pug +20 -20
  31. package/layout/includes/sidebar.pug +2 -2
  32. package/layout/includes/widgets/aside/asideInfoCard.pug +2 -2
  33. package/layout/includes/widgets/aside/asideTag.pug +2 -2
  34. package/layout/includes/widgets/home/bbTimeList.pug +3 -3
  35. package/layout/includes/widgets/home/categoryBar.pug +30 -15
  36. package/layout/includes/widgets/home/hometop.pug +113 -8
  37. package/layout/includes/widgets/home/postList.pug +1 -2
  38. package/layout/includes/widgets/home/topGroup.pug +3 -7
  39. package/layout/includes/widgets/nav/group.pug +4 -2
  40. package/layout/includes/widgets/nav/menu.pug +6 -4
  41. package/layout/includes/widgets/nav/right.pug +7 -6
  42. package/layout/includes/widgets/page/about/award.pug +67 -38
  43. package/layout/includes/widgets/page/about/hobbies.pug +12 -3
  44. package/layout/includes/widgets/page/banner.pug +1 -1
  45. package/layout/includes/widgets/page/kit/content.pug +2 -2
  46. package/layout/includes/widgets/page/links/banner.pug +30 -19
  47. package/layout/includes/widgets/page/message/artalk.pug +3 -3
  48. package/layout/includes/widgets/page/message/content.pug +3 -3
  49. package/layout/includes/widgets/page/message/twikoo.pug +3 -3
  50. package/layout/includes/widgets/page/message/valine.pug +4 -4
  51. package/layout/includes/widgets/page/message/waline.pug +3 -3
  52. package/layout/includes/widgets/page/recentcomment/artalk.pug +5 -9
  53. package/layout/includes/widgets/page/recentcomment/twikoo.pug +5 -9
  54. package/layout/includes/widgets/page/recentcomment/valine.pug +6 -10
  55. package/layout/includes/widgets/page/recentcomment/waline.pug +5 -9
  56. package/layout/includes/widgets/post/award.pug +1 -28
  57. package/layout/includes/widgets/post/copyright.pug +10 -10
  58. package/layout/includes/widgets/post/postInfo.pug +10 -11
  59. package/layout/includes/widgets/post/postMeta.pug +3 -2
  60. package/layout/includes/widgets/rightside/hide.pug +5 -5
  61. package/layout/includes/widgets/rightside/show.pug +7 -7
  62. package/layout/includes/widgets/third-party/comments/artalk.pug +9 -9
  63. package/layout/includes/widgets/third-party/comments/giscus.pug +2 -2
  64. package/layout/includes/widgets/third-party/comments/twikoo.pug +5 -5
  65. package/layout/includes/widgets/third-party/comments/valine.pug +6 -6
  66. package/layout/includes/widgets/third-party/comments/waline.pug +6 -6
  67. package/layout/includes/widgets/third-party/hot/twikoo.pug +1 -1
  68. package/layout/includes/widgets/third-party/music.pug +9 -5
  69. package/layout/includes/widgets/third-party/news-comment/artalk.pug +6 -6
  70. package/layout/includes/widgets/third-party/news-comment/twikoo.pug +7 -7
  71. package/layout/includes/widgets/third-party/news-comment/valine.pug +8 -8
  72. package/layout/includes/widgets/third-party/news-comment/waline.pug +7 -7
  73. package/layout/includes/widgets/third-party/pjax.pug +16 -10
  74. package/layout/includes/widgets/third-party/search/algolia-search.pug +2 -2
  75. package/layout/includes/widgets/third-party/search/docsearch.pug +3 -3
  76. package/layout/includes/widgets/third-party/search/index.pug +1 -3
  77. package/layout/includes/widgets/third-party/search/local-search.pug +9 -9
  78. package/layout/index.pug +8 -6
  79. package/package.json +8 -7
  80. package/plugins.yml +22 -21
  81. package/scripts/event/cdn.js +11 -6
  82. package/scripts/event/friend_links.js +30 -0
  83. package/scripts/event/merge_config.js +15 -7
  84. package/scripts/filter/comment.js +2 -2
  85. package/scripts/filter/default.js +1 -1
  86. package/scripts/helper/inject_head_js.js +79 -33
  87. package/scripts/helper/related_post.js +16 -21
  88. package/scripts/tags/chart.js +1 -1
  89. package/scripts/tags/typeit.js +1 -1
  90. package/source/css/_components/capsule.styl +259 -168
  91. package/source/css/_components/rightside.styl +98 -242
  92. package/source/css/_global/animation.styl +1 -10
  93. package/source/css/_global/index.styl +27 -1
  94. package/source/css/_layout/aside.styl +7 -1
  95. package/source/css/_layout/console.styl +145 -165
  96. package/source/css/_layout/header.styl +238 -47
  97. package/source/css/_layout/pagination.styl +176 -132
  98. package/source/css/_layout/rightmenu.styl +11 -2
  99. package/source/css/_layout/sidebar.styl +39 -17
  100. package/source/css/_mode/index.styl +7 -1
  101. package/source/css/_page/_about/about.styl +18 -2
  102. package/source/css/_page/_about/buff.styl +1 -1
  103. package/source/css/_page/_about/contentinfo.styl +2 -1
  104. package/source/css/_page/_about/game.styl +57 -1
  105. package/source/css/_page/_about/like.styl +7 -2
  106. package/source/css/_page/_about/maxim.styl +1 -1
  107. package/source/css/_page/_about/reward.styl +226 -108
  108. package/source/css/_page/_about/skills.styl +5 -3
  109. package/source/css/_page/_home/category-bar.styl +162 -88
  110. package/source/css/_page/_home/home-top.styl +309 -263
  111. package/source/css/_page/_home/home.styl +34 -7
  112. package/source/css/_page/archive.styl +412 -0
  113. package/source/css/_page/category.styl +27 -1
  114. package/source/css/_page/index.styl +2 -0
  115. package/source/css/_page/links.styl +190 -0
  116. package/source/css/_page/other.styl +37 -0
  117. package/source/css/_post/index.styl +2 -1
  118. package/source/css/_post/meta.styl +245 -217
  119. package/source/css/_search/local-search.styl +158 -82
  120. package/source/css/var.styl +2 -2
  121. package/source/js/archive-page.js +191 -0
  122. package/source/js/core/actions.js +48 -0
  123. package/source/js/core/api.js +32 -0
  124. package/source/js/core/config.js +13 -0
  125. package/source/js/core/lifecycle.js +52 -0
  126. package/source/js/core/preloader.js +34 -0
  127. package/source/js/core/resources.js +65 -0
  128. package/source/js/covercolor/api.js +13 -103
  129. package/source/js/covercolor/ave.js +14 -77
  130. package/source/js/covercolor/local.js +22 -116
  131. package/source/js/covercolor/shared.js +102 -0
  132. package/source/js/friend_links.js +502 -0
  133. package/source/js/main.js +793 -177
  134. package/source/js/music.js +24 -14
  135. package/source/js/post_ai.js +13 -2
  136. package/source/js/right_menu.js +44 -24
  137. package/source/js/search/algolia.js +29 -21
  138. package/source/js/search/local.js +231 -266
  139. package/source/js/tw_cn.js +37 -12
  140. package/source/js/utils.js +37 -25
  141. package/layout/includes/widgets/randomlink.pug +0 -43
  142. package/scripts/filter/randomPosts.js +0 -16
@@ -11,70 +11,70 @@ div#rightMenu
11
11
  div.rightMenu-item#menu-top
12
12
  i.solitude.fas.fa-arrow-up
13
13
  div.rightMenu-group.rightMenu-line.rightMenuPlugin
14
- div.rightMenu-item#menu-copytext
14
+ div.rightMenu-item#menu-copytext(title=_p('right_menu.copy') heotip=_p('right_menu.copy'))
15
15
  i.solitude.fas.fa-clone
16
16
  span= _p('right_menu.copy')
17
- div.rightMenu-item#menu-pastetext
17
+ div.rightMenu-item#menu-pastetext(title=_p('right_menu.paste') heotip=_p('right_menu.paste'))
18
18
  i.solitude.fas.fa-clipboard
19
19
  span= _p('right_menu.paste')
20
20
  if theme.comment.use
21
- div.rightMenu-item#menu-commenttext
21
+ div.rightMenu-item#menu-commenttext(title=_p('right_menu.comment') heotip=_p('right_menu.comment'))
22
22
  i.solitude.fas.fa-comment-medical
23
23
  span= _p('right_menu.comment')
24
- div.rightMenu-item#menu-newwindow
24
+ div.rightMenu-item#menu-newwindow(title=_p('right_menu.new') heotip=_p('right_menu.new'))
25
25
  i.solitude.far.fa-window-maximize
26
26
  span= _p('right_menu.new')
27
- div.rightMenu-item#menu-copylink
27
+ div.rightMenu-item#menu-copylink(title=_p('right_menu.link') heotip=_p('right_menu.link'))
28
28
  i.solitude.fas.fa-link
29
29
  span= _p('right_menu.link')
30
- div.rightMenu-item#menu-copyimg
30
+ div.rightMenu-item#menu-copyimg(title=_p('right_menu.img') heotip=_p('right_menu.img'))
31
31
  i.solitude.fas.fa-clone
32
32
  span= _p('right_menu.img')
33
- div.rightMenu-item#menu-downloadimg
33
+ div.rightMenu-item#menu-downloadimg(title=_p('right_menu.downloadImg') heotip=_p('right_menu.downloadImg'))
34
34
  i.solitude.fas.fa-cloud-arrow-down
35
35
  span= _p('right_menu.downloadImg')
36
36
  if theme.search.enable
37
- div.rightMenu-item#menu-search
37
+ div.rightMenu-item#menu-search(title=_p('right_menu.search') heotip=_p('right_menu.search'))
38
38
  i.solitude.fas.fa-magnifying-glass
39
39
  span= _p('right_menu.search')
40
40
  if theme.capsule.enable
41
- div.rightMenu-item#menu-music-toggle
41
+ div.rightMenu-item#menu-music-toggle(title=_p('right_menu.music.start') heotip=_p('right_menu.music.start'))
42
42
  i.solitude.fas.fa-play
43
43
  span= _p('right_menu.music.start')
44
- div.rightMenu-item#menu-music-back
44
+ div.rightMenu-item#menu-music-back(title=_p('right_menu.music.back') heotip=_p('right_menu.music.back'))
45
45
  i.solitude.fas.fa-backward
46
46
  span= _p('right_menu.music.back')
47
- div.rightMenu-item#menu-music-forward
47
+ div.rightMenu-item#menu-music-forward(title=_p('right_menu.music.forward') heotip=_p('right_menu.music.forward'))
48
48
  i.solitude.fas.fa-forward
49
49
  span= _p('right_menu.music.forward')
50
- div.rightMenu-item#menu-music-copyMusicName
50
+ div.rightMenu-item#menu-music-copyMusicName(title=_p('right_menu.music.copyMusicName') heotip=_p('right_menu.music.copyMusicName'))
51
51
  i.solitude.fas.fa-clone
52
52
  span= _p('right_menu.music.copyMusicName')
53
53
  if custom_list.length > 0
54
54
  div.rightMenu-group.rightMenu-line.rightMenuOther
55
55
  each item,index in custom_list
56
- div.rightMenu-item(id=item.id class=item.class onclick=item.click+'||rm.hideRightMenu()')
56
+ div.rightMenu-item(id=item.id class=item.class data-solitude-action="runConfiguredAction" data-solitude-value=item.click title=item.name heotip=item.name)
57
57
  i.solitude(class=item.icon)
58
58
  span= item.name
59
59
  div.rightMenu-group.rightMenu-line.rightMenuOther
60
60
  if theme.right_menu.commentBarrage && theme.comment.use && theme.comment.commentBarrage
61
- div.rightMenu-item#menu-commentBarrage(onclick="sco.switchCommentBarrage()")
61
+ div.rightMenu-item#menu-commentBarrage(data-solitude-action="switchCommentBarrage" title=_p('right_menu.barrage.close') heotip=_p('right_menu.barrage.close'))
62
62
  i.solitude.fas.fa-comment
63
63
  span.menu-commentBarrage-text= _p('right_menu.barrage.close')
64
- div.rightMenu-item#menu-darkmode(onclick="sco.switchDarkMode()")
64
+ div.rightMenu-item#menu-darkmode(data-solitude-action="switchDarkMode")
65
65
  i.solitude.fas.fa-circle-half-stroke
66
66
  case theme.display_mode.type
67
67
  when 'auto'
68
68
  when 'light'
69
- span.menu-darkmode-text= _p('right_menu.light')
69
+ span.menu-darkmode-text(title=_p('right_menu.light') heotip=_p('right_menu.light'))= _p('right_menu.light')
70
70
  when 'dark'
71
- span.menu-darkmode-text= _p('right_menu.dark')
71
+ span.menu-darkmode-text(title=_p('right_menu.dark') heotip=_p('right_menu.dark'))= _p('right_menu.dark')
72
72
  if theme.right_menu.translate
73
73
  div.rightMenu-item#menu-translate
74
74
  i.solitude.fas.fa-language
75
75
  case theme.translate.defaultEncoding
76
76
  when 2
77
- span= _p('right_menu.chs_to_cht')
77
+ span(title=_p('right_menu.chs_to_cht') heotip=_p('right_menu.chs_to_cht'))= _p('right_menu.chs_to_cht')
78
78
  when 1
79
- span= _p('right_menu.cht_to_chs')
80
- div#rightmenu-mask
79
+ span(title=_p('right_menu.cht_to_chs') heotip=_p('right_menu.cht_to_chs'))= _p('right_menu.cht_to_chs')
80
+ div#rightmenu-mask
@@ -25,7 +25,7 @@ div#sidebar(style="zoom: 1;")
25
25
  include ./widgets/sidebar/comment
26
26
  span.sidebar-menu-item-title= __('sidebar.function')
27
27
  div.sidebar-menu-item
28
- span.darkmode_switchbutton.menu-child(onclick="sco.switchDarkMode()")
28
+ span.darkmode_switchbutton.menu-child(data-solitude-action="toggleTheme")
29
29
  i.solitude.fas.fa-circle-half-stroke
30
30
  span= __('sidebar.darkmode')
31
31
  include ./widgets/nav/group
@@ -41,4 +41,4 @@ div#sidebar(style="zoom: 1;")
41
41
  .webinfo
42
42
  .webinfo-item
43
43
  .item-name= __('aside.wordcount')
44
- .item-count= totalcount(site)
44
+ .item-count= totalcount(site)
@@ -2,7 +2,7 @@
2
2
  .card-content
3
3
  .card-info-avatar.is-center
4
4
  .top-group
5
- .sayhi#sayhi(onclick="sco.changeWittyWord()")
5
+ .sayhi#sayhi(data-solitude-action="changeWittyWord")
6
6
  .avatar
7
7
  img(alt=_p('aside.avatar'), src=theme.aside.my_card.author.img)
8
8
  if theme.aside.my_card.author.sticker
@@ -16,5 +16,5 @@
16
16
  .social-icons.is-center
17
17
  each value, label in theme.aside.my_card.information || {}
18
18
  - var array = value.split('||')
19
- a.social-icon(href=url_for(trim(array[0])), title=label)
19
+ a.social-icon(href=url_for(trim(array[0])), title=label, heotip=label)
20
20
  i.solitude(class=array[1])
@@ -8,9 +8,9 @@
8
8
  a(href=url_for(tag.path))= tag.name
9
9
  sup= tag.length
10
10
  if site.tags.length >= theme.aside.tags.limit
11
- span#more-tags-btn(onclick="sco.openAllTags()")= __('aside.tagmore')
11
+ span#more-tags-btn(data-solitude-action="openAllTags")= __('aside.tagmore')
12
12
  else
13
13
  style.
14
14
  .card-tag-cloud::after {
15
15
  display: none !important;
16
- }
16
+ }
@@ -1,6 +1,6 @@
1
1
  .bbTimeList.container#bbTimeList(class=is_home_first_page() ? '' : 'more-page')
2
- i.bber-logo.solitude.fas.fa-newspaper(onclick=`pjax.loadUrl('${url_for(theme.brevity.page)}')`)
3
- .swiper-container.swiper-no-swiping.swiper-container-initialized.swiper-container-vertical.swiper-container-pointer-events#bbtalk(tabindex="-1" onclick=`pjax.loadUrl('${url_for(theme.brevity.page)}')`)
2
+ i.bber-logo.solitude.fas.fa-newspaper(data-solitude-action="navigateTo" data-solitude-url=url_for(theme.brevity.page))
3
+ .swiper-container.swiper-no-swiping#bbtalk(tabindex="-1" data-solitude-action="navigateTo" data-solitude-url=url_for(theme.brevity.page))
4
4
  .swiper-wrapper#bber-talk
5
5
  each item, i in site.data.brevity.slice(0, 10)
6
6
  .li-style.swiper-slide
@@ -13,4 +13,4 @@
13
13
  i.solitude.fas.fa-video
14
14
  else if item.link
15
15
  i.solitude.fas.fa-link
16
- i.bber-gotobb.solitude.fas.fa-circle-chevron-right(title=_p('home.bbtime.text') onclick=`pjax.loadUrl('${url_for(theme.brevity.page)}')`)
16
+ i.bber-gotobb.solitude.fas.fa-circle-chevron-right(title=_p('home.bbtime.text') data-solitude-action="navigateTo" data-solitude-url=url_for(theme.brevity.page))
@@ -1,16 +1,31 @@
1
1
  .category-bar-items#category-bar-items(class=is_home() ? 'home' : '')
2
- .category-bar-item(class=is_home() ? 'select' : '', id="category-bar-home")
3
- a(href=url_for('/'))= __('home.home')
4
- .category-bar-item
5
- a(href=url_for('/archives/'))= __('home.archives')
6
- each item in site.categories.find({ parent: { $exists: false } }).data
7
- .category-bar-item(class=select ? (select === item.name ? 'select' : '') : '', id=item.name)
8
- a(href=url_for(item.path))= item.name
9
- div.category-bar-right
10
- - let categories = site.categories.find({parent: {$exists: false}})
11
- - let word_count = categories.map(category => category.name).join('').length
12
- if word_count > 40 || categories.data.length > 10
13
- .category-bar-next#category-bar-next(onclick="sco.scrollCategoryBarToRight()")
14
- i.solitude.fas.fa-angles-right
15
- if theme.page.categories
16
- a.category-bar-more(href=url_for('/categories/'))= __('more')
2
+ .category-bar-item(class=is_home() ? 'select' : '', id='category-bar-home', data-default-order='0')
3
+ a(href=url_for('/'), title=__('home.home'), heotip=_p('tooltip.home'))
4
+ span.category-bar-link-icon
5
+ i.solitude.fas.fa-star
6
+ span= __('home.home')
7
+ .category-bar-item(
8
+ class=is_archive() ? 'select' : ''
9
+ id='archives'
10
+ data-default-order='1'
11
+ )
12
+ a(href=url_for('/archives/'), title=__('home.archives'), heotip=_p('tooltip.archives'))
13
+ span.category-bar-link-icon
14
+ i.solitude.fas.fa-book
15
+ span= __('home.archives')
16
+ each item, index in site.categories.find({ parent: { $exists: false } }).data
17
+ .category-bar-item(
18
+ class=select ? (select === item.name ? 'select' : '') : ''
19
+ id=item.name
20
+ data-default-order=index + 2
21
+ )
22
+ a(href=url_for(item.path), title=item.name, heotip=_p('tooltip.category').replace('${name}', item.name))= item.name
23
+
24
+ - const categories = site.categories.find({ parent: { $exists: false } })
25
+ - const wordCount = categories.map(category => category.name).join('').length
26
+ .category-bar-more-group
27
+ if wordCount > 40 || categories.data.length > 10
28
+ button.category-bar-next#category-bar-next(type='button' data-solitude-action='scrollCategoryBarToRight' aria-label=_p('tooltip.category_next') title=_p('tooltip.category_next') heotip=_p('tooltip.category_next'))
29
+ i.solitude.fas.fa-angles-right
30
+ if theme.page.categories
31
+ a.category-bar-more(href=url_for('/categories/'), title=__('more'), heotip=_p('tooltip.categories'))= __('more')
@@ -1,8 +1,113 @@
1
- .recent-top-post-group#recent-top-post-group
2
- .recent-post-top#recent-post-top
3
- #bannerGroup
4
- #banners
5
- include ./banner.pug
6
- if theme.hometop.recommendList.enable
7
- .topGroup
8
- include ./topGroup.pug
1
+ -
2
+ const recommendConfig = theme.hometop.recommendList || []
3
+ const recommendEntries = Array.isArray(recommendConfig)
4
+ ? recommendConfig
5
+ : Array.isArray(recommendConfig.list)
6
+ ? recommendConfig.enable === false ? [] : recommendConfig.list
7
+ : recommendConfig.enable
8
+ ? [recommendConfig]
9
+ : []
10
+ const hasOrder = item => item.order !== undefined && item.order !== null && item.order !== '' && Number.isFinite(Number(item.order))
11
+ const configuredItems = recommendEntries
12
+ .map((item, sourceIndex) => ({ item, sourceIndex }))
13
+ .filter(({ item }) => item && item.enable !== false && item.title && item.url && (item.img || item.cover))
14
+ .sort((a, b) => {
15
+ const aHasOrder = hasOrder(a.item)
16
+ const bHasOrder = hasOrder(b.item)
17
+ if (aHasOrder && bHasOrder) return Number(a.item.order) - Number(b.item.order) || a.sourceIndex - b.sourceIndex
18
+ if (aHasOrder) return -1
19
+ if (bHasOrder) return 1
20
+ return a.sourceIndex - b.sourceIndex
21
+ })
22
+ .map(({ item }) => ({
23
+ title: item.title,
24
+ url: item.url,
25
+ cover: item.img || item.cover,
26
+ label: item.sup || item.label || '',
27
+ color: item.color || ''
28
+ }))
29
+ const normalizeUrl = value => String(value || '').replace(/^\/+|\/+$/g, '')
30
+ const configuredUrls = new Set(configuredItems.map(item => normalizeUrl(item.url)))
31
+ const recentCoverPosts = site.posts.sort('-date').data
32
+ .filter(post => post.cover && !configuredUrls.has(normalizeUrl(post.path)))
33
+ .slice(0, Math.max(0, 5 - configuredItems.length))
34
+ const postItems = recentCoverPosts.map(post => ({
35
+ title: post.title,
36
+ url: post.path,
37
+ cover: post.cover,
38
+ label: post.categories && post.categories.data.length ? post.categories.data[0].name : '',
39
+ color: post.banner_color || post.theme_color || ''
40
+ }))
41
+ const homeCenterItems = configuredItems.concat(postItems).slice(0, 5)
42
+ const fallbackCover = url_for('/img/default.avif')
43
+ const explicitColor = color => color && !String(color).includes('var(') ? color : ''
44
+ const initialColor = homeCenterItems.length ? explicitColor(homeCenterItems[0].color) || 'var(--efu-main)' : 'var(--efu-main)'
45
+ const initialStyle = `--current-theme:${initialColor};--current-theme-op:color-mix(in srgb, ${initialColor} 14%, transparent);--current-theme-op-deep:color-mix(in srgb, ${initialColor} 87%, transparent)`
46
+
47
+ if homeCenterItems.length
48
+ .home-center#home_center(style=initialStyle)
49
+ .home-center-content
50
+ .home-center-left
51
+ .home-center-banner(data-mobile-loop='false')
52
+ each item, index in homeCenterItems
53
+ - const configuredColor = explicitColor(item.color)
54
+ - const itemColor = configuredColor || 'var(--efu-main)'
55
+ - const itemStyle = `--home-center-theme:${itemColor};--home-center-theme-op:color-mix(in srgb, ${itemColor} 14%, transparent);--home-center-theme-op-deep:color-mix(in srgb, ${itemColor} 87%, transparent)`
56
+ .home-center-banner-item.has-banner-cover(
57
+ class=index === 0 ? 'active' : ''
58
+ style=itemStyle
59
+ role='link'
60
+ tabindex=index === 0 ? '0' : '-1'
61
+ aria-hidden=index === 0 ? 'false' : 'true'
62
+ data-index=index
63
+ data-link=url_for(item.url)
64
+ data-title=item.title
65
+ data-label=item.label || ''
66
+ data-color=configuredColor
67
+ )
68
+ .home-center-cover
69
+ img.home-center-cover-img.nolazyload(
70
+ src=url_for(item.cover)
71
+ alt=item.title
72
+ loading=index === 0 ? 'eager' : 'lazy'
73
+ fetchpriority=index === 0 ? 'high' : 'auto'
74
+ data-solitude-fallback=url_for(fallbackCover)
75
+ )
76
+ .home-center-mask
77
+
78
+ .home-center-title
79
+ a.home-center-title-link(href=url_for(homeCenterItems[0].url))= homeCenterItems[0].title
80
+ .home-center-title-tag
81
+ i.solitude.fas.fa-star
82
+ span= homeCenterItems[0].label || ''
83
+ .home-center-indicators(aria-label='推荐内容切换')
84
+ each item, index in homeCenterItems
85
+ button.home-center-indicator(
86
+ class=index === 0 ? 'active' : ''
87
+ type='button'
88
+ data-index=index
89
+ aria-label=`查看第 ${index + 1} 条推荐`
90
+ aria-current=index === 0 ? 'true' : 'false'
91
+ )
92
+
93
+ if homeCenterItems.length > 1
94
+ .home-center-right
95
+ .home-center-list
96
+ each item, index in homeCenterItems
97
+ - const itemColor = explicitColor(item.color) || 'var(--efu-main)'
98
+ - const itemStyle = `--item-theme:${itemColor};--item-theme-op:color-mix(in srgb, ${itemColor} 14%, transparent);--item-theme-op-deep:color-mix(in srgb, ${itemColor} 87%, transparent)`
99
+ .home-center-item(
100
+ class=index === 0 ? 'active' : ''
101
+ style=itemStyle
102
+ data-index=index
103
+ aria-current=index === 0 ? 'true' : 'false'
104
+ )
105
+ .home-center-item-icon
106
+ img.nolazyload(
107
+ src=url_for(item.cover)
108
+ alt=''
109
+ loading='lazy'
110
+ data-solitude-fallback=url_for(fallbackCover)
111
+ )
112
+ .home-center-item-title
113
+ a(href=url_for(item.url))= item.title
@@ -80,8 +80,7 @@ mixin adsenseCard()
80
80
  (adsbygoogle = window.adsbygoogle || []).push({});
81
81
 
82
82
  //- 主文章项组件
83
- - var onclickAttr = "pjax.loadUrl('" + url_for(post.path) + "')"
84
- .recent-post-item(onclick=onclickAttr)
83
+ .recent-post-item(data-solitude-action="navigateTo" data-solitude-url=url_for(post.path))
85
84
  if direction === 'column'
86
85
  +columnLayout()
87
86
  else
@@ -17,18 +17,14 @@ mixin todayCardContent
17
17
  .todayCard-cover.nolazyload(style=`background: url('${theme.hometop.recommendList.img}') no-repeat center /cover`)
18
18
  if filteredPosts.length > 0
19
19
  .banner-button-group
20
- a.banner-button(onclick="window.event.cancelBubble=true;sco.hideTodayCard();")
20
+ a.banner-button(data-solitude-action="hideTodayCard" data-solitude-stop="true")
21
21
  i.solitude.fas.fa-circle-plus
22
22
  span.banner-button-text= _p('home.recommendmore')
23
23
 
24
24
  case theme.hometop.recommendList.url.startsWith('/')
25
25
  when true
26
- .todayCard#todayCard(onclick=`pjax.loadUrl('${theme.hometop.recommendList.url}')`)
26
+ .todayCard#todayCard(data-solitude-action="navigateTo" data-solitude-url=theme.hometop.recommendList.url)
27
27
  +todayCardContent()
28
28
  when false
29
- script.
30
- function GoTodayCard() {
31
- window.open("#{theme.hometop.recommendList.url}", "_blank");
32
- }
33
- .todayCard#todayCard(onclick="GoTodayCard()")
29
+ .todayCard#todayCard(data-solitude-action="openExternal" data-solitude-url=theme.hometop.recommendList.url)
34
30
  +todayCardContent()
@@ -7,7 +7,9 @@ if menu
7
7
  .back-menu-list
8
8
  each data, label in value
9
9
  - var array = data.split('||')
10
- a.back-menu-item(href=url_for(trim(array[0])), title=label)
10
+ - var itemUrl = trim(array[0])
11
+ - var isTravelling = itemUrl === 'javascript:travelling()'
12
+ a.back-menu-item(href=isTravelling ? 'javascript:void(0);' : url_for(itemUrl), data-solitude-action=isTravelling ? 'travelling' : null, data-solitude-prevent=isTravelling ? 'true' : null, title=label, heotip=label)
11
13
  if array[1]
12
14
  img.nolazyload.back-menu-item-icon(src=trim(array[1]), alt=label)
13
- span.back-menu-item-text= label
15
+ span.back-menu-item-text= label
@@ -5,16 +5,18 @@ if menu
5
5
  each value, label in menu
6
6
  .menus_item
7
7
  if typeof value !== 'object'
8
- a.site-page(href=url_for(value))
8
+ a.site-page(href=url_for(value), title=label, heotip=label)
9
9
  span= label
10
10
  else
11
- a.site-page(href="javascript:void(0);")
11
+ a.site-page(href="javascript:void(0);", title=label, heotip=label)
12
12
  span= label
13
13
  ul.menus_item_child
14
14
  each childValue, childLabel in value
15
15
  li
16
16
  - var array = childValue.split('||')
17
- a.site-page.child(href=url_for(trim(array[0])))
17
+ - var childUrl = trim(array[0])
18
+ - var isTravelling = childUrl === 'javascript:travelling()'
19
+ a.site-page.child(href=isTravelling ? 'javascript:void(0);' : url_for(childUrl), data-solitude-action=isTravelling ? 'travelling' : null, data-solitude-prevent=isTravelling ? 'true' : null, title=childLabel, heotip=childLabel)
18
20
  if array[1]
19
21
  i.solitude(class=array[1])
20
- span= childLabel
22
+ span= childLabel
@@ -1,28 +1,29 @@
1
1
  - var custom = theme.nav.right.custom || []
2
2
  each item in custom
3
+ - const itemCommand = (item.onclick || '').replace(/\btoRandomPost\(\)/g, 'randomPost()').replace(/\btravelling\(\)/g, 'travelling()').replace(/\?\.\(/g, '(').replace(/\?\./g, '.')
3
4
  .nav-button(id=item.id)
4
- a.site-page(href=url_for(item.url) || 'javascript:void(0);', onclick=item.onclick, title=item.title || '')
5
+ a.site-page(href=url_for(item.url) || 'javascript:void(0);', data-solitude-action=itemCommand ? 'runConfiguredAction' : null, data-solitude-value=itemCommand || null, data-solitude-prevent=itemCommand ? 'true' : null, title=item.title || item.name, heotip=item.title || item.name)
5
6
  i.solitude(class=item.icon || '')
6
7
  if theme.nav.right.random
7
8
  .nav-button#randomPost_button
8
- a.site-page(onclick="toRandomPost()", title=_p('nav.randompost'), href="javascript:void(0);")
9
+ a.site-page(data-solitude-action="randomPost" data-solitude-prevent="true", title=_p('nav.randompost'), heotip=_p('nav.randompost'), href="javascript:void(0);")
9
10
  i.solitude.fas.fa-dice-d6
10
11
  if theme.search.enable
11
12
  .nav-button#search-button
12
- a.site-page.social-icon.search(href="javascript:void(0);", title=_p('nav.search'))
13
+ a.site-page.social-icon.search(href="javascript:void(0);", title=_p('nav.search'), heotip=_p('nav.search'))
13
14
  i.solitude.fas.fa-magnifying-glass
14
15
  if theme.console.enable
15
16
  .nav-button#nav-console
16
- a.console_switchbutton(onclick="sco.showConsole()", title=_p('nav.console'), href="javascript:void(0);")
17
+ a.console_switchbutton(data-solitude-action="toggleConsole" data-solitude-prevent="true", title=_p('nav.console'), heotip=_p('nav.console'), href="javascript:void(0);")
17
18
  label
18
19
  i.left
19
20
  i.center
20
21
  i.right
21
22
  if !theme.rightside.percent
22
- .nav-button#nav-totop(onclick="sco.toTop()")
23
+ .nav-button#nav-totop(data-solitude-action="toTop" title=_p('nav.backtop') heotip=_p('nav.backtop'))
23
24
  a.totopbtn
24
25
  i.solitude.fas.fa-arrow-up
25
26
  span#percent= "0"
26
27
  #toggle-menu
27
28
  a.site-page
28
- i.solitude.fas.fa-bars
29
+ i.solitude.fas.fa-bars
@@ -1,39 +1,68 @@
1
- - award = site.data.about.award
1
+ - const award = site.data.about.award
2
+ - const rewardList = Array.isArray(site.data.about.rewardList) ? site.data.about.rewardList.slice() : []
3
+ - const sortedRewards = rewardList.sort((a, b) => new Date(b.time) - new Date(a.time))
4
+ - const visibleRewards = sortedRewards.slice(0, 11)
5
+ - const sum = rewardList.reduce((total, reward) => total + Number(reward.money || 0), 0)
6
+ - const rewardConfig = theme.post && theme.post.award ? theme.post.award : {}
7
+ - const rewardMethods = Array.isArray(rewardConfig.list) ? rewardConfig.list.filter(item => item && item.name && item.qcode) : []
8
+ - const showRewardButton = rewardConfig.enable && rewardMethods.length > 0
9
+ - const appreciators = rewardConfig.appreciators
2
10
 
3
- - var sum = 0
4
- if site.data.about.rewardList && site.data.about.award.enable
5
- .author-content
6
- .author-content-item.single.reward
7
- .author-content-item-tips= _p('award.thanks')
8
- span.author-content-item-title= _p('award.title')
9
- .author-content-item-description
10
- != award.description
11
- .reward-list-all
12
- each reward in site.data.about.rewardList.sort((a, b) => b.time - a.time) || []
13
- - sum += reward.money
14
- .reward-list-item
15
- .reward-list-item-name= reward.name
16
- .reward-list-bottom-group
17
- .reward-list-item-money(style="background-color:" + reward.color)
18
- if reward.icon
19
- i.solitude(class=reward.icon)
20
- | ¥ #{reward.money}
21
- time.datetime.reward-list-item-time(datetime=moment(reward.time).format())
22
- if theme.post.award.enable
23
- .post-reward
24
- .post-reward(onclick="AddRewardMask()")
25
- .reward-button(title=_p('award.tipping'))
26
- i.solitude.fas.fa-heart
27
- = _p('award.tipping')
28
- .reward-main
29
- ul.reward-all
30
- span.reward-title= theme.post.award.title
31
- ul.reward-group
32
- - var rewards = theme.post.award.list
33
- each reward in rewards
34
- li.reward-item
35
- a(href=url_for(reward.url))
36
- img.post-qr-code-img(alt=reward.name, src=reward.qcode, style="border-color:" + reward.color)
37
- .post-qr-code-desc= reward.name
38
- .reward-list-tips
39
- p= award.tips.replace('{sum}', sum.toFixed(2))
11
+ if rewardList.length && award && award.enable
12
+ .author-content
13
+ .author-content-item.single.reward
14
+ .author-content-item-tips= _p('award.thanks')
15
+ span.author-content-item-title= _p('award.title')
16
+ .author-content-item-description!= award.description
17
+
18
+ if showRewardButton
19
+ .post-reward
20
+ .reward-button(
21
+ role='button'
22
+ tabindex='0'
23
+ title=_p('award.tipping')
24
+ aria-label=_p('award.tipping')
25
+ data-solitude-action='showReward'
26
+ )
27
+ i.solitude.fas.fa-heart(aria-hidden='true')
28
+ = _p('award.tipping')
29
+ .reward-main
30
+ ul.reward-all
31
+ span.reward-title= rewardConfig.title
32
+ ul.reward-group
33
+ each method in rewardMethods
34
+ li.reward-item
35
+ a(href=url_for(method.url))
36
+ img.post-qr-code-img.nolazyload(
37
+ alt=method.name
38
+ src=method.qcode
39
+ style=method.color ? 'border-color:' + method.color : null
40
+ )
41
+ .post-qr-code-desc= method.name
42
+
43
+ .reward-list-all
44
+ each reward in visibleRewards
45
+ - const amount = Number(reward.money || 0)
46
+ - const amountTier = amount >= 100 ? 'reward-list-item-money-high' : amount >= 20 ? 'reward-list-item-money-medium' : 'reward-list-item-money-low'
47
+ .reward-list-item(tabindex='0')
48
+ .reward-list-item-name(title=reward.name)= reward.name
49
+ .reward-list-bottom-group
50
+ .reward-list-item-money(
51
+ class=amountTier
52
+ style=reward.color ? 'background-color:' + reward.color : null
53
+ )
54
+ if reward.icon
55
+ i.solitude(class=reward.icon aria-hidden='true')
56
+ | ¥ #{reward.money}
57
+ time.datetime.reward-list-item-time(datetime=moment(reward.time).format())= moment(reward.time).format('YYYY-MM-DD')
58
+
59
+ if appreciators
60
+ a.reward-list-item.reward-list-item-more(
61
+ href=url_for(appreciators)
62
+ aria-label='查看全部打赏名单'
63
+ )
64
+ span 查看全部
65
+ i.solitude.fas.fa-arrow-right(aria-hidden='true')
66
+
67
+ .reward-list-tips
68
+ p= award.tips.replace('{sum}', sum.toFixed(2))
@@ -10,16 +10,25 @@ if games
10
10
  .author-content-item.game(class=`game-${index}`, style=`background: url(${game.img}) no-repeat top; background-size: cover;`)
11
11
  .card-content
12
12
  .author-content-item-tips= game.title
13
- span.author-content-item-title= game.subtitle
13
+ if game.mode
14
+ .author-content-item-title
15
+ span.author-content-item-title-text= game.subtitle
16
+ img.mode-img(src=game.mode.img, alt=game.mode.name, title=game.mode.tip, heotip=game.mode.tip)
17
+ else
18
+ span.author-content-item-title= game.subtitle
14
19
  .content-bottom
15
- if game.icon_group
20
+ if game.heroes
21
+ .hero-group
22
+ each hero, heroIndex in game.heroes
23
+ img.hero-group-item(src=hero.img, alt=hero.name, title=`擅长英雄:${hero.name}`, heotip=`擅长英雄:${hero.name}`, style=`--index: ${heroIndex};`)
24
+ else if game.icon_group
16
25
  .icon-group
17
26
  each icon in game.icon_group
18
27
  i(style=`background-image: url(${icon})`)
19
28
  else if game.tips_left
20
29
  .tips= game.tips_left
21
30
  if game.tips_right
22
- .tips= game.tips_right
31
+ .tips(title=game.tips_right_tip, heotip=game.tips_right_tip)= game.tips_right
23
32
 
24
33
  if site.data.about.likes
25
34
  - const likes = site.data.about.likes
@@ -10,6 +10,6 @@
10
10
  if page.rightbtn
11
11
  .banner-button-group
12
12
  - const isInternalLink = page.rightbtnlink.startsWith('/')
13
- a.banner-button(onclick=isInternalLink ? `pjax.loadUrl("${page.rightbtnlink}")`: null, href=isInternalLink ? null : url_for(page.rightbtnlink), target=isInternalLink ? null : "_blank")
13
+ a.banner-button(data-solitude-action=isInternalLink ? "navigateTo" : null, data-solitude-url=isInternalLink ? page.rightbtnlink : null, href=isInternalLink ? null : url_for(page.rightbtnlink), target=isInternalLink ? null : "_blank")
14
14
  i.solitude.fas.fa-circle-chevron-right
15
15
  span.banner-button-text= page.rightbtn
@@ -11,7 +11,7 @@
11
11
  .equipment-item-content-item-cover
12
12
  img.equipment-item-content-item-image(src=item.image, alt=item.name)
13
13
  .equipment-item-content-item-info
14
- .equipment-item-content-item-name(onclick='utils.copy("' + item.name + '")')= item.name
14
+ .equipment-item-content-item-name(data-solitude-action='copy' data-solitude-value=item.name)= item.name
15
15
  .equipment-item-content-item-specification= item.specification
16
16
  .equipment-item-content-item-description= item.description
17
17
  .equipment-item-content-item-toolbar
@@ -21,5 +21,5 @@
21
21
  else
22
22
  a.equipment-item-content-item-link(href=item.link) 查看文章
23
23
  if theme.comment.use
24
- a.bber-reply(onclick=`sco.toTalk('${item.description}')`)
24
+ a.bber-reply(data-solitude-action="toTalk" data-solitude-value=item.description)
25
25
  i.solitude.fas.fa-comment(style="font-size: 1rem;")