hexo-theme-solitude 3.0.20 → 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 (143) 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 +38 -24
  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 +18 -40
  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 +5 -4
  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/index.pug +1 -1
  68. package/layout/includes/widgets/third-party/hot/twikoo.pug +1 -1
  69. package/layout/includes/widgets/third-party/music.pug +9 -5
  70. package/layout/includes/widgets/third-party/news-comment/artalk.pug +6 -6
  71. package/layout/includes/widgets/third-party/news-comment/twikoo.pug +7 -7
  72. package/layout/includes/widgets/third-party/news-comment/valine.pug +8 -8
  73. package/layout/includes/widgets/third-party/news-comment/waline.pug +7 -7
  74. package/layout/includes/widgets/third-party/pjax.pug +16 -10
  75. package/layout/includes/widgets/third-party/search/algolia-search.pug +2 -2
  76. package/layout/includes/widgets/third-party/search/docsearch.pug +3 -3
  77. package/layout/includes/widgets/third-party/search/index.pug +1 -3
  78. package/layout/includes/widgets/third-party/search/local-search.pug +9 -9
  79. package/layout/index.pug +10 -8
  80. package/package.json +8 -7
  81. package/plugins.yml +22 -21
  82. package/scripts/event/cdn.js +11 -6
  83. package/scripts/event/friend_links.js +30 -0
  84. package/scripts/event/merge_config.js +15 -7
  85. package/scripts/filter/comment.js +2 -2
  86. package/scripts/filter/default.js +1 -1
  87. package/scripts/helper/inject_head_js.js +79 -33
  88. package/scripts/helper/related_post.js +16 -21
  89. package/scripts/tags/chart.js +1 -1
  90. package/scripts/tags/typeit.js +1 -1
  91. package/source/css/_components/capsule.styl +259 -168
  92. package/source/css/_components/rightside.styl +98 -242
  93. package/source/css/_global/animation.styl +1 -10
  94. package/source/css/_global/index.styl +27 -1
  95. package/source/css/_layout/aside.styl +7 -1
  96. package/source/css/_layout/console.styl +144 -163
  97. package/source/css/_layout/header.styl +238 -47
  98. package/source/css/_layout/pagination.styl +176 -132
  99. package/source/css/_layout/rightmenu.styl +11 -2
  100. package/source/css/_layout/sidebar.styl +39 -17
  101. package/source/css/_mode/index.styl +7 -1
  102. package/source/css/_page/_about/about.styl +18 -2
  103. package/source/css/_page/_about/buff.styl +1 -1
  104. package/source/css/_page/_about/contentinfo.styl +2 -1
  105. package/source/css/_page/_about/game.styl +57 -1
  106. package/source/css/_page/_about/like.styl +7 -2
  107. package/source/css/_page/_about/maxim.styl +1 -1
  108. package/source/css/_page/_about/reward.styl +226 -108
  109. package/source/css/_page/_about/skills.styl +5 -3
  110. package/source/css/_page/_home/category-bar.styl +162 -88
  111. package/source/css/_page/_home/home-top.styl +309 -263
  112. package/source/css/_page/_home/home.styl +34 -7
  113. package/source/css/_page/archive.styl +412 -0
  114. package/source/css/_page/category.styl +27 -1
  115. package/source/css/_page/index.styl +2 -0
  116. package/source/css/_page/links.styl +190 -0
  117. package/source/css/_page/other.styl +37 -0
  118. package/source/css/_post/index.styl +2 -1
  119. package/source/css/_post/meta.styl +245 -217
  120. package/source/css/_search/local-search.styl +158 -82
  121. package/source/css/var.styl +2 -2
  122. package/source/js/archive-page.js +191 -0
  123. package/source/js/core/actions.js +48 -0
  124. package/source/js/core/api.js +32 -0
  125. package/source/js/core/config.js +13 -0
  126. package/source/js/core/lifecycle.js +52 -0
  127. package/source/js/core/preloader.js +34 -0
  128. package/source/js/core/resources.js +65 -0
  129. package/source/js/covercolor/api.js +13 -103
  130. package/source/js/covercolor/ave.js +14 -77
  131. package/source/js/covercolor/local.js +22 -116
  132. package/source/js/covercolor/shared.js +102 -0
  133. package/source/js/friend_links.js +502 -0
  134. package/source/js/main.js +793 -177
  135. package/source/js/music.js +24 -14
  136. package/source/js/post_ai.js +13 -2
  137. package/source/js/right_menu.js +44 -24
  138. package/source/js/search/algolia.js +29 -21
  139. package/source/js/search/local.js +231 -266
  140. package/source/js/tw_cn.js +37 -12
  141. package/source/js/utils.js +37 -25
  142. package/layout/includes/widgets/randomlink.pug +0 -43
  143. package/scripts/filter/randomPosts.js +0 -16
@@ -8,7 +8,8 @@ include ./mixins/common.pug
8
8
  mixin siteName()
9
9
  +link('/', '', {
10
10
  id: 'site-name',
11
- title: _p('nav.site_name_title')
11
+ title: _p('nav.site_name_title'),
12
+ heotip: _p('nav.site_name_title')
12
13
  })
13
14
  case theme.site.name.class
14
15
  when 'i_class'
@@ -19,11 +20,11 @@ mixin siteName()
19
20
  span.title= theme.site.name.custom
20
21
  +icon('fas fa-home')
21
22
 
22
- nav#nav.show
23
+ nav#nav.show(data-solitude-action="onNavBlankClickCloseConsole" data-solitude-event="true")
23
24
  #nav-group
24
25
  #blog_name
25
26
  //- 分组导航按钮
26
- +conditionalWrapper(theme.nav.group)
27
+ if theme.nav.group && Object.keys(theme.nav.group).length > 0
27
28
  .back-home-button(tabindex="-1")
28
29
  +icon('fas fa-bars-progress', '', { class: 'back-home-button-icon' })
29
30
  include ./widgets/nav/group
@@ -34,7 +35,7 @@ nav#nav.show
34
35
  //- 页面名称遮罩
35
36
  #page-name-mask
36
37
  #page-name
37
- a#page-name-text(onclick="sco.toTop()")= title || config.title
38
+ a#page-name-text(data-solitude-action="toTop" title=_p('nav.backtop') heotip=_p('nav.backtop'))= title || config.title
38
39
 
39
40
  //- 主菜单
40
41
  #menus
@@ -1,11 +1,12 @@
1
1
  if site.data.about
2
2
  #about-page
3
3
  include ../widgets/page/about/authorinfo
4
- include ../widgets/page/about/contentinfo
5
- include ../widgets/page/about/skillsinfo
6
- include ../widgets/page/about/personalities
7
- include ../widgets/page/about/motto
8
- include ../widgets/page/about/hobbies
9
- include ../widgets/page/about/other
10
- include ../widgets/page/about/tenyear
11
- include ../widgets/page/about/award
4
+ .author-page-content
5
+ include ../widgets/page/about/contentinfo
6
+ include ../widgets/page/about/skillsinfo
7
+ include ../widgets/page/about/personalities
8
+ include ../widgets/page/about/motto
9
+ include ../widgets/page/about/hobbies
10
+ include ../widgets/page/about/other
11
+ include ../widgets/page/about/tenyear
12
+ include ../widgets/page/about/award
@@ -12,7 +12,7 @@ if theme.brevity.enable
12
12
  span.bber_nick= config.author
13
13
  time.datetime.bber_date(datetime=moment(item.date).format())
14
14
  if theme.comment.use && item.content
15
- a.bber-reply.goComment(onclick=`sco.toTalk('${item.content}')`)
15
+ a.bber-reply.goComment(data-solitude-action="toTalk" data-solitude-value=item.content)
16
16
  i.solitude.fas.fa-comment
17
17
 
18
18
  #bber-content
@@ -52,7 +52,7 @@ if theme.brevity.enable
52
52
  i.solitude.fas.fa-link
53
53
  = _p('essay.link')
54
54
  if theme.comment.use && item.content
55
- a.bber-reply(onclick=`sco.toTalk('${item.content}')`)
55
+ a.bber-reply(data-solitude-action="toTalk" data-solitude-value=item.content)
56
56
  i.solitude.fas.fa-comment
57
57
  #bber-tips
58
58
  if theme.brevity.strip === -1
@@ -1,16 +1,28 @@
1
1
  - var $data = page.data
2
+ - const linksPageData = site.data[$data]
3
+ - const linksGroups = linksPageData && Array.isArray(linksPageData.links) ? linksPageData.links : []
4
+ - const linksTotal = linksGroups.reduce((count, group) => count + (Array.isArray(group.link_list) ? group.link_list.length : 0), 0)
5
+ - const configuredLinksThreshold = Number(theme.page && theme.page.links && theme.page.links.async_threshold)
6
+ - const linksThreshold = Number.isInteger(configuredLinksThreshold) && configuredLinksThreshold >= 0 ? configuredLinksThreshold : 200
7
+ - const asyncLinks = linksTotal > linksThreshold
2
8
  if page.banner
3
9
  .flink#banners
4
10
  include ../widgets/page/links/banner
5
11
  .flink.article-container
6
- each data in site.data[$data].links
7
- h2= data.class_name + " (" + data.link_list.length + ")"
8
- .flink-desc= data.descr
9
- case data.type
10
- when 'card'
11
- include ../widgets/page/links/linksCard
12
- when 'item'
13
- include ../widgets/page/links/linksItem
14
- when 'discn'
15
- include ../widgets/page/links/linksDiscn
16
- != page.content
12
+ if asyncLinks
13
+ .friend-links-dynamic(data-friend-links-list)
14
+ .flink-loading-skeleton(role="status" aria-label=_p('link.loading'))
15
+ each item in [0, 1, 2, 3, 4, 5]
16
+ .flink-loading-item
17
+ else
18
+ each data in linksGroups
19
+ h2= data.class_name + " (" + data.link_list.length + ")"
20
+ .flink-desc= data.descr
21
+ case data.type
22
+ when 'card'
23
+ include ../widgets/page/links/linksCard
24
+ when 'item'
25
+ include ../widgets/page/links/linksItem
26
+ when 'discn'
27
+ include ../widgets/page/links/linksDiscn
28
+ != page.content
@@ -4,8 +4,3 @@ if theme.music.enable
4
4
  meting-js(id=theme.music.id server=theme.music.server type=theme.music.type mutex=theme.music.mutex ? "true" : "false" volume=theme.music.volume preload="none" data-lrctype="0" order=theme.music.order)
5
5
  .Music-loading
6
6
  div APlayer加载中...
7
- script(pjax).
8
- (async function () {
9
- if (typeof initializeMusicPlayer === "undefined") await utils.getScript('!{url_for(theme.cdn.music_js)}').then(() => initializeMusicPlayer())
10
- else initializeMusicPlayer()
11
- })()
@@ -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