hexo-theme-redefine-x 2.8.5

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 (319) hide show
  1. package/.github/ISSUE_TEMPLATE/bug-chinese.yml +115 -0
  2. package/.github/ISSUE_TEMPLATE/bug-english.yml +106 -0
  3. package/.github/ISSUE_TEMPLATE/enhancement-chinese.yml +55 -0
  4. package/.github/ISSUE_TEMPLATE/enhancement-english.yml +55 -0
  5. package/.github/workflows/build-and-commit.yml +49 -0
  6. package/.github/workflows/npm-publish.yml +34 -0
  7. package/.github/workflows/stale-issues.yml +20 -0
  8. package/CHANGELOG_REDEFINE_X.md +236 -0
  9. package/CODE_OF_CONDUCT.md +128 -0
  10. package/CONTRIBUTING.md +51 -0
  11. package/DONATION.md +82 -0
  12. package/LICENSE +674 -0
  13. package/README.md +135 -0
  14. package/README_zh-CN.md +138 -0
  15. package/README_zh-TW.md +137 -0
  16. package/TODO.md +215 -0
  17. package/_config.yml +489 -0
  18. package/languages/en.yml +93 -0
  19. package/languages/es.yml +92 -0
  20. package/languages/fr.yml +92 -0
  21. package/languages/ja.yml +92 -0
  22. package/languages/zh-CN.yml +95 -0
  23. package/languages/zh-TW.yml +94 -0
  24. package/layout/404.ejs +1 -0
  25. package/layout/archive.ejs +1 -0
  26. package/layout/category.ejs +1 -0
  27. package/layout/components/comments/comment.ejs +22 -0
  28. package/layout/components/comments/giscus.ejs +42 -0
  29. package/layout/components/comments/gitalk.ejs +47 -0
  30. package/layout/components/comments/twikoo.ejs +50 -0
  31. package/layout/components/comments/waline.ejs +34 -0
  32. package/layout/components/footer/footer.ejs +99 -0
  33. package/layout/components/header/head.ejs +222 -0
  34. package/layout/components/header/navbar.ejs +163 -0
  35. package/layout/components/header/preloader.ejs +148 -0
  36. package/layout/components/header/progress-bar.ejs +12 -0
  37. package/layout/components/plugins/aplayer.ejs +3 -0
  38. package/layout/components/scripts.ejs +90 -0
  39. package/layout/components/sidebar/author.ejs +6 -0
  40. package/layout/components/sidebar/avatar.ejs +3 -0
  41. package/layout/components/sidebar/statistics.ejs +14 -0
  42. package/layout/components/swup.ejs +27 -0
  43. package/layout/index.ejs +1 -0
  44. package/layout/layout.ejs +13 -0
  45. package/layout/page.ejs +57 -0
  46. package/layout/pages/archive/archive.ejs +3 -0
  47. package/layout/pages/bookmarks/bookmarks.ejs +68 -0
  48. package/layout/pages/category/categories.ejs +11 -0
  49. package/layout/pages/category/category-detail.ejs +6 -0
  50. package/layout/pages/friends/friends-link.ejs +59 -0
  51. package/layout/pages/home/home-article.ejs +52 -0
  52. package/layout/pages/home/home-background.ejs +33 -0
  53. package/layout/pages/home/home-banner.ejs +234 -0
  54. package/layout/pages/home/home-content.ejs +62 -0
  55. package/layout/pages/home/home-sidebar.ejs +78 -0
  56. package/layout/pages/masonry/masonry.ejs +28 -0
  57. package/layout/pages/notfound/notfound.ejs +8 -0
  58. package/layout/pages/page-template.ejs +23 -0
  59. package/layout/pages/post/article-content.ejs +153 -0
  60. package/layout/pages/post/article-copyright.ejs +69 -0
  61. package/layout/pages/post/article-info.ejs +78 -0
  62. package/layout/pages/post/post-tools.ejs +17 -0
  63. package/layout/pages/post/toc.ejs +15 -0
  64. package/layout/pages/shuoshuo/essays.ejs +23 -0
  65. package/layout/pages/tag/tag-detail.ejs +6 -0
  66. package/layout/pages/tag/tags.ejs +24 -0
  67. package/layout/post.ejs +1 -0
  68. package/layout/tag.ejs +1 -0
  69. package/layout/tags.ejs +1 -0
  70. package/layout/utils/image-viewer.ejs +3 -0
  71. package/layout/utils/local-search.ejs +20 -0
  72. package/layout/utils/paginator.ejs +8 -0
  73. package/layout/utils/posts-list.ejs +28 -0
  74. package/layout/utils/side-tools.ejs +51 -0
  75. package/package.json +45 -0
  76. package/scripts/config-export.js +66 -0
  77. package/scripts/data-handle.js +37 -0
  78. package/scripts/events/404.js +16 -0
  79. package/scripts/events/welcome.js +141 -0
  80. package/scripts/filters/delete-mask-handle.js +27 -0
  81. package/scripts/filters/encrypt.js +202 -0
  82. package/scripts/filters/img-handle.js +9 -0
  83. package/scripts/filters/lazyload-handle.js +350 -0
  84. package/scripts/filters/lib/hbe.default.js +15 -0
  85. package/scripts/filters/link-handle.js +42 -0
  86. package/scripts/filters/stylus-handle.js +9 -0
  87. package/scripts/filters/table-handle.js +11 -0
  88. package/scripts/helpers/meta-helpers.js +38 -0
  89. package/scripts/helpers/page-helpers.js +153 -0
  90. package/scripts/helpers/recommendation-helpers.js +367 -0
  91. package/scripts/helpers/theme-helpers.js +251 -0
  92. package/scripts/helpers/waline-helpers.js +33 -0
  93. package/scripts/modules/btn.js +85 -0
  94. package/scripts/modules/btns.js +71 -0
  95. package/scripts/modules/folding.js +34 -0
  96. package/scripts/modules/note-large.js +72 -0
  97. package/scripts/modules/note.js +64 -0
  98. package/scripts/modules/tabs.js +99 -0
  99. package/source/assets/hbe.style.css +220 -0
  100. package/source/assets/odometer-theme-minimal.css +81 -0
  101. package/source/css/build/tailwind.css +2 -0
  102. package/source/css/common/animated.styl +71 -0
  103. package/source/css/common/basic.styl +239 -0
  104. package/source/css/common/codeblock/code-block.styl +158 -0
  105. package/source/css/common/codeblock/code-theme.styl +82 -0
  106. package/source/css/common/codeblock/highlight.styl +189 -0
  107. package/source/css/common/codeblock/hljs-themes/dark/a11y-dark.styl +18 -0
  108. package/source/css/common/codeblock/hljs-themes/dark/agate.styl +18 -0
  109. package/source/css/common/codeblock/hljs-themes/dark/atom-one-dark.styl +18 -0
  110. package/source/css/common/codeblock/hljs-themes/dark/github-dark.styl +18 -0
  111. package/source/css/common/codeblock/hljs-themes/dark/monokai-sublime.styl +18 -0
  112. package/source/css/common/codeblock/hljs-themes/dark/night-owl.styl +18 -0
  113. package/source/css/common/codeblock/hljs-themes/dark/nord.styl +18 -0
  114. package/source/css/common/codeblock/hljs-themes/dark/tokyo-night-dark.styl +18 -0
  115. package/source/css/common/codeblock/hljs-themes/dark/vs2015.styl +18 -0
  116. package/source/css/common/codeblock/hljs-themes/light/atom-one-light.styl +18 -0
  117. package/source/css/common/codeblock/hljs-themes/light/default.styl +18 -0
  118. package/source/css/common/codeblock/hljs-themes/light/github.styl +18 -0
  119. package/source/css/common/colors.styl +112 -0
  120. package/source/css/common/markdown.styl +337 -0
  121. package/source/css/common/redefine-theme.styl +65 -0
  122. package/source/css/common/theme.styl +72 -0
  123. package/source/css/common/variables.styl +145 -0
  124. package/source/css/layout/_modules/aplayer.styl +799 -0
  125. package/source/css/layout/_modules/buttons.styl +42 -0
  126. package/source/css/layout/_modules/folding.styl +180 -0
  127. package/source/css/layout/_modules/notes.styl +181 -0
  128. package/source/css/layout/_modules/tabs.styl +105 -0
  129. package/source/css/layout/_partials/404.styl +14 -0
  130. package/source/css/layout/_partials/archive-list.styl +49 -0
  131. package/source/css/layout/_partials/article-copyright-info.styl +27 -0
  132. package/source/css/layout/_partials/article-meta-info.styl +62 -0
  133. package/source/css/layout/_partials/comments/comment.styl +11 -0
  134. package/source/css/layout/_partials/comments/gitalk.styl +529 -0
  135. package/source/css/layout/_partials/comments/twikoo.styl +62 -0
  136. package/source/css/layout/_partials/comments/waline.styl +1151 -0
  137. package/source/css/layout/_partials/footer.styl +59 -0
  138. package/source/css/layout/_partials/home-banner.styl +48 -0
  139. package/source/css/layout/_partials/image-viewer.styl +37 -0
  140. package/source/css/layout/_partials/local-search.styl +137 -0
  141. package/source/css/layout/_partials/navbar.styl +309 -0
  142. package/source/css/layout/_partials/page-template.styl +147 -0
  143. package/source/css/layout/_partials/paginator.styl +65 -0
  144. package/source/css/layout/_partials/post-tools.styl +43 -0
  145. package/source/css/layout/_partials/progress-bar.styl +33 -0
  146. package/source/css/layout/_partials/side-tools.styl +87 -0
  147. package/source/css/layout/_partials/tagcloud.styl +136 -0
  148. package/source/css/layout/_partials/toc.styl +105 -0
  149. package/source/css/layout/animations.styl +42 -0
  150. package/source/css/layout/archive-content.styl +8 -0
  151. package/source/css/layout/article-content.styl +257 -0
  152. package/source/css/layout/bookmarks.styl +8 -0
  153. package/source/css/layout/category-content.styl +21 -0
  154. package/source/css/layout/category-list.styl +119 -0
  155. package/source/css/layout/home-content.styl +114 -0
  156. package/source/css/layout/home-sidebar.styl +126 -0
  157. package/source/css/layout/page.styl +144 -0
  158. package/source/css/layout/tag-content.styl +30 -0
  159. package/source/css/style.styl +26 -0
  160. package/source/css/tailwind.source.css +236 -0
  161. package/source/fontawesome/all.min.css +6 -0
  162. package/source/fontawesome/brands.min.css +6 -0
  163. package/source/fontawesome/duotone.min.css +6 -0
  164. package/source/fontawesome/fontawesome.min.css +6 -0
  165. package/source/fontawesome/light.min.css +6 -0
  166. package/source/fontawesome/regular.min.css +6 -0
  167. package/source/fontawesome/sharp-solid.min.css +6 -0
  168. package/source/fontawesome/solid.min.css +6 -0
  169. package/source/fontawesome/svg-with-js.min.css +6 -0
  170. package/source/fontawesome/thin.min.css +6 -0
  171. package/source/fontawesome/v4-font-face.min.css +6 -0
  172. package/source/fontawesome/v4-shims.min.css +6 -0
  173. package/source/fontawesome/v5-font-face.min.css +6 -0
  174. package/source/fonts/Chillax/Chillax-Variable.eot +0 -0
  175. package/source/fonts/Chillax/Chillax-Variable.ttf +0 -0
  176. package/source/fonts/Chillax/Chillax-Variable.woff +0 -0
  177. package/source/fonts/Chillax/Chillax-Variable.woff2 +0 -0
  178. package/source/fonts/Chillax/chillax.css +39 -0
  179. package/source/fonts/Geist/GeistVF.ttf +0 -0
  180. package/source/fonts/Geist/GeistVF.woff +0 -0
  181. package/source/fonts/Geist/GeistVF.woff2 +0 -0
  182. package/source/fonts/Geist/geist.css +16 -0
  183. package/source/fonts/GeistMono/GeistMonoVF.ttf +0 -0
  184. package/source/fonts/GeistMono/GeistMonoVF.woff +0 -0
  185. package/source/fonts/GeistMono/GeistMonoVF.woff2 +0 -0
  186. package/source/fonts/GeistMono/geist-mono.css +16 -0
  187. package/source/images/bookmark-placeholder.svg +9 -0
  188. package/source/images/loading.svg +5 -0
  189. package/source/images/redefine-avatar.svg +1 -0
  190. package/source/images/redefine-favicon.svg +1 -0
  191. package/source/images/redefine-logo.svg +1 -0
  192. package/source/images/redefine-logo.webp +0 -0
  193. package/source/images/redefine-og.webp +0 -0
  194. package/source/images/wallhaven-wqery6-dark.webp +0 -0
  195. package/source/images/wallhaven-wqery6-light.webp +0 -0
  196. package/source/js/build/layouts/bookmarkNav.js +2 -0
  197. package/source/js/build/layouts/bookmarkNav.js.map +1 -0
  198. package/source/js/build/layouts/categoryList.js +2 -0
  199. package/source/js/build/layouts/categoryList.js.map +1 -0
  200. package/source/js/build/layouts/essays.js +2 -0
  201. package/source/js/build/layouts/essays.js.map +1 -0
  202. package/source/js/build/layouts/lazyload.js +2 -0
  203. package/source/js/build/layouts/lazyload.js.map +1 -0
  204. package/source/js/build/layouts/navbarShrink.js +2 -0
  205. package/source/js/build/layouts/navbarShrink.js.map +1 -0
  206. package/source/js/build/layouts/toc.js +2 -0
  207. package/source/js/build/layouts/toc.js.map +1 -0
  208. package/source/js/build/libs/APlayer.min.js +2 -0
  209. package/source/js/build/libs/Swup.min.js +2 -0
  210. package/source/js/build/libs/SwupPreloadPlugin.min.js +1 -0
  211. package/source/js/build/libs/SwupProgressPlugin.min.js +1 -0
  212. package/source/js/build/libs/SwupScriptsPlugin.min.js +1 -0
  213. package/source/js/build/libs/SwupScrollPlugin.min.js +1 -0
  214. package/source/js/build/libs/SwupSlideTheme.min.js +1 -0
  215. package/source/js/build/libs/Typed.min.js +10 -0
  216. package/source/js/build/libs/anime.min.js +8 -0
  217. package/source/js/build/libs/mermaid.min.js +2314 -0
  218. package/source/js/build/libs/minimasonry.min.js +1 -0
  219. package/source/js/build/libs/moment-with-locales.min.js +2 -0
  220. package/source/js/build/libs/moment.min.js +2 -0
  221. package/source/js/build/libs/odometer.min.js +2 -0
  222. package/source/js/build/libs/pangu.min.js +9 -0
  223. package/source/js/build/libs/pjax.min.js +1 -0
  224. package/source/js/build/libs/waline.js +84 -0
  225. package/source/js/build/main.js +2 -0
  226. package/source/js/build/main.js.map +1 -0
  227. package/source/js/build/plugins/aplayer.js +2 -0
  228. package/source/js/build/plugins/aplayer.js.map +1 -0
  229. package/source/js/build/plugins/hbe.js +2 -0
  230. package/source/js/build/plugins/hbe.js.map +1 -0
  231. package/source/js/build/plugins/masonry.js +2 -0
  232. package/source/js/build/plugins/masonry.js.map +1 -0
  233. package/source/js/build/plugins/mermaid.js +2 -0
  234. package/source/js/build/plugins/mermaid.js.map +1 -0
  235. package/source/js/build/plugins/pangu.js +2 -0
  236. package/source/js/build/plugins/pangu.js.map +1 -0
  237. package/source/js/build/plugins/tabs.js +2 -0
  238. package/source/js/build/plugins/tabs.js.map +1 -0
  239. package/source/js/build/plugins/typed.js +2 -0
  240. package/source/js/build/plugins/typed.js.map +1 -0
  241. package/source/js/build/tools/codeBlock.js +2 -0
  242. package/source/js/build/tools/codeBlock.js.map +1 -0
  243. package/source/js/build/tools/imageViewer.js +2 -0
  244. package/source/js/build/tools/imageViewer.js.map +1 -0
  245. package/source/js/build/tools/lightDarkSwitch.js +2 -0
  246. package/source/js/build/tools/lightDarkSwitch.js.map +1 -0
  247. package/source/js/build/tools/localSearch.js +2 -0
  248. package/source/js/build/tools/localSearch.js.map +1 -0
  249. package/source/js/build/tools/runtime.js +2 -0
  250. package/source/js/build/tools/runtime.js.map +1 -0
  251. package/source/js/build/tools/scrollTopBottom.js +2 -0
  252. package/source/js/build/tools/scrollTopBottom.js.map +1 -0
  253. package/source/js/build/tools/tocToggle.js +2 -0
  254. package/source/js/build/tools/tocToggle.js.map +1 -0
  255. package/source/js/build/utils.js +2 -0
  256. package/source/js/build/utils.js.map +1 -0
  257. package/source/js/build.js +148 -0
  258. package/source/js/layouts/bookmarkNav.js +65 -0
  259. package/source/js/layouts/categoryList.js +53 -0
  260. package/source/js/layouts/essays.js +25 -0
  261. package/source/js/layouts/lazyload.js +199 -0
  262. package/source/js/layouts/navbarShrink.js +135 -0
  263. package/source/js/layouts/toc.js +115 -0
  264. package/source/js/libs/APlayer.min.js +2 -0
  265. package/source/js/libs/APlayer.min.js.map +1 -0
  266. package/source/js/libs/Swup.min.js +2 -0
  267. package/source/js/libs/Swup.min.js.map +1 -0
  268. package/source/js/libs/SwupPreloadPlugin.min.js +1 -0
  269. package/source/js/libs/SwupPreloadPlugin.min.js.map +1 -0
  270. package/source/js/libs/SwupProgressPlugin.min.js +1 -0
  271. package/source/js/libs/SwupScriptsPlugin.min.js +1 -0
  272. package/source/js/libs/SwupScrollPlugin.min.js +1 -0
  273. package/source/js/libs/SwupScrollPlugin.min.js.map +1 -0
  274. package/source/js/libs/SwupSlideTheme.min.js +1 -0
  275. package/source/js/libs/Typed.min.js +10 -0
  276. package/source/js/libs/anime.min.js +8 -0
  277. package/source/js/libs/mermaid.min.js +2314 -0
  278. package/source/js/libs/mermaid.min.js.map +7 -0
  279. package/source/js/libs/minimasonry.min.js +1 -0
  280. package/source/js/libs/moment-with-locales.min.js +2 -0
  281. package/source/js/libs/moment.min.js +2 -0
  282. package/source/js/libs/odometer.min.js +2 -0
  283. package/source/js/libs/pangu.min.js +9 -0
  284. package/source/js/libs/pjax.min.js +1 -0
  285. package/source/js/libs/waline.js +84 -0
  286. package/source/js/libs/waline.js.map +1 -0
  287. package/source/js/main.js +95 -0
  288. package/source/js/plugins/aplayer.js +33 -0
  289. package/source/js/plugins/hbe.js +350 -0
  290. package/source/js/plugins/masonry.js +115 -0
  291. package/source/js/plugins/mermaid.js +7 -0
  292. package/source/js/plugins/pangu.js +12 -0
  293. package/source/js/plugins/tabs.js +29 -0
  294. package/source/js/plugins/typed.js +62 -0
  295. package/source/js/tools/codeBlock.js +48 -0
  296. package/source/js/tools/imageViewer.js +194 -0
  297. package/source/js/tools/lightDarkSwitch.js +165 -0
  298. package/source/js/tools/localSearch.js +327 -0
  299. package/source/js/tools/runtime.js +28 -0
  300. package/source/js/tools/scrollTopBottom.js +34 -0
  301. package/source/js/tools/tocToggle.js +58 -0
  302. package/source/js/utils.js +383 -0
  303. package/source/webfonts/fa-brands-400.ttf +0 -0
  304. package/source/webfonts/fa-brands-400.woff2 +0 -0
  305. package/source/webfonts/fa-duotone-900.ttf +0 -0
  306. package/source/webfonts/fa-duotone-900.woff2 +0 -0
  307. package/source/webfonts/fa-light-300.ttf +0 -0
  308. package/source/webfonts/fa-light-300.woff2 +0 -0
  309. package/source/webfonts/fa-regular-400.ttf +0 -0
  310. package/source/webfonts/fa-regular-400.woff2 +0 -0
  311. package/source/webfonts/fa-sharp-solid-900.ttf +0 -0
  312. package/source/webfonts/fa-sharp-solid-900.woff2 +0 -0
  313. package/source/webfonts/fa-solid-900.ttf +0 -0
  314. package/source/webfonts/fa-solid-900.woff2 +0 -0
  315. package/source/webfonts/fa-thin-100.ttf +0 -0
  316. package/source/webfonts/fa-thin-100.woff2 +0 -0
  317. package/source/webfonts/fa-v4compatibility.ttf +0 -0
  318. package/source/webfonts/fa-v4compatibility.woff2 +0 -0
  319. package/vercel.json +7 -0
@@ -0,0 +1,78 @@
1
+ <div class="home-sidebar-container">
2
+ <div class="sticky-container sticky">
3
+ <%
4
+ const hasSidebarLinks = theme.home.sidebar.links !== null;
5
+ const hasSidebarAnnouncement = theme.home.sidebar.announcement !== null;
6
+ %>
7
+ <% if (theme.home.sidebar.first_item === "info") { %>
8
+ <div class="sidebar-content">
9
+ <%- partial("components/sidebar/avatar") %>
10
+ <%- partial("components/sidebar/author") %>
11
+ <%- partial('components/sidebar/statistics')%>
12
+ </div>
13
+ <% if (hasSidebarLinks || hasSidebarAnnouncement) {%>
14
+ <div class="sidebar-links" <% if (hasSidebarLinks || hasSidebarAnnouncement) { %> marginTop <% } %>>
15
+ <div class="site-info">
16
+ <div class="site-name"><%= theme.info.title || config.title %></div>
17
+ <% if (hasSidebarAnnouncement && hasSidebarLinks) { %>
18
+ <div class="announcement">
19
+ <%- theme.home.sidebar.announcement %>
20
+ </div>
21
+ <% } %>
22
+ </div>
23
+ <% if (hasSidebarLinks) {%>
24
+ <% for (let i in theme.home.sidebar.links) { %>
25
+ <% if (theme.home.sidebar.links[i].path === 'none') {} else {%>
26
+ <a class="links" href="<%= url_for(theme.home.sidebar.links[i].path) %>">
27
+ <% if (theme.home.sidebar.links[i].icon) { %>
28
+ <i class="<%- theme.home.sidebar.links[i].icon %> icon-space"></i>
29
+ <% } %>
30
+ <span class="link-name"><%= __(i) %></span>
31
+ </a>
32
+ <% } %>
33
+ <% } %>
34
+ <% } else {%>
35
+ <div class="announcement-outside">
36
+ <%- theme.home.sidebar.announcement %>
37
+ </div>
38
+ <% } %>
39
+ </div>
40
+ <% } %>
41
+ <% } else { %>
42
+ <% if (hasSidebarLinks || hasSidebarAnnouncement) {%>
43
+ <div class="sidebar-links">
44
+ <div class="site-info">
45
+ <div class="site-name"><%= theme.info.title || config.title %></div>
46
+ <% if (hasSidebarAnnouncement && hasSidebarLinks) { %>
47
+ <div class="announcement">
48
+ <%- theme.home.sidebar.announcement %>
49
+ </div>
50
+ <% } %>
51
+ </div>
52
+ <% if (hasSidebarLinks) {%>
53
+ <% for (let i in theme.home.sidebar.links) { %>
54
+ <% if (theme.home.sidebar.links[i].path === 'none') {} else {%>
55
+ <a class="links" href="<%= url_for(theme.home.sidebar.links[i].path) %>">
56
+ <% if (theme.home.sidebar.links[i].icon) { %>
57
+ <i class="<%- theme.home.sidebar.links[i].icon %> icon-space"></i>
58
+ <% } %>
59
+ <span class="link-name"><%= __(i) %></span>
60
+ </a>
61
+ <% } %>
62
+ <% } %>
63
+ <% } else {%>
64
+ <div class="announcement-outside">
65
+ <%- theme.home.sidebar.announcement %>
66
+ </div>
67
+ <% } %>
68
+ </div>
69
+ <% } %>
70
+ <div class="sidebar-content" <% if (hasSidebarLinks || hasSidebarAnnouncement) { %> marginTop <% } %>>
71
+ <%- partial("components/sidebar/avatar") %>
72
+ <%- partial("components/sidebar/author") %>
73
+ <%- partial('components/sidebar/statistics')%>
74
+ </div>
75
+ <% } %>
76
+
77
+ </div>
78
+ </div>
@@ -0,0 +1,28 @@
1
+ <%
2
+ // Define an array of images to display in the masonry layout
3
+ const images = theme.masonry;
4
+ %>
5
+
6
+ <h1 class="page-title-header">
7
+ <%- getPageTitle(page) %>
8
+ </h1>
9
+
10
+ <div class="loading-placeholder">
11
+ <div class="flex-grid generic-card">
12
+ <div class="card loading"></div>
13
+ <div class="card loading"></div>
14
+ <div class="card loading"></div>
15
+ </div>
16
+ </div>
17
+
18
+ <div id="masonry-container">
19
+ <% images.forEach(function(image) { %>
20
+ <div class="masonry-item">
21
+ <div class="image-container">
22
+ <img src="<%- image.image %>" alt="<%- image.title %>">
23
+ <div class="image-title"><%- image.title %></div>
24
+ <div class="image-description"><%- image.description %></div>
25
+ </div>
26
+ </div>
27
+ <% }); %>
28
+ </div>
@@ -0,0 +1,8 @@
1
+ <div class="nf-container">
2
+ <div class="nf-text">
3
+ <h1>404<br>Page Not Found</h1>
4
+ </div>
5
+ <div class="nf-button">
6
+ <a href="/" class="button large center"><i class="fa-regular fa-house"></i> <%= __("go-back-home") %></a>
7
+ </div>
8
+ </div>
@@ -0,0 +1,23 @@
1
+ <div class="page-template-container">
2
+ <% const pageData = getPageData(page); %>
3
+
4
+ <% if (pageData) { %>
5
+ <%- partial(pageData.partial) %>
6
+ <% } %>
7
+
8
+ <div class="page-template-content markdown-body">
9
+ <% if (!pageData) { %>
10
+ <h1><%- page.title %></h1>
11
+ <% } %>
12
+
13
+ <%- page.content %>
14
+ </div>
15
+
16
+ <div class="page-template-comments">
17
+ <% if (page.hasOwnProperty('comment') && (page.comment === true || page.comments === true) ) { %>
18
+ <%- partial('components/comments/comment') %>
19
+ <% } %>
20
+ </div>
21
+ </div>
22
+
23
+ <%- partial('utils/paginator', {pageObject: page}) %>
@@ -0,0 +1,153 @@
1
+ <div class="post-page-container flex relative justify-between box-border w-full h-full">
2
+ <div class="article-content-container">
3
+
4
+ <div class="article-title relative w-full">
5
+ <% if (page.cover || page.banner || (page.thumbnail && page.thumbnail !== false)) { %>
6
+ <% let articleCover = "";
7
+ if (page.cover && page.cover.includes("/")) {
8
+ articleCover = page.cover;
9
+ } else if (page.banner && page.banner.includes("/")) {
10
+ articleCover = page.banner;
11
+ } else if (page.thumbnail && page.thumbnail !== null) {
12
+ articleCover = page.thumbnail;
13
+ } else if (config.marked.postAsset && config.marked.postAsset == true) {
14
+ articleCover = [page.path, page.cover || page.banner].join("/");
15
+ }
16
+ %>
17
+ <% if (articleCover) { %>
18
+ <img src="<%= url_for(articleCover) %>" alt="<%= page.title %>" class="w-full h-60 sm:h-72 md:h-80 object-cover sm:rounded-t-large dark:brightness-75" />
19
+ <% } %>
20
+ <div class="w-full flex items-center absolute bottom-0 <%= theme.articles.style.title_alignment === "center" ? "justify-center" : "justify-start" %>">
21
+ <h1 class="article-title-cover text-center mx-6 my-6 text-second-text-color bg-background-color-transparent px-4 py-3 text-3xl sm:text-4xl md:text-5xl font-semibold backdrop-blur-lg rounded-xl border border-border-color "><%= page.title %></h1>
22
+ </div>
23
+ <% } else { %>
24
+ <div class="w-full flex items-center pt-6 <%= theme.articles.style.title_alignment === "center" ? "justify-center" : "justify-start" %>">
25
+ <h1 class="article-title-regular text-second-text-color tracking-tight text-4xl md:text-6xl font-semibold px-2 sm:px-6 md:px-8 py-3"><%= page.title %></h1>
26
+ </div>
27
+ <% } %>
28
+ </div>
29
+
30
+ <% if (theme.info.author || config.author) { %>
31
+ <div class="article-header flex flex-row gap-2 items-center px-2 sm:px-6 md:px-8">
32
+ <div class="avatar w-[46px] h-[46px] flex-shrink-0 rounded-medium border border-border-color p-[1px]">
33
+ <%- image_tag((typeof page.avatar === "string" && (page.avatar)) || page.author?.avatar || theme.defaults.avatar) %>
34
+ </div>
35
+ <div class="info flex flex-col justify-between">
36
+ <div class="author flex items-center">
37
+ <span class="name text-default-text-color text-lg font-semibold"><%= (typeof page.author === "string" && (page.author)) || page.author?.name || theme.info.author || config.author %></span>
38
+ <% if (theme.hasOwnProperty('articles') && theme.articles.author_label.enable === true) { %>
39
+ <span class="author-label ml-1.5 text-xs px-2 py-0.5 rounded-small text-third-text-color border border-shadow-color-1"><%- getAuthorLabel(site.posts.length, theme.articles.author_label.auto, theme.articles.author_label.list) %></span>
40
+ <% } %>
41
+ </div>
42
+ <div class="meta-info">
43
+ <%- partial('pages/post/article-info', {articleObject: page, index: true}) %>
44
+ </div>
45
+ </div>
46
+ </div>
47
+ <% } else { %>
48
+ <div class="article-header-meta-info px-2 sm:px-6 md:px-8">
49
+ <div class="meta-info">
50
+ <%- partial('pages/post/article-info', {articleObject: page, index: true}) %>
51
+ </div>
52
+ </div>
53
+ <% } %>
54
+
55
+ <% if (page?.expires && page?.expires !== "") {%>
56
+ <div class="article-expire mt-4 mx-2 sm:mx-6 md:mx-8 note p-4 rounded-lg red icon hidden" id="expiration-container">
57
+ <i class="expire-icon fa-solid fa-timer mr-0.5 text-red-600 dark:text-red-400"></i>
58
+ <span class="expire-label text-red-600 dark:text-red-400 " id="expiration-date"><%= __('expired', "some") %></span>
59
+ </div>
60
+
61
+ <script data-swup-reload-script>
62
+ function updateExpirationDate() {
63
+ try {
64
+ const expiredDate = new Date("<%= page?.expires %>");
65
+ const updatedDate = new Date("<%= page?.updated %>");
66
+ const now = new Date();
67
+ const expirationValue = document.getElementById("expiration-date");
68
+ const expirationContainer = document.getElementById("expiration-container");
69
+ let daysAgo = Math.floor((now - updatedDate) / (1000 * 60 * 60 * 24));
70
+ if (expiredDate < now) {
71
+ expirationContainer.classList.remove("hidden");
72
+ // console.log(daysAgo)
73
+ expirationValue.innerHTML = expirationValue.innerHTML.replace("some", daysAgo);
74
+ }
75
+ } catch (e) {}
76
+ }
77
+ document.addEventListener("DOMContentLoaded", function() {
78
+ updateExpirationDate();
79
+ });
80
+ try {
81
+ swup.hooks.on("page:view", updateExpirationDate)
82
+ } catch (e) {}
83
+ </script>
84
+ <% } %>
85
+
86
+
87
+ <div class="article-content markdown-body px-2 sm:px-6 md:px-8 pb-8">
88
+ <%- page.content %>
89
+ </div>
90
+
91
+ <% if (theme.articles.copyright.enable || theme.articles.copyright === true) { %>
92
+ <div class="post-copyright-info w-full my-8 px-2 sm:px-6 md:px-8">
93
+ <%- partial('pages/post/article-copyright') %>
94
+ </div>
95
+ <% } %>
96
+
97
+ <% if (page?.tags?.length) { %>
98
+ <ul class="post-tags-box text-lg mt-1.5 flex-wrap justify-center flex md:hidden">
99
+ <% page.tags.forEach((tag) => { %>
100
+ <li class="tag-item mx-0.5">
101
+ <a href="<%- url_for(tag.path) %>">#<%= tag.name %></a>&nbsp;
102
+ </li>
103
+ <% }); %>
104
+ </ul>
105
+ <% } %>
106
+
107
+ <%- articleRecommendationGenerator(page) %>
108
+
109
+ <% if (page?.prev || page?.next) { %>
110
+ <div class="article-nav my-8 flex justify-between items-center px-2 sm:px-6 md:px-8">
111
+ <% if (page?.prev) { %>
112
+ <div class="article-prev border-border-color shadow-redefine-flat shadow-shadow-color-2 rounded-medium px-4 py-2 hover:shadow-redefine-flat-hover hover:shadow-shadow-color-2">
113
+ <a class="prev" rel="prev" href="<%= url_for(page.prev.path) %>">
114
+ <span class="left arrow-icon flex justify-center items-center">
115
+ <i class="fa-solid fa-chevron-left"></i>
116
+ </span>
117
+ <span class="title flex justify-center items-center">
118
+ <span class="post-nav-title-item truncate max-w-48"><%= page.prev.title %></span>
119
+ <span class="post-nav-item"><%= __('prev_posts') %></span>
120
+ </span>
121
+ </a>
122
+ </div>
123
+ <% } %>
124
+ <% if (page?.next) { %>
125
+ <div class="article-next border-border-color shadow-redefine-flat shadow-shadow-color-2 rounded-medium px-4 py-2 hover:shadow-redefine-flat-hover hover:shadow-shadow-color-2">
126
+ <a class="next" rel="next" href="<%= url_for(page.next.path) %>">
127
+ <span class="title flex justify-center items-center">
128
+ <span class="post-nav-title-item truncate max-w-48"><%= page.next.title %></span>
129
+ <span class="post-nav-item"><%= __('next_posts') %></span>
130
+ </span>
131
+ <span class="right arrow-icon flex justify-center items-center">
132
+ <i class="fa-solid fa-chevron-right"></i>
133
+ </span>
134
+ </a>
135
+ </div>
136
+ <% } %>
137
+ </div>
138
+ <% } %>
139
+
140
+
141
+ <% if (theme.comment.enable === true && theme.comment.hasOwnProperty('system') && page.comment !== false) { %>
142
+ <div class="comment-container px-2 sm:px-6 md:px-8 pb-8">
143
+ <%- partial('components/comments/comment') %>
144
+ </div>
145
+ <% } %>
146
+ </div>
147
+
148
+ <% if (is_post() && theme.articles.toc.enable === true) { %>
149
+ <div class="toc-content-container">
150
+ <%- partial('pages/post/toc') %>
151
+ </div>
152
+ <% } %>
153
+ </div>
@@ -0,0 +1,69 @@
1
+ <div class="article-copyright-info-container">
2
+ <ul>
3
+ <li><strong><%- __('copyright.title') %>:</strong> <%= page.title %></li>
4
+ <li><strong><%- __('copyright.author') %>:</strong> <%=(typeof page.author === "string" && (page.author)) || page.author?.name || theme.info.author || config.author %></li>
5
+ <li><strong><%- __('copyright.create_time') %>
6
+ :</strong> <%= date(page.date, `${config.date_format} ${config.time_format}`) %></li>
7
+ <% if (page.updated && page.updated !== page.date) { %>
8
+ <li>
9
+ <strong><%- __('copyright.update_time') %>
10
+ :</strong> <%= date(page.updated, `${config.date_format} ${config.time_format}`) %>
11
+ </li>
12
+ <% } %>
13
+ <li>
14
+ <strong><%- __('copyright.link') %>:</strong> <%= getPostUrl((theme.info.url || config.url), page.path) %>
15
+ </li>
16
+ <li>
17
+ <strong>
18
+ <%- __('copyright.license_title') %>:
19
+ </strong>
20
+ <%
21
+ const licenseMap = {
22
+ 'all_rights_reserved': {
23
+ label: __('copyright.all_rights_reserved', theme.info.author),
24
+ url: null
25
+ },
26
+ 'cc_by': {
27
+ label: __('copyright.license_content', '<a class="license" href="https://creativecommons.org/licenses/by/4.0">CC BY 4.0</a>'),
28
+ url: 'https://creativecommons.org/licenses/by/4.0'
29
+ },
30
+ 'cc_by_sa': {
31
+ label: __('copyright.license_content', '<a class="license" href="https://creativecommons.org/licenses/by-sa/4.0">CC BY-SA 4.0</a>'),
32
+ url: 'https://creativecommons.org/licenses/by-sa/4.0'
33
+ },
34
+ 'cc_by_nc': {
35
+ label: __('copyright.license_content', '<a class="license" href="https://creativecommons.org/licenses/by-nc/4.0">CC BY-NC 4.0</a>'),
36
+ url: 'https://creativecommons.org/licenses/by-nc/4.0'
37
+ },
38
+ 'cc_by_nd': {
39
+ label: __('copyright.license_content', '<a class="license" href="https://creativecommons.org/licenses/by-nd/4.0">CC BY-ND 4.0</a>'),
40
+ url: 'https://creativecommons.org/licenses/by-nd/4.0'
41
+ },
42
+ 'cc_by_nc_sa': {
43
+ label: __('copyright.license_content', '<a class="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0">CC BY-NC-SA 4.0</a>'),
44
+ url: 'https://creativecommons.org/licenses/by-nc-sa/4.0'
45
+ },
46
+ 'public_domain': {
47
+ label: __('copyright.public_domain'),
48
+ url: null
49
+ }
50
+ };
51
+
52
+ let licenseType = 'cc_by_nc_sa'; // Default license type
53
+ if (page.copyright && page.copyright !== "") {
54
+ licenseType = 'custom';
55
+ } else if (page.license && licenseMap[page.license]) {
56
+ licenseType = page.license;
57
+ } else if (theme.articles.copyright.default && licenseMap[theme.articles.copyright.default]) {
58
+ licenseType = theme.articles.copyright.default;
59
+ }
60
+ %>
61
+
62
+ <% if (licenseType === 'custom') { %>
63
+ <%- page.copyright %>
64
+ <% } else { %>
65
+ <%- licenseMap[licenseType].label %>
66
+ <% } %>
67
+ </li>
68
+ </ul>
69
+ </div>
@@ -0,0 +1,78 @@
1
+ <div class="article-meta-info">
2
+ <span class="article-date article-meta-item">
3
+ <i class="fa-regular fa-pen-fancy"></i>&nbsp;
4
+ <span class="desktop"><%= date(articleObject.date, is_post() ? `${config.date_format} ${config.time_format}` : `${config.date_format}`).replace(" 00:00:00", "").replace(":00", "") %></span>
5
+ <span class="mobile"><%= date(articleObject.date, is_post() ? `${config.date_format} ${config.time_format}` : `${config.date_format}`).replace(" 00:00:00", "").replace(":00", "") %></span>
6
+ <span class="hover-info"><%= __("create_time") %></span>
7
+ </span>
8
+ <% if (articleObject?.updated && articleObject.updated !== articleObject.date) { %>
9
+ <span class="article-date article-meta-item">
10
+ <i class="fa-regular fa-wrench"></i>&nbsp;
11
+ <span class="desktop"><%= date(articleObject.updated, is_post() ? `${config.date_format} ${config.time_format}` : `${config.date_format}`).replace(" 00:00:00", "").replace(":00", "") %></span>
12
+ <span class="mobile"><%= date(articleObject.updated, is_post() ? `${config.date_format} ${config.time_format}` : `${config.date_format}`).replace(" 00:00:00", "").replace(":00", "") %></span>
13
+ <span class="hover-info"><%= __("update_time") %></span>
14
+ </span>
15
+ <% } %>
16
+
17
+ <% if (articleObject?.categories?.length) { %>
18
+ <span class="article-categories article-meta-item">
19
+ <i class="fa-regular fa-folders"></i>&nbsp;
20
+ <ul>
21
+ <% let previousParentId = null; %>
22
+ <% articleObject.categories.forEach((category, i) => { %>
23
+ <% if (previousParentId !== category.parent) { %>
24
+ <% if (previousParentId !== null) { %>
25
+ <li>></li>
26
+ <% } %>
27
+ <li>
28
+ <a href="<%- url_for(category.path) %>"><%= category.name %></a>&nbsp;
29
+ </li>
30
+ <% } else { %>
31
+ <li>
32
+ | <a href="<%- url_for(category.path) %>"><%= category.name %></a>&nbsp;
33
+ </li>
34
+ <% } %>
35
+ <% previousParentId = category.parent; %>
36
+ <% }); %>
37
+ </ul>
38
+ </span>
39
+ <% } %>
40
+ <% if (articleObject?.tags?.length) { %>
41
+ <span class="article-tags article-meta-item">
42
+ <i class="fa-regular fa-tags"></i>&nbsp;
43
+ <ul>
44
+ <% articleObject.tags.forEach((tag, i) => { %>
45
+ <li>
46
+ <%= i === 0 ? '' : '| ' %><a href="<%- url_for(tag.path) %>"><%= tag.name %></a>&nbsp;
47
+ </li>
48
+ <% }); %>
49
+ </ul>
50
+ </span>
51
+ <% } %>
52
+
53
+ <%
54
+ let temp_wordcount, temp_min2read = null;
55
+ try {
56
+ temp_wordcount = wordcount(page.content);
57
+ temp_min2read = min2read(page.content);
58
+ } catch (e) {
59
+ temp_wordcount = 0;
60
+ temp_min2read = 0;
61
+ }
62
+ %>
63
+ <% if(is_post() && theme.hasOwnProperty('articles') && theme.articles.word_count.enable && theme.articles.word_count.count && temp_wordcount){ %>
64
+ <span class="article-wordcount article-meta-item">
65
+ <i class="fa-regular fa-typewriter"></i>&nbsp;<span><%= temp_wordcount %> <%- __('wordcount') %></span>
66
+ </span>
67
+ <% } %>
68
+ <% if(is_post() && theme.hasOwnProperty('articles') && theme.articles.word_count.enable && theme.articles.word_count.min2read && temp_min2read){ %>
69
+ <span class="article-min2read article-meta-item">
70
+ <i class="fa-regular fa-clock"></i>&nbsp;<span><%= temp_min2read %> <%- __('min2read') %></span>
71
+ </span>
72
+ <% } %>
73
+ <% if (is_post() && theme.global.website_counter.enable && theme.global.website_counter.post_pv) { %>
74
+ <span class="article-pv article-meta-item">
75
+ <i class="fa-regular fa-eye"></i>&nbsp;<span id="busuanzi_value_page_pv"></span>
76
+ </span>
77
+ <% } %>
78
+ </div>
@@ -0,0 +1,17 @@
1
+ <div class="post-tools-container">
2
+ <ul class="article-tools-list">
3
+ <!-- TOC aside toggle -->
4
+ <% if (theme.articles.toc.enable) { %>
5
+ <li class="right-bottom-tools page-aside-toggle">
6
+ <i class="fa-regular fa-outdent"></i>
7
+ </li>
8
+ <% } %>
9
+
10
+ <!-- go comment -->
11
+ <% if (theme.comment.enable === true && theme.comment.hasOwnProperty('system') && page.comment !== false) { %>
12
+ <li class="go-comment">
13
+ <i class="fa-regular fa-comments"></i>
14
+ </li>
15
+ <% } %>
16
+ </ul>
17
+ </div>
@@ -0,0 +1,15 @@
1
+ <div class="post-toc-wrap">
2
+ <div class="post-toc">
3
+ <div class="toc-title"><%- __('toc') %></div>
4
+ <div class="page-title"><%= page.title %></div>
5
+ <%- toc(
6
+ page.content,
7
+ {
8
+ class: 'nav',
9
+ list_number: theme.articles.toc.number,
10
+ max_depth: theme.articles.toc.max_depth,
11
+ }
12
+ ) %>
13
+
14
+ </div>
15
+ </div>
@@ -0,0 +1,23 @@
1
+ <div class="mb-4">
2
+ <h1 class="page-title-header"><%= page.title %></h1>
3
+ <ul class="flex flex-col mb-4 gap-6">
4
+ <%
5
+ const timezone = config.timezone || 'Asia/Shanghai';
6
+ const newessays = theme.essays.sort((a, b) => moment(b.date).diff(a.date));
7
+ %>
8
+ <% for (const e of newessays) { %>
9
+ <li class="w-full flex flex-row relative">
10
+ <div class="w-10 h-10 mr-4 rounded-lg overflow-hidden border border-border-color p-[1px] shrink-0">
11
+ <%- image_tag(theme.defaults.avatar, {class: "w-full h-full rounded-[6.2px]"}) %>
12
+ </div>
13
+ <div class="w-full border-border-color rounded-xl rounded-tl-none shadow-redefine-flat overflow-hidden">
14
+ <!-- Pass the raw date here in a data attribute -->
15
+ <% rawDate = moment(e.date).utc().format('YYYY-MM-DD HH:mm:ss') %>
16
+ <div class="essay-date px-4 py-1.5 text-sm border-b border-border-color bg-zinc-50 dark:bg-zinc-800 text-third-text-color" data-date="<%= moment(rawDate).tz(timezone).format() %>">Loading Date...</div>
17
+ <div id="shuoshuo-content" class="px-4 py-2"><%- markdown(e.content) %></div>
18
+ </div>
19
+ <div class="absolute left-[50.5px] top-3 transform w-2 h-2 border-solid border-t border-l bg-zinc-50 -rotate-45 border-border-color dark:bg-zinc-800"></div>
20
+ </li>
21
+ <% } %>
22
+ </ul>
23
+ </div>
@@ -0,0 +1,6 @@
1
+ <div class="tag-name">
2
+ <i class="fa-solid fa-tag"></i>&nbsp;<%= page.tag %>
3
+ </div>
4
+ <div class="tag-post-list">
5
+ <%- partial('utils/posts-list', {posts: page.posts}) %>
6
+ </div>
@@ -0,0 +1,24 @@
1
+ <% if (site.tags.length){ %>
2
+ <h1 class="page-title-header">
3
+ <%- getPageTitle(page) %>
4
+ </h1>
5
+
6
+ <% if (theme.page_templates.tags_style == 'cloud') { %>
7
+ <div class="tagcloud-content">
8
+ <%- tagcloud({ min_font: 1, max_font: 5, unit: 'rem', amount: 100 }) %>
9
+ </div>
10
+
11
+ <% } else {%>
12
+ <div class="tagcloud-content">
13
+ <ul class="tag-list" data-show-value="true">
14
+ <% site.tags.forEach(function(tag){ %>
15
+ <li>
16
+ <a data-weight="<%- tag.posts.length %>" href="<%- url_for("/" + tag.path) %>">
17
+ <i class="fa-solid fa-hashtag"></i><%- tag.name %>
18
+ </a>
19
+ </li>
20
+ <% }) %>
21
+ </ul>
22
+ </div>
23
+ <% } %>
24
+ <% } %>
@@ -0,0 +1 @@
1
+ <%- partial('page') %>
package/layout/tag.ejs ADDED
@@ -0,0 +1 @@
1
+ <%- partial('page') %>
@@ -0,0 +1 @@
1
+ <%- partial('page') %>
@@ -0,0 +1,3 @@
1
+ <div class="image-viewer-container">
2
+ <img src="">
3
+ </div>
@@ -0,0 +1,20 @@
1
+ <div class="search-pop-overlay">
2
+ <div class="popup search-popup">
3
+ <div class="search-header">
4
+ <span class="search-input-field-pre">
5
+ <i class="fa-solid fa-keyboard"></i>
6
+ </span>
7
+ <div class="search-input-container">
8
+ <input autocomplete="off" autocorrect="off" autocapitalize="off" placeholder="<%= __('search') %>" spellcheck="false" type="search" class="search-input">
9
+ </div>
10
+ <span class="popup-btn-close">
11
+ <i class="fa-solid fa-times"></i>
12
+ </span>
13
+ </div>
14
+ <div id="search-result">
15
+ <div id="no-result">
16
+ <i class="fa-solid fa-spinner fa-spin-pulse fa-5x fa-fw"></i>
17
+ </div>
18
+ </div>
19
+ </div>
20
+ </div>
@@ -0,0 +1,8 @@
1
+ <div class="paginator">
2
+ <%- paginator({
3
+ prev_text: '<i class="fa-regular fa-angle-left"></i>',
4
+ next_text: '<i class="fa-regular fa-angle-right"></i>',
5
+ escape: false
6
+ }) %>
7
+ </div>
8
+
@@ -0,0 +1,28 @@
1
+ <% const postList = createNewArchivePosts(posts) %>
2
+ <div class="archive-list-container">
3
+ <% postList.forEach(postYear => { %>
4
+ <section class="archive-item mb-spacing-unit last:mb-0">
5
+ <div class="archive-item-header flex flex-row items-center mb-2">
6
+ <span class="archive-year font-semibold text-3xl mr-2"><%= postYear.year %></span>
7
+ <span class="archive-year-post-count text-xs md:text-sm font-bold rounded-small bg-third-background-color py-[2px] px-[10px] border border-border-color"><%= postYear.postList.length %></span>
8
+ </div>
9
+ <% let previousDate = null; %>
10
+ <ul class="article-list pl-0 md:pl-8 text-lg leading-[1.5]">
11
+ <% postYear.postList.sort((a,b) => (a.date > b.date ? -1 : (a.date < b.date ? 1 : a.title.localeCompare(b.title)))).forEach(post => { %>
12
+ <% const currentDate = date(post.date, 'MM-DD'); %>
13
+ <% if (previousDate !== currentDate) { %>
14
+ <% if (previousDate) { %>
15
+ </li>
16
+ <% } %> <!-- Close the previous LI if not the first item -->
17
+ <li class="article-item space-y-2 px-6 pt-10 pb-2 text-xl relative border-l-2 border-border-color" date-is='<%= currentDate %>'>
18
+ <% } %>
19
+ <a href="<%- url_for(post.path) %>" class="block w-fit">
20
+ <span class="article-title my-0.5 text-2xl"><%= post.title %></span>
21
+ </a>
22
+ <% previousDate = currentDate; %>
23
+ <% }) %>
24
+ </li> <!-- Ensure the last item is properly closed -->
25
+ </ul>
26
+ </section>
27
+ <% }) %>
28
+ </div>