hexo-theme-solitude 1.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 (173) hide show
  1. package/LICENSE +19 -0
  2. package/README.md +56 -0
  3. package/_config.yml +432 -0
  4. package/languages/en-US.yml +39 -0
  5. package/languages/zh-CN.yml +39 -0
  6. package/layout/404.ejs +34 -0
  7. package/layout/archive.ejs +10 -0
  8. package/layout/category.ejs +18 -0
  9. package/layout/index.ejs +20 -0
  10. package/layout/layout.ejs +35 -0
  11. package/layout/page/about.ejs +13 -0
  12. package/layout/page/categories.ejs +12 -0
  13. package/layout/page/circle.ejs +5 -0
  14. package/layout/page/echarts.ejs +14 -0
  15. package/layout/page/equipment.ejs +2 -0
  16. package/layout/page/links.ejs +57 -0
  17. package/layout/page/page.ejs +3 -0
  18. package/layout/page/rss.ejs +37 -0
  19. package/layout/page/says.ejs +16 -0
  20. package/layout/page/tags.ejs +12 -0
  21. package/layout/page/tlink.ejs +11 -0
  22. package/layout/page.ejs +45 -0
  23. package/layout/partial/body.ejs +8 -0
  24. package/layout/partial/compoment/about/authorinfo.ejs +18 -0
  25. package/layout/partial/compoment/about/award.ejs +57 -0
  26. package/layout/partial/compoment/about/contentinfo.ejs +33 -0
  27. package/layout/partial/compoment/about/hobbies.ejs +44 -0
  28. package/layout/partial/compoment/about/motto.ejs +17 -0
  29. package/layout/partial/compoment/about/other.ejs +68 -0
  30. package/layout/partial/compoment/about/personalities.ejs +11 -0
  31. package/layout/partial/compoment/about/skillsinfo.ejs +62 -0
  32. package/layout/partial/compoment/aside/aside.ejs +28 -0
  33. package/layout/partial/compoment/aside/asideAllInfo.ejs +6 -0
  34. package/layout/partial/compoment/aside/asideArchive.ejs +11 -0
  35. package/layout/partial/compoment/aside/asideFlipCard.ejs +8 -0
  36. package/layout/partial/compoment/aside/asideInfoCard.ejs +39 -0
  37. package/layout/partial/compoment/aside/asideNewestPost.ejs +31 -0
  38. package/layout/partial/compoment/aside/asidePower.ejs +31 -0
  39. package/layout/partial/compoment/aside/asideSwitch.ejs +35 -0
  40. package/layout/partial/compoment/aside/asideTag.ejs +5 -0
  41. package/layout/partial/compoment/aside/asideToc.ejs +11 -0
  42. package/layout/partial/compoment/aside/asideWebInfo.ejs +60 -0
  43. package/layout/partial/compoment/circle/angle.ejs +26 -0
  44. package/layout/partial/compoment/circle/banner.ejs +11 -0
  45. package/layout/partial/compoment/circle/content.ejs +22 -0
  46. package/layout/partial/compoment/dorakika/rightmenu.ejs +115 -0
  47. package/layout/partial/compoment/equipment/list.ejs +37 -0
  48. package/layout/partial/compoment/home/homeCategoryBar.ejs +11 -0
  49. package/layout/partial/compoment/home/postList.ejs +37 -0
  50. package/layout/partial/compoment/hometop/bbTimeList.ejs +15 -0
  51. package/layout/partial/compoment/hometop/categoryGroup.ejs +19 -0
  52. package/layout/partial/compoment/hometop/groupTag.ejs +30 -0
  53. package/layout/partial/compoment/hometop/topGroup.ejs +48 -0
  54. package/layout/partial/compoment/inject/body.ejs +57 -0
  55. package/layout/partial/compoment/inject/head.ejs +19 -0
  56. package/layout/partial/compoment/links/banner.ejs +42 -0
  57. package/layout/partial/compoment/links/linksCard.ejs +27 -0
  58. package/layout/partial/compoment/links/linksItem.ejs +21 -0
  59. package/layout/partial/compoment/mixins/articleSort.ejs +26 -0
  60. package/layout/partial/compoment/mixins/pagination.ejs +11 -0
  61. package/layout/partial/compoment/nav/left.ejs +22 -0
  62. package/layout/partial/compoment/nav/menu.ejs +25 -0
  63. package/layout/partial/compoment/nav/right.ejs +42 -0
  64. package/layout/partial/compoment/post/award.ejs +52 -0
  65. package/layout/partial/compoment/post/copyright.ejs +37 -0
  66. package/layout/partial/compoment/post/postMeta.ejs +83 -0
  67. package/layout/partial/compoment/post/postNav.ejs +41 -0
  68. package/layout/partial/compoment/post/wave.ejs +14 -0
  69. package/layout/partial/compoment/says/banner.ejs +10 -0
  70. package/layout/partial/compoment/says/saysBottom.ejs +18 -0
  71. package/layout/partial/compoment/says/saysContent.ejs +11 -0
  72. package/layout/partial/compoment/third-party/comments/comment.ejs +12 -0
  73. package/layout/partial/compoment/third-party/comments/twikoo.ejs +29 -0
  74. package/layout/partial/compoment/third-party/comments/twikoo_k.ejs +29 -0
  75. package/layout/partial/compoment/third-party/music.ejs +5 -0
  76. package/layout/partial/compoment/third-party/pjax.ejs +31 -0
  77. package/layout/partial/compoment/third-party/search/algolia-search.ejs +20 -0
  78. package/layout/partial/compoment/third-party/search/index.ejs +10 -0
  79. package/layout/partial/compoment/third-party/search/local-search.ejs +22 -0
  80. package/layout/partial/compoment/tlink/banner.ejs +10 -0
  81. package/layout/partial/console.ejs +62 -0
  82. package/layout/partial/footer.ejs +107 -0
  83. package/layout/partial/head.ejs +37 -0
  84. package/layout/partial/header.ejs +6 -0
  85. package/layout/partial/hometop.ejs +15 -0
  86. package/layout/partial/loading.ejs +86 -0
  87. package/layout/partial/nav.ejs +34 -0
  88. package/layout/partial/pwa.ejs +40 -0
  89. package/layout/partial/sidebar.ejs +31 -0
  90. package/layout/post.ejs +36 -0
  91. package/layout/tag.ejs +19 -0
  92. package/package.json +24 -0
  93. package/scripts/event/init.js +22 -0
  94. package/scripts/event/page.js +40 -0
  95. package/scripts/event/welcome.js +15 -0
  96. package/scripts/filter/checkThemeConfig.js +18 -0
  97. package/scripts/filter/default.js +23 -0
  98. package/scripts/filter/katex.js +25 -0
  99. package/scripts/filter/lazyload.js +11 -0
  100. package/scripts/filter/randomPosts.js +9 -0
  101. package/scripts/helper/charts.js +397 -0
  102. package/scripts/helper/getArchiveLength.js +18 -0
  103. package/scripts/helper/randomLinks.js +16 -0
  104. package/scripts/helper/related_post.js +91 -0
  105. package/scripts/helper/themeJsExport.js +77 -0
  106. package/scripts/tags/bvideo.js +42 -0
  107. package/scripts/tags/expand.js +4 -0
  108. package/scripts/tags/fold.js +19 -0
  109. package/scripts/tags/link.js +17 -0
  110. package/scripts/tags/note.js +3 -0
  111. package/scripts/tags/tabs.js +61 -0
  112. package/scripts/tags/timeline.js +35 -0
  113. package/source/css/commentBarrage.css +174 -0
  114. package/source/css/custom.css +901 -0
  115. package/source/css/main.css +16471 -0
  116. package/source/css/search/algolia-search.css +141 -0
  117. package/source/css/search/local-search.css +138 -0
  118. package/source/css/var.css +186 -0
  119. package/source/img/default.png +0 -0
  120. package/source/img/loading.gif +0 -0
  121. package/source/img/power.png +0 -0
  122. package/source/img/pwa/180.png +0 -0
  123. package/source/img/pwa/192.png +0 -0
  124. package/source/img/pwa/512.png +0 -0
  125. package/source/img/pwa/logo.png +0 -0
  126. package/source/img/pwa/siteicon/splash-1125x2436.png +0 -0
  127. package/source/img/pwa/siteicon/splash-1136x640.png +0 -0
  128. package/source/img/pwa/siteicon/splash-1170x2532.png +0 -0
  129. package/source/img/pwa/siteicon/splash-1179x2556.png +0 -0
  130. package/source/img/pwa/siteicon/splash-1242x2208.png +0 -0
  131. package/source/img/pwa/siteicon/splash-1242x2688.png +0 -0
  132. package/source/img/pwa/siteicon/splash-1248x2778.png +0 -0
  133. package/source/img/pwa/siteicon/splash-1290x2796.png +0 -0
  134. package/source/img/pwa/siteicon/splash-1334x750.png +0 -0
  135. package/source/img/pwa/siteicon/splash-1536x2048.png +0 -0
  136. package/source/img/pwa/siteicon/splash-1620x2160.png +0 -0
  137. package/source/img/pwa/siteicon/splash-1668x2224.png +0 -0
  138. package/source/img/pwa/siteicon/splash-1668x2388.png +0 -0
  139. package/source/img/pwa/siteicon/splash-1792x828.png +0 -0
  140. package/source/img/pwa/siteicon/splash-2048x1536.png +0 -0
  141. package/source/img/pwa/siteicon/splash-2048x2732.png +0 -0
  142. package/source/img/pwa/siteicon/splash-2160x1620.png +0 -0
  143. package/source/img/pwa/siteicon/splash-2208x1242.png +0 -0
  144. package/source/img/pwa/siteicon/splash-2224x1668.png +0 -0
  145. package/source/img/pwa/siteicon/splash-2388x1668.png +0 -0
  146. package/source/img/pwa/siteicon/splash-2436x1125.png +0 -0
  147. package/source/img/pwa/siteicon/splash-2532x1170.png +0 -0
  148. package/source/img/pwa/siteicon/splash-2556x1179.png +0 -0
  149. package/source/img/pwa/siteicon/splash-2688x1242.png +0 -0
  150. package/source/img/pwa/siteicon/splash-2732x2048.png +0 -0
  151. package/source/img/pwa/siteicon/splash-2778x1248.png +0 -0
  152. package/source/img/pwa/siteicon/splash-2796x1290.png +0 -0
  153. package/source/img/pwa/siteicon/splash-640x1136.png +0 -0
  154. package/source/img/pwa/siteicon/splash-750x1334.png +0 -0
  155. package/source/img/pwa/siteicon/splash-828x1792.png +0 -0
  156. package/source/img/theme/avatar.png +0 -0
  157. package/source/js/circle.js +1828 -0
  158. package/source/js/commentBarrage.js +148 -0
  159. package/source/js/extend/console/comment.js +99 -0
  160. package/source/js/extend/covercolor/local.js +150 -0
  161. package/source/js/extend/covercolor/web.js +137 -0
  162. package/source/js/extend/search/algolia-search.js +136 -0
  163. package/source/js/extend/search/local-search.js +160 -0
  164. package/source/js/main.js +705 -0
  165. package/source/js/post_ai.js +517 -0
  166. package/source/js/utils.js +153 -0
  167. package/source/lib/bundle.js +27 -0
  168. package/source/lib/friends_post.js +98 -0
  169. package/source/lib/lazyload.js +1 -0
  170. package/source/lib/snackbar.js +16 -0
  171. package/source/lib/snackbar.min.css +1 -0
  172. package/source/lib/view-image.js +13 -0
  173. package/source/lib/waterfall.min.js +1 -0
@@ -0,0 +1,29 @@
1
+ <script>
2
+ async function initComment(){
3
+ var initOptions = Object.assign(
4
+ <%- JSON.stringify(theme.comment.twikoo || {}) %>,
5
+ {
6
+ el: '#comment',
7
+ onCommentLoaded: function() {
8
+ GLOBALCONFIG.lightbox && sco.lightbox('#article-container img, #twikoo .tk-content img:not(.tk-owo-emotion)')
9
+ }
10
+ }
11
+ )
12
+ await twikoo.init(initOptions)
13
+ <% if(theme.post.meta.comment && is_post()){ %>
14
+ var countOptions = Object.assign(
15
+ <%- JSON.stringify(theme.comment.twikoo || {}) %>,
16
+ {
17
+ urls: [window.location.pathname],
18
+ includeReply: false
19
+ }
20
+ )
21
+ const res = await twikoo.getCommentsCount(countOptions)
22
+ try{
23
+ document.getElementById('twikoo-count').innerText = res[0].count
24
+ }catch (e) {
25
+ document.getElementById('twikoo-count').innerText = '加载错误'
26
+ }
27
+ <% } %>
28
+ }
29
+ </script>
@@ -0,0 +1,29 @@
1
+ <script>
2
+ async function initComment(){
3
+ var initOptions = Object.assign(
4
+ <%- JSON.stringify(theme.comment.twikoo || {}) %>,
5
+ {
6
+ el: '#comment',
7
+ onCommentLoaded: function() {
8
+ GLOBALCONFIG.lightbox && sco.lightbox('#article-container img, #twikoo .tk-content img:not(.tk-owo-emotion)')
9
+ }
10
+ }
11
+ )
12
+ await twikoo.init(initOptions)
13
+ <% if(theme.post.meta.comment && is_post()){ %>
14
+ var countOptions = Object.assign(
15
+ <%- JSON.stringify(theme.comment.twikoo || {}) %>,
16
+ {
17
+ urls: [window.location.pathname],
18
+ includeReply: false
19
+ }
20
+ )
21
+ const res = await twikoo.getCommentsCount(countOptions)
22
+ try{
23
+ document.getElementById('twikoo-count').innerText = res[0].count
24
+ }catch (e) {
25
+ document.getElementById('twikoo-count').innerText = '加载错误'
26
+ }
27
+ <% } %>
28
+ }
29
+ </script>
@@ -0,0 +1,5 @@
1
+ <div class="needEndHide" id="nav-music" onclick="sco.musicToggle()">
2
+ <div id="nav-music-hoverTips">音乐已暂停</div>
3
+ <meting-js id="<%= theme.thirdparty.aplayer.id %>" server="<%= theme.thirdparty.aplayer.server %>" type="playlist" mutex="true"
4
+ preload="none" data-lrctype="0" order="random" theme="var(--sco-main)"></meting-js>
5
+ </div>
@@ -0,0 +1,31 @@
1
+ <script>
2
+ let pjaxSelectors = [
3
+ 'title',
4
+ '#body-wrap',
5
+ '#site-config',
6
+ 'meta[name="description"]',
7
+ '#js-pjax'
8
+ ]
9
+
10
+ const pjax = new Pjax({
11
+ elements: 'a:not([target="_blank"])',
12
+ selectors: pjaxSelectors,
13
+ cacheBust: false,
14
+ analytics: false,
15
+ scrollRestoration: false
16
+ })
17
+
18
+ document.querySelectorAll('script[data-pjax]').forEach(item => {
19
+ const newScript = document.createElement('script')
20
+ const content = item.text || item.textContent || item.innerHTML || ""
21
+ Array.from(item.attributes).forEach(attr => newScript.setAttribute(attr.name, attr.value))
22
+ newScript.appendChild(document.createTextNode(content))
23
+ item.parentNode.replaceChild(newScript, item)
24
+ })
25
+
26
+ document.addEventListener('pjax:error', (e) => {
27
+ if (e.request.status === 404) {
28
+ pjax.loadUrl('/404.html')
29
+ }
30
+ })
31
+ </script>
@@ -0,0 +1,20 @@
1
+ <div id="algolia-search">
2
+ <div class="search-dialog">
3
+ <nav class="search-nav">
4
+ <span class="search-dialog-title">搜索</span>
5
+ <button class="search-close-button">
6
+ <i class="ri-time-fill"></i>
7
+ </button>
8
+ </nav>
9
+ <div class="search-wrap">
10
+ <div class="search-box" id="search-input"></div>
11
+ <div id="search-results">
12
+ <div id="algolia-hits">
13
+ </div>
14
+ <div class="algolia-stats"></div>
15
+ <div class="algolia-poweredBy" style="display: none"></div>
16
+ </div>
17
+ </div>
18
+ </div>
19
+ <div id="search-mask"></div>
20
+ </div>
@@ -0,0 +1,10 @@
1
+ <% if(theme.thirdparty.search.local_search.enable){ %>
2
+ <%- partial('partial/compoment/third-party/search/local-search') %>
3
+ <%- css('/css/search/local-search.css') %>
4
+ <%- js('/js/extend/search/local-search.js') %>
5
+ <% } %>
6
+ <% if(theme.thirdparty.search.algolia_search.enable){ %>
7
+ <%- partial('partial/compoment/third-party/search/algolia-search') %>
8
+ <%- css('/css/search/algolia-search') %>
9
+ <%- js('/js/extend/search/algolia-search.js') %>
10
+ <% } %>
@@ -0,0 +1,22 @@
1
+ <div id="local-search">
2
+ <div class="search-dialog">
3
+ <nav class="search-nav">
4
+ <span class="search-dialog-title">搜索</span>
5
+ <button class="search-close-button">
6
+ <i class="ri-time-fill"></i>
7
+ </button>
8
+ </nav>
9
+ <div id="loading-database">
10
+ <i class="ri-loader-2-fill"></i>
11
+ <span>加载中</span>
12
+ </div>
13
+ <div class="search-wrap">
14
+ <div class="search-box">
15
+ <input class="search-box-input" placeholder="<%= __('search.placeholder') %>" type="text" id="search-input" autocomplete="off" spellcheck="false" autocorrect="off" autocapitalize="off">
16
+ </div>
17
+ <div id="loading-status"></div>
18
+ <div id="search-results"></div>
19
+ </div>
20
+ </div>
21
+ <div id="search-mask"></div>
22
+ </div>
@@ -0,0 +1,10 @@
1
+ <div class="author-content author-content-item essayPage single nolazyload" style="background: url(<%= page.cover %>) no-repeat center;background-size: cover;">
2
+ <div class="card-content">
3
+ <div class="author-content-item-tips"><%= page.title %></div>
4
+ <span class="author-content-item-title"><%= page.desc %></span>
5
+ <div class="content-bottom">
6
+ <div class="tips"><%- page.tipl %></div>
7
+ <div class="tips"><%- page.tipr %></div>
8
+ </div>
9
+ </div>
10
+ </div>
@@ -0,0 +1,62 @@
1
+ <div id="console" style="zoom: 1;" class="">
2
+ <div class="close-btn" onclick="sco.hideConsole()" href="javascript:void(0);">
3
+ <i class="ri-close-fill"></i>
4
+ </div>
5
+ <% if(theme.thirdparty.consolePlus){ %>
6
+ <div class="console-card-group">
7
+ <div class="console-card-group-left">
8
+ <div class="console-card" id="card-newest-comments" onclick="sco.hideConsole()">
9
+ <div class="card-content">
10
+ <div class="author-content-item-tips">互动</div>
11
+ <div class="author-content-item-title">最新评论</div>
12
+ </div>
13
+ <div class="aside-list"></div>
14
+ </div>
15
+
16
+ </div>
17
+ <div class="console-card-group-right">
18
+ <div class="console-card tags" onclick="sco.hideConsole()">
19
+ <div class="card-content">
20
+ <div class="author-content-item-tips">标签</div>
21
+ <div class="author-content-item-title">寻找感兴趣的领域</div>
22
+ </div>
23
+ <div class="card-tag-cloud">
24
+ <% site.tags.data.forEach(data => { %>
25
+ <a href="<%= url_for(data.path) %>"
26
+ style="font-size: 0.8rem; color: #d3d3d3"><%= data.name %>
27
+ <sup><%= data.length %></sup></a>
28
+ <% }) %>
29
+ </div>
30
+ </div>
31
+ <div class="console-card history" onclick="sco.hideConsole()">
32
+ <%- partial('partial/compoment/aside/asideArchive', {type: 'month'}) %>
33
+ </div>
34
+ </div>
35
+ </div>
36
+ <% } %>
37
+
38
+ <div class="button-group">
39
+ <div class="console-btn-item">
40
+ <a class="darkmode_switchbutton" onclick="sco.switchDarkMode()" title="显示模式切换"
41
+ href="javascript:void(0);" rel="external nofollow" data-pjax-state="">
42
+ <i class="ri-contrast-2-fill" style="font-size: 1rem;"></i>
43
+ </a>
44
+ </div>
45
+ <% if(theme.thirdparty.aplayer.enable){ %>
46
+ <div class="console-btn-item" id="consoleMusic" onclick="sco.musicToggle()" title="音乐开关">
47
+ <a class="music-switch">
48
+ <i class="ri-disc-fill"></i>
49
+ </a>
50
+ </div>
51
+ <% } %>
52
+ <% if(theme.comment.enable) { %>
53
+ <div class="console-btn-item on" id="consoleCommentBarrage" onclick="sco.switchCommentBarrage()"
54
+ title="热评开关">
55
+ <a class="commentBarrage">
56
+ <i class="ri-message-3-fill"></i>
57
+ </a>
58
+ </div>
59
+ <% }%>
60
+ </div>
61
+ <div class="console-mask" onclick="sco.hideConsole()" href="javascript:void(0);" rel="external nofollow"></div>
62
+ </div>
@@ -0,0 +1,107 @@
1
+ <div id="sco-footer-bar">
2
+ <div class="footer-logo">
3
+ <% if (theme.site.name.class === 'i_class') { %>
4
+ <i class="<%= theme.site.name.custom %>" style="font-size: 16px;"></i>
5
+ <% } else if (theme.site.name.class === 'img') { %>
6
+ <i style="background-image: url('<%= url_for(theme.site.name.custom) %>')"></i>
7
+ <% } else if (theme.site.name.class === 'text') { %>
8
+ <span class="scoicon"><%= theme.site.name.custom %></span>
9
+ <% } %>
10
+ </div>
11
+ <div class="footer-bar-description">来自 <%- config.title %> 最新设计与科技的文章</div>
12
+ <a class="footer-bar-link" href="/" data-pjax-state="">了解更多</a>
13
+ </div>
14
+ <div id="footer_deal">
15
+ <% for(const i in theme.footer.information.left){ %>
16
+ <a class="deal_link" href="<%= url_for(theme.footer.information.left[i].url) %>" rel="external nofollow"
17
+ title="<%= i %>">
18
+ <i class="<%= theme.footer.information.left[i].icon %>"></i>
19
+ </a>
20
+ <% } %>
21
+ <img class="footer_mini_logo" src="<%= theme.site.icon %>"
22
+ title="返回顶部" onclick="sco.toTop()">
23
+ <% for(const i in theme.footer.information.right){ %>
24
+ <a class="deal_link" href="<%= url_for(theme.footer.information.right[i].url) %>" rel="external nofollow"
25
+ title="<%= i %>">
26
+ <i class="<%= theme.footer.information.right[i].icon %>"></i>
27
+ </a>
28
+ <% } %>
29
+ </div>
30
+ <div id="sco-footer">
31
+ <% for(const x in theme.footer.group){ %>
32
+ <div class="footer-group">
33
+ <h3 class="footer-title"><%= x %></h3>
34
+ <div class="footer-links">
35
+ <% for(const y in theme.footer.group[x]){ %>
36
+ <a class="footer-item" href="<%= url_for(theme.footer.group[x][y]) %>" title="<%= y %>"
37
+ rel="noopener external nofollow noreferrer"><%= y %></a>
38
+ <% } %>
39
+ </div>
40
+ </div>
41
+ <% } %>
42
+ <% if(theme.footer.randomlink){ %>
43
+ <div class="footer-group">
44
+ <div class="footer-title-group">
45
+ <h3 class="footer-title">友链</h3>
46
+ <a class="random-friends-btn" href="javascript:randomLinksList();" rel="external nofollow">
47
+ <i class="ri-refresh-line"></i>
48
+ </a>
49
+ </div>
50
+ <div class="footer-links" id="friend-links-in-footer">
51
+ </div>
52
+ </div>
53
+ <% } %>
54
+ </div>
55
+ <div id="footer-bar">
56
+ <div class="footer-bar-links">
57
+ <div class="footer-bar-left">
58
+ <div id="footer-bar-tips">
59
+ <% if(moment(theme.aside.siteinfo.runtime).year() === new Date().getFullYear()){ %>
60
+ <div class="copyright">© <%= moment(theme.aside.siteinfo.runtime).year() %>
61
+ By
62
+ <a class="footer-bar-link" href="/" rel="external nofollow"><%= config.author %></a>
63
+ </div>
64
+ <% }else{ %>
65
+ <div class="copyright">© <%= moment(theme.aside.siteinfo.runtime).year() %>
66
+ - <%= new Date().getFullYear() %> By
67
+ <a class="footer-bar-link" href="/" rel="external nofollow"><%= config.author %></a>
68
+ </div>
69
+ <% } %>
70
+ </div>
71
+ </div>
72
+ <div class="footer-bar-right">
73
+ <% if(theme.footer.rss.enable){ %>
74
+ <a class="footer-bar-link" href="/rss/" rel="external nofollow"
75
+ target="_self">订阅</a>
76
+ <% } %>
77
+ <a class="footer-bar-link" href="https://github.com/DuoSco/hexo-theme-solitude" rel="external nofollow"
78
+ target="_self">主题</a>
79
+ <% if(theme.site.icp){ %>
80
+ <a class="footer-bar-link" target="_blank" href="https://beian.miit.gov.cn/#/Integrated/index"
81
+ rel="noopener external nofollow noreferrer noopener">
82
+ <%= theme.site.icp %>
83
+ </a>
84
+ <% } %>
85
+ <a class="footer-bar-link cc" href="<%- theme.footer.license.url %>" target="_self" rel="external nofollow">
86
+ <i class="ri-copyright-line"></i>
87
+ <i class="ri-creative-commons-by-line"></i>
88
+ <i class="ri-creative-commons-nc-line"></i>
89
+ <i class="ri-creative-commons-nd-line"></i>
90
+ </a>
91
+ </div>
92
+ </div>
93
+ </div>
94
+ <div class="needEndHide" id="cookies-window">
95
+ <div class="cookies-window-title">协议提醒助手</div>
96
+ <div class="cookies-window-content">
97
+ <span class="cookies-tip">查看本站为你的个人隐私做出的努力</span>
98
+ <a class="cookies-link" href="/privacy/" title="本站如何保护你的隐私" data-pjax-state="">
99
+ <i class="heofont icon-arrow-right-circle-fill"></i>
100
+ </a>
101
+ </div>
102
+ </div>
103
+ <div class="comment-barrage">
104
+ </div>
105
+ <% if(theme.comment.enable){ %>
106
+ <%- js('/js/commentBarrage') %>
107
+ <% } %>
@@ -0,0 +1,37 @@
1
+ <% const cdn = theme.cdn.head %>
2
+
3
+ <meta charset="UTF-8">
4
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <%
7
+ var title = '', subtitle = ''
8
+ if (is_home()) {
9
+ title = config.title
10
+ } else if (is_archive()) title = '归档 ' + (page.year || '')
11
+ else if (is_category()) title = '分类 ' + page.category
12
+ else if (is_tag()) title = '标签 ' + page.tag
13
+ else if (page.type === '404') title = '404 ' + theme.errorpage.text
14
+ else if (is_page() || is_post()) title = page.title
15
+ if (is_home()) subtitle = config.subtitle ? ' - ' + config.subtitle : ''
16
+ else subtitle = title ? ' | ' + config.title : config.title
17
+ var description = page.desc || page.excerpt || config.description
18
+ -%>
19
+ <title><%= title + subtitle %></title>
20
+ <noscript>开启Javascript是必要的</noscript>
21
+ <link rel="icon" type="image/x-icon" href="<%= url_for(theme.site.siteIcon) %>">
22
+ <meta name="description" content="<%= description %>">
23
+ <% if (theme.pwa.enable) { %>
24
+ <%- partial('partial/pwa') %>
25
+ <% }else{ %>
26
+ <meta name="apple-mobile-web-app-title" content="<%= config.title %>">
27
+ <link rel="bookmark" href="<%= url_for(theme.site.siteIcon) %>">
28
+ <link rel="apple-touch-icon-precomposed" sizes="180x180" href="<%= url_for(theme.site.siteIcon) %>">
29
+ <% } %>
30
+ <link rel="stylesheet" href="/css/var.css">
31
+ <link rel="stylesheet" href="/css/main.css">
32
+ <link rel="stylesheet" href="/css/custom.css">
33
+ <%- partial('partial/compoment/inject/head', {cache: true}) %>
34
+ <% if (theme.extends.head) for (const i of theme.extends.head){ %>
35
+ <%- i %>
36
+ <% } %>
37
+ <%- export_config() %>
@@ -0,0 +1,6 @@
1
+ <header class="<%= is_post() ? 'post-bg' : 'not-top-img' %>" id="page-header">
2
+ <%- partial('partial/nav', {cache: true}) %>
3
+ <% if(is_post()){ %>
4
+ <%- partial('partial/compoment/post/postMeta') %>
5
+ <% } %>
6
+ </header>
@@ -0,0 +1,15 @@
1
+ <div class="recent-top-post-group" id="recent-top-post-group">
2
+ <div class="recent-post-top" id="recent-post-top">
3
+ <div id="bannerGroup">
4
+ <div id="banners">
5
+ <%- partial('partial/compoment/hometop/groupTag') %>
6
+ </div>
7
+ <div class="categoryGroup">
8
+ <%- partial('partial/compoment/hometop/categoryGroup') %>
9
+ </div>
10
+ </div>
11
+ <div class="topGroup">
12
+ <%- partial('partial/compoment/hometop/topGroup') %>
13
+ </div>
14
+ </div>
15
+ </div>
@@ -0,0 +1,86 @@
1
+ <div id="loading-box" onclick="preloader.endLoading();" class style="zoom: 1;">
2
+ <div class="loading-bg">
3
+ <img class="loading-img nolazyload" alt="loading image"
4
+ src="<%= theme.site.icon %>">
5
+ </div>
6
+ </div>
7
+ <script>
8
+ const preloader = {
9
+ endLoading: () => {
10
+ document.getElementById('loading-box').classList.add("loaded")
11
+ },
12
+ initLoading: () => {
13
+ document.getElementById('loading-box').classList.remove("loaded")
14
+ },
15
+ removePaceDone: () => {
16
+ document.getElementById('body').classList = 'pace-done'
17
+ }
18
+ }
19
+ window.addEventListener('load',()=> { preloader.endLoading() })
20
+ document.addEventListener('pjax:send', () => { preloader.initLoading() })
21
+ document.addEventListener('pjax:complete', () => { preloader.endLoading() })
22
+ </script>
23
+ <style>
24
+ #loading-box {
25
+ -webkit-user-select: none;
26
+ }
27
+
28
+ #loading-box .loading-bg {
29
+ display: flex;
30
+ width: 100%;
31
+ height: 100%;
32
+ position: fixed;
33
+ background: var(--sco-background);
34
+ z-index: 1999;
35
+ opacity: 1;
36
+ transition: 0.2s;
37
+ pointer-events: all;
38
+ animation: showLoading 0.3s 0s backwards;
39
+ }
40
+
41
+ #loading-box.loaded .loading-bg {
42
+ pointer-events: none;
43
+ transition: 0.2s;
44
+ animation: hideLoading 0.3s 0s forwards;
45
+ }
46
+
47
+ #loading-box .loading-img {
48
+ width: 100px;
49
+ margin: auto;
50
+ animation-duration: 0.2s;
51
+ animation-name: loadingAction;
52
+ border-radius: 50px;
53
+ animation-iteration-count: infinite;
54
+ animation-direction: alternate;
55
+ }
56
+
57
+ @keyframes loadingAction {
58
+ from {
59
+ opacity: 1;
60
+ }
61
+
62
+ to {
63
+ opacity: 0.6;
64
+ }
65
+ }
66
+
67
+ @keyframes hideLoading {
68
+ from {
69
+ opacity: 1;
70
+ }
71
+
72
+ to {
73
+ opacity: 0;
74
+ }
75
+ }
76
+
77
+ @keyframes showLoading {
78
+ from {
79
+ opacity: 0;
80
+ }
81
+
82
+ to {
83
+ opacity: 1;
84
+ }
85
+ }
86
+ </style>
@@ -0,0 +1,34 @@
1
+ <nav id="nav" class="show">
2
+ <div id="nav-group">
3
+ <div id="blog_name">
4
+ <% if(theme.nav.left.enable){ %>
5
+ <div class="back-home-button" tabindex="-1">
6
+ <i class="back-home-button-icon scoicon ri-apps-fill"></i>
7
+ <%- partial('partial/compoment/nav/left') %>
8
+ </div>
9
+ <% } %>
10
+ <a id="site-name" href="/" title="返回博客主页" target="_self">
11
+ <% if (theme.site.name.class === 'i_class') { %>
12
+ <i class="<%= theme.site.name.custom %>" style="font-size: 16px;"></i>
13
+ <% } else if (theme.site.name.class === 'img') { %>
14
+ <i style="background-image: url('<%= url_for(theme.site.name.custom) %>')"></i>
15
+ <% } else if (theme.site.name.class === 'text') { %>
16
+ <span class="scoicon"><%= theme.site.name.custom %></span>
17
+ <% } %>
18
+ </a>
19
+ </div>
20
+ <div id="page-name-mask">
21
+ <div id="page-name">
22
+ <a id="page-name-text" onclick="sco.toTop()"><%= page.title || config.title %></a>
23
+ </div>
24
+ </div>
25
+ <div id="menus">
26
+ <%- partial('partial/compoment/nav/menu') %>
27
+ </div>
28
+ <div id="nav-left">
29
+ </div>
30
+ <div id="nav-right">
31
+ <%- partial('partial/compoment/nav/right') %>
32
+ </div>
33
+ </div>
34
+ </nav>
@@ -0,0 +1,40 @@
1
+ <meta name="theme-color" content="<%- theme.pwa.theme_color %>">
2
+ <link rel="manifest" href="<%- theme.pwa.manifest %>">
3
+ <% if (theme.pwa.theme_color) { %><meta name="msapplication-TileColor" content="<%- theme.pwa.theme_color %>"><% } %>
4
+ <% if (theme.pwa.mask_icon) { %><link rel="mask-icon" href="<%- theme.pwa.mask_icon %>" color="<%- theme.pwa.theme_color %>"><% } %>
5
+ <% if (theme.pwa.apple_touch_icon) { %><link rel="apple-touch-icon" sizes="180x180" href="<%- theme.pwa.apple_touch_icon %>">
6
+ <link rel="apple-touch-icon-precomposed" sizes="180x180" href="<%- theme.pwa.apple_touch_icon %>">
7
+ <meta name="apple-mobile-web-app-title" content="<%= config.title %>"><% } %>
8
+ <% if (theme.pwa.favicon_16_16) { %><link rel="icon" type="image/png" sizes="16x16" href="<%- theme.pwa.favicon_16_16 %>"><% } %>
9
+ <% if (theme.pwa.favicon_32_32) { %><link rel="icon" type="image/png" sizes="32x32" href="<%- theme.pwa.favicon_32_32 %>"><% } %>
10
+ <% if (theme.pwa.bookmark_icon) { %><link rel="bookmark" href="<%- theme.pwa.bookmark_icon %>"><% } %><% if (theme.pwa.startup_image_enable) { %>
11
+ <% if (theme.pwa.favicon_2048_2732) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_2048_2732 %>" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"><% } %>
12
+ <% if (theme.pwa.favicon_2732_2048) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_2732_2048 %>" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"><% } %>
13
+ <% if (theme.pwa.favicon_1668_2388) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_1668_2388 %>" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"><% } %>
14
+ <% if (theme.pwa.favicon_2388_1668) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_2388_1668 %>" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"><% } %>
15
+ <% if (theme.pwa.favicon_1536_2048) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_1536_2048 %>" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"><% } %>
16
+ <% if (theme.pwa.favicon_2048_1536) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_2048_1536 %>" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"><% } %>
17
+ <% if (theme.pwa.favicon_1668_2224) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_1668_2224 %>" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"><% } %>
18
+ <% if (theme.pwa.favicon_1668_2224) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_1668_2224 %>" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"><% } %>
19
+ <% if (theme.pwa.favicon_1620_2160) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_1620_2160 %>" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"><% } %>
20
+ <% if (theme.pwa.favicon_2160_1620) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_2160_1620 %>" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"><% } %>
21
+ <% if (theme.pwa.favicon_1290_2796) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_1290_2796 %>" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"><% } %>
22
+ <% if (theme.pwa.favicon_2796_1290) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_2796_1290 %>" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"><% } %>
23
+ <% if (theme.pwa.favicon_1179_2556) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_1179_2556 %>" media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"><% } %>
24
+ <% if (theme.pwa.favicon_2556_1179) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_2556_1179 %>" media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"><% } %>
25
+ <% if (theme.pwa.favicon_1248_2778) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_1248_2778 %>" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"><% } %>
26
+ <% if (theme.pwa.favicon_2778_1248) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_2778_1248 %>" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"><% } %>
27
+ <% if (theme.pwa.favicon_1170_2532) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_1170_2532 %>" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"><% } %>
28
+ <% if (theme.pwa.favicon_2532_1170) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_2532_1170 %>" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"><% } %>
29
+ <% if (theme.pwa.favicon_1125_2436) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_1125_2436 %>" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"><% } %>
30
+ <% if (theme.pwa.favicon_2436_1125) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_2436_1125 %>" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"><% } %>
31
+ <% if (theme.pwa.favicon_1242_2688) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_1242_2688 %>" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"><% } %>
32
+ <% if (theme.pwa.favicon_2688_1242) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_2688_1242 %>" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"><% } %>
33
+ <% if (theme.pwa.favicon_828_1792) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_828_1792 %>" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"><% } %>
34
+ <% if (theme.pwa.favicon_1792_828) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_1792_828 %>" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"><% } %>
35
+ <% if (theme.pwa.favicon_1242_2208) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_1242_2208 %>" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"><% } %>
36
+ <% if (theme.pwa.favicon_2208_1242) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_2208_1242 %>" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"><% } %>
37
+ <% if (theme.pwa.favicon_750_1334) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_750_1334 %>" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"><% } %>
38
+ <% if (theme.pwa.favicon_1334_750) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_1334_750 %>" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"><% } %>
39
+ <% if (theme.pwa.favicon_640_1136) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_640_1136 %>" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"><% } %>
40
+ <% if (theme.pwa.favicon_1136_640) { %><link rel="apple-touch-startup-image" href="<%- theme.pwa.favicon_1136_640 %>" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"><% } %><% } %>
@@ -0,0 +1,31 @@
1
+ <div id="sidebar" style="zoom: 1;">
2
+ <div id="menu-mask" style="display: none;"></div>
3
+ <div id="sidebar-menus" class>
4
+ <span class="sidebar-menu-item-title">功能</span>
5
+ <div class="sidebar-menu-item">
6
+ <a class="darkmode_switchbutton menu-child" onclick="sco.switchDarkMode()" title="显示模式切换"
7
+ href="javascript:void(0);" rel="external nofollow">
8
+ <i class="scoicon ri-contrast-2-fill" style="font-size: 1rem;"></i>
9
+ <span>显示模式</span>
10
+ </a>
11
+ </div>
12
+ <% if(theme.nav.left.enable){ %>
13
+ <%- partial('partial/compoment/nav/left') %>
14
+ <% } %>
15
+ <%- partial('partial/compoment/nav/menu') %>
16
+ <span class="sidebar-menu-item-title">标签</span>
17
+ <div class="card-widget card-tags card-archives card-webinfo card-allinfo">
18
+ <div class="item-headline">
19
+ <i class="scoicon ri-price-tag-3-fill"></i>
20
+ <span>标签</span>
21
+ </div>
22
+ <div class="card-tag-cloud">
23
+ <% site.tags.data.forEach(data => { %>
24
+ <a href="<%= url_for(data.path) %>" style="font-size: 1em; color: #d3d3d3"><%= data.name %>
25
+ <sup><%= data.length %></sup>
26
+ </a>
27
+ <% }) %>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ </div>
@@ -0,0 +1,36 @@
1
+ <main class="layout" id="content-inner">
2
+ <div id="post">
3
+ <article class="post-content" id="article-container">
4
+ <%- page.content %>
5
+ </article>
6
+ <%- partial('partial/compoment/post/copyright') %>
7
+
8
+ <div class="post-tools-right">
9
+ <div class="tag_share">
10
+ <div class="post-meta__tag-list">
11
+ <% page.tags.data.forEach(data => { %>
12
+ <a href="<%= url_for(data.path) %>" class="post-meta__tags">
13
+ <span class="tags-punctuation"></span>
14
+ <%= data.name %>
15
+ <span class="tagsPageCount"><%= data.length %></span>
16
+ </a>
17
+ <% }) %>
18
+ </div>
19
+ </div>
20
+ </div>
21
+
22
+ <%- partial('partial/compoment/post/postNav') %>
23
+
24
+ <%- related_posts(page, site.posts) %>
25
+
26
+ <% if(page.comment){ %>
27
+ <%- partial('partial/compoment/third-party/comments/comment') %>
28
+ <% } %>
29
+ </div>
30
+
31
+ <%- partial('partial/compoment/aside/aside') %>
32
+
33
+ <% if(theme.ai.enable){ %>
34
+ <script type="text/javascript" src="/js/post_ai.js"></script>
35
+ <% } %>
36
+ </main>