From 71758b9fcec8c6efcee0d9c2cf097f4b52e82aee Mon Sep 17 00:00:00 2001 From: IF-chan Date: Fri, 5 Jul 2024 21:01:19 +0800 Subject: [PATCH] Add solitude --- themes/solitude/.github/FUNDING.yml | 13 + .../.github/ISSUE_TEMPLATE/bug_report.yml | 108 ++ .../.github/ISSUE_TEMPLATE/config.yml | 21 + .../ISSUE_TEMPLATE/feature_request.yml | 48 + .../solitude/.github/PULL_REQUEST_TEMPLATE.md | 35 + themes/solitude/.github/logo.svg | 23 + themes/solitude/.github/screenshot.webp | Bin 0 -> 60106 bytes .../workflows/issue_close_question.yml | 25 + .../.github/workflows/issue_invalid.yml | 18 + .../.github/workflows/issue_question.yml | 30 + .../.github/workflows/issue_wontfix.yml | 29 + .../.github/workflows/npm-publish.yml | 20 + themes/solitude/.github/workflows/stale.yml | 19 + themes/solitude/.gitignore | 3 + themes/solitude/CODE_OF_CONDUCT.md | 88 ++ themes/solitude/CONTRIBUTING.md | 43 + themes/solitude/LICENSE | 21 + themes/solitude/README.md | 83 ++ themes/solitude/README_en-US.md | 80 ++ themes/solitude/README_zh-Hant.md | 78 ++ themes/solitude/SECURITY.md | 9 + themes/solitude/_config.yml | 977 +++++++++++++++ themes/solitude/languages/default.yml | 227 ++++ themes/solitude/languages/en.yml | 226 ++++ themes/solitude/languages/zh-CN.yml | 228 ++++ themes/solitude/languages/zh-TW.yml | 226 ++++ themes/solitude/layout/404.pug | 24 + themes/solitude/layout/archive.pug | 10 + themes/solitude/layout/category.pug | 12 + .../layout/includes/body/gadsense.pug | 9 + themes/solitude/layout/includes/body/mode.pug | 38 + themes/solitude/layout/includes/console.pug | 51 + themes/solitude/layout/includes/footer.pug | 72 ++ themes/solitude/layout/includes/head.pug | 32 + .../solitude/layout/includes/head/config.pug | 166 +++ .../layout/includes/head/opengraph.pug | 13 + .../layout/includes/head/page_config.pug | 10 + themes/solitude/layout/includes/head/pwa.pug | 22 + themes/solitude/layout/includes/header.pug | 4 + .../solitude/layout/includes/inject/body.pug | 117 ++ .../solitude/layout/includes/inject/head.pug | 52 + themes/solitude/layout/includes/keyboard.pug | 65 + themes/solitude/layout/includes/layout.pug | 54 + themes/solitude/layout/includes/loading.pug | 25 + .../layout/includes/mixins/articleSort.pug | 14 + .../layout/includes/mixins/pagination.pug | 8 + themes/solitude/layout/includes/nav.pug | 22 + .../solitude/layout/includes/page/about.pug | 11 + .../layout/includes/page/categories.pug | 8 + .../solitude/layout/includes/page/default.pug | 2 + .../layout/includes/page/equipment.pug | 2 + .../solitude/layout/includes/page/links.pug | 14 + .../solitude/layout/includes/page/message.pug | 5 + .../solitude/layout/includes/page/music.pug | 11 + .../layout/includes/page/recentcomment.pug | 16 + themes/solitude/layout/includes/page/says.pug | 58 + themes/solitude/layout/includes/page/tags.pug | 8 + .../solitude/layout/includes/page/tlink.pug | 13 + themes/solitude/layout/includes/rightmenu.pug | 80 ++ themes/solitude/layout/includes/sidebar.pug | 32 + .../layout/includes/widgets/aside/aside.pug | 18 + .../includes/widgets/aside/asideAdsense.pug | 5 + .../includes/widgets/aside/asideAllInfo.pug | 8 + .../includes/widgets/aside/asideArchive.pug | 11 + .../includes/widgets/aside/asideCustom.pug | 7 + .../includes/widgets/aside/asideFlipCard.pug | 5 + .../includes/widgets/aside/asideInfoCard.pug | 86 ++ .../widgets/aside/asideNewestPost.pug | 16 + .../widgets/aside/asideNewstComments.pug | 9 + .../includes/widgets/aside/asideSwitch.pug | 19 + .../includes/widgets/aside/asideTag.pug | 16 + .../includes/widgets/aside/asideToc.pug | 5 + .../includes/widgets/aside/asideWebInfo.pug | 48 + .../layout/includes/widgets/home/banner.pug | 23 + .../includes/widgets/home/bbTimeList.pug | 18 + .../layout/includes/widgets/home/carousel.pug | 72 ++ .../includes/widgets/home/categoryBar.pug | 15 + .../layout/includes/widgets/home/hometop.pug | 7 + .../layout/includes/widgets/home/postList.pug | 81 ++ .../layout/includes/widgets/home/topGroup.pug | 32 + .../layout/includes/widgets/nav/group.pug | 13 + .../layout/includes/widgets/nav/menu.pug | 20 + .../layout/includes/widgets/nav/right.pug | 24 + .../widgets/page/about/authorinfo.pug | 13 + .../includes/widgets/page/about/award.pug | 39 + .../widgets/page/about/contentinfo.pug | 39 + .../includes/widgets/page/about/hobbies.pug | 37 + .../includes/widgets/page/about/motto.pug | 22 + .../includes/widgets/page/about/other.pug | 89 ++ .../widgets/page/about/personalities.pug | 17 + .../widgets/page/about/skillsinfo.pug | 42 + .../includes/widgets/page/about/tenyear.pug | 48 + .../layout/includes/widgets/page/banner.pug | 15 + .../widgets/page/equipment/content.pug | 23 + .../includes/widgets/page/links/banner.pug | 31 + .../includes/widgets/page/links/linksCard.pug | 15 + .../widgets/page/links/linksDiscn.pug | 8 + .../includes/widgets/page/links/linksItem.pug | 11 + .../includes/widgets/page/message/artalk.pug | 45 + .../includes/widgets/page/message/content.pug | 9 + .../includes/widgets/page/message/js.pug | 12 + .../includes/widgets/page/message/twikoo.pug | 47 + .../includes/widgets/page/message/valine.pug | 57 + .../includes/widgets/page/message/waline.pug | 42 + .../widgets/page/recentcomment/artalk.pug | 78 ++ .../widgets/page/recentcomment/twikoo.pug | 83 ++ .../widgets/page/recentcomment/valine.pug | 79 ++ .../widgets/page/recentcomment/waline.pug | 72 ++ .../layout/includes/widgets/post/award.pug | 44 + .../includes/widgets/post/copyright.pug | 74 ++ .../layout/includes/widgets/post/post-ai.pug | 12 + .../layout/includes/widgets/post/postMeta.pug | 84 ++ .../layout/includes/widgets/post/postNav.pug | 25 + .../layout/includes/widgets/post/wave.pug | 9 + .../layout/includes/widgets/randomlink.pug | 44 + .../widgets/third-party/comments/artalk.pug | 61 + .../widgets/third-party/comments/comment.pug | 44 + .../widgets/third-party/comments/giscus.pug | 60 + .../widgets/third-party/comments/js.pug | 14 + .../widgets/third-party/comments/twikoo.pug | 80 ++ .../widgets/third-party/comments/valine.pug | 72 ++ .../widgets/third-party/comments/waline.pug | 67 + .../includes/widgets/third-party/music.pug | 3 + .../third-party/news-comment/artalk.pug | 92 ++ .../news-comment/newest-comment.pug | 11 + .../third-party/news-comment/twikoo.pug | 69 ++ .../third-party/news-comment/valine.pug | 85 ++ .../third-party/news-comment/waline.pug | 73 ++ .../includes/widgets/third-party/pjax.pug | 39 + .../third-party/search/algolia-search.pug | 20 + .../widgets/third-party/search/index.pug | 8 + .../third-party/search/local-search.pug | 16 + .../widgets/third-party/tianli-talk.pug | 26 + themes/solitude/layout/index.pug | 23 + themes/solitude/layout/page.pug | 39 + themes/solitude/layout/post.pug | 30 + themes/solitude/layout/tag.pug | 16 + themes/solitude/package.json | 32 + themes/solitude/plugins.yml | 122 ++ themes/solitude/scripts/event/cdn.js | 142 +++ themes/solitude/scripts/event/init.js | 19 + themes/solitude/scripts/event/merge_config.js | 390 ++++++ themes/solitude/scripts/event/page.js | 33 + themes/solitude/scripts/event/welcome.js | 14 + .../scripts/filter/checkThemeConfig.js | 28 + themes/solitude/scripts/filter/comment.js | 13 + themes/solitude/scripts/filter/default.js | 31 + themes/solitude/scripts/filter/lazyload.js | 20 + themes/solitude/scripts/filter/post_image.js | 13 + themes/solitude/scripts/filter/randomPosts.js | 5 + .../scripts/helper/getArchiveLength.js | 14 + .../solitude/scripts/helper/inject_head_js.js | 86 ++ themes/solitude/scripts/helper/page.js | 17 + .../solitude/scripts/helper/related_post.js | 85 ++ themes/solitude/scripts/helper/stylus.js | 24 + themes/solitude/scripts/tags/btns.js | 35 + themes/solitude/scripts/tags/button.js | 21 + themes/solitude/scripts/tags/bvideo.js | 7 + themes/solitude/scripts/tags/checkbox.js | 51 + themes/solitude/scripts/tags/fold.js | 13 + themes/solitude/scripts/tags/gallery.js | 37 + themes/solitude/scripts/tags/image.js | 75 ++ themes/solitude/scripts/tags/inline-image.js | 12 + themes/solitude/scripts/tags/label.js | 10 + themes/solitude/scripts/tags/link.js | 50 + themes/solitude/scripts/tags/media.js | 29 + themes/solitude/scripts/tags/mermaid.js | 9 + themes/solitude/scripts/tags/note.js | 13 + themes/solitude/scripts/tags/span.js | 17 + themes/solitude/scripts/tags/tabs.js | 61 + themes/solitude/scripts/tags/timeline.js | 22 + .../source/css/_comments/comment.styl | 170 +++ .../solitude/source/css/_comments/twikoo.styl | 516 ++++++++ .../solitude/source/css/_comments/valine.styl | 250 ++++ .../source/css/_global/animation.styl | 313 +++++ .../solitude/source/css/_global/function.styl | 92 ++ themes/solitude/source/css/_global/index.styl | 434 +++++++ .../solitude/source/css/_highlight/color.styl | 72 ++ .../source/css/_highlight/highlight/diff.styl | 51 + .../css/_highlight/highlight/index.styl | 46 + .../solitude/source/css/_highlight/index.styl | 117 ++ .../source/css/_highlight/prismjs/diff.styl | 80 ++ .../source/css/_highlight/prismjs/index.styl | 15 + .../css/_highlight/prismjs/line-number.styl | 28 + .../source/css/_highlight/theme/default.styl | 14 + .../source/css/_highlight/theme/mac.styl | 26 + .../source/css/_layout/article-container.styl | 205 +++ .../source/css/_layout/article-sort.styl | 93 ++ themes/solitude/source/css/_layout/aside.styl | 1097 +++++++++++++++++ .../solitude/source/css/_layout/capsule.styl | 213 ++++ .../solitude/source/css/_layout/console.styl | 310 +++++ .../solitude/source/css/_layout/footer.styl | 278 +++++ .../solitude/source/css/_layout/fullpage.styl | 47 + .../solitude/source/css/_layout/header.styl | 897 ++++++++++++++ .../solitude/source/css/_layout/keyboard.styl | 60 + themes/solitude/source/css/_layout/other.styl | 28 + themes/solitude/source/css/_layout/pace.styl | 40 + .../source/css/_layout/pagination.styl | 177 +++ .../source/css/_layout/recent-post.styl | 476 +++++++ .../source/css/_layout/rightmenu.styl | 79 ++ .../solitude/source/css/_layout/sidebar.styl | 240 ++++ .../solitude/source/css/_layout/universe.styl | 18 + themes/solitude/source/css/_mode/index.styl | 96 ++ .../source/css/_page/_about/about.styl | 50 + .../source/css/_page/_about/author.styl | 92 ++ .../source/css/_page/_about/buff.styl | 34 + .../source/css/_page/_about/careers.styl | 27 + .../source/css/_page/_about/contentinfo.styl | 78 ++ .../source/css/_page/_about/game.styl | 41 + .../source/css/_page/_about/like.styl | 29 + .../source/css/_page/_about/maxim.styl | 23 + .../source/css/_page/_about/myphoto.styl | 34 + .../source/css/_page/_about/oneself.styl | 91 ++ .../css/_page/_about/personalities.styl | 25 + .../source/css/_page/_about/reward.styl | 114 ++ .../source/css/_page/_about/skills.styl | 75 ++ .../source/css/_page/_about/statistic.styl | 55 + .../source/css/_page/_about/tenyear.styl | 56 + .../source/css/_page/_gallery/index.styl | 38 + .../source/css/_page/_home/carousel.styl | 108 ++ .../source/css/_page/_home/category-bar.styl | 95 ++ .../source/css/_page/_home/home-top.styl | 275 +++++ .../solitude/source/css/_page/_home/home.styl | 24 + .../solitude/source/css/_page/category.styl | 114 ++ .../solitude/source/css/_page/equipment.styl | 103 ++ themes/solitude/source/css/_page/error.styl | 145 +++ themes/solitude/source/css/_page/google.styl | 32 + themes/solitude/source/css/_page/index.styl | 71 ++ themes/solitude/source/css/_page/links.styl | 331 +++++ themes/solitude/source/css/_page/message.styl | 64 + themes/solitude/source/css/_page/music.styl | 510 ++++++++ themes/solitude/source/css/_page/other.styl | 270 ++++ .../source/css/_page/recentcomment.styl | 85 ++ themes/solitude/source/css/_page/says.styl | 370 ++++++ themes/solitude/source/css/_page/tag.styl | 59 + themes/solitude/source/css/_post/ads.styl | 4 + .../source/css/_post/commentBarrage.styl | 135 ++ .../solitude/source/css/_post/copyright.styl | 214 ++++ themes/solitude/source/css/_post/index.styl | 18 + themes/solitude/source/css/_post/meta.styl | 377 ++++++ .../solitude/source/css/_post/pagination.styl | 190 +++ themes/solitude/source/css/_post/postAI.styl | 130 ++ .../source/css/_post/relatedPost.styl | 149 +++ themes/solitude/source/css/_post/tools.styl | 260 ++++ .../source/css/_search/algolia-search.styl | 181 +++ .../source/css/_search/local-search.styl | 161 +++ themes/solitude/source/css/_tags/btns.styl | 212 ++++ themes/solitude/source/css/_tags/button.styl | 40 + .../solitude/source/css/_tags/checkbox.styl | 204 +++ themes/solitude/source/css/_tags/fold.styl | 65 + themes/solitude/source/css/_tags/gallery.styl | 124 ++ themes/solitude/source/css/_tags/index.styl | 63 + themes/solitude/source/css/_tags/label.styl | 4 + themes/solitude/source/css/_tags/link.styl | 59 + themes/solitude/source/css/_tags/media.styl | 57 + themes/solitude/source/css/_tags/mermaid.styl | 6 + themes/solitude/source/css/_tags/note.styl | 104 ++ themes/solitude/source/css/_tags/span.styl | 34 + themes/solitude/source/css/_tags/tabs.styl | 107 ++ .../solitude/source/css/_tags/timeline.styl | 79 ++ themes/solitude/source/css/index.styl | 34 + .../source/css/third_party/snackbar.min.css | 1 + .../source/css/third_party/tianli_talk.styl | 77 ++ themes/solitude/source/css/var.styl | 32 + themes/solitude/source/img/404.avif | Bin 0 -> 5006 bytes themes/solitude/source/img/avatar.avif | Bin 0 -> 6591 bytes themes/solitude/source/img/default.avif | Bin 0 -> 6260 bytes themes/solitude/source/img/error_load.avif | Bin 0 -> 3803 bytes themes/solitude/source/img/flower.gif | Bin 0 -> 200944 bytes themes/solitude/source/img/happy-sticker.avif | Bin 0 -> 1523 bytes themes/solitude/source/img/loading.avif | Bin 0 -> 9833 bytes themes/solitude/source/img/pwa/favicon.ico | Bin 0 -> 16958 bytes themes/solitude/source/img/pwa/favicon_16.ico | Bin 0 -> 1150 bytes themes/solitude/source/img/pwa/favicon_32.ico | Bin 0 -> 4286 bytes themes/solitude/source/img/recent_c.avif | Bin 0 -> 25842 bytes themes/solitude/source/js/covercolor/api.js | 59 + themes/solitude/source/js/covercolor/local.js | 136 ++ themes/solitude/source/js/main.js | 667 ++++++++++ themes/solitude/source/js/music.js | 123 ++ themes/solitude/source/js/right_menu.js | 253 ++++ themes/solitude/source/js/search/algolia.js | 181 +++ themes/solitude/source/js/search/local.js | 205 +++ .../source/js/third_party/barrage.min.js | 6 + .../source/js/third_party/efu_ai.min.js | 6 + .../source/js/third_party/envelope.min.js | 5 + .../source/js/third_party/universe.min.js | 5 + .../source/js/third_party/waterfall.min.js | 1 + themes/solitude/source/js/tw_cn.js | 126 ++ themes/solitude/source/js/utils.js | 208 ++++ 289 files changed, 23277 insertions(+) create mode 100644 themes/solitude/.github/FUNDING.yml create mode 100644 themes/solitude/.github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 themes/solitude/.github/ISSUE_TEMPLATE/config.yml create mode 100644 themes/solitude/.github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 themes/solitude/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 themes/solitude/.github/logo.svg create mode 100644 themes/solitude/.github/screenshot.webp create mode 100644 themes/solitude/.github/workflows/issue_close_question.yml create mode 100644 themes/solitude/.github/workflows/issue_invalid.yml create mode 100644 themes/solitude/.github/workflows/issue_question.yml create mode 100644 themes/solitude/.github/workflows/issue_wontfix.yml create mode 100644 themes/solitude/.github/workflows/npm-publish.yml create mode 100644 themes/solitude/.github/workflows/stale.yml create mode 100644 themes/solitude/.gitignore create mode 100644 themes/solitude/CODE_OF_CONDUCT.md create mode 100644 themes/solitude/CONTRIBUTING.md create mode 100644 themes/solitude/LICENSE create mode 100644 themes/solitude/README.md create mode 100644 themes/solitude/README_en-US.md create mode 100644 themes/solitude/README_zh-Hant.md create mode 100644 themes/solitude/SECURITY.md create mode 100644 themes/solitude/_config.yml create mode 100644 themes/solitude/languages/default.yml create mode 100644 themes/solitude/languages/en.yml create mode 100644 themes/solitude/languages/zh-CN.yml create mode 100644 themes/solitude/languages/zh-TW.yml create mode 100644 themes/solitude/layout/404.pug create mode 100644 themes/solitude/layout/archive.pug create mode 100644 themes/solitude/layout/category.pug create mode 100644 themes/solitude/layout/includes/body/gadsense.pug create mode 100644 themes/solitude/layout/includes/body/mode.pug create mode 100644 themes/solitude/layout/includes/console.pug create mode 100644 themes/solitude/layout/includes/footer.pug create mode 100644 themes/solitude/layout/includes/head.pug create mode 100644 themes/solitude/layout/includes/head/config.pug create mode 100644 themes/solitude/layout/includes/head/opengraph.pug create mode 100644 themes/solitude/layout/includes/head/page_config.pug create mode 100644 themes/solitude/layout/includes/head/pwa.pug create mode 100644 themes/solitude/layout/includes/header.pug create mode 100644 themes/solitude/layout/includes/inject/body.pug create mode 100644 themes/solitude/layout/includes/inject/head.pug create mode 100644 themes/solitude/layout/includes/keyboard.pug create mode 100644 themes/solitude/layout/includes/layout.pug create mode 100644 themes/solitude/layout/includes/loading.pug create mode 100644 themes/solitude/layout/includes/mixins/articleSort.pug create mode 100644 themes/solitude/layout/includes/mixins/pagination.pug create mode 100644 themes/solitude/layout/includes/nav.pug create mode 100644 themes/solitude/layout/includes/page/about.pug create mode 100644 themes/solitude/layout/includes/page/categories.pug create mode 100644 themes/solitude/layout/includes/page/default.pug create mode 100644 themes/solitude/layout/includes/page/equipment.pug create mode 100644 themes/solitude/layout/includes/page/links.pug create mode 100644 themes/solitude/layout/includes/page/message.pug create mode 100644 themes/solitude/layout/includes/page/music.pug create mode 100644 themes/solitude/layout/includes/page/recentcomment.pug create mode 100644 themes/solitude/layout/includes/page/says.pug create mode 100644 themes/solitude/layout/includes/page/tags.pug create mode 100644 themes/solitude/layout/includes/page/tlink.pug create mode 100644 themes/solitude/layout/includes/rightmenu.pug create mode 100644 themes/solitude/layout/includes/sidebar.pug create mode 100644 themes/solitude/layout/includes/widgets/aside/aside.pug create mode 100644 themes/solitude/layout/includes/widgets/aside/asideAdsense.pug create mode 100644 themes/solitude/layout/includes/widgets/aside/asideAllInfo.pug create mode 100644 themes/solitude/layout/includes/widgets/aside/asideArchive.pug create mode 100644 themes/solitude/layout/includes/widgets/aside/asideCustom.pug create mode 100644 themes/solitude/layout/includes/widgets/aside/asideFlipCard.pug create mode 100644 themes/solitude/layout/includes/widgets/aside/asideInfoCard.pug create mode 100644 themes/solitude/layout/includes/widgets/aside/asideNewestPost.pug create mode 100644 themes/solitude/layout/includes/widgets/aside/asideNewstComments.pug create mode 100644 themes/solitude/layout/includes/widgets/aside/asideSwitch.pug create mode 100644 themes/solitude/layout/includes/widgets/aside/asideTag.pug create mode 100644 themes/solitude/layout/includes/widgets/aside/asideToc.pug create mode 100644 themes/solitude/layout/includes/widgets/aside/asideWebInfo.pug create mode 100644 themes/solitude/layout/includes/widgets/home/banner.pug create mode 100644 themes/solitude/layout/includes/widgets/home/bbTimeList.pug create mode 100644 themes/solitude/layout/includes/widgets/home/carousel.pug create mode 100644 themes/solitude/layout/includes/widgets/home/categoryBar.pug create mode 100644 themes/solitude/layout/includes/widgets/home/hometop.pug create mode 100644 themes/solitude/layout/includes/widgets/home/postList.pug create mode 100644 themes/solitude/layout/includes/widgets/home/topGroup.pug create mode 100644 themes/solitude/layout/includes/widgets/nav/group.pug create mode 100644 themes/solitude/layout/includes/widgets/nav/menu.pug create mode 100644 themes/solitude/layout/includes/widgets/nav/right.pug create mode 100644 themes/solitude/layout/includes/widgets/page/about/authorinfo.pug create mode 100644 themes/solitude/layout/includes/widgets/page/about/award.pug create mode 100644 themes/solitude/layout/includes/widgets/page/about/contentinfo.pug create mode 100644 themes/solitude/layout/includes/widgets/page/about/hobbies.pug create mode 100644 themes/solitude/layout/includes/widgets/page/about/motto.pug create mode 100644 themes/solitude/layout/includes/widgets/page/about/other.pug create mode 100644 themes/solitude/layout/includes/widgets/page/about/personalities.pug create mode 100644 themes/solitude/layout/includes/widgets/page/about/skillsinfo.pug create mode 100644 themes/solitude/layout/includes/widgets/page/about/tenyear.pug create mode 100644 themes/solitude/layout/includes/widgets/page/banner.pug create mode 100644 themes/solitude/layout/includes/widgets/page/equipment/content.pug create mode 100644 themes/solitude/layout/includes/widgets/page/links/banner.pug create mode 100644 themes/solitude/layout/includes/widgets/page/links/linksCard.pug create mode 100644 themes/solitude/layout/includes/widgets/page/links/linksDiscn.pug create mode 100644 themes/solitude/layout/includes/widgets/page/links/linksItem.pug create mode 100644 themes/solitude/layout/includes/widgets/page/message/artalk.pug create mode 100644 themes/solitude/layout/includes/widgets/page/message/content.pug create mode 100644 themes/solitude/layout/includes/widgets/page/message/js.pug create mode 100644 themes/solitude/layout/includes/widgets/page/message/twikoo.pug create mode 100644 themes/solitude/layout/includes/widgets/page/message/valine.pug create mode 100644 themes/solitude/layout/includes/widgets/page/message/waline.pug create mode 100644 themes/solitude/layout/includes/widgets/page/recentcomment/artalk.pug create mode 100644 themes/solitude/layout/includes/widgets/page/recentcomment/twikoo.pug create mode 100644 themes/solitude/layout/includes/widgets/page/recentcomment/valine.pug create mode 100644 themes/solitude/layout/includes/widgets/page/recentcomment/waline.pug create mode 100644 themes/solitude/layout/includes/widgets/post/award.pug create mode 100644 themes/solitude/layout/includes/widgets/post/copyright.pug create mode 100644 themes/solitude/layout/includes/widgets/post/post-ai.pug create mode 100644 themes/solitude/layout/includes/widgets/post/postMeta.pug create mode 100644 themes/solitude/layout/includes/widgets/post/postNav.pug create mode 100644 themes/solitude/layout/includes/widgets/post/wave.pug create mode 100644 themes/solitude/layout/includes/widgets/randomlink.pug create mode 100644 themes/solitude/layout/includes/widgets/third-party/comments/artalk.pug create mode 100644 themes/solitude/layout/includes/widgets/third-party/comments/comment.pug create mode 100644 themes/solitude/layout/includes/widgets/third-party/comments/giscus.pug create mode 100644 themes/solitude/layout/includes/widgets/third-party/comments/js.pug create mode 100644 themes/solitude/layout/includes/widgets/third-party/comments/twikoo.pug create mode 100644 themes/solitude/layout/includes/widgets/third-party/comments/valine.pug create mode 100644 themes/solitude/layout/includes/widgets/third-party/comments/waline.pug create mode 100644 themes/solitude/layout/includes/widgets/third-party/music.pug create mode 100644 themes/solitude/layout/includes/widgets/third-party/news-comment/artalk.pug create mode 100644 themes/solitude/layout/includes/widgets/third-party/news-comment/newest-comment.pug create mode 100644 themes/solitude/layout/includes/widgets/third-party/news-comment/twikoo.pug create mode 100644 themes/solitude/layout/includes/widgets/third-party/news-comment/valine.pug create mode 100644 themes/solitude/layout/includes/widgets/third-party/news-comment/waline.pug create mode 100644 themes/solitude/layout/includes/widgets/third-party/pjax.pug create mode 100644 themes/solitude/layout/includes/widgets/third-party/search/algolia-search.pug create mode 100644 themes/solitude/layout/includes/widgets/third-party/search/index.pug create mode 100644 themes/solitude/layout/includes/widgets/third-party/search/local-search.pug create mode 100644 themes/solitude/layout/includes/widgets/third-party/tianli-talk.pug create mode 100644 themes/solitude/layout/index.pug create mode 100644 themes/solitude/layout/page.pug create mode 100644 themes/solitude/layout/post.pug create mode 100644 themes/solitude/layout/tag.pug create mode 100644 themes/solitude/package.json create mode 100644 themes/solitude/plugins.yml create mode 100644 themes/solitude/scripts/event/cdn.js create mode 100644 themes/solitude/scripts/event/init.js create mode 100644 themes/solitude/scripts/event/merge_config.js create mode 100644 themes/solitude/scripts/event/page.js create mode 100644 themes/solitude/scripts/event/welcome.js create mode 100644 themes/solitude/scripts/filter/checkThemeConfig.js create mode 100644 themes/solitude/scripts/filter/comment.js create mode 100644 themes/solitude/scripts/filter/default.js create mode 100644 themes/solitude/scripts/filter/lazyload.js create mode 100644 themes/solitude/scripts/filter/post_image.js create mode 100644 themes/solitude/scripts/filter/randomPosts.js create mode 100644 themes/solitude/scripts/helper/getArchiveLength.js create mode 100644 themes/solitude/scripts/helper/inject_head_js.js create mode 100644 themes/solitude/scripts/helper/page.js create mode 100644 themes/solitude/scripts/helper/related_post.js create mode 100644 themes/solitude/scripts/helper/stylus.js create mode 100644 themes/solitude/scripts/tags/btns.js create mode 100644 themes/solitude/scripts/tags/button.js create mode 100644 themes/solitude/scripts/tags/bvideo.js create mode 100644 themes/solitude/scripts/tags/checkbox.js create mode 100644 themes/solitude/scripts/tags/fold.js create mode 100644 themes/solitude/scripts/tags/gallery.js create mode 100644 themes/solitude/scripts/tags/image.js create mode 100644 themes/solitude/scripts/tags/inline-image.js create mode 100644 themes/solitude/scripts/tags/label.js create mode 100644 themes/solitude/scripts/tags/link.js create mode 100644 themes/solitude/scripts/tags/media.js create mode 100644 themes/solitude/scripts/tags/mermaid.js create mode 100644 themes/solitude/scripts/tags/note.js create mode 100644 themes/solitude/scripts/tags/span.js create mode 100644 themes/solitude/scripts/tags/tabs.js create mode 100644 themes/solitude/scripts/tags/timeline.js create mode 100644 themes/solitude/source/css/_comments/comment.styl create mode 100644 themes/solitude/source/css/_comments/twikoo.styl create mode 100644 themes/solitude/source/css/_comments/valine.styl create mode 100644 themes/solitude/source/css/_global/animation.styl create mode 100644 themes/solitude/source/css/_global/function.styl create mode 100644 themes/solitude/source/css/_global/index.styl create mode 100644 themes/solitude/source/css/_highlight/color.styl create mode 100644 themes/solitude/source/css/_highlight/highlight/diff.styl create mode 100644 themes/solitude/source/css/_highlight/highlight/index.styl create mode 100644 themes/solitude/source/css/_highlight/index.styl create mode 100644 themes/solitude/source/css/_highlight/prismjs/diff.styl create mode 100644 themes/solitude/source/css/_highlight/prismjs/index.styl create mode 100644 themes/solitude/source/css/_highlight/prismjs/line-number.styl create mode 100644 themes/solitude/source/css/_highlight/theme/default.styl create mode 100644 themes/solitude/source/css/_highlight/theme/mac.styl create mode 100644 themes/solitude/source/css/_layout/article-container.styl create mode 100644 themes/solitude/source/css/_layout/article-sort.styl create mode 100644 themes/solitude/source/css/_layout/aside.styl create mode 100644 themes/solitude/source/css/_layout/capsule.styl create mode 100644 themes/solitude/source/css/_layout/console.styl create mode 100644 themes/solitude/source/css/_layout/footer.styl create mode 100644 themes/solitude/source/css/_layout/fullpage.styl create mode 100644 themes/solitude/source/css/_layout/header.styl create mode 100644 themes/solitude/source/css/_layout/keyboard.styl create mode 100644 themes/solitude/source/css/_layout/other.styl create mode 100644 themes/solitude/source/css/_layout/pace.styl create mode 100644 themes/solitude/source/css/_layout/pagination.styl create mode 100644 themes/solitude/source/css/_layout/recent-post.styl create mode 100644 themes/solitude/source/css/_layout/rightmenu.styl create mode 100644 themes/solitude/source/css/_layout/sidebar.styl create mode 100644 themes/solitude/source/css/_layout/universe.styl create mode 100644 themes/solitude/source/css/_mode/index.styl create mode 100644 themes/solitude/source/css/_page/_about/about.styl create mode 100644 themes/solitude/source/css/_page/_about/author.styl create mode 100644 themes/solitude/source/css/_page/_about/buff.styl create mode 100644 themes/solitude/source/css/_page/_about/careers.styl create mode 100644 themes/solitude/source/css/_page/_about/contentinfo.styl create mode 100644 themes/solitude/source/css/_page/_about/game.styl create mode 100644 themes/solitude/source/css/_page/_about/like.styl create mode 100644 themes/solitude/source/css/_page/_about/maxim.styl create mode 100644 themes/solitude/source/css/_page/_about/myphoto.styl create mode 100644 themes/solitude/source/css/_page/_about/oneself.styl create mode 100644 themes/solitude/source/css/_page/_about/personalities.styl create mode 100644 themes/solitude/source/css/_page/_about/reward.styl create mode 100644 themes/solitude/source/css/_page/_about/skills.styl create mode 100644 themes/solitude/source/css/_page/_about/statistic.styl create mode 100644 themes/solitude/source/css/_page/_about/tenyear.styl create mode 100644 themes/solitude/source/css/_page/_gallery/index.styl create mode 100644 themes/solitude/source/css/_page/_home/carousel.styl create mode 100644 themes/solitude/source/css/_page/_home/category-bar.styl create mode 100644 themes/solitude/source/css/_page/_home/home-top.styl create mode 100644 themes/solitude/source/css/_page/_home/home.styl create mode 100644 themes/solitude/source/css/_page/category.styl create mode 100644 themes/solitude/source/css/_page/equipment.styl create mode 100644 themes/solitude/source/css/_page/error.styl create mode 100644 themes/solitude/source/css/_page/google.styl create mode 100644 themes/solitude/source/css/_page/index.styl create mode 100644 themes/solitude/source/css/_page/links.styl create mode 100644 themes/solitude/source/css/_page/message.styl create mode 100644 themes/solitude/source/css/_page/music.styl create mode 100644 themes/solitude/source/css/_page/other.styl create mode 100644 themes/solitude/source/css/_page/recentcomment.styl create mode 100644 themes/solitude/source/css/_page/says.styl create mode 100644 themes/solitude/source/css/_page/tag.styl create mode 100644 themes/solitude/source/css/_post/ads.styl create mode 100644 themes/solitude/source/css/_post/commentBarrage.styl create mode 100644 themes/solitude/source/css/_post/copyright.styl create mode 100644 themes/solitude/source/css/_post/index.styl create mode 100644 themes/solitude/source/css/_post/meta.styl create mode 100644 themes/solitude/source/css/_post/pagination.styl create mode 100644 themes/solitude/source/css/_post/postAI.styl create mode 100644 themes/solitude/source/css/_post/relatedPost.styl create mode 100644 themes/solitude/source/css/_post/tools.styl create mode 100644 themes/solitude/source/css/_search/algolia-search.styl create mode 100644 themes/solitude/source/css/_search/local-search.styl create mode 100644 themes/solitude/source/css/_tags/btns.styl create mode 100644 themes/solitude/source/css/_tags/button.styl create mode 100644 themes/solitude/source/css/_tags/checkbox.styl create mode 100644 themes/solitude/source/css/_tags/fold.styl create mode 100644 themes/solitude/source/css/_tags/gallery.styl create mode 100644 themes/solitude/source/css/_tags/index.styl create mode 100644 themes/solitude/source/css/_tags/label.styl create mode 100644 themes/solitude/source/css/_tags/link.styl create mode 100644 themes/solitude/source/css/_tags/media.styl create mode 100644 themes/solitude/source/css/_tags/mermaid.styl create mode 100644 themes/solitude/source/css/_tags/note.styl create mode 100644 themes/solitude/source/css/_tags/span.styl create mode 100644 themes/solitude/source/css/_tags/tabs.styl create mode 100644 themes/solitude/source/css/_tags/timeline.styl create mode 100644 themes/solitude/source/css/index.styl create mode 100644 themes/solitude/source/css/third_party/snackbar.min.css create mode 100644 themes/solitude/source/css/third_party/tianli_talk.styl create mode 100644 themes/solitude/source/css/var.styl create mode 100644 themes/solitude/source/img/404.avif create mode 100644 themes/solitude/source/img/avatar.avif create mode 100644 themes/solitude/source/img/default.avif create mode 100644 themes/solitude/source/img/error_load.avif create mode 100644 themes/solitude/source/img/flower.gif create mode 100644 themes/solitude/source/img/happy-sticker.avif create mode 100644 themes/solitude/source/img/loading.avif create mode 100644 themes/solitude/source/img/pwa/favicon.ico create mode 100644 themes/solitude/source/img/pwa/favicon_16.ico create mode 100644 themes/solitude/source/img/pwa/favicon_32.ico create mode 100644 themes/solitude/source/img/recent_c.avif create mode 100644 themes/solitude/source/js/covercolor/api.js create mode 100644 themes/solitude/source/js/covercolor/local.js create mode 100644 themes/solitude/source/js/main.js create mode 100644 themes/solitude/source/js/music.js create mode 100644 themes/solitude/source/js/right_menu.js create mode 100644 themes/solitude/source/js/search/algolia.js create mode 100644 themes/solitude/source/js/search/local.js create mode 100644 themes/solitude/source/js/third_party/barrage.min.js create mode 100644 themes/solitude/source/js/third_party/efu_ai.min.js create mode 100644 themes/solitude/source/js/third_party/envelope.min.js create mode 100644 themes/solitude/source/js/third_party/universe.min.js create mode 100644 themes/solitude/source/js/third_party/waterfall.min.js create mode 100644 themes/solitude/source/js/tw_cn.js create mode 100644 themes/solitude/source/js/utils.js diff --git a/themes/solitude/.github/FUNDING.yml b/themes/solitude/.github/FUNDING.yml new file mode 100644 index 0000000..09db6b7 --- /dev/null +++ b/themes/solitude/.github/FUNDING.yml @@ -0,0 +1,13 @@ +# These are supported funding model platforms + +github: [everfu] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: everfu # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +custom: ['https://afdian.net/a/everfu', 'https://s3.qjqq.cn/47/66374315ebd08.webp!color', 'https://s3.qjqq.cn/47/663742bac8e52.webp!color'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/themes/solitude/.github/ISSUE_TEMPLATE/bug_report.yml b/themes/solitude/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..89d56df --- /dev/null +++ b/themes/solitude/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,108 @@ +name: Bug 报告 🐛 +description: 本项目仅对最新版本进行维护,使用老版本出现问题的,请先升级到最新版本或使用dev版本,升级完后如果发现bug依然存在,请继续填写此issue。 +labels: ['status: needs check'] +title: "[Bug]: " +body: + - type: markdown + attributes: + value: | + ### ⚠️ 前置确认 + 1. 请确保阅读过本主题GitHub项目说明 + 2. 查询主题使用文档的相关内容和正确配置 + 3. 使用的是Solitude主题最新版本 + 4. 执行`npm ls -dept 0`检查是否已安装对应插件 + 5. [FAQS](https://solitude-docs.efu.me/faq) 中无类似问题 + - type: checkboxes + attributes: + label: 前置确认 + options: + - label: 我确认我运行的是最新版本的主题,并且安装了所需的依赖,在[FAQS](https://solitude-docs.efu.me/faq)中也未找到类似问题。 + required: true + - type: checkboxes + attributes: + label: ⚠️ 搜索issues中是否已存在类似问题 + description: > + 请在 [历史issue](https://github.com/valor-x/hexo-theme-solitude/issues) 中清空输入框,搜索你的问题 + 或相关日志的关键词来查找是否存在类似问题。 + options: + - label: 我已经搜索过issues和disscussions,没有跟我遇到的问题相关的issue + required: true + - type: markdown + attributes: + value: | + 请在上方的`title`中填写你对你所遇到问题的简略总结,这将帮助其他人更好的找到相似问题,谢谢❤️。 + - type: dropdown + attributes: + label: 操作系统类型? + description: > + 请选择你运行程序的操作系统类型。 + options: + - Windows + - Mac/Linux + validations: + required: true + - type: dropdown + attributes: + label: 运行的Hexo版本是? + description: | + 请选择你运行的`Hexo`版本。 + 注意:在`Hexo 7.0+`版本中,Node的最低支持的版本为:14.0.0。 + 你可以前往 [Node.js 版本限制](https://hexo.io/zh-cn/docs/#Node-js-%E7%89%88%E6%9C%AC%E9%99%90%E5%88%B6)进行查看详情。 + options: + - Hexo 7.0.0 + - Hexo 6.3.0及以下 + validations: + required: true + - type: dropdown + attributes: + label: 你所使用的主题版本是稳定/最新? + description: | + **注意:新手小白推荐使用稳定版本(main分支)。** + 具有一定的排错能力且具备开发知识的同学可以尝试使用开发版(dev分支)进行体验。 + options: + - 稳定版(main) + - 开发板 (dev) + validations: + required: true + - type: textarea + attributes: + label: 问题描述 😯 + description: 详细描述出现的问题,或提供有关截图。 + placeholder: "e.g., 我在...出现..." + - type: textarea + attributes: + label: 终端日志 📒 + description: | + 在此处粘贴终端运行日志,这会帮助我们更好的分析问题。 + 建议使用`hexo s -debug`进行调试输出,打印出的日志会更有帮助。 + +
+ 示例 + ERROR Process failed: layout/index.pug + Error: ENOENT: no such file or directory, open 'E:\OC\Desktop\iCat\Solitude\themes\solitude\layout\includes\widgets\home\bbTimeList.pug' + at E:\OC\Desktop\iCat\Solitude\themes\solitude\layout\index.pug line 6 + at Object.openSync (node:fs:590:3) + at Object.readFileSync (node:fs:458:35) + at Function.read (E:\OC\Desktop\iCat\Solitude\node_modules\pug-load\index.js:85:13) + at Object.read (E:\OC\Desktop\iCat\Solitude\node_modules\pug\lib\index.js:164:25) + at E:\OC\Desktop\iCat\Solitude\node_modules\pug-load\index.js:28:25 + at walkAST (E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:26:18) + at E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:112:20 + at Array.reduce () + at walkAndMergeNodes (E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:111:18) + at walkAST (E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:40:19) + at walkAST (E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:69:26) + at E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:112:20 + at Array.reduce () + at walkAndMergeNodes (E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:111:18) + at walkAST (E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:40:19) + at walkAST (E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:51:21) + at E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:112:20 + at Array.reduce () + at walkAndMergeNodes (E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:111:18) + at walkAST (E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:40:19) + at E:\OC\Desktop\iCat\Solitude\node_modules\pug-walk\index.js:112:20 + at Array.reduce () + INFO Hexo is running at http://localhost:4000/ . Press Ctrl+C to stop. +
+ placeholder: "e.g., <此处粘贴终端日志>" diff --git a/themes/solitude/.github/ISSUE_TEMPLATE/config.yml b/themes/solitude/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..2a4e000 --- /dev/null +++ b/themes/solitude/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,21 @@ +blank_issues_enabled: false +contact_links: + - name: 关于主题使用问题 + url: https://github.com/valor-x/hexo-theme-solitude/discussions + about: 一些使用上碰到的问题 Discussion 询问。 Please ask questions in Discussion. + + - name: Solitude Q&A + url: https://docs.efu.me/faq + about: Solitude Q&A + + - name: QQ群 + url: https://qm.qq.com/q/mxfomMvJPG + about: 新建立的QQ群 + + - name: Discord + url: https://discord.gg/Y8VEvVgW + about: 'Official Discord Group' + + - name: Telegram + url: https://t.me/solitudePro + about: 'Official Telegram Group' diff --git a/themes/solitude/.github/ISSUE_TEMPLATE/feature_request.yml b/themes/solitude/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..65555e2 --- /dev/null +++ b/themes/solitude/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,48 @@ +name: 功能新增✨ +description: 为这个项目提出一个想法 +title: "[Feature]: " +labels: ["增强"] +body: + - type: markdown + attributes: + value: "感谢你抽出宝贵时间提出新功能建议!" + - type: input + id: feature_summary + attributes: + label: 功能简介 + description: 对功能的清晰简明的描述。 + placeholder: "e.g., 我想要..." + validations: + required: true + - type: textarea + id: feature_motivation + attributes: + label: 问题描述 + description: 对问题是什么进行清晰简洁的描述。 + placeholder: "e.g., 我在...需要..." + validations: + required: true + - type: textarea + id: feature_description + attributes: + label: 实现效果 + description: 清晰简洁地描述您想要发生的事情。 + placeholder: "e.g., 这个功能实现...的效果" + validations: + required: true + - type: textarea + id: feature_alternatives + attributes: + label: 你想到的可行的替代方案 + description: 对你考虑过的任何替代解决方案或功能进行清晰简洁的描述。 + placeholder: "e.g., 解决这个问题的一种方法是..." + validations: + required: false + - type: textarea + id: additional_context + attributes: + label: 其他内容 + description: 在此处添加有关功能请求的任何其他上下文或屏幕截图。 + placeholder: "在这里添加屏幕截图或着文字内容..." + validations: + required: false diff --git a/themes/solitude/.github/PULL_REQUEST_TEMPLATE.md b/themes/solitude/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..ea1d7f6 --- /dev/null +++ b/themes/solitude/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,35 @@ + + +### 🔗 链接 issue + + + +### ❓ 修改类型 + + + +- [ ] 🐞 Bug fix (修复问题的连续性改) +- [ ] 👌 增强功能(改进现有功能,如性能) +- [ ] ✨ Feature(添加功能的连续性修改) +- [ ] ⚠️ 中断修改(重大的修改,如配置文件调整、模块移除) + +### 📚 描述 + + + + + +### 📝 清单 + + + + + +- [ ] 我已链接问题或讨论。 +- [ ] 我已经添加了测试(如果可能的话)。 +- [ ] 我已相应地更新了[文档](https://github.com/efuo/theme-solitude-docs)。 diff --git a/themes/solitude/.github/logo.svg b/themes/solitude/.github/logo.svg new file mode 100644 index 0000000..4e9ab5d --- /dev/null +++ b/themes/solitude/.github/logo.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/themes/solitude/.github/screenshot.webp b/themes/solitude/.github/screenshot.webp new file mode 100644 index 0000000000000000000000000000000000000000..c6c943da5f6cfb276f5cfea6dc8b85a2a3e2acab GIT binary patch literal 60106 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℞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 literal 0 HcmV?d00001 diff --git a/themes/solitude/.github/workflows/issue_close_question.yml b/themes/solitude/.github/workflows/issue_close_question.yml new file mode 100644 index 0000000..bda68be --- /dev/null +++ b/themes/solitude/.github/workflows/issue_close_question.yml @@ -0,0 +1,25 @@ +name: Close need info + +on: + schedule: + - cron: "0 0 */1 * *" + workflow_dispatch: + +jobs: + close-need-info: + runs-on: ubuntu-latest + steps: + - name: close-issues + uses: actions-cool/issues-helper@v3 + with: + actions: "close-issues" + token: ${{ secrets.GITHUB_TOKEN }} + labels: "question" + inactive-day: 60 + close-reason: "not_planned" + body: | + Hi there! This issue has been automatically closed because it has not had any activity for 60 days. We label issues as "questions" in hopes of community or maintainer input, and it seems this issue has gone stale. + + If you still need assistance or believe this closure is a mistake, please feel free to reopen the issue or create a new one with updated details. We're here to help! + + Thank you for your contributions to our project! diff --git a/themes/solitude/.github/workflows/issue_invalid.yml b/themes/solitude/.github/workflows/issue_invalid.yml new file mode 100644 index 0000000..2aa7ba0 --- /dev/null +++ b/themes/solitude/.github/workflows/issue_invalid.yml @@ -0,0 +1,18 @@ +name: Issue Invalid + +on: + issues: + types: [labeled] + +jobs: + lock-issue: + runs-on: ubuntu-latest + if: github.event.label.name == 'invalid' + steps: + - name: Lock issue + uses: actions-cool/issues-helper@v2 + with: + actions: "lock-issue" + token: ${{ secrets.GITHUB_TOKEN }} + issue-number: ${{ github.event.issue.number }} + lock-reason: "off-topic" diff --git a/themes/solitude/.github/workflows/issue_question.yml b/themes/solitude/.github/workflows/issue_question.yml new file mode 100644 index 0000000..eaf3d39 --- /dev/null +++ b/themes/solitude/.github/workflows/issue_question.yml @@ -0,0 +1,30 @@ +name: Issue Question + +on: + issues: + types: [labeled] + +jobs: + create-comment: + runs-on: ubuntu-latest + if: github.event.label.name == 'question' + steps: + - name: Create comment + uses: actions-cool/issues-helper@v2.0.0 + with: + actions: "create-comment" + token: ${{ secrets.ISSUSE_TOKEN }} + issue-number: ${{ github.event.issue.number }} + body: | + Hello! 👋 + + Thank you for submitting your question. To ensure we can provide the best answer possible, could you please confirm you've provided the following details: + - A clear and concise description of your question. + - Any relevant code snippets or links to your project. + - What you've tried so far in attempting to solve your issue. + + In the meantime, you might find the answer to your question in our [FAQs](https://solitude-docs.efu.me/faq) or [documentation](https://solitude-docs.efu.me/). + + We aim to respond to questions within 48 hours. If your question is urgent, please consider reaching out through our support channels. + + Thanks again for reaching out, and we look forward to assisting you! diff --git a/themes/solitude/.github/workflows/issue_wontfix.yml b/themes/solitude/.github/workflows/issue_wontfix.yml new file mode 100644 index 0000000..1d722ab --- /dev/null +++ b/themes/solitude/.github/workflows/issue_wontfix.yml @@ -0,0 +1,29 @@ +name: Issue Wontfix + +on: + issues: + types: [labeled] + +jobs: + handle-wontfix: + runs-on: ubuntu-latest + if: github.event.label.name == 'wontfix' + steps: + - name: Create comment for wontfix + uses: actions-cool/issues-helper@v3 + with: + actions: "create-comment" + token: ${{ secrets.GITHUB_TOKEN }} + issue-number: ${{ github.event.issue.number }} + body: | + Hi there! This issue has been marked as 'wontfix'. It means we've reviewed the issue but have chosen not to pursue it for reasons that may vary (e.g., aligning with the project's current priorities, outside of project scope, etc.). + + We understand this might not be the outcome you were hoping for. If you believe this decision should be reconsidered, please provide any additional context or reasoning that was not previously considered. + + Thank you for your understanding and for contributing to the project. Your efforts are greatly appreciated! + - name: Close issue after wontfix + uses: actions-cool/issues-helper@v3 + with: + actions: "close-issue" + token: ${{ secrets.GITHUB_TOKEN }} + issue-number: ${{ github.event.issue.number }} diff --git a/themes/solitude/.github/workflows/npm-publish.yml b/themes/solitude/.github/workflows/npm-publish.yml new file mode 100644 index 0000000..5dec6e9 --- /dev/null +++ b/themes/solitude/.github/workflows/npm-publish.yml @@ -0,0 +1,20 @@ +name: Node.js Package + +on: + release: + types: [created] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + token: ${{ secrets.ACCESS_TOKEN }} + - uses: actions/setup-node@v2 + with: + node-version: '14' + registry-url: 'https://registry.npmjs.org' + - run: npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/themes/solitude/.github/workflows/stale.yml b/themes/solitude/.github/workflows/stale.yml new file mode 100644 index 0000000..f3d7667 --- /dev/null +++ b/themes/solitude/.github/workflows/stale.yml @@ -0,0 +1,19 @@ +name: 'Close stale issues and PRs' +on: + schedule: + - cron: '30 1 * * *' + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v5 + with: + days-before-issue-stale: 30 + days-before-pr-stale: -1 + days-before-close: 7 + stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.' + close-pr-message: 'This issue has not seen any activity since it was marked stale. Closing.' + stale-issue-label: 'Stale' + exempt-issue-labels: 'pinned,bug,enhancement,documentation,Plan' + operations-per-run: 1000 diff --git a/themes/solitude/.gitignore b/themes/solitude/.gitignore new file mode 100644 index 0000000..f483e0d --- /dev/null +++ b/themes/solitude/.gitignore @@ -0,0 +1,3 @@ +.DS_STORE +.vscode +.idea \ No newline at end of file diff --git a/themes/solitude/CODE_OF_CONDUCT.md b/themes/solitude/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..5138a54 --- /dev/null +++ b/themes/solitude/CODE_OF_CONDUCT.md @@ -0,0 +1,88 @@ + +# 贡献者公约 + +## 我们的承诺 + +身为社区成员、贡献者和领袖,我们承诺使社区参与者不受骚扰,无论其年龄、体型、可见或不可见的缺陷、族裔、性征、性别认同和表达、经验水平、教育程度、社会与经济地位、国籍、相貌、种族、种姓、肤色、宗教信仰、性倾向或性取向如何。 + +我们承诺以有助于建立开放、友善、多样化、包容、健康社区的方式行事和互动。 + +## 我们的准则 + +有助于为我们的社区创造积极环境的行为例子包括但不限于: + +* 表现出对他人的同情和善意 +* 尊重不同的主张、观点和感受 +* 提出和大方接受建设性意见 +* 承担责任并向受我们错误影响的人道歉 +* 注重社区共同诉求,而非个人得失 + +不当行为例子包括: + +* 使用情色化的语言或图像,及性引诱或挑逗 +* 嘲弄、侮辱或诋毁性评论,以及人身或政治攻击 +* 公开或私下的骚扰行为 +* 未经他人明确许可,公布他人的私人信息,如物理或电子邮件地址 +* 其他有理由认定为违反职业操守的不当行为 + +## 责任和权力 + +社区领袖有责任解释和落实我们所认可的行为准则,并妥善公正地对他们认为不当、威胁、冒犯或有害的任何行为采取纠正措施。 + +社区领导有权力和责任删除、编辑或拒绝或拒绝与本行为准则不相符的评论(comment)、提交(commits)、代码、维基(wiki)编辑、议题(issues)或其他贡献,并在适当时机知采取措施的理由。 + +## 适用范围 + +本行为准则适用于所有社区场合,也适用于在公共场所代表社区时的个人。 + +代表社区的情形包括使用官方电子邮件地址、通过官方社交媒体帐户发帖或在线上或线下活动中担任指定代表。 + +## 监督 + +辱骂、骚扰或其他不可接受的行为可通过 [插入联系方式] 向负责监督的社区领袖报告。 +所有投诉都将得到及时和公平的审查和调查。 + +所有社区领袖都有义务尊重任何事件报告者的隐私和安全。 + +## 处理方针 + +社区领袖将遵循下列社区处理方针来明确他们所认定违反本行为准则的行为的处理方式: + +### 1. 纠正 + +**社区影响**:使用不恰当的语言或其他在社区中被认定为不符合职业道德或不受欢迎的行为。 + +**处理意见**:由社区领袖发出非公开的书面警告,明确说明违规行为的性质,并解释举止如何不妥。或将要求公开道歉。 + +### 2. 警告 + +**社区影响**:单个或一系列违规行为。 + +**处理意见**:警告并对连续性行为进行处理。在指定时间内,不得与相关人员互动,包括主动与行为准则执行者互动。这包括避免在社区场所和外部渠道中的互动。违反这些条款可能会导致临时或永久封禁。 + +### 3. 临时封禁 + +**社区影响**: 严重违反社区准则,包括持续的不当行为。 + +**处理意见**: 在指定时间内,暂时禁止与社区进行任何形式的互动或公开交流。在此期间,不得与相关人员进行公开或私下互动,包括主动与行为准则执行者互动。违反这些条款可能会导致永久封禁。 + +### 4. 永久封禁 + +**社区影响**:行为模式表现出违反社区准则,包括持续的不当行为、骚扰个人或攻击或贬低某个类别的个体。 + +**处理意见**:永久禁止在社区内进行任何形式的公开互动。 + +## 参见 + +本行为准则改编自 [Contributor Covenant][homepage] 2.1 版, 参见 [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]。 + +社区处理方针灵感来源于 [Mozilla's code of conduct enforcement ladder][Mozilla CoC]。 + +有关本行为准则的常见问题的答案,参见 [https://www.contributor-covenant.org/faq][FAQ]。 +其他语言翻译参见 [https://www.contributor-covenant.org/translations][translations]。 + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/themes/solitude/CONTRIBUTING.md b/themes/solitude/CONTRIBUTING.md new file mode 100644 index 0000000..edf6664 --- /dev/null +++ b/themes/solitude/CONTRIBUTING.md @@ -0,0 +1,43 @@ +# 代码贡献指南 + +1. 首先非常欢迎和感谢对本项目发起 `Pull Request` 的热心小伙伴们。 +2. **特别提示:请务必在 `dev` 分支提交 `PR`,`main` 分支目前仅是正式版的代码,即发布正式版本后才会从 `dev` 分支进行合并。** +3. 本项目代码风格为使用2个空格代表一个Tab,因此在提交代码时请注意一下,否则很容易在IDE格式化代码后与原代码产生大量diff,这样会给其他人阅读代码带来极大的困扰。 +4. 当你遇到这几种情况,非常欢迎你做出贡献,如纠正拼写错误、损坏的链接、或者是其它较明显的错误,又或者是开始一项别人请求的任务,或者是过去在 `issue` 中早就讨论过的。 +5. **提交代码前,请再三检查并测试是否能正常运行,如若有难点无法解决,请在提交时注明情况。并且保证新增加或者修改的方法都有完整的文档说明。** +6. 本项目可以采用两种方式接受代码贡献: + - 第一种就是基于[Git Flow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow)开发流程,因此在发起Pull Request的时候请选择dev分支,详细步骤参考后文,推荐使用此种方式贡献代码。 + - 另外一种贡献代码的方式就是加入Solitude开发组,前提是对自己的代码足够自信就可以申请加入,加入之后可以随时直接提交代码,但要注意对所做的修改或新增的代码进行单元测试,保证提交代码没有明显问题。 + + +### PR方式贡献代码步骤 + +* 在 GitHub 上 `fork` 到自己的仓库,如 `yife68/Hexo-Theme-Solitude`,然后 `clone` 到本地Hexo主题目录,并设置用户信息。 + +```bash +$ git clone git@github.com:{your-github-username}/hexo-theme-solitude.git themes/solitude +$ cd solitude +$ git config user.name "yourname" +$ git config user.email "your email" +``` + +* 修改代码后提交,并推送到自己的仓库。 + +```bash +$ #do some change on the content +$ git commit -am "Fix issue #1: change something" +$ git push +``` + +* 在 `GitHub` 上提交 `Pull Request`。 +* 定期使用项目仓库内容更新自己仓库内容。 + +```bash +$ git remote add upstream https://github.com/everfu/hexo-theme-solitude +$ git fetch upstream +$ git checkout dev +$ git rebase upstream/dev +$ git push -f origin dev +``` + +* 不得添加任何第三方的创作 \ No newline at end of file diff --git a/themes/solitude/LICENSE b/themes/solitude/LICENSE new file mode 100644 index 0000000..d723651 --- /dev/null +++ b/themes/solitude/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 EverFu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/themes/solitude/README.md b/themes/solitude/README.md new file mode 100644 index 0000000..05b1cd1 --- /dev/null +++ b/themes/solitude/README.md @@ -0,0 +1,83 @@ +简体中文丨[繁体中文](README_zh-Hant.md)丨[English](README_en-US.md) + +
+ + Solitude logo + +

Hexo Theme Solitude

+ + 一款优雅的 Hexo 主题,支持懒加载、PWA、Latex 以及多种评论系统。 + + 主题设计由 [@张洪Heo](https://github.com/zhheo) 全权授权 + +![npm package](https://img.shields.io/npm/v/hexo-theme-solitude?logo=npm) +![release](https://img.shields.io/github/package-json/v/valor-x/hexo-theme-solitude/master?color=%231ab1ad&label=release) +![license](https://img.shields.io/github/license/valor-x/hexo-theme-solitude?color=FF5531) +[![Stars](https://img.shields.io/github/stars/everfu/hexo-theme-solitude)](https://github.com/everfu/hexo-theme-solitude/stargazers) +[![NPM all downloads](https://img.shields.io/npm/dy/hexo-theme-solitude?color=white)](https://www.npmjs.com/package/hexo-theme-solitude) + +![hexo version](https://img.shields.io/badge/hexo-7.0.0+-blue?logo=hexo&logoColor=white) +![node version](https://img.shields.io/badge/node-14.0.0-white?logo=node.js&logoColor=white) +[![Socket Badge](https://socket.dev/api/badge/npm/package/hexo-theme-solitude/)](https://socket.dev/npm/package/hexo-theme-solitude/overview) + +[![twiter](https://img.shields.io/badge/Twitter-gray?logo=x)](https://twitter.com/efu_oo) +[![TG](https://img.shields.io/badge/Telegram-gray?logo=Telegram&logoColor=white)](https://t.me/solitudePro) + +![JetBrains](https://img.shields.io/badge/jetbrains-support-black?logo=jetbrains) +![DuoLingo](https://img.shields.io/badge/duolingo-support-black?logo=duolingo&logoColor=white) + +[![gitee](https://img.shields.io/badge/Gitee-red?logo=gitee)](https://gitee.com/nsjjd_w/hexo-theme-solitude) +[![gitlab](https://img.shields.io/badge/GitLab-blue?logo=gitlab)](https://gitlab.com/efu/hexo-theme-solitude) + +[文档](https://solitude.js.org/)丨[预览](https://www.efu.me/) + +
+ +![Screenshot](.github/screenshot.webp) + +## 特性 + +- 页面懒加载(Pjax)、图片懒加载(LazyLoad)、离线应用(PWA) +- 评论(Twikoo、Waline、Valine、Artalk、Giscus),支持双评论 +- 昼夜切换(ColorMode) +- 灯箱(medium-zoom、fancybox) +- 数学公式(Latex) +- 特色页面:即刻短文、我的装备、在线工具、音乐馆、友链鱼塘、相册页、豆瓣页、弹幕留言页 +- 文章功能:AI 摘要、代码高亮 + +## Todo + +- [x] 首页顶部新样式 +- [x] 首页文章列表三列显示 +- [x] btns 外挂标签 + +> 如有问题请提 [issue](https://github.com/everfu/hexo-theme-solitude/issues) + +## 应用 + +1. 使用 NPM 包进行安装 + ```bash + npm i hexo-theme-solitude + ``` +2. 应用主题 + ```yaml + theme: solitude + ``` + +前往 [文档](https://solitude.js.org/) 获取更多信息。 + +## 赞助者 + +[!["Buy Me A Coffee"](https://img.buymeacoffee.com/button-api/?text=请我喝杯咖啡&emoji=%E2%98%95&everfu=ezgif&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff)](https://www.buymeacoffee.com/everfu) + +

+ + 赞助者 + +

+ +## 版权 + +[MIT](./LICENSE) License © 2023-至今 [EverFu](https://github.com/efuo) + +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fvalor-x%2Fhexo-theme-solitude.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fvalor-x%2Fhexo-theme-solitude?ref=badge_large) diff --git a/themes/solitude/README_en-US.md b/themes/solitude/README_en-US.md new file mode 100644 index 0000000..262880d --- /dev/null +++ b/themes/solitude/README_en-US.md @@ -0,0 +1,80 @@ +[简体中文](README.md)丨[繁体中文](README_zh-Hant.md)丨English + +
+ + Solitude logo + +

Hexo Theme Solitude

+ + An elegant Hexo theme that supports lazy loading, PWA, Latex, and multiple comment systems. + + Theme design is fully licensed by [@张洪Heo](https://github.com/zhheo). + +![npm package](https://img.shields.io/npm/v/hexo-theme-solitude?logo=npm) +![release](https://img.shields.io/github/package-json/v/valor-x/hexo-theme-solitude/master?color=%231ab1ad&label=release) +![license](https://img.shields.io/github/license/valor-x/hexo-theme-solitude?color=FF5531) +[![Stars](https://img.shields.io/github/stars/everfu/hexo-theme-solitude)](https://github.com/everfu/hexo-theme-solitude/stargazers) +[![NPM all downloads](https://img.shields.io/npm/dy/hexo-theme-solitude?color=white)](https://www.npmjs.com/package/hexo-theme-solitude) + +![hexo version](https://img.shields.io/badge/hexo-7.0.0+-blue?logo=hexo&logoColor=white) +![node version](https://img.shields.io/badge/node-14.0.0-white?logo=node.js&logoColor=white) +[![Socket Badge](https://socket.dev/api/badge/npm/package/hexo-theme-solitude/)](https://socket.dev/npm/package/hexo-theme-solitude/overview) + +[![twiter](https://img.shields.io/badge/Twitter-gray?logo=x)](https://twitter.com/efu_oo) +[![TG](https://img.shields.io/badge/Telegram-gray?logo=Telegram&logoColor=white)](https://t.me/solitudePro) + +![JetBrains](https://img.shields.io/badge/jetbrains-support-black?logo=jetbrains) +![DuoLingo](https://img.shields.io/badge/duolingo-support-black?logo=duolingo&logoColor=white) + +[![gitee](https://img.shields.io/badge/Gitee-red?logo=gitee)](https://gitee.com/nsjjd_w/hexo-theme-solitude) +[![gitlab](https://img.shields.io/badge/GitLab-blue?logo=gitlab)](https://gitlab.com/efu/hexo-theme-solitude) + +[Documentation](https://solitude.js.org/)丨[Preview](https://www.efu.me/) + +
+ +![Screenshot](.github/screenshot.webp) + +## Features + +- Pjax、LazyLoad、PWA. +- Comments(Twikoo、Waline、Valine、Artalk、Giscus), Can double comment. +- ColorMode. +- Lightbox(medium-zoom、fancybox). +- Mathematical formulas(Latex). +- Featured pages: Instant Short Article, My Equipment, Online Tools, Music Gallery, Friend Chain Fish Pond, Photo Album Page, Douban Page, Barrage message page. +- Article features: AI summary, code highlighting. + +## Todo + +- [x] The list of articles is displayed in three columns on the homepage. +- [x] btns tags plugin. + +> If you have any questions, please issue an [issue](https://github.com/everfu/hexo-theme-solitude/issues) + +## Setup + +1. Use the NPM package + ```bash + npm i hexo-theme-solitude + ``` +2. Apply + ```yaml + theme: solitude + ``` + +Check out the [Documentation](https://solitude.js.org/) for more information. + +## Sponsors + +[!["Buy Me A Coffee"](https://img.buymeacoffee.com/button-api/?text=Buy Me A Coffee&emoji=%E2%98%95&everfu=ezgif&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff)](https://www.buymeacoffee.com/everfu) + +

+ + + +

+ +## License + +[MIT](./LICENSE) License © 2023-PRESENT [Ever Fu](https://github.com/everfu) \ No newline at end of file diff --git a/themes/solitude/README_zh-Hant.md b/themes/solitude/README_zh-Hant.md new file mode 100644 index 0000000..5a0bd0a --- /dev/null +++ b/themes/solitude/README_zh-Hant.md @@ -0,0 +1,78 @@ +[简体中文](README.md)丨繁体中文丨[English](README_en-US.md) + +
+ + Solitude logo + +

Hexo Theme Solitude

+ + 一款優雅的 Hexo 主題,支援懶載入、PWA、Latex 以及多種評論系統。 + + 主題設計由 [@张洪Heo](https://github.com/zhheo)全權授權 + +![npm package](https://img.shields.io/npm/v/hexo-theme-solitude?logo=npm) +![release](https://img.shields.io/github/package-json/v/valor-x/hexo-theme-solitude/master?color=%231ab1ad&label=release) +![license](https://img.shields.io/github/license/valor-x/hexo-theme-solitude?color=FF5531) +[![Stars](https://img.shields.io/github/stars/everfu/hexo-theme-solitude)](https://github.com/everfu/hexo-theme-solitude/stargazers) +[![NPM all downloads](https://img.shields.io/npm/dy/hexo-theme-solitude?color=white)](https://www.npmjs.com/package/hexo-theme-solitude) + +![hexo version](https://img.shields.io/badge/hexo-7.0.0+-blue?logo=hexo&logoColor=white) +![node version](https://img.shields.io/badge/node-14.0.0-white?logo=node.js&logoColor=white) +[![Socket Badge](https://socket.dev/api/badge/npm/package/hexo-theme-solitude/)](https://socket.dev/npm/package/hexo-theme-solitude/overview) + +[![twiter](https://img.shields.io/badge/Twitter-gray?logo=x)](https://twitter.com/efu_oo) +[![TG](https://img.shields.io/badge/Telegram-gray?logo=Telegram&logoColor=white)](https://t.me/solitudePro) + +![JetBrains](https://img.shields.io/badge/jetbrains-support-black?logo=jetbrains) +![DuoLingo](https://img.shields.io/badge/duolingo-support-black?logo=duolingo&logoColor=white) + +[![gitee](https://img.shields.io/badge/Gitee-red?logo=gitee)](https://gitee.com/nsjjd_w/hexo-theme-solitude) +[![gitlab](https://img.shields.io/badge/GitLab-blue?logo=gitlab)](https://gitlab.com/efu/hexo-theme-solitude) + +[文档](https://solitude.js.org/)丨[預覽](https://www.efu.me/) + +
+ +![Screenshot](.github/screenshot.webp) + +## 特性 + +- 頁面懶載入(Pjax)、圖片懶載入(LazyLoad)、離線應用(PWA) +- 評論(Twikoo、Waline、Valine、Artalk、Giscus),支援雙評論 +- 晝夜切換(ColorMode) +- 燈箱(medium-zoom、fancybox) +- 數學公式(Latex) +- 特色頁面:即刻短文、我的裝備、在線工具、音樂館、友鏈魚塘、相冊頁、豆瓣頁、留言彈幕頁。 +- 文章功能:AI 摘要、代碼高亮。 + +## Todo + +- [x] 首页文章列表三列显示 +- [x] btns 外挂标签 + +## 應用 + +1. 使用 NPM 包進行安裝 + ```bash + npm i hexo-theme-solitude + ``` +2. 應用主題 + ```yaml + theme: solitude + ``` + +前往 [文檔](https://solitude.js.org/) 獲取更多資訊。 + +## 贊助者 + +[!["Buy Me A Coffee"](https://img.buymeacoffee.com/button-api/?text=請我喝杯咖啡&emoji=%E2%98%95&everfu=ezgif&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff)](https://www.buymeacoffee.com/everfu) + +

+ + + +

+ +## 版權 + +[MIT](./LICENSE) License © 2023-至今 [Efu](https://github.com/everfu) \ No newline at end of file diff --git a/themes/solitude/SECURITY.md b/themes/solitude/SECURITY.md new file mode 100644 index 0000000..d499c99 --- /dev/null +++ b/themes/solitude/SECURITY.md @@ -0,0 +1,9 @@ +# Security Policy + +## Report a vulnerability + +To report a vulnerability, please [report privately via security tab](https://github.com/everfu/hexo-theme-solitude/security/advisories/new) on the correct GitHub repository (see [Document](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability)). If you are unable to report, please feel free to email us at o@efu.me. + +All security vulnerabilities will be verified and resolved in a timely manner. + +While it is rare for new vulnerabilities to be discovered, it is recommended to always use the latest version of the theme and other dependencies by maintaining locked files (`yarn.lock`, `package-lock.json`) to ensure that they are as secure as possible. \ No newline at end of file diff --git a/themes/solitude/_config.yml b/themes/solitude/_config.yml new file mode 100644 index 0000000..96b8646 --- /dev/null +++ b/themes/solitude/_config.yml @@ -0,0 +1,977 @@ +#--------------------------- +# Hexo Theme Solitude +# Author: EverFu +# Github: https://github.com/everfu/hexo-theme-solitude +# +# 配置指南: https://solitude.js.org/ +# 你可以从指南中获得更详细的说明 +# +# Guide: https://solitude.js.org/ +# You can get more detailed help from the guide +# +# 赞助:https://afdian.net/a/everfu +# sponsor: https://github.com/sponsors/everfu +#--------------------------- + +# 站点设置 +# site settings +site: + # Logo + name: + # 显示类型 (i_class/text/img) + # Display type (i_class/text/img) + class: text + # 具体内容 例如:solitude st-logo / Efu / /img/logo.png + # Specific content, for example: solitude st-logo / Efu / /img/logo.png + custom: Solitude + # 网页icon + # Web icon + siteIcon: /img/pwa/favicon.ico + # 页脚的Logo、加载动画默认的logo + # Logo in the footer, default logo for loading animation + icon: /img/pwa/favicon.ico + +# 导航栏 +# NavBar +nav: + # logo 箱子 + # logo group + group: + # 项目: # 分类名称 + # Solitude: https://github.com/everfu/hexo-theme-solitude || /img/pwa/favicon.ico # 子菜单名称(submenu name): 链接地址(address) || 图标(icon) + + # 中心菜单 + # center menu + menu: + # 首页: / # 显示名称:路径 / Display name: path + # 文库: # 显示名称 / Display name + # 文章列表: /archives/ || st-folder-fill # 子菜单名称:路径 || 图标 / Submenu name: path || icon + # 全部分类: /categories/ || st-checkbox-multiple-blank-fill + # 全部标签: /tags/ || st-price-tag-fill + # 友链: + # 友链鱼塘: /moments/ || st-wifi-fill + # 友情链接: /links/ || st-group-fill + # 宝藏博主: javascript:travelling() || st-gift-fill + # 我的: + # 装备: /equipment/ || st-laptop-line + # 工具箱: /tlink/ || st-tools-fill + # 音乐馆: /music/ || st-disc-fill + # 关于: + # 关于本站: /about/ || st-contacts-fill + + # 右侧按钮 + # Button on the right + right: + random: false # 随机文章跳转 / random post button + console: false #控制台 / console + # 自定义按钮 + # custom button + # 左至右 + # from left to right + custom: + # - name: 开往 - 友链接力 # 显示文字 / Displayed text + # url: https://www.travellings.cn/go.html # 跳转链接 / Jump link + # icon: st-train-line # 图标 / Icon + # onclick: # 点击事件 / Click event + # id: travellings_button # id + +# 首页顶部样式 +# Home top style +hometop: + enable: false # 是否打开 / if enable + # banner display + banner: + # 左上角显示大文字 + # Large text displayed in the upper left corner + # tip:可使用html标签 + # tip: html tags be used + title: 宁静致远
热爱生活 + # 左上角显示小文字 + # Small text displayed in the upper left corner + url: Hexo Theme Solitude + # 轮播icon + # Carousel icon + # tip: 76x76 size + icon: + # HTML: # 名字 / Name + # img: https://7.isyangs.cn/34/65f2e42921677-34.png # 图片 / Image + # color: "#e9572b" # 背景色 / Background color + # JS: + # img: https://7.isyangs.cn/34/65f2e43ceddda-34.png + # color: "#f7cb4f" + # Docker: + # img: https://7.isyangs.cn/34/65f2e45462045-34.png + # color: "#57b6e6" + # Flutter: + # img: https://7.isyangs.cn/34/65f2e47acbe98-34.png + # color: "#ffffff" + # WebPack: + # img: https://7.isyangs.cn/34/65f2e488bf8ed-34.png + # color: "#2e3a41" + # Git: + # img: https://7.isyangs.cn/34/65f2e499066fa-34.png + # color: "#df5b40" + + # 左下跳转按钮 + # Banner lower left jump button + group: + # 热门: /tags/热门/ || st-fire-fill || linear-gradient(to right,#f65,#ffbf37) + # 教程: /tags/教程/ || st-book-mark-fill || linear-gradient(to right,#358bff,#15c6ff) + # 精选: /tags/精选/ || st-star-smile-fill || linear-gradient(to right,#18e7ae,#1eebeb) + + # 右侧置顶列表(在文章的front matter中添加“recommend: true”) + # Right top list (add "recommend: true" in the front matter of the article) + recommendList: + # 左上角显示文字 + # Large text displayed in the upper left corner + sup: 置顶 + # 左下角大字 + # Large text in the lower left corner + title: Solitude 主题文档 + # 点击跳转链接 + # Click the jump link + url: https://solitude.js.org/ + # 显示背景图片 + # Display background image + img: /img/default.avif + # 阴影颜色 + # Shadow color + color: "none" + +# carousel +# 顶部推荐轮播图 +# 使用方法:在文章的front matter中添加“recommend: true” +# tip:建议开了这个就不要开hometop,其功能类似 +carousel: false + +# -------------------------------------- +# Aside Settings +# 侧边栏配置 +aside: + # 值:about(关于我)、newestPost(最新文章)、allInfo(网站信息)、flip(公众号二维码)、newest_comment(最新评论) + # Values: about (info card), newestPost (latest article), allInfo (website information), flip (official account QR code), newest_comment (latest comment) + + # 在主页显示的侧边栏信息 + # Sidebar information displayed on the homepage + home: + # 固定的信息(滑动不跟随) + # Fixed information (not followed by sliding) + noSticky: "about" + # 不固定的信息(滑动跟随) + # Unfixed information (sliding follow) + Sticky: "allInfo" + # 在文章页显示的侧边栏信息 + # Sidebar information displayed on the article page + post: + noSticky: "about" + Sticky: "newestPost" + # 在页面中显示的侧边栏信息 + # Sidebar information displayed on the + page: + noSticky: "about" + Sticky: "newestPost,allInfo" + position: 1 # left(0): 左侧 / right(1): 右侧 + # 侧边栏个人信息卡片 + # Sidebar personal information + card: + style: 0 # 0: Heo样式 :1: 设计样式 + # 头像信息 + # Avatar information + author: + # 头像 + # Avatar + img: /img/avatar.avif + # 表情图片链接 + # Emoticon image link + # tip: 26x26 size + sticker: https://7.isyangs.cn/34/65f2e4e0423cc-34.png # 不填不显示 + # 点击作者头像跳转链接 + # Click the author's avatar to jump link + url: /about/ + # 背景图片 + # Background image + background: # https://s3.qjqq.cn/47/663af296b85f4.webp!color # 不设置不会展示(仅样式为1、2时有效) + # 文案1 + # label1 + content: 分享自己对编程的热爱,对美好生活的向往,对知识海洋探索历程。 # 样式为1时无效 + # 文案2 + # label2 + content2: 相信你可以在这里找到对你有用的知识和教程。 # 样式为1时无效 + # 个人信息卡片底部的小图标,按照例子填写 + # Small icons at the bottom of the personal information card, fill in according to the example + # 个人信息卡片顶部按钮的打招呼语句 + # Greeting statement of the button at the top of the personal information card + sayhello: # 样式为2时无效 + morning: 一日之计在于晨 + noon: 吃饱了才有力气干活 + afternoon: 集中精力,攻克难关 + night: 不要太劳累了,早睡更健康 + goodnight: 睡个好觉,保证精力充沛 + # 个人信息卡片顶部按钮的切换文字 + # Switching text of the button at the top of the personal information card + sayhello2: # 样式为2时无效 + # - 🤖️ 数码科技爱好者 + # - 🔍 分享与热心帮助 + # - 🏠 智能家居小能手 + # - 🔨 设计开发一条龙 + # - 🤝 专修交互与设计 + # - 🏃 脚踏实地行动派 + # - 🧱 团队小组发动机 + # - 💢 壮汉人狠话不多 + # - 🎮 电竞游戏爱好者 + # 个人信息卡片底部的小图标,按照例子填写 + information: # 样式为1时请不要超过4个 + # Github: https://github.com/efuo || st-github-line # 名称:链接 || 图标 / Name: link || icon + # Bilibili: https://space.bilibili.com/1329819902 || st-bilibili-line + + # 二维码 + # Official account QR code + flip: + # 右下角头像 + # Avatar in the lower right corner + favicon: + # 正面 + # Front + face: + # 鼠标悬停翻转图片 + # Mouse hover flip image + backface: + # 背景色:var(--efu-blue) / #000 / rgba(0,0,0,0.5) / linear-gradient(to right,#f65,#ffbf37) + # Background color: var(--efu-blue) / #000 / rgba(0,0,0,0.5) / linear-gradient(to right,#f65,#ffbf37) + backcolor: "var(--efu-blue)" + + newest_comment: + enable: true + storage: .5 # 缓存时间 1: 1天 / .5 : 半天 / Cache time 1: 1 day .5 : half a day + limit: 5 # 评论数 / Number of comments + + # 页面目录 + # Page directory + toc: + # 在文章页显示 + # Display on the article page + post: true + # 在任意页显示 + # Display on any page + page: false + # 开启后不悬停目录有模糊效果 + # After opening, there is a fuzzy effect without hovering over the directory + vague: true + + # 侧边栏文章列表 + # Sidebar article list + tags: + # 是否显示标签 + # Whether to display tags + enable: false + # 显示标签数量,当高于标签总数时,显示全部标签按钮 + # Display the number of tags, when it is higher than the total number of tags, display all tags button + limit: 20 + # 高亮显示标签列表 + # Highlighted tag list + highlight_list: + # - Hexo + + # 侧边栏归档 + # aside archive + archive: + enable: false + # 显示类型 + type: "month" # month: 按月 / year: 按年 : month: by month / year: by year + + # 建站信息 + # Website information + siteinfo: + # 文章数 + # Number of articles + postcount: true + # 总字数 + # The number of words on the web site + wordcount: false + # 访问量 + # PV + pv: true + # 访客数 + # UV + uv: true + # 最后更新日期 + # Last update date + updatetime: true + # 建站时间 + # Website creation time + runtimeenable: true + # 格式:yyyy-MM-dd hh-mm-ss + # Format: yyyy-MM-dd hh-mm-ss + runtime: "2023-04-20 00:00:00" + +# 首页文章配置信息 +# Configure information on the home page +index_post_list: + direction: column # row / column + column: 2 #2:2列 3:3列 + content: false # 1: post.description / 2: 自动获取description或截取内容(Automatically get descriptions or screenshots) / 3: 只使用截取内容(Use only screenshots) / false: 不显示内容(No content is displayed) + length: 500 # 截取内容的长度 : The length of the screenshot content + cover: both # left: 在左侧 : left / right: 在右侧 : right / both: 两侧 : both + +# 页面默认设置 +# page default settings +page: + error: true # 404页面 / 404 page + tags: true # 标签页 / Tags page + categories: true # 分类页 / Categories page + default: # 默认值 / Default value + # 默认图片 + # default cover + cover: + # - /img/default.png # 默认图片 / default cover + +# 文章页默认设置 +# post default settings +post: + default: + # 文章默认图片 + # default cover + cover: + # - # 默认图片 / default cover + # 文章发布默认地址 + # default post locate + locate: 衡阳 + # 文章默认版权 + # default post copyright + copyright: + enable: true + author: + url: /about/ # 点击头像跳转地址 + img: # 显示头像,不填写默认显示site_icon + license: CC BY-NC-SA 4.0 + licenurl: https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh + # 顶部文章简介 + # Top article introduction + meta: + date: false # 发布日期 / Release date + updated: false # 更新日期 / Update date + locate: false # 位置 / Location + wordcount: false # 字数 / Number of words + readtime: false # 访问 / uv + pv: false # 浏览量 / pv + comment: false # 评论数 / Comment count + # 打赏 + # reward + award: + enable: false + appreciators: /about # 赞赏记录 / Appreciative records + title: 感谢您的赞赏。 + desc: 因为有你们的支持,我才体会到写文章的价值。 + list: + # - name: 爱发电 + # qcode: https://s3.qjqq.cn/47/661ba8e695f17.webp!color + # url: https://afdian.net/a/efu0u0/ + # color: var(--efu-purple) + # - name: Github Sponsor + # qcode: https://s3.qjqq.cn/47/661ba900c4bc1.webp!color + # url: https://github.com/sponsors/efuo + # color: var(--efu-black) + # 分享按钮,需要是什么哪些按钮,填写后开启 + share: + enable: false + list: + # - qq + # - weibo + # - twitter + # - facebook + # - telegram + # - whatsapp + # - linkedin + # - link + # - qrcode + # 版权中订阅按钮跳转链接,填写地址后开启 + # Subscription button jump link in copyright + rss: # /atom.xml + # 文章主题色获取 + # Article theme color acquisition + covercolor: + enable: false + mode: local # local:本地取色 / api:img2color取色 : local: local color / api: img2color color + api: https://api.qjqq.cn/api/Imgcolor?img= # api地址 / api address + time: 43200000 # api取色间隔(毫秒),默认为12小时 / api color interval (milliseconds), default is 12 hours + # footer + footer: + enable: true + desc: 来自 Efu 的文章 # 介绍文字 + button: # 跳转按钮 + enable: true + name: 了解更多 + url: /about/ + +# ------------------------- +# 自定义主题 + +# 自定义配色 +# custom theme color +# 注意:颜色值必须使用引号,如“#000”,否则可能会导致错误! +# Note: The color value must be enclosed in quotation marks, such as "#000", otherwise it may cause an error! +# -------------------------------------- +theme_color: + dark: "#ffc848" # 暗色模式 / Dark mode + dark_op: "#f2b94b23" # 暗色模式透明 / Dark mode transparent + dark_op_deep: "#f2b94bdd" # 暗色模式透明深色 / Dark mode transparent dark + dark_none: "#f2b94b00" # 暗色模式透明无色 / Dark mode transparent colorless + light: "#425AEF" # 亮色模式 / Light mode + light_op: "#4259ef23" # 亮色模式透明 / Light mode transparent + light_op_deep: "#4259efdd" # 亮色模式透明深色 / Light mode transparent dark + light_none: "#4259ef01" # 亮色模式透明无色 / Light mode transparent colorless + +# 主题显示模式调整 +# theme display mode adjustment +# 主题支持三种模式:自动切换、暗色模式、亮色模式 +# The theme supports three modes: automatic switching, dark mode, and light mode +# -------------------------------------- +display_mode: + type: auto # auto: 自动切换 / dark: 暗色模式 / light: 亮色模式 / auto: automatic switching / dark: dark mode / light: light mode + universe: true # 开启后暗色模式下会显示星空背景 / After opening, the dark mode will display the starry sky background + +# 文章底部推荐文章 +# Recommended articles at the bottom of the article +# -------------------------------------- +related_post: + enable: false + # 推荐文章数量 + # Number of recommended articles + limit: 2 + # 根据创建日期(created)或是更新日期(updated) + # According to the creation date (created) or the update date (updated) + date_type: created + +# -------------------------------------- +# Footer Settings +# 页脚配置 +footer: + # 底部上方一排图标 + # Bottom row of icons + information: + author: false # 是否显示 site_icon / enable site_icon in footer + left: # 左侧显示图标 + # Github: https://github.com/efuo || st-github-line # 名称:链接 || 图标 / Name: link || icon + # Mail: mailto:o@efu.me || st-mail-line + right: # 右侧显示图标 + # Bilibili: https://space.bilibili.com/1329819902 || st-bilibili-line + # 抖音: https://v.douyin.com/iJsLc8jt/ || st-douyin-fill + + # 底部导航栏 + # Bottom navigation bar + group: + # 导航: + # 归档: /archives/ + # 分类: /categories/ + # 标签: /tags/ + # 服务: + # 阿里云: https://aliyun.com/ + # 51la统计: https://v6.51.la/ + # 百度统计: https://tongji.baidu.com/ + # 支持: + # 打赏记录: /about/ + # 协议: + # Cookies: /cookies/ + # 用户协议: /privacy/ + # 版权协议: /copyright/ + + # 页脚随机友链 + # Random links at footer + # warning: 打开前必须先配置links + # warning: links must be configured before opening + randomlink: false + # 隐私助手右侧弹窗,填写路径后开启 + # Privacy assistant right pop-up window, fill in the path to open + privacy: # /privacy/ + # 版权(Copyright) + license: # /license/ + # 页脚右侧链接,例如:ICP备案号、公安备案号等 + # Footer right link, such as: ICP filing number, public security filing number, etc. + links: + # 为了主题能够得到更多的支持,建议保留主题链接 + # In order for the theme to get more support, it is recommended to keep the theme link + - name: 主题 + url: https://github.com/everfu/hexo-theme-solitude + # - name: 订阅 + # url: /atom.xml + +# 404 页面(404 page) +errorpage: + # 图片 + # image + img: /img/404.avif + # 文字 + # text + text: =awa= 页面走丢了 + # 推荐文章列表 + # Recommended article list + recommendList: true + +# 即刻短文 +# talk now +# 前置要求:需配置即刻短文页面 +# Pre-requirements: talk now page needs to be configured +says: + enable: false + # 主页的即刻轮播条 + # Talk carousel bar on the homepage + home_mini: false + # 1:张洪heo样式 / 2:Leonus样式 + # 1: Zhang Hong heo style / 2: Leonus style + style: 1 + # 即刻短文仅展示前n条 + # Talk short text only shows the first n + strip: 30 + +# 最近评论 +# recent comments +# 前置要求:需配置最近评论页面和评论,否则显示为空 +# Pre-requirements: recent comments page needs to be configured and commented, otherwise it will be displayed as empty +recent_comments: + enable: false + # 评论数 + # Number of comments + limit: 50 # ⚠️waline 仅支持最大50条评论 / ⚠️waline only supports a maximum of 50 comments + # 缓存时间 + # Cache time + cache: 0.2 # 1 = 1天 / 1 = 1 day + page: /recentcomments/ # 最近评论页面 / recent comments page + img: /img/recent_c.avif # 中控台显示图片(不填不显示) / image displayed in the console + +# 留言板 +# message board +# 前置要求:需配置留言板页面 +# Pre-requirements: message board page needs to be configured +envelope: + enable: false + line: 10 # 显示行数 + speed: 20 # 播放速度 + hover: true # 鼠标悬停暂停 + loop: true # 循环播放 + page: /message/ # 留言板页面 / message board page + +# ------------------------- +# meeting-api,用于界面中的音乐胶囊和音乐馆页,可自定义api,不会请勿动。 +# meeting-api, used for music capsules and music halls in the interface, can customize api, do not move if you don't know. +meting_api: "https://meting.qjqq.cn/?server=:server&type=:type&id=:id&auth=:auth&r=:r" #自定义api +# 音乐馆页 +# music page +music: + enable: false + # 音乐ID:歌单ID / 专辑ID / 歌手ID + # Music ID: playlist ID / album ID / singer ID + id: 1994908354 + # 播放列表的服务商。netease:网易云 / tencent:腾讯 / kugou:酷狗 / xiami:小米 / baidu:百度 + # Music service provider. netease: Netease Cloud / tencent: Tencent / kugou: Kugou / xiaomi: Xiaomi / baidu: Baidu + server: netease + # 播放列表的类型。song:单曲 / playlist:歌单 / album:专辑 / artist:歌手 + # Type of playlist. song: Single / playlist: Playlist / album: Album / artist: Singer + type: playlist + # 初始音量。0.8 = 80%,范围 0 到 1 + # Initial volume. 0.8 = 80%, range 0 to 1 + volume: 0.8 + # 是否开启互斥模式,即同时只能有一个播放器播放 + # Whether to enable mutex mode, that is, only one player can play at the same time + mutex: true + +# 音乐胶囊 +# capsule music +capsule: + enable: false + # 歌单id / playlist id + id: 8407304077 + # 播放列表的服务商。netease:网易云 / tencent:腾讯 / kugou:酷狗 / xiami:小米 / baidu:百度 + # Music service provider. netease: Netease Cloud / tencent: Tencent / kugou: Kugou / xiaomi: Xiaomi / baidu: Baidu + server: netease + # 播放列表的类型。song:单曲 / playlist:歌单 / album:专辑 / artist:歌手 + # Type of playlist. song: Single / playlist: Playlist / album: Album / artist: Singer + type: playlist + +# 快捷菜单你 +# quick menu +keyboard: + enable: false # 是否开启键盘控制 / Whether to enable keyboard control + # 键盘控制配置 + # Keyboard control configuration + list: + # name: 按键名称(name) + # key: 按键(Key) + # func: 方法(function) + # sco: sco内置方法(sco.'function') + # url: 跳转链接(link) + # ------------------ + # - name: 关闭快捷键功能 + # key: K + # func: keyboard + # - name: 打开中控台 + # key: A + # sco: showConsole + # - name: 播放/暂停音乐 + # key: M + # sco: musicToggle + # - name: 打开友情链接 + # key: L + # url: "/links/" + +# 复制 +# Copy +copy: + enable: true + copyright: # Turn on Link copyright information after copying.(开启后将在默认增加版权信息) + enable: true + limit: 50 # word count. (字数) + +# 懒加载 +# lazyload +lazyload: + enable: false + field: site # post, site + # 加载中显示图片 + # Loading display image + placeholder: /img/loading.avif + # 加载失败显示图片 + # Loading failed display image + errorimg: /img/error_load.avif + +# 加载动画 +# loading animation +loading: + # 全局加载动画 + # Global loading animation + fullpage: false + # 顶部加载胶囊 + # Top loading capsule + pace: true + +#代码高亮增强 +# code highlight +highlight: + enable: true + limit: 200 # 代码行高限制 / Code line limit + copy: true # 是否开启复制按钮 / Whether to enable the copy button + expand: true # 是否默认展开 / Whether to expand by default + # 代码块样式 + # Code block style + theme: default # default: 默认 / mac : apple terminal + # 代码配色 + # Code color + color: default # default: 默认 / solidity: solidity / dracula: dracula + +# 图片灯箱 +# image lightbox +# warning:开启前下方的fancybox或mediumZoom必须打开一个 +# warning: One of the fancybox or mediumZoom below must be turned on before turning on +lightbox: false +# fancybox +# https://fancyapps.com/fancybox/ +fancybox: false +# mediumZoom +mediumZoom: false + +# mermaid tags plugin +# https://mermaid.js.org/ +mermaid: false + +# Open Graph +# https://ogp.me/ +# https://developers.facebook.com/docs/sharing/webmasters/ +OpenGraph: + enable: false + options: + # twitter_card: + # twitter_image: + # twitter_id: + # twitter_site: + # google_plus: + # fb_admins: + # fb_app_id: + +# 字数统计 +# word count +# warning:开启前需要安装字数统计插件 +# warning: You need to install the word count plugin before turning it on +wordcount: false + +# 访问统计 +# access statistics +busuanzi: false +busuanzi_use: 0 # 0: 原版 / 1: 青秸(other: 其它自定義的busuanzi平台) + +# 搜索 +# search +# warning:开启前需要安装搜索插件 +# warning: You need to install the search plugin before turning it on +search: + enable: false + # algolia, local + type: local + # 推荐标签 + # Recommended tags + tags: + # - Solitude + # - Hexo + algolia: + # hits: + # per_page: 6 + local: + preload: false + CDN: + +# Post Chat AI +# 后台地址:https://ai.tianli0.top/?InviteID=OZ3Z0V2R +tianli_talk: + enable: false + title: 智能客服与搜索 + key: # https://ai.tianli0.top/?InviteID=OZ3Z0V2R + # 默认值 + # backgroundColor: "var(--efu-main)", + # bottom: "60px", + option: #https://ai.tianli0.top/codeMaker.html + # defaultInput: false + # upLoadWeb: true + # userTitle: Efu Chat + # userDesc: 你好,我是 Efu 的智能客服,有什么可以帮助你的? + # showInviteLink: 'https://ai.tianli0.top/?InviteID=OZ3Z0V2R' + # blackDom: + # - .aplayer +# 文章摘要AI +# post abstract AI +post_ai: + enable: false + # 右侧显示的模型名称 + # Model name displayed on the right + modelName: GPT 4 + # key + # 具体获取方法见文档 + # Specific acquisition method, see the document + key: + # 自介 + # talk + talk: # 我是 Efu 开发的摘要生成助理EfuGPT,EfuGPT在静态部署时进行摘要的撰写,并且在访客访问时通过EfuCorrection转译后的文本摘要实现工具。我在这里只负责已经生成的摘要显示,你无法与我直接沟通,但我可以回答一些预设的问题。 + # 随机文章按钮 + # Random post button + randomPost: false + # 举报链接,不填不显示 + # Report link, do not fill in and do not display + report: https://efu.me/ + # 底部提示 + # Bottom tip + tips: # 此内容根据文章生成,并经过人工审核,仅用于文章内容的解释与总结 + +# latex 公式支持 +# latex formula support +# docs: https://solitude.js.org/configuration/extra#数学公式 +katex: + enable: false + per_page: false # 是否在每页都加载 / Whether to load on each page + copytex: false # 是否开启复制公式 / Whether to enable copy formula + +# 评论 +# comment +# getting start: https://solitude.js.org/comments/comment +comment: + use: # waline, twikoo, valine, artalk, giscus + commentBarrage: false # 热评开关 / Hot comment switch + lazyload: false # 懒加载 + count: false # 评论数展示 + pv: false # 是否使用評論統計頁面訪問 + avatar: https://cravatar.cn # Gravatar link + +# twikoo 配置信息 +# twikoo settings +twikoo: # https://twikoo.js.org/ + envId: # url: https://twikoo.sondy.top/ + region: # 环境地域,默认为 ap-shanghai,腾讯云环境填 ap-shanghai 或 ap-guangzhou;Vercel 环境不填 + style: true # Use custom styles when turned on / 开启后使用自定义样式 + accessToken: # AccessToken + option: # twikoo option + +# waline 配置信息 +# waline settings +waline: # https://waline.js.org/ + envId: # url: https://waline.wzsco.top + pageview: false # 是否开启页面访问量统计 / Whether to enable page access statistics + option: # waline配置项 / waline configuration item + +# valine 配置信息 +# valine settings +valine: + appId: # leancloud application app id + appKey: # leancloud application app key + serverURLs: # This configuration is suitable for domestic custom domain name users, overseas version will be automatically detected (no need to manually fill in) + avatar: # https://valine.js.org/avatar.html + visitor: false + style: true # Use custom styles when turned on / 开启后使用自定义样式 + option: # options list + +# artalk 配置信息 +# artalk settings +artalk: + server: # server url / 后端地址 + site: # site name / 站点名 + option: # options + +# gitalk 配置信息 +# gitalk settings +giscus: + repo: # GitHub 仓库名称 / GitHub repository name + repo_id: # GitHub 仓库ID / GitHub repository ID + category_id: # GitHub 仓库分类ID / GitHub repository category ID + theme: + light: light + dark: dark + option: + +# 中控台扩展 : 最新评论 + 标签 + 文章 +console_plus: false + +# 站点验证 +# Site verification +# 仅需要填写验证代码即可,譬如:codeva-KReTIJu5us +# Only need to fill in the verification code, such as: codeva-KReTIJu5us +verify_site: +# - name: google-site-verification +# content: xxxxxx +# - name: baidu-site-verification +# content: xxxxxxx + +# CSS 前缀 +# CSS prefix +# 有些 CSS 并不是所有浏览器都支持,需要增加对应的前缀才会生效 +# Some CSS is not supported by all browsers, and you need to add the corresponding prefix to take effect +# 开启 css_prefix 后,会自动为一些 CSS 增加前缀。(会增加 20%的体积) +# After opening css_prefix, some CSS will be automatically prefixed. (Will increase 20% of the volume) +css_prefix: false + +# Font 字体 +# Font +font: + font-size: 16px + code-font-size: 16px + font-family: "PingFang SC,Hiragino Sans GB,Microsoft YaHei" + code-font-family: "monospace, monospace" + +# 插入代码到头部 之前 和 底部 之前 +# Insert code before and before +# 插入额外代码 如:统计,广告等 +# Insert additional code such as: statistics, advertising, etc. +extends: + head: # 在head中插入 / Insert in head + # - + body: # 在body中插入 / Insert in body + +# PWA +# https://developer.mozilla.org/zh-CN/docs/Web/Progressive_web_apps +# docs: https://solitude.js.org/configuration/extra#pwa +pwa: + enable: false + manifest: /manifest.json # manifest.json 文件路径 + theme_color: "#006a73" # 主题颜色 + mask_icon: /img/pwa/favicon.ico # 遮罩图标 + apple_touch_icon: /img/pwa/favicon.ico # 苹果触摸图标 + bookmark_icon: /img/pwa/favicon.ico # 书签图标 + favicon_32_32: /img/pwa/favicon_32.ico # 32x32图标 + favicon_16_16: /img/pwa/favicon_16.ico # 16x16图标 + +# 谷歌广告 (Google Adsense) +google_adsense: + enable: false + auto_ads: false # 自动广告关闭后则为手动广告 / After auto ads are turned off, it is manual ads + enable_page_level_ads: true # 页面级广告 / Page-level ads + aside_card: true # 侧边栏卡片广告 / Sidebar card ads(开启后自行到需要添加的页面使用:ads) + post_card: true # 文章卡片广告 / Post card ads(首页文章列表) + post_content: true # 文章内容广告 / Post content ads(文章内容底部广告) + js: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js # 谷歌广告js / Google Adsense js + # client id + # 无论是否开启自动广告,都需要填写 client id + # Whether to enable auto ads or not, you need to fill in the client id + client: # ca-pub-XXXXXXXXXXXXXX + # slot id + # 只有关闭自动广告时才需要填写 slot id,可以在谷歌广告后台 按广告单元中创建广告位后获取 + # Only when auto ads are turned off, you need to fill in the slot id, which can be obtained after creating an ad space in the Google Adsense background according to the ad unit + slot: # 4236388782 + +# 自定义右键菜单 (Custom Right Menu) +right_menu: + enable: false + commentBarrage: false # 是否显示热评开关 / Whether to display the hot comment switch. + # 翻译功能(仅支持简繁) + # Translation function (Simplified and Traditional Chinese only) + translate: + enable: false + defaultEncoding: 2 # 1: 默认繁体 2: 默认简体 + translateDelay: 0 # 首次加载翻译迟疑时间 + # 自定义菜单项列表 + # Customize the list of menu items. + custom_list: + # - name: 随机短文 + # click: toRandomPost() + # id: menu-randomPost + # class: + # icon: st-signal-tower-fill + # - name: 全部分类 + # click: pjax.loadUrl('/categories/') # 外链用 window.open,pjax 无法请求跨域内容 + # id: + # class: + # icon: st-checkbox-multiple-blank-fill + # - name: 全部标签 + # click: pjax.loadUrl('/tags/') + # id: + # class: + # icon: st-price-tag-fill + # - name: 赞助主题 + # click: window.open('https://afdian.net/a/efu0u0/', '_blank') + # id: + # class: + # icon: st-afdian-line + +# 哀悼模式,网页黑白 +# Mourning mode, web page black and white +memorial: + enable: false + # 日期, (M-D) + # Date, (M-D) + # eg: 7-8, 9-18, 12-13 ... + date: + - "7-8" #七八卢沟桥事变 + - "9-18" #九一八事变/建军节 + - "12-13" #南京国家公祭日 + +# CDN +# Don't modify the following settings unless you know how they work +# 非必要请不要修改 +CDN: + # The CDN provider of internal scripts (主题内 js 的 cdn 配置) + # option: local/jsdelivr/unpkg/cdnjs/custom + # Dev version can only choose. ( dev版本只能为 local ) + internal: local + # The CDN provider of third party scripts (第三方 js 的 cdn 配置) + # option: jsdelivr/unpkg/cdnjs/custom + third_party: cdnjs + + # Add version number to url, true or false + version: true + + # Custom format + # For example: //open.lightxi.com/cdnjs/ajax/libs/${cdnjs_name}/${version}/${min_cdnjs_file} + custom_format: //open.lightxi.com/cdnjs/ajax/libs/${cdnjs_name}/${version}/${min_cdnjs_file} + + option: + solitude_css: https://cdn2.codesign.qq.com/icons/7pOrz0WXB5ZWJPX/latest/iconfont.css + # algolia_search: + # instantsearch: + # pjax: + # twikoo: + # waline_js: + # waline_css: + # katex: + # katex_copytex: + # lazyload: + # aplayer_css: + # aplayer_js: + # meting_js: + # pace_js: + # swiper_css: + # swiper_js: + # busuanzi_js: + # snackbar_js: diff --git a/themes/solitude/languages/default.yml b/themes/solitude/languages/default.yml new file mode 100644 index 0000000..7ceb13a --- /dev/null +++ b/themes/solitude/languages/default.yml @@ -0,0 +1,227 @@ +more: More +star: Behold, those who found delight in this piece also perused +random: Random +upload: 'datetime: ' +totalk: You don't need to delete blank lines, just type in your comments. +loading: Loading... +day: ' days' + +theme: + dark: Dark + light: Light + +copy: + success: Copied + error: Copy failed + +copy_copyright: + author: Author + link: Link + source: Source + info: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source. + +time: + day: " days ago" + hour: " hours ago" + just: "just" + min: " minutes ago" + month: " months ago" + +page: + tag: Tags + category: Categories + tags: All tags + categories: All categories + archives: Archives + 404: Page not found + +home: + home: Home + sticky: Sticky + new: New + read: Unread + recommendmore: More + archives: All articles + +post: + reprint: Reprint + original: Original + cc: This article is a ${cc} article, pay attention to the copyright. + posted: Posted on + updated: Last updated on + wordcount: Word count + minread: Reading time + ip: The author's IP belongs to + pv: PV + comment: Comments + copyright: + reprint: This article is a reproduction or translation, and the copyright belongs to the original author. Please contact the original author for permission to republish this article. + original: This piece of writing is an original article, utilizing the + original_end: Agreement. For complete reproduction, please acknowledge the source as Courtesy of + share: + qq: Share to QQ + weibo: Share to Weibo + telegram: Share to Telegram + twitter: Share to Twitter + linkedin: Share to LinkedIn + facebook: Share to Facebook + link: Share to Link + qrcode: Share to QR code + whatsapp: Share to WhatsApp + ai: + title: Article Summary + tip: Complaints + nav: + next: Next + prev: Previous + + +nav: + site_name_title: Back to home + backtop: Back to top + travellings: Traveling - Friends Link + search: Search + randompost: Random post + console: Console + +award: + thanks: Thanks + tipping: Sponsor + title: List of appreciation + +search: + empty: No results found + hit: Found ${query} results for you + placeholder: Enter keywords to quickly search + count: Total ${count} results. + +head: + noscript: Please enable JavaScript to view the site + +aside: + postcount: 'Posts :' + pv: 'PV :' + uv: 'UV :' + runtime: 'Runtime :' + updatetime: 'Last update :' + wordcount: 'Word count :' + toc: Table of contents + tagmore: View all + avatar: Avatar + hello: Long time no see, + back: Welcome back again, + sticker: Mood sticker + newpost: New posts + newcomment: New comments + card: + posts: 'Posts:' + tags: 'Tags:' + categories: 'Categories:' + +console: + comment_tip: Interaction + comment_title: Latest comments + tag_tip: Tags + tag_title: Find interesting areas + switch_darkmode: Day and night switching + switch_hideAside: Sidebar display control + switch_keyboard: Keyboard operation + switch_music: Music switch + archive_unit: Posts + recent_comment_more: Recent comments + newest_comment: + image: Image + link: Link + code: Code + emoji: Emoji + +sidebar: + function: Function + darkmode: Display mode + +footer: + description: Article from ${title} + learnmore: Learn more + randomlink: Links + rss: Subscribe + theme: Theme + +cookies: + title: Agreement reminder assistant + tip: Check out the efforts we make to protect your privacy + privacy: How this site protects your privacy + +music: + hit: Paused + +404: + button: Back to home + +link: + banner: + toComment: Application link + random: Random Visit + random: 'Click the button to visit a random link. The safety and availability of the destination website are not guaranteed. The random link for this visit is: ⌈ ${name} ⌋ ' + to: To + +keyboard: + title: Blog shortcuts + +newest_comment: + error: Unable to get a comment, please confirm that the relevant configuration is correct. + zero: No comments. + +comment: + title: ' Comment' + +commentBarrage: + title: Hot + +f12: Developer mode is turned on, please follow the GPL. + +right_menu: + copy: Copy + paste: Paste + comment: ToTalk + new: Open + link: Copy + img: Copy + downloadImg: Download + search: Search + dark: Light + light: Dark + chs_to_cht: 轉為繁體 + cht_to_chs: 转为简体 + img_error: This image cannot be copied or downloaded. + barrage: + open: OpenBarrage + close: CloseBarrage + music: + start: Play + stop: Pause + back: Back + forward: Forward + copyMusicName: CopyName + +pagination: + prev: Prev + next: Next + to: To page + +about: + other: + oneself: + map_title: I live in + info_title1: Born + info_title2: Current occupation + tj: + tip: Data + title: Access statistics + post_tip: 'Stats from:' + personalities: + tip1: At + tip2: 'Learn more:' + +message: + close: Hide message + open: Show message \ No newline at end of file diff --git a/themes/solitude/languages/en.yml b/themes/solitude/languages/en.yml new file mode 100644 index 0000000..f6311ed --- /dev/null +++ b/themes/solitude/languages/en.yml @@ -0,0 +1,226 @@ +more: More +star: Behold, those who found delight in this piece also perused +random: Random +upload: 'datetime: ' +totalk: You don't need to delete blank lines, just type in your comments. +loading: Loading... +day: ' days' + +theme: + dark: Dark + light: Light + +copy: + success: Copied + error: Copy failed + +copy_copyright: + author: Author + link: Link + source: Source + info: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source. + +time: + day: " days ago" + hour: " hours ago" + just: "just" + min: " minutes ago" + month: " months ago" + +page: + tag: Tags + category: Categories + tags: All tags + categories: All categories + archives: Archives + 404: Page not found + +home: + home: Home + sticky: Sticky + new: New + read: Unread + recommendmore: More + archives: All articles + +post: + reprint: Reprint + original: Original + cc: This article is a ${cc} article, pay attention to the copyright. + posted: Posted on + updated: Last updated on + wordcount: Word count + minread: Reading time + ip: The author's IP belongs to + pv: PV + comment: Comments + copyright: + reprint: This article is a reproduction or translation, and the copyright belongs to the original author. Please contact the original author for permission to republish this article. + original: This piece of writing is an original article, utilizing the + original_end: Agreement. For complete reproduction, please acknowledge the source as Courtesy of + share: + qq: Share to QQ + weibo: Share to Weibo + telegram: Share to Telegram + twitter: Share to Twitter + linkedin: Share to LinkedIn + facebook: Share to Facebook + link: Share to Link + qrcode: Share to QR code + whatsapp: Share to WhatsApp + ai: + title: Article Summary + tip: Complaints + nav: + next: Next + prev: Previous + +nav: + site_name_title: Back to home + backtop: Back to top + travellings: Traveling - Friends Link + search: Search + randompost: Random post + console: Console + +award: + thanks: Thanks + tipping: Sponsor + title: List of appreciation + +search: + empty: No results found + hit: Found ${query} results for you + placeholder: Enter keywords to quickly search + count: Total ${count} results. + +head: + noscript: Please enable JavaScript to view the site + +aside: + postcount: 'Posts :' + pv: 'PV :' + uv: 'UV :' + runtime: 'Runtime :' + updatetime: 'Last update :' + wordcount: 'Word count :' + toc: Table of contents + tagmore: View all + avatar: Avatar + hello: Long time no see, + back: Welcome back again, + sticker: Mood sticker + newpost: New posts + newcomment: New comments + card: + posts: 'Posts:' + tags: 'Tags:' + categories: 'Categories:' + +console: + comment_tip: Interaction + comment_title: Latest comments + tag_tip: Tags + tag_title: Find interesting areas + switch_darkmode: Day and night switching + switch_hideAside: Sidebar display control + switch_keyboard: Keyboard operation + switch_music: Music switch + archive_unit: Posts + recent_comment_more: Recent comments + newest_comment: + image: Image + link: Link + code: Code + emoji: Emoji + +sidebar: + function: Function + darkmode: Display mode + +footer: + description: Article from ${title} + learnmore: Learn more + randomlink: Links + rss: Subscribe + theme: Theme + +cookies: + title: Agreement reminder assistant + tip: Check out the efforts we make to protect your privacy + privacy: How this site protects your privacy + +music: + hit: Paused + +404: + button: Back to home + +link: + banner: + toComment: Application link + random: Random Visit + random: 'Click the button to visit a random link. The safety and availability of the destination website are not guaranteed. The random link for this visit is: ⌈ ${name} ⌋ ' + to: To + +keyboard: + title: Blog shortcuts + +newest_comment: + error: Unable to get a comment, please confirm that the relevant configuration is correct. + zero: No comments. + +comment: + title: ' Comment' + +commentBarrage: + title: Hot + +f12: Developer mode is turned on, please follow the GPL. + +right_menu: + copy: Copy + paste: Paste + comment: ToTalk + new: Open + link: Copy + img: Copy + downloadImg: Download + search: Search + dark: Light + light: Dark + chs_to_cht: 轉為繁體 + cht_to_chs: 转为简体 + img_error: This image cannot be copied or downloaded. + barrage: + open: OpenBarrage + close: CloseBarrage + music: + start: Play + stop: Pause + back: Back + forward: Forward + copyMusicName: CopyName + +pagination: + prev: Prev + next: Next + to: To page + +about: + other: + oneself: + map_title: I live in + info_title1: Born + info_title2: Current occupation + tj: + tip: Data + title: Access statistics + post_tip: 'Stats from:' + personalities: + tip1: At + tip2: 'Learn more:' + +message: + close: Hide message + open: Show message \ No newline at end of file diff --git a/themes/solitude/languages/zh-CN.yml b/themes/solitude/languages/zh-CN.yml new file mode 100644 index 0000000..ebfdf98 --- /dev/null +++ b/themes/solitude/languages/zh-CN.yml @@ -0,0 +1,228 @@ +more: 更多 +star: 喜欢这篇的人也看了 +random: 随便逛逛 +upload: 发布时间: +totalk: 无需删除空行,直接输入评论即可 +loading: 加载中... +day: ' 天' + +# Language: 简体中文 +theme: + dark: 已切换至深色模式 + light: 已切换至浅色模式 + +copy: + success: 复制成功 + error: 复制失败 + +copy_copyright: + author: 作者 + link: 链接 + source: 来源 + info: 著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 + +time: + day: "天前" + hour: "小时前" + just: "刚刚" + min: "分钟前" + month: "个月前" + +page: + tag: 标签 + category: 分类 + tags: 全部标签 + categories: 全部分类 + archives: 文章 + 404: 页面没有找到 + +nav: + site_name_title: 返回博客主页 + backtop: 返回顶部 + travellings: 开往-友链接力 + search: 搜索 + randompost: 随机一篇文章 + console: 中控台 + +home: + home: 首页 + sticky: 置顶 + new: 最新 + read: 未读 + recommend: 荐 + recommendmore: 更多推荐 + archives: 全部文章 + +post: + reprint: 转载或翻译 + original: 原创 + cc: 该文章为${cc}文章,注意版权协议 + posted: 发布于 + updated: 最后更新于 + wordcount: 文章字数 + minread: 阅读耗时 + ip: 作者IP归属地为 + pv: 文章热度 + comment: 评论数 + copyright: + reprint: 本文是转载或翻译文章,版权归原作者所有。转载本文请联系原作者。 + original: 本文是原创文章,采用 + original_end: 协议,完整转载请注明来自 + share: + qq: 分享到QQ + weibo: 分享到微博 + telegram: 分享到Telegram + twitter: 分享到Twitter + linkedin: 分享到LinkedIn + facebook: 分享到Facebook + link: 复制文章链接 + qrcode: 使用手机扫码阅读这篇文章 + whatsapp: 分享到WhatsApp + ai: + title: 文章摘要 + tip: 投诉 + nav: + next: 下一篇 + prev: 上一篇 + +award: + thanks: 致谢 + tipping: 赞赏作者 + title: 赞赏名单 + +search: + empty: 找不到你查询的内容:${query} + hit: 找到 ${hits} 条结果,用时 ${time} 毫秒 + placeholder: 输入关键词快速查找 + count: 共 ${count} 条结果。 + +head: + noscript: 开启JavaScript才能访问本站哦~ + +aside: + postcount: '文章总数 :' + pv: '总访问数 :' + uv: '总访客数 :' + runtime: '建站天数 :' + updatetime: '最后更新 :' + wordcount: '全站字数 :' + toc: 文章目录 + tagmore: 查看全部 + avatar: 头像 + hello: 好久不见, + back: 欢迎再次回来, + sticker: 心情贴纸 + newpost: 最近发布 + newcomment: 最新评论 + card: + posts: '累计文章数:' + tags: '标签总数:' + categories: '分类总数:' + +console: + comment_tip: 互动 + comment_title: 最新评论 + tag_tip: 标签 + tag_title: 寻找感兴趣的领域 + switch_darkmode: 昼夜切换 + switch_hideAside: 边栏显示控制 + switch_keyboard: 键盘快捷键 + switch_music: 音乐开关 + archive_unit: 篇 + recent_comment_more: 最近评论 + newest_comment: + image: 图片 + link: 链接 + code: 代码 + emoji: 表情 + +sidebar: + function: 功能 + darkmode: 显示模式 + +footer: + description: 来自${title}的文章 + learnmore: 了解更多 + randomlink: 友链 + rss: 订阅 + theme: 主题 + +cookies: + title: 协议提醒助手 + tip: 查看本站为你的个人隐私做出的努力 + privacy: 本站如何保护你的隐私 + +music: + hit: 音乐已暂停 + +404: + button: 返回首页 + +link: + banner: + toComment: 申请友链 + random: 随机访问 + random: 点击前往按钮进入随机一个友链,不保证跳转网站的安全性和可用性。本次随机到的是本站友链:⌈ ${name} ⌋ + to: 前往 + +keyboard: + title: 博客快捷键 + +newest_comment: + error: 无法获取评论,请确认相关配置是否正确。 + zero: 没有评论 + +comment: + title: 评论 + +commentBarrage: + title: 热评 + +f12: 开发者模式已打开,请遵循GPL协议。 + +right_menu: + copy: 复制选中文本 + paste: 粘贴文本 + comment: 引用到评论 + new: 新窗口打开 + link: 复制链接地址 + img: 复制此图片 + downloadImg: 下载此图片 + search: 站内搜索 + dark: 浅色模式 + light: 深色模式 + chs_to_cht: 轉為繁體 + cht_to_chs: 转为简体 + img_error: 此图片无法复制与下载 + barrage: + open: 显示热评 + close: 关闭热评 + music: + start: 播放音乐 + stop: 暂停音乐 + back: 切换到上一首 + forward: 切换到下一首 + copyMusicName: 复制歌名 + +pagination: + prev: 上一页 + next: 下一页 + to: 跳转到指定页面 + +about: + other: + oneself: + map_title: 我现在住在 + info_title1: 生于 + info_title2: 现在职业 + tj: + tip: 数据 + title: 访问统计 + post_tip: 统计信息来自 + personalities: + tip1: 在 + tip2: 了解更多关于 + +message: + close: 隐藏弹幕 + open: 显示弹幕 \ No newline at end of file diff --git a/themes/solitude/languages/zh-TW.yml b/themes/solitude/languages/zh-TW.yml new file mode 100644 index 0000000..8cbaf04 --- /dev/null +++ b/themes/solitude/languages/zh-TW.yml @@ -0,0 +1,226 @@ +more: 更多 +star: 喜歡這篇的人也看了 +random: 随便逛逛 +upload: 發佈時間: +totalk: 無需刪除空行,直接輸入評論即可 +loading: 加載中... +day: ' 天' + +# Language: 繁體中文 (台灣) +theme: + dark: 已切換至深色模式 + light: 已切換至淺色模式 + +copy: + success: 複製成功 + error: 複製失敗 + +copy_copyright: + author: 作者 + link: 連結 + source: 來源 + info: 著作權歸作者所有。 商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。 + +time: + day: "天前" + hour: "小時前" + just: "剛剛" + min: "分鐘前" + month: "個月前" + +page: + tag: 標籤 + category: 分類 + tags: 全部標籤 + categories: 全部分類 + archives: 文章 + 404: 頁面沒有找到 + +nav: + site_name_title: 返回博客主頁 + backtop: 返回頂部 + travellings: 開往-友鏈接力 + search: 搜索 + randompost: 隨機一篇文章 + console: 中控台 + +home: + home: 首頁 + sticky: 置頂 + new: 最新 + read: 未讀 + recommend: 荐 + recommendmore: 更多推薦 + archives: 全部文章 + +post: + reprint: 轉載或翻譯 + original: 原創 + cc: 該文章為${cc}文章,注意版權協議 + posted: 發布於 + updated: 最後更新於 + wordcount: 文章字數 + minread: 閱讀耗時 + ip: 作者IP歸屬地為 + pv: 文章熱度 + comment: 評論數 + copyright: + reprint: 本文是转载或翻译文章,版权归原作者所有。转载本文请联系原作者。 + original: 本文是原创文章,采用 + original_end: 协议,完整转载请注明来自 + share: + qq: 分享到QQ + weibo: 分享到微博 + telegram: 分享到Telegram + twitter: 分享到Twitter + linkedin: 分享到LinkedIn + facebook: 分享到Facebook + link: 复制文章链接 + qrcode: 使用手机扫码阅读这篇文章 + whatsapp: 分享到WhatsApp + ai: + title: 文章摘要 + tip: 投訴 + nav: + next: 下一篇 + prev: 上一篇 + +award: + thanks: 致謝 + tipping: 贊助作者 + title: 讚賞名單 + +search: + empty: 找不到你查詢的內容:${query} + hit: 找到 ${hits} 條結果,用時 ${time} 毫秒 + placeholder: 輸入關鍵詞快速查找 + count: 共 ${count} 條結果。 + +head: + noscript: 開啟JavaScript才能訪問本站哦~ + +aside: + postcount: '文章數:' + pv: '瀏覽量:' + uv: '訪客數:' + runtime: '運行時間:' + updatetime: '最後更新:' + wordcount: '字數統計:' + toc: 文章目錄 + tagmore: 查看全部 + avatar: 头像 + hello: 好久不見, + back: 歡迎再次回來, + sticker: 心情贴纸 + newpost: 最近发布 + newcomment: 最新评论 + card: + posts: '累計文章數:' + tags: '標籤總數:' + categories: '分類總數:' + +console: + comment_tip: 互動 + comment_title: 評論 + tag_tip: 標籤 + tag_title: 標籤 + switch_darkmode: 昼夜切換 + switch_hideAside: 边栏显示控制 + switch_keyboard: 鍵盤快捷鍵 + switch_music: 音樂開關 + archive_unit: 篇 + recent_comment_more: 最近評論 + newest_comment: + image: 圖片 + link: 連結 + code: 代碼 + emoji: 表情 + +sidebar: + function: 功能 + darkmode: 顯示模式 + +footer: + description: 來自${title}的文章 + learnmore: 了解更多 + randomlink: 友鏈 + rss: 訂閱 + theme: 主題 + +cookies: + title: 協議提醒助手 + tip: 查看本站為你的個人隱私做出的努力 + privacy: 本站如何保護你的隱私 + +music: + hit: 音樂已暫停 + +404: + button: 返回首頁 + +link: + banner: + toComment: 申請友鏈 + random: 點擊前往按鈕進入隨機一個友鏈,不保證跳轉網站的安全性和可用性。本次隨機到的是本站友鏈:⌈ ${name} ⌋ + to: 前往 +keyboard: + title: 博客快捷鍵 + +newest_comment: + error: 無法獲取評論,請確認相關配置是否正確。 + zero: 沒有評論 + +comment: + title: 評論 + +commentBarrage: + title: 熱評 + +f12: 開發者模式已打開,請遵循GPL協定。 + +right_menu: + copy: 複製選中文本 + paste: 粘貼文本 + comment: 引用到評論 + new: 新窗口打開 + link: 複製連結位址 + img: 複製此圖片 + downloadImg: 下載此圖片 + search: 站內搜索 + dark: 淺色模式 + light: 深色模式 + chs_to_cht: 轉為繁體 + cht_to_chs: 转为简体 + img_error: 此圖片無法複製與下載 + barrage: + open: 顯示熱評 + close: 關閉熱評 + music: + start: 播放音樂 + stop: 暫停音樂 + back: 切換到上一首 + forward: 切換到下一首 + copyMusicName: 複製歌名 + +pagination: + prev: 上一頁 + next: 下一頁 + to: 跳轉到指定頁面 + +about: + other: + oneself: + map_title: 我現在住在 + info_title1: 生於 + info_title2: 現在職業 + tj: + tip: 數據 + title: 訪問統計 + post_tip: 統計信息來自 + personalities: + tip1: 在 + tip2: 瞭解更多關於 + +message: + close: 隱藏彈幕 + open: 顯示彈幕 \ No newline at end of file diff --git a/themes/solitude/layout/404.pug b/themes/solitude/layout/404.pug new file mode 100644 index 0000000..febeb77 --- /dev/null +++ b/themes/solitude/layout/404.pug @@ -0,0 +1,24 @@ +extends includes/layout.pug + +block content + #error-wrap + .error-content + .error-img(style=`background-image: url(${url_for(theme.errorpage.img)})`) + .error-info + h1.error_title 404 + .error_subtitle= theme.errorpage.text + a.button--animated(href=url_for("/")) + i.solitude.st-external-link + =_p('404.button') + + if theme.errorpage.recommendList + .aside-list + .aside-list-group + each post, index in site.posts.sort('-date').data.slice(0, 6) + if index >= 5 + break + .aside-list-item + a.thumbnail(href=url_for(post.path), title=post.title) + img(src=post.cover, alt=post.title) + .content + a.title(href=url_for(post.path), title=post.title)= post.title diff --git a/themes/solitude/layout/archive.pug b/themes/solitude/layout/archive.pug new file mode 100644 index 0000000..b6965dd --- /dev/null +++ b/themes/solitude/layout/archive.pug @@ -0,0 +1,10 @@ +extends includes/layout.pug + +block content + main.layout#content-inner + #archive + .article-sort-title #{__('page.archives')}#{site.posts.find({ parent: { $exists: false } }).length} + .article-sort + include includes/mixins/articleSort + include includes/mixins/pagination + include includes/widgets/aside/aside \ No newline at end of file diff --git a/themes/solitude/layout/category.pug b/themes/solitude/layout/category.pug new file mode 100644 index 0000000..0e4b617 --- /dev/null +++ b/themes/solitude/layout/category.pug @@ -0,0 +1,12 @@ +extends includes/layout.pug + +block content + main.layout#content-inner + #category + #category-bar + include includes/widgets/home/categoryBar + .recent-posts#recent-posts + each post,index in page.posts.find({ parent: { $exists: false } }).data + include includes/widgets/home/postList + include includes/mixins/pagination + include includes/widgets/aside/aside \ No newline at end of file diff --git a/themes/solitude/layout/includes/body/gadsense.pug b/themes/solitude/layout/includes/body/gadsense.pug new file mode 100644 index 0000000..0e52f3c --- /dev/null +++ b/themes/solitude/layout/includes/body/gadsense.pug @@ -0,0 +1,9 @@ +if theme.google_adsense && theme.google_adsense.enable + script(async src=theme.google_adsense.js onerror="document.querySelectorAll('.google-ads-warp').forEach(i => i.style.display='none')") + + if theme.google_adsense.auto_ads + script. + (adsbygoogle = window.adsbygoogle || []).push({ + google_ad_client: '!{theme.google_adsense.client}', + enable_page_level_ads: !{theme.google_adsense.enable_page_level_ads}, + }); \ No newline at end of file diff --git a/themes/solitude/layout/includes/body/mode.pug b/themes/solitude/layout/includes/body/mode.pug new file mode 100644 index 0000000..630ba65 --- /dev/null +++ b/themes/solitude/layout/includes/body/mode.pug @@ -0,0 +1,38 @@ +case theme.display_mode.type + when "auto" + script. + initTheme = () => { + let isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches + const cachedMode = utils.saveToLocal.get('theme'); + if (cachedMode === undefined) { + const nowMode = + isDarkMode ? 'dark' : 'light' + document.documentElement.setAttribute('data-theme', nowMode); + } else { + document.documentElement.setAttribute('data-theme', cachedMode); + } + typeof rm === 'object' && rm.mode(cachedMode === 'dark' && isDarkMode) + } + initTheme() + when "dark" + script. + initTheme = () => { + const cachedMode = utils.saveToLocal.get('theme'); + if (cachedMode === undefined) + document.documentElement.setAttribute('data-theme', 'dark'); + else + document.documentElement.setAttribute('data-theme', cachedMode); + typeof rm === 'object' && rm.mode(cachedMode === undefined || cachedMode === 'dark') + } + initTheme() + when "light" + script. + initTheme = () => { + const cachedMode = utils.saveToLocal.get('theme'); + if (cachedMode === undefined) + document.documentElement.setAttribute('data-theme', 'light'); + else + document.documentElement.setAttribute('data-theme', cachedMode); + typeof rm === 'object' && rm.mode(cachedMode === 'dark') + } + initTheme() \ No newline at end of file diff --git a/themes/solitude/layout/includes/console.pug b/themes/solitude/layout/includes/console.pug new file mode 100644 index 0000000..b07e5af --- /dev/null +++ b/themes/solitude/layout/includes/console.pug @@ -0,0 +1,51 @@ +div#console + div.close-btn(onclick="sco.hideConsole()") + i.solitude.st-close-fill + if theme.console_plus + div.console-card-group + if theme.recent_comments.enable && theme.recent_comments.img + div.console-card-group-left + div.console-card#card-newest-comments(onclick="sco.hideConsole()") + div.card-content + div.author-content-item-tips= _p('console.comment_tip') + div.author-content-item-title + | #{_p('console.comment_title')} + if theme.recent_comments.enable + a.recent-comment-more(href=url_for(theme.recent_comments.page) title=_p('console.recent_comment_more')) + i.solitude.st-right-btn-fill + a.recent-comment-image(href=url_for(theme.recent_comments.page)) + img(src=theme.recent_comments.img) + + div.console-card-group-right + div.console-card.tags(onclick="sco.hideConsole()") + div.card-content + div.author-content-item-tips= _p('console.tag_tip') + div.author-content-item-title= _p('console.tag_title') + div.card-tag-cloud + each tag in site.tags.find({ parent: { $exists: false } }).data + a(href=url_for(tag.path))= tag.name + sup= tag.length + + div.console-card.history(onclick="sco.hideConsole()") + include ./widgets/aside/asideArchive.pug + + div.button-group + div.console-btn-item + span.darkmode_switchbutton(onclick="sco.switchDarkMode()", title=_p('console.switch_darkmode')) + i.solitude.st-moon-clear-fill + div.console-btn-item#consoleHideAside + span.asideSwitch(onclick="sco.switchHideAside()", title=_p('console.switch_hideAside')) + i.solitude.st-side-bar-fill + if theme.keyboard.enable + div.console-btn-item#consoleKeyboard(onclick="sco.switchKeyboard()") + span.keyboardSwitch(title=_p('console.switch_keyboard')) + i.solitude.st-keyboard-box-fill + if theme.capsule.enable + div.console-btn-item#consoleMusic(onclick="sco.musicToggle()") + span.music-switch(title=_p('console.switch_music')) + i.solitude.st-disc-fill + if theme.comment.use && theme.comment.commentBarrage + div.console-btn-item.on#consoleCommentBarrage(onclick="sco.switchCommentBarrage()") + span.commentBarrage + i.solitude.st-chat-fill + div.console-mask(onclick="sco.hideConsole()") \ No newline at end of file diff --git a/themes/solitude/layout/includes/footer.pug b/themes/solitude/layout/includes/footer.pug new file mode 100644 index 0000000..bdb2d46 --- /dev/null +++ b/themes/solitude/layout/includes/footer.pug @@ -0,0 +1,72 @@ +if theme.post.footer.enable && is_post() + div#st-footer-bar + div.footer-logo + if theme.site.name.class === 'i_class' + i.solitude(class=theme.site.name.custom) + else if theme.site.name.class === 'img' + img.solitude.nolazyload(src=url_for(theme.site.name.custom)) + else if theme.site.name.class === 'text' + span= theme.site.name.custom + div.footer-bar-description=theme.post.footer.desc + if theme.post.footer.button.enable + a.footer-bar-link(href=url_for(theme.post.footer.button.url))= theme.post.footer.button.name +div#footer_deal + - var leftInfo = theme.footer && theme.footer.information && theme.footer.information.left || {} + - var rightInfo = theme.footer && theme.footer.information && theme.footer.information.right || {} + + each value, label in leftInfo + - var array = value.split('||') + a.deal_link(href=url_for(trim(array[0])), title=label) + i.solitude(class=array[1]) + + if theme.footer.information.author + div#footer_mini_logo.nolazyload.footer_mini_logo(title=_p('nav.backtop'), onclick="sco.toTop()") + img(src=theme.site.icon, alt=_p('nav.backtop')) + + each value, label in rightInfo + - var array = value.split('||') + a.deal_link(href=url_for(trim(array[0])), title=label) + i.solitude(class=array[1]) +div#st-footer + - var group = theme.footer && theme.footer.group ? theme.footer.group : {} + + each value, x in group + div.footer-group + h3.footer-title= x + div.footer-links + each url, y in value + a.footer-item(href=url_for(url), title=y)= y + + if theme.footer && theme.footer.randomlink + div.footer-group + div.footer-title-group + h3.footer-title= _p('footer.randomlink') + button.random-friends-btn(onclick='randomLinksList()', title=_p('footer.randomlink')) + i.solitude.st-refresh-line + div.footer-links#friend-links-in-footer +div#footer-bar + div.footer-bar-links + div.footer-bar-left + if moment(theme.aside.siteinfo.runtime).year() === new Date().getFullYear() + div.copyright © #{moment(theme.aside.siteinfo.runtime).year()} By  + a.footer-bar-link(href=url_for("/"))= config.author + else + div.copyright © #{moment(theme.aside.siteinfo.runtime).year()} - #{new Date().getFullYear()} By  + a.footer-bar-link(href=url_for("/"))= config.author + div.footer-bar-right + each item in theme.footer.links + a.footer-bar-link(href=url_for(item.url), alt=item.name)!= item.name + a.footer-bar-link.cc(href=url_for(theme.footer.license), aria-label = 'copyright') + i.solitude.st-copyright-line + i.solitude.st-creative-commons-by-line + i.solitude.st-creative-commons-nc-line + i.solitude.st-creative-commons-nd-line +if theme.footer.privacy + div.needEndHide#cookies-window + div.cookies-window-title= __('cookies.title') + div.cookies-window-content + span.cookies-tip= __('cookies.tip') + a.cookies-link(href=url_for(theme.footer.privacy), title=_p('cookies.privacy')) + i.solitude.st-right-btn-fill +if theme.comment.use && theme.comment.commentBarrage + div.comment-barrage.needEndHide \ No newline at end of file diff --git a/themes/solitude/layout/includes/head.pug b/themes/solitude/layout/includes/head.pug new file mode 100644 index 0000000..7bea614 --- /dev/null +++ b/themes/solitude/layout/includes/head.pug @@ -0,0 +1,32 @@ +- let title = page.title, subtitle ='' +- if (is_home()) title = config.title +- else if (is_archive()) title = _p('page.archives') + (page.year || "") +- else if (is_tag()) title = _p('page.tag')+': ' + page.tag +- else if (is_category()) title = _p('page.category') +': ' + page.category +- else if (page.type === '404') title = _p('page.404') +- else if (page.type === 'tags') title = _p('page.tags') +- else if (page.type === 'categories') title = _p('page.categories') +- else if (is_post() || is_page()) title = page.title + +- if (is_home()) subtitle = config.subtitle ? ' - ' + config.subtitle : '' +- else subtitle = title ? ' | ' + config.title : config.title + +meta(charset="utf-8") +meta(http-equiv="X-UA-Compatible", content="IE=edge") +meta(name="viewport" content="width=device-width, initial-scale=1") + +title= title + subtitle +noscript= _p('head.noscript') +link(rel="icon", href=url_for(theme.site.siteIcon)) + +// index.css +link(rel="stylesheet", href=url_for(theme.cdn.main_css)) + +// inject head +include ./inject/head.pug + +// global head +include ./head/config.pug + +// page-config head +include ./head/page_config \ No newline at end of file diff --git a/themes/solitude/layout/includes/head/config.pug b/themes/solitude/layout/includes/head/config.pug new file mode 100644 index 0000000..56423f7 --- /dev/null +++ b/themes/solitude/layout/includes/head/config.pug @@ -0,0 +1,166 @@ +- + if (theme.search.enable) { + var localSearch = 'undefined'; + var algolia = 'undefined'; + switch (theme.search.type) { + case 'local': + localSearch = JSON.stringify({ + preload: theme.search.local.preload, + path: theme?.search?.local?.CDN || '/search.xml' + }); + break; + case 'algolia': + algolia = JSON.stringify({ + appId: config.algolia.appId || config.algolia.applicationID, + apiKey: config.algolia.apiKey, + indexName: config.algolia.indexName, + hits: { + per_page: theme?.search?.algolia?.hits?.per_page || 10 + } + }); + break; + } + } + + const sayhello2 = theme.aside?.card?.sayhello2?.map(item => `"${item}"`) || []; + const [hello_prefix, hello_back] = [_p('aside.hello'), _p('aside.back')]; + + let comment = false + + if (theme.comment.use && theme.comment.commentBarrage) { + comment = { + avatar: theme.comment.avatar, + commentBarrage: theme.comment.commentBarrage, + } + } + + let post_ai = false + + if (theme.post_ai.enable) { + post_ai = JSON.stringify({ + key: theme.post_ai.key, + talk: theme.post_ai.talk, + randomPost: theme.post_ai.randomPost, + }) + } + + let copyright = false; + if (theme.copy.enable && theme.copy.copyright.enable) { + copyright = JSON.stringify({ + limit: theme.copy.copyright.limit, + author: _p("copy_copyright.author") + ': ' + config.author, + link: _p("copy_copyright.link") + ': ', + source: _p("copy_copyright.source") + ': ' + config.title, + info: _p("copy_copyright.info") + }) + } + + let lang = false + lang = { + theme: { + dark: _p('theme.dark'), + light: _p('theme.light'), + }, + copy: { + success: _p('copy.success'), + error: _p('copy.error'), + }, + backtop: _p('nav.backtop'), + time: { + day: _p('time.day'), + hour: _p('time.hour'), + just: _p('time.just'), + min: _p('time.min'), + month: _p('time.month') + }, + day: _p('day'), + f12: _p('f12'), + totalk: _p('totalk') + } + + if (theme.search.enable) { + lang.search = { + empty: _p('search.empty'), + hit: _p('search.hit'), + placeholder: _p('search.placeholder'), + count: _p('search.count') + } + } + + if (theme.comment.use && theme.comment.commentBarrage) { + lang.barrage = { + title: _p('commentBarrage.title'), + } + } + + let rightMenu = false + if (theme.right_menu.enable) { + rightMenu = { + mode: { + dark: _p('right_menu.light'), + light: _p('right_menu.dark'), + }, + img_error: _p('right_menu.img_error') + } + if (theme.capsule.enable) { + rightMenu.music = { + start: _p('right_menu.music.start'), + stop: _p('right_menu.music.stop'), + } + } + if (theme.comment.use && theme.comment.commentBarrage) { + rightMenu.barrage = { + open: _p('right_menu.barrage.open'), + close: _p('right_menu.barrage.close') + } + } + if (theme.right_menu.translate.enable) { + rightMenu.translate = { + translateDelay: theme.right_menu.translate.translateDelay, + defaultEncoding: theme.right_menu.translate.defaultEncoding + } + } + } + +script. + const GLOBAL_CONFIG = { + root: '!{config.root}', + algolia: !{algolia ? algolia : 'undefined'}, + localsearch: !{localSearch ? localSearch : 'undefined'}, + runtime: '!{theme.aside.siteinfo.runtimeenable ? theme.aside.siteinfo.runtime : false}', + lazyload: { + enable: !{theme.lazyload.enable}, + error: '!{theme.lazyload.errorimg}' + }, + copyright: !{copyright}, + highlight: { + enable: !{theme.highlight.enable}, + limit: !{theme.highlight.limit}, + expand: !{theme.highlight.expand}, + copy: !{theme.highlight.copy}, + syntax: '!{config.syntax_highlighter}' + }, + randomlink: !{theme.footer.randomlink}, + lang: !{JSON.stringify(lang)}, + aside: { + sayhello: { + morning: '!{theme.aside.card.sayhello.morning}', + noon: '!{theme.aside.card.sayhello.noon}', + afternoon: '!{theme.aside.card.sayhello.afternoon}', + night: '!{theme.aside.card.sayhello.night}', + goodnight: '!{theme.aside.card.sayhello.goodnight}', + }, + sayhello2: [!{sayhello2}], + sayhello3: { + prefix: '!{hello_prefix}', + back: '!{hello_back}', + }, + }, + covercolor: { + enable: !{theme.post.covercolor.enable} + }, + comment: !{comment ? JSON.stringify(comment) : false}, + lightbox: '!{ theme.mediumZoom ? "mediumZoom" : (theme.fancybox ? "fancybox" : "null")}', + post_ai: !{post_ai}, + right_menu: !{rightMenu ? JSON.stringify(rightMenu) : false}, + }; \ No newline at end of file diff --git a/themes/solitude/layout/includes/head/opengraph.pug b/themes/solitude/layout/includes/head/opengraph.pug new file mode 100644 index 0000000..bbd0f60 --- /dev/null +++ b/themes/solitude/layout/includes/head/opengraph.pug @@ -0,0 +1,13 @@ +if theme.OpenGraph.enable + - + const coverVal = page.cover || theme.site.siteIcon + let ogOption = { + type: is_post() ? 'article' : 'website', + image: coverVal ? full_url_for(coverVal) : '', + ...theme.OpenGraph.options + } + - + != open_graph(ogOption) + meta(name="description" content=page_description()) +else + meta(name="description" content=page_description()) \ No newline at end of file diff --git a/themes/solitude/layout/includes/head/page_config.pug b/themes/solitude/layout/includes/head/page_config.pug new file mode 100644 index 0000000..85dc746 --- /dev/null +++ b/themes/solitude/layout/includes/head/page_config.pug @@ -0,0 +1,10 @@ +script#config-diff. + var PAGE_CONFIG = { + is_post: !{is_post()}, + is_page: !{!is_post() && !is_home()}, + is_home: !{is_home()}, + page: '!{page.type}', + toc: !{!!page.toc}, + comment: !{!!page.comment}, + ai_text: !{is_post && page.ai_text ? "'"+ page.ai_text+"'" : false} + } \ No newline at end of file diff --git a/themes/solitude/layout/includes/head/pwa.pug b/themes/solitude/layout/includes/head/pwa.pug new file mode 100644 index 0000000..078a397 --- /dev/null +++ b/themes/solitude/layout/includes/head/pwa.pug @@ -0,0 +1,22 @@ +if theme.pwa.enable + meta(name="theme-color", content=theme.pwa.theme_color) + meta(name="apple-mobile-web-app-status-bar-style", content=theme.pwa.theme_color) + link(rel="manifest" href=url_for(theme.pwa.manifest)) + if theme.pwa.theme_color + meta(name="msapplication-TileColor" content=theme.pwa.theme_color) + if theme.pwa.mask_icon + link(rel="mask-icon", href=url_for(theme.pwa.mask_icon), color=theme.pwa.theme_color) + if theme.pwa.apple_touch_icon + link(rel="apple-touch-icon" sizes="180x180" href=url_for(theme.pwa.apple_touch_icon)) + if theme.pwa.favicon_16_16 + link(rel="icon", type="image/png", sizes="16x16", href=url_for(theme.pwa.favicon_16_16)) + if theme.pwa.favicon_32_32 + link(rel="icon", type="image/png", sizes="32x32", href=url_for(theme.pwa.favicon_32_32)) + if theme.pwa.bookmark_icon + link(rel="bookmark", href=url_for(theme.pwa.bookmark_icon)) +else + meta(name="apple-mobile-web-app-capable", content=config.title) + meta(name="theme-color", content="var(--efu-main)") + meta(name="apple-mobile-web-app-status-bar-style", content="var(--efu-main)") + link(rel="bookmark", href=url_for(theme.site.siteIcon)) + link(rel="apple-touch-icon", href=url_for(theme.site.siteIcon), sizes="180x180") \ No newline at end of file diff --git a/themes/solitude/layout/includes/header.pug b/themes/solitude/layout/includes/header.pug new file mode 100644 index 0000000..38b53e9 --- /dev/null +++ b/themes/solitude/layout/includes/header.pug @@ -0,0 +1,4 @@ +header#page-header(class=is_post() ? 'post-bg' : 'not-top-img') + include ./nav.pug + if is_post() + include ./widgets/post/postMeta.pug \ No newline at end of file diff --git a/themes/solitude/layout/includes/inject/body.pug b/themes/solitude/layout/includes/inject/body.pug new file mode 100644 index 0000000..51fd627 --- /dev/null +++ b/themes/solitude/layout/includes/inject/body.pug @@ -0,0 +1,117 @@ +- page.type = is_post() ? 'post' : page.type + +mixin katex + if theme.katex.copytex + script(src=url_for(theme.cdn.katex_copytex)) + script. + (() => { + document.querySelectorAll('#article-container span.katex-display').forEach(item => { + utils.wrap(item, 'div', {class: 'katex-wrap'}) + }) + })(); + +div + script(src=url_for(theme.cdn.utils)) + script(src=url_for(theme.cdn.main)) + script(src=url_for(theme.cdn.waterfall)) + script(src=url_for(theme.cdn.pjax)) + + if theme.mermaid + script(src=url_for(theme.cdn.mermaid_js)) + if theme.post.share.enable && theme.post.share.list && theme.post.share.list.includes('qrcode') + script(src=url_for(theme.cdn.qrcode)) + + if theme.display_mode.universe + script(src=url_for(theme.cdn.universe_js)) + script. + dark() + + if theme.right_menu.enable && theme.right_menu.translate.enable + script(src=url_for(theme.cdn.translate_js)) + + if theme.katex && theme.katex.enable + if theme.katex.per_page && (is_post() || is_page()) + +katex + else if page.katex + +katex + + if theme.lazyload.enable + script(src=url_for(theme.cdn.lazyload)) + script(src=url_for(theme.cdn.snackbar)) + if theme.lightbox + if theme.mediumZoom + script(src=url_for(theme.cdn.medium_zoom)) + if theme.fancybox + script(src=url_for(theme.cdn.fancyapps_ui)) + if (theme.says.home_mini && theme.says.enable) || theme.carousel + script(src=url_for(theme.cdn.swiper_js)) + + if theme.post_ai.enable + script(src=url_for(theme.cdn.efu_ai)) + + if theme.capsule.enable || theme.music.enable || theme.says.enable + script. + var meting_api = '!{theme.meting_api}'; + script(src=url_for(theme.cdn.aplayer_js)) + script(src=url_for(theme.cdn.meting_js)) + + if theme.post.covercolor.enable + case theme.post.covercolor.mode + when 'local' + script(src=url_for(theme.cdn.cover_local)) + when 'api' + script. + const coverColorConfig = { + api: '!{theme.post.covercolor.api}', + time: !{theme.post.covercolor.time} + } + script(src=url_for(theme.cdn.cover_api)) + + if theme.loading.pace + script(src=url_for(theme.cdn.pace_js)) + + if theme.search.enable && theme.search.type === "algolia" + script(src=url_for(theme.cdn.instantsearch)) + script(src=url_for(theme.cdn.algolia_search)) + + if theme.right_menu.enable + script(src=url_for(theme.cdn.right_menu_js)) + + if theme.extends.body + each item in theme.extends.body + != item + + .js-pjax + if is_home() && theme.says.enable && theme.says.home_mini + script. + sco.initbbtalk() + if page.type === 'says' && theme.says.enable + script. + GLOBAL_CONFIG.lightbox && utils.lightbox(document.querySelectorAll(".bber-content-img img")); + sco.changeTimeFormat(document.querySelectorAll('.bber-info-time time')) + if comment_js + include ../widgets/third-party/comments/js + if theme.mermaid + script. + mermaid.run(); + if is_home() && theme.carousel && site.posts.data.filter(item => item.recommend === true).slice(0, 6) || false + script. + carousel_swiper() + if theme.busuanzi && (theme.aside.siteinfo.uv || theme.aside.siteinfo.pv) + if theme.busuanzi_use === 0 + script(defer pjax src=url_for(theme.cdn.busuanzi_js)) + else + script(defer pjax src=url_for(theme.cdn.busuanzi_qj_js)) + + +if theme.footer.randomlink + include ../widgets/randomlink.pug + +// pjax +!= partial("includes/widgets/third-party/pjax", {}, {cache: true}) + +// theme +include ../body/mode + +// google adsense +include ../body/gadsense \ No newline at end of file diff --git a/themes/solitude/layout/includes/inject/head.pug b/themes/solitude/layout/includes/inject/head.pug new file mode 100644 index 0000000..ff39cb9 --- /dev/null +++ b/themes/solitude/layout/includes/inject/head.pug @@ -0,0 +1,52 @@ +each item in theme.verify_site || [] + meta(name=item.name, content=item.content) + +link(rel="canonical" href=urlNoIndex()) +link(rel="stylesheet", href=url_for(theme.cdn.solitude_css)) + +// aplayer +if theme.capsule.enable || theme.music.enable + link(rel="stylesheet", href=url_for(theme.cdn.aplayer_css)) + +// swiper +if (theme.says.home_mini && theme.says.enable) || theme.carousel + link(rel="stylesheet", href=url_for(theme.cdn.swiper_css)) + +// fancybox ui +if theme.lightbox && theme.fancybox + link(rel="stylesheet", href=url_for(theme.cdn.fancyapps_css)) + +// katex +if theme.katex && theme.katex.enable + link(rel="stylesheet", href=url_for(theme.cdn.katex)) + +// Open Graph +include ../head/opengraph.pug + +// pwa +include ../head/pwa.pug + +script. + console.log( + "%c Program: Hexo %c Theme: Solitude %c Version: v1.12.2", + "border-radius:5px 0 0 5px;padding: 5px 10px;color:white;background:#ff3842;", + "padding: 5px 10px;color:white;background:#3e9f50;", + "padding: 5px 10px;color:white;background:#0084ff;border-radius:0 5px 5px 0", + ) + +if theme.memorial.enable + script. + let mdate = "!{theme.memorial.date}"; + mdate = (mdate.split(",")); + let ndate = new Date(); + for (let i of mdate) { + if (i === (ndate.getMonth()+1) + "-" + (ndate.getDate())) { + document.documentElement.classList.add('memorial'); + } + } + +if theme.extends.head + each item in theme.extends.head + != item + +!=fragment_cache('injectHeadJs', function(){return inject_head_js()}) \ No newline at end of file diff --git a/themes/solitude/layout/includes/keyboard.pug b/themes/solitude/layout/includes/keyboard.pug new file mode 100644 index 0000000..a5b8558 --- /dev/null +++ b/themes/solitude/layout/includes/keyboard.pug @@ -0,0 +1,65 @@ +- const list = theme.keyboard.list || [] +#keyboard-tips + .keyboardTitle=_p('keyboard.title') + .keyboardList + each item in list + .keyboardItem + .keyGroup + .key= 'Shift' + .key= item.key + .keyContent + .content= item.name +script. + const keyboard_addKeyup = (e) => { + if (e.key === 'Shift') { + document.getElementById('keyboard-tips').classList.remove('show'); + } + } + + const keyboard_addKeydown = (e) => { + const keyboards = !{JSON.stringify(list)}; + if (e.keyCode === 16) { + document.getElementById('keyboard-tips').classList.add('show'); + } + + for (let i = 0; i < keyboards.length; i++) { + if (keyboards[i].url) { + if (keyboards[i].url.startsWith('http')) { + if (e.key === keyboards[i].key) { + window.open(keyboards[i].url); + } + } else { + if (e.key === keyboards[i].key) { + pjax.loadUrl(keyboards[i].url); + } + } + } else if (keyboards[i].sco) { + if (e.key === keyboards[i].key) { + sco[keyboards[i].sco](); + } + } else if (keyboards[i].func) { + if (e.key === keyboards[i].key) { + window[keyboards[i].func](); + } + } + } + } + + function openKeyboard() { + + window.addEventListener('keyup', keyboard_addKeyup); + + window.addEventListener('keydown', keyboard_addKeydown); + } + function closeKeyboard() { + + window.removeEventListener('keyup', keyboard_addKeyup); + + window.removeEventListener('keydown', keyboard_addKeydown); + } + + var sco_keyboards = localStorage.getItem('keyboard') === 'true' + if (sco_keyboards) { + openKeyboard(); + document.getElementById('consoleKeyboard').classList.add('on'); + } \ No newline at end of file diff --git a/themes/solitude/layout/includes/layout.pug b/themes/solitude/layout/includes/layout.pug new file mode 100644 index 0000000..12db85b --- /dev/null +++ b/themes/solitude/layout/includes/layout.pug @@ -0,0 +1,54 @@ +- page.type = is_home() ? 'solitude' : page.type + +doctype html +html(lang=config.language, data-theme="light") + head + include ./head.pug + body#body(data-type=page.type) + // universe + if theme.display_mode.universe + canvas#universe + + // loading + if theme.loading.fullpage + include ./loading.pug + + // console + include ./console.pug + + // sidebar + include ./sidebar.pug + + // keyboard + if theme.keyboard.enable + include ./keyboard.pug + + #body-wrap(class = is_post() ? 'post' : 'page') + include ./header.pug + + if(page.type !== '404') + block content + + footer#footer + include ./footer.pug + else + .error#body-wrap + block content + + // right_menu + if theme.right_menu.enable + include rightmenu + + // inject body + include ./inject/body.pug + + // search + include ./widgets/third-party/search/index.pug + + // Tianli-Talk + if theme.tianli_talk.enable + include ./widgets/third-party/tianli-talk.pug + + // music + if theme.capsule.enable + include ./widgets/third-party/music.pug \ No newline at end of file diff --git a/themes/solitude/layout/includes/loading.pug b/themes/solitude/layout/includes/loading.pug new file mode 100644 index 0000000..8af5e47 --- /dev/null +++ b/themes/solitude/layout/includes/loading.pug @@ -0,0 +1,25 @@ +div(id="loading-box" onclick="preloader.endLoading();" style="zoom:1") + div.loading-bg + img.loading-img.nolazyload(src=url_for(theme.site.icon), alt="loading image") + +script. + const preloader = { + endLoading: () => { + document.getElementById('loading-box').classList.toggle('loaded'); + }, + initLoading: () => { + document.getElementById('loading-box').classList.remove('loaded'); + }, + removePaceDone: () => { + document.getElementById('body').classList = 'pace-done'; + } + } + window.addEventListener('load', () => { + preloader.endLoading(); + }); + window.addEventListener('pjax:send', () => { + preloader.initLoading(); + }); + document.addEventListener('pjax:complete', () => { + preloader.endLoading(); + }); \ No newline at end of file diff --git a/themes/solitude/layout/includes/mixins/articleSort.pug b/themes/solitude/layout/includes/mixins/articleSort.pug new file mode 100644 index 0000000..a64c51e --- /dev/null +++ b/themes/solitude/layout/includes/mixins/articleSort.pug @@ -0,0 +1,14 @@ +- let year +each post in page.posts.find({ parent: { $exists: false } }).data + if(year !== post.date.year()) + - year = post.date.year() + .article-sort-item.year #{year} + .article-sort-item + a.article-sort-item-img(href=url_for(post.path) title=post.title) + img(src=post.cover alt=post.title) + .article-sort-item-info + a.article-sort-item-title(href=url_for(post.path) title=post.title onclick="window.event.cancelBubble=true;") #{post.title} + .article-sort-item-tags + each tags in post.tags.data + a.article-meta__tags(href=url_for(tags.path) onclick="window.event.cancelBubble=true;") + span.tags-punctuation #{tags.name} \ No newline at end of file diff --git a/themes/solitude/layout/includes/mixins/pagination.pug b/themes/solitude/layout/includes/mixins/pagination.pug new file mode 100644 index 0000000..c8403cd --- /dev/null +++ b/themes/solitude/layout/includes/mixins/pagination.pug @@ -0,0 +1,8 @@ +nav#pagination + div.pagination + - var options = {mid_size: 1,escape: false,next_text: `
${_p("pagination.next")}
`,prev_text: `
${_p("pagination.prev")}
`} + !=paginator(options) + div.toPageGroup + input#toPageText(oninput="value=value.replace(/[^0-9]/g,'')" maxlength="3" title=_p('pagination.to') onkeyup="if (this.value === '0') this.value = ''") + a#toPageButton(onclick="sco.toPage()") + i.solitude.st-show-right-line \ No newline at end of file diff --git a/themes/solitude/layout/includes/nav.pug b/themes/solitude/layout/includes/nav.pug new file mode 100644 index 0000000..8252d46 --- /dev/null +++ b/themes/solitude/layout/includes/nav.pug @@ -0,0 +1,22 @@ +nav#nav.show + #nav-group + #blog_name + if theme.nav.group + .back-home-button(tabindex="-1") + i.back-home-button-icon.solitude.st-more-fill + include ./widgets/nav/group + a#site-name(href=url_for("/"), title=_p('nav.site_name_title')) + if theme.site.name.class === 'i_class' + i.solitude(class=theme.site.name.custom, style="font-size: 16px;") + else if theme.site.name.class === 'img' + img(src=theme.site.name.custom, alt=config.title) + else if theme.site.name.class === 'text' + span.title= theme.site.name.custom + #page-name-mask + #page-name + a#page-name-text(onclick="sco.toTop()")= title || config.title + #menus + include ./widgets/nav/menu.pug + #nav-left + #nav-right + include ./widgets/nav/right.pug \ No newline at end of file diff --git a/themes/solitude/layout/includes/page/about.pug b/themes/solitude/layout/includes/page/about.pug new file mode 100644 index 0000000..1747ca4 --- /dev/null +++ b/themes/solitude/layout/includes/page/about.pug @@ -0,0 +1,11 @@ +if site.data.about + #about-page + include ../widgets/page/about/authorinfo + include ../widgets/page/about/contentinfo + include ../widgets/page/about/skillsinfo + include ../widgets/page/about/personalities + include ../widgets/page/about/motto + include ../widgets/page/about/hobbies + include ../widgets/page/about/other + include ../widgets/page/about/tenyear + include ../widgets/page/about/award \ No newline at end of file diff --git a/themes/solitude/layout/includes/page/categories.pug b/themes/solitude/layout/includes/page/categories.pug new file mode 100644 index 0000000..dc3751c --- /dev/null +++ b/themes/solitude/layout/includes/page/categories.pug @@ -0,0 +1,8 @@ +h1.page-title= _p('page.category') +.category-lists + .tag-cloud-list.is-center + each item in site.categories.find({ parent: { $exists: false } }).data + a(href=url_for(item.path)) + span.tags-punctuation + = item.name + span.tagsPageCount= item.length \ No newline at end of file diff --git a/themes/solitude/layout/includes/page/default.pug b/themes/solitude/layout/includes/page/default.pug new file mode 100644 index 0000000..747b707 --- /dev/null +++ b/themes/solitude/layout/includes/page/default.pug @@ -0,0 +1,2 @@ +#article-container + != page.content \ No newline at end of file diff --git a/themes/solitude/layout/includes/page/equipment.pug b/themes/solitude/layout/includes/page/equipment.pug new file mode 100644 index 0000000..44696cc --- /dev/null +++ b/themes/solitude/layout/includes/page/equipment.pug @@ -0,0 +1,2 @@ +include ../widgets/page/banner +include ../widgets/page/equipment/content \ No newline at end of file diff --git a/themes/solitude/layout/includes/page/links.pug b/themes/solitude/layout/includes/page/links.pug new file mode 100644 index 0000000..10c73c5 --- /dev/null +++ b/themes/solitude/layout/includes/page/links.pug @@ -0,0 +1,14 @@ +.flink#banners + include ../widgets/page/links/banner +.flink#article-container + each data in site.data.links.links + h2= data.class_name + " (" + data.link_list.length + ")" + .flink-desc= data.descr + case data.type + when 'card' + include ../widgets/page/links/linksCard + when 'item' + include ../widgets/page/links/linksItem + when 'discn' + include ../widgets/page/links/linksDiscn + != page.content \ No newline at end of file diff --git a/themes/solitude/layout/includes/page/message.pug b/themes/solitude/layout/includes/page/message.pug new file mode 100644 index 0000000..f7fbe2a --- /dev/null +++ b/themes/solitude/layout/includes/page/message.pug @@ -0,0 +1,5 @@ +- const { line,speed,hover,loop,enable } = theme.envelope + +include ../widgets/page/message/content +if enable + include ../widgets/page/message/js \ No newline at end of file diff --git a/themes/solitude/layout/includes/page/music.pug b/themes/solitude/layout/includes/page/music.pug new file mode 100644 index 0000000..d21a5e0 --- /dev/null +++ b/themes/solitude/layout/includes/page/music.pug @@ -0,0 +1,11 @@ +if theme.music.enable + #Music-bg + #Music-page + 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="random") + .Music-loading + div APlayer加载中... + script(pjax). + (async function () { + if (typeof initializeMusicPlayer === "undefined") await utils.getScript('!{url_for(theme.cdn.music_js)}').then(() => initializeMusicPlayer()) + else initializeMusicPlayer() + })() \ No newline at end of file diff --git a/themes/solitude/layout/includes/page/recentcomment.pug b/themes/solitude/layout/includes/page/recentcomment.pug new file mode 100644 index 0000000..e29b7c6 --- /dev/null +++ b/themes/solitude/layout/includes/page/recentcomment.pug @@ -0,0 +1,16 @@ +- const { enable, limit, cache } = theme.recent_comments +- const {use, avatar} = theme.comment + +include ../widgets/page/banner + +if enable && use + #comments-page + case use[0] + when 'Twikoo' + include ../widgets/page/recentcomment/twikoo + when 'Valine' + include ../widgets/page/recentcomment/valine + when 'Waline' + include ../widgets/page/recentcomment/waline + when 'Artalk' + include ../widgets/page/recentcomment/artalk \ No newline at end of file diff --git a/themes/solitude/layout/includes/page/says.pug b/themes/solitude/layout/includes/page/says.pug new file mode 100644 index 0000000..20ce8b3 --- /dev/null +++ b/themes/solitude/layout/includes/page/says.pug @@ -0,0 +1,58 @@ +include ../widgets/page/banner +if theme.says.enable + #bber + section.timeline.page-1 + ul.list.waterfall + each item in site.data.essay.essay_list.slice(0, theme.says.strip) + li.item + if theme.says.style === 2 + .meta + img.avatar(src=theme.aside.card.author.img) + .info + span.bber_nick= config.author + time.datetime.bber_date(datetime=moment(item.date).format()) + if item.content + a.bber-reply.goComment(onclick=`sco.toTalk('${item.content}')`) + i.solitude.st-chat-fill + + #bber-content + p.datacont= item.content + if item.image + .bber-content-img + each img in item.image + img(src=img alt="image") + + if item.aplayer + .bber-music + meting-js(server=item.aplayer.server type="song" id=item.aplayer.id mutex="true" preload="none" theme="var(--efu-main)" data-lrctype="0") + + if item.video + .bber-video + if item.video.player + video(src=item.video.player controls="controls" style="object-fit: cover;") + if item.video.bilibili + iframe(src='//player.bilibili.com/player.html?autoplay=0&bvid=' + item.video.bilibili scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true") + + if theme.says.style === 1 + hr + .bber-bottom + .bber-info + .bber-info-time + i.solitude.st-calendar-todo-fill + time.datetime(datetime=moment(item.date).format()) + if item.location + .bber-info-location + i.solitude.st-map-pin-fill + | #{item.location} + if item.link + a.bber-content-link(href=url_for(item.link) target="_blank") + i.solitude.st-link-m-line + | 链接 + if item.content + a.bber-reply(onclick=`sco.toTalk('${item.content}')`) + i.solitude.st-chat-fill + #bber-tips + if theme.says.strip === -1 + | - 已展开所有短文 - + else + | - 只展示最近 #{theme.says.strip} 条短文 - \ No newline at end of file diff --git a/themes/solitude/layout/includes/page/tags.pug b/themes/solitude/layout/includes/page/tags.pug new file mode 100644 index 0000000..dd74882 --- /dev/null +++ b/themes/solitude/layout/includes/page/tags.pug @@ -0,0 +1,8 @@ +h1.page-title= __('page.tag') +.category-lists + .tag-cloud-list.is-center + each tag in site.tags.find({ parent: { $exists: false } }).data + a(href=url_for(tag.path)) + span.tags-punctuation + = tag.name + span.tagsPageCount= tag.length \ No newline at end of file diff --git a/themes/solitude/layout/includes/page/tlink.pug b/themes/solitude/layout/includes/page/tlink.pug new file mode 100644 index 0000000..4ce0040 --- /dev/null +++ b/themes/solitude/layout/includes/page/tlink.pug @@ -0,0 +1,13 @@ +include ../widgets/page/banner +.flink#article-container + each data in site.data.tlink.links + h2= data.class_name + " (" + data.link_list.length + ")" + .flink-desc= data.descr + case data.type + when 'card' + include ../widgets/page/links/linksCard + when 'item' + include ../widgets/page/links/linksItem + when 'discn' + include ../widgets/page/links/linksDiscn + != page.content \ No newline at end of file diff --git a/themes/solitude/layout/includes/rightmenu.pug b/themes/solitude/layout/includes/rightmenu.pug new file mode 100644 index 0000000..d4b1d74 --- /dev/null +++ b/themes/solitude/layout/includes/rightmenu.pug @@ -0,0 +1,80 @@ +- let custom_list = theme.right_menu.custom_list || [] + +div#rightMenu + div.rightMenu-group.rightMenu-small + div.rightMenu-item#menu-backward + i.solitude.st-arrow-left-line + div.rightMenu-item#menu-forward + i.solitude.st-arrow-right-line + div.rightMenu-item#menu-refresh + i.solitude.st-restart-line + div.rightMenu-item#menu-top + i.solitude.st-arrow-up-line + div.rightMenu-group.rightMenu-line.rightMenuPlugin + div.rightMenu-item#menu-copytext + i.solitude.st-copy-fill + span= _p('right_menu.copy') + div.rightMenu-item#menu-pastetext + i.solitude.st-clipboard-fill + span= _p('right_menu.paste') + if theme.comment.use + div.rightMenu-item#menu-commenttext + i.solitude.st-chat-new-fill + span= _p('right_menu.comment') + div.rightMenu-item#menu-newwindow + i.solitude.st-window-fill + span= _p('right_menu.new') + div.rightMenu-item#menu-copylink + i.solitude.st-link-line + span= _p('right_menu.link') + div.rightMenu-item#menu-copyimg + i.solitude.st-copy-fill + span= _p('right_menu.img') + div.rightMenu-item#menu-downloadimg + i.solitude.st-download-cloud-fill + span= _p('right_menu.downloadImg') + if theme.search.enable + div.rightMenu-item#menu-search + i.solitude.st-search-line + span= _p('right_menu.search') + if theme.capsule.enable + div.rightMenu-item#menu-music-toggle + i.solitude.st-play-fill + span= _p('right_menu.music.start') + div.rightMenu-item#menu-music-back + i.solitude.st-skip-back-fill + span= _p('right_menu.music.back') + div.rightMenu-item#menu-music-forward + i.solitude.st-skip-forward-fill + span= _p('right_menu.music.forward') + div.rightMenu-item#menu-music-copyMusicName + i.solitude.st-copy-fill + span= _p('right_menu.music.copyMusicName') + div.rightMenu-group.rightMenu-line.rightMenuOther + each item,index in custom_list + div.rightMenu-item(id=item.id class=item.class onclick=item.click+'||rm.hideRightMenu()') + i.solitude(class=item.icon) + span= item.name + div.rightMenu-group.rightMenu-line.rightMenuOther + if theme.right_menu.commentBarrage && theme.comment.use && theme.comment.commentBarrage + div.rightMenu-item#menu-commentBarrage(onclick="sco.switchCommentBarrage()") + i.solitude.st-chat-fill + span.menu-commentBarrage-text= _p('right_menu.barrage.close') + div.rightMenu-item#menu-darkmode(onclick="sco.switchDarkMode()") + i.solitude.st-moon-clear-fill + case theme.display_mode.type + when 'auto' + when 'light' + span.menu-darkmode-text= _p('right_menu.light') + when 'dark' + span.menu-darkmode-text= _p('right_menu.dark') + if theme.right_menu.translate.enable + div.rightMenu-item#menu-translate + case theme.right_menu.translate.defaultEncoding + when 2 + i.solitude.st-panben-line + span= _p('right_menu.chs_to_cht') + when 1 + i.solitude.st-jianben-line + span= _p('right_menu.cht_to_chs') +div#rightmenu-mask \ No newline at end of file diff --git a/themes/solitude/layout/includes/sidebar.pug b/themes/solitude/layout/includes/sidebar.pug new file mode 100644 index 0000000..0771105 --- /dev/null +++ b/themes/solitude/layout/includes/sidebar.pug @@ -0,0 +1,32 @@ +div#sidebar(style="zoom: 1;") + div#menu-mask(style="display: none;") + div#sidebar-menus + .site-data + .data-item.is-center + .data-item-link + a(href=url_for('/archives/')) + .headline=_p('page.archives') + .length-num=site.posts.find({ parent: { $exists: false } }).length + .data-item.is-center + .data-item-link + a(href=url_for('/categories/')) + .headline=_p('page.category') + .length-num=site.categories.find({parent: {$exists: false}}).length + .data-item.is-center + .data-item-link + a(href=url_for('/tags/')) + .headline=_p('page.tag') + .length-num=site.tags.find({parent: {$exists: false}}).length + span.sidebar-menu-item-title= __('sidebar.function') + div.sidebar-menu-item + span.darkmode_switchbutton.menu-child(onclick="sco.switchDarkMode()") + i.solitude.st-moon-clear-fill + span= __('sidebar.darkmode') + include ./widgets/nav/group + include ./widgets/nav/menu.pug + span.sidebar-menu-item-title= __('page.tag') + div.card-widget.card-tags.card-archives.card-webinfo.card-allinfo + div.card-tag-cloud + each tag in site.tags.find({ parent: { $exists: false } }).data + a(href=url_for(tag.path))= tag.name + sup= tag.length \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/aside/aside.pug b/themes/solitude/layout/includes/widgets/aside/aside.pug new file mode 100644 index 0000000..3b90103 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/aside/aside.pug @@ -0,0 +1,18 @@ +.aside-content#aside-content + - var noSticky, Sticky + if(is_home()) + - noSticky = theme.aside.home.noSticky.split(',') + - Sticky = theme.aside.home.Sticky.split(',') + else if(is_post()) + - noSticky = theme.aside.post.noSticky.split(',') + - Sticky = theme.aside.post.Sticky.split(',') + else if(is_page() || is_archive() || is_tag() || is_category()) + - noSticky = theme.aside.page.noSticky.split(',') + - Sticky = theme.aside.page.Sticky.split(',') + each item in noSticky + include ./asideSwitch.pug + .sticky_layout + if page.toc + include ./asideToc.pug + each item in Sticky + include ./asideSwitch.pug \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/aside/asideAdsense.pug b/themes/solitude/layout/includes/widgets/aside/asideAdsense.pug new file mode 100644 index 0000000..5812895 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/aside/asideAdsense.pug @@ -0,0 +1,5 @@ +if theme.google_adsense.enable && !theme.google_adsense.auto_ads && theme.google_adsense.aside_card + .card-widget.card-adsense + ins.adsbygoogle(style="display:block; text-align:center; min-height:120px; min-width: 100%", data-ad-layout="in-article", data-ad-format="fluid", hide-unfilled="true", data-ad-client=theme.google_adsense.client, data-ad-slot=theme.google_adsense.slot) + script. + (adsbygoogle = window.adsbygoogle || []).push({}); \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/aside/asideAllInfo.pug b/themes/solitude/layout/includes/widgets/aside/asideAllInfo.pug new file mode 100644 index 0000000..3772a5a --- /dev/null +++ b/themes/solitude/layout/includes/widgets/aside/asideAllInfo.pug @@ -0,0 +1,8 @@ +.card-widget.card-tags.card-archives.card-webinfo.card-allinfo + if theme.aside.tags.enable + include ./asideTag + hr + if theme.aside.archive.enable + include ./asideArchive + hr + include ./asideWebInfo diff --git a/themes/solitude/layout/includes/widgets/aside/asideArchive.pug b/themes/solitude/layout/includes/widgets/aside/asideArchive.pug new file mode 100644 index 0000000..2dc18ca --- /dev/null +++ b/themes/solitude/layout/includes/widgets/aside/asideArchive.pug @@ -0,0 +1,11 @@ +- var archive = theme.aside.archive + +ul.card-archive-list + - var type = archive.type ? archive.type : 'year' + each value, key in getArchiveLength(type) + li.card-archive-list-item + a.card-archive-list-link(href=`/archives/${key}/`) + span.card-archive-list-date= key + .card-archive-list-count-group + span.card-archive-list-count= value + span.card-archive-list-count-unit= __('console.archive_unit') \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/aside/asideCustom.pug b/themes/solitude/layout/includes/widgets/aside/asideCustom.pug new file mode 100644 index 0000000..3d8ab9e --- /dev/null +++ b/themes/solitude/layout/includes/widgets/aside/asideCustom.pug @@ -0,0 +1,7 @@ +.card-widget(class=custom.class, id=custom.id) + if !custom.no_head + .item-headline + i(class=custom.icon) + span=custom.title + div(class=custom.content_class ||'item-content', id=custom.content_id, style=custom.content_css) + != custom.content_html \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/aside/asideFlipCard.pug b/themes/solitude/layout/includes/widgets/aside/asideFlipCard.pug new file mode 100644 index 0000000..c9b9249 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/aside/asideFlipCard.pug @@ -0,0 +1,5 @@ +.card-widget.card-platform + #flip-wrapper + #flip-content + .face + .back.face diff --git a/themes/solitude/layout/includes/widgets/aside/asideInfoCard.pug b/themes/solitude/layout/includes/widgets/aside/asideInfoCard.pug new file mode 100644 index 0000000..949a5f7 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/aside/asideInfoCard.pug @@ -0,0 +1,86 @@ +- const {style ,url} = theme.aside.card +.card-widget.card-info + .card-content + case style + when 0 + .card-info-avatar.is-center + .author-info__top-group + .author-info__sayhi#author-info__sayhi(onclick="sco.changeSayHelloText()")= _p('sayhello.morning') + .avatar-img-group + img.avatar-img(alt=_p('aside.avatar'), src=theme.aside.card.author.img) + if theme.aside.card.author.sticker + .avatar-sticker + img.avatar-sticker-img(src=theme.aside.card.author.sticker, alt=_p('aside.sticker')) + .author-info__description_group + .author-info__description!= theme.aside.card.content + .author-info__description2!= theme.aside.card.content2 + .author-info__bottom-group + a.author-info__bottom-group-left(href=url_for(theme.aside.card.url)) + .author-info__name= config.author + .author-info__desc!= config.subtitle + .card-info-social-icons.is-center + each value, label in theme.aside.card.information || {} + - var array = value.split('||') + a.social-icon(href=url_for(trim(array[0])), title=label) + i.solitude(class=array[1]) + when 1 + .card-info-bg-top + .is-center + .author-info__top-group + .author-info__sayhi#author-info__sayhi(onclick="sco.changeSayHelloText()")= _p('sayhello.morning') + a.card-info-avatar(href=url_for(theme.aside.card.url) title=_p('aside.avatar')) + .avatar-img + img(src=theme.aside.card.author.img alt=_p('aside.avatar')) + if theme.aside.card.author.sticker + .avatar-sticker + img.avatar-sticker-img(src=theme.aside.card.author.sticker, alt=_p('aside.sticker')) + .card-info__desc_group + .author-info__name= config.author + .author-info__desc!= config.subtitle + + .card-info__data.is-center + a(href=url_for('/archives/') title=_p('aside.card.posts') + site.posts.length) + .length-num= site.posts.length + .headline= _p('page.archives') + a(href=url_for('/tags/') title=_p('aside.card.tags') + site.tags.length) + .length-num= site.tags.length + .headline= _p('page.tag') + a(href=url_for('/categories/') title=_p('aside.card.categories') + site.categories.length) + .length-num= site.categories.length + .headline= _p('page.category') + + .card-info-social-icons.is-center + each value, label in theme.aside.card.information || {} + - var array = value.split('||') + a.social-icon(href=url_for(trim(array[0])), title=label) + i.solitude(class=array[1]) + when 2 + .card-info-bg-top + .author-info-social + .social-icons + each value, label in theme.aside.card.information || {} + - var array = value.split('||') + a.social-icon(href=url_for(trim(array[0])), title=label) + i.solitude(class=array[1]) + span.more-info(onclick="document.querySelector('.social-icons').classList.toggle('show')") + i.solitude.st-more-2-fill + a.card-info-avatar(href=url_for(theme.aside.card.url) title=_p('aside.avatar')) + .avatar-img + img(src=theme.aside.card.author.img alt=_p('aside.avatar')) + if theme.aside.card.author.sticker + .avatar-sticker + img.avatar-sticker-img(src=theme.aside.card.author.sticker, alt=_p('aside.sticker')) + .author-info__name= config.author + .card-info__data.is-center + a(href=url_for('/archives/') title=_p('aside.card.posts') + site.posts.length) + .length-num= site.posts.length + .headline= _p('page.archives') + a(href=url_for('/tags/') title=_p('aside.card.tags') + site.tags.length) + .length-num= site.tags.length + .headline= _p('page.tag') + a(href=url_for('/categories/') title=_p('aside.card.categories') + site.categories.length) + .length-num= site.categories.length + .headline= _p('page.category') + .card-info__desc_group + .author-info__description!= theme.aside.card.content + .author-info__description2!= theme.aside.card.content2 \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/aside/asideNewestPost.pug b/themes/solitude/layout/includes/widgets/aside/asideNewestPost.pug new file mode 100644 index 0000000..64ac764 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/aside/asideNewestPost.pug @@ -0,0 +1,16 @@ +.card-widget.card-recent-post + .item-headline + i.solitude.st-map-line + span= _p('aside.newpost') + .aside-list + - let index = 1 + each post in site.posts.data.sort((a, b) => b.date < a.date ? -1 : 1) + if index <= 5 + .aside-list-item + a.thumbnail(href=url_for(post.path) title=post.title) + img(alt=post.title src=post.cover) + .content + a.title(href=url_for(post.path) title=post.title)= post.title + if post.categories.data[0] + a.article-recent_post_categories(href=url_for(post.path))= post.categories.data[0].name + - index++ \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/aside/asideNewstComments.pug b/themes/solitude/layout/includes/widgets/aside/asideNewstComments.pug new file mode 100644 index 0000000..d542720 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/aside/asideNewstComments.pug @@ -0,0 +1,9 @@ +.card-widget.card-recent-comment + .item-headline + i.solitude.st-chat-fill + span= _p('aside.newcomment') + if theme.recent_comments.enable + a.recent-comment-more(href=url_for(theme.recent_comments.page) title=_p('console.recent_comment_more')) + i.solitude.st-right-btn-fill + .aside-list + include ../third-party/news-comment/newest-comment.pug \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/aside/asideSwitch.pug b/themes/solitude/layout/includes/widgets/aside/asideSwitch.pug new file mode 100644 index 0000000..bbccc27 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/aside/asideSwitch.pug @@ -0,0 +1,19 @@ +case item + when 'about' + include ./asideInfoCard.pug + when 'flip' + include ./asideFlipCard.pug + when 'newestPost' + include ./asideNewestPost.pug + when 'allInfo' + include ./asideAllInfo.pug + when 'ads' + include ./asideAdsense.pug + when 'newest_comment' + include ./asideNewstComments.pug + default + - const custom = site.data?.aside?.find((i) => i.name === item) + if custom + include ./asideCustom.pug + else + include ../../page/default.pug \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/aside/asideTag.pug b/themes/solitude/layout/includes/widgets/aside/asideTag.pug new file mode 100644 index 0000000..8fa01b5 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/aside/asideTag.pug @@ -0,0 +1,16 @@ +- const highlight = theme.aside.tags.highlight_list || [] +.card-tag-cloud + each tag in site.tags.find({ parent: { $exists: false } }).data + if highlight.includes(tag.name) + a.highlight(href=url_for(tag.path))= tag.name + sup= tag.length + else + a(href=url_for(tag.path))= tag.name + sup= tag.length +if site.tags.length >= theme.aside.tags.limit + span#more-tags-btn(onclick="sco.openAllTags()")= __('aside.tagmore') +else + style. + .card-tag-cloud::after { + display: none !important; + } \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/aside/asideToc.pug b/themes/solitude/layout/includes/widgets/aside/asideToc.pug new file mode 100644 index 0000000..ca76928 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/aside/asideToc.pug @@ -0,0 +1,5 @@ +.card-widget#card-toc + .item-headline + i.solitude.st-menu-line + span= __('aside.toc') + .toc-content#toc-content!= toc(page.content, { list_number: false }) \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/aside/asideWebInfo.pug b/themes/solitude/layout/includes/widgets/aside/asideWebInfo.pug new file mode 100644 index 0000000..8d21830 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/aside/asideWebInfo.pug @@ -0,0 +1,48 @@ +.webinfo + if theme.aside.siteinfo.postcount + .webinfo-item + .webinfo-item-title + i.item-icon.solitude.st-folder-fill + .item-name= __('aside.postcount') + .item-count= site.posts.length + if theme.busuanzi + if theme.aside.siteinfo.pv + .webinfo-item + .webinfo-item-title + i.item-icon.solitude.st-visitor-line + .item-name= __('aside.pv') + if theme.busuanzi_use === 0 + span#busuanzi_value_site_pv + i.solitude.st-loading-line + else + span#busuanzi_site_pv + i.solitude.st-loading-line + if theme.aside.siteinfo.uv + .webinfo-item + .webinfo-item-title + i.item-icon.solitude.st-team-fill + .item-name= __('aside.uv') + if theme.busuanzi_use === 0 + span#busuanzi_value_site_uv + i.solitude.st-loading-line + else + span#busuanzi_site_uv + i.solitude.st-loading-line + if theme.aside.siteinfo.runtimeenable + .webinfo-item + .webinfo-item-title + i.item-icon.solitude.st-calendar-todo-fill + .item-name= __('aside.runtime') + .item-count#runtimeshow + if theme.aside.siteinfo.updatetime + .webinfo-item + .webinfo-item-title + i.item-icon.solitude.st-loop-left-fill + .item-name= __('aside.updatetime') + time.item-count(datetime=new Date()) + if theme.wordcount && theme.aside.siteinfo.wordcount + .webinfo-item + .webinfo-item-title + i.item-icon.solitude.st-word-fill + .item-name= __('aside.wordcount') + .item-count= totalcount(site) \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/home/banner.pug b/themes/solitude/layout/includes/widgets/home/banner.pug new file mode 100644 index 0000000..41edcfb --- /dev/null +++ b/themes/solitude/layout/includes/widgets/home/banner.pug @@ -0,0 +1,23 @@ +div.banners-title + div.banners-title-big!= theme.hometop.banner.title + div.banners-title-small= theme.hometop.banner.url +- var group = theme.hometop.group +if group + div.banners-links + each value,label in group + - var array = value.split('||') + a.banners-link-btn(href=url_for(trim(array[0])) style=`background-image: ${array[2]} `) + if array[1] + i.solitude(class=array[1]) + .banners-link-title= label + +div.tags-group-all + .tags-group-wrapper + each i in [1,2] + - var keys = Object.keys(theme.hometop.banner.icon) + - var pairs = keys.map((val, i) => i % 2 ? [keys[i - 1], val] : []).filter(x => x.length) + each pair in pairs + .tags-group-icon-pair + each key in pair + .tags-group-icon(style=`background: ${theme.hometop.banner.icon[key].color}`) + img.nolazyload(src=theme.hometop.banner.icon[key].img, title=key) \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/home/bbTimeList.pug b/themes/solitude/layout/includes/widgets/home/bbTimeList.pug new file mode 100644 index 0000000..83ae82c --- /dev/null +++ b/themes/solitude/layout/includes/widgets/home/bbTimeList.pug @@ -0,0 +1,18 @@ +.bbTimeList.container#bbTimeList(class=is_home_first_page() ? '' : 'more-page') + i.bber-logo.solitude.st-bblogo(onclick=`pjax.loadUrl('/essay/')`) + .swiper-container.swiper-no-swiping.swiper-container-initialized.swiper-container-vertical.swiper-container-pointer-events#bbtalk(tabindex="-1" onclick=`pjax.loadUrl('/essay/')`) + .swiper-wrapper#bber-talk + each item, i in site.data.essay.essay_list.slice(0, 10) + .li-style.swiper-slide + | #{item.content} + if item.image + i.solitude.st-image-fill + else if item.aplayer + i.solitude.st-disc-fill + else if item.video + i.solitude.st-video-fill + else if item.bilibili + i.solitude.st-bilibili-line + else if item.link + i.solitude.st-links + i.bber-gotobb.solitude.st-right-btn-fill(title=_p('home.bbtime.text') onclick=`pjax.loadUrl('/essay/')`) \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/home/carousel.pug b/themes/solitude/layout/includes/widgets/home/carousel.pug new file mode 100644 index 0000000..c84cd59 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/home/carousel.pug @@ -0,0 +1,72 @@ +- let recommends = site.posts.data.filter(item => item.recommend === true).slice(0,6) || false + +if recommends + .recent-post-item#swiperBox + div.blog-slider.swiper-container-fade.swiper-container-horizontal#swiper_container + .blog-slider__wrp.swiper-wrapper + each item,index in recommends + .blog-slider__item.swiper-slide(onclick="pjax.loadUrl('"+item.path+"')") + .blog-slider__img + img(src=item.cover, alt=item.title) + .blog-slider__content + span.blog-slider__title=item.title + case theme.index_post_list.content + when false + break + when 1 + span.blog-slider__desc= item.description + when 2 + if item.description + span.blog-slider__desc= item.description + else + - const content = strip_html(item.content) + - let expert = content.substring(0, theme.index_post_list.length).replace(/\d+/g, '').replace(//g, '').replace(/&#x/g, '') + - content.length > theme.index_post_list.length ? expert += ' ...' : '' + .span.blog-slider__desc= expert + default + - const content = strip_html(item.content) + - let expert = content.substring(0, theme.index_post_list.length).replace(/\d+/g, '').replace(//g, '').replace(/&#x/g, '') + - content.length > theme.index_post_list.length ? expert += ' ...' : '' + .span.blog-slider__desc= expert + div.article-meta-wrap + span.article-meta.tags + each tag in item.tags.data + a.article-meta__tags(href=url_for(tag.path), onclick="event.stopPropagation();") + span.tags-punctuation=tag.name + span.post-meta-date + time(datetime=moment(item.date)) + .blog-slider__pagination.swiper-pagination-clickable.swiper-pagination-bullets + + script. + function carousel_swiper() { + let e = new Swiper(".blog-slider", { + direction: "vertical", + passiveListeners: true, + loop: true, + autoplay: { + disableOnInteraction: true, + delay: 5e3 + }, + pagination: { + el: ".blog-slider__pagination", + clickable: true + }, + effect: 'fade', + fadeEffect: { + crossFade: true + }, + passiveListeners: true, + spaceBetween: 30, + watchSlidesProgress: true, + mousewheel: true + }) + , t = document.getElementById("swiper_container"); + null !== t && (t.onmouseenter = () => { + e.autoplay.stop() + } + , + t.onmouseleave = () => { + e.autoplay.start() + } + ) + } \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/home/categoryBar.pug b/themes/solitude/layout/includes/widgets/home/categoryBar.pug new file mode 100644 index 0000000..6458392 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/home/categoryBar.pug @@ -0,0 +1,15 @@ +.category-bar-items#category-bar-items(class=is_home() ? 'home' : '') + .category-bar-item(class=is_home() ? 'select' : '', id="category-bar-home") + a(href=url_for('/'))= __('home.home') + .category-bar-item + a(href=url_for('/archives/'))= __('home.archives') + each item in site.categories.find({ parent: { $exists: false } }).data + .category-bar-item(class=select ? (select === item.name ? 'select' : '') : '', id=item.name) + a(href=url_for(item.path))= item.name +div.category-bar-right + - let categories = site.categories.find({parent: {$exists: false}}) + - let wordcount = categories.map(category => category.name).join('').length + if wordcount > 40 || categories.data.length > 10 + .category-bar-next#category-bar-next(onclick="sco.scrollCategoryBarToRight()") + i.solitude.st-show-right-line + a.category-bar-more(href=url_for('/categories/'))= __('more') \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/home/hometop.pug b/themes/solitude/layout/includes/widgets/home/hometop.pug new file mode 100644 index 0000000..495c868 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/home/hometop.pug @@ -0,0 +1,7 @@ +.recent-top-post-group#recent-top-post-group + .recent-post-top#recent-post-top + #bannerGroup + #banners + include ./banner.pug + .topGroup + include ./topGroup.pug \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/home/postList.pug b/themes/solitude/layout/includes/widgets/home/postList.pug new file mode 100644 index 0000000..b9b48da --- /dev/null +++ b/themes/solitude/layout/includes/widgets/home/postList.pug @@ -0,0 +1,81 @@ +mixin cover + a(href=url_for(post.path), title=post.title) + img.post_bg(src=url_for(post.cover), alt=post.title) + +mixin info + div.recent-post-info-top + div.recent-post-info-top-tips + if post.sticky && is_home() + span.article-meta.sticky-warp + i.solitude.st-thumbtack-solid.sticky.orange + span.sticky.orange= _p('home.sticky') + each category in post.categories.data + span.original= category.name + + if post.prev == null && is_home() + span.original= _p('home.new') + + a.unvisited-post(href=url_for(post.path))= _p('home.read') + + a.article-title(href=url_for(post.path), title=post.title)= post.title + + case theme.index_post_list.content + when false + break + when 1 + .content!= post.description + when 2 + if post.description + .content!= post.description + else + - const content = strip_html(post.content) + - let expert = content.substring(0, theme.index_post_list.length).replace(/\d+/g, '').replace(//g, '').replace(/&#x/g, '') + - content.length > theme.index_post_list.length ? expert += ' ...' : '' + .content!= expert + default + - const content = strip_html(post.content) + - let expert = content.substring(0, theme.index_post_list.length).replace(/\d+/g, '').replace(//g, '').replace(/&#x/g, '') + - content.length > theme.index_post_list.length ? expert += ' ...' : '' + .content!= expert + + div.article-meta-wrap + span.article-meta.tags + each tag in post.tags.data + a.article-meta__tags(href=url_for(tag.path), onclick="event.stopPropagation();") + span.tags-punctuation=tag.name + + span.post-meta-date + time(datetime=moment(post.date)) + +- const { direction, cover } = theme.index_post_list + +if direction === 'row' + - var position = cover === 'both' ? index % 2 === 0 ? 0 : 1 : cover === 'left' ? 0 : 1 + +div.recent-post-item(onclick="pjax.loadUrl('" + url_for(post.path) + "')") + if direction === 'column' + div.post_cover + +cover() + div.recent-post-info + +info() + else + case position + when 0 + div.post_cover + +cover() + div.recent-post-info + +info() + when 1 + div.recent-post-info + +info() + div.post_cover + +cover() + + +if theme.google_adsense && theme.google_adsense.enable && theme.google_adsense.auto_ads === false && theme.google_adsense.post_card + - var ads_height = theme.index_post_list.direction === 'column' ? '401px;' : '280px;' + if (index + 1) % 3 === 0 + div.recent-post-item.google-ads-warp + ins.adsbygoogle(style="display:block; text-align:center; min-width: 100%; height:" + ads_height, data-ad-layout="in-article", data-ad-format="fluid", hide-unfilled="true", data-ad-client=theme.google_adsense.client, data-ad-slot=theme.google_adsense.slot) + script. + (adsbygoogle = window.adsbygoogle || []).push({}); \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/home/topGroup.pug b/themes/solitude/layout/includes/widgets/home/topGroup.pug new file mode 100644 index 0000000..07a9a98 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/home/topGroup.pug @@ -0,0 +1,32 @@ +- var filteredPosts = site.posts.data.filter(item => item.recommend === true).slice(0,6) +.recent-post-group + each post in filteredPosts + .recent-post-item + .post_cover + a(href=url_for(post.path), title=post.title) + span.recent-post-top-text= _p('home.recommend') + img.post_bg(alt=post.title, src=post.cover) + .recent-post-info + a.article-title(href=url_for(post.path), title=post.title)= post.title + +mixin todayCardContent + .todayCard-info + .todayCard-tips= theme.hometop.recommendList.sup + .todayCard-title= theme.hometop.recommendList.title + .todayCard-cover.nolazyload(style=`background: url('${theme.hometop.recommendList.img}') no-repeat center /cover`) + .banner-button-group + a.banner-button(onclick="window.event.cancelBubble=true;sco.hideTodayCard();") + i.solitude.st-add-fill + span.banner-button-text= _p('home.recommendmore') + +case theme.hometop.recommendList.url.startsWith('/') + when true + .todayCard#todayCard(onclick=`pjax.loadUrl('${theme.hometop.recommendList.url}')`) + +todayCardContent() + when false + script. + function GoTodayCard() { + window.open("#{theme.hometop.recommendList.url}", "_blank"); + } + .todayCard#todayCard(onclick="GoTodayCard()") + +todayCardContent() \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/nav/group.pug b/themes/solitude/layout/includes/widgets/nav/group.pug new file mode 100644 index 0000000..17f9468 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/nav/group.pug @@ -0,0 +1,13 @@ +- var menu = theme.nav.group +if menu + .back-menu-list-groups + each value, label in menu + .back-menu-list-group + .back-menu-list-title= label + .back-menu-list + each data, label in value + - var array = data.split('||') + a.back-menu-item(href=url_for(trim(array[0])), title=label) + if array[1] + img.nolazyload.back-menu-item-icon(src=trim(array[1]), alt=label) + span.back-menu-item-text= label \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/nav/menu.pug b/themes/solitude/layout/includes/widgets/nav/menu.pug new file mode 100644 index 0000000..2c8916c --- /dev/null +++ b/themes/solitude/layout/includes/widgets/nav/menu.pug @@ -0,0 +1,20 @@ +- var menu = theme.nav.menu + +if menu + .menus_items + each value, label in menu + .menus_item + if typeof value !== 'object' + a.site-page(href=url_for(value)) + span= label + else + a.site-page(href="javascript:void(0);") + span= label + ul.menus_item_child + each childValue, childLabel in value + li + - var array = childValue.split('||') + a.site-page.child(href=url_for(trim(array[0]))) + if array[1] + i.solitude(class=array[1]) + span= childLabel \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/nav/right.pug b/themes/solitude/layout/includes/widgets/nav/right.pug new file mode 100644 index 0000000..e8a9436 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/nav/right.pug @@ -0,0 +1,24 @@ +- var custom = theme.nav.right.custom || [] +each item in custom + .nav-button(id=item.id) + a.site-page(href=url_for(item.url) || 'javascript:void(0);', onclick=item.onclick, title=item.title || '') + i.solitude(class=item.icon || '') +if theme.nav.right.random + .nav-button#randomPost_button + a.site-page(onclick="toRandomPost()", title=_p('nav.randompost'), href="javascript:void(0);") + i.solitude.st-dice-line +if theme.search.enable + .nav-button#search-button + a.site-page.social-icon.search(href="javascript:void(0);", title=_p('nav.search')) + i.solitude.st-search-line +if theme.nav.right.console + .nav-button#nav-console + a.console_switchbutton(onclick="sco.showConsole()", title=_p('nav.console'), href="javascript:void(0);") + i.solitude.st-dashboard-fill +.nav-button#nav-totop(onclick="sco.toTop()") + a.totopbtn + i.solitude.st-arrow-up-line + span#percent= "0" +#toggle-menu + a.site-page + i.solitude.st-menu-line \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/about/authorinfo.pug b/themes/solitude/layout/includes/widgets/page/about/authorinfo.pug new file mode 100644 index 0000000..03fbd67 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/about/authorinfo.pug @@ -0,0 +1,13 @@ +- const authorinfo = site.data.about.authorinfo + +if authorinfo + .author-info + .author-tag-left + each tag in authorinfo.leftTags + span.author-tag= tag + .author-img + img(src=authorinfo.image) + .author-tag-right + each tag in authorinfo.rightTags + span.author-tag= tag +.author-title= site.data.about.title \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/about/award.pug b/themes/solitude/layout/includes/widgets/page/about/award.pug new file mode 100644 index 0000000..4aa6b30 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/about/award.pug @@ -0,0 +1,39 @@ +- award = site.data.about.award + +- var sum = 0 +if site.data.about.rewardList + .author-content + .author-content-item.single.reward + .author-content-item-tips= _p('award.thanks') + span.author-content-item-title= _p('award.title') + .author-content-item-description + != award.description + .reward-list-all + each reward in site.data.about.rewardList + - sum += reward.money + .reward-list-item + .reward-list-item-name= reward.name + .reward-list-bottom-group + .reward-list-item-money(style=(reward.vip ? "background: var(--efu-vip);color: var(--efu-white)" : "")) + if reward.icon + i.solitude(class=reward.icon) + | ¥ #{reward.money} + time.datatime.reward-list-item-time(datetime=moment(reward.time).format()) + if theme.post.award.enable + .post-reward + .post-reward(onclick="AddRewardMask()") + .reward-button(title=_p('award.tipping')) + i.solitude.st-hand-heart-fill + = _p('award.tipping') + .reward-main + ul.reward-all + span.reward-title= theme.post.award.title + ul.reward-group + - var rewards = theme.post.award.list + each reward in rewards + li.reward-item + a(href=url_for(reward.url)) + img.post-qr-code-img(alt=reward.name, src=reward.qcode, style="border-color:" + reward.color) + .post-qr-code-desc= reward.name + .reward-list-tips + p= award.tips.replace('{sum}', sum.toFixed(2)) \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/about/contentinfo.pug b/themes/solitude/layout/includes/widgets/page/about/contentinfo.pug new file mode 100644 index 0000000..5a3eb01 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/about/contentinfo.pug @@ -0,0 +1,39 @@ +- const contentinfo = site.data.about.contentinfo + +if contentinfo + .author-content + .author-content-item.myInfoAndSayHello + .title1= contentinfo.sup + .title2 + span.inline-word= contentinfo.name + .title1= contentinfo.title + .aboutsiteTips.author-content-item + .author-content-item-tips= contentinfo.tip + h2 + span.inline-word!= contentinfo.slogan + .mask + each item,index in contentinfo.mask + if index === 0 + span.first-tips(data-show='')= item + else if index === contentinfo.mask.length - 1 + span(data-up='')= item + else + span= item + + script. + var pursuitInterval = null; + pursuitInterval = setInterval(function () { + const show = document.querySelector('span[data-show]') + const next = show.nextElementSibling || document.querySelector('.first-tips') + const up = document.querySelector('span[data-up]') + if (up) { + up.removeAttribute('data-up') + } + show.removeAttribute('data-show') + show.setAttribute('data-up', '') + next.setAttribute('data-show', '') + }, 2000) + + document.addEventListener('pjax:send', function () { + clearInterval(pursuitInterval); + }); \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/about/hobbies.pug b/themes/solitude/layout/includes/widgets/page/about/hobbies.pug new file mode 100644 index 0000000..4066976 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/about/hobbies.pug @@ -0,0 +1,37 @@ +- var game1 = site.data.about.game1 +- var game2 = site.data.about.game2 + +if game1 || game2 + .author-content + if game1 + .author-content-item.game-apex(style=`background: url(${game1.img}) no-repeat top; background-size: cover;`) + .card-content + .author-content-item-tips= game1.title + span.author-content-item-title= game1.subtitle + .content-bottom + .tips= game1.tips_left + .tips= game1.tips_right + if game2 + .author-content-item.game-jl(style=`background: url(${game2.img}) no-repeat top; background-size: cover;`) + .card-content + .author-content-item-tips= game2.title + span.author-content-item-title= game2.subtitle + .content-bottom + .tips= game2.tips_left + .tips= game2.tips_right + +if site.data.about.likes + - const likes = site.data.about.likes + .author-content + each like in likes + .author-content-item(class=like.type, style=`background: url(${like.bg}) no-repeat center;`) + .card-content + .author-content-item-tips= like.tips + span.author-content-item-title= like.title + .content-bottom + .tips= like.subtips + if like.button + .banner-button-group + a.banner-button(href=url_for(like.button_link)) + i.solitude.st-right-btn-fill + span.banner-button-text= like.button_text \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/about/motto.pug b/themes/solitude/layout/includes/widgets/page/about/motto.pug new file mode 100644 index 0000000..829cab5 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/about/motto.pug @@ -0,0 +1,22 @@ +- const motto = site.data.about.motto +- const expertise = site.data.about.expertise + +if motto || expertise + .author-content + if motto + .author-content-item.maxim + .author-content-item-tips= motto.title + span.maxim-title + span= motto.prefix + span= motto.content + if expertise + .author-content-item.buff + .card-content + .author-content-item-tips= expertise.title + span.buff-title + span + | #{expertise.prefix} + span.inline-word= expertise.specialist + span + | #{expertise.content} + span.inline-word= expertise.level \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/about/other.pug b/themes/solitude/layout/includes/widgets/page/about/other.pug new file mode 100644 index 0000000..6fd58ba --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/about/other.pug @@ -0,0 +1,89 @@ +- var tj = site.data.about.tj +- var oneself = site.data.about.oneself + +if tj || oneself + .author-content + if tj + .about-statistic.author-content-item(style=`background: url(${tj.img});`) + .card-content + .author-content-item-tips=_p('about.other.tj.tip') + span.author-content-item-title=_p('about.other.tj.title') + #statistic + .post-tips + = _p('about.other.tj.post_tip') + case tj.provider + when '51la' + a(href="https://v6.51.la/") 51la网站统计 + when 'baidu' + a(href="https://tongji.baidu.com/") 百度统计 + if tj.button + .banner-button-group + a.banner-button(href=url_for(tj.button_link)) + i.solitude.st-right-btn-fill + span.banner-button-text= tj.button_text + + case tj.provider + when '51la' + script. + fetch("#{tj.url}") + .then(res => res.text()) + .then(data => { + const title = ["最近活跃", "今日人数", "今日访问", "昨日人数", "昨日访问", "本月访问", "总访问量"]; + let num = data.match(/(<\/span>).*?(\/span><\/p>)/g); + num = num.map(el => { + let val = el.replace(/(<\/span>)/g, ""); + return val.replace(/(<\/span><\/p>)/g, ""); + }); + const s = document.getElementById("statistic"); + let html = ''; + for (let i = 0; i < num.length; i++) { + if (i === 0 || i === num.length - 1) continue; + html += `
${title[i]}${num[i]}
`; + } + s.innerHTML = html; + }); + when 'baidu' + script. + fetch("#{tj.url}") + .then(res => res.json()) + .then(data => { + const title = {"today_uv": "今日人数", "today_pv": "今日访问", "yesterday_uv": "昨日人数", "yesterday_pv": "昨日访问", "last_month_pv": "最近月访问", "last_year_pv": "最近年访问"}; + + let s = document.getElementById("statistic"); + + for (let key in data) { + if (data.hasOwnProperty(key) && title[key]) { + s.innerHTML += `
${title[key]}${data[key]}
`; + } + } + }); + + + if oneself + style. + :root { + --site-about-oneself-map--light: url(#{oneself.map.light}); + --site-about-oneself-map--dark: url(#{oneself.map.dark}); + } + .author-content-item-group.column.mapAndInfo + .author-content-item.map.single + span.map-title=_p('about.other.oneself.map_title') + oneself.location + .author-content-item.selfInfo.single + div + span.selfInfo-title=_p('about.other.oneself.info_title1') + span.selfInfo-content(style="color: #43a6c6;")= oneself.birthYear + div + span.selfInfo-title= oneself.university + span.selfInfo-content(style="color: #c69043;")= oneself.major + div + span.selfInfo-title=_p('about.other.oneself.info_title2') + span.selfInfo-content(style="color: #b04fe6;")= oneself.occupation + +- var cause = site.data.about.cause + +if cause + .author-content + .create-site-post.author-content-item.single + .author-content-item-tips= cause.tip + span.author-content-item-title= cause.title + != cause.content \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/about/personalities.pug b/themes/solitude/layout/includes/widgets/page/about/personalities.pug new file mode 100644 index 0000000..db74493 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/about/personalities.pug @@ -0,0 +1,17 @@ +- const personalities = site.data.about.personalities + +if personalities + .author-content + .author-content-item.personalities + .author-content-item-tips= personalities.tips + span.author-content-item-title= personalities.title + .title2(style=`color:${personalities.color}`)= personalities.type + .image + img.nolazyload(src=personalities.image) + .post-tips + = _p('about.personalities.tip1') + ' ' + a(href='https://www.16personalities.com/')= personalities.linkText + ' ' + = _p('about.personalities.tip2') + ' ' + a(href=personalities.typeLink)= personalities.typeName + .author-content-item.myphoto + img.author-content-img(src=personalities.myphoto, alt="my photo") \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/about/skillsinfo.pug b/themes/solitude/layout/includes/widgets/page/about/skillsinfo.pug new file mode 100644 index 0000000..18adac1 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/about/skillsinfo.pug @@ -0,0 +1,42 @@ +- var skills = site.data.about.skills +- var careers = site.data.about.careers + +if skills || careers + .author-content + if skills + .author-content-item.skills + .card-content + .author-content-item-tips= skills.title + span.author-content-item-title= skills.subtitle + .skills-style-group + .tags-group-all + .tags-group-wrapper + each i in [1,2] + - var pair = [] + each tag, index in skills.tags + - pair.push(tag) + if pair.length === 2 || index === skills.tags.length - 1 + .tags-group-icon-pair + each item in pair + .tags-group-icon(style=`background:${item.color}`) + img(src=item.icon, title=item.title) + - pair = [] + .skills-list + each tag in skills.tags + .skill-info + .skill-icon(style=`background:${tag.color}`) + img(src=tag.icon, title=tag.title) + .skill-name + span= tag.title + .etc ... + if careers + .author-content-item.careers + .card-content + .author-content-item-tips= careers.title + span.author-content-item-title= careers.subtitle + .careers-group + each item in careers.items + .careers-item + .circle(style=`background:${item.color}`) + .name= `${item.school}, ${item.major}` + img.author-content-img(src=careers.image, alt=careers.title) \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/about/tenyear.pug b/themes/solitude/layout/includes/widgets/page/about/tenyear.pug new file mode 100644 index 0000000..8ee27d3 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/about/tenyear.pug @@ -0,0 +1,48 @@ +- var tenyear = site.data.about.tenyear +if tenyear + .author-content#tenyear + .create-site-post.author-content-item.single + .author-content-item-tips=tenyear.tips + .author-content-item-title=tenyear.title + p=tenyear.text + .tenyear-timeline + .progress + .past-time + .percentage-label + .time-labels + .start-time#tenyear-start-time= tenyear.start + .end-time#tenyear-end-time= tenyear.end + + script. + function parseDateString(e) { + return e.replace(/年|月/g, '-').replace(/日/g, ''); + } + + function tenYear() { + let progressElement = document.querySelector(".progress"); + let pastTimeElement = document.querySelector(".past-time"); + let percentageLabelElement = document.querySelector(".percentage-label"); + let startTimeElement = document.getElementById("tenyear-start-time"); + let endTimeElement = document.getElementById("tenyear-end-time"); + + let startTime = new Date(parseDateString(startTimeElement.textContent)).getTime(); + let endTime = new Date(parseDateString(endTimeElement.textContent)).getTime(); + + function updateProgress() { + let currentTime = new Date().getTime(); + let progress = ((currentTime - startTime) / (endTime - startTime) * 100); + let progressPercentage = progress <= 100 ? progress + "%" : "100%"; + + pastTimeElement.style.setProperty("--past-time-percentage", progress + "%"); + progressElement.style.setProperty("--progress-percentage", progressPercentage); + if(progress > 5){ + percentageLabelElement.textContent = `${progress.toFixed(0)}%`; + percentageLabelElement.style.left = `calc(${progress}% - 35px)`; + } + } + + percentageLabelElement.style.visibility = "visible"; + updateProgress(); + } + + document.getElementById("tenyear") && tenYear() && window.Pjax.on('complete', tenYear) \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/banner.pug b/themes/solitude/layout/includes/widgets/page/banner.pug new file mode 100644 index 0000000..489930e --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/banner.pug @@ -0,0 +1,15 @@ +.author-content.author-content-item.single.sharePage(style=`background: url(${page.cover}) no-repeat center; background-size: cover;`) + .card-content + .author-content-item-tips= page.desc + span.author-content-item-title= page.title + .content-bottom + if page.leftend + .tips= page.leftend + if page.rightend + .tips= page.rightend + if page.rightbtn + .banner-button-group + - const isInternalLink = page.rightbtnlink.startsWith('/') + a.banner-button(onclick=isInternalLink ? `pjax.loadUrl("${page.rightbtnlink}")`: null, href=isInternalLink ? null : url_for(page.rightbtnlink), target=isInternalLink ? null : "_blank") + i.solitude.st-right-btn-fill + span.banner-button-text= page.rightbtn diff --git a/themes/solitude/layout/includes/widgets/page/equipment/content.pug b/themes/solitude/layout/includes/widgets/page/equipment/content.pug new file mode 100644 index 0000000..5a7d79b --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/equipment/content.pug @@ -0,0 +1,23 @@ +#equipment + if site.data.equipment + each i in site.data.equipment + .equipment-item + h2.equipment-item-title= i.class_name + .equipment-item-description= i.description + .equipment-item-content + each item in i.equipment_list + .equipment-item-content-item + .equipment-item-content-item-cover + img.equipment-item-content-item-image(src=item.image, alt=item.name) + .equipment-item-content-item-info + .equipment-item-content-item-name(onclick='utils.copy("' + item.name + '")')= item.name + .equipment-item-content-item-specification= item.specification + .equipment-item-content-item-description= item.description + if item.link + .equipment-item-content-item-toolbar + if item.link.includes('https://') || item.link.includes('http://') + a.equipment-item-content-item-link(href=item.link, target="_blank") 详情 + else + a.equipment-item-content-item-link(href=item.link, target="_blank") 查看文章 + a.bber-reply(onclick=`sco.toTalk('${item.description}')`) + i.solitude.st-chat-fill(style="font-size: 1rem;") \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/links/banner.pug b/themes/solitude/layout/includes/widgets/page/links/banner.pug new file mode 100644 index 0000000..4b911ff --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/links/banner.pug @@ -0,0 +1,31 @@ +.banners-title + .banners-title-small= page.title + .banners-title-big= page.desc + +.banner-button-group + if theme.footer.randomlink + a.banner-button.secondary(onclick="travelling()") + i.solitude.st-signal-tower-fill + span.banner-button-text=_p('link.banner.random') + if theme.comment.use + a.banner-button(onclick="sco.scrollToComment()") + i.solitude.st-right-btn-fill + span.solitude.banner-button-text=_p('link.banner.toComment') + +.tags-group-all.nowrapMove + .tags-group-wrapper + - const data = site.data.links.links + - for (let i = 0; i < 2; i++) + each x in data + if x.type === "item" + - var pairs = [] + each y, index in x.link_list + if (index % 2 === 0) + - pairs.push([y]) + else + - pairs[pairs.length - 1].push(y) + each pair in pairs + .tags-group-icon-pair + each y in pair + a.tags-group-icon(href=url_for(y.link), title=y.name) + img(src=y.avatar + (site.data.links.banner_suffix || ''), title=y.name) \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/links/linksCard.pug b/themes/solitude/layout/includes/widgets/page/links/linksCard.pug new file mode 100644 index 0000000..31f2142 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/links/linksCard.pug @@ -0,0 +1,15 @@ +.site-card-group + each item in data.link_list + .site-card + if item.tag + span.site-card-tag(class=item.color)= item.tag + i.light + a.img(title=item.name, href=url_for(item.link)) + img.flink-avatar(src=item.topimg + (data.topimg_suffix || ''), alt=item.name) + a.info.cf-friends-link(title=item.name, href=url_for(item.link)) + .site-card-avatar + img.flink-avatar.cf-friends-avatar(src=item.avatar + (data.suffix || ''), alt=item.name) + .img-alt.is-center= item.name + .site-card-text + span.title.cf-friends-name= item.name + span.desc(title=item.descr)= item.descr \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/links/linksDiscn.pug b/themes/solitude/layout/includes/widgets/page/links/linksDiscn.pug new file mode 100644 index 0000000..730d505 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/links/linksDiscn.pug @@ -0,0 +1,8 @@ +.flink-list.cf-friends-lost-contact.mini + each item in data.link_list + .flink-list-item + a.cf-friends-link(href="javascript:void(0);", title=item.name) + img.flink-avatar.cf-friends-avatar(alt=item.name, src=item.avatar + (data.suffix || '')) + .flink-item-info + span.flink-item-name.cf-friends-name= item.name + span.flink-item-desc(title=item.descr)= item.descr \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/links/linksItem.pug b/themes/solitude/layout/includes/widgets/page/links/linksItem.pug new file mode 100644 index 0000000..47165c9 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/links/linksItem.pug @@ -0,0 +1,11 @@ +.flink-list + each item in data.link_list + .flink-list-item + if item.tag + span.site-card-tag(class=item.color)= item.tag + i.light + a.cf-friends-link(href=url_for(item.link), title=item.name) + img.flink-avatar.cf-friends-avatar(alt=item.name, src=item.avatar + (data.suffix || '')) + .flink-item-info + span.flink-item-name.cf-friends-name= item.name + span.flink-item-desc(title=item.descr)= item.descr \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/message/artalk.pug b/themes/solitude/layout/includes/widgets/page/message/artalk.pug new file mode 100644 index 0000000..450949e --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/message/artalk.pug @@ -0,0 +1,45 @@ +- const { server, site, option } = theme.artalk + +script(pjax). + (async () => { + const emojiReg = /]+ atk-emoticon="[^"]+">/g + if (typeof EasyDanmaku === "undefined") await utils.getScript('!{url_for(theme.cdn.envelope_js)}') + const envel = new EasyDanmaku({ + page: '!{theme.envelope.page}', + el: '#barrage', + line: !{line}, + speed: !{speed}, + hover: !{hover}, + loop: !{loop}, + }) + const data = utils.saveToLocal.get('enevlope') + if (data) { + envel.batchSend(data, true) + return + } + + const searchParams = new URLSearchParams({'site_name': "!{site}", 'limit': '100'}) + await fetch(`!{server}/api/v2/stats/latest_comments?${searchParams}`, {method: 'GET'}).then(async res => res.json()) + .then(async data => { + let ls = [] + for (const i of data.data) { + ls.push({ + content: i.nick + ': ' + formatDanmaku(i.content), + avatar: '!{avatar}' + '/avatar/' + i.email_encrypted, + url: i.page_key + '#atk-comment-' + i.id, + }) + } + envel.batchSend(ls, true) + utils.saveToLocal.set('enevlope', ls, .02) + }).catch(error => { + console.error("An error occurred while fetching comments: ", error) + }) + + function formatDanmaku(str) { + str = str.replace(emojiReg, '[!{__("console.newest_comment.emoji")}]') + str = str.replace(/!\[.*?\]\((.*?)\)/g, '[!{__("console.newest_comment.image")}]') + str = str.replace(/\[.*?\]\((.*?)\)/g, '[!{__("console.newest_comment.link")}]') + str = str.replace(/```.*?```/g, '[!{__("console.newest_comment.code")}]') + return str + } + })() \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/message/content.pug b/themes/solitude/layout/includes/widgets/page/message/content.pug new file mode 100644 index 0000000..21fa5b3 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/message/content.pug @@ -0,0 +1,9 @@ +#article-container + != page.content + if theme.envelope.enable + .switch_message + button.open(type='button' onclick="document.getElementById('barrage').classList.remove('hide')") + span(aria-hidden='true')= __('message.open') + button.close(type='button' onclick="document.getElementById('barrage').classList.add('hide')") + span(aria-hidden='true')= __('message.close') + #barrage \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/message/js.pug b/themes/solitude/layout/includes/widgets/page/message/js.pug new file mode 100644 index 0000000..314b0d9 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/message/js.pug @@ -0,0 +1,12 @@ +- const {use,avatar} = theme.comment + +if use + case use[0] + when "Valine" + include ./valine + when "Twikoo" + include ./twikoo + when "Waline" + include ./waline + when "Artalk" + include ./artalk \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/message/twikoo.pug b/themes/solitude/layout/includes/widgets/page/message/twikoo.pug new file mode 100644 index 0000000..77572ae --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/message/twikoo.pug @@ -0,0 +1,47 @@ +- const {envId} = theme.twikoo + +script(pjax). + (async () => { + const emojiReg = /]+>/g + if (typeof EasyDanmaku === "undefined") await utils.getScript('!{url_for(theme.cdn.envelope_js)}') + const Danmaku = new EasyDanmaku({ + page: '!{theme.envelope.page}', + el: '#barrage', + line: !{line}, + speed: !{speed}, + hover: !{hover}, + loop: !{loop}, + }) + const data = utils.saveToLocal.get('enevlope') + if (data) { + Danmaku.batchSend(data, true) + return + } + let ls = [] + fetch('!{envId}/', { + method: "POST", + body: JSON.stringify({ + "event": "GET_RECENT_COMMENTS", + "includeReply": false, + "pageSize": 100 + }), + headers: {'Content-Type': 'application/json'} + }).then(res => res.json()).then(({data}) => { + for (const i of data) { + if (i.avatar === undefined) i.avatar = '!{avatar}/avatar/d615d5793929e8c7d70eab5f00f7f5f1?d=mp' + ls.push({avatar: i.avatar, content: i.nick + ': ' + formatDanmaku(i.comment), url: i.url + '#' + i.id}) + } + Danmaku.batchSend(ls, true); + utils.saveToLocal.set('envelope', ls, 0.02) + }); + + function formatDanmaku(str) { + str = str.replace(emojiReg, '!{__("console.newest_comment.emoji")}') + str = str.replace(/<\/*br>|[\s\uFEFF\xA0]+/g, ''); + str = str.replace(//g, '[!{__("console.newest_comment.image")}]'); + str = str.replace(/.*?<\/a>/g, '[!{__("console.newest_comment.link")}]'); + str = str.replace(/.*?<\/pre>/g, '[!{__("console.newest_comment.code")}]'); + str = str.replace(/<.*?>/g, ''); + return str + } + })() \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/message/valine.pug b/themes/solitude/layout/includes/widgets/page/message/valine.pug new file mode 100644 index 0000000..d385da2 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/message/valine.pug @@ -0,0 +1,57 @@ +- const {serverURLs,appId,appKey} = theme.valine + +script(pjax). + (async () => { + const emojiReg = /:[a-z0-9_\u4e00-\u9fa5]+:/g + if(typeof EasyDanmaku === "undefined") await utils.getScript('!{url_for(theme.cdn.envelope_js)}') + const envel = new EasyDanmaku({ + page: '!{theme.envelope.page}', + el: '#barrage', + line: !{line}, + speed: !{speed}, + hover: !{hover}, + loop: !{loop}, + }) + const data = utils.saveToLocal.get('enevlope') + if(data){ + envel.batchSend(data,true) + return + } + const url = new URL('!{serverURLs}/1.1/classes/Comment') + const params = { + url: window.location.pathname, + order: '-createdAt' + } + Object.entries(params).forEach(([key, value]) => url.searchParams.append(key, value)) + try { + const res = await fetch(url, { + method: "GET", + headers: { + "X-LC-Id": "#{appId}", + "X-LC-Key": "#{appKey}", + "Content-Type": "application/json" + }, + }) + if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`) + const data = await res.json() + const init = () => + data.results.map(item => ({ + content: item.nick + ': ' + formatDanmaku(item.comment), + avatar: '!{avatar}/avatar/'+md5(item.mail), + url: item.url + })) + if (typeof md5 === "undefined") await utils.getScript('!{url_for(theme.cdn.blueimp_md5)}') + envel.batchSend(init(),true) + utils.saveToLocal.set('enevlope',init(),.02) + } catch (error) { + console.error("An error occurred while fetching comments: ", error) + } + + function formatDanmaku(str) { + str = str.replace(emojiReg, '[!{__("console.newest_comment.emoji")}]') + str = str.replace(/!\[.*?\]\((.*?)\)/g, '[!{__("console.newest_comment.image")}]') + str = str.replace(/\[.*?\]\((.*?)\)/g, '[!{__("console.newest_comment.link")}]') + str = str.replace(/```.*?```/g, '[!{__("console.newest_comment.code")}]') + return str + } + })() \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/message/waline.pug b/themes/solitude/layout/includes/widgets/page/message/waline.pug new file mode 100644 index 0000000..df7e376 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/message/waline.pug @@ -0,0 +1,42 @@ +script(pjax). + (async () => { + const emojiReg = /]+ class="wl-emoji">/g + if(typeof EasyDanmaku === "undefined") await utils.getScript('!{url_for(theme.cdn.envelope_js)}') + const envel = new EasyDanmaku({ + page: '!{theme.envelope.page}', + el: '#barrage', + line: !{line}, + speed: !{speed}, + hover: !{hover}, + loop: !{loop}, + }) + const data = utils.saveToLocal.get('enevlope') + if(data){ + envel.batchSend(data,true) + return + } + await fetch('!{theme.waline.envId}/api/comment?type=recent&count=50', {method: 'GET'}).then(async res => res.json()) + .then(async data => { + let ls = [] + for (const i of data.data) { + ls.push({ + content: i.nick + ': ' + formatContent(i.comment), + avatar: i.avatar, + url: i.url + }) + } + envel.batchSend(ls,true) + utils.saveToLocal.set('enevlope',ls,.02) + }).catch(error => { + console.error("An error occurred while fetching comments: ", error) + }) + + function formatContent(content) { + content = content.replace(emojiReg, '[!{__("console.newest_comment.emoji")}]') + content = content.replace(//g, '[!{__("console.newest_comment.image")}]'); + content = content.replace(/.*?<\/a>/g, '[!{__("console.newest_comment.link")}]'); + content = content.replace(/.*?<\/pre>/g, '[!{__("console.newest_comment.code")}]'); + content = content.replace(/<.*?>/g, ''); + return content + } + })() \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/recentcomment/artalk.pug b/themes/solitude/layout/includes/widgets/page/recentcomment/artalk.pug new file mode 100644 index 0000000..c0a6520 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/recentcomment/artalk.pug @@ -0,0 +1,78 @@ +- const { server, site, option } = theme.artalk + +script(pjax). + (async () => { + document.querySelector('#comments-page').textContent = `#{__("loading")}` + const emojiReg = /]+ atk-emoticon="[^"]+">/g + let cache = utils.saveToLocal.get('artalk-recent-comments') + if (cache) { + setHtml(document.querySelector('#comments-page'), cache) + return + } + let ls = [] + const searchParams = new URLSearchParams({'site_name': "!{site}", 'limit': '!{limit}'}) + await fetch(`!{server}/api/v2/stats/latest_comments?${searchParams}`, {method: 'GET'}).then(async res => res.json()) + .then(async data => { + for (const i of data.data) { + if (checkEmoji(i.content)) continue + let title = '' + if (i.page_key) { + await fetch(i.page_key).then(res => res.text()).then(html => { + const parser = new DOMParser() + const doc = parser.parseFromString(html, 'text/html') + title = doc.querySelector('title').innerText + }).catch(() => { + title = i.page_key + }) + } + if (title.indexOf('|') > 0) { + title = title.split('|')[0] + } + ls.push({ + title: title, + url: i.page_key + '#atk-comment-' + i.id, + nick: i.nick, + avatar: '!{avatar}' + '/avatar/' + i.email_encrypted, + time: i.date, + content: formatContent(i.content) + }) + } + setHtml(document.querySelector('#comments-page'), ls) + utils.saveToLocal.set('artalk-recent-comments', ls, !{cache}) + }) + + function setHtml(el, data) { + el.innerHTML = data.map(i => ` +
+
+ ${i.nick} +
+ ${i.nick} +
+ +
+
${i.content}
+
+ + ${i.title}
+
+ `).join('') + if (typeof sco !== 'undefined') sco.changeTimeFormat(document.querySelectorAll('.comment-time')) + else { + document.addEventListener('pjax:complete', () => sco.changeTimeFormat(document.querySelectorAll('.comment-time'))) + document.addEventListener('DOMContentLoaded', () => sco.changeTimeFormat(document.querySelectorAll('.comment-time'))) + } + } + + function checkEmoji(content) { + return emojiReg.test(content) + } + + function formatContent(content) { + content = content.replace(emojiReg, '[!{__("console.newest_comment.emoji")}]') + content = content.replace(/!\[.*?\]\((.*?)\)/g, '[!{__("console.newest_comment.image")}]') + content = content.replace(/\[.*?\]\((.*?)\)/g, '[!{__("console.newest_comment.link")}]') + content = content.replace(/```.*?```/g, '[!{__("console.newest_comment.code")}]') + return content + } + })() \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/recentcomment/twikoo.pug b/themes/solitude/layout/includes/widgets/page/recentcomment/twikoo.pug new file mode 100644 index 0000000..f3429d1 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/recentcomment/twikoo.pug @@ -0,0 +1,83 @@ +- const {envId} = theme.twikoo + +script(pjax). + (async () => { + document.querySelector('#comments-page').textContent = `#{__("loading")}` + const emojiReg = /]+>/g + let cache = utils.saveToLocal.get('twikoo-recent-comments') + if (cache) { + setHtml(document.querySelector('#comments-page'), cache) + return + } + let ls = [] + + await fetch('!{envId}', { + method: "POST", + body: JSON.stringify({ + "event": "GET_RECENT_COMMENTS", + "includeReply": true, + "pageSize": !{limit} + }), + headers: {'Content-Type': 'application/json'} + }).then(res => res.json()).then(async ({data}) => { + for (const i of data) { + if (i.avatar === undefined) i.avatar = '!{avatar}/avatar/d615d5793929e8c7d70eab5f00f7f5f1?d=mp' + let title = '' + if (i.url) { + await fetch(i.url).then(res => res.text()).then(html => { + const parser = new DOMParser() + const doc = parser.parseFromString(html, 'text/html') + title = doc.querySelector('title').innerText + }).catch(() => { + title = i.url + }) + } + if (title.indexOf('|') > 0) { + title = title.split('|')[0] + } + ls.push({ + avatar: i.avatar, + nick: i.nick, + title: title, + content: i.comment, + url: i.url + '#' + i.id, + time: i.created + }) + } + setHtml(document.querySelector('#comments-page'), ls) + utils.saveToLocal.set('twikoo-recent-comments', ls, !{cache}) + }); + + function setHtml(el, data) { + el.innerHTML = data.map(i => ` +
+
+ ${i.nick} +
+ ${i.nick} +
+ +
+
${formatContent(i.content)}
+
+ + ${i.title}
+
+ `).join('') + if (typeof sco !== 'undefined') sco.changeTimeFormat(document.querySelectorAll('.comment-time')) + else { + document.addEventListener('pjax:complete', () => sco.changeTimeFormat(document.querySelectorAll('.comment-time'))) + document.addEventListener('DOMContentLoaded', () => sco.changeTimeFormat(document.querySelectorAll('.comment-time'))) + } + } + + function formatContent(content) { + content = content.replace(emojiReg, '!{__("console.newest_comment.emoji")}') + content = content.replace(/<\/*br>|[\s\uFEFF\xA0]+/g, ''); + content = content.replace(//g, '[!{__("console.newest_comment.image")}]'); + content = content.replace(/.*?<\/a>/g, '[!{__("console.newest_comment.link")}]'); + content = content.replace(/.*?<\/pre>/g, '[!{__("console.newest_comment.code")}]'); + content = content.replace(/<.*?>/g, ''); + return content + } + })() \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/recentcomment/valine.pug b/themes/solitude/layout/includes/widgets/page/recentcomment/valine.pug new file mode 100644 index 0000000..e51811e --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/recentcomment/valine.pug @@ -0,0 +1,79 @@ +- const { appId, appKey, serverURLs } = theme.valine + +script(pjax). + (async () => { + document.querySelector('#comments-page').textContent = `#{__("loading")}` + const emojiReg = /:[a-z0-9_\u4e00-\u9fa5]+:/g + let cache = utils.saveToLocal.get('valine-recent-comments') + if (cache) { + setHtml(document.querySelector('#comments-page'), cache) + return + } + let ls = [] + if (typeof md5 === "undefined") await utils.getScript('!{url_for(theme.cdn.blueimp_md5)}') + await fetch('!{serverURLs}/1.1/classes/Comment?limit=8&order=-createdAt', { + method: "GET", + headers: { + "X-LC-Id": '!{appId}', + "X-LC-Key": '!{appKey}', + "Content-Type": "application/json" + } + }).then(async res => res.json()).then(async results => { + for (const i of results.results) { + let title = '' + if (i.url) { + await fetch(i.url).then(res => res.text()).then(html => { + const parser = new DOMParser() + const doc = parser.parseFromString(html, 'text/html') + title = doc.querySelector('title').innerText + }).catch(() => { + title = i.url + }) + } + if (title.indexOf('|') > 0) { + title = title.split('|')[0] + } + ls.push({ + title: title, + url: i.url, + nick: i.nick, + avatar: '!{avatar}' + '/avatar/' + md5(i.mail.trim().toLowerCase()), + time: i.createdAt, + content: formatContent(i.comment) + }) + } + setHtml(document.querySelector('#comments-page'), ls) + utils.saveToLocal.set('valine-recent-comments', ls, !{cache}) + }) + + function setHtml(el, data) { + el.innerHTML = data.map(i => ` +
+
+ ${i.nick} +
+ ${i.nick} +
+ +
+
${i.content}
+
+ + ${i.title}
+
+ `).join('') + if (typeof sco !== 'undefined') sco.changeTimeFormat(document.querySelectorAll('.comment-time')) + else { + document.addEventListener('pjax:complete', () => sco.changeTimeFormat(document.querySelectorAll('.comment-time'))) + document.addEventListener('DOMContentLoaded', () => sco.changeTimeFormat(document.querySelectorAll('.comment-time'))) + } + } + + function formatContent(content) { + content = content.replace(emojiReg, '[!{__("console.newest_comment.emoji")}]') + content = content.replace(/!\[.*?\]\((.*?)\)/g, '[!{__("console.newest_comment.image")}]') + content = content.replace(/\[.*?\]\((.*?)\)/g, '[!{__("console.newest_comment.link")}]') + content = content.replace(/```.*?```/g, '[!{__("console.newest_comment.code")}]') + return content + } + })() \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/page/recentcomment/waline.pug b/themes/solitude/layout/includes/widgets/page/recentcomment/waline.pug new file mode 100644 index 0000000..38c397b --- /dev/null +++ b/themes/solitude/layout/includes/widgets/page/recentcomment/waline.pug @@ -0,0 +1,72 @@ +script(pjax). + (async () => { + document.querySelector('#comments-page').textContent = `#{__("loading")}` + const emojiReg = /]+ class="wl-emoji">/g + let cache = utils.saveToLocal.get('waline-recent-comments') + if (cache) { + setHtml(document.querySelector('#comments-page'), cache) + return + } + let ls = [] + await fetch('!{theme.waline.envId}/api/comment?type=recent&count=!{limit}', {method: 'GET'}).then(async res => res.json()) + .then(async data => { + console.log(data) + for (const i of data.data) { + let title = '' + if (i.url) { + await fetch(i.url).then(res => res.text()).then(html => { + const parser = new DOMParser() + const doc = parser.parseFromString(html, 'text/html') + title = doc.querySelector('title').innerText + }).catch(() => { + title = i.url + }) + } + if (title.indexOf('|') > 0) { + title = title.split('|')[0] + } + ls.push({ + title: title, + url: i.url, + nick: i.nick, + avatar: i.avatar, + time: new Date(i.time), + content: formatContent(i.comment) + }) + } + setHtml(document.querySelector('#comments-page'), ls) + utils.saveToLocal.set('waline-recent-comments', ls, !{cache}) + }) + + function setHtml(el, data) { + el.innerHTML = data.map(i => ` +
+
+ ${i.nick} +
+ ${i.nick} +
+ +
+
${i.content}
+
+ + ${i.title}
+
+ `).join('') + if (typeof sco !== 'undefined') sco.changeTimeFormat(document.querySelectorAll('.comment-time')) + else { + document.addEventListener('pjax:complete', () => sco.changeTimeFormat(document.querySelectorAll('.comment-time'))) + document.addEventListener('DOMContentLoaded', () => sco.changeTimeFormat(document.querySelectorAll('.comment-time'))) + } + } + + function formatContent(content) { + content = content.replace(emojiReg, '[!{__("console.newest_comment.emoji")}]') + content = content.replace(//g, '[!{__("console.newest_comment.image")}]'); + content = content.replace(/.*?<\/a>/g, '[!{__("console.newest_comment.link")}]'); + content = content.replace(/.*?<\/pre>/g, '[!{__("console.newest_comment.code")}]'); + content = content.replace(/<.*?>/g, ''); + return content + } + })() \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/post/award.pug b/themes/solitude/layout/includes/widgets/post/award.pug new file mode 100644 index 0000000..6af89f2 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/post/award.pug @@ -0,0 +1,44 @@ +.post-reward + .reward-button(title=_p('award.tipping') onclick="AddRewardMask()") + i.solitude.st-hand-heart-fill + =_p('award.tipping') + .reward-main + ul.reward-all + span.reward-title=theme.post.award.title + ul.reward-group + - let list = theme.post.award.list || [] + for item in list + li.reward-item + a(href=url_for(item.url)) + img.post-qr-code-img.nolazyload(src=item.qcode, alt=item.name, style="border-color: " + item.color) + .post-qr-code-desc=item.name + a.reward-main-btn(href=url_for(theme.post.award.appreciators)) + .reward-text= _p('award.title') + .reward-dec=theme.post.award.desc + +script. + function RemoveRewardMask() { + let rewardMainElements = document.querySelectorAll(".reward-main"); + let quitBoxElement = document.querySelector("#quit-box"); + + rewardMainElements.forEach(element => { + element.style.display = "none"; + }); + + if (quitBoxElement) { + quitBoxElement.style.display = "none"; + } + } + + function AddRewardMask() { + let rewardMainElements = document.querySelectorAll(".reward-main"); + let quitBoxElement = document.querySelector("#quit-box"); + + rewardMainElements.forEach(element => { + element.style.display = "flex"; + }); + + if (quitBoxElement) { + quitBoxElement.style.display = "flex"; + } + } \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/post/copyright.pug b/themes/solitude/layout/includes/widgets/post/copyright.pug new file mode 100644 index 0000000..a1ece32 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/post/copyright.pug @@ -0,0 +1,74 @@ +- const {copyright} = theme.post.default +.post-copyright + .post-copyright__author_group + a.post-copyright__author_img(href=url_for(copyright.author.url)) + img.post-copyright__author_img_front(src=copyright.author.img || theme.site.icon) + .post-copyright__author_name= config.title + .post-copyright__author_desc= config.subtitle + .post-tools#post-tools + .post-tools-left + #quit-box(onclick="RemoveRewardMask()") + if theme.post.award.enable + include ./award + if theme.post.rss + .reward-link.mode + a.reward-link-button(href=url_for(theme.post.rss)) + i.solitude.st-plant-fill + = _p('footer.rss') + if theme.post.share.enable + .social-share + - const path = config.url + url_for(page.path); + - const encodedPath = encodeURIComponent(path); + - const encodedTitle = encodeURIComponent(page.title); + - const encodedDescription = encodeURIComponent(page.description); + - const encodedIcon = encodeURIComponent(page.cover || theme.site.icon); + each item in theme.post.share.list || [] + case item + when 'qq' + a.social-share-ico.icon-qq(href=`https://connect.qq.com/widget/shareqq/index.html?url=${encodedPath}&title=${encodedTitle}&desc=${encodedDescription}&summary=${encodedDescription}&site=${encodedTitle}&pics=${encodedIcon}` title=_p('post.share.qq')) + i.solitude.st-qq-fill + when 'weibo' + a.social-share-ico.icon-weibo(href=`http://service.weibo.com/share/share.php?url=${encodedPath}&title=${encodedTitle}&pic=${encodedIcon}` title=_p('post.share.weibo')) + i.solitude.st-weibo-fill + when 'telegram' + a.social-share-ico.icon-telegram(href=`https://t.me/share/url?url=${encodedPath}&text=${encodedTitle}` title=_p('post.share.telegram')) + i.solitude.st-telegram-fill + when 'whatsapp' + a.social-share-ico.icon-whatsapp(href=`https://api.whatsapp.com/send?text=${encodedTitle} ${encodedPath}` title=_p('post.share.whatsapp')) + i.solitude.st-whatsapp-fill + when 'linkedin' + a.social-share-ico.icon-linkedin(href=`https://www.linkedin.com/shareArticle?mini=true&url=${encodedPath}&title=${encodedTitle}&summary=${encodedDescription}&source=${encodedTitle}` title=_p('post.share.linkedin')) + i.solitude.st-linkedin-box-fill + when 'facebook' + a.social-share-ico.icon-facebook(href=`https://www.facebook.com/sharer/sharer.php?u=${encodedPath}` title=_p('post.share.facebook')) + i.solitude.st-facebook-fill + when 'twitter' + a.social-share-ico.icon-twitter(href=`https://twitter.com/intent/tweet?url=${encodedPath}&text=${encodedTitle}` title=_p('post.share.twitter')) + i.solitude.st-twitter-x-fill + when 'link' + .social-share-ico.icon-link(onclick=`utils.copy("${path}")` title=_p('post.share.link')) + i.solitude.st-links-line + when 'qrcode' + .social-share-ico.icon-qrcode(title=_p('post.share.qrcode')) + i.solitude.st-qr-code-fill + .share-main + .share-main-all + #qrcode + .reward-dec=_p('post.share.qrcode') + script(pjax). + typeof QRCode === 'function' && new QRCode(document.getElementById("qrcode"), '!{path}'); + window.addEventListener('DOMContentLoaded', () => { + new QRCode(document.getElementById("qrcode"), '!{path}'); + }); + + if copyright.enable || page.copyright + .post-copyright__notice + span.post-copyright-info + if page.reprint + = _p('post.copyright.reprint') + else + = _p('post.copyright.original') + a(href=url_for(theme.post.default.copyright.licenurl)) + | #{theme.post.default.copyright.license} + = _p('post.copyright.original_end') + a(href=url_for("/")) #{config.title} \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/post/post-ai.pug b/themes/solitude/layout/includes/widgets/post/post-ai.pug new file mode 100644 index 0000000..81c7b79 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/post/post-ai.pug @@ -0,0 +1,12 @@ +.post-ai + .ai-title + .ai-title-left + i.ai-title-icon.solitude.st-robot-fill + .ai-title-text=_p('post.ai.title') + .ai-tag#ai-tag= theme.post_ai.modelName + .ai-explanation(style="display: block;") + .ai-suggestions + .ai-bottom + .ai-tips= theme.post_ai.tips + if theme.post_ai.report + a.ai-report(title=_p('post.ai.tip'), href=url_for(theme.post_ai.report))=_p('post.ai.tip') \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/post/postMeta.pug b/themes/solitude/layout/includes/widgets/post/postMeta.pug new file mode 100644 index 0000000..668add0 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/post/postMeta.pug @@ -0,0 +1,84 @@ +.coverdiv#coverdiv + img#post-cover.nolazyload(src=url_for(page.cover), alt=page.title) +#post-info + #post-firstinfo + .meta-firstline + - var cc = page.reprint ? _p('post.reprint') : _p('post.original') + a.post-meta-original(title=_p('post.cc').replace(/\$\{cc}/, cc))= cc + if page.categories.data.length > 0 + span.post-meta-categories + a.post-meta-categories(href=url_for('/' + page.categories.data[0].path))= page.categories.data[0].name + .tag_share + .post-meta__tag-list + each tag in page.tags.data + a.post-meta__tags(href=url_for(tag.path)) + span.tags-name.tags-punctuation= tag.name + h1.post-title= page.title + #post-meta + .meta-secondline + if theme.post.meta.date + span.post-meta-date(title=_p('post.posted') + ' ' + full_date(page.date)) + i.post-meta-icon.solitude.st-calendar-todo-fill + time(datetime=date_xml(page.date))= date_xml(page.date) + if theme.post.meta.updated + span.post-meta-date(title=_p('post.updated') + ' ' + full_date(page.updated)) + i.post-meta-icon.solitude.st-refresh-line + time(datetime=date_xml(page.updated))= date_xml(page.updated) + if theme.wordcount + span.post-meta-wordcount + if theme.post.meta.wordcount + i.post-meta-icon.solitude.st-word-fill(title=_p('post.wordcount')) + span.word-count= wordcount(page.content) + span.post-meta-separator + if theme.post.meta.readtime + i.post-meta-icon.solitude.st-clock-fill(title=_p('post.minread')) + span= min2read(page.content) + " min" + if theme.post.meta.locate + span.post-meta-position(title=_p('post.ip') + page.locate) + i.post-meta-icon.solitude.st-map-pin-fill + span= page.locate + if theme.post.meta.pv + a.post-meta-pv(href=url_for(page.path), title=_p('post.pv')) + i.post-meta-icon.solitude.st-fire-fill + if theme.comment.use && theme.comment.pv + case theme.comment.use[0] + when "Twikoo" + span#twikoo_visitors + i.solitude.st-loading-line + when "Waline" + span.waline-pageview-count + i.solitude.st-loading-line + when "Valine" + span.leancloud_visitors(id=url_for(page.path)) + span.leancloud-visitors-count + i.solitude.st-loading-line + when 'Artalk' + span#ArtalkPV + i.solitude.st-loading-line + else + if theme.busuanzi + if theme.busuanzi_use === 0 + span#busuanzi_value_page_pv + i.solitude.st-loading-line + else + span#busuanzi_page_pv + i.solitude.st-loading-line + if theme.post.meta.comment && page.comment && theme.comment.count && theme.comment.use + span.post-meta-commentcount(title=_p('post.comment'), onclick="sco.scrollTo('post-comment')") + i.solitude.st-chat-fill + a(href=url_for(page.path) + "#post-comment") + case theme.comment.use[0] + when "Twikoo" + span.twikoo-count + i.solitude.st-loading-line + when "Waline" + span.waline-comment-count + i.solitude.st-loading-line + when "Valine" + span.valine-comment-count(data-xid=url_for(page.path) itemprop="commentCount") + i.solitude.st-loading-line + when 'Artalk' + span.artalk-count + i.solitude.st-loading-line + +include ./wave \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/post/postNav.pug b/themes/solitude/layout/includes/widgets/post/postNav.pug new file mode 100644 index 0000000..4f11592 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/post/postNav.pug @@ -0,0 +1,25 @@ +nav.needEndHide.pagination-post#pagination + if page.prev && page.next + .prev-post.pull-left + a(href=url_for(page.prev.path)) + .pagination-info + .label=_p('post.nav.prev') + .prev_info= page.prev.title + .next-post.pull-right + a(href=url_for(page.next.path)) + .pagination-info + .label=_p('post.nav.next') + .next_info= page.next.title + else + if !page.prev && page.next + .next-post.pull-full + a(href=url_for(page.next.path)) + div.pagination-info + .label=_p('post.nav.next') + .next_info= page.next.title + if !page.next && page.prev + .prev-post.pull-full + a(href=url_for(page.prev.path)) + .pagination-info + .label=_p('post.nav.prev') + .prev_info= page.prev.title \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/post/wave.pug b/themes/solitude/layout/includes/widgets/post/wave.pug new file mode 100644 index 0000000..5feccb9 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/post/wave.pug @@ -0,0 +1,9 @@ +section.main-hero-waves-area.waves-area + svg.waves-svg(xmlns="http://www.w3.org/2000/svg", xlink="http://www.w3.org/1999/xlink", viewBox="0 24 150 28", preserveAspectRatio="none", shape-rendering="auto") + defs + path#gentle-wave(d="M -160 44 c 30 0 58 -18 88 -18 s 58 18 88 18 s 58 -18 88 -18 s 58 18 88 18 v 44 h -352 Z") + g.parallax + use(href="#gentle-wave", x="48", y="0") + use(href="#gentle-wave", x="48", y="3") + use(href="#gentle-wave", x="48", y="5") + use(href="#gentle-wave", x="48", y="7") \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/randomlink.pug b/themes/solitude/layout/includes/widgets/randomlink.pug new file mode 100644 index 0000000..143f0bc --- /dev/null +++ b/themes/solitude/layout/includes/widgets/randomlink.pug @@ -0,0 +1,44 @@ +- var datalinks = [] +- var data = site.data.links.links +if(data) + each item in data + if item.type === "item" + each y in item.link_list + - datalinks.push({ name: y.name,link: y.link}) + +script. + const links = !{JSON.stringify(datalinks)} + const randomText = '!{_p('link.random')}' + function travelling() { + const link = links[utils.randomNum(links.length)]; + Snackbar.show({ + text: randomText.replace(/\$\{name}/,link.name), + duration: 8000, + pos: 'top-center', + actionText: '!{_p('link.to')}', + onActionClick: function(element) { + element.style.opacity = 0; + window.open(link.link, '_blank'); + } + }); + } + +if theme.footer.randomlink + script. + function randomLinksList() { + const linkcard = document.getElementById('friend-links-in-footer'); + if (linkcard == null) return; + + let data = ''; + let linksCopy = [...links]; + let count = Math.min(3, linksCopy.length); + + for (let i = 0; i < count; i++) { + let index = utils.randomNum(linksCopy.length); + const {link, name} = linksCopy[index]; + data += `${name}`; + linksCopy.splice(index, 1); + } + + linkcard.innerHTML = data + '#{_p('more')}'; + } \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/third-party/comments/artalk.pug b/themes/solitude/layout/includes/widgets/third-party/comments/artalk.pug new file mode 100644 index 0000000..024dea8 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/third-party/comments/artalk.pug @@ -0,0 +1,61 @@ +- const { server, site, option } = theme.artalk +- const { lazyload ,use} = theme.comment + +script. + (() => { + let artalkItem = null + const initArtalk = () => { + artalkItem = Artalk.init({ + el: '#artalk-wrap', + server: '!{server}', + site: "!{site}", + pageKey: location.pathname, + darkMode: document.documentElement.getAttribute('data-theme') === 'dark' + }, !{JSON.stringify(option)}) + if (GLOBAL_CONFIG.lightbox === 'null') return + artalkItem.on('list-loaded', () => { + const array = [] + artalkItem.ctx.get('list').getCommentNodes().forEach(comment => { + array.push({ + nick: comment.data.nick, + content: comment.data.content_marked, + mailMd5: comment.data.email_encrypted, + }) + const $content = comment.getRender().$content + GLOBAL_CONFIG.lightbox && utils.lightbox($content.querySelectorAll('img:not([atk-emoticon])')) + }) + sco.owoBig({body: '.atk-grp', item: '.atk-item'}) + !{commentBarrage} && barrageArtalk(array) + }) + const destroyArtalk = () => artalkItem.destroy() + utils.addGlobalFn('pjax', destroyArtalk, 'destroyArtalk') + } + const loadArtalk = async () => { + if (typeof Artalk === 'object') initArtalk() + else { + await utils.getCSS('!{theme.cdn.artalk_css}') + await utils.getScript('!{theme.cdn.artalk_js}').then(initArtalk) + } + } + const artalkChangeMode = theme => { + const artalkWrap = document.getElementById('artalk-wrap') + if (!(artalkWrap && artalkWrap.children.length)) return + const isDark = theme === 'dark' + artalkItem.setDarkMode(isDark) + } + utils.addGlobalFn('themeChange', artalkChangeMode, 'artalk') + if ('!{use[0]}' === 'Artalk' || !{lazyload}) { + if (!{lazyload}) utils.loadComment(document.getElementById('artalk-wrap'), loadArtalk) + else loadArtalk() + } else { + window.loadTwoComment = loadArtalk + } + })() + +if commentBarrage + script. + async function barrageArtalk(array) { + const init = () => initializeCommentBarrage(array) + if (typeof initializeCommentBarrage === "undefined") await utils.getScript('!{url_for(theme.cdn.commentBarrage)}').then(init) + else init() + } \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/third-party/comments/comment.pug b/themes/solitude/layout/includes/widgets/third-party/comments/comment.pug new file mode 100644 index 0000000..36f6e9c --- /dev/null +++ b/themes/solitude/layout/includes/widgets/third-party/comments/comment.pug @@ -0,0 +1,44 @@ +- const {use,count} = theme.comment + +#post-comment + .comment-head + .comment-headline + i.solitude.st-chat-fill + span=' ' + _p('comment.title') + if count && is_post() + span.count + = ' (' + each name in use + case name + when "Twikoo" + span.twikoo-count + i.solitude.st-loading-line + when "Waline" + span.waline-comment-count + i.solitude.st-loading-line + when "Valine" + span.valine-comment-count(data-xid=url_for(page.path) itemprop="commentCount") + i.solitude.st-loading-line + when "Artalk" + span.artalk-count + | ) + + if use.length > 1 + .comment-switch + span.first=use[0] + span#switch-btn + span.second=use[1] + + .comment-wrap + each name in use + case name + when 'Valine' + #vcomment.vcomment + when 'Twikoo' + #twikoo-wrap + when 'Waline' + #waline-wrap + when 'Artalk' + #artalk-wrap + when 'Giscus' + #giscus-wrap \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/third-party/comments/giscus.pug b/themes/solitude/layout/includes/widgets/third-party/comments/giscus.pug new file mode 100644 index 0000000..1b79b15 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/third-party/comments/giscus.pug @@ -0,0 +1,60 @@ +- const { repo, repo_id, category_id, theme:themes, option } = theme.giscus +- const giscusUrl = theme.cdn.giscus || 'https://giscus.app/client.js' +- const giscusOriginUrl = new URL(giscusUrl).origin +- const { use, lazyload } = theme.comment + +script. + (()=>{ + const getGiscusTheme = theme => { + return theme === 'dark' ? '!{themes.dark}' : '!{themes.light}' + } + + const loadGiscus = () => { + const config = Object.assign({ + src: '!{giscusUrl}', + 'data-repo': '!{repo}', + 'data-repo-id': '!{repo_id}', + 'data-category-id': '!{category_id}', + 'data-mapping': 'pathname', + 'data-theme': getGiscusTheme(document.documentElement.getAttribute('data-theme')), + 'data-reactions-enabled': '1', + crossorigin: 'anonymous', + async: true + },!{JSON.stringify(option)}) + + const ele = document.createElement('script') + for (let key in config) { + ele.setAttribute(key, config[key]) + } + document.getElementById('giscus-wrap').appendChild(ele) + } + + const changeGiscusTheme = theme => { + const sendMessage = message => { + const iframe = document.querySelector('iframe.giscus-frame') + if (!iframe) return + iframe.contentWindow.postMessage({ giscus: message }, '!{giscusOriginUrl}') + } + + sendMessage({ + setConfig: { + theme: getGiscusTheme(theme) + } + }); + } + + utils.addGlobalFn('themeChange', changeGiscusTheme, 'giscus') + + if ('!{use[0]}' === 'Giscus' || !!{lazyload}) { + if (!{lazyload}) { + const giscusWrap = document.getElementById('giscus-wrap') + if (giscusWrap) { + utils.loadComment(giscusWrap, loadGiscus) + } + } else { + loadGiscus() + } + } else { + window.loadOtherComment = loadGiscus + } + })() \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/third-party/comments/js.pug b/themes/solitude/layout/includes/widgets/third-party/comments/js.pug new file mode 100644 index 0000000..ea4aa0f --- /dev/null +++ b/themes/solitude/layout/includes/widgets/third-party/comments/js.pug @@ -0,0 +1,14 @@ +- const {use} = theme.comment + +each name in use + case name + when 'Twikoo' + !=partial('includes/widgets/third-party/comments/twikoo', {}, {cache: true}) + when 'Waline' + !=partial('includes/widgets/third-party/comments/waline', {}, {cache: true}) + when 'Valine' + !=partial('includes/widgets/third-party/comments/valine', {}, {cache: true}) + when 'Artalk' + !=partial('includes/widgets/third-party/comments/artalk', {}, {cache: true}) + when 'Giscus' + !=partial('includes/widgets/third-party/comments/giscus', {}, {cache: true}) \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/third-party/comments/twikoo.pug b/themes/solitude/layout/includes/widgets/third-party/comments/twikoo.pug new file mode 100644 index 0000000..10db7ea --- /dev/null +++ b/themes/solitude/layout/includes/widgets/third-party/comments/twikoo.pug @@ -0,0 +1,80 @@ +- const { envId, region, option ,accessToken } = theme.twikoo +- const { lazyload, count, use,commentBarrage } = theme.comment + +script(). + (() => { + const getCount = () => { + const ele = document.querySelectorAll('.twikoo-count') + if (!ele) return + twikoo.getCommentsCount({ + envId: '!{envId}', + region: '!{region}', + urls: [window.location.pathname], + includeReply: false + }).then(res => { + ele.forEach(item => item.textContent = res[0].count) + }).catch(err => { + console.error(err) + }) + } + const init = () => { + twikoo.init(Object.assign({ + el: '#twikoo-wrap', + envId: '!{envId}', + region: '!{region}', + path: window.location.pathname, + onCommentLoaded: () => { + GLOBAL_CONFIG.lightbox && utils.lightbox(document.querySelectorAll('#twikoo .tk-content img:not(.tk-owo-emotion)')) + } + }, !{JSON.stringify(option)})) + + !{count ? ' && getCount()' : ''} + sco.owoBig({ + body: '.OwO-body', + item: '.OwO-items li' + }) + + barrageTwikoo() + } + + const loadTwikoo = () => { + if (typeof twikoo === 'object') setTimeout(init,0) + else utils.getScript('!{url_for(theme.cdn.twikoo)}').then(init) + } + + if ('!{use[0]}' === 'Twikoo' || !{lazyload}) { + if (!{lazyload}) utils.loadComment(document.getElementById('twikoo-wrap'), loadTwikoo) + else loadTwikoo() + } else { + window.loadTwoComment = loadTwikoo + } + })() + +if commentBarrage + script. + async function barrageTwikoo() { + await fetch("!{envId}", { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ + event: "COMMENT_GET", + accessToken: "!{accessToken}", + url: window.location.pathname + }) + }).then(async res => { + if (!res.ok) throw new Error("HTTP error! status: " + res.status) + const data = await res.json(); + const init = () => { + initializeCommentBarrage((data.data).map(item => Object.assign({ + content: item.comment, + nick: item.nick, + mailMd5: item.mailMd5, + id: item.id + }))) + } + if (typeof initializeCommentBarrage === "undefined") await utils.getScript('!{url_for(theme.cdn.commentBarrage)}').then(init) + else init() + }).catch(error => console.error("An error occurred while fetching comments: ", error)) + } \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/third-party/comments/valine.pug b/themes/solitude/layout/includes/widgets/third-party/comments/valine.pug new file mode 100644 index 0000000..8c04e55 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/third-party/comments/valine.pug @@ -0,0 +1,72 @@ +- const { lazyload, count, use,commentBarrage } = theme.comment +- const { appId, appKey, avatar, serverURLs, visitor, option } = theme.valine +- let emojiMaps = '""' + +if site.data.valine + - emojiMaps = JSON.stringify(site.data.valine) + +script. + (() => { + const initValine = () => { + const valine = new Valine({ + el: '#vcomment', + appId: '#{appId}', + appKey: '#{appKey}', + avatar: '#{avatar}', + serverURLs: '#{serverURLs}', + emojiMaps: !{emojiMaps}, + path: window.location.pathname, + visitor: #{visitor}, + ...!{JSON.stringify(option)} + }) + GLOBAL_CONFIG.lightbox && utils.lightbox(document.querySelectorAll('#comment .vcontent img:not(.vemoji)')) + sco.owoBig({body: '.vwrap', item: '.vemojis i'}) + } + const loadValine = async () => { + if (typeof Valine === 'function') setTimeout(initValine, 0) + else { + await utils.getScript('!{url_for(theme.cdn.valine)}').then(initValine) + } + !{commentBarrage} && barrageValine() + } + if ('!{use[0]}' === 'Valine' || !{lazyload}) { + if (!{lazyload}) utils.loadComment(document.getElementById('vcomment'), loadValine) + else loadValine() + } else { + window.loadTwoComment = loadValine + } + })() + +if commentBarrage + script. + async function barrageValine() { + const url = new URL('!{serverURLs}/1.1/classes/Comment') + const params = { + url: window.location.pathname, + order: '-createdAt' + } + Object.entries(params).forEach(([key, value]) => url.searchParams.append(key, value)) + await fetch(url, { + method: "GET", + headers: { + "X-LC-Id": "#{appId}", + "X-LC-Key": "#{appKey}", + "Content-Type": "application/json" + }, + }).then(async res => { + if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`) + const data = await res.json() + const init = () => + initializeCommentBarrage(data.results + .filter(item => item.url === window.location.pathname) + .map(item => ({ + content: item.comment, + nick: item.nick, + mailMd5: md5(item.mail), + id: item.objectId + }))) + if (typeof md5 === "undefined") await utils.getScript('!{url_for(theme.cdn.blueimp_md5)}') + if (typeof initializeCommentBarrage === "undefined") await utils.getScript('!{url_for(theme.cdn.commentBarrage)}').then(init) + else init() + }).catch(error => console.error("An error occurred while fetching comments: ", error)) + } \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/third-party/comments/waline.pug b/themes/solitude/layout/includes/widgets/third-party/comments/waline.pug new file mode 100644 index 0000000..494070c --- /dev/null +++ b/themes/solitude/layout/includes/widgets/third-party/comments/waline.pug @@ -0,0 +1,67 @@ +- const { envId, option ,pageview } = theme.waline +- const { lazyload, count, commentBarrage,use } = theme.comment + +script. + (() => { + let walineInitFunction = window.walineFn || null + + function initWaline(initFn) { + const walineOptions = { + el: '#waline-wrap', + serverURL: '!{envId}', + pageview: !{pageview}, + dark: 'html[data-theme="dark"]', + path: window.location.pathname, + comment: !{count}, + ...!{JSON.stringify(option)} + } + const walineInstance = initFn(walineOptions) + utils.addGlobalFn('pjax', () => walineInstance.destroy(), 'destroyWaline') + GLOBAL_CONFIG.lightbox && utils.lightbox(document.querySelectorAll('#comment .wl-content img:not(.wl-emoji)')) + sco.owoBig({ + body: '.wl-emoji-popup', + item: '.wl-tab-wrapper button' + }) + } + + async function loadWaline() { + if (walineInitFunction) initWaline(walineInitFunction) + else { + await utils.getCSS('!{url_for(theme.cdn.waline_css)}') + const {init} = await import('!{url_for(theme.cdn.waline_js)}') + walineInitFunction = init || Waline.init + initWaline(walineInitFunction) + window.walineFn = walineInitFunction + } + !{commentBarrage} && barrageWaline() + } + + if (!{use[0] === 'Waline'} || !{lazyload}) { + if (!{lazyload}) utils.loadComment(document.getElementById('waline-wrap'), loadWaline) + else loadWaline() + } else window.loadTwoComment = loadWaline + })() + +if commentBarrage + script. + async function barrageWaline() { + const url = new URL('!{envId}/api/comment') + const params = {path: window.location.pathname, sortBy: 'insertedAt_asc'} + Object.entries(params).forEach(([key, value]) => url.searchParams.append(key, value)) + await fetch(url).then(async res => { + if (!res.ok) throw new Error(`HTTP error! status: ${res.status}`) + const data = await res.json(); + const regex = /]*class="wl-emoji"[^>]*>/; + const init = () => { + initializeCommentBarrage(data.data.data + .map(item => ({ + nick: item.nick, + mailId: item.avatar, + content: item.comment.replace(regex, ''), + id: item.objectId + }))) + } + if (typeof initializeCommentBarrage === "undefined") await utils.getScript('!{url_for(theme.cdn.commentBarrage)}').then(init) + else init() + }).catch(error => console.error("An error occurred while fetching comments: ", error)) + } \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/third-party/music.pug b/themes/solitude/layout/includes/widgets/third-party/music.pug new file mode 100644 index 0000000..cba9cd1 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/third-party/music.pug @@ -0,0 +1,3 @@ +div.needEndHide#nav-music(onclick="sco.musicToggle()") + div#nav-music-hoverTips=__('music.hit') + meting-js(id=theme.capsule.id, server=theme.capsule.server, type="playlist", mutex="true", preload="none", data-lrctype="0", order="random", theme="var(--efu-main)") \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/third-party/news-comment/artalk.pug b/themes/solitude/layout/includes/widgets/third-party/news-comment/artalk.pug new file mode 100644 index 0000000..08dbe0d --- /dev/null +++ b/themes/solitude/layout/includes/widgets/third-party/news-comment/artalk.pug @@ -0,0 +1,92 @@ +- const { server, site, option } = theme.artalk +- const avatarCdn = theme.comment.avatar + +script(pjax). + (() => { + const changeContent = content => { + if (content === '') return content; + const replacements = [ + { + regex: /]+>/ig, + replacement: '[!{_p("console.newest_comment.image")}]' + }, + { + regex: /]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, + replacement: '[!{_p("console.newest_comment.link")}]' + }, + { + regex: /
.*?<\/pre>/gi,
+                    replacement: '[!{_p("console.newest_comment.code")}]'
+                },
+                {
+                    regex: /<[^>]+>/g,
+                    replacement: ''
+                }
+            ];
+            content = replacements.reduce((str, {regex, replacement}) => str.replace(regex, replacement), content);
+            return content.length > 150 ? content.substring(0, 100) + '...' : content;
+        };
+
+        const generateHtml = (array, asideList) => {
+            asideList.innerHTML = array.length ? array.map(item => `
+                
+
+ ${item.nick} +
+
+
${item.content}
+ +
+
+ `).join('') : "!{_p('newest_comment.zero')}"; + window.lazyLoadInstance?.update(); + window.pjax?.refresh(); + sco?.changeTimeFormat(document.querySelectorAll('.aside-list-item time')); + }; + + const getSetting = async () => { + try { + const res = await fetch('!{server}/api/v2/conf', {method: 'GET'}); + return await res.json(); + } catch (e) { + console.error(e); + return null; + } + }; + + const getComment = async (asideList) => { + const searchParams = new URLSearchParams({'site_name': "!{site}", 'limit': '6'}); + await fetch(`!{server}/api/v2/stats/latest_comments?${searchParams}`, {method: 'GET'}).then(async res => { + const result = await res.json(); + const avatarConfig = await getSetting(); + const avatarCdn = '!{avatarCdn}' + '/avatar/'; + const params = avatarConfig?.gravatar?.params || ''; + const artalk = result.data.map(e => ({ + avatar: avatarCdn + e.email_encrypted + '?' + params, + content: changeContent(e.content_marked), + nick: e.nick, + url: e.page_key + `#atk-comment-${e.id}`, + date: e.date, + })).slice(0, !{limit}); + utils.saveToLocal.set('artalk-newest-comments', artalk, !{theme.comment.newest_comment.storage}); + generateHtml(artalk, asideList); + }).catch(error => { + console.error(error); + asideList.textContent = "!{_p('newest_comment.error')}"; + }); + }; + + const newestCommentInit = (asideList) => { + if (!asideList) return; + const data = utils.saveToLocal.get('artalk-newest-comments'); + if (data) { + generateHtml(data, asideList); + } else { + getComment(asideList); + } + }; + + const $asideList = document.querySelector('.card-recent-comment .aside-list'); + window.addEventListener('DOMContentLoaded', () => newestCommentInit($asideList), false) + window.addEventListener('pjax:complete', () => newestCommentInit(document.querySelector('.card-recent-comment .aside-list')), false); + })(); \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/third-party/news-comment/newest-comment.pug b/themes/solitude/layout/includes/widgets/third-party/news-comment/newest-comment.pug new file mode 100644 index 0000000..e05fec8 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/third-party/news-comment/newest-comment.pug @@ -0,0 +1,11 @@ +- var limit = theme.aside.newest_comment.limit ? theme.aside.newest_comment.limit : 5 +if theme.comment.use + case theme.comment.use[0] + when 'Twikoo' + !=partial('includes/widgets/third-party/news-comment/twikoo', {limit}, {cache: true}) + when 'Waline' + !=partial('includes/widgets/third-party/news-comment/waline', {limit}, {cache: true}) + when 'Valine' + !=partial('includes/widgets/third-party/news-comment/valine', {limit}, {cache: true}) + when 'Artalk' + !=partial('includes/widgets/third-party/news-comment/artalk', {limit}, {cache: true}) \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/third-party/news-comment/twikoo.pug b/themes/solitude/layout/includes/widgets/third-party/news-comment/twikoo.pug new file mode 100644 index 0000000..fdac253 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/third-party/news-comment/twikoo.pug @@ -0,0 +1,69 @@ +script. + (() => { + const changeContent = (content) => { + if (!content) return ''; + const replacements = [ + {regex: /]+>/ig, replacement: '[!{_p("console.newest_comment.image")}]'}, + { + regex: /]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, + replacement: '[!{_p("console.newest_comment.link")}]' + }, + {regex: /
.*?<\/pre>/gi, replacement: '[!{_p("console.newest_comment.code")}]'},
+                {regex: /<[^>]+>/g, replacement: ''}
+            ]
+            content = replacements.reduce((str, {regex, replacement}) => str.replace(regex, replacement), content)
+            return content.length > 150 ? `${content.substring(0, 100)}...` : content
+        }
+        const generateHtml = (array) => {
+            const html = array.map(item => `
+                
+
+ ${item.nick} +
+
+
${item.content}
+ +
+
+ `).join('') + document.querySelector('.card-recent-comment .aside-list').innerHTML = array.length ? html : "!{_p('newest_comment.zero')}" + window.lazyLoadInstance?.update() + window.pjax?.refresh() + sco?.changeTimeFormat(document.querySelectorAll('.aside-list-item time')) + } + const getComment = async () => { + const runTwikoo = () => { + twikoo.getRecentComments({ + envId: '!{theme.twikoo.envId}', + region: '', + pageSize: !{limit}, + includeReply: true + }).then(res => { + const twikooArray = res.map(e => ({ + content: changeContent(e.comment), + avatar: e.avatar, + nick: e.nick, + url: `${e.url}#${e.id}`, + date: new Date(e.created).toString() + })).slice(0, 6) + utils.saveToLocal.set('twikoo-newest-comment', twikooArray, !{theme.comment.newest_comment.storage}) + generateHtml(twikooArray) + }).catch((err) => { + console.error(err); + document.querySelector('.card-recent-comment .aside-list').textContent = "!{_p('newest_comment.error')}" + }) + } + if (typeof twikoo === 'object') { + runTwikoo() + } else { + utils.getScript('!{url_for(theme.cdn.twikoo)}').then(runTwikoo) + } + } + const newestCommentInit = () => { + if (!document.querySelector('.card-recent-comment')) return + const data = utils.saveToLocal.get('twikoo-newest-comment') + data ? generateHtml(data) : getComment() + } + window.addEventListener('DOMContentLoaded', newestCommentInit, false) + window.addEventListener('pjax:complete', newestCommentInit, false); + })() \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/third-party/news-comment/valine.pug b/themes/solitude/layout/includes/widgets/third-party/news-comment/valine.pug new file mode 100644 index 0000000..e8a6502 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/third-party/news-comment/valine.pug @@ -0,0 +1,85 @@ +script. + (() => { + const emojiReg = /:[a-z0-9_\u4e00-\u9fa5]+:/g + const changeContent = (content) => { + if (content === '') return content; + + const replacements = [ + {regex: /]+>/ig, replacement: '[!{_p("console.newest_comment.image")}]'}, + { + regex: /]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, + replacement: '[!{_p("console.newest_comment.link")}]' + }, + {regex: /```[\s\S]*?```/g, replacement: '[!{_p("console.newest_comment.code")}]'}, + {regex: /<[^>]+>/g, replacement: ""} + ]; + + content = replacements.reduce((str, {regex, replacement}) => str.replace(regex, replacement), content); + + return content.length > 150 ? content.substring(0, 100) + '...' : content; + } + + const $asideList = document.querySelector('.card-recent-comment .aside-list') + const newestCommentInit = () => { + if (!document.querySelector('.card-recent-comment')) return + const data = utils.saveToLocal.get('valine-newest-comment') + if (data) { + generateHtml(data) + } else { + getComment() + } + } + + const getComment = async () => { + const settings = { + "method": "GET", + "headers": { + "X-LC-Id": '!{theme.valine.appId}', + "X-LC-Key": '!{theme.valine.appKey}', + "Content-Type": "application/json" + }, + } + if (typeof md5 === "undefined") await utils.getScript('!{url_for(theme.cdn.blueimp_md5)}') + await fetch('!{theme.valine.serverURLs}/1.1/classes/Comment?limit=8&order=-createdAt', settings).then(res => res.json()) + .then(async result => { + let ls = [] + for (const i of result.results.slice(0, !{limit})) { + if (emojiReg.test(i.comment)) continue + ls.push({ + content: changeContent(i.comment), + avatar: '!{theme.comment.avatar}' + '/avatar/' + md5(i.mail.toLowerCase()), + nick: i.nick, + url: i.url, + date: i.updatedAt || i.createdAt + }) + } + utils.saveToLocal.set('valine-newest-comment', ls, !{theme.comment.newest_comment.storage}) + generateHtml(ls) + }).catch(error => { + console.error(error); + $asideList.textContent = "!{_p('newest_comment.error')}" + }) + } + + const generateHtml = array => { + const $dom = document.querySelector('.card-recent-comment .aside-list') + $dom.innerHTML = array.length ? array.map(item => ` +
+
+ ${item.nick} +
${item.nick}
+
+
+
${item.content}
+ +
+
+ `).join('') : "!{_p('newest_comment.zero')}" + window.lazyLoadInstance?.update() + window.pjax?.refresh() + sco?.changeTimeFormat(document.querySelectorAll('.aside-list-item time')) + } + + window.addEventListener('DOMContentLoaded', newestCommentInit, false) + window.addEventListener('pjax:complete', newestCommentInit, false); + })() \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/third-party/news-comment/waline.pug b/themes/solitude/layout/includes/widgets/third-party/news-comment/waline.pug new file mode 100644 index 0000000..35b7715 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/third-party/news-comment/waline.pug @@ -0,0 +1,73 @@ +script. + (() => { + const changeContent = (content) => { + if (content === '') return content; + + const replacements = [ + {regex: /]+>/ig, replacement: '[!{_p("console.newest_comment.image")}]'}, + { + regex: /]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, + replacement: '[!{_p("console.newest_comment.link")}]' + }, + {regex: /
.*?<\/pre>/gi, replacement: '[!{_p("console.newest_comment.code")}]'},
+                {regex: /<[^>]+>/g, replacement: ""}
+            ];
+
+            content = replacements.reduce((str, {regex, replacement}) => str.replace(regex, replacement), content);
+
+            return content.length > 150 ? content.substring(0, 100) + '...' : content;
+        }
+
+        const $asideList = document.querySelector('.card-recent-comment .aside-list')
+        const newestCommentInit = () => {
+            if (!document.querySelector('.card-recent-comment')) return
+            const data = utils.saveToLocal.get('waline-newest-comment')
+            if (data) {
+                generateHtml(data)
+            } else {
+                getComment()
+            }
+        }
+
+        const getComment = async () => {
+            await fetch('!{theme.waline.envId}/api/comment?type=recent&count=!{limit}', {method: 'GET'}).then(async res => {
+                const result = await res.json()
+                const walineArray = result.data.map(e => {
+                    return {
+                        'content': changeContent(e.comment),
+                        'avatar': e.avatar,
+                        'nick': e.nick,
+                        'url': e.url + '#' + e.objectId,
+                        'date': new Date(e.time || e.insertedAt)
+                    }
+                })
+                utils.saveToLocal.set('waline-newest-comment', walineArray, !{theme.comment.newest_comment.storage})
+                generateHtml(walineArray)
+            }).catch(error => {
+                console.error(error)
+                $asideList.textContent = "!{_p('newest_comment.error')}"
+            })
+        }
+
+        const generateHtml = array => {
+            const $dom = document.querySelector('.card-recent-comment .aside-list')
+            $dom.innerHTML = array.length ? array.map(item => `
+                
+
+ ${item.nick} +
${item.nick}
+
+
+
${item.content}
+ +
+
+ `).join('') : "!{_p('newest_comment.zero')}" + window.lazyLoadInstance?.update() + window.pjax?.refresh() + sco?.changeTimeFormat(document.querySelectorAll('.aside-list-item time')) + } + + window.addEventListener('DOMContentLoaded', newestCommentInit, false) + window.addEventListener('pjax:complete', newestCommentInit, false); + })() \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/third-party/pjax.pug b/themes/solitude/layout/includes/widgets/third-party/pjax.pug new file mode 100644 index 0000000..13a7e8d --- /dev/null +++ b/themes/solitude/layout/includes/widgets/third-party/pjax.pug @@ -0,0 +1,39 @@ +- const google_adsense = theme.google_adsense.enable + +script. + const pjax = new Pjax({ + elements: 'a:not([target="_blank"])', + selectors: ['title','#body-wrap','#site-config','meta[name="description"]','.js-pjax','meta[property^="og:"]','#config-diff'], + cacheBust: false, + analytics: !{google_adsense}, + scrollRestoration: false + }) + + document.querySelectorAll('script[data-pjax]').forEach(item => { + const newScript = document.createElement('script') + const content = item.text || item.textContent || item.innerHTML || "" + Array.from(item.attributes).forEach(attr => newScript.setAttribute(attr.name, attr.value)) + newScript.appendChild(document.createTextNode(content)) + item.parentNode.replaceChild(newScript, item) + }) + + document.addEventListener('pjax:complete', () => { + window.refreshFn() + + document.querySelectorAll('script[data-pjax]').forEach(item => { + const newScript = document.createElement('script') + const content = item.text || item.textContent || item.innerHTML || "" + Array.from(item.attributes).forEach(attr => newScript.setAttribute(attr.name, attr.value)) + newScript.appendChild(document.createTextNode(content)) + item.parentNode.replaceChild(newScript, item) + }) + + GLOBAL_CONFIG.islazyload && window.lazyLoadInstance.update() + + }) + + document.addEventListener('pjax:error', (e) => { + if (e.request.status === 404) { + pjax.loadUrl('/404.html') + } + }) \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/third-party/search/algolia-search.pug b/themes/solitude/layout/includes/widgets/third-party/search/algolia-search.pug new file mode 100644 index 0000000..9971c91 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/third-party/search/algolia-search.pug @@ -0,0 +1,20 @@ +#algolia-search + .search-dialog + .algolia-navbar + .search-dialog__title#algolia-search-title=__('nav.search') + .algolia-tips + i.solitude.st-algolia-fill + span.algolia-tips-text='Algolia' + span.search-close-button + i.solitude.st-close-fill + #algolia-input-panel + #algolia-search-input + #search-results + #algolia-hits + each tag in theme.search.tags || [] + a.tag-list(href='javascript:void(0);' onclick="pjax.loadUrl('" + url_for('/tags/' + tag) + "/')")=tag + + #algolia-tips + #algolia-pagination + #algolia-stats + #search-mask \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/third-party/search/index.pug b/themes/solitude/layout/includes/widgets/third-party/search/index.pug new file mode 100644 index 0000000..f6fa9e1 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/third-party/search/index.pug @@ -0,0 +1,8 @@ +if theme.search.enable + case theme.search.type + when 'algolia' + include algolia-search + script(src=url_for(theme.cdn.algolia_js)) + when 'local' + include local-search + script(src=url_for(theme.cdn.local_search)) \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/third-party/search/local-search.pug b/themes/solitude/layout/includes/widgets/third-party/search/local-search.pug new file mode 100644 index 0000000..a285d18 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/third-party/search/local-search.pug @@ -0,0 +1,16 @@ +#local-search + div.search-dialog + nav.search-nav + span.search-dialog-title=__('nav.search') + button.search-close-button + i.solitude.st-close-fill + div.search-wrap + div.search-box + input.search-box-input#search-input(type="text", autocomplete="off", spellcheck="false", autocorrect="off", autocapitalize="off", placeholder=__('search.placeholder')) + div#search-results + #search-hits + each tag in theme.search.tags || [] + a.tag-list(href='javascript:void(0);' onclick="pjax.loadUrl('" + url_for('/tags/' + tag) + "/')")=tag + div#search-pagination + div#search-tips + div#search-mask \ No newline at end of file diff --git a/themes/solitude/layout/includes/widgets/third-party/tianli-talk.pug b/themes/solitude/layout/includes/widgets/third-party/tianli-talk.pug new file mode 100644 index 0000000..5d031b2 --- /dev/null +++ b/themes/solitude/layout/includes/widgets/third-party/tianli-talk.pug @@ -0,0 +1,26 @@ +- const {key,option,title} = theme.tianli_talk + +span.needEndHide#efuTalk(onclick="togglePostChatContainer(); return false;" title=title) + i.solitude.st-robot-fill + span.efuTalkTitle=title + +script. + var postChatConfig = { + backgroundColor: "var(--efu-main)", + bottom: "60px", + ...!{JSON.stringify(option)} + }; + + let b = true; + + document.getElementById('efuTalk').addEventListener('click', function () { + this.classList.toggle('on'); + let efu = this + b && setTimeout(() => { + document.getElementById('close-button').addEventListener('click', function () { + efu.classList.remove('on'); + }) + }, 0); + b = false + }); +script(pjax data-postChat_key=key src="https://ai.tianli0.top/static/public/postChatUser.min.js") \ No newline at end of file diff --git a/themes/solitude/layout/index.pug b/themes/solitude/layout/index.pug new file mode 100644 index 0000000..2ef74e0 --- /dev/null +++ b/themes/solitude/layout/index.pug @@ -0,0 +1,23 @@ +extends includes/layout + +block content + if theme.hometop.enable || (theme.says.home_mini && theme.says.enable) + #home_top + if theme.says.home_mini && theme.says.enable + include ./includes/widgets/home/bbTimeList + if theme.hometop.enable && is_home_first_page() + include ./includes/widgets/home/hometop + main.layout#content-inner + #home + #category-bar + include ./includes/widgets/home/categoryBar + .recent-posts#recent-posts + if theme.carousel && is_home_first_page() + include ./includes/widgets/home/carousel.pug + for post, index in page.posts.sort("-sticky" || "-date").data + include ./includes/widgets/home/postList + + // pagination + include ./includes/mixins/pagination + // aside + include ./includes/widgets/aside/aside \ No newline at end of file diff --git a/themes/solitude/layout/page.pug b/themes/solitude/layout/page.pug new file mode 100644 index 0000000..4977b41 --- /dev/null +++ b/themes/solitude/layout/page.pug @@ -0,0 +1,39 @@ +extends includes/layout.pug + +block content + main.layout#content-inner(class=page.aside ? '' : 'hide-aside') + #page + case page.type + when 'categories' + include includes/page/categories + when 'tags' + include includes/page/tags + when 'links' + include includes/page/links + when 'tlink' + include includes/page/tlink + when 'about' + include includes/page/about + when 'says' + include includes/page/says + when 'equipment' + include includes/page/equipment + when 'music' + include includes/page/music + when 'message' + !=partial('includes/page/message', {}, {cache: true}) + when 'recentcomment' + !=partial('includes/page/recentcomment', {}, {cache: true}) + when 'banner' + include includes/widgets/page/banner + if page.container + include includes/page/default + else + != page.content + default + include includes/page/default + if page.comment + - var comment_js = true + include includes/widgets/third-party/comments/comment + if page.aside + include includes/widgets/aside/aside \ No newline at end of file diff --git a/themes/solitude/layout/post.pug b/themes/solitude/layout/post.pug new file mode 100644 index 0000000..20a7334 --- /dev/null +++ b/themes/solitude/layout/post.pug @@ -0,0 +1,30 @@ +extends includes/layout.pug + +block content + main.layout#content-inner + #post + if theme.post_ai.enable && page.ai + include includes/widgets/post/post-ai + article.post-content#article-container!= page.content + include includes/widgets/post/copyright + .post-tools-right + .tag_share + .post-meta__tag-list + each data in page.tags.data + a(href=url_for(data.path)).post-meta__tags + span.tags-punctuation + | #{data.name} + span.tagsPageCount #{data.length} + if theme.google_adsense.enable && !theme.google_adsense.auto_ads && theme.google_adsense.post_content + div.google-ads-warp + ins.adsbygoogle(style="display:block; text-align:center; height:284px", data-ad-layout="in-article", data-ad-format="fluid", hide-unfilled="true", data-ad-client=theme.google_adsense.client, data-ad-slot=theme.google_adsense.slot) + script. + (adsbygoogle = window.adsbygoogle || []).push({}); + if site.posts.length > 1 + include includes/widgets/post/postNav + if theme.related_post.enable + != related_posts(page, site.posts) + if page.comment + - var comment_js = true + include includes/widgets/third-party/comments/comment + include includes/widgets/aside/aside \ No newline at end of file diff --git a/themes/solitude/layout/tag.pug b/themes/solitude/layout/tag.pug new file mode 100644 index 0000000..b9f0ad7 --- /dev/null +++ b/themes/solitude/layout/tag.pug @@ -0,0 +1,16 @@ +extends includes/layout.pug + +block content + main.layout#content-inner + #tag + #tag-page-tags + each tag in site.tags.find({ parent: { $exists: false } }).data + a(id=tag.name class=(tag.name === page.tag ? 'select' : '') href=url_for(tag.path)) + span.tags-punctuation + | #{tag.name} + span.tagsPageCount #{tag.length} + .recent-posts#recent-posts + each post,index in page.posts.find({ parent: { $exists: false } }).data + include includes/widgets/home/postList + include includes/mixins/pagination + include includes/widgets/aside/aside \ No newline at end of file diff --git a/themes/solitude/package.json b/themes/solitude/package.json new file mode 100644 index 0000000..e304c1e --- /dev/null +++ b/themes/solitude/package.json @@ -0,0 +1,32 @@ +{ + "name": "hexo-theme-solitude", + "version": "1.12.2", + "description": "A beautiful, powerful, and efficient Hexo theme developed by EverFu.", + "main": "package.json", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "hexo", + "theme", + "solitude", + "Card UI Design", + "EverFu", + "hexo-theme-solitude" + ], + "repository": { + "type": "git", + "url": "https://github.com/everfu/hexo-theme-solitude" + }, + "dependencies": { + "hexo-renderer-stylus": "^3.0.0", + "hexo-renderer-pug": "^3.0.0" + }, + "bugs": { + "url": "https://github.com/everfu/hexo-theme-solitude/issues", + "email": "o@efu.me" + }, + "homepage": "https://www.efu.me/", + "author": "Hexo-Theme-Solitude", + "license": "MIT" +} \ No newline at end of file diff --git a/themes/solitude/plugins.yml b/themes/solitude/plugins.yml new file mode 100644 index 0000000..8c5c13f --- /dev/null +++ b/themes/solitude/plugins.yml @@ -0,0 +1,122 @@ +algolia_search: + name: algoliasearch + file: dist/algoliasearch-lite.umd.js + version: 4.23.3 +instantsearch: + name: instantsearch.js + file: dist/instantsearch.production.min.js + version: 4.70.0 +pjax: + name: pjax + file: pjax.min.js + version: 0.2.8 +twikoo: + name: twikoo + file: dist/twikoo.all.min.js + version: 1.6.36 +waline_js: + name: '@waline/client' + file: dist/waline.js + other_name: waline + version: 3.2.1 +waline_css: + name: '@waline/client' + file: dist/waline.css + version: 3.2.1 + other_name: waline +valine: + name: valine + file: dist/Valine.min.js + version: 1.5.1 +artalk_css: + name: artalk + file: dist/Artalk.css + version: 2.8.6 +artalk_js: + name: artalk + file: dist/Artalk.js + version: 2.8.6 +katex: + name: katex + file: dist/katex.min.css + other_name: KaTeX + version: 0.16.9 +katex_copytex: + name: katex + file: dist/contrib/copy-tex.min.js + other_name: KaTeX + version: 0.16.9 +lazyload: + name: vanilla-lazyload + file: dist/lazyload.iife.min.js + version: 19.1.3 +aplayer_css: + name: aplayer + file: dist/APlayer.min.css + version: 1.10.1 +aplayer_js: + name: aplayer + file: dist/APlayer.min.js + version: 1.10.1 +meting_js: + name: meting + file: dist/Meting.min.js + version: 2.0.1 +pace_js: + name: pace-js + other_name: pace + file: pace.min.js + version: 1.2.4 +swiper_css: + name: swiper + file: swiper-bundle.min.css + version: 11.0.5 + other_name: Swiper +swiper_js: + name: swiper + file: swiper-bundle.min.js + version: 11.0.5 + other_name: Swiper +busuanzi_js: + name: busuanzi + file: bsz.pure.mini.js + version: 2.3.0 +busuanzi_qj_js: + name: pearssauce-busuanzi + file: bsz.pure.js + version: 1.0.0 +snackbar: + name: node-snackbar + file: dist/snackbar.min.js + version: 0.1.16 +solitude_css: + name: solitude-source + file: icon/solitude.min.css + version: 1.0.5 +medium_zoom: + name: medium-zoom + file: dist/medium-zoom.min.js + version: 1.1.0 +fancyapps_ui: + name: '@fancyapps/ui' + file: dist/fancybox/fancybox.umd.js + version: 5.0.36 + other_name: fancyapps-ui +fancyapps_css: + name: '@fancyapps/ui' + file: dist/fancybox/fancybox.css + version: 5.0.36 + other_name: fancyapps-ui +mermaid_js: + name: mermaid + file: dist/mermaid.min.js + version: 10.9.1 +blueimp_md5: + name: blueimp-md5 + file: js/md5.min.js + version: 2.19.0 +qrcode: + name: qrcodejs + file: qrcode.min.js + version: 1.0.0 + other_name: qrcodejs \ No newline at end of file diff --git a/themes/solitude/scripts/event/cdn.js b/themes/solitude/scripts/event/cdn.js new file mode 100644 index 0000000..0d47547 --- /dev/null +++ b/themes/solitude/scripts/event/cdn.js @@ -0,0 +1,142 @@ +/** + * Solitude + * Merge CDN + */ + +'use strict' + +const { version } = require('../../package.json') +const path = require('path') + +hexo.extend.filter.register('before_generate', () => { + const themeConfig = hexo.theme.config + const { CDN } = themeConfig + + const thirdPartySrc = hexo.render.renderSync({ path: path.join(hexo.theme_dir, '/plugins.yml'), engine: 'yaml' }) + const internalSrc = { + main: { + name: 'hexo-theme-solitude', + file: 'js/main.js', + version + }, + utils: { + name: 'hexo-theme-solitude', + file: 'js/utils.js', + version + }, + local_search: { + name: 'hexo-theme-solitude', + file: 'js/search/local.js', + version + }, + algolia_js: { + name: 'hexo-theme-solitude', + file: 'js/search/algolia.js', + version + }, + cover_local: { + name: 'hexo-theme-solitude', + file: 'js/covercolor/local.js', + version + }, + cover_api: { + name: 'hexo-theme-solitude', + file: 'js/covercolor/api.js', + version + }, + music_js: { + name: 'hexo-theme-solitude', + file: 'js/music.js', + version + }, + right_menu_js: { + name: 'hexo-theme-solitude', + file: 'js/right_menu.js', + version + }, + translate_js:{ + name: 'hexo-theme-solitude', + file: 'js/tw_cn.js', + version + }, + efu_ai: { + name: 'hexo-theme-solitude', + file: 'js/third_party/efu_ai.min.js', + version + }, + commentBarrage: { + name: 'hexo-theme-solitude', + file: 'js/third_party/barrage.min.js', + version + }, + waterfall: { + name: 'hexo-theme-solitude', + file: 'js/third_party/waterfall.min.js', + version + }, + universe_js: { + name: 'hexo-theme-solitude', + file: 'js/third_party/universe.min.js', + version + }, + envelope_js: { + name: 'hexo-theme-solitude', + file: 'js/third_party/envelope.min.js', + version + } + } + + const minFile = file => { + return file.replace(/(? '.min' + ext) + } + + const createCDNLink = (data, type, cond = '') => { + Object.keys(data).forEach(key => { + let { name, version, file, other_name } = data[key] + const cdnjs_name = other_name || name + const cdnjs_file = file.replace(/^[lib|dist]*\/|browser\//g, '') + const min_cdnjs_file = minFile(cdnjs_file) + if (cond === 'internal') file = `source/${file}` + const min_file = minFile(file) + const verType = CDN.version ? (type === 'local' ? `?v=${version}` : `@${version}`) : '' + + const value = { + version, + name, + file, + cdnjs_file, + min_file, + min_cdnjs_file, + cdnjs_name + } + + const cdnSource = { + local: cond === 'internal' ? `${cdnjs_file + verType}` : `/pluginsSrc/${name}/${file + verType}`, + jsdelivr: `https://cdn.jsdelivr.net/npm/${name}${verType}/${min_file}`, + unpkg: `https://unpkg.com/${name}${verType}/${file}`, + cdnjs: `https://cdnjs.cloudflare.com/ajax/libs/${cdnjs_name}/${version}/${min_cdnjs_file}`, + custom: (CDN.custom_format || '').replace(/\$\{(.+?)}/g, (match, $1) => value[$1]), + } + + data[key] = cdnSource[type] + }) + + if (cond === 'internal') data.main_css = 'css/index.css' + (CDN.version ? `?v=${version}` : '') + return data + } + + // delete null value + const deleteNullValue = obj => { + if (!obj) return + for (const i in obj) { + obj[i] === null && delete obj[i] + } + return obj + } + + themeConfig.cdn = Object.assign( + createCDNLink(internalSrc, CDN.internal, 'internal'), + createCDNLink(thirdPartySrc, CDN.third_party), + deleteNullValue(CDN.option) + ) +}) \ No newline at end of file diff --git a/themes/solitude/scripts/event/init.js b/themes/solitude/scripts/event/init.js new file mode 100644 index 0000000..ef3f401 --- /dev/null +++ b/themes/solitude/scripts/event/init.js @@ -0,0 +1,19 @@ +hexo.extend.filter.register('before_generate', () => { + const hexoVer = hexo.version.replace(/(^.*\..*)\..*/, '$1'); + const nodeVer = process.version.replace(/^v/, ''); + const [majorVer] = nodeVer.split('.'); + const logger = hexo.log; + const config = hexo.config; + + if (hexoVer < 7.0) { + logger.error('请把 Hexo 升级到 V7.0.0 或更高的版本!'); + logger.error('Please upgrade your Hexo to V7.0.0 or higher!'); + process.exit(-1); + } + + if (Number(majorVer) < 14) { + logger.error('请将 Node.js 升级到 v14.0.0 或更高的版本!'); + logger.error('Please upgrade Node.js to v14.0.0 or later!'); + process.exit(-1); + } +}); \ No newline at end of file diff --git a/themes/solitude/scripts/event/merge_config.js b/themes/solitude/scripts/event/merge_config.js new file mode 100644 index 0000000..8648e2b --- /dev/null +++ b/themes/solitude/scripts/event/merge_config.js @@ -0,0 +1,390 @@ +hexo.extend.filter.register('before_generate', () => { + const defaultConfig = { + site: { + name: { + class: 'text', + custom: 'Solitude' + }, + siteIcon: '/img/pwa/favicon.ico', + icon: 'icon' + }, + nav: { + group: null, + menu: null, + right: { + random: false, + console: false, + custom: [], + } + }, + hometop: { + enable: false, + banner: { + title: 'Solitude', + url: 'A simple theme for Hexo', + icon: null, + }, + group: null, + recommendList: { + sup: 'Recommend', + title: 'Solitude Docs', + url: 'https://solitude.js.org/', + img: '/img/default.avif', + color: 'none', + } + }, + aside: { + home: { + noSticky: 'about', + Sticky: 'allInfo' + }, + post: { + noSticky: 'about', + Sticky: 'allInfo' + }, + page: { + noSticky: 'about', + Sticky: 'allInfo' + }, + card: { + style: 0, + author: { + img: '/img/logo.png', + sticker: '/img/happy-sticker.avif', + }, + url: '/about/', + background: null, + content1: 'Solitude', + content2: 'A simple theme for Hexo', + sayhello: { + morning: 'Good Morning', + noon: 'Good Noon', + afternoon: 'Good Afternoon', + night: 'Good Night', + goodnight: 'Good Night', + }, + sayhello2: ['Welcome to Solitude', 'A simple theme for Hexo', 'Enjoy your time', 'Have a nice day', 'Good luck'], + information: null, + }, + flip: { + favicon: '', + face: '', + backface: '', + backcolor: 'var(--efu-blue)' + }, + newest_comment: { + enable: false, + storage: .5, + limit: 5 + }, + toc: { + post: true, + page: false, + vague: true, + }, + tags: { + enable: true, + limit: 20, + highlight: false, + list: [], + }, + archive: { + enable: true, + type: 'month' + }, + siteinfo: { + postcount: true, + wordcount: false, + pv: true, + uv: true, + updatetime: true, + runtimeenable: true, + runtime: "2023-04-20 00:00:00", + }, + }, + index_post_list: { + direction: 'column', + column: 2, + content: false, + length: 500, + cover: 'both' + }, + page: { + error: true, + tags: true, + categories: true, + default: { + cover: ['/img/default.avif'], + } + }, + post: { + default: { + cover: ['/img/default.avif'], + locate: 'China, Changsha', + copyright: { + enable: true, + license: 'CC BY-NC-SA 4.0', + licenurl: 'https://creativecommons.org/licenses/by-nc-sa/4.0/', + } + }, + meta: { + date: false, + updated: false, + locate: false, + wordcount: false, + readtime: false, + pv: false, + uv: false, + comment: false, + }, + award: { + enable: false, + appreciators: '/', + title: '感谢您的赞赏。', + desc: '因为有你们的支持,我才体会到写文章的价值。', + list: [], + }, + rss: null, + covercolor: { + enable: false, + mode: 'local', + api: 'https://api.qjqq.cn/api/Imgcolor?img=', + time: 43200000, + }, + footer: { + enable: true, + desc: "来自 Efu 的文章", + button: { + enable: true, + name: '返回首页', + url: '/' + } + } + }, + theme_color: { + dark: "#ffc848", + dark_op: "#f2b94b23", + dark_op_deep: "#f2b94bdd", + dark_none: "#f2b94b00", + light: "#425AEF", + light_op: "#4259ef23", + light_op_deep: "#4259efdd", + light_none: "#4259ef01" + }, + display_mode: { + type: 'auto', + universe: false + }, + related_post: { + enable: false, + limit: 2, + date_type: 'created' + }, + footer: { + information: { + author: false, + left: null, + right: null, + }, + group: null, + randomlink: false, + privacy: null, + license: null, + links: [{ + name: 'Solitude', + url: 'https://github.com/everfu/hexo-theme-solitude', + }] + }, + errorpage: { + img: 'https://7.isyangs.cn/34/65f2e65eae32a-34.png', + text: '404 Not Found', + recommendList: true + }, + says: { + enable: false, + home_mini: false, + style: 1, + strip: 30 + }, + recent_comments: { + enable: false, + limit: 50, + console: false, + page: '/recentcomments/' + }, + envelope: { + enable: false, + line: 10, + speed: 20, + hover: true, + loop: true, + page: '/message/' + }, + meting_api: "https://meting.qjqq.cn/?server=:server&type=:type&id=:id&auth=:auth&r=:r", + music: { + enable: false, + id: '8407304077', + server: 'netease', + type: 'playlist', + volume: 0.8, + mutex: true, + }, + capsule: { + enable: false, + id: '8407304077', + server: 'netease', + type: 'playlist', + }, + keyboard: { + enable: false, + list: [] + }, + lazyload: { + enable: false, + field: 'site', + placeholder: '/img/loading.avif', + errorimg: '/img/error_load.avif' + }, + loading: { + fullpage: false, + pace: true, + }, + highlight: { + enable: true, + limit: 200, + copy: true, + expand: true, + theme: 'default', + color: 'default', + }, + lightbox: false, + fancybox: false, + mediumZoom: false, + mermaid: false, + OpenGraph: { + enable: false, + options: null + }, + wordcount: false, + busuanzi: false, + search: { + enable: false, + type: 'local', + tags: [], + algolia: null, + local: { + preload: false, + CDN: null, + } + }, + rightside: { + enable: false + }, + copy: { + enable: true, + copyright: { + enable: false, + limit: 50 + } + }, + post_ai: { + enable: false, + modelName: 'GPT 3', + key: 'your key', + talk: 'I am a AI.', + randomPost: false, + tips: 'AI is not perfect, please use it with caution.' + }, + katex: { + enable: false, + per_page: false, + copytex: false, + }, + comment: { + use: null, + commentBarrage: false, + lazyload: false, + count: false, + avatar: 'https://cravatar.cn', + }, + twikoo: { + envId: 'your envId', + region: null, + style: true, + accessToken: null, + option: null, + }, + waline: { + envId: 'your envId', + pageview: true, + option: null, + }, + valine: { + appId: 'your appId', + appKey: 'your appKey', + serverURLs: 'your serverURLs', + avatar: 'monsterid', + visitor: false, + style: true, + option: null, + }, + artalk: { + server: 'your server', + site: 'your site-name', + option: null, + }, + verify_site: [], + css_prefix: false, + font: { + 'font-size': '16px', + 'code-font-size': '16px', + 'font-family': 'PingFang SC, Hiragino Sans GB,Microsoft YaHei', + 'code-font-family': 'monospace, monospace', + }, + extends: { + head: [], + body: [], + }, + pwa: { + enable: false, + manifest: '/manifest.json', + theme_color: "#006a73", + mask_icon: '/img/pwa/favicon.ico', + apple_touch_icon: '/img/pwa/favicon.ico', + bookmark_icon: '/img/pwa/favicon.ico', + favicon_32_32: '/img/pwa/favicon_32.ico', + favicon_16_16: '/img/pwa/favicon_16.ico' + }, + google_adsense: { + enable: false, + auto_ads: false, + aside_card: false, + post_card: false, + post_content: false, + enable_page_level_ads: false, + js: 'https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js', + client: '', + slot: '', + }, + right_menu: { + enable: false, + commentBarrage: false, + translate: { + enable: false, + defaultEncoding: 2, + translateDelay: 0, + }, + custom_list: [] + }, + CDN: { + internal: 'local', + third_party: 'cdnjs', + version: true, + custom_format: 'https://cdn.staticfile.net/${cdnjs_name}/${version}/${min_cdnjs_file}', + option: { + solitude_css: 'https://cdn2.codesign.qq.com/icons/7pOrz0WXB5ZWJPX/latest/iconfont.css', + } + } + } + hexo.theme.config = Object.assign(defaultConfig, hexo.theme.config) +}, 1) \ No newline at end of file diff --git a/themes/solitude/scripts/event/page.js b/themes/solitude/scripts/event/page.js new file mode 100644 index 0000000..b4ff82b --- /dev/null +++ b/themes/solitude/scripts/event/page.js @@ -0,0 +1,33 @@ +hexo.extend.generator.register('404', function (locals) { + if(!this.theme.config.page.error)return + return { + path: '404.html', + layout: ['404'], + data: { + type: '404', + comment: false + } + } +}) +hexo.extend.generator.register('tags', function(locals) { + if(!this.theme.config.page.tags)return + return { + path: 'tags/index.html', + layout: ['page'], + data: { + type: 'tags', + comment: false + } + }; +}); +hexo.extend.generator.register('categories', function(locals) { + if(!this.theme.config.page.categories)return + return { + path: 'categories/index.html', + layout: ['page'], + data: { + type: 'categories', + comment: false + } + }; +}); \ No newline at end of file diff --git a/themes/solitude/scripts/event/welcome.js b/themes/solitude/scripts/event/welcome.js new file mode 100644 index 0000000..3883da6 --- /dev/null +++ b/themes/solitude/scripts/event/welcome.js @@ -0,0 +1,14 @@ +hexo.on('ready', () => { + const {version} = require('../../package.json') + hexo.log.info(` + =================================================================== + ##### #### # ##### ###### # # ###### ###### + # # # # # # # # # # # + ##### # # # # # # # # # ###### + # # # # # # # # # # # + ###### #### ##### ##### # ### ###### ###### + ${version} + =================================================================== + GitHub: https://github.com/everfu/hexo-theme-solitude + `) +}) \ No newline at end of file diff --git a/themes/solitude/scripts/filter/checkThemeConfig.js b/themes/solitude/scripts/filter/checkThemeConfig.js new file mode 100644 index 0000000..2eec7f5 --- /dev/null +++ b/themes/solitude/scripts/filter/checkThemeConfig.js @@ -0,0 +1,28 @@ +'use strict'; + +hexo.extend.filter.register('before_post_render', () => { + const data = hexo.locals.get('data'); + const logger = hexo.log; + const theme = hexo.theme.config; + if (theme.hometop.enable && !theme.hometop.banner.icon) { + logger.error('\n 启用banner的情况下,必须提供 icon 图片!\n 请在主题配置文件中设置 hometop.banner.icon 选项。'); + logger.error('\n If banner is enabled, icon image must be supplied! \n Please set the hometop.banner.icon option in the theme configuration file.'); + process.exit(-1); + } + if (theme.says.enable && !data.essay) { + logger.error('\n 启用说说的情况下,必须提供 essay 数据文件!\n 请新建 essay.yaml。'); + logger.error('\n If says is enabled, essay data must be supplied! \n Please create essay.yaml.'); + process.exit(-1); + } + if (theme.footer.randomlink && !data.links){ + logger.error('\n 启用随机链接的情况下,必须提供 links 数据!\n 请新建 links.yaml。'); + logger.error('\n If randomlink is enabled, links data must be supplied! \n Please create links.yaml.'); + process.exit(-1); + } + if (theme.lightbox && !theme.fancybox && !theme.mediumZoom){ + logger.error('\n 启用 lightbox 的情况下,必须提供 fancybox 或 mediumZoom 选项!\n 请在主题配置文件中设置 fancybox 或 mediumZoom 选项。'); + logger.error('\n If lightbox is enabled, fancybox or mediumZoom option must be supplied! \n Please set the fancybox or mediumZoom option in the theme configuration file.'); + process.exit(-1); + } + } +); \ No newline at end of file diff --git a/themes/solitude/scripts/filter/comment.js b/themes/solitude/scripts/filter/comment.js new file mode 100644 index 0000000..8e35272 --- /dev/null +++ b/themes/solitude/scripts/filter/comment.js @@ -0,0 +1,13 @@ +/** + * 将 use 分拆并将首字大写 + */ + +hexo.extend.filter.register('before_generate', () => { + const themeConfig = hexo.theme.config + let { use } = themeConfig.comment + if (!use) return + if (typeof use === 'string') { + use = use.split(',').slice(0,2) + } + themeConfig.comment.use = use.map(item => item.toLowerCase().replace(/\b[a-z]/g, s => s.toUpperCase())) +}) \ No newline at end of file diff --git a/themes/solitude/scripts/filter/default.js b/themes/solitude/scripts/filter/default.js new file mode 100644 index 0000000..18c01b2 --- /dev/null +++ b/themes/solitude/scripts/filter/default.js @@ -0,0 +1,31 @@ +'use strict'; + +hexo.extend.filter.register('after_post_render', function (data) { + data.title = data.title || 'Untitled'; + const {config} = hexo.theme; + if (data.layout === 'post') { + let {copyright, locate, cover} = hexo.theme.config.post.default + cover = cover !== null ? cover : ['/img/default.avif'] + data.locate = data.locate || locate + data.cc = data.cc || copyright + data.cover = data.cover || cover[getRandomInt(0, cover?.length)] + data.excerpt = data.description || data.excerpt + data.toc = !!(config.aside.toc.post && data.toc !== false) + data.ai = data.ai !== false + } + if (data.layout === 'page') { + let {cover} = hexo.theme.config.page.default + cover = cover !== null ? cover : ['/img/default.avif'] + data.cover = data.cover || cover[getRandomInt(0, cover?.length)] + data.excerpt = data.title + data.toc = !!(config.aside.toc.page && data.toc !== false && data.aside); + } + data.comment = !!(config.comment.use && data.comment !== false); + return data; +}); + +function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; +} \ No newline at end of file diff --git a/themes/solitude/scripts/filter/lazyload.js b/themes/solitude/scripts/filter/lazyload.js new file mode 100644 index 0000000..8a19be7 --- /dev/null +++ b/themes/solitude/scripts/filter/lazyload.js @@ -0,0 +1,20 @@ +'use strict' + +const urlFor = require('hexo-util').url_for.bind(hexo) + +const lazyload = (content, img) => { + return content.replace(/( { + const { enable, placeholder, field } = hexo.theme.config.lazyload + if (!enable || field !== 'post') return + data.content = lazyload(data.content, urlFor(placeholder)) + return data +}) \ No newline at end of file diff --git a/themes/solitude/scripts/filter/post_image.js b/themes/solitude/scripts/filter/post_image.js new file mode 100644 index 0000000..e466457 --- /dev/null +++ b/themes/solitude/scripts/filter/post_image.js @@ -0,0 +1,13 @@ +'use strict' + +hexo.extend.filter.register('before_post_render', data => { + const imgTestReg = /\.(png|jpe?g|gif|svg|webp)(\?.*)?$/i + let { cover: coverVal } = data + + // Add path to top_img and cover if post_asset_folder is enabled + if (hexo.config.post_asset_folder) { + if (coverVal && coverVal.indexOf('/') === -1 && imgTestReg.test(coverVal)) data.cover = `${data.path}${coverVal}` + } + + return data +}) \ No newline at end of file diff --git a/themes/solitude/scripts/filter/randomPosts.js b/themes/solitude/scripts/filter/randomPosts.js new file mode 100644 index 0000000..d7d2abf --- /dev/null +++ b/themes/solitude/scripts/filter/randomPosts.js @@ -0,0 +1,5 @@ +hexo.extend.filter.register('after_render:html', function (data) { + const posts = hexo.locals.get('posts').filter(post => post.random !== false).map(post => post.path); + data += ``; + return data; +}); \ No newline at end of file diff --git a/themes/solitude/scripts/helper/getArchiveLength.js b/themes/solitude/scripts/helper/getArchiveLength.js new file mode 100644 index 0000000..0391ab1 --- /dev/null +++ b/themes/solitude/scripts/helper/getArchiveLength.js @@ -0,0 +1,14 @@ +const moment = require('moment') + +hexo.extend.helper.register('getArchiveLength', function (type) { + if (type !== 'year' && type !== 'month') { + type = 'year'; + } + const posts = this.site.posts.sort('-date').data + let archive = {} + for (const post of posts) { + const postdate = type === 'year' ? moment(post.date).format('YYYY') : moment(post.date).format('YYYY/MM'); + archive[postdate] = (archive[postdate] || 0) + 1; + } + return archive; +}); \ No newline at end of file diff --git a/themes/solitude/scripts/helper/inject_head_js.js b/themes/solitude/scripts/helper/inject_head_js.js new file mode 100644 index 0000000..1d84305 --- /dev/null +++ b/themes/solitude/scripts/helper/inject_head_js.js @@ -0,0 +1,86 @@ +/** + * Solitude + * inject is to head + */ + +'use strict'; + +hexo.extend.helper.register('inject_head_js', function () { + const createJS = () => ` + const saveToLocal = { + set: function setWithExpiry(key, value, ttl) { + if (ttl === 0) + return + const now = new Date() + const expiryDay = ttl * 86400000 + const item = { + value: value, + expiry: now.getTime() + expiryDay + } + localStorage.setItem(key, JSON.stringify(item)) + }, + get: function getWithExpiry(key) { + const itemStr = localStorage.getItem(key) + + if (!itemStr) { + return undefined + } + const item = JSON.parse(itemStr) + const now = new Date() + + if (now.getTime() > item.expiry) { + localStorage.removeItem(key) + return undefined + } + return item.value + } + }; + window.utils = { + saveToLocal: saveToLocal, + getCSS: (url, id = false) => new Promise((resolve, reject) => { + const link = document.createElement('link') + link.rel = 'stylesheet' + link.href = url + if (id) link.id = id + link.onerror = reject + link.onload = link.onreadystatechange = function() { + const loadState = this.readyState + if (loadState && loadState !== 'loaded' && loadState !== 'complete') return + link.onload = link.onreadystatechange = null + resolve() + } + document.head.appendChild(link) + }), + getScript: (url, attr = {}) => new Promise((resolve, reject) => { + const script = document.createElement('script') + script.src = url + script.async = true + script.onerror = reject + script.onload = script.onreadystatechange = function() { + const loadState = this.readyState + if (loadState && loadState !== 'loaded' && loadState !== 'complete') return + script.onload = script.onreadystatechange = null + resolve() + } + + Object.keys(attr).forEach(key => { + script.setAttribute(key, attr[key]) + }) + + document.head.appendChild(script) + }), + addGlobalFn: (key, fn, name = false, parent = window) => { + const globalFn = parent.globalFn || {} + const keyObj = globalFn[key] || {} + + if (name && keyObj[name]) return + + name = name || Object.keys(keyObj).length + keyObj[name] = fn + globalFn[key] = keyObj + parent.globalFn = globalFn + }, + } + ` + return `` +}) \ No newline at end of file diff --git a/themes/solitude/scripts/helper/page.js b/themes/solitude/scripts/helper/page.js new file mode 100644 index 0000000..355fb66 --- /dev/null +++ b/themes/solitude/scripts/helper/page.js @@ -0,0 +1,17 @@ +"use strict"; +const { stripHTML, escapeHTML, prettyUrls } = require("hexo-util"); +hexo.extend.helper.register('page_description', function () { + const { config, page } = this + let description = page.description || page.content || page.title || config.description + + if (description) { + description = escapeHTML(stripHTML(description).substring(0, 150) + .trim() + ).replace(/\n/g, ' ').replace(/\s+/g, ' '); + return description + } +}) + +hexo.extend.helper.register("urlNoIndex", function (url = null) { + return prettyUrls(url || this.url, { trailing_index: false, trailing_html: true }); +}); \ No newline at end of file diff --git a/themes/solitude/scripts/helper/related_post.js b/themes/solitude/scripts/helper/related_post.js new file mode 100644 index 0000000..c2ad11d --- /dev/null +++ b/themes/solitude/scripts/helper/related_post.js @@ -0,0 +1,85 @@ +/** + * related post + * from solitude + */ + +'use strict' + +hexo.extend.helper.register('related_posts', function (currentPost, allPosts) { + const relatedPosts = [] + const config = hexo.theme.config + const limitNum = config.related_post.limit || 6 + const dateType = config.related_post.date_type || 'created' + const headlineLang = this._p('star') + + currentPost.tags.forEach(function (tag) { + allPosts.forEach(function (post) { + if (isTagRelated(tag.name, post.tags) && currentPost.path !== post.path) { + const relatedPost = { + title: post.title, + path: post.path, + cover: post.cover, + cover_type: post.cover_type, + weight: 1, + updated: post.updated, + created: post.date + } + const index = findItem(relatedPosts, 'path', post.path) + if (index !== -1) { + relatedPosts[index].weight += 1 + } else { + relatedPosts.push(relatedPost) + } + } + }) + }) + + if (relatedPosts.length === 0) { + return '' + } + + relatedPosts.sort(compare('weight', dateType)) + + let result = '' + return result +}) + +function isTagRelated(tagName, TBDtags) { + return TBDtags.some(function (tag) { + return tagName === tag.name + }) +} + +function findItem(arrayToSearch, attr, val) { + return arrayToSearch.findIndex(function (item) { + return item[attr] === val + }) +} + +function compare(attr, dateType) { + return function (a, b) { + const val1 = a[attr] + const val2 = b[attr] + if (val1 === val2) { + if (dateType === 'created') { + return b.created - a.created + } else if (dateType === 'updated') { + return b.updated - a.updated + } + } + return val2 - val1 + } +} \ No newline at end of file diff --git a/themes/solitude/scripts/helper/stylus.js b/themes/solitude/scripts/helper/stylus.js new file mode 100644 index 0000000..063c07c --- /dev/null +++ b/themes/solitude/scripts/helper/stylus.js @@ -0,0 +1,24 @@ +hexo.extend.filter.register('stylus:renderer', function (style) { + const {config, theme} = this; + const data = hexo.locals.get('data'); + + style.define('$about', data && data.about ? Object.keys(data.about) : false); + style.define('$link', !!(data && data.links) || !!(data && data.tlink)) + style.define('$equipment', !!(data && data.equipment)) + + // highlight + const {syntax_highlighter: syntaxHighlighter, highlight, prismjs} = hexo.config + let {enable: highlightEnable, line_number: highlightLineNumber} = highlight + let {enable: prismjsEnable, line_number: prismjsLineNumber} = prismjs + + // for hexo > 7.0 + if (syntaxHighlighter) { + highlightEnable = syntaxHighlighter === 'highlight.js' + prismjsEnable = syntaxHighlighter === 'prismjs' + } + + style.define('$highlight_enable', highlightEnable) + style.define('$highlight_line_number', highlightLineNumber) + style.define('$prismjs_enable', prismjsEnable) + style.define('$prismjs_line_number', prismjsLineNumber) +}); \ No newline at end of file diff --git a/themes/solitude/scripts/tags/btns.js b/themes/solitude/scripts/tags/btns.js new file mode 100644 index 0000000..3ac6ce0 --- /dev/null +++ b/themes/solitude/scripts/tags/btns.js @@ -0,0 +1,35 @@ +"use strict"; + +function postBtns(args, content) { + return `
+ ${content} +
`; +} + +function postCell(args, content) { + args = args.join(" ").split(","); + let text = args[0] || ""; + let url = args[1] || ""; + text = text.trim(); + url = url.trim(); + if (url.length > 0) { + url = "href='" + url + "'"; + } + let icon = ""; + let img = "https://npm.elemecdn.com/hexo-butterfly-tag-plugins-plus/lib/assets/default.svg"; + if (args.length > 2) { + if (args[2].indexOf(" solitude") > -1) { + icon = args[2].trim(); + } else { + img = args[2].trim(); + } + } + if (icon.length > 0) { + return `${text}`; + } else { + return `${text}`; + } +} + +hexo.extend.tag.register("btns", postBtns, { ends: true }); +hexo.extend.tag.register("cell", postCell); \ No newline at end of file diff --git a/themes/solitude/scripts/tags/button.js b/themes/solitude/scripts/tags/button.js new file mode 100644 index 0000000..84cb905 --- /dev/null +++ b/themes/solitude/scripts/tags/button.js @@ -0,0 +1,21 @@ +"use strict"; + +const urlFor = require("hexo-util").url_for.bind(hexo); + +function btn(args) { + args = args.join(" ").split(","); + let url = args[0] || ""; + let text = args[1] || ""; + let icon = args[2] || ""; + let option = args[3] || ""; + + url = url.trim(); + text = text.trim(); + icon = icon.trim(); + option = option.trim(); + + return ``; +} + +hexo.extend.tag.register("btn", btn, { ends: false }); \ No newline at end of file diff --git a/themes/solitude/scripts/tags/bvideo.js b/themes/solitude/scripts/tags/bvideo.js new file mode 100644 index 0000000..1cc7cf4 --- /dev/null +++ b/themes/solitude/scripts/tags/bvideo.js @@ -0,0 +1,7 @@ +'use strict' + +function bilibili(args) { + return `` +} + +hexo.extend.tag.register('bvideo', bilibili, {ends: false}) diff --git a/themes/solitude/scripts/tags/checkbox.js b/themes/solitude/scripts/tags/checkbox.js new file mode 100644 index 0000000..555746d --- /dev/null +++ b/themes/solitude/scripts/tags/checkbox.js @@ -0,0 +1,51 @@ +'use strict'; + +function postCheckbox(args) { + args = args.join(' ').split(',') + var cls = '' + var text = '' + var checked = false + if (args.length > 1) { + cls = (args[0] || '').trim() + if (cls.length > 0) { + cls = ' ' + cls + } + if (cls.indexOf('checked') > -1) { + checked = true + } + text = (args[1] || '').trim() + } else if (args.length > 0) { + text = (args[0] || '').trim() + } + if (text.length > 0) { + return `
+ ${hexo.render.renderSync({text: text, engine: 'markdown'}).split('\n').join('')} +
` + } +} +function postRadio(args) { + args = args.join(' ').split(',') + var cls = '' + var text = '' + var checked = false + if (args.length > 1) { + cls = (args[0] || '').trim() + if (cls.length > 0) { + cls = ' ' + cls + } + if (cls.indexOf('checked') > -1) { + checked = true + } + text = (args[1] || '').trim() + } else if (args.length > 0) { + text = (args[0] || '').trim() + } + if (text.length > 0) { + return `
+ ${hexo.render.renderSync({text: text, engine: 'markdown'}).split('\n').join('')} +
` + } +} + +hexo.extend.tag.register('checkbox', postCheckbox); +hexo.extend.tag.register('radio', postRadio); \ No newline at end of file diff --git a/themes/solitude/scripts/tags/fold.js b/themes/solitude/scripts/tags/fold.js new file mode 100644 index 0000000..c4db675 --- /dev/null +++ b/themes/solitude/scripts/tags/fold.js @@ -0,0 +1,13 @@ +'use strict' + +function postTabs(args, content) { + const title = args[0] ? args[0] : "" + const open = args[1] ? args[1] : "" + + return `
${title}
${hexo.render.renderSync({ + text: content, + engine: 'markdown' + })}
` +} + +hexo.extend.tag.register('fold', postTabs, {ends: true}) diff --git a/themes/solitude/scripts/tags/gallery.js b/themes/solitude/scripts/tags/gallery.js new file mode 100644 index 0000000..a50b05b --- /dev/null +++ b/themes/solitude/scripts/tags/gallery.js @@ -0,0 +1,37 @@ +'use strict'; + +const urlFor = require('hexo-util').url_for.bind(hexo) + +const galleryBox = args => { + const [name, descr, url, img] = args + const imgUrl = urlFor(img) + const urlLink = urlFor(url) + + return ` + ` +} + +const gallery = (args, content) => { + let html = "" + const regex = /!\[(.*?)\]\(([^\s]*)\s*(?:["'](.*?)["']?)?\s*\)/g + let m + while ((m = regex.exec(content)) !== null) { + if (m.index === regex.lastIndex) { + regex.lastIndex++ + } + html += `` + } + return `` +} + +hexo.extend.tag.register('gallery', gallery, {ends: true}) +hexo.extend.tag.register('galleryGroup', galleryBox) \ No newline at end of file diff --git a/themes/solitude/scripts/tags/image.js b/themes/solitude/scripts/tags/image.js new file mode 100644 index 0000000..f2e26e1 --- /dev/null +++ b/themes/solitude/scripts/tags/image.js @@ -0,0 +1,75 @@ +'use strict'; + +hexo.extend.tag.register('image', function(args) { + args = args.join(' ').split(','); + let url = args[0].trim(); + let alt = ''; + let bg = ''; + let style = ''; + if (args.length > 1) { + for (let i = 1; i < args.length; i++) { + let tmp = args[i].trim(); + if (tmp.includes('alt=')) { + alt = tmp.substring(4, tmp.length); + } else if (tmp.includes('width=')) { + style += 'width:' + tmp.substring(6, tmp.length) + ';'; + } else if (tmp.includes('height=')) { + style += 'height:' + tmp.substring(7, tmp.length) + ';'; + } else if (tmp.includes('bg=')) { + bg = tmp.substring(3, tmp.length); + } + } + } + function img(url, alt, style) { + let img = ''; + img += ' 0) { + img += ' alt="' + alt + '"'; + } + if (style.length > 0) { + img += ' style="' + style + '"'; + } + img += '/>'; + return img; + } + + let ret = ''; + ret += '
'; + ret += '
0) { + ret += ' style="background:' + bg + '"'; + } + ret += '>'; + ret += img(url, alt, style); + ret += '
'; + + if (alt.length > 0) { + ret += '' + alt + ''; + } + + ret += '
'; + return ret; +}); + +hexo.extend.tag.register('inlineimage', function(args) { + args = args.join(' ').split(', '); + let url = args[0].trim(); + let ret = ''; + ret += ' 1) { + for (let i = 1; i < args.length; i++) { + let tmp = args[i].trim(); + if (tmp.includes('height=')) { + style += 'height:' + tmp.substring(7, tmp.length) + ';'; + } + } + } + if (style.length > 0) { + ret += ' style="' + style + '"'; + } else { + ret += ' style="height:1.5em"'; + } + ret += '/>'; + return ret; +}); diff --git a/themes/solitude/scripts/tags/inline-image.js b/themes/solitude/scripts/tags/inline-image.js new file mode 100644 index 0000000..f8c7e0e --- /dev/null +++ b/themes/solitude/scripts/tags/inline-image.js @@ -0,0 +1,12 @@ +'use strict' + +const urlFor = require('hexo-util').url_for.bind(hexo) + +function inlineImg (args) { + const img = args[0] + const height = args[1] ? `style="height:${args[1]}"` : '' + + return `` +} + +hexo.extend.tag.register('inlineimage', inlineImg, { ends: false }) \ No newline at end of file diff --git a/themes/solitude/scripts/tags/label.js b/themes/solitude/scripts/tags/label.js new file mode 100644 index 0000000..1aa1937 --- /dev/null +++ b/themes/solitude/scripts/tags/label.js @@ -0,0 +1,10 @@ +'use strict' + +function addLabel (args, content) { + const text = args[0] + const className = args[1] || 'default' + + return ` ` +} + +hexo.extend.tag.register('label', addLabel, { ends: false }) \ No newline at end of file diff --git a/themes/solitude/scripts/tags/link.js b/themes/solitude/scripts/tags/link.js new file mode 100644 index 0000000..6251e17 --- /dev/null +++ b/themes/solitude/scripts/tags/link.js @@ -0,0 +1,50 @@ +const urlFor = require("hexo-util").url_for.bind(hexo); +function link(args) { + const themeConfig = hexo.theme.config; + args = args.join(" ").split(","); + let title = args[0]; + let sitename = args[1]; + let link = args[2]; + let imgUrl = args[3] || ""; + let favicon = themeConfig.site.siteIcon; + let insideStation = false; + + link = link.trim(); + imgUrl = imgUrl.trim(); + favicon = favicon.trim(); + + try { + new URL(link); + insideStation = false; + } catch (err) { + insideStation = true; + } + + if ((imgUrl === "") && (insideStation === false)) { + let domain = new URL(link).hostname + if (domain) { + imgUrl_online = "https://api.iowen.cn/favicon/" + domain + ".png"; + } + } + + return ` + + + `; +} + +hexo.extend.tag.register("link", link, { ends: false }); \ No newline at end of file diff --git a/themes/solitude/scripts/tags/media.js b/themes/solitude/scripts/tags/media.js new file mode 100644 index 0000000..e4cfdc0 --- /dev/null +++ b/themes/solitude/scripts/tags/media.js @@ -0,0 +1,29 @@ +'use strict'; + +function postAudio(args) { + let src = args[0].trim() + return `
`; +} + +function postVideo(args) { + let src = args[0].trim() + return `
`; +} + +function postVideos(args, content) { + args = args.join(' ').split(',') + var cls = args[0] + if (cls.length > 0) { + cls = ' ' + cls + } + var col = Number(args[1]) || 0; + if (col > 0) { + return `
${content}
` + } else { + return `
${content}
` + } +} + +hexo.extend.tag.register('audio', postAudio); +hexo.extend.tag.register('video', postVideo); +hexo.extend.tag.register('videos', postVideos, {ends: true}); \ No newline at end of file diff --git a/themes/solitude/scripts/tags/mermaid.js b/themes/solitude/scripts/tags/mermaid.js new file mode 100644 index 0000000..21c4d82 --- /dev/null +++ b/themes/solitude/scripts/tags/mermaid.js @@ -0,0 +1,9 @@ +'use strict'; + +const {escapeHTML} = require('hexo-util') + +function postMermaid(args, content) { + return `
${escapeHTML(content)}
`; +} + +hexo.extend.tag.register('mermaid', postMermaid, {ends: true}); \ No newline at end of file diff --git a/themes/solitude/scripts/tags/note.js b/themes/solitude/scripts/tags/note.js new file mode 100644 index 0000000..9ca6316 --- /dev/null +++ b/themes/solitude/scripts/tags/note.js @@ -0,0 +1,13 @@ +/** + * note.js + * transplant from hexo-theme-next + * modified by @efu + */ + +hexo.extend.tag.register('note', function (types, content) { + let type = "" + for (let i = 0; i < types.length; i++) { + type += " " + types[i] + } + return `
${hexo.render.renderSync({text: content, engine: 'markdown'})}
` +}, {ends: true}); \ No newline at end of file diff --git a/themes/solitude/scripts/tags/span.js b/themes/solitude/scripts/tags/span.js new file mode 100644 index 0000000..45ead4a --- /dev/null +++ b/themes/solitude/scripts/tags/span.js @@ -0,0 +1,17 @@ +'use strict'; + +function postP(args) { + args = args.join(' ').split(',') + let p0 = args[0].trim() + let p1 = args[1].trim() + return `

${p1}

`; +} +function postSpan(args) { + args = args.join(' ').split(',') + let p0 = args[0].trim() + let p1 = args[1].trim() + return `${p1}`; +} + +hexo.extend.tag.register('p', postP); +hexo.extend.tag.register('span', postSpan); \ No newline at end of file diff --git a/themes/solitude/scripts/tags/tabs.js b/themes/solitude/scripts/tags/tabs.js new file mode 100644 index 0000000..3202aec --- /dev/null +++ b/themes/solitude/scripts/tags/tabs.js @@ -0,0 +1,61 @@ +/** + * Tabs + * from solitude + */ + +'use strict' + +function postTabs (args, content) { + const tabBlock = /\n([\w\W\s\S]*?)/g + + args = args.join(' ').split(',') + const tabName = args[0] + const tabActive = Number(args[1]) || 0 + + const matches = [] + let match + let tabId = 0 + let tabNav = '' + let tabContent = '' + + !tabName && hexo.log.warn('Tabs block must have unique name!') + + while ((match = tabBlock.exec(content)) !== null) { + matches.push(match[1]) + matches.push(match[2]) + } + + for (let i = 0; i < matches.length; i += 2) { + const tabParameters = matches[i].split('@') + let postContent = matches[i + 1] + let tabCaption = tabParameters[0] || '' + let tabIcon = tabParameters[1] || '' + let tabHref = '' + + postContent = hexo.render.renderSync({ text: postContent, engine: 'markdown' }).trim() + + tabId += 1 + tabHref = (tabName + ' ' + tabId).toLowerCase().split(' ').join('-'); + + ((tabCaption.length === 0) && (tabIcon.length === 0)) && (tabCaption = tabName + ' ' + tabId) + + const isOnlyicon = tabIcon.length > 0 && tabCaption.length === 0 ? ' style="text-align: center;"' : '' + const icon = tabIcon.trim() + tabIcon.length > 0 && (tabIcon = ``) + + const toTop = '' + + const isActive = (tabActive > 0 && tabActive === tabId) || (tabActive === 0 && tabId === 1) ? ' active' : '' + tabNav += `
  • ` + tabContent += `
    ${postContent + toTop}
    ` + } + + tabNav = `` + tabContent = `
    ${tabContent}
    ` + + return `
    ${tabNav + tabContent}
    ` +} + +hexo.extend.tag.register('tabs', postTabs, { ends: true }) +hexo.extend.tag.register('subtabs', postTabs, { ends: true }) +hexo.extend.tag.register('subsubtabs', postTabs, { ends: true }) \ No newline at end of file diff --git a/themes/solitude/scripts/tags/timeline.js b/themes/solitude/scripts/tags/timeline.js new file mode 100644 index 0000000..cd41d7b --- /dev/null +++ b/themes/solitude/scripts/tags/timeline.js @@ -0,0 +1,22 @@ +"use strict" + +function postTimeline(args, content) { + if (args.length > 0) { + return `

    ${args}

    ${content}
    `; + } else { + return `
    ${content}
    `; + } +} + +function postTimenode(args, content) { + args = args.join(" ").split(","); + var time = args[0]; + return `

    ${time}

    ${hexo.render + .renderSync({ text: content, engine: "markdown" }) + .split("\n") + .join("")}
    `; +} + +hexo.extend.tag.register("timeline", postTimeline, { ends: true }); + +hexo.extend.tag.register("timenode", postTimenode, { ends: true }); \ No newline at end of file diff --git a/themes/solitude/source/css/_comments/comment.styl b/themes/solitude/source/css/_comments/comment.styl new file mode 100644 index 0000000..77cdc6b --- /dev/null +++ b/themes/solitude/source/css/_comments/comment.styl @@ -0,0 +1,170 @@ +#post-comment + .comment-head + .comment-headline + display inline-block + vertical-align middle + font-weight 700 + font-size 20px + + #comment-switch + display inline-block + float right + margin .1rem auto 0 + padding .2rem .8rem + width max-content + border-radius 5px + background #f6f8fa + + .first-comment + color #307af6 + + .second-comment + color #ff7242 + + .switch-btn + position relative + display inline-block + margin -4px .4rem 0 + width 42px + height 22px + border-radius 34px + background-color #307af6 + vertical-align middle + cursor pointer + transition all .4s ease 0s + + &::before + position absolute + bottom 4px + left 4px + width 14px + height 14px + border-radius 50% + background-color #fff + content "" + transition all .4s ease 0s + + &.move + background-color #ff7242 + + &::before + transform translateX(20px) + +.post-comment + background var(--efu-card-bg) + +div#post-comment + margin-top 2rem + +#post-comment + > div.comment-head + > div.comment-privacy + display block + justify-content space-between + margin-left 8px + font-size 13px + + > div.comment-privacy + a:hover + color var(--efu-main) + + blockquote + background var(--efu-secondbg) + border var(--style-border) + box-shadow none + margin 0 0 .5rem + font-size .6rem + color var(--efu-secondtext) + border-radius 8px + + if hexo-config('comment.use')[1] + &.move + if hexo-config('comment.count') + .comment-head + .count span:first-child + display none + + .count span:last-child + display inline-block + + #switch-btn::before + transform translateX(20px) + + .comment-wrap + > div:first-child + display none + + > div:last-child + display block + animation 0.5s ease 0s 1 normal none running tabshow + + .comment-head + font-size .8em + margin-bottom .5rem + position relative + + if hexo-config('comment.use')[1] + .count span:last-child + display none + + .comment-switch + display inline-block + float right + margin 2px auto 0 + padding 4px 16px + width max-content + user-select none + + #switch-btn + position relative + display inline-block + margin 0 8px 0 + width 42px + height 22px + border-radius 34px + background-color var(--efu-main) + vertical-align middle + cursor pointer + transition .4s + border var(--style-border-always) + + &::before + position absolute + bottom 3px + left 4px + width 14px + height 14px + border-radius 50% + background-color #fff + content '' + transition .4s + + if hexo-config('comment.use')[1] + .comment-wrap + > div:last-child + display none + + > div:first-child + animation 0.5s ease 0s 1 normal none running tabshow + +#owo-big + position fixed + align-items center + background-color var(--efu-card-bg) + border var(--style-border-always) + border-radius 10px + z-index 9999 + max-width 142px + display none + transform translate(0, -105%) + overflow hidden + animation owoIn .3s cubic-bezier(.42, 0, .3, 1.11) + padding 1rem + +maxWidth768() + display none !important + +if hexo-config('twikoo.style') && 'Twikoo' in hexo-config('comment.use') + @import 'twikoo.styl' + +if hexo-config('valine.style') && 'Valine' in hexo-config('comment.use') + @import 'valine.styl' \ No newline at end of file diff --git a/themes/solitude/source/css/_comments/twikoo.styl b/themes/solitude/source/css/_comments/twikoo.styl new file mode 100644 index 0000000..915e0d3 --- /dev/null +++ b/themes/solitude/source/css/_comments/twikoo.styl @@ -0,0 +1,516 @@ +#twikoo + .tk-submit + margin-top 0 + .tk-admin-config-group-title + margin-top 0 + line-height normal + .tk-row + .tk-col + flex-direction column-reverse !important + + > div.tk-comments + > div.tk-comments-container + > div.tk-comments-title + > span:nth-child(1) + display none !important + + > div.tk-submit + > div.tk-row.actions + > a + display none !important + +.tk-meta + display flex + align-items center + +.twikoo-info + color var(--efu-secondtext) + +.tk-action + .tk-action-link:first-child + display none + +.tk-action-link + color var(--efu-lighttext) !important + cursor pointer + user-select none + padding 0 12px 0 12px + transition all .3s + border-radius 8px + background-color var(--efu-secondbg) + border var(--style-border-always) + + &:hover + background-color var(--efu-lighttext) + color var(--efu-card-bg) !important + + .tk-action-icon svg + fill var(--efu-card-bg) !important + + +.tk-action-icon + svg + transition all .3s + fill var(--efu-lighttext) !important + +.tk-content + img + border-radius 12px + +.tk-avatar + width 32px !important + height 32px !important + box-shadow var(--efu-shadow-border) + margin-right 16px !important + + &.tk-has-avatar + width 32px !important + height 32px !important + border-radius 32px !important + +.tk-row + .tk-avatar + display none + +.tk-avatar + .tk-avatar-img:hover + transform rotate(360deg) + +.tk-nick + font-size 1rem !important + line-height 32px + +#page + .tk-meta-input + .el-input + box-shadow var(--efu-shadow-border) + +.el-loading-mask + background-color none !important + +.tk-tag + margin-left 4px + +.tk-tag-green + border-radius 4px !important + border 0 solid #e1f3d8 !important + font-size .5rem !important + +[data-theme=dark] + .tk-tag-green + background-color #67c23a21 !important + +.tk-tag-yellow + border-radius 4px !important + border 0 solid #e1f3d8 !important + font-size .5rem !important + +[data-theme=dark] + .tk-tag-green + background-color #c0c23a21 !important + +.tk-tag-red + border-radius 4px !important + border 0 solid #f3d8d8 !important + font-size .5rem !important + +[data-theme=dark] + .tk-tag-red + background-color #c23a3a21 !important + +.tk-submit-action-icon.__markdown + display none + +.tk-comments + .el-button--primary + border-color var(--efu-fontcolor) !important + color var(--efu-card-bg) !important + border-radius 12px !important + box-shadow var(--efu-shadow-black) + transition .3s + width 5rem + position absolute + top -44px + right 0 + margin-left .5rem !important + height 34px + + .el-button--primary.is-disabled, + .el-button--primary.is-disabled:active, + .el-button--primary.is-disabled:focus, + .el-button--primary.is-disabled:hover + opacity .2 + +.tk-row-actions-start + position absolute + top -84px + left 17px + +@media screen and (max-width: 768px) + .tk-submit + .el-button--primary + width 5rem + height 122px + top -132px + + .tk-row-actions-start + top -170px + +.tk-comments-title + position absolute + bottom 0 + left 0 + +.tk-extras + margin-top .5rem + padding-bottom .5rem + +.tk-icon.__comments:first-child + display none + +.tk-icon.__comments + margin-left 0 !important + +.tk-row.actions + margin-bottom 0 !important + margin-left 0 !important + margin-top 0 !important + justify-content space-around !important + +.tk-meta-input + position relative !important + margin-top 8px + width calc(100% - 5.5rem) + +.tk-content + .tk-owo-emotion + width 3em + margin 0 2px 0 2px + +.tk-owo-emotion, +.twikoo + .OwO-item + img + pointer-events none + +.tk-extra + background var(--efu-card-bg) + border var(--style-border-always) + padding 1px 5px 1px 2px + border-radius 8px + margin-right 4px !important + color var(--efu-secondtext) !important + display inline !important + margin-top 6px !important + font-size .5rem + +.tk-extra + .tk-icon + display none + +.tk-expand + background var(--efu-card-bg) !important + color var(--efu-fontcolor) !important + border var(--style-border-always) + box-shadow var(--efu-shadow-border) + border-radius 12px + user-select none + + &:hover + background var(--efu-theme) !important + color var(--efu-white) !important + +.tk-time + color var(--efu-secondtext) !important + font-size .6rem + margin-left .5rem + +.tk-comments-container + > .tk-comment + margin-top 0!important + margin-bottom 0.5rem!important + background var(--efu-card-bg) + transition .3s + border-radius 12px + padding 0 + padding-top 0.5rem + border none + border-top var(--style-border-dashed) + +#page + .tk-comments-container + > .tk-comment + padding 1rem 1rem 1.5rem + border var(--style-border) + border-top var(--style-border) + box-shadow var(--efu-shadow-border) + +@media screen and (max-width: 768px) + .tk-comments-container + > .tk-comment + padding 1rem + border var(--style-border-always) + box-shadow var(--efu-shadow-border) + + .tk-icon.__comments + left .5rem + +.tk-icon + position absolute + +.tk-comments-no + display none !important + +.tk-comments-container + min-height 0 !important + +.tk-replies + > .tk-comment + background var(--efu-card-bg) + border-top var(--style-border-dashed) + border-radius 12px + transition .3s + padding 1rem 0 0 + margin-top 0 + +.tk-content + p + margin 0 !important + + pre + code + kbd + samp + font-family ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace + + pre + background var(--efu-secondbg) + padding .5rem + margin 0.5rem 0 + overflow auto + border-radius 0.5em + + +maxWidth768() + max-width 90% + +.tk-replies + .tk-content + span:first-child + font-size .5rem + color var(--efu-secondtext) + +.tk-meta-input + .el-input + .el-input-group__prepend + box-shadow none + border-radius 12px 0 0 12px + user-select none + +@media screen and (max-width: 768px) + .tk-meta-input + .el-input + .el-input-group__prepend + padding 0 .3rem !important + + .tk-meta-input + display flex + flex-direction column + top 0 + position inherit !important + + .tk-meta-input + .el-input + margin-left 0 !important + width 100% !important + + .tk-icon + position absolute + right 0 + +img.tk-avatar-img + height 32px !important + border-radius 32px + border var(--style-border-always) + +.el-input--small + .el-input__inner + padding 8px + .el-input__inner, .el-textarea__inner + border-radius 12px + +.el-input.el-input--small.el-input-group.el-input-group--prepend + border-radius 12px + background var(--efu-secondbg) + border var(--style-border-always) + +.el-input.el-input--small.el-input-group.el-input-group--prepend:nth-child(1):before + content '输入QQ号会自动获取昵称和头像' + +.el-input.el-input--small.el-input-group.el-input-group--prepend:nth-child(2):before + content '收到回复将会发送到你的邮箱' + +.el-input.el-input--small.el-input-group.el-input-group--prepend:nth-child(3):before + content '可以通过昵称访问你的网站' + +.el-input.el-input--small.el-input-group.el-input-group--prepend:focus-within::before + display block + animation commonTipsIn .3s + +.el-input.el-input--small.el-input-group.el-input-group--prepend:focus-within::after + display block + animation commonTriangleIn .3s + +.el-input.el-input--small.el-input-group.el-input-group--prepend::before + display none + position absolute + top -60px + white-space nowrap + border-radius 10px + left 50% + transform translate(-50%) + padding 14px 18px + background #444 + color #fff + z-index 100 + +.el-input.el-input--small.el-input-group.el-input-group--prepend::after + display none + content '' + position absolute + border 12px solid transparent + border-top-color #444 + left 50% + transform translate(-50%, -46px) + +.el-input-group__append, .el-input-group__prepend + background-color var(--efu-card-bg) !important + color var(--efu-fontcolor) !important + border 0 !important + font-weight 700 + +.el-input__inner + background var(--efu-secondbg) !important + border 0 !important + color var(--efu-fontcolor) !important + padding-left 8px + height 32px + line-height 32px + border-radius 12px + +.page + .el-input__inner + background var(--efu-card-bg) !important + +.el-input__inner:focus + border none + +.el-textarea__inner + background var(--efu-secondbg) !important + color var(--efu-fontcolor) !important + border-radius 12px !important + min-height 100px !important + padding 16px 16px 40px 16px !important + border var(--style-border-always) !important + box-shadow none !important + +@media screen and (max-width: 768px) + .el-textarea__inner + background var(--efu-card-bg) !important + +#page + .el-textarea__inner + background var(--efu-card-bg) !important + box-shadow var(--efu-shadow-border) + +.el-textarea__inner:focus + border var(--style-border-hover-always) !important + box-shadow var(--efu-shadow-main) + +.el-button + background-color var(--efu-fontcolor) !important + border 0 solid var(--efu-main) !important + color var(--efu-background) !important + border-radius 8px !important + +.el-button:hover + background var(--efu-black) !important + color var(--efu-white) !important + +.el-button.tk-preview + display none !important + +button.el-button.tk-cancel.el-button--default.el-button--small + background var(--efu-secondbg) !important + border-radius 8px !important + color var(--efu-fontcolor) !important + + +.OwO + &.OwO-open + .OwO-body + animation .3s ease .1s 1 normal both running donate_effcet + .OwO-body + z-index 102 + width 500px + border var(--style-border-always) !important + border-radius 8px !important + overflow hidden + background-color var(--efu-maskbg) !important + backdrop-filter saturate(180%) blur(10px) + -webkit-backdrop-filter blur(10px) + transform translateZ(0) + +maxWidth768() + width 300px + + .OwO-bar + border-top none !important + + .OwO-packages + li + margin-right 0 !important + height 48px + transition .3s + + li:hover + transition .3s + + .OwO-items + .OwO-item:hover + box-shadow var(--efu-shadow-lightblack) !important + border-radius 8px + +#twikoo > div.tk-comments > div.tk-submit > div.tk-row.actions > div > div.tk-action-icon.OwO.OwO-open > div.OwO-body > div > ul > li > span + line-height 48px + font-size 28px + +.OwO-packages + background var(--efu-background) + padding-left 8px !important + +.OwO + .OwO-body + .OwO-bar + .OwO-packages + .OwO-package-active + background var(--efu-secondbg) !important + + .OwO-items-show + margin 12px 8px !important + min-height 197px + + .OwO-bar + .OwO-packages + li + line-height 45px !important + +.tk-replies + .tk-content + margin-top 0 !important + +.el-input-group--prepend + .el-input__inner, .el-input-group__append + border-left-width 0 !important + +.el-textarea .el-input__count + color var(--efu-secondtext) !important + user-select none \ No newline at end of file diff --git a/themes/solitude/source/css/_comments/valine.styl b/themes/solitude/source/css/_comments/valine.styl new file mode 100644 index 0000000..8ff5c10 --- /dev/null +++ b/themes/solitude/source/css/_comments/valine.styl @@ -0,0 +1,250 @@ +#vcomment + .vcount + display none !important + + .vpreview-btn + display none + + .vemoji-btn + position absolute + bottom 4.5px + left 50px + + .vpanel + display flex + flex-direction column + position relative + + .vemojis + display: none; + position: absolute; + left: 0; + right: 0; + max-width: 500px; + color: #4a4a4a; + border: 1px solid rgba(144, 147, 153, 0.31); + top: 6.7rem + z-index: 1000; + animation: .3s ease .1s 1 normal both running donate_effcet + width: 500px; + border: var(--style-border-always) + border-radius: 8px !important; + overflow: hidden; + background-color: var(--efu-maskbg) + backdrop-filter: saturate(180%) blur(10px); + transform: translateZ(0); + overflow-y: auto; + padding: 10px; + + +maxWidth768() + max-width 300px + + .vwrap + flex 1 + display flex + border none !important + padding 0 + overflow: inherit; + flex-direction column-reverse + margin-bottom 0 + + .vheader + display flex + margin .5rem 0 + position relative + width calc(100% - 5.5rem) + gap .5rem + + +maxWidth768() + flex-direction column + + input + border-radius 12px + width calc((100% - 1rem) / 3) + flex 1 + position relative + font-size 13px + background var(--efu-secondbg) + border var(--style-border-always) + padding 6px 10px + line-height 1 + + +maxWidth768() + width 100% + + .vquote + + .vcard + background: var(--efu-card-bg); + border none + border-top: var(--style-border-dashed); + border-radius: 12px; + transition: .3s; + padding: 1rem 0 0; + margin-top: 0; + box-shadow: none; + + .vreply-wrapper + + .vrow .vcol:first-child + bottom 78px + + +maxWidth768() + bottom 164px + + .vrow .vcol.text-right:not(.vctrl) + bottom 31px + + +maxWidth768() + bottom 117px + + .cancel-reply + display flex !important + flex-direction row + justify-content center + margin 0 + + .cancel-reply-btn + position inherit + + .vrow + padding 0 + + .vcol + position absolute + + &:first-child + bottom 56px + left 20px + width auto + + +maxWidth768() + bottom 141px + + &.text-right:not(.vctrl) + bottom 9px + right 0 + transition .3s + border 0 solid var(--efu-main) + width 5rem + margin-left .5rem + border-radius 12px + height 34px + + +maxWidth768() + bottom 94px + + button + background-color var(--efu-fontcolor) + width 100% + height 100% + color var(--efu-card-bg) + border-radius 12px + opacity .2 + + +maxWidth768() + height 119px + + svg + width 18px + height 18px + + #veditor + display block + padding 16px 16px 40px 16px + line-height 1.5 + width 100% + font-size 14px + background var(--efu-secondbg) + color var(--efu-fontcolor) + border-radius 12px + min-height 121px + border var(--style-border-always) + + &:focus + border var(--style-border-hover-always) + box-shadow var(--efu-shadow-main) + + .vcard + margin-top: 0 + margin-bottom: .5rem + background: var(--efu-card-bg); + transition: .3s; + border-radius: 12px; + padding: 0; + padding-top: .5rem; + border: none; + border-top: var(--style-border-dashed); + display: flex; + flex-direction: row; + word-break: break-all; + + +maxWidth768() + padding: 1rem; + border: var(--style-border-always); + box-shadow: var(--efu-shadow-border) + + .vimg + width 32px + height 32px + border-radius 32px + cursor pointer + margin-right 16px + + &:hover + transform: rotate(360deg) + + .vh + flex 1 + padding 0 + border 0 + overflow visible + + .vhead + display flex + align-items center + gap: 5px; + + .vnick + font-size 1rem + line-height 32px + margin-right 0 + + .vsys + background: var(--efu-card-bg); + border: var(--style-border-always); + padding: 3px 5px + border-radius: 8px; + color: var(--efu-secondtext) + display: inline + font-size: .5rem; + + .vat + display: flex; + align-items: center; + color: var(--efu-lighttext) + padding: 3px 12px + transition: all .3s; + border-radius: 8px; + background-color: var(--efu-secondbg); + border: var(--style-border-always); + position: absolute; + right: 0; + bottom: 18px + + &:hover + background-color: var(--efu-lighttext) + color: var(--efu-card-bg) + + .vquote + border-left none + + .vicon.actived + fill var(--efu-main) + +#page + .vcard + padding: 1rem 1rem 1.5rem; + border: var(--style-border); + border-top: var(--style-border); + box-shadow: var(--efu-shadow-border); \ No newline at end of file diff --git a/themes/solitude/source/css/_global/animation.styl b/themes/solitude/source/css/_global/animation.styl new file mode 100644 index 0000000..da898a7 --- /dev/null +++ b/themes/solitude/source/css/_global/animation.styl @@ -0,0 +1,313 @@ +@keyframes barrageIn + 0% + transform translateY(20px) + opacity 0 + 100% + transform translateY(0) + opacity 1 + +@keyframes barrageOut + 0% + transform translateY(0) + opacity 1 + 100% + transform translateY(20px) + opacity 0 + +@keyframes scroll-down-effect + 0% + top 0 + opacity .4 + 50% + top -16px + opacity 1 + filter none + 100% + top 0 + opacity .4 + +@keyframes header-effect + 0% + opacity 0 + transform translateY(-50px) + 100% + opacity 1 + filter none + transform translateY(0) + +@keyframes headerNoOpacity + 0% + transform translateY(-50px) + 100% + transform translateY(0) + +@keyframes bottom-top + 0% + opacity 0 + margin-top 50px + 100% + opacity 1 + filter none + margin-top 0 + +@keyframes titlescale + 0% + opacity 0 + transform scale(.7) + 100% + opacity 1 + filter none + transform scale(1) + +@keyframes search_close + 0% + transform translateY(0) + opacity 1 + 100% + transform translateY(20px) + opacity 0 + +@keyframes to_show + 0% + opacity 0 + 100% + opacity 1 + filter none + +@keyframes to_hide + 0% + opacity 1 + filter none + 100% + opacity 0 + +@keyframes ribbon_to_show + 0% + opacity 0 + 100% + opacity .6 + +@keyframes avatar_turn_around + 0% + transform rotate(0) + 100% + transform rotate(360deg) + +@keyframes sub_menus + 0% + opacity 0 + transform translateY(10px) + 100% + opacity 1 + filter none + transform translateY(0) + +@keyframes donate_effcet + 0% + opacity 0 + transform translateY(-20px) + 100% + opacity 1 + filter none + transform translateY(0) + +@keyframes announ_animation + 0%, 100% + transform scale(1) + filter blur(0) + 50% + transform scale(1.2) + filter blur(20px) + +@keyframes sidebarItem + 0% + transform translateX(200px) + 100% + transform translateX(0) + +@keyframes st-spin + 0% + transform rotate(0) + 100% + transform rotate(360deg) + +@keyframes code-expand-key + 0% + opacity .6 + 50% + opacity .1 + 100% + opacity .6 + +@keyframes slide-in + from + transform translateY(20px) + opacity 0 + to + transform translateY(0) + opacity 1 + +@keyframes slide-in-op + from + opacity 0 + to + opacity 1 + +@keyframes more-btn-move + 0%, 100% + transform translateX(0) + 50% + transform translateX(3px) + +@keyframes toc-open + 0% + transform scale(.7) + 100% + transform scale(1) + +@keyframes toc-close + 0% + transform scale(1) + 100% + transform scale(.7) + +@keyframes configure-clockwise + 0% + transform rotate(0) + 25% + transform rotate(90deg) + 50% + transform rotate(180deg) + 75% + transform rotate(270deg) + 100% + transform rotate(360deg) + +@keyframes configure-xclockwise + 0% + transform rotate(45deg) + 25% + transform rotate(-45deg) + 50% + transform rotate(-135deg) + 75% + transform rotate(-225deg) + 100% + transform rotate(-315deg) + +@keyframes tabshow + 0% + transform translateY(15px) + 100% + transform translateY(0) + +@keyframes snackbar-progress + from + width 0 + to + width 100% + +@keyframes move-forever + 0% + transform translate3d(-90px, 0, 0) + 100% + transform translate3d(85px, 0, 0) + +@keyframes rowup + from + transform translateY(0) + to + transform translateY(-50%) + +@keyframes rowleft + from + transform translateX(0) + to + transform translateX(-50%) + +@keyframes gradient + 0% + background-position 0 50% + 50% + background-position 100% 50% + 100% + background-position 0 50% + +@keyframes commonTipsIn + 0% + top -50px + opacity 0 + 100% + top -60px + opacity 1 + +@keyframes commonTriangleIn + 0% + transform translate(-50%, -36px) + opacity 0 + 100% + transform translate(-50%, -46px) + opacity 1 + +@keyframes owoIn + 0% + transform translate(0, -95%) + opacity 0 + 100% + transform translate(0, -105%) + opacity 1 + +@keyframes light_tag + 0% + transform skewx(0) + -o-transform skewx(0) + -moz-transform skewx(0) + -webkit-transform skewx(0) + left -150px + 99% + transform skewx(-25deg) + -o-transform skewx(-25deg) + -moz-transform skewx(-25deg) + -webkit-transform skewx(-25deg) + left 50px + +@keyframes floating + 0% + transform translate(0, -4px) + 50% + transform translate(0, 4px) + 100% + transform translate(0, -4px) + +@media screen and (min-width: 768px) + @keyframes showCover + from + opacity 0 + transform rotate(10deg) translateY(-8%) scale(1.8) + to + opacity 0.5 + transform rotate(10deg) translateY(-10%) scale(2) + +@keyframes blinking-cursor + 0% + transform scale(.6) + 25% + transform scale(1) + 50% + transform scale(.6) + 75% + transform scale(1) + 100% + transform scale(.6) + +@keyframes AILoading + 0% + opacity 1 + 25% + opacity .3 + 50% + opacity 1 + 75% + opacity .3 + 100% + opacity 1 \ No newline at end of file diff --git a/themes/solitude/source/css/_global/function.styl b/themes/solitude/source/css/_global/function.styl new file mode 100644 index 0000000..e4756fc --- /dev/null +++ b/themes/solitude/source/css/_global/function.styl @@ -0,0 +1,92 @@ +maxWidth600() + @media screen and (max-width: 600px) + {block} + +maxWidth768() + @media screen and (max-width: 768px) + {block} + +minWidth768() + @media screen and (min-width: 768px) + {block} + +maxWidth798() + @media screen and (max-width: 798px) + {block} + +minWidth798() + @media screen and (min-width: 798px) + {block} + +maxHeight800() + @media screen and (max-height: 800px) + {block} + +maxWidth899() + @media screen and (max-width: 899px) + {block} + +minWidth899() + @media screen and (min-width: 899px) + {block} + +maxWidth900() + @media screen and (max-width: 900px) + {block} + +minWidth900() + @media screen and (min-width: 900px) + {block} + +minWidth901() + @media screen and (min-width: 901px) + {block} + +maxWidth1000() + @media screen and (max-width: 1000px) + {block} + +minWidth1000() + @media screen and (min-width: 1000px) + {block} + +maxWidth1024() + @media screen and (max-width: 1024px) + {block} + +maxWidth1200() + @media screen and (max-width: 1200px) + {block} + +minWidth1200() + @media screen and (min-width: 1200px) + {block} + +minWidth1201() + @media screen and (min-width: 1201px) + {block} + +maxWidth1300() + @media screen and (max-width: 1300px) + {block} + +minWidth1300() + @media screen and (min-width: 1300px) + {block} + +maxWidth1400() + @media screen and (max-width: 1400px) + {block} + +minWidth1400() + @media screen and (min-width: 1400px) + {block} + +minWidth2000() + @media screen and (min-width: 2000px) + {block} + +.limit-more-line + display: -webkit-box + overflow: hidden + -webkit-box-orient: vertical \ No newline at end of file diff --git a/themes/solitude/source/css/_global/index.styl b/themes/solitude/source/css/_global/index.styl new file mode 100644 index 0000000..667049f --- /dev/null +++ b/themes/solitude/source/css/_global/index.styl @@ -0,0 +1,434 @@ +:root + --efu-white #fff + --efu-white-op rgba(255, 255, 255, 0.2) + --efu-black #000 + --efu-black-op rgba(0, 0, 0, 0.2) + --efu-none #00000000 + --efu-gray #999999 + --efu-gray-op #9999992b + --efu-cyan #00bcd4 + --efu-cyan-op #00bcd42b + --efu-vip #e5a80d + --efu-speed #57bd6a + --efu-main var(--efu-theme) + --efu-main-op var(--efu-theme-op) + --efu-main-op-deep var(--efu-theme-op-deep) + --efu-main-op-light var(--efu-theme-op-light) + --efu-main-none var(--efu-theme-none) + --efu-shadow-theme 0 8px 12px -3px var(--efu-theme-op) + --efu-shadow-blackdeep 0 2px 16px -3px rgba(0, 0, 0, .15) + --efu-shadow-main 0 8px 12px -3px var(--efu-main-op) + --efu-shadow-blue 0 8px 12px -3px rgba(40, 109, 234, .20) + --efu-shadow-white 0 8px 12px -3px rgba(255, 255, 255, .20) + --efu-shadow-black 0 0 12px 4px rgba(0, 0, 0, .05) + --efu-shadow-yellow 0px 38px 77px -26px rgba(255, 201, 62, .12) + --efu-shadow-red 0 8px 12px -3px #ee7d7936 + --efu-shadow-green 0 8px 12px -3px #87ee7936 + --efu-logo-color linear-gradient(215deg, #4584ff 0%, #cf0db9 100%) + --efu-snackbar-time 5s + --global-font-size 14px + --global-bg #fff + --hr-border #97bcfb + --hr-before-color #6ea2f9 + --search-bg #f6f8fa + --search-input-color #4c4948 + --search-result-title #4c4948 + --preloader-bg #37474f + --preloader-color #fff + --tab-border-color #f0f0f0 + --tab-botton-bg #f0f0f0 + --tab-botton-color #1f2d3d + --tab-button-hover-bg #dcdcdc + --tab-button-active-bg #fff + --sidebar-bg #f6f8fa + --btn-hover-color #ff7242 + --btn-color #fff + --btn-bg #307af6 + --text-bg-hover #307af6 + --light-grey #eee + --text-highlight-color #1f2d3d + --blockquote-color #6a737d + --blockquote-bg rgba(73, 177, 245, 0.1) + --reward-pop #f5f5f5 + --toc-link-color #666261 + --card-box-shadow 0 3px 8px 6px rgba(7, 17, 27, 0.06) + --card-hover-box-shadow 0 3px 8px 6px rgba(7, 17, 27, 0.15) + --offset 0px + --hlscrollbar-bg #121212 + +body + position relative + min-height 100% + background var(--efu-background) + color var(--efu-fontcolor) + font-size $font-size + font-family $font-family + line-height 2 + -webkit-tap-highlight-color transparent + margin 0 + if !hexo-config('copy.enable') + user-select none + -webkit-user-select none + +* + box-sizing border-box + +html + line-height 1.15 + -webkit-text-size-adjust 100% + text-size-adjust 100% + height: 100%; + font-size: 20px + overflow-y: overlay + +main + display block + +// scrollbar - chrome/safari +*::-webkit-scrollbar + width 12px + height 6px + +*::-webkit-scrollbar-thumb + background var(--scrollbar-color) + opacity .5 + border-radius 8px + cursor pointer + border 2px solid var(--efu-background) + + &:hover + background var(--efu-lighttext) + display block + +*::-webkit-scrollbar-track + background-color transparent + +::-webkit-scrollbar-thumb + background var(--efu-card-border) + opacity .5 + border-radius 8px + cursor pointer + border 2px solid var(--efu-background) + +::-webkit-scrollbar-thumb:hover + background var(--efu-main) + opacity 1 + display block !important + +::-webkit-scrollbar-track + background-color var(--efu-none) + +if hexo-config('lazyload.enable') && !hexo-config('lazyload.placeholder') + img + &[data-lazy-src]:not(.loaded) + filter blur(8px) brightness(1) + + &[data-lazy-src].error + filter none + +::selection + background var(--efu-main) + color var(--efu-white) + +h1 + font-size 2em + margin .67em 0 + +h1, h2, h3, h4, h5, h6 + padding-top 0 + padding-left 0 + font-weight 700 + position relative + margin .5rem 0 + color var(--efu-fontcolor) + +hr + box-sizing content-box + height 0 + overflow visible + display: none + +pre + font-family monospace, monospace + +a + color var(--efu-fontcolor) + text-decoration none + transition all .3s ease 0s + overflow-wrap break-word + -webkit-user-drag none + +abbr[title] + border-bottom none + text-decoration underline dotted + +b, strong + font-weight bolder + +code, kbd, samp + font-family $code-font-family + font-size $code-font-size + +small + font-size 80% + +sub, sup + font-size 75% + line-height 0 + position relative + vertical-align baseline + +sub + bottom -.25em + +sup + top -.5em + +button, input, optgroup, select, textarea + font-family inherit + font-size 100% + line-height 1.15 + margin 0 + +button, input + overflow visible + +input::placeholder + color var(--efu-gray) + +button, select + text-transform none + +[type=button], [type=reset], [type=submit], button + appearance button + +fieldset + padding .35em .75em .625em + +legend + box-sizing border-box + color inherit + display table + max-width 100% + padding 0 + white-space normal + +progress + vertical-align baseline + +textarea + overflow auto + +[type=checkbox], [type=radio] + box-sizing border-box + padding 0 + +[type=number]::-webkit-inner-spin-button, [type=number]::-webkit-outer-spin-button + height auto + +[type=search] + appearance textfield + outline-offset -2px + +[type=search]::-webkit-search-decoration + appearance none + +input[type=checkbox] + label::before, input[type=radio] + label::before + content '' + display inline-block + width 16px + height 16px + border 1px solid #999 + background-color #fff + margin-right 5px + vertical-align middle + +::-webkit-file-upload-button + appearance button + font inherit + +summary + display list-item + +template + display none + +[hidden] + display none + +input::placeholder + color var(--efu-fontcolor) + +.table-wrap + overflow-x scroll + margin 0 0 1rem + +table + width 100% + border-spacing 0 + border-collapse collapse + empty-cells show + + +maxWidth768() + display block + overflow-x auto + + &::-webkit-scrollbar + display none + +table thead + background var(--efu-secondbg) + +table td, table th + padding .3rem .6rem + border var(--style-border-always) + vertical-align middle + min-width 100px + +button + padding 0 + outline 0 + border none + color var(--efu-fontcolor) + background 0 0 + cursor pointer + +img + border-style none + max-width 100% + transition all .2s ease 0s + -webkit-user-drag none + +img:not([src]), img[src=""] + opacity 0 + +.img-alt + font-size 12px + margin 0 + margin-top 8px + color var(--efu-secondtext) + +.is-center + text-align center + display flex + flex-wrap wrap + justify-content center + flex-direction row + align-items center + +iframe + border-radius 12px + +.copy-true + user-select all + +.pull-left + float left + +.pull-right + float right + +blockquote + border var(--style-border-always) + background-color var(--efu-secondbg) + color var(--efu-secondtext) + border-radius 8px + margin 1rem 0 + padding .5rem .8rem + +li, ul + list-style none + display block + margin 0 + padding 0 + +[data-theme=dark] img + filter brightness(1) + +a.extend + .next + right 0 + + .prev + left 0 + +b, strong + color var(--efu-lighttext) + +.button--animated + border-radius 8px + transition .3s + position relative + +i.solitude + font-size 22px + line-height 1 + font-synthesis style + +.layout + display: flex + margin: 0 auto + padding: 0 1.5rem + max-width: 1200px + +maxWidth768() + padding 0 + + &#content-inner + max-width: 1400px + + /.hide-aside.layout + max-width: 1400px + + > div + width: 100% !important + + > div:first-child + width calc(100% - 300px) + + +maxWidth1200() + width 100% + + > #post, #category, #tag, #archive + box-shadow var(--efu-shadow-border) + padding 1rem 2rem + border-radius 12px + background var(--efu-card-bg) + border var(--style-border) + align-self flex-start + animation slide-in .6s .1s backwards + position relative + if hexo-config('aside.position') == 0 + order 2 + + +maxWidth768() + box-shadow none + border none + padding 0 1rem + background var(--efu-background) + +.show + opacity 1 !important + pointer-events all !important + +span.tags-punctuation::before + content: "\e071" + font-family: solitude, serif !important + font-size: 12px + transition none + margin-right: 2px + opacity: .4 + + .hide-aside #page & + font-size 16px + + #post-info & + font-size 14px + line-height 32px + +if hexo-config('memorial.enable') + .memorial + -webkit-filter grayscale(100%) + -moz-filter grayscale(100%) + -ms-filter grayscale(100%) + -o-filter grayscale(100%) + filter grayscale(100%) \ No newline at end of file diff --git a/themes/solitude/source/css/_highlight/color.styl b/themes/solitude/source/css/_highlight/color.styl new file mode 100644 index 0000000..0c312a9 --- /dev/null +++ b/themes/solitude/source/css/_highlight/color.styl @@ -0,0 +1,72 @@ +$highlight_color = hexo-config('highlight.color') + +if $highlight_color == "default" + $highlight-variable-dark = #569CD6 + $highlight-number-dark = #B5CEA8 + $highlight-string-dark = #CE9178 + $highlight-title-dark = #DCDCAA + $highlight-emphasis-dark = #6A9955 + $highlight-variable-light = #0000FF + $highlight-number-light = #098658 + $highlight-string-light = #A31515 + $highlight-title-light = #795E26 + $highlight-emphasis-light = #0451A5 + $highlight-parameter-dark = #FFB86C + $highlight-parameter-light = #FFB86C + $highlight-comment-dark = $highlight-string-dark + $highlight-comment-light = $highlight-string-light + $highlight-deleted = #f00 + $highlight-inserted = #35cd4b +else if $highlight_color == "solidity" + $highlight-variable-dark = #D74BDE + $highlight-number-dark = #8DA1A0 + $highlight-string-dark = #5B876D + $highlight-title-dark = #D74BDE + $highlight-emphasis-dark = #BA9C23 + $highlight-variable-light = #0000FF + $highlight-number-light = #098658 + $highlight-string-light = #A31515 + $highlight-title-light = #795E26 + $highlight-emphasis-light = #0451A5 + $highlight-parameter-dark = #FFB86C + $highlight-parameter-light = #FFB86C + $highlight-comment-dark = $highlight-string-dark + $highlight-comment-light = $highlight-string-light + $highlight-deleted = #f00 + $highlight-inserted = #35cd4b +else if $highlight_color == "dracula" + $highlight-variable-dark = #FF79C6 + $highlight-number-dark = #BD93F9 + $highlight-string-dark = #F1FA8C + $highlight-title-dark = #50FA7B + $highlight-emphasis-dark = #8BE9FD + $highlight-variable-light = #FF79C6 + $highlight-number-light = #BD93F9 + $highlight-string-light = #A31515 + $highlight-title-light = #795E26 + $highlight-emphasis-light = #0451A5 + $highlight-parameter-dark = #FFB86C + $highlight-parameter-light = #FFB86C + $highlight-comment-dark = #6272A4 + $highlight-comment-light = #6272A4 + $highlight-important-dark = #BD93F9 + $highlight-important-light = #BD93F9 + $highlight-deleted = #f00 + $highlight-inserted = #35cd4b +else + $highlight-variable-dark = #569CD6 + $highlight-number-dark = #B5CEA8 + $highlight-string-dark = #CE9178 + $highlight-title-dark = #DCDCAA + $highlight-emphasis-dark = #6A9955 + $highlight-variable-light = #0000FF + $highlight-number-light = #098658 + $highlight-string-light = #A31515 + $highlight-title-light = #795E26 + $highlight-emphasis-light = #0451A5 + $highlight-parameter-dark = #FFB86C + $highlight-parameter-light = #FFB86C + $highlight-comment-dark = $highlight-string-dark + $highlight-comment-light = $highlight-string-light + $highlight-deleted = #f00 + $highlight-inserted = #35cd4b \ No newline at end of file diff --git a/themes/solitude/source/css/_highlight/highlight/diff.styl b/themes/solitude/source/css/_highlight/highlight/diff.styl new file mode 100644 index 0000000..79251b1 --- /dev/null +++ b/themes/solitude/source/css/_highlight/highlight/diff.styl @@ -0,0 +1,51 @@ +figure.highlight + table::-webkit-scrollbar + color var(--efu-secondbg) + height 6px + background var(--efu-hl-bg) + border-radius 6px + display initial + + .keyword + .attr + .variable + .literal + .property + color $highlight-variable-light + + .number + color $highlight-number-light + + .string + color $highlight-string-light + + .built_in + .title + .params + .name + color $highlight-title-light + + .emphasis + color $highlight-emphasis-light + + [data-theme=dark] & + .keyword + .attr + .variable + .property + color $highlight-variable-dark + + .number + color $highlight-number-dark + + .string + color $highlight-string-dark + + .built_in + .built_in + .title + .params + color $highlight-title-dark + + .emphasis + color $highlight-emphasis-dark \ No newline at end of file diff --git a/themes/solitude/source/css/_highlight/highlight/index.styl b/themes/solitude/source/css/_highlight/highlight/index.styl new file mode 100644 index 0000000..bad87fd --- /dev/null +++ b/themes/solitude/source/css/_highlight/highlight/index.styl @@ -0,0 +1,46 @@ +@import "diff" +figure + pre + margin 0 + padding 8px 0 + border none + table + display block + border none + overflow-y hidden + overflow-x auto + + td + padding 0 + border none + height 100% + + &.gutter + opacity .6 + user-select none + min-width initial + + pre + overflow auto + line-height 1.6 + margin 0 + padding 8px .5rem + border none + color var(--efu-secondtext) + background var(--efu-secondbg) + border-right var(--style-border-always) + text-align center + + &.code + width 100% + display flex + position relative + + pre + padding-right .5rem + padding-left .5rem + width 100% + + .line + &.marked + background-color: rgba(97, 97, 97, .314) \ No newline at end of file diff --git a/themes/solitude/source/css/_highlight/index.styl b/themes/solitude/source/css/_highlight/index.styl new file mode 100644 index 0000000..9f19a9e --- /dev/null +++ b/themes/solitude/source/css/_highlight/index.styl @@ -0,0 +1,117 @@ +@import "color" + +@import "theme/" + hexo-config('highlight.theme') + +if $highlight_enable + @require "highlight/index.styl" + +if $prismjs_enable + @require "prismjs/index.styl" + +figure + &:hover + box-shadow var(--efu-shadow-border-hover) + + .copy-btn + position absolute + top 1rem + right 1rem + z-index 10 + color var(--efu-fontcolor) + cursor pointer + transition all .2s ease 0s + + &:hover + color var(--efu-lighttext) + + &.highlight + background-color var(--efu-hl-bg) + color var(--efu-fontcolor) + border var(--style-border-always) + overflow hidden + border-radius 8px 8px 4px 4px + position relative + margin .5rem 0 .5rem + padding 0 + line-height 1.6 + + .highlight-tools + position relative + display flex + -webkit-box-align center + align-items center + overflow hidden + min-height 1.2rem + border-radius 8px 8px 0 0 + height 2.15em + font-size 16px + background var(--efu-hltools-bg) + border-bottom var(--style-border-always) + color var(--efu-fontcolor) + + &.closed + .expand + transition all .3s ease 0s + + & ~ * + display none + + .st-copy-fill + position absolute + cursor pointer + transition color .2s + font-size 18px + + .st-copy-fill:hover + color var(--efu-main) + + .expand + position absolute + padding 0.4rem 0.3rem + cursor pointer + transition transform .3s ease 0s + + .code-lang + text-transform capitalize + position absolute + font-weight 700 + font-size 1.15em + user-select none + + .code-expand-btn + background var(--efu-hltools-bg) + transition .3s + backdrop-filter saturate(180%) blur(20px) + transform translateZ(0) + border-top var(--style-border-always) + position absolute + bottom 0 + z-index 1 + width 100% + text-align center + font-size 16px + cursor pointer + display flex + align-items center + justify-content center + height 32px + + i + color var(--efu-fontcolor) + line-height 1 + animation 1.2s ease 0s infinite normal none running code-expand-key + + &:hover + background var(--efu-main) + + i + color var(--efu-white) + + &.expand-done + display none + + &:not(.expand-done) + & ~ table, + & ~ pre + overflow: hidden + height: unit(hexo-config('highlight.limit'), px) \ No newline at end of file diff --git a/themes/solitude/source/css/_highlight/prismjs/diff.styl b/themes/solitude/source/css/_highlight/prismjs/diff.styl new file mode 100644 index 0000000..9f143cc --- /dev/null +++ b/themes/solitude/source/css/_highlight/prismjs/diff.styl @@ -0,0 +1,80 @@ +pre[class*='language-'] + + .keyword + .function + color $highlight-variable-light + + .operator + color $highlight-variable-light + + .number + color $highlight-number-light + + .property + .class-name + .title + color $highlight-title-light + + .string + color $highlight-string-light + + .parameter + color $highlight-parameter-light + + .blockquote + cikir $highlight-emphasis-light + + .comment + color $highlight-comment-light + + .atrule + color $highlight-emphasis-light + + .boolean + color $highlight-important-light + + .deleted + color $highlight-deleted + + .inserted + color $highlight-inserted + + [data-theme='dark'] & + .keyword + .function + color $highlight-variable-dark + + .operator + color $highlight-variable-dark + + .number + color $highlight-number-dark + + .property + .class-name + .title + color $highlight-title-dark + + .string + color $highlight-string-dark + + .parameter + color $highlight-parameter-dark + + .blockquote + color $highlight-emphasis-dark + + .comment + color $highlight-comment-dark + + .atrule + color $highlight-emphasis-dark + + .boolean + color $highlight-important-dark + + .deleted + color $highlight-deleted + + .inserted + color $highlight-inserted \ No newline at end of file diff --git a/themes/solitude/source/css/_highlight/prismjs/index.styl b/themes/solitude/source/css/_highlight/prismjs/index.styl new file mode 100644 index 0000000..250458e --- /dev/null +++ b/themes/solitude/source/css/_highlight/prismjs/index.styl @@ -0,0 +1,15 @@ +@require line-number + +@require diff + +#article-container + pre[class*='language-'] + margin 0 + overflow-x auto + scrollbar-color var(--hlscrollbar-bg) transparent + + &::-webkit-scrollbar-thumb + background var(--hlscrollbar-bg) + + &:not(.line-numbers) + padding 10px 20px \ No newline at end of file diff --git a/themes/solitude/source/css/_highlight/prismjs/line-number.styl b/themes/solitude/source/css/_highlight/prismjs/line-number.styl new file mode 100644 index 0000000..e70d1d1 --- /dev/null +++ b/themes/solitude/source/css/_highlight/prismjs/line-number.styl @@ -0,0 +1,28 @@ +#article-container + pre[class*='language-'] + &.line-numbers + position relative + + > code + display block + position relative + padding 8px 0 8px 58px + + .line-numbers-rows + position absolute + top 0 + left 0 + color var(--efu-secondtext) + border-right var(--style-border-always) + width 45px + padding 8px 0 + + & > span + display block + counter-increment linenumber + pointer-events none + text-align center + + &:before + padding 0 0.5em + content counter(linenumber) \ No newline at end of file diff --git a/themes/solitude/source/css/_highlight/theme/default.styl b/themes/solitude/source/css/_highlight/theme/default.styl new file mode 100644 index 0000000..c68cce7 --- /dev/null +++ b/themes/solitude/source/css/_highlight/theme/default.styl @@ -0,0 +1,14 @@ +figure + &.highlight + .highlight-tools + .st-copy-fill + right .7rem + + &.closed + .expand + transform rotate(-90deg) + + .expand + & + .code-lang + left 1.7rem + diff --git a/themes/solitude/source/css/_highlight/theme/mac.styl b/themes/solitude/source/css/_highlight/theme/mac.styl new file mode 100644 index 0000000..c5ca45c --- /dev/null +++ b/themes/solitude/source/css/_highlight/theme/mac.styl @@ -0,0 +1,26 @@ +figure + &.highlight + .highlight-tools + .st-copy-fill + right 1.7rem + + &:after + position absolute + left 14px + width 12px + height 12px + border-radius 50% + background #fc625d + -webkit-box-shadow 20px 0 #fdbc40, 40px 0 #35cd4b + box-shadow 20px 0 #fdbc40, 40px 0 #35cd4b + content ' ' + + .expand + right 0 + + & + .code-lang + left 75px + + &.closed + .expand + transform rotate(90deg) \ No newline at end of file diff --git a/themes/solitude/source/css/_layout/article-container.styl b/themes/solitude/source/css/_layout/article-container.styl new file mode 100644 index 0000000..228666d --- /dev/null +++ b/themes/solitude/source/css/_layout/article-container.styl @@ -0,0 +1,205 @@ +#article-container + overflow-wrap break-word + +maxWidth768() + overflow hidden + + iframe + border-radius 12px + margin 0 0 1rem + + a + color var(--efu-fontcolor) + border-radius 4px 4px 0 0 + border-bottom 2px dotted var(--efu-lighttext) + font-weight 700 + + &.fancybox + border-bottom none + + &:not(.fancybox) + padding 0 4px + + &:hover + border 0 + text-decoration none + color var(--efu-white) + border-radius 4px + background var(--efu-main) + + .table-wrap + margin 1rem 0 + border-radius 8px + overflow-x scroll + + a.headerlink + float right + opacity .08 + position relative + padding 0 + border none + border-radius 8px + line-height 1 + font-size .8rem + + #page & + display none + + &::before + content "\e082" + font-family solitude + cursor pointer + + &:hover + border-bottom none + box-shadow none + background var(--efu-none) + color var(--efu-lighttext) + opacity 1 + + p + font-size .9rem + line-height 1.7 + font-weight 400 + margin 1rem 0 + text-align left + letter-spacing .6px + + a + &:not(.fancybox) + text-decoration none + border-bottom 2px dotted var(--efu-lighttext) + color var(--efu-fontcolor) + font-weight 700 + padding 0 4px + border-radius 4px 4px 0 0 + + &:hover + color var(--efu-white) + border-radius 4px + background var(--efu-main) + + blockquote + p + padding 0 + margin 0 + font-size 15px + + code:not([class*='language-']) + color var(--efu-white) + padding 0.2rem 0.4rem + border-radius 4px + margin 0 4px + background var(--efu-pink) + line-height 2 + box-shadow var(--efu-shadow-border) + + img + border-radius 12px + object-fit cover + display block + margin 0.8rem auto + max-width 90% + max-height 450px + + ul, ol + padding 0 + margin-top 0.4rem + list-style none + counter-reset li 0 + + li + &:before + position absolute + top 0 + left 0 + color var(--efu-fontcolor) + transition all .3s ease-out 0s + background var(--efu-lighttext) + + &:not(.tab) + position relative + margin 0.2rem 0 + + p + margin 0 + + ul + > li + &:not(.tab) + padding 0.2em 0.2em 0.2em 1.4em + + &:before + margin 0 + top 0.78em + width 0.42em + height 0.42em + border-radius 0.42em + background 0 0 + content "" + line-height .42em + border 0.21em solid var(--efu-lighttext) + background var(--efu-lighttext) + + ol + > li:before + margin-top .65em + width 1.45em + height 1.45em + border-radius .725em + text-align center + font-size .85em + color var(--efu-white) + line-height 1.45em + + ul li + line-height 1.7 + + > li + + &:not(.tab) + padding .2em .2em .2em 1.8em + + &:before + content counter(li) + counter-increment li 1 + + > ol + > li + &:before + content counter(li, lower-alpha) + counter-increment li + + > ol + > li + &:before + content counter(li, lower-roman) + counter-increment li + + &.post-content + h1, h2, h3, h4 + display flex + align-items center + justify-content space-between + flex-direction row-reverse + transition all .2s ease-out 0s + + h1 + font-size 1.5rem + line-height 1.3 + + h2 + font-size 1.3rem + line-height 1.3 + border-top 1px dashed var(--efu-theme-op) + padding-top 1rem + + h3, h4 + font-size 1.1rem + line-height 1.3 + +if hexo-config('mediumZoom') + .medium-zoom--opened .medium-zoom-overlay + z-index 10 + + .medium-zoom-image--opened + z-index 11 \ No newline at end of file diff --git a/themes/solitude/source/css/_layout/article-sort.styl b/themes/solitude/source/css/_layout/article-sort.styl new file mode 100644 index 0000000..0df17f3 --- /dev/null +++ b/themes/solitude/source/css/_layout/article-sort.styl @@ -0,0 +1,93 @@ +.article-sort-title + font-weight 700 + font-size 2em + + sup + margin-left 4px + font-size 16px + font-weight 700 + opacity .4 + top -1em + +.article-sort + .article-sort-item + position relative + display flex + -webkit-box-align center + align-items center + margin 0 0 1rem 0 + transition all .2s ease-in-out 0s + overflow hidden + + &.year + font-size .8rem + color var(--efu-secondtext) + margin 0 0 .2rem 0 + + .article-sort-item-img + border-radius 12px + min-width 151px + min-height 80px + background var(--efu-secondbg) + overflow hidden + width 80px + height 80px + + +maxWidth768() + min-width 80px + + img + width 100% + height 100% + transition all .6s ease 0s + object-fit cover + + .article-sort-item-info + padding 0 0.8rem + display flex + flex-direction column + -webkit-box-flex 1 + flex 1 1 0 + + a + overflow hidden + text-overflow ellipsis + + &:hover + color var(--efu-theme) + + .article-sort-item-title + color var(--efu-fontcolor) + font-size 1.1em + transition all .3s ease 0s + line-height 1.3 + -webkit-line-clamp 1 + order 0 + font-weight 700 + + +maxWidth768() + -webkit-line-clamp 2 + + .article-sort-item-tags + margin-top 8px + white-space nowrap + overflow hidden + text-overflow ellipsis + width 100% + font-size .7rem + display flex + + a + color var(--efu-fontcolor) + + &:hover + color var(--efu-theme) + + .tags-punctuation + font-size 12px + margin-right 1px + + .article-meta__tags + margin-right 8px + padding 0 0.2rem 0 0 + color var(--efu-fontcolor) \ No newline at end of file diff --git a/themes/solitude/source/css/_layout/aside.styl b/themes/solitude/source/css/_layout/aside.styl new file mode 100644 index 0000000..1e2eac7 --- /dev/null +++ b/themes/solitude/source/css/_layout/aside.styl @@ -0,0 +1,1097 @@ +#aside-content + width 300px + if hexo-config('aside.position') == 0 + order 1 + else + order 2 + + +minWidth900() + if hexo-config('aside.position') == 0 + padding-right 15px + else + padding-left 15px + + +maxWidth1200() + display none + + +minWidth1300() + animation slide-in .6s .3s backwards + if hexo-config('aside.position') == 0 + padding-right .5rem + else + padding-left .5rem + + .item-headline + padding-bottom 0 + margin-left 8px + font-size 1em + font-weight 700 + display flex + align-items center + + i + font-size 16px + max-width 20px + + span + margin-left 4px + + + div, + ul + padding 0 + user-select none + + .card-widget + box-shadow var(--efu-shadow-border) + background var(--efu-card-bg) + border var(--style-border) + transition 0.3s + border-radius 12px + position relative + overflow hidden + margin-top .5rem + padding .5rem .7rem + + &:hover + box-shadow var(--efu-shadow-border) + + > .card-widget + &:first-child + transition 0.3s + margin-top 0 + + .sticky_layout + top calc(60px + .5rem) + position sticky + transition: top .3s ease 0s + + #author-info__sayhi + text-align center + width fit-content + color var(--efu-white) + background var(--efu-white-op) + backdrop-filter blur(10px) + font-size 12px + padding 2px 8px + border-radius 12px + cursor pointer + user-select none + transition .3s + margin auto + min-width 100px + + / [data-theme=dark] & + background #00000015 + color var(--efu-black) + + &:hover + color var(--efu-white) + + &:hover + background var(--efu-card-bg) + color var(--efu-main) + transform scale(1.1) + + &:active + transform scale(.97) + opacity .8 + + .card-info-social-icons + margin 0 + display flex + justify-content flex-start + flex-direction row + flex-wrap nowrap + cursor pointer + + .social-icon + margin 0 + margin-left 8px + color var(--efu-fontcolor) + font-size 1.4em + cursor pointer + display flex + + i + transition all .3s ease 0s + padding 8px + border-radius 32px + cursor pointer + background var(--efu-white-op) + color var(--efu-card-bg) + width 40px + height 40px + display flex + align-items center + justify-content center + + &:hover + background var(--efu-white) + transform scale(1.1) + color var(--efu-main) + box-shadow none + + / [data-theme=dark] & + background var(--efu-black-op) + + &:hover + background-color var(--efu-black) + color var(--efu-white) + ++minWidth900() + html.hide-aside .layout + -webkit-box-pack: center + justify-content: center + + > div:first-child + width 100% + + html.hide-aside .layout > .aside-content + display: none + +#aside-content + .card-toc + padding .5rem .5rem + + &:hover + box-shadow var(--efu-shadow-border) + + +minWidth900() + right 0 !important + + .toc-content + overflow-y auto + max-height calc(100vh - 300px) + + &::before + position absolute + top .6rem + right 1.2rem + color #a9a9a9 + content attr(progress-percentage) + font-style italic + font-size 1.2rem + + .toc-link.active + border-left-color #0061cc + background #0079ff + color #fff + + #card-toc + +minWidth901() + right 0 + padding .5rem + + .toc-content + overflow-y: auto + max-height: calc(100vh - 300px) + + * > .toc-item > .toc-child + margin-left 10px + transition display .3s ease-in-out 0s + padding-left 10px + + ol + margin 0 + padding-left .4rem + + &ul + list-style: none + + > ol + padding-left 0 + + .toc-child + display none + + .toc-child .toc-child + display none + + &.active + display block + + .toc-item.active > .toc-child + display block + + &:hover + .toc-content + .toc-link:not(.active) span + if hexo-config('aside.toc.vague') + filter: blur(0) + opacity: 1 + + .toc-item.active .toc-link + opacity 1 + border-radius 8px + + .toc-link + line-height 24px + padding 8px + border-left 0 solid transparent + border-radius 12px + color var(--efu-secondtext) + cursor default + min-height 40px + display flex + align-items center + transition all .2s ease-in-out 0s + + &.active + border-radius 12px + border-left-color var(--efu-hovertext) + background-color var(--efu-card-bg) + color var(--efu-lighttext) + font-weight 700 + font-size 20px + + &:not(.active) span + opacity .6 + cursor pointer + if hexo-config('aside.toc.vague') + filter blur(1px) + transition .3s + + &:hover + color var(--efu-lighttext) + +[data-theme=dark] + .toc + .toc-item.active .toc-link .toc-text + color: var(--efu-white) + +if hexo-config('aside.card.style') == 0 + #aside-content + + .card-widget + if hexo-config('aside.card.author.sticker') + &:hover + .avatar-sticker + opacity 0 + transform scale(0) + + &.card-recent-post + padding .4rem .6rem !important + + &.card-info + padding 0 !important + box-shadow var(--efu-shadow-black) + + > div.card-content + padding 1rem 1.2rem + min-height 320px + position relative + + > .card-widget.card-info + &:before + background linear-gradient(-25deg, var(--efu-main), var(--efu-main-op-deep)) + background-size 400% + position absolute + width 100% + height 100% + left 0 + top 0 + content '' + animation gradient 15s ease infinite + + > div.card-content + padding 1rem 1.2rem + min-height 320px + position relative + + > div.card-info-avatarimg + overflow hidden + background var(--efu-yellow) + transition 1.5s + min-height 160px + position relative + box-shadow var(--efu-shadow-yellow) + + &:hover img + transform scale(1.03) + + .card-info + if hexo-config('aside.card.author.sticker') + .avatar-sticker + position absolute + bottom -2px + right -2px + width 33px + height 33px + line-height 34px + z-index 0 + display flex + align-items center + justify-content center + transition .3s .2s + transform scale(1) + background var(--efu-card-bg) + border-radius 50% + + img + width 26px + height 26px + + ../ :hover .avatar-sticker + opacity 0 + transform scale(0) + + .author-info__desc + font-size 12px + color var(--efu-card-bg) + opacity .6 + line-height 1 + + .card-info-avatar.is-center + flex-direction column + display flex + align-items flex-start + + .avatar-img-group + width 118px + height 118px + right calc(50% - 59px) + top 90px + border-radius 500px + position absolute + transition cubic-bezier(.69, .39, 0, 1.21) .3s + transform-origin bottom + border 5px solid var(--efu-card-bg) + + ../ :hover .avatar-img-group + opacity 0 + transform scale(0) + + .author-info__name + text-align left + font-weight 700 + color var(--efu-card-bg) + font-size 20px + line-height 1 + margin-bottom 5px + + .author-info__top-group + display flex + height 28px + width 100% + + .author-info__description_group + position absolute + top 50px + width 100% + left 0 + padding 1.2rem + opacity 0 + transition .3s + + ../ :hover .author-info__description_group + opacity 1 + + .author-info__description + line-height 1.38 + margin .3rem 0 + text-align left + color var(--efu-card-bg) + + b + color var(--efu-card-bg) + + .author-info__description2 + line-height 1.38 + margin .3rem 0 + text-align left + width 100% + z-index 2 + color var(--efu-card-bg) + + b + color var(--efu-card-bg) + + .author-info__bottom-group + display flex + justify-content space-between + position absolute + padding 1.2rem + width 100% + left 0 + bottom 0 + align-items center + + a.author-info__bottom-group-left:hover + opacity .8 + + .card-info-data + display table + margin .7rem 0 .2rem + width 100% + table-layout fixed + + > div:nth-child(0) > a > div.headline + font-weight 700 + + > .card-info-data-item + display table-cell + transition .3s + + a + .headline + color var(--efu-fontcolor) + font-size 1em + + .length-num + margin-top -.3rem + color var(--efu-fontcolor) + font-size 1.4em + + &:hover + background #000 + border-radius 5px + + img.avatar-img + width 108px + height 108px + object-fit cover + right 0 + top 0 + border-radius 500px + position absolute + opacity 1 + transition .3s + +if hexo-config('aside.card.style') == 1 + #aside-content + .card-widget.card-info + min-height 340px + padding 0 + margin-top 0 + + .author-info__top-group + margin-top 20px + display flex + height 28px + width 100% + + .card-info-bg-top + min-height 140px + background: linear-gradient(-25deg, var(--efu-main), var(--efu-main-op-deep), var(--efu-main), var(--efu-main-op-deep)) + background-size: 400% + if hexo-config('aside.card.background') + background-image url(hexo-config('aside.card.background')) + background-size cover + background-position center + background-repeat no-repeat + + .card-info-avatar + width 114px + height 114px + right calc(50% - 57px) + top 75px + border-radius 500px + position absolute + transition cubic-bezier(.69, .39, 0, 1.21) .3s + transform-origin bottom + z-index 1 + border 7px solid var(--efu-card-bg) + + .avatar-img + overflow hidden + border-radius 500px + width 100px + cursor pointer + height 100px + + img + object-fit cover + width 100% + height 100% + transition .3s + + &:hover + transform: scale(1.3) + + if hexo-config('aside.card.author.sticker') + .avatar-sticker + position absolute + bottom -2px + right -2px + width 33px + height 33px + line-height 34px + z-index 0 + display flex + align-items center + justify-content center + transition .3s .2s + transform scale(1) + background var(--efu-card-bg) + border-radius 50% + + img + width 26px + height 26px + + .card-info-social-icons + width 100% + justify-content center + padding 10px 20px + + i + background 0 0 + color var(--efu-fontcolor) + + &:hover + transform rotate(360deg) + color var(--efu-theme) + + .card-info__desc_group + display flex + align-items center + flex-direction column + + .author-info__name + margin-top 60px + text-align center + font-weight 700 + color var(--efu-fontcolor) + font-size 20px + line-height 1 + margin-bottom 5px + + .author-info__desc + font-size 14px + color var(--efu-font-color) + line-height 2 + + .card-info__data + display table + width 100% + table-layout fixed + margin 12px 0 4px + padding 0 20px + + a + position relative + display table-cell + + &:hover + transition all .3s + color var(--efu-theme) + + div + transition all .3s + color var(--efu-theme) + + &:not(:last-child):after + opacity: .3 + position: absolute + top: 6px + right: 0 + content: "" + width: 1px + height: 40px + background: var(--efu-fontcolor) + + .length-num + margin-top: -.32em + color: var(--efu-fontcolor) + font-size: 1.4em + line-height: 1.5 + + .headline + color: var(--efu-font-color) + font-size: 1em + line-height: 1.5 + +if hexo-config('aside.card.style') == 2 + #aside-content .card-widget.card-info + padding 0 + + .card-info-bg-top + width 100% + height 95px + position relative + background: linear-gradient(-25deg, var(--efu-main), var(--efu-main-op-deep), var(--efu-main), var(--efu-main-op-deep)) + if hexo-config('aside.card.background') + background-image url(hexo-config('aside.card.background')) + background-size cover + background-position center + background-repeat no-repeat + .author-info__name + font-size 24px + line-height 35px + color var(--efu-white) + font-weight 700 + position absolute + top 55px + if hexo-config('aside.position') == 0 + left 6rem + else + left 1rem + .card-info__data + position absolute + top 98px + gap .5rem + z-index 1 + if hexo-config('aside.position') == 0 + right 1rem + else + left 1rem + + .headline + color var(--efu-gray) + + .length-num + font-weight 700 + + a + font-size 14px + display flex + line-height 18px + gap .1rem + .card-info__desc_group + padding 44px 1rem 1rem + min-height 50px + opacity .8 + line-height 18px + .author-info-social + position absolute + display inline-flex + gap: 5px + top .5rem + if hexo-config('aside.position') == 0 + right 1rem + else + left 1rem + + i + font-size 18px + width 30px + height 30px + border-radius 50% + background rgba(255, 255, 255, .2) + backdrop-filter blur(10px) + color var(--efu-white) + display flex + justify-content center + align-items center + + .social-icons + order 1 + opacity 0 + transition .3s + display flex + pointer-events none + gap 5px + .more-info + if hexo-config('aside.position') == 0 + order 1 + else + order 0 + cursor pointer + display flex + justify-content center + align-items center + .card-info-avatar + width 80px + height 80px + top 50px + border-radius 500px + position absolute + transition cubic-bezier(.69, .39, 0, 1.21) .3s + transform-origin bottom + border 3px solid var(--efu-card-bg) + z-index 1 + if hexo-config('aside.position') == 0 + left 1rem + else + right 1rem + + .avatar-img + overflow hidden + border-radius 500px + width 74px + cursor pointer + height 74px + + img + object-fit cover + width 100% + height 100% + transition .3s + + &:hover + transform: scale(1.3) + + if hexo-config('aside.card.author.sticker') + .avatar-sticker + position absolute + bottom -2px + right -2px + width 26px + height 26px + line-height 26px + z-index 0 + display flex + align-items center + justify-content center + transition .3s .2s + transform scale(1) + background var(--efu-card-bg) + border-radius 50% + + img + width 21px + height 21px + +[data-theme=dark] #aside-content + > .card-widget.card-info + border var(--style-border-always) + +#aside-content + .card-webinfo + .webinfo + .webinfo-item-title + display flex + + i + line-height: 2 !important + margin-right: 6px + width: 16px + text-align: center + font-size: 16px !important + + .webinfo-item + display flex + justify-content space-between + white-space nowrap + -webkit-box-align center + align-items center + padding .1rem .5rem 0 + + div:first-child + -webkit-box-flex 1 + flex 1 1 0 + padding-right 1rem + + + .card-allinfo + + hr + display flex + position relative + margin .5rem 0 + border 1px dashed var(--efu-theme-op) + + .item-headline + display none + + .card-tag-cloud + max-height 500px + overflow hidden + position relative + + &.all-tags + max-height none + + &:after + display none + + &:after + content "" + position absolute + bottom 0 + left 0 + right 0 + height 150px + background-image linear-gradient(to top, var(--efu-card-bg), transparent) + pointer-events none + + a + display inline-block + padding 0 0.3rem + font-size .8rem + border-radius 8px + + sup + opacity .6 + margin-left 2px + + &:hover + background var(--efu-theme) + color var(--efu-white) !important + box-shadow var(--efu-shadow-theme) + cursor pointer + border-radius 5px + + &.tags-cloud-more + width 100% + text-align center + border-radius 8px !important + border var(--style-border) + margin-top 8px + font-size 16px !important + + span#more-tags-btn + transition .3s + width 100% + text-align center + background var(--efu-secondbg) + color var(--efu-fontcolor) + border-radius 8px + display flex + justify-content center + font-size 14px + padding 4px 0 + border var(--style-border-always) + box-shadow var(--heo-shadow-border) + cursor pointer + + &:hover + background var(--efu-main) + + .card-archives + ul.card-archive-list + margin 0 + padding 0 + list-style none + display: flex + flex-direction: row + justify-content: space-between + flex-wrap: wrap + + > .card-archive-list-item + width 100% + flex 0 0 48% + + a + display inline-block + padding .15rem .5rem + width 100% + color var(--efu-fontcolor) + transition all .4s ease 0s + border-radius: 8px + margin: 4px 0 + flex-direction: column + align-content: space-between + border: var(--style-border) + + &:hover + background-color var(--efu-theme) + color var(--efu-card-bg) + border-radius 5px + box-shadow: var(--efu-shadow-theme) + padding: .15rem .5rem + border: var(--style-border-hover) + cursor pointer + + span + display inline-block + vertical-align bottom + + &:last-child + text-align right + margin-left: 4px + + .card-archive-list-count-group + display flex + flex-direction row + + span.card-archive-list-count + ext-align left + font-size 1.1rem + line-height 0.9 + font-weight bold + + .card-archive-list-count-unit + width auto + text-align left + font-size 14px + font-weight 700 + + .card-archive-list-date + font-size 14px + opacity .6 + + +#aside-content .card-tag-cloud a.highlight + color var(--efu-lighttext) + font-weight 500 + +#aside-content + .card-recent-post + .aside-list + .aside-list-item + padding 2px 6px 8px 6px + border-radius 12px + transition .3s + margin 4px 0 + cursor pointer + display flex + align-items flex-start + + &:hover + background var(--efu-main) + color var(--efu-white) + transition .3s + box-shadow var(--efu-shadow-main) + + .content a + color var(--efu-white) + + .thumbnail + -webkit-mask-image -webkit-radial-gradient(center, #fff, #000) + border-radius 8px + border var(--style-border) + display flex + align-items center + overflow hidden + width 2.1em + height 2.1em + margin-top 4px + + img + width 140% + height 140% + transition all .6s ease 0s + object-fit cover + + .content + -webkit-box-flex 1 + flex 1 1 0 + padding-left 10px + word-break break-all + display flex + flex-direction column + + .title + font-weight 700 + padding 2px 0 + margin-bottom 8px + color var(--efu-fontcolor) + font-size 95% + line-height 1.3 + -webkit-line-clamp 2 + overflow hidden + + .article-recent_post_categories + font-size 12px + font-weight 700 + opacity .6 + line-height 1 + + +favicon = hexo-config('aside.flip.favicon') +face = hexo-config('aside.flip.face') +faceback = hexo-config('aside.flip.backface') +backcolor = convert(hexo-config('aside.flip.backcolor')) + +#aside-content + .card-widget.card-platform + background backcolor + display flex + justify-content center + align-content center + padding 0 + cursor pointer + border none + height 110px + border var(--style-border) + transition 0.6s + + &:before + position absolute + width 100% + height 100% + left 0 + top 0 + background url(favicon) center center no-repeat + content '' + background-size cover + transition .2s cubic-bezier(.45, .04, .43, 1.21) + + &:hover:before + top 100% + opacity 0 + transition .3s ease-out + + &:hover + #flip-content + transform rotateY(180deg) + + #flip-wrapper + perspective 1000 + position relative + width 235px + height 110px + z-index 1 + + #flip-wrapper #flip-content + width 100% + height 100% + transform-style preserve-3d + transition cubic-bezier(0, 0, 0, 1.29) 0.3s + + #flip-wrapper #flip-content .face + position absolute + width 100% + height 100% + -webkit-backface-visibility hidden + backface-visibility hidden + background url(face) center center no-repeat + background-size 100% + + #flip-wrapper #flip-content .face.back + display block + -webkit-transform rotateY(180deg) + transform rotateY(180deg) + box-sizing border-box + background url(faceback) center center no-repeat + background-size 100% + + .card-widget.card-adsense + padding 0 + +if hexo-config('aside.newest_comment.enable') + .card-recent-comment + .recent-comment-more + margin-left auto + margin-right .5rem + &:hover + color var(--efu-lighttext) + transition .3s + .aside-list-item + padding: .5rem + width: 100% + display: flex + flex-direction: row + height: 80px + transition: .3s + position: relative + &:not(:last-child) + border-bottom 1px dashed rgba(255, 255, 255, .1) + + .thumbnail img + width: 60px + height: 60px + margin-right: 8px + border-radius: 12px + + .content + max-width: calc(100% - 68px) + line-height 1.5 + + .comment + overflow hidden + text-overflow ellipsis + display -webkit-box + font-size 14px + -webkit-line-clamp 2 + transition .3s + -webkit-box-orient vertical + cursor pointer + &:hover + color var(--efu-lighttext) + transition .3s + + .datetime + font-size 12px + color var(--efu-secondtext) + margin-top auto \ No newline at end of file diff --git a/themes/solitude/source/css/_layout/capsule.styl b/themes/solitude/source/css/_layout/capsule.styl new file mode 100644 index 0000000..089aeb3 --- /dev/null +++ b/themes/solitude/source/css/_layout/capsule.styl @@ -0,0 +1,213 @@ +if hexo-config('capsule.enable') + #nav-music + display flex + align-items center + z-index 8 + position fixed + bottom 20px + left 20px + cursor pointer + transition .3s + transform-origin left bottom + box-shadow var(--efu-shadow-border) + border-radius 40px + overflow hidden + user-select none + + +maxWidth798() + display none !important + + span + user-select none + + div + user-select none + + &.playing + box-shadow 0 0 12px -3px var(--efu-none) + -webkit-animation playingShadow 5s linear infinite + + .aplayer + background var(--efu-main-op-deep) + border var(--style-border-hover) + backdrop-filter saturate(180%) blur(20px) + -webkit-backdrop-filter blur(20px) + transform translateZ(0) + + &.aplayer-withlrc + .aplayer-pic + box-shadow 0 0 14px #ffffffa6 + -webkit-transform rotate(0) scale(1.1) + border-color var(--efu-white) + animation-play-state running + + .aplayer-info + color var(--efu-white) + + .aplayer-lrc + width 200px + margin-bottom 0 + opacity 1 + + .aplayer-info + .aplayer-controller + .aplayer-bar-wrap + .aplayer-bar + opacity 1 + + .aplayer-played + animation-play-state running + + #nav-music-hoverTips + opacity 0 + + .aplayer + background var(--efu-card-bg) + border-radius 60px + height 41px + display flex + margin 0 + pointer-events none + transition .3s + border var(--style-border) + box-shadow none + + &.aplayer-withlrc + .aplayer-pic + height 25px + width 25px + border-radius 40px + z-index 1 + transition .3s + -webkit-transform rotate(0) scale(1) + border var(--style-border-always) + -webkit-animation changeright 24s linear infinite + animation-play-state paused + + .aplayer-info + height 100% + color var(--efu-fontcolor) + margin-left 8px + padding 0 + display flex + align-items center + + .aplayer-lrc + width 0 + opacity 0 + transition .3s + margin-left 8px + margin-top -2px + + .aplayer-notice + display none + + .aplayer-miniswitcher + display none + + .aplayer-body + position relative + display flex + align-items center + padding 0 12px 0 8px + + .aplayer-pic + .aplayer-play + opacity 0 + + div + display none + + .aplayer-info + .aplayer-music + margin 0 + display flex + align-items center + padding 0 + z-index 1 + + .aplayer-author + display none + + .aplayer-title + cursor pointer + line-height 1 + display inline-block + white-space nowrap + max-width 120px + overflow hidden + text-overflow ellipsis + transition .3s + + .aplayer-controller + position absolute + width 100% + height 100% + top 0 + left 0 + + .aplayer-time + display none + + .aplayer-bar-wrap + margin 0 + padding 0 + + .aplayer-bar + height 100% + background 0 0 + opacity 0 + + .aplayer-loaded + display none + + .aplayer-played + height 100% + opacity .1 + background-color var(--efu-white) !important + -webkit-animation lightBar 5s ease infinite + animation-play-state paused + + &.aplayer-withlist + .aplayer-info + border none + + .aplayer-lrc + p + color #ffffffb3 + filter blur(1px) + + &.aplayer-lrc-current + color var(--efu-white) + border none + filter blur(0) + + #nav-music-hoverTips + color var(--efu-white) + background var(--efu-main) + width 100% + height 100% + position absolute + top 0 + left 0 + align-items center + justify-content center + display flex + border-radius 40px + opacity 0 + font-size 12px + z-index 2 + pointer-events none + transition .3s + + &:hover + &:not(.playing) + #nav-music-hoverTips + opacity 1 + + .aplayer-list + display none + + #nav-music .aplayer .aplayer-lrc:after, + #nav-music .aplayer .aplayer-lrc:before + display none diff --git a/themes/solitude/source/css/_layout/console.styl b/themes/solitude/source/css/_layout/console.styl new file mode 100644 index 0000000..ee33dc0 --- /dev/null +++ b/themes/solitude/source/css/_layout/console.styl @@ -0,0 +1,310 @@ +#console + display flex + position fixed + width 100vw + height 100vh + top 0 + left 0 + z-index 9999 + justify-content center + opacity 0 + transition .3s ease-out + flex-direction column + align-items center + pointer-events none + user-select none + + &.show .close-btn i + transform rotate(0) + + if hexo-config('recent_comments.enable') && hexo-config('recent_comments.console') + .recent-comment-more + margin-left auto + display flex + align-items center + + &:hover + color var(--efu-main) + + .console-card-group + display flex + justify-content space-between + align-items center + margin 0 30px + transform translateY(20px) + transition .3s + max-width 1400px + + +maxWidth1300() + justify-content center + + +maxWidth768() + display none + + +maxHeight800() + display none + + + &.show + .console-card-group + transform translateY(0) + opacity 1 + transition-delay .1s + max-height 80% + + .console-card-group-left + margin-right .5rem + width 40% + height 100% + + +maxWidth1300() + display none + + .console-card-group-right + display flex + flex-direction column + justify-content center + height 100% + width 60% + overflow hidden + + +maxWidth1300() + width 100% + margin 0 + + .console-card + background var(--efu-maskbg) + border-radius 12px + overflow hidden + border var(--style-border) + box-shadow var(--efu-shadow-border) + padding 40px + + .console-card.tags + height calc(100% - 172px) + + .console-mask + background var(--efu-maskbgdeep) + backdrop-filter saturate(180%) blur(20px) + -webkit-backdrop-filter blur(20px) + width 100vw + height 100vh + top 0 + left 0 + position absolute + z-index -1 + -webkit-backface-visibility hidden + -webkit-transform-style preserve-3d + transform translateZ(0) + + &.show + .console-mask + backdrop-filter saturate(180%) blur(20px) + -webkit-backdrop-filter blur(20px) + transform translateZ(0) + animation .6s ease 0s 1 normal none running to_show + + .author-content-item-tips + opacity .8 + font-size .6rem + margin-bottom .5rem + + .author-content-item-title + font-size 36px + font-weight 700 + line-height 1 + display flex + align-items center + + .aside-list + display flex + flex-wrap wrap + flex-direction row + justify-content space-between + margin-top 1.5rem + + .button-group + display flex + margin 1rem auto 0 auto + justify-content center + width fit-content + + .console-btn-item + width 60px + height 60px + transition .3s + cursor pointer + + span.darkmode_switchbutton + [data-theme="dark"] & + background var(--efu-orange) + color var(--efu-white) + + .button-group + gap .5rem + + .console-btn-item + &:hover + span + background var(--efu-main) + + span + width 100% + height 100% + background var(--efu-card-bg) + border var(--style-border) + border-radius 60px + display flex + align-items center + justify-content center + color var(--efu-fontcolor) + transition all .3s + + i + font-size 1rem + + &.on + span + background var(--efu-orange) + color var(--efu-white) + transition .3s + + &:not(.on) + span:hover + background var(--efu-main) + + &:hover + span + color var(--efu-white) + + .console-card.tags + .card-tag-cloud + margin-top 1.5rem + display flex + gap .5rem + flex-wrap wrap + + a + color var(--efu-fontcolor) + padding 2px 8px + border-radius 8px + background var(--efu-card-bg) + border var(--style-border) + font-size 14px + font-weight 700 + + &:hover + background var(--efu-main) + color var(--efu-white) + + sup + opacity .6 + + .close-btn + width 100% + height 60px + position fixed + right max('calc((100% - 1400px) / 2)', someValue) + top 0 + font-size 35px + color var(--efu-fontcolor) + cursor pointer + transition .3s + display flex + align-items center + justify-content center + max-width 1400px + + i + font-size 32px + margin-right 1.5rem + margin-left auto + line-height 1 + transform rotate(-30deg) + transition .6s + + i:hover + color var(--efu-hovertext) + background var(--efu-main-op) + border-radius 32px + + .console-card.history + margin-top 8px + padding 0 + background 0 0 + box-shadow none + border none + overflow hidden + border-radius 0 + + .item-headline + display none + + .console-card.history + .card-archive-list + display flex + flex-direction row + flex-wrap wrap + height 164px + gap .5rem + + li.card-archive-list-item + flex 0 1 24.101% + + .card-archive-list-link + border-radius 8px + display flex + flex-direction column + align-content space-between + border var(--style-border) + transition all .3s ease 0s + background var(--efu-maskbgdeep) + padding 9.5px 16px + + &:hover + background var(--efu-main) + color var(--efu-white) + cursor pointer + + .card-archive-list-date + font-size 14px + opacity .6 + + .card-archive-list-count-group + display flex + flex-direction row + + .card-archive-list-count + width auto + text-align left + font-size 1.1rem + line-height .9 + margin-right 2px + font-weight 700 + + .card-archive-list-count-unit + width auto + text-align left + font-size 14px + font-weight 700 + + #card-newest-comments + height 100% + + #consoleMusic + +maxWidth1300() + display none + + +maxHeight800() + display none + + #consoleCommentBarrage + +maxWidth1300() + display none + + +maxHeight800() + display none + + #consoleHideAside + +maxWidth768() + display none \ No newline at end of file diff --git a/themes/solitude/source/css/_layout/footer.styl b/themes/solitude/source/css/_layout/footer.styl new file mode 100644 index 0000000..ff19559 --- /dev/null +++ b/themes/solitude/source/css/_layout/footer.styl @@ -0,0 +1,278 @@ +#footer + position relative + background linear-gradient(180deg, var(--efu-card-bg-none) 0, var(--efu-card-bg) 25%) + display flex + flex-direction column + margin-top .5rem + + +maxWidth768() + margin-top 0 + + &:before + position absolute + width 100% + height 100% + content '' + z-index -1 + + + if hexo-config('post.footer.enable') + div#st-footer-bar + display flex + flex-direction column + align-items center + margin-top 16px + + a.footer-bar-link + padding 4px 16px + background var(--efu-secondbg) + border-radius 20px + margin-top 8px + font-size 14px + cursor pointer + border var(--style-border-always) + + &:hover + background var(--efu-main) + color var(--efu-white) + transform scale(1.1) + border-color var(--efu-main) + + .footer-logo + font-size 24px + + .footer-bar-description + color var(--efu-secondtext) + font-weight 700 + padding: 0 0.5rem + text-align: center + + #footer_deal + justify-content center + display flex + padding-top 2rem + align-items center + + +maxWidth768() + flex-wrap wrap + flex-direction row + + i + font-size .9rem + line-height .9rem + height .9rem + + .deal_link + display flex + margin 1rem 27px + color var(--efu-card-bg) + border-radius 3rem + width 32px + height 32px + background var(--efu-fontcolor) + justify-content center + align-items center + transition .3s + + &:hover + color var(--efu-white) + background var(--efu-main) + transform scale(1.1) + + if hexo-config('footer.information.author') + .footer_mini_logo + width 50px + height 50px + margin 0 1rem + cursor pointer + transition cubic-bezier(0, 0, 0, 1.29) .5s + user-select none + border-radius 50px + overflow hidden + +maxWidth768() + display none + + &:hover + transform scale(1.2) + + #st-footer + display flex + flex-direction row + width 100% + max-width 1200px + justify-content space-between + flex-wrap wrap + margin 1rem auto 3rem + padding 0 1rem + + .footer-links + display flex + flex-direction column + + .footer-item + font-size .8rem + line-height .8rem + color var(--efu-fontcolor) + margin-right auto + overflow hidden + white-space nowrap + text-overflow ellipsis + max-width 120px + cursor pointer + padding 8px + border-radius 12px + + &:hover + color var(--efu-theme) + background var(--efu-main-op-light) + + [data-theme=dark] & + background var(--efu-theme-op) + + .footer-group + min-width 120px + + .footer-title-group + display flex + align-items center + margin .5rem 0 .7rem 8px + + a + margin-left 8px + + &:hover i + color var(--efu-main) + opacity 1 + + i + line-height 1 + color var(--efu-secondtext) + transition .3s + font-size 16px + opacity .6 + + .footer-title + margin 0 + + .footer-title + color var(--efu-secondtext) + font-size .8rem + margin-left 8px + + .random-friends-btn + display flex + margin-left 8px + + /#footer-bar + padding 1rem + color var(--efu-fontcolor) + margin-top 1rem + background var(--efu-secondbg) + display flex + overflow hidden + z-index 1 + transition .3s + border-top var(--style-border-always) + + .footer-bar-links + display flex + justify-content space-between + max-width 1400px + width 100% + margin 0 auto + flex-wrap wrap + align-items center + line-height 1 + + .footer-bar-left + display flex + flex-wrap wrap + min-height 32px + align-items center + + .copyright + display flex + flex-direction row + align-items center + padding 0 8px + margin 0 4px + + .footer-bar-link + margin 0 + + .footer-bar-link + margin 0 4px + color var(--efu-fontcolor) + font-size .8rem + padding 8px + border-radius 12px + font-weight 700 + white-space nowrap + + &.cc + margin-right 0 + + i + font-size 18px + + &:not(:last-child) + margin-right .5rem + + &:hover + color var(--efu-theme) + background var(--efu-main-op) + + .footer-bar-right + display flex + flex-direction row + flex-wrap wrap + align-items center + + > div > div.footer-bar-left > span + margin-right 1rem + + #cookies-window + min-width 300px + background var(--efu-maskbgdeep) + color var(--efu-fontcolor) + padding 8px 16px + display flex + flex-direction column + bottom 20px + right 20px + position fixed + border-radius 12px + transition .3s + z-index 8 + user-select none + backdrop-filter saturate(180%) blur(20px) + transform translateZ(0) + border var(--style-border) + animation barrageIn .6s cubic-bezier(.42, 0, .3, 1.11) + + +maxWidth1300() + display none + + &.cw-hide + opacity 0 + animation barrageOut .6s cubic-bezier(.42, 0, .3, 1.11) + z-index -1 + + .cookies-window-title + padding-bottom 4px + border-bottom var(--style-border) + font-size 12px + font-weight 700 + + .cookies-window-content + font-size 14px + display flex + justify-content space-around + align-items center + + .cookies-link + margin-left: 10px + font-size: 16px + + i.solitude + font-size 16px diff --git a/themes/solitude/source/css/_layout/fullpage.styl b/themes/solitude/source/css/_layout/fullpage.styl new file mode 100644 index 0000000..dbab864 --- /dev/null +++ b/themes/solitude/source/css/_layout/fullpage.styl @@ -0,0 +1,47 @@ +if hexo-config('loading.fullpage') + #loading-box + user-select none + + .loading-bg + display flex + width 100% + height 100% + position fixed + background var(--efu-background) + z-index 1999 + opacity 1 + transition 0.2s + pointer-events all + animation showLoading 0.3s 0s backwards + + &.loaded .loading-bg + pointer-events none + transition 0.2s + animation hideLoading 0.3s 0s forwards + + .loading-img + width 100px + margin auto + animation-duration 0.2s + animation-name loadingAction + border-radius 50px + animation-iteration-count infinite + animation-direction alternate + + @keyframes loadingAction + from + opacity 1 + to + opacity 0.6 + + @keyframes hideLoading + from + opacity 1 + to + opacity 0 + + @keyframes showLoading + from + opacity 0 + to + opacity 1 \ No newline at end of file diff --git a/themes/solitude/source/css/_layout/header.styl b/themes/solitude/source/css/_layout/header.styl new file mode 100644 index 0000000..734fa0a --- /dev/null +++ b/themes/solitude/source/css/_layout/header.styl @@ -0,0 +1,897 @@ +#page-header + position relative + width 100% + transition all .5s ease 0s + display flex + justify-content center + + &.not-top-img + height 60px + background 0 center + + #nav + transition .3s + background var(--efu-card-bg) + + a + color var(--efu-fontcolor) + + &:hover + color var(--efu-card-bg) + + &:not(.nav-fixed) + #nav + background var(--efu-none) + transition .3s + + +maxWidth768() + transition 0s + +#page-header + #site-title + margin 0 + color var(--efu-white) + font-size 1.85em + + +minWidth768() + font-size 2.85em + + #site-subtitle + color var(--light-grey) + font-size 1.15em + + +minWidth768() + font-size 1.72em + + #site_social_icons + display none + margin 0 auto + width 15rem + text-align center + + +maxWidth768() + display block + + .social-icon + margin 0 .5rem + color var(--light-grey) + font-size 1.43em + cursor pointer + + #scroll-down + position absolute + bottom 0 + width 100% + cursor pointer + display none + + .scroll-down-effects + animation: 1.5s ease 0s infinite normal none running scroll-down-effect + position relative + width 100% + color var(--light-grey) + font-size 30px + + &.not-home-page + height 20rem + + +maxWidth768() + height 14rem + + #page-site-info + position absolute + top 10rem + padding 0 .5rem + width 100% + + +maxWidth768() + top 7rem + + #nav + box-shadow none + transition 0.3s + display flex + justify-content center + user-select none + + +maxWidth768() + transition 0s + + +maxWidth1400() + padding 0 + + a + &:hover + span + &.solitude + opacity 0 + + +maxWidth768() + opacity 1 + + #nav-group + max-width 1400px + width 100% + display flex + position relative + padding 0 1.5rem + align-items center + + +maxWidth768() + width 100% + display flex + position relative + padding 0 12px + + #nav-right + position absolute + right 0 + z-index 102 + display flex + flex-direction row + height 100% + align-items center + margin-right 1.5rem + overflow hidden + gap .5rem + + +maxWidth768() + margin-right 12px + + div + padding 0 + + .nav-button + a + height 35px + width 35px + display flex + align-items center + justify-content center + border-radius 40px + + &.totopbtn + width 25px + height 25px + border-radius 40px + background var(--efu-fontcolor) + color var(--efu-card-bg) + position absolute + top 5px + right 5px + transition .3s + + &.console_switchbutton + padding 4px 8px + + &.long + a + &.totopbtn + width 70px + + &:hover + a + &.totopbtn + background var(--efu-lighttext) + + &:not(.long):hover + a + &.totopbtn + width 35px + height 35px + top 0 + right 0 + + &.nav-fixed + #nav + position fixed + top 0 + transition .3s + box-shadow none + background var(--efu-card-bg) + outline 1px solid var(--efu-card-border) + + #menus + +minWidth900() + z-index 100 + + & > div + &.menus_items + transition .3s + height 40px + margin auto 0 + + #menus[style*="padding-right: 300px;"] + .menus_items + transform translateX(-150px) + + #page-name + +minWidth900() + z-index 101 + transition .3s + top 10px + + &-text + +minWidth900() + display inline + opacity 1 + transition .3s + line-height 1 + + &:hover + &:after + +minWidth900() + opacity 1 + line-height 36px + + div.menus_items + +minWidth900() + transition .15s + position relative + top -60px + + &.nav-visible + #nav + #page-name + +minWidth900() + z-index 100 + top 60px + transition .3s + + &-text + +minWidth900() + display inline + transition .15s + + div.menus_items + +minWidth900() + opacity 1 + transition .15s + position relative + top: 0 + + #menus + +minWidth900() + z-index 101 + + #travellings_button + +maxWidth768() + opacity 0 + + &.no-top-img + margin-bottom 0 + + &:not(.nav-fixed) + #percent + transition .3s + + #nav-right #nav-totop + width 0 + transform scale(0) + margin-left 0 + overflow hidden + transition .3s ease-in + +#page-header #scroll-down .scroll-down-effects, +#page-header #site-subtitle, #page-header #site-title + text-align center + line-height 1.5 + +#page-header.nav-fixed > #nav, +#page-header.not-top-img > #nav + box-shadow none + +#nav + padding 0 + position absolute + top 0 + z-index 10 + display flex + flex-wrap wrap + -webkit-box-align center + align-items center + width 100% + height 60px + font-size 1.3em + opacity 0 + transition all .5s ease 0s + outline 1px solid var(--efu-none) + justify-content space-between + + +maxWidth768() + padding 0 + + &.show + top 0 + transition .2s + position fixed + opacity 1 + filter none + + #toggle-menu + display none + padding .1rem 0 0 .3rem + vertical-align top + + +maxWidth768() + display inline-block + + &:hover + color var(--efu-white) + + #site-name + padding 0 + transition .3s + display flex + height 35px + min-width 50px + justify-content center + align-items center + border-radius 40px + cursor pointer + + &:hover + @media (hover: hover) + i, span, img + color var(--efu-card-bg) + transition .3s + + +minWidth900() + i, span, img + opacity 0 + + &:after + +minWidth900() + opacity: 1 + + &:after + +minWidth900() + opacity 0 + position absolute + display flex + z-index 1 + content "\e008" + font-family solitude, serif + align-items center + justify-content center + font-size 22px + line-height 1 + color var(--efu-card-bg) + + if hexo-config('site.name.class') == i_class + i + font-size 16px + line-height 35px + padding 0 12px + + +maxWidth768() + transition .1s + + +minWidth900() + opacity 1 + transition all .3s, color 0s, opacity .3s + + if hexo-config('site.name.class') == text + span.title + letter-spacing normal + font-size 1rem + font-weight 700 + padding 0 5px + line-height 2rem + +maxWidth768() + padding-left 8px + + if hexo-config('site.name.class') == img + img + max-width 120px + max-height 35px + padding 4px 8px + + #blog_name + flex-wrap nowrap + height 60px + display flex + align-items center + z-index 102 + transition .3s + + a + transition .3s + color var(--efu-white) + padding .3rem .4rem 0 + border-radius 8px + + &:hover + background var(--efu-white-op) + transition .3s + color var(--efu-white) + + +maxWidth768() + background var(--efu-none) + box-shadow none + transition .3s + color var(--efu-fontcolor) + + #menus + display flex + justify-content center + width 100% + position absolute + height 60px + left 0 + margin 0 + transform translateZ(0) + + +maxWidth768() + display none + + .menus_items + position relative + width fit-content + text-align center + left 0 + right 0 + top 0 + display flex + flex-direction row + justify-content center + + .menus_item + padding 0 .4rem + display flex + flex-direction column + align-items center + margin auto + position relative + + .menus_item_child + padding 6px 4px 8px 4px + border-radius 100px + background-color var(--efu-maskbgdeep) + box-shadow var(--efu-shadow-black) + border var(--style-border) + transition .3s + backdrop-filter blur(20px) + top 35px + position absolute + margin-top 8px + white-space nowrap + opacity 0 + pointer-events none + transform translateY(-10px) scale(.8) + + li + display inline-flex + list-style none + border-radius 5px + margin 0 4px + + #page-header & a + letter-spacing 0 + display flex + align-items center + border-radius 100px + padding .3rem .8rem + width 100% + color var(--efu-fontcolor) + + &:hover + background var(--efu-lighttext) + color var(--efu-card-bg) + box-shadow var(--efu-shadow-main) + margin 0 auto + transform scale(1) + padding .3rem 1rem + + i + &:not(.fa-brands) + font-size 22px + margin-right 8px + line-height 1 + + &::before + position absolute + top -8px + left 0 + width 100% + height 20px + content "" + + &:before + top -10px + + &:hover + .menus_item_child + display block + border var(--style-border-hover) + box-shadow var(--efu-shadow-main) + opacity 1 + pointer-events all + transform translateY(0) scale(1) + + i + &.expand + transform rotate(180deg) + + i + &.expand + padding 4px + transition transform .3s ease 0s + + #search-button + display inline + padding 0 .4rem + + .site-page + position relative + padding-bottom .3rem + font-size .78em + cursor pointer + + if hexo-config('nav.group') + .back-home-button + &:hover + +minWidth900() + box-shadow var(--efu-shadow-main) + cursor pointer + + #page-name + &-text + +minWidth900() + display inline + font-weight 700 + padding 4px 8px + opacity 0 + transition .1s + text-overflow ellipsis + overflow hidden + white-space nowrap + position relative + text-align center + cursor pointer + top 0 + font-size .9rem + animation-timing-function ease-in + -webkit-animation-timing-function ease-in + + &:hover + +minWidth900() + color var(--efu-lighttext) !important + background var(--efu-none) + box-shadow none + + &-mask + +maxWidth899() + display none !important + +.nav-button + cursor pointer + +#site-name + .iconfont + font-size 20px + font-weight 400 + line-height 48px + +#site-logo + width 121px + +#nav-totop + position relative + width 35px + height 35px + display flex + border-radius 40px + transition all .3s ease-in-out + align-items center + + &.long + width 80px + + .totopbtn + padding-top 0 + + i + position absolute + display flex + font-size 22px + opacity 0 + line-height 1 + + &:hover + .totopbtn + i + opacity 1 + color var(--efu-card-bg) + transition .3s + + #percent + opacity 0 + font-weight 700 + + #percent + font-size 12px + border-radius 35px + display flex + justify-content center + align-items center + transition .3s + white-space nowrap + +.nav-fixed #nav-totop #percent, +.page #nav-totop #percent + font-size 12px + border-radius 35px + display flex + justify-content center + align-items center + transition .3s + white-space nowrap + +if hexo-config('nav.group') + .back-home-button + display flex + width 35px + height 35px + padding 0 !important + align-items center + justify-content center + margin-right 4px + transition .3s + border-radius 40px + + +maxWidth768() + display: none + + i + font-size 20px + + &:hover + background var(--efu-main) + color var(--efu-card-bg) + + .back-menu-list-groups + display flex + opacity 1 + top 55px + pointer-events auto + left 1.5rem + transform scale(1) + + +maxWidth768() + padding-bottom 8px + box-shadow var(--efu-shadow-border) + left: 0 + + .back-menu-list-group + display flex + flex-direction column + + .back-menu-list-title + margin 8px 0 0 16px + transition .3s + + &:hover + .back-menu-list-title + color var(--efu-lighttext) + + .back-menu-list-groups + position absolute + top 45px + transform scale(.8) + transform-origin top left + left 1.5rem + background-color var(--efu-maskbgdeep) + border-radius 12px + border var(--style-border) + flex-direction column + font-size 12px + color var(--efu-secondtext) + box-shadow var(--efu-shadow-border) + transition .3s + opacity 0 + pointer-events none + backdrop-filter blur(20px) + + +maxWidth768() + left 0 + + &:hover + border var(--style-border-hover) + + .back-menu-list + .back-menu-item + width 150px + +.nav-fixed + #nav + a + color var(--efu-fontcolor) + transition .3s + + &:hover + background var(--efu-lighttext) + color var(--efu-card-bg) + transition .3s + + #site-name + &:hover + +minWidth900() + background var(--efu-lighttext) + + if hexo-config('nav.group') + .back-home-button + color var(--efu-fontcolor) + + &:hover + background var(--efu-lighttext) + color var(--efu-card-bg) + + .menus_item + &:hover + & > + a.site-page + background-color var(--efu-lighttext) + + +minWidth768() + background-color var(--efu-main) + +.post + if hexo-config('nav.group') + .back-home-button + color var(--efu-white) + + &:hover + background var(--efu-white-op) + color var(--efu-white) + cursor pointer + + #nav + #site-name + &:hover + +minWidth900() + align-items center + + &:after + color var(--efu-white) + + .nav-fixed + #nav + #site-name + &:after + color var(--efu-card-bg) + +.back-menu-list + display flex + flex-direction row + flex-wrap wrap + width 340px + justify-content space-between + + &::before + position absolute + top -15px + left 0 + width 100% + height 20px + content '' + +.back-menu-item + display flex + align-items center + margin 4px 8px + padding 4px 8px + + #nav & + padding 4px 8px + + #nav & + &:hover + background var(--efu-lighttext) + + &:hover + background var(--efu-lighttext) + + .back-menu-item-text + color var(--efu-card-bg) + + .back-menu-item-icon + width 24px + height 24px + border-radius 8px + background var(--efu-none) + + .back-menu-item-text + font-size 16px + transition .3s + margin-left .5rem + color var(--efu-fontcolor) + + +maxWidth768() + font-size 14px + +.page + #nav + a + &:hover + color var(--efu-card-bg) + background var(--efu-main) + transition .3s + box-shadow var(--efu-shadow-main) + + #site-name + &:hover + i + color var(--efu-card-bg) + + .menus_item + &:hover + & > a.site-page + +minWidth768() + color var(--efu-card-bg) !important + background var(--efu-main) + box-shadow var(--efu-shadow-main) + +.error + #nav + a + &:hover + background var(--efu-main) + + #site-name + i + +maxWidth768() + color var(--efu-fontcolor) + +#weblogo + align-self center + +#menus + & > div + &.menus_items + & > div + & > a + letter-spacing .3rem + padding-left .7rem + font-weight 700 + padding-top 0 + padding-bottom 0 + height 35px + line-height 35px + border-radius 40px + +#travellings_button + display inline + padding 0 .4rem + transition .3s + + +maxWidth1200() + display none + +#page-name + +minWidth900() + align-items center + display flex + border-radius 12px + height 40px + position absolute + top 62px + left 0 + right 0 + margin auto + justify-content center + animation-timing-function ease-out + -webkit-animation-timing-function ease-out + +#page-name-mask + +minWidth900() + width 100% + height 100% + position absolute + overflow hidden + left 0 + +if hexo-config('nav.right.console') + #nav-console + +maxWidth768() + display none \ No newline at end of file diff --git a/themes/solitude/source/css/_layout/keyboard.styl b/themes/solitude/source/css/_layout/keyboard.styl new file mode 100644 index 0000000..66a4edd --- /dev/null +++ b/themes/solitude/source/css/_layout/keyboard.styl @@ -0,0 +1,60 @@ +if hexo-config('keyboard.enable') + #keyboard-tips + position fixed + top 80px + left 20px + z-index 999 + background var(--efu-maskbgdeep) + border-radius 12px + border var(--style-border) + padding 20px + display flex + flex-direction column + backdrop-filter saturate(180%) blur(20px) + transform translateZ(0) + pointer-events none + box-shadow var(--efu-shadow-border) + opacity 0 + transition .3s + + &.show + opacity 1 + transition .1s + + .keyboardTitle + font-size 12px + color var(--efu-secondtext) + line-height 1 + + .keyboardList + display flex + flex-direction column + margin-top 8px + + .keyboardItem + display flex + margin-top 4px + + .keyGroup + display flex + align-items center + width 90px + + .key + padding 0.2em 0.4em + font-family inherit + background-color var(--efu-card-bg) + color var(--efu-fontcolor) + border var(--style-border) + border-color var(--efu-secondtext) + border-bottom 2px solid var(--efu-secondtext) + box-shadow var(--efu-shadow-border) + border-radius 0.25rem + overflow-wrap break-word + overflow-x auto + font-weight 500 + font-size .875em + margin-right 4px + vertical-align baseline + line-height 1 + height 24px \ No newline at end of file diff --git a/themes/solitude/source/css/_layout/other.styl b/themes/solitude/source/css/_layout/other.styl new file mode 100644 index 0000000..8e7583c --- /dev/null +++ b/themes/solitude/source/css/_layout/other.styl @@ -0,0 +1,28 @@ +span.tags-punctuation + display flex + align-items center + +.bber-reply + cursor pointer + margin 0 4px + + &:hover + color var(--efu-main) + +.post-tips + color var(--efu-gray) + font-size 14px; + position absolute + bottom 1rem + left 2rem + + +maxWidth768() + left 1rem + + a + color var(--efu-gray) + border none + margin-left 4px + + &:hover + color var(--efu-main) \ No newline at end of file diff --git a/themes/solitude/source/css/_layout/pace.styl b/themes/solitude/source/css/_layout/pace.styl new file mode 100644 index 0000000..f6efa33 --- /dev/null +++ b/themes/solitude/source/css/_layout/pace.styl @@ -0,0 +1,40 @@ +if hexo-config('loading.pace') + .pace + pointer-events: none + user-select: none + z-index: 2000 + position: fixed + margin: auto + top: 4px + left: 0 + right: 0 + height: 8px + border-radius: 8px + width: 4rem + background: var(--efu-secondbg) + border: var(--style-border) + overflow: hidden + + &.pace-inactive + opacity: 0 + transition: .3s + top: -8px + + .pace-progress + opacity: 0 + transition: .3s ease-in + + .pace-progress + box-sizing: border-box + transform: translate3d(0,0,0) + max-width: 200px + z-index: 2000 + display: block + position: absolute + top: 0 + right: 100% + height: 100% + width: 100% + background: var(--efu-logo-color) + animation: gradient 2s ease infinite + background-size: 200% \ No newline at end of file diff --git a/themes/solitude/source/css/_layout/pagination.styl b/themes/solitude/source/css/_layout/pagination.styl new file mode 100644 index 0000000..7b37dd7 --- /dev/null +++ b/themes/solitude/source/css/_layout/pagination.styl @@ -0,0 +1,177 @@ +#pagination + width 100% + +minWidth768() + overflow visible + +maxWidth768() + margin-bottom 0 + margin-top 0 + + .pagination + text-align center + +minWidth768() + display flex + position relative + justify-content center + +maxWidth768() + display flex + + .extend + +maxWidth768() + width 100% + height 2.5rem + margin .2rem 0 1rem 0 + border-radius 12px + line-height 2.5rem + background var(--efu-card-bg) + border var(--style-border-always) + box-shadow var(--efu-shadow-border) + + i + +maxWidth768() + display none + .space + +maxWidth768() + display none + + .page-number + display inline-block + margin 0 .2rem + min-width 1.2rem + height 1.2rem + text-align center + line-height 1.2rem + + +minWidth768() + width 2rem + background var(--efu-card-bg) + height 2rem + line-height calc(2rem - 2px) + border-radius 8px + margin 0 .3rem + box-shadow var(--efu-shadow-border) + border var(--style-border) + transition .3s + &:hover + color var(--efu-theme) + border var(--style-border-hover) + box-shadow var(--efu-shadow-main) + +maxWidth768() + display none + + &.current + background var(--efu-theme) + color var(--efu-white) + border-radius 5px + + +minWidth768() + background var(--efu-theme) + border var(--style-border-hover) + box-shadow var(--efu-shadow-theme) + + &:hover + background var(--efu-theme) + box-shadow var(--efu-shadow-theme) + color var(--efu-white) + + a.extend.next, a.extend.prev + +minWidth768() + width 4rem + height 2rem + line-height 1.9rem + border-radius 8px + background var(--efu-card-bg) + box-shadow var(--efu-shadow-border) + position absolute + border var(--style-border) + display flex + align-items center + justify-content center + overflow hidden + transition .3s + + i + transition .3s + + a.extend + &:hover + color var(--efu-theme) + border var(--style-border-hover) + box-shadow var(--efu-shadow-main) + + &.next + right 0 + +minWidth768() + .pagination_tips_next + margin-left -32px + transition .3s ease-out 0s + opacity 0 + + &:hover + .pagination_tips_next + margin-left 2px + opacity 1 + white-space nowrap + + &.prev + left 0 + +minWidth768() + .pagination_tips_prev + margin-right -32px + transition .3s ease-out 0s + opacity 0 + + &:hover + .pagination_tips_prev + margin-right 2px + opacity 1 + white-space nowrap + + .toPageGroup + display flex + position relative + margin 0 .3rem + +maxWidth768() + display none + + a#toPageButton + display flex + position absolute + width 40px + height 40px + right 0 + top 0 + border-radius 8px + justify-content center + align-items center + transition .3s + background var(--efu-card-bg) + border var(--style-border-always) + cursor text + pointer-events none + + &:focus-within a#toPageButton, &:hover a#toPageButton + width 30px + height 30px + right 4px + top 5px + background var(--efu-card-bg) + border 1px solid var(--efu-none) + border-radius 4px + opacity .2 + + input + width 40px + height 40px + border-radius 8px + border var(--style-border-always) + transition .3s + outline-style none + font-size 16px + padding-left 12px + background var(--efu-secondbg) + color var(--efu-fontcolor) + + &:focus, /#pagination .toPageGroup:hover input + border var(--style-border-hover-always) + outline-style none + width 100px \ No newline at end of file diff --git a/themes/solitude/source/css/_layout/recent-post.styl b/themes/solitude/source/css/_layout/recent-post.styl new file mode 100644 index 0000000..350a546 --- /dev/null +++ b/themes/solitude/source/css/_layout/recent-post.styl @@ -0,0 +1,476 @@ +#recent-posts + if hexo-config('aside.position') == 0 + order 2 + + #category &, + #tag & + +maxWidth768() + padding 0 + +if hexo-config('index_post_list.direction') == "column" + #recent-posts + position relative + +minWidth1300() + display flex + flex-wrap wrap + gap .5rem + transition width .3s + + +maxWidth768() + padding 0 1rem + + > .recent-post-item + box-shadow var(--efu-shadow-light2black) + display flex + align-items center + animation slide-in .6s .4s backwards + transition all .3s ease 0s + overflow hidden + height fit-content + background var(--efu-card-bg) + border-radius 12px + cursor pointer + border var(--style-border) + + +maxWidth1300() + margin-bottom .5rem + + +maxWidth768() + border-radius 12px + border var(--style-border-always) + box-shadow var(--efu-shadow-border) + display block + position relative + clip-path inset(0 0 0 0 round 12px) + + &:hover + box-shadow var(--efu-shadow-main) + border var(--style-border-hover) + + .post_cover img.post_bg + transform scale(1.03) + transition .3s ease-in-out + filter brightness(.85) + + .recent-post-info-top .article-title + color var(--efu-theme) + + if hexo-config('google_adsense.enable') + + .google-ads-warp + iframe + width: 100% !important + height: 100% !important + border: none !important + + .post_cover + position relative + transition 1s + width 100% + overflow hidden + height 100% + + +minWidth1300() + height 225px + + +maxWidth1300() + width 75% + display flex + height 220px + + +maxWidth768() + width 100% + height 170px + border-radius 5px 8px 0 0 + + a + min-width 100% + min-height 100% + + img.post_bg + width 100% + height 100% + transition all .6s ease 0s + object-fit cover + + +maxWidth1300() + min-width 100% + -webkit-backface-visibility hidden + -webkit-transform-style preserve-3d + min-height 100% + user-select none + + +maxWidth768() + border-radius: 12px 12px 0 0 + + > .recent-post-info + height 174px + width 100% + cursor pointer + position relative + padding 0 + display inline-block + overflow hidden + + .content + -webkit-line-clamp 2 + display -webkit-box + overflow hidden + -webkit-box-orient vertical + padding 5px 32px + opacity .8 + font-size 14px + line-height 1.8 + + +maxWidth600() + -webkit-line-clamp 1 + + span.tags-punctuation + transition .3s + + &:hover + color var(--efu-main) + + .recent-post-info-top + position relative + transition .3s + padding 0 32px + width 100% + + .article-title + line-height 30px + margin-top 0 + font-weight 700 + margin-bottom 0 + width 100% + transition .3s + font-size 1rem + -webkit-line-clamp 2 + display -webkit-box + overflow hidden + -webkit-box-orient vertical + + .recent-post-info-top-tips + display flex + margin-top 20px + user-select none + + > .sticky-warp + display flex + position relative + margin-right 8px + justify-content center + align-items center + font-size 0.5rem + + i + font-size .5rem + margin-right 3px + + .original + display flex + color var(--efu-secondtext) + font-size .5rem + position relative + margin-right 8px + + .unvisited-post + display flex + color var(--efu-secondtext) + font-size .5rem + position relative + + &:visited + color var(--efu-card-bg) + + /.article-meta-wrap + position absolute + bottom 16px + transition .3s + display flex + flex-direction row + flex-wrap nowrap + justify-content space-between + width 100% + left 0 + padding 0 32px + white-space nowrap + color var(--efu-fontcolor) + font-size .7rem + + > .article-meta + margin 0 8px 0 0 + white-space nowrap + overflow hidden + text-overflow ellipsis + display flex + + > .article-meta__tags + margin-right 8px + padding 0 .2rem 0 0 + color var(--efu-fontcolor) + + > .post-meta-date + right 0 + text-align right + + i + display none + + .article-meta__separator + display none + + a:hover + background-color var(--efu-none) + color var(--efu-lighttext) + cursor pointer + border-radius 4px + + i + margin 0 .4rem 0 0 + + .sticky + color var(--efu-fontcolor) + + if hexo-config('index_post_list.direction') == "column" && hexo-config('index_post_list.column') == 2 + #recent-posts + > .recent-post-item + +minWidth1300() + flex-direction column + width 100% + flex 1 1 40% + max-width 50% + box-shadow var(--efu-shadow-border) + else if hexo-config('index_post_list.direction') == "column" && hexo-config('index_post_list.column') == 3 + #recent-posts + > .recent-post-item + +minWidth1300() + flex-direction column + width 100% + flex 1 1 33.3% + max-width 32.6% + box-shadow var(--efu-shadow-border) + +else if hexo-config('index_post_list.direction') == "row" + #recent-posts + position relative + display flex + flex-wrap wrap + justify-content space-between + align-items flex-start + align-content flex-start + user-select none + gap .5rem + transition width .3s + + +maxWidth768() + padding 0 1rem + + > .recent-post-item + display flex + align-items center + animation slide-in .6s .4s backwards + transition all .3s ease 0s + overflow hidden + height fit-content + background var(--efu-card-bg) + border-radius 12px + cursor pointer + border var(--style-border) + flex-direction row + width 100% + box-shadow var(--efu-shadow-border) + + +maxWidth768() + border-radius 12px + border var(--style-border-always) + box-shadow var(--efu-shadow-border) + flex-direction column + position relative + clip-path inset(0 0 0 0 round 12px) + + &:hover + box-shadow var(--efu-shadow-main) + border var(--style-border-hover) + + .post_cover img.post_bg + transform scale(1.03) + transition .3s ease-in-out + filter brightness(.85) + + .recent-post-info-top .article-title + color var(--efu-theme) + + if hexo-config('google_adsense.enable') + + .google-ads-warp + iframe + width: 100% !important + height: 100% !important + border: none !important + + .post_cover + position relative + transition 1s + overflow hidden + width 75% + display flex + height 220px + + +maxWidth768() + width 100% + height 170px + border-radius 5px 8px 0 0 + order 1 + + a + min-width 100% + min-height 100% + + img.post_bg + width 100% + height 100% + transition all .6s ease 0s + object-fit cover + min-width 100% + -webkit-backface-visibility hidden + -webkit-transform-style preserve-3d + min-height 100% + user-select none + + +maxWidth768() + border-radius: 12px 12px 0 0 + + > .recent-post-info + height 174px + width 100% + cursor pointer + position relative + padding 0 + display inline-block + overflow hidden + +maxWidth768() + order 2 + + .content + -webkit-line-clamp 3 + display -webkit-box + overflow hidden + -webkit-box-orient vertical + padding 5px 32px + opacity .8 + font-size 14px + line-height 1.8 + +maxWidth768() + -webkit-line-clamp 2 + +maxWidth600() + -webkit-line-clamp 1 + + span.tags-punctuation + transition .3s + + &:hover + color var(--efu-main) + + .recent-post-info-top + position relative + transition .3s + padding 0 32px + width 100% + + .article-title + line-height 30px + margin-top 0 + font-weight 700 + margin-bottom 0 + width 100% + transition .3s + font-size 1rem + -webkit-line-clamp 2 + display -webkit-box + overflow hidden + -webkit-box-orient vertical + + .recent-post-info-top-tips + display flex + user-select none + + +maxWidth768() + margin-top 20px + + > .sticky-warp + display flex + position relative + margin-right 8px + justify-content center + align-items center + font-size 0.5rem + + i + font-size .5rem + margin-right 3px + + .original + display flex + color var(--efu-secondtext) + font-size .5rem + position relative + margin-right 8px + + .unvisited-post + display flex + color var(--efu-secondtext) + font-size .5rem + position relative + + &:visited + color var(--efu-card-bg) + + /.article-meta-wrap + position absolute + bottom 0 + transition .3s + display flex + flex-direction row + flex-wrap nowrap + justify-content space-between + width 100% + left 0 + padding 0 32px + white-space nowrap + color var(--efu-fontcolor) + font-size .7rem + +maxWidth768() + bottom 16px + + > .article-meta + margin 0 8px 0 0 + white-space nowrap + overflow hidden + text-overflow ellipsis + display flex + + > .article-meta__tags + margin-right 8px + padding 0 .2rem 0 0 + color var(--efu-fontcolor) + + > .post-meta-date + right 0 + text-align right + + i + display none + + .article-meta__separator + display none + + a:hover + background-color var(--efu-none) + color var(--efu-lighttext) + cursor pointer + border-radius 4px + + i + margin 0 .4rem 0 0 + + .sticky + color var(--efu-fontcolor) \ No newline at end of file diff --git a/themes/solitude/source/css/_layout/rightmenu.styl b/themes/solitude/source/css/_layout/rightmenu.styl new file mode 100644 index 0000000..b87bf87 --- /dev/null +++ b/themes/solitude/source/css/_layout/rightmenu.styl @@ -0,0 +1,79 @@ +if hexo-config('right_menu.enable') + #rightMenu + display none + position fixed + padding 0 .25rem + width 9rem + height fit-content + top 10% + left 10% + background-color var(--efu-maskbgdeep) + backdrop-filter blur(20px) + transform translateZ(0) + color var(--efu-fontcolor) + border-radius 12px + z-index 99994 + border var(--style-border) + user-select none + box-shadow var(--efu-shadow-black) + transition border .3s + + &:hover + border var(--style-border-hover) + box-shadow var(--efu-shadow-theme) + + .rightMenu-group + padding .35rem .3rem + + &.rightMenu-small + display flex + justify-content space-between + + .rightMenu-item + width 30px + height 30px + line-height 30px + display flex + align-items center + justify-content center + + &.rightMenu-line + .rightMenu-item + display flex + + .rightMenu-item + border-radius 8px + transition .3s + cursor pointer + margin .25rem 0 + padding .25rem .5rem + + &:hover + background-color var(--efu-lighttext) + color var(--efu-card-bg) + box-shadow var(--efu-shadow-main) + + i + display inline-block + text-align center + line-height 1.5rem + width 1.5rem + padding 0 .25rem + margin 0 .25rem + + span + line-height 1.5rem + + .rightMenu-line + border-top 1px dashed var(--efu-theme-op) + + #rightmenu-mask + position fixed + width 100vw + height 100vh + background 0 0 + top 0 + left 0 + display none + margin 0 !important + z-index 99993 \ No newline at end of file diff --git a/themes/solitude/source/css/_layout/sidebar.styl b/themes/solitude/source/css/_layout/sidebar.styl new file mode 100644 index 0000000..ae93437 --- /dev/null +++ b/themes/solitude/source/css/_layout/sidebar.styl @@ -0,0 +1,240 @@ +#sidebar + background var(--efu-maskbg) + + #menu-mask + position fixed + z-index 1001 + display none + width 100% + height 100% + background var(--efu-maskbg) + -webkit-backdrop-filter saturate(180%) blur(20px) + backdrop-filter saturate(180%) blur(20px) + transform translateZ(0) + animation .6s ease 0s 1 normal none running to_show + + #sidebar-menus + position fixed + top 0 + right -300px + overflow hidden auto + width 300px + height 100% + background var(--efu-maskbgdeep) + transition all .5s ease 0s + z-index 1001 + border-left var(--style-border-always) + + +minWidth768() + display none + + +maxWidth768() + .back-menu-list-groups .back-menu-list .back-menu-item + width calc(50% - 16px) + + &:hover + background var(--efu-lighttext) + + .menus_items + li + .site-page + font-weight 400 + + .site-page:hover + background var(--efu-main) !important + color var(--efu-white) + + .site-page span:hover + color var(--efu-white) + + / .site-data + display flex + width 100% + justify-content flex-start + margin 12px 0 0 0 + padding .6rem 16px + + .data-item + display flex + justify-content flex-start + margin-right 36px + + .data-item-link > a + display flex + flex-direction column + align-items flex-start + + .data-item-link .length-num + color var(--efu-fontcolor) + font-size 20px + font-weight 700 + line-height 1 + + .data-item-link .headline + font-size 12px + color var(--efu-secondtext) + + .menus_items + padding 0 16px + + .site-page + position relative + display block + padding 0 + color var(--efu-fontcolor) + cursor pointer + font-size 14px + font-weight 700 + + .menus_item > .site-page + display flex + font-size 12px + color var(--efu-secondtext) + + .expand + position absolute + top .78em + right .4rem + transition transform .3s ease 0s + + &.hide + transform rotate(90deg) !important + + .menus_item_child + margin 0 -4px + list-style none + display flex + flex-direction row + flex-wrap wrap + + .site-page.child + display flex + flex-direction column + align-items center + padding 8px + border-radius 8px + border var(--style-border-always) + background var(--efu-card-bg) + + li + width calc(50% - 8px) + margin 4px + + .site-page.child span + line-height 1 + margin-top 8px + + > hr + display none + + &.open + transform translate3d(-100%, 0, 0) + + .back-menu-list-groups + padding 0 16px + + .back-menu-list-title + font-size 12px + color var(--efu-secondtext) + + .back-menu-list + width calc(100% + 16px) + justify-content flex-start + margin 0 -8px + + .back-menu-item + background var(--efu-card-bg) + border var(--style-border-always) + border-radius 8px + + .back-home-button + display none + + > .author-avatar + padding 1.3rem 1.5rem 0 + text-align center + + img + width 110px + height 110px + border-radius 70px + transition all .5s ease 0s + + &:hover + transform rotate(360deg) + + hr + margin 1rem auto + + .card-tag-cloud + padding 0 16px + display flex + white-space nowrap + flex-direction row + gap .5rem + flex-wrap wrap + margin-bottom 60px + + a + color var(--efu-fontcolor) !important + padding 2px 8px 2px 12px + border-radius 8px + border var(--style-border-always) + background var(--efu-card-bg) + font-size 14px !important + + sup + opacity .6 + margin-left 4px + + span.sidebar-menu-item-title + font-size 12px + color var(--efu-secondtext) + margin-left 16px + + .sidebar-menu-item + display flex + flex-direction column + padding 0 16px + margin-bottom 6px + + span.darkmode_switchbutton + padding 4px 8px + + [data-theme="dark"] & + background var(--efu-orange) + color var(--efu-white) + + span.menu-child + width 100% + background var(--efu-card-bg) + border-radius 8px + border var(--style-border-always) + display flex + align-items center + font-size 14px + + i + width 24px + height 24px + display flex + align-items center + justify-content center + + span.menu-child span + margin-left 10px + + .webinfo + padding 0 16px + display flex + white-space nowrap + flex-direction column + + .webinfo-item + justify-content space-between + + .menus_items .site-page span:hover + color var(--efu-fontcolor) + + #toggle-sidebar + bottom 80px \ No newline at end of file diff --git a/themes/solitude/source/css/_layout/universe.styl b/themes/solitude/source/css/_layout/universe.styl new file mode 100644 index 0000000..56ce70c --- /dev/null +++ b/themes/solitude/source/css/_layout/universe.styl @@ -0,0 +1,18 @@ +// universe +if hexo-config('display_mode.universe') + #universe + display block + position fixed + margin 0 + padding 0 + border 0 + outline 0 + left 0 + top 0 + width 100% + height 100% + pointer-events none + z-index 1 + [data-theme=light] + #universe + display none \ No newline at end of file diff --git a/themes/solitude/source/css/_mode/index.styl b/themes/solitude/source/css/_mode/index.styl new file mode 100644 index 0000000..c9fc3c6 --- /dev/null +++ b/themes/solitude/source/css/_mode/index.styl @@ -0,0 +1,96 @@ +[data-theme=dark] + --efu-theme $dark_theme + --efu-theme-op $dark_theme_op + --efu-theme-op-deep $dark_theme_op_deep + --efu-theme-none $dark_theme_none + --efu-blue #0084ff + --efu-red #ff3842 + --efu-pink #d44040 + --efu-green #3e9f50 + --efu-purple #7a60d2 + --efu-yellow #ffc93e + --efu-yellow-op #ffc93e30 + --efu-orange #ff953e + --efu-fontcolor #f7f7fa + --efu-background #18171d + --efu-reverse #fff + --efu-maskbg rgba(0, 0, 0, 0.6) + --efu-maskbgdeep rgba(0, 0, 0, 0.85) + --efu-hovertext #0a84ff + --efu-ahoverbg #fff + --efu-lighttext var(--efu-theme) + --efu-secondtext #a1a2b8 + --efu-scrollbar rgba(200, 200, 223, 0.4) + --efu-card-btn-bg #30343f + --efu-post-blockquote-bg #000 + --efu-post-tabs-bg #121212 + --efu-secondbg #30343f + --efu-secondbg-bg #21232a + --efu-shadow-nav 0 5px 20px 0px rgba(28, 28, 28, 0.4) + --efu-card-bg #1b1c20 + --efu-card-bg-op var(--efu-white-op) + --efu-card-bg-none #1d1b2600 + --efu-shadow-lightblack 0 5px 12px -5px rgba(102, 68, 68, 0.0) + --efu-shadow-light2black 0 5px 12px -5px rgba(102, 68, 68, 0.0) + --efu-card-border #3d3d3f + --efu-shadow-border 0 8px 16px -4px #00000050 + --style-border 1px solid var(--efu-card-border) + --style-border-always 1px solid var(--efu-card-border) + --style-border-hover 1px solid var(--efu-theme) + --style-border-hover-always 1px solid var(--efu-theme) + --style-border-dashed 1px dashed var(--efu-theme-op) + --style-border-forever 2px solid var(--efu-lighttext) + --efu-hl-bg $hl_bg_dark + --efu-hltools-bg $hltools_bg_dark + +[data-theme=light] + --efu-theme $light_theme + --efu-theme-op $light_theme_op + --efu-theme-op-deep $light_theme_op_deep + --efu-theme-op-light #4259ef0d + --efu-theme-none $light_theme_none + --efu-blue #425aef + --efu-red #f04a63 + --efu-pink #ff7c7c + --efu-green #57bd6a + --efu-yellow #c28b00 + --efu-yellow-op #d99c001a + --efu-orange #e38100 + --efu-purple #7a60d2 + --efu-fontcolor #363636 + --efu-background #f7f9fe + --efu-reverse #000 + --efu-maskbg rgba(255, 255, 255, 0.6) + --efu-maskbgdeep rgba(255, 255, 255, 0.85) + --efu-hovertext var(--efu-main) + --efu-ahoverbg #f7f7fa + --efu-lighttext var(--efu-main) + --efu-secondtext rgba(60, 60, 67, 0.8) + --efu-scrollbar rgba(60, 60, 67, 0.4) + --efu-card-btn-bg #edf0f7 + --efu-post-blockquote-bg #fafcff + --efu-post-tabs-bg #f2f5f8 + --efu-secondbg #f7f7f9 + --efu-secondbg-bg var(--efu-secondbg) + --efu-shadow-nav 0 5px 12px -5px rgba(102, 68, 68, 0.05) + --efu-card-bg #fff + --efu-card-bg-op var(--efu-black-op) + --efu-card-bg-none rgba(255, 255, 255, 0) + --efu-shadow-lightblack 0 5px 12px -5px rgba(102, 68, 68, 0.00) + --efu-shadow-light2black 0 5px 12px -5px rgba(102, 68, 68, 0.00) + --efu-card-border #e3e8f7 + --efu-shadow-border 0 8px 16px -4px #2c2d300c + --style-border 1px solid var(--efu-card-border) + --style-border-always 1px solid var(--efu-card-border) + --style-border-hover 1px solid var(--efu-main) + --style-border-hover-always 1px solid var(--efu-main) + --style-border-dashed 1px dashed var(--efu-theme-op) + --style-border-forever 2px solid var(--efu-main) + --efu-navbg var(--efu-theme-op) + --efu-hl-bg $hl_bg_light + --efu-hltools-bg $hltools_bg_light + +:root + +maxWidth768() + --style-border 0px solid var(--efu-none) + --style-border-hover 0px solid var(--efu-main) \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_about/about.styl b/themes/solitude/source/css/_page/_about/about.styl new file mode 100644 index 0000000..41fe8c4 --- /dev/null +++ b/themes/solitude/source/css/_page/_about/about.styl @@ -0,0 +1,50 @@ +#about-page + display flex + padding-top 1rem + flex-direction column + align-items center + gap .5rem + + .author-title + font-size 2rem + font-weight 700 + margin .5rem 0 + line-height 1 + +if "tenyear" in $about + @import "tenyear" + +if "authorinfo" in $about + @import "author" + +if "contentinfo" in $about + @import "contentinfo" + +if "skills" in $about + @import "skills" + +if "oneself" in $about + @import "oneself" + +if "motto" in $about + @import "buff" + @import "maxim" + +if "game1" in $about + @import "game" + +if "personalities" in $about + @import "personalities" + @import "myphoto" + +if "careers" in $about + @import "careers" + +if "likes" in $about + @import "like" + +if "tj" in $about + @import "statistic" + +if "award" in $about + @import "reward" \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_about/author.styl b/themes/solitude/source/css/_page/_about/author.styl new file mode 100644 index 0000000..30a8f8e --- /dev/null +++ b/themes/solitude/source/css/_page/_about/author.styl @@ -0,0 +1,92 @@ +#about-page + .author-info + display flex + align-items center + margin 0 0 16px 0 + + .author-tag-left + display flex + flex-direction column + align-items flex-end + + .author-tag + &:first-child, + &:last-child + margin-right -16px + + .author-tag-right + display flex + flex-direction column + align-items flex-start + + .author-tag + &:first-child, + &:last-child + margin-left -16px + + +maxWidth768() + .author-tag-left, .author-tag-right + display none + + .author-tag + transform translate(0, -4px) + padding 1px 8px + background var(--efu-card-bg) + border var(--style-border-always) + border-radius 40px + margin-top 6px + font-size 14px + font-weight 700 + box-shadow var(--efu-shadow-lightblack) + animation 6s ease-in-out 0s infinite normal none running floating + + &:nth-child(1) + animation-delay 0s + + &:nth-child(2) + animation-delay .6s + + &:nth-child(3) + animation-delay 1.2s + + &:nth-child(4) + animation-delay 1.8s + + .author-img + margin 0 30px + border-radius 50% + width 180px + height 180px + position relative + background var(--efu-secondbg) + user-select none + transition .3s + + &:hover + transform scale(1.1) + + &::before + content '' + transition 1s + width 30px + height 30px + background var(--efu-green) + position absolute + border-radius 50% + border 5px solid var(--efu-background) + bottom 5px + right 10px + z-index 2 + + +maxWidth768() + width 120px + height 120px + + &::before + bottom -2px + right -2px + width 20px + height 20px + + img + border-radius 200px \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_about/buff.styl b/themes/solitude/source/css/_page/_about/buff.styl new file mode 100644 index 0000000..b36f61a --- /dev/null +++ b/themes/solitude/source/css/_page/_about/buff.styl @@ -0,0 +1,34 @@ +#about-page + .author-content-item.buff + font-size 36px + font-weight 700 + line-height 1.1 + display flex + align-items flex-start + flex-direction column + justify-content center + background linear-gradient(120deg, #ff27e8 0, #ff8000 100%) + color var(--efu-white) + background-size 200% + animation gradient 15s ease infinite + min-height 200px + height fit-content + width 59.5% + + .card-content + display flex + flex-direction column + justify-content center + + .buff-title + display flex + flex-direction column + + span:first-child + opacity 0.6 + margin-bottom 8px + + .title1 + opacity .8 + font-size .6rem + margin-bottom .5rem \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_about/careers.styl b/themes/solitude/source/css/_page/_about/careers.styl new file mode 100644 index 0000000..49a5c22 --- /dev/null +++ b/themes/solitude/source/css/_page/_about/careers.styl @@ -0,0 +1,27 @@ +#about-page + .author-content-item.careers + min-height 400px + + img + position absolute + left 0 + bottom 20px + width 100% + transition .6s + user-select none + + .careers-group + margin-top 12px + + .careers-item + display flex + align-items center + + .circle + width 16px + height 16px + margin-right 8px + border-radius 16px + + .name + color var(--efu-secondtext) \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_about/contentinfo.styl b/themes/solitude/source/css/_page/_about/contentinfo.styl new file mode 100644 index 0000000..bbfbd2c --- /dev/null +++ b/themes/solitude/source/css/_page/_about/contentinfo.styl @@ -0,0 +1,78 @@ +#about-page + .myInfoAndSayHello + display flex + flex-direction column + justify-content center + color var(--efu-white) + background linear-gradient(120deg, #5b27ff 0, #00d4ff 100%) + background-size 200% + animation gradient 15s ease infinite + width 59.5% + + .title1 + opacity .8 + line-height 1.3 + + .title2 + font-size 36px + font-weight 700 + line-height 1.1 + margin .5rem 0 + + .inline-word + word-break keep-all + white-space nowrap + + .aboutsiteTips + display flex + justify-content center + align-items flex-start + flex-direction column + width 39.5% + + h2 + margin-right auto + font-size 36px + font-family Helvetica + line-height 1.06 + letter-spacing -.02em + color var(--efu-fontcolor) + margin-top 0 + + .mask + height 36px + position relative + overflow hidden + margin-top 4px + + span + display block + box-sizing border-box + position absolute + top 36px + padding-bottom var(--offset) + background-size 100% 100% + -webkit-background-clip text + background-clip text + -webkit-text-fill-color transparent + background-repeat no-repeat + + &[data-show] + transform translateY(-100%) + transition .5s transform ease-in-out + + &[data-up] + transform translateY(-200%) + transition .5s transform ease-in-out + + span:nth-child(1) + background-image linear-gradient(45deg, #0ecffe 50%, #07a6f1) + + span:nth-child(2) + background-image linear-gradient(45deg, #18e198 50%, #0ec15d) + + span:nth-child(3) + background-image linear-gradient(45deg, #8a7cfb 50%, #633e9c) + + span:nth-child(4) + background-image linear-gradient(45deg, #fa7671 50%, #f45f7f) \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_about/game.styl b/themes/solitude/source/css/_page/_about/game.styl new file mode 100644 index 0000000..dfa8fcb --- /dev/null +++ b/themes/solitude/source/css/_page/_about/game.styl @@ -0,0 +1,41 @@ +#about-page + .author-content-item.game-apex + min-height 300px + overflow hidden + color var(--efu-white) + width 59% + + &::after + box-shadow 0 -69px 203px 11px #04120f inset + position absolute + content '' + width 100% + height 100% + top 0 + left 0 + + .card-content + position absolute + width 100% + height 100% + top 0 + left 0 + z-index 2 + display flex + flex-direction column + padding 1rem 2rem + + .author-content-item.game-jl + width 39% + min-height 300px + overflow hidden + color var(--efu-white) + + &::after + box-shadow 0 -69px 203px 11px #415dc9 inset + position absolute + content '' + width 100% + height 100% + top 0 + left 0 \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_about/like.styl b/themes/solitude/source/css/_page/_about/like.styl new file mode 100644 index 0000000..3320915 --- /dev/null +++ b/themes/solitude/source/css/_page/_about/like.styl @@ -0,0 +1,29 @@ +#about-page + .author-content-item.like-technology + background-size cover + min-height 230px + color var(--efu-white) + + &::after + box-shadow 0 -69px 203px 11px #050b20 inset + position absolute + content '' + width 100% + height 100% + top 0 + left 0 + + .author-content-item.like-music + background-size cover + min-height 400px + color var(--efu-white) + overflow hidden + + &::after + box-shadow 0 -69px 203px 11px #0e0e0e inset + position absolute + content '' + width 100% + height 100% + top 0 + left 0 \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_about/maxim.styl b/themes/solitude/source/css/_page/_about/maxim.styl new file mode 100644 index 0000000..9448ca0 --- /dev/null +++ b/themes/solitude/source/css/_page/_about/maxim.styl @@ -0,0 +1,23 @@ +#about-page + .author-content-item.maxim + font-size 36px + font-weight 700 + line-height 1.1 + display flex + align-items flex-start + flex-direction column + justify-content center + width 39.5% + + .maxim-title + display flex + flex-direction column + + span:first-child + opacity 0.6 + margin-bottom 8px + + .title1 + opacity .8 + font-size .6rem + margin-bottom .5rem \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_about/myphoto.styl b/themes/solitude/source/css/_page/_about/myphoto.styl new file mode 100644 index 0000000..b35d1c2 --- /dev/null +++ b/themes/solitude/source/css/_page/_about/myphoto.styl @@ -0,0 +1,34 @@ +#about-page + .author-content-item.myphoto + height 60% + min-height 240px + position relative + overflow hidden + width 39.5% + display flex + align-items center + justify-content center + + img + position absolute + height 100% + min-width 100% + object-fit cover + transition .6s + user-select none + + &:hover + img + min-width 105% + transition 2s + + .myphoto-title + position absolute + bottom 0 + left 0 + width 100% + background var(--efu-maskbgdeep) + padding .5rem 2rem + backdrop-filter saturate(180%) blur(20px) + -webkit-backdrop-filter blur(20px) + transform translateZ(0) \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_about/oneself.styl b/themes/solitude/source/css/_page/_about/oneself.styl new file mode 100644 index 0000000..e94ad3b --- /dev/null +++ b/themes/solitude/source/css/_page/_about/oneself.styl @@ -0,0 +1,91 @@ +#about-page + .author-content-item-group + &.column + display flex + flex-direction column + width 49% + justify-content space-between + + +maxWidth768() + width 100% !important + + &.mapAndInfo + width 59.5% + gap .5rem + + .author-content-item + +minWidth1300() + animation slide-in .6s 0s backwards + + &.map + background var(--site-about-oneself-map--light) no-repeat center + min-height 160px + max-height 400px + position relative + overflow hidden + height 60% + background-size 100% + transition 1s ease-in-out + + .map-title + position absolute + bottom 0 + left 0 + width 100% + background var(--efu-maskbg) + padding 0.5rem 2rem + backdrop-filter saturate(180%) blur(20px) + transition 1s ease-in-out + font-size 20px + transform translateZ(0) + + +maxWidth768() + padding 1rem + + b + color var(--efu-fontcolor) + + +maxWidth768() + margin-bottom 0 + + [data-theme=dark] & + background var(--site-about-oneself-map--dark) no-repeat center + background-size 100% + + &:hover + background-size 120% + transition 4s ease-in-out + background-position-x 0 + background-position-y 36% + + .map-title + bottom -100% + + .author-content-item.selfInfo + display flex + min-height 100px + max-height 400px + justify-content space-between + align-items center + flex-wrap wrap + height -webkit-fill-available + height 40% + + +maxWidth1300() + height 70% + + div + display flex + flex-direction column + margin .5rem 2rem .5rem 0 + + .selfInfo-title + opacity .8 + font-size .6rem + line-height 1 + margin-bottom 8px + + .selfInfo-content + font-weight 700 + font-size 34px + line-height 1 \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_about/personalities.styl b/themes/solitude/source/css/_page/_about/personalities.styl new file mode 100644 index 0000000..20a0906 --- /dev/null +++ b/themes/solitude/source/css/_page/_about/personalities.styl @@ -0,0 +1,25 @@ +.author-content-item.personalities + overflow hidden + position relative + width 59.5% + +maxWidth768() + min-height 360px + + .title2 + font-size 36px + font-weight 700 + line-height 1.1 + + .image + position absolute + right -40px + bottom -10rem + transition transform 2s cubic-bezier(.13, .45, .21, 1.02) + user-select none + + +maxWidth768() + right -70px + + &:hover + .image + transform rotate(-10deg) \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_about/reward.styl b/themes/solitude/source/css/_page/_about/reward.styl new file mode 100644 index 0000000..0f8ed8d --- /dev/null +++ b/themes/solitude/source/css/_page/_about/reward.styl @@ -0,0 +1,114 @@ +#about-page + .author-content-item + &.single.reward + overflow unset + .author-content-item + .author-content-item-title + color var(--efu-red) + + .reward-list-updateDate + color var(--efu-gray) + font-size 14px + + .author-content-item-description + font-size 16px + margin-top .5rem + + .reward-list-all + display flex + flex-wrap wrap + flex-direction row + margin 1rem -.25rem .5rem + + .post-reward + position absolute + right 2rem + top 2rem + + .reward-main + top 60px + right 0 + left auto + bottom auto + width fit-content + + .reward-all::before + bottom auto + top -16px + + .reward-button + padding 8px 12px + background var(--efu-red) + border-radius 12px + z-index 1 + box-shadow initial + width fit-content + height fit-content + line-height 2 + + +maxWidth768() + display none + + &:hover + .reward-button + filter brightness(1.1) + + .reward-list-item + padding 1rem + border-radius 12px + border var(--style-border-always) + width calc((100% / 6) - .5rem) + margin 0 .25rem .5rem .25rem + box-shadow var(--efu-shadow-border) + flex-direction column + justify-content space-between + + +maxWidth1200() + width calc((100% / 4) - .5rem) + + +maxWidth900() + width calc((100% / 2) - .5rem) + + +maxWidth768() + width 100% + + .reward-list-item-name + font-size 1rem + font-weight 700 + line-height 1 + margin-bottom .5rem + white-space nowrap + overflow hidden + text-overflow ellipsis + + .reward-list-bottom-group + display flex + align-items center + justify-content space-between + + .reward-list-item-money + padding 4px + background var(--efu-fontcolor) + color var(--efu-card-bg) + font-size 12px + line-height 1 + display flex + align-items center + justify-content center + border-radius 4px + margin-right 4px + white-space nowrap + + .solitude + font-size 14px + margin-right 4px + + .reward-list-item-time + font-size 12px + color var(--efu-secondtext) + white-space nowrap + + .reward-list-tips + p + font-size 12px + color var(--efu-secondtext) \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_about/skills.styl b/themes/solitude/source/css/_page/_about/skills.styl new file mode 100644 index 0000000..4daf339 --- /dev/null +++ b/themes/solitude/source/css/_page/_about/skills.styl @@ -0,0 +1,75 @@ +#about-page + .author-content-item.skills + display flex + justify-content center + align-items flex-start + flex-direction column + width 49.5% + min-height 450px + + .tags-group-all + display flex + transform rotate(0) + transition .3s + + .tags-group-wrapper + margin-top 40px + display flex + flex-wrap nowrap + animation rowleft 60s linear infinite + + .skills-style-group + position relative + + .skills-list + display flex + opacity 0 + transition .3s + position absolute + width 100% + top 0 + left 0 + flex-wrap wrap + flex-direction row + margin-top 10px + + &:hover + .skills-style-group + .tags-group-all + opacity 0 + + .skills-list + opacity 1 + + .skill-info + display flex + align-items center + margin-right 10px + margin-top 10px + background var(--efu-background) + border-radius 40px + padding 4px 12px 4px 8px + border var(--style-border) + box-shadow var(--efu-shadow-border) + + .etc + margin-right 10px + margin-top 10px + + .skill-icon + width 32px + height 32px + border-radius 32px + display flex + align-items center + justify-content center + margin-right 8px + user-select none + + img + width 18px + height 18px + + .skill-name + font-weight 700 + line-height 1 \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_about/statistic.styl b/themes/solitude/source/css/_page/_about/statistic.styl new file mode 100644 index 0000000..8e047c9 --- /dev/null +++ b/themes/solitude/source/css/_page/_about/statistic.styl @@ -0,0 +1,55 @@ +#about-page + .author-content-item + .card-content + z-index 2 + + .about-statistic + min-height 380px + width 39.5% + background-size cover + color var(--efu-white) + overflow hidden + + &::after + box-shadow 0 -159px 173px 71px #0f1114 inset + position absolute + content '' + width 100% + height 100% + top 0 + left 0 + + #statistic + font-size 16px + border-radius 15px + width 100% + color var(--efu-white) + display flex + justify-content space-between + flex-direction row + flex-wrap wrap + margin-top 4px + margin-bottom 2rem + + div + display flex + justify-content space-between + flex-direction column + width 50% + margin-bottom .5rem + + span:first-child + opacity .8 + font-size .6rem + + span:last-child + font-weight 700 + font-size 34px + line-height 1 + white-space nowrap + + .banner-button + background var(--efu-white-op) + + .banner-button:hover + background var(--efu-theme) \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_about/tenyear.styl b/themes/solitude/source/css/_page/_about/tenyear.styl new file mode 100644 index 0000000..e269356 --- /dev/null +++ b/themes/solitude/source/css/_page/_about/tenyear.styl @@ -0,0 +1,56 @@ +.percentage-label + position absolute + left 0 + font-size 14px + color var(--efu-card-bg) + font-weight bold + top 10px + white-space nowrap + transition left 0.5s linear + visibility hidden + +.time-labels + display flex + justify-content space-between + width 100% + + > div + font-size 14px + color var(--efu-fontcolor) + +.tenyear-timeline + width 100% + background-color var(--efu-background) + position relative + overflow hidden + margin-bottom 20px + border-radius 0.5rem + height 2.5rem + +.progress + width 0 + height 100% + background-color var(--efu-main) + position absolute + animation-delay -0.1s + border-radius 0.5rem + animation renamedProgressAnimation 2s linear forwards + +.past-time + animation renamedPastTimeAnimation 3s linear forwards + width 2px + height 20px + position absolute + transform-origin left + +@keyframes renamedProgressAnimation + 0% + width 0 + 100% + width var(--progress-percentage, 0) + +@keyframes renamedPastTimeAnimation + 0% + transform scaleX(0) + 100% + transform scaleX(var(--past-time-percentage, 0)) \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_gallery/index.styl b/themes/solitude/source/css/_page/_gallery/index.styl new file mode 100644 index 0000000..163d1a3 --- /dev/null +++ b/themes/solitude/source/css/_page/_gallery/index.styl @@ -0,0 +1,38 @@ +#gallery + padding 16px 0 + display flex + flex-wrap wrap + -webkit-box-pack start + justify-content flex-start + margin -8px + -webkit-box-align stretch + align-items stretch + +#album + margin 5px auto + + .locate + display flex + position absolute + left 8px + top 8px + padding 4px 6px + border-radius 8px + background var(--efu-black-op) + font-size 12px + color var(--efu-white) + transition .3s + z-index 1 + user-select none + + .st-gallery-item + margin-bottom 24px + overflow hidden + border-radius 8px + transition all .3s + border var(--style-border-always) + + .st-gallery-image + width 100% + display block + height auto \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_home/carousel.styl b/themes/solitude/source/css/_page/_home/carousel.styl new file mode 100644 index 0000000..a87f9e9 --- /dev/null +++ b/themes/solitude/source/css/_page/_home/carousel.styl @@ -0,0 +1,108 @@ +div#swiper_container + width 100% + height 12rem + position relative + transition all .3s + overflow hidden + display flex + flex-direction row + justify-content center + align-items center + + .blog-slider__pagination .swiper-pagination-bullet + margin 0 8px + width 11px + height 11px + display inline-block + border-radius 99px + background var(--efu-gray) + opacity .2 + transition all .3s + + .blog-slider__pagination .swiper-pagination-bullet-active + opacity 1 + background var(--efu-main) + height 30px + + .blog-slider__pagination + position absolute + z-index 21 + text-align center + display flex + justify-content space-between + flex-direction column + height 60% + +#swiperBox.recent-post-item + width 100% + margin-top 0 + flex 1 1 100% + max-width none + +maxWidth798() + display none + +#swiperBox + .blog-slider__item.swiper-slide + padding 1rem + display flex + justify-content space-between + flex-direction row + height 100% + + &:hover + .blog-slider__img + img + transform scale(1.1) + transition all .3s + + .blog-slider__title + color var(--efu-main) + transition all .3s + + .blog-slider__img + border-radius 12px + overflow hidden + width 35% + height 100% + transition all .3s + cursor pointer + + img + width 100% + height 100% + object-fit cover + + .blog-slider__content + margin 0 2rem 0 1rem + position relative + width 65% + display flex + align-items left + flex-direction column + height 100% + + .article-meta-wrap + padding 0 + bottom 0 + + .tags-punctuation + &:hover + color var(--efu-main) + transition all .3s + + .blog-slider__title + font-size 1.5rem + font-weight 600 + color var(--efu-fontcolor) + margin 0 + transition all .3s + cursor pointer + + .blog-slider__desc + -webkit-line-clamp: 4; + display: -webkit-box; + overflow: hidden; + -webkit-box-orient: vertical; + opacity: 0.8; + font-size: 14px; + line-height: 1.8; \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_home/category-bar.styl b/themes/solitude/source/css/_page/_home/category-bar.styl new file mode 100644 index 0000000..7c7d99f --- /dev/null +++ b/themes/solitude/source/css/_page/_home/category-bar.styl @@ -0,0 +1,95 @@ +#category-bar + padding .4rem .7rem + background var(--efu-card-bg) + border-radius 12px + display flex + white-space nowrap + overflow hidden + border var(--style-border) + transition 0.3s + height 50px + width 100% + justify-content space-between + user-select none + align-items center + margin-bottom .5rem + + +minWidth1300() + &:hover + border var(--style-border-hover) + box-shadow var(--efu-shadow-main) + + +minWidth1200() + animation: slide-in .6s .3s backwards; + + +maxWidth768() + margin-bottom 0 + margin-top 0 + border-radius 0 + background var(--efu-background) + padding 0 1rem + border none + + .category-bar-right + display flex + align-items center + + .category-bar-next + margin-left 8px + cursor pointer + height 30px + width 30px + display flex + border-radius 8px + align-items center + justify-content center + transition .3s + + .category-bar-more + margin-left 4px + font-weight 700 + border-radius 8px + padding 0 8px + + div:hover,a:hover + background var(--efu-secondbg-bg) + color var(--efu-lighttext) + + .category-bar-items + white-space nowrap + overflow-x scroll + overflow-y hidden + display flex + border-radius 8px + align-items center + height 30px + + &::-webkit-scrollbar + display: none + + .category-bar-item + &:hover + a + background var(--efu-secondbg-bg) + color var(--efu-lighttext) + + a + padding .1rem .5rem + margin-right 6px + font-weight 700 + border-radius 8px + display flex + align-items center + height 30px + border var(--style-border-always) + + &.select + order -1 + + a + background var(--efu-theme) + color var(--efu-white) + + &.home + a + border initial \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_home/home-top.styl b/themes/solitude/source/css/_page/_home/home-top.styl new file mode 100644 index 0000000..b297478 --- /dev/null +++ b/themes/solitude/source/css/_page/_home/home-top.styl @@ -0,0 +1,275 @@ +#home_top + .recent-top-post-group + border-radius 12px + overflow hidden + width 100% + margin-bottom 0 + user-select none + + +maxWidth768() + border-radius 0 + + .recent-post-top + display flex + flex-direction row + flex-wrap nowrap + width 100% + gap .5rem + + +maxWidth1200() + flex-direction column + + &::-webkit-scrollbar + display none + + .recent-post-group + display flex + flex-direction row + flex-wrap wrap + align-content space-between + gap .5rem + + +maxWidth1200() + flex-wrap nowrap + + / #bannerGroup + display flex + +minWidth1201() + width calc(50% - .25rem) + height calc(328px + .5rem) + display flex + flex-direction column + justify-content space-between + + .tags-group-wrapper + margin-top 0 + display flex + flex-wrap wrap + animation rowup 60s linear infinite + width 300px + margin-left auto + + .tags-group-icon-pair + display flex + + .tags-group-icon:nth-child(even) + margin-left 4rem + + /.topGroup + display flex + gap .5rem + +maxWidth1200() + overflow-x auto + + &::-webkit-scrollbar + display none + + +minWidth1201() + display flex + flex-direction row + flex-wrap wrap + justify-content flex-start + height calc(328px + 0.5rem) + align-content space-between + width calc(50% - 0.25rem) + position relative + animation slide-in .6s .1s backwards + + .recent-post-item + display flex + flex-direction column + width calc(100% / 3 - 0.5rem) + align-items flex-start + background var(--efu-card-bg) + border-radius 12px + overflow hidden + height 164px + max-height 164px + border var(--style-border-always) + transition .3s + position relative + box-shadow var(--efu-shadow-border) + + +maxWidth1200() + width 200px + min-width 200px + + &:hover .post_cover a .recent-post-top-text + left 0 + + .post_cover + width 100% + + a + height 100px + overflow hidden + display flex + + img + object-fit cover + width 100% + background var(--efu-secondbg) + + .recent-post-top-text + position absolute + top 0 + left -50px + display flex + z-index 1 + background var(--efu-theme) + color var(--efu-white) + padding 2px 8px + font-size .6rem + border-radius 0 0 12px 0 + transition .3s + cursor pointer + + /.recent-post-info + padding .3rem .5rem .3rem .5rem + transition .3s + + .article-title + -webkit-line-clamp 2 + overflow hidden + display -webkit-box + -webkit-box-orient vertical + line-height 1.5 + justify-content center + align-items flex-end + align-content center + font-weight 700 + font-size .8rem + padding 0 + + &:hover + color var(--efu-fontcolor) + + .todayCard + display none + + +minWidth1201() + position absolute + width 100% + z-index 3 + height 100% + top 0 + right 0 + background var(--efu-card-bg) + border-radius 12px + overflow hidden + transition .3s + display flex + cursor pointer + pointer-events all + + &::after + position: absolute + content: '' + width: 100% + height: 100% + top: 0 + left: 0 + box-shadow 0 -109px 133px -9px $todayCardColor inset + + &.hide + opacity: 0 + pointer-events: none + + .todayCard-info + position: absolute + bottom: 2rem + left: 2rem + z-index: 2 + color: var(--efu-white) + max-width: 60% + transition: .3s + + .todayCard-tips + opacity: .8 + font-size: .6rem + + .todayCard-title + font-size: 28px + font-weight: 700 + line-height: 36px + + .todayCard-cover + position: absolute + min-width: 100% + min-height: 100% + top: 0 + left: 0 + background-size: cover + z-index: -1 + transition: .3s + + .banner-button-group + position: absolute + right: 2rem + bottom: 2rem + display: flex + transition: .3s + + .banner-button + background: var(--efu-white-op) + border-radius: 20px + color: var(--efu-white) + display: flex + align-items: center + z-index: 1 + transition: .3s + cursor: pointer + backdrop-filter: saturate(180%) blur(20px) + transform: translateZ(0) + height: 40px + width: 118px + justify-content: center + + i + margin-right: 8px + font-size: 22px + + &:hover + background: var(--efu-theme) + color: var(--efu-white) + + &.hide + .todayCard-info + bottom: 1rem + opacity: 0 + + .todayCard-cover + transform: scale(1.2) + + .banner-button-group + bottom: 1rem +.banners-links + display flex + position absolute + bottom 20px + left 40px + flex-direction column + justify-content space-between + flex-wrap wrap + height 120px + +.banners-link-btn + display flex + flex-direction row + align-items center + padding 8px 18px 8px 14px + border-radius 60px + margin-bottom 12px + color var(--efu-white) + width 100px + position relative + background-size 200% + + &:not(:last-child) + margin-right 10px + + &:hover + background-position 100% 0 + +.banners-link-title + margin-left auto \ No newline at end of file diff --git a/themes/solitude/source/css/_page/_home/home.styl b/themes/solitude/source/css/_page/_home/home.styl new file mode 100644 index 0000000..56d3613 --- /dev/null +++ b/themes/solitude/source/css/_page/_home/home.styl @@ -0,0 +1,24 @@ +if hexo-config('hometop.enable') || hexo-config('says.enable') + #home_top + max-width 1400px + margin 0 auto + padding .5rem 1.5rem + + +maxWidth768() + padding 0 1rem + margin-top 0 + +if hexo-config('hometop.enable') + @import "home-top.styl" + +if hexo-config('carousel') + @import "carousel.styl" + +@import "category-bar.styl" + +if hexo-config('aside.position') == 0 + #home + order 2 +else + #home + order 1 \ No newline at end of file diff --git a/themes/solitude/source/css/_page/category.styl b/themes/solitude/source/css/_page/category.styl new file mode 100644 index 0000000..8713c8d --- /dev/null +++ b/themes/solitude/source/css/_page/category.styl @@ -0,0 +1,114 @@ +#category + #category-bar + padding 0 + border none + height auto + box-shadow none + + +maxWidth768() + border-radius 0 + background var(--efu-background) + margin-bottom 0 + position -webkit-sticky + position sticky + z-index 1 + padding 0 + height 50px + margin-top 0 + align-items center + +#page + .category-lists + padding 1rem 0 1.5rem + + +maxWidth768() + padding 0 + + ul + display flex + flex-wrap wrap + flex-direction row + margin-top .4rem + padding 0 0 0 1rem + list-style none + counter-reset li 0 + + ul + padding-left .2rem + + li + position relative + margin .3rem 0 + padding 4px 16px + width 200px + border-radius 12px + background var(--efu-card-bg) + border var(--style-border-always) + + &::before + display none + position absolute + left 0 + cursor pointer + transition all .3s ease-out 0s + top .7em + width .43em + height .43em + border .215em solid #307af6 + border-radius .43em + background 0 0 + content "" + + &:hover::before + border-color #ff7242 + + .category-title + font-size 2.57em + + +maxWidth768() + font-size 2em + + .tag-cloud-list + gap .5rem + a + display flex + width fit-content + color var(--efu-fontcolor) + font-size 1.4em + padding 0.2em 0.5em + background var(--efu-card-bg) + border-radius 12px + border var(--style-border-always) + box-shadow var(--efu-shadow-border) + align-items center + transition all .3s ease 0s + + +maxWidth768() + zoom .85 + + span.tags-punctuation + transition none + + &:hover + background var(--efu-main) !important + box-shadow var(--efu-shadow-blue) + color var(--efu-white) !important + border var(--style-border-hover) + + span.tagsPageCount + color var(--efu-lighttext) + + span.tags-punctuation + color inherit + +span.tagsPageCount + background var(--efu-secondbg) + padding 4px 4px + border-radius 8px + color var(--efu-secondtext) + line-height 1 + text-align center + min-width 35px + display inline-block + font-size 1rem + margin-left 4px \ No newline at end of file diff --git a/themes/solitude/source/css/_page/equipment.styl b/themes/solitude/source/css/_page/equipment.styl new file mode 100644 index 0000000..e5560ca --- /dev/null +++ b/themes/solitude/source/css/_page/equipment.styl @@ -0,0 +1,103 @@ +#equipment + margin-top 26px + + .equipment-item + .equipment-item-title + line-height 1 + + .equipment-item-description + line-height 1 + margin 4px 0 8px 0 + color var(--efu-secondtext) + + .equipment-item-content + display flex + flex-direction row + flex-wrap wrap + margin 0 -8px + + .equipment-item-content-item + width calc(25% - 12px) + border-radius 12px + border var(--style-border-always) + overflow hidden + margin 8px 6px + background var(--efu-card-bg) + box-shadow var(--efu-shadow-border) + min-height 400px + position relative + user-select none + + +maxWidth1200() + width calc(50% - 12px) + + +maxWidth768() + width 100% + + .equipment-item-content-item-cover + width 100% + height 200px + background var(--efu-secondbg) + display flex + justify-content center + + .equipment-item-content-item-image + object-fit cover + height 100% + + .equipment-item-content-item-info + padding 8px 16px 16px 16px + margin-top 12px + + .equipment-item-content-item-name + font-size 18px + font-weight 700 + line-height 1 + margin-bottom 8px + white-space nowrap + overflow hidden + text-overflow ellipsis + width fit-content + + &:hover + color var(--efu-vip) + cursor pointer + + .equipment-item-content-item-specification + font-size 12px + color var(--efu-secondtext) + line-height 1 + margin-bottom 12px + white-space nowrap + overflow hidden + text-overflow ellipsis + + .equipment-item-content-item-description + line-height 20px + color var(--efu-secondtext) + height 60px + display -webkit-box + overflow hidden + -webkit-line-clamp 3 + -webkit-box-orient vertical + font-size 14px + + .equipment-item-content-item-toolbar + display flex + justify-content space-between + position absolute + bottom 12px + left 0 + width 100% + padding 0 16px + + .equipment-item-content-item-link + font-size 12px + background var(--efu-gray-op) + padding 4px 8px + border-radius 8px + cursor pointer + + &:hover + background var(--efu-main) + color var(--efu-white) \ No newline at end of file diff --git a/themes/solitude/source/css/_page/error.styl b/themes/solitude/source/css/_page/error.styl new file mode 100644 index 0000000..d72297c --- /dev/null +++ b/themes/solitude/source/css/_page/error.styl @@ -0,0 +1,145 @@ +#body-wrap.error + display flex + flex-direction column + justify-content center + align-items center + padding 50px 1rem 1rem + position relative + + +maxWidth768() + padding-top 0 + + #error-wrap + display flex + justify-content center + margin 0 1rem + width 100% + position relative + + .error-content + display flex + flex-direction row + justify-content center + align-items center + margin 0 1rem + height 18rem + max-width 800px + background var(--efu-card-bg) + transition all .3s ease 0s + border var(--style-border-always) + position relative + width 100% + box-shadow none + border-radius 12px + + +maxWidth768() + flex-direction column + margin 0 + height 25rem + width 100% + + .error-img + flex 1 1 0 + height 100% + width 600px + border-top-left-radius 8px + border-bottom-left-radius 8px + background-color var(--efu-main) + background-position center center + background-size cover + + +maxWidth768() + flex 1 1 0 + width 100% + border-radius 12px + + .error-info + flex 1 1 0 + padding .5rem + text-align center + font-size 14px + font-family "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif + + +maxWidth768() + width 100% + padding-bottom 2rem + + .error_title + font-size 4rem + + .error_title + font-size 9em + line-height 1 + + .error_subtitle + word-break break-word + font-size 1.6em + -webkit-line-clamp 2 + + a + display inline-block + margin-top .5rem + padding .3rem 1.5rem + background var(--btn-bg) + color var(--btn-color) + transition .3s + + &:hover + background var(--efu-theme) + + i + padding-right .3rem + + .aside-list + display flex + flex-direction row + flex-wrap nowrap + margin 1rem + max-width 100% + + +maxWidth768() + padding-top 0 + + .aside-list-item + .thumbnail + height 100px + + .aside-list-group + display flex + flex-direction row + flex-wrap wrap + max-width 800px + margin 0 auto + justify-content space-between + + .aside-list-item + padding .5rem 0 + width 49% + + img + width 100% + object-fit cover + border-radius 12px + + .thumbnail + overflow hidden + width 100% + height 200px + background var(--efu-card-bg) + display flex + + .content .title + -webkit-line-clamp 2 + overflow hidden + display -webkit-box + -webkit-box-orient vertical + line-height 1.5 + justify-content center + align-items flex-end + align-content center + padding-top .5rem + font-size 16px + font-weight 700 + + .content time + display none \ No newline at end of file diff --git a/themes/solitude/source/css/_page/google.styl b/themes/solitude/source/css/_page/google.styl new file mode 100644 index 0000000..0ee6af3 --- /dev/null +++ b/themes/solitude/source/css/_page/google.styl @@ -0,0 +1,32 @@ +.google-vignette-test + animation 0.6s ease 0s 1 normal none running to_show + + > body + background-color var(--efu-maskbgdeep) + + .header-panel + background-color transparent + border none + + .header-message + color var(--efu-fontcolor) + + .close-button + line-height inherit + background var(--efu-maskbg) + border-radius 50% + padding 4px + margin 12px + display flex + align-items center + justify-content center + + .container + ins + iframe + border-radius 12px + border var(--style-border) + box-shadow var(--efu-shadow-border) + + > body + background-color var(--efu-maskbg) \ No newline at end of file diff --git a/themes/solitude/source/css/_page/index.styl b/themes/solitude/source/css/_page/index.styl new file mode 100644 index 0000000..defa73f --- /dev/null +++ b/themes/solitude/source/css/_page/index.styl @@ -0,0 +1,71 @@ +@import "_home/home" + +@import "category.styl" + +@import "tag.styl" + +@import "error.styl" + +if hexo-config('recent_comments.enable') + @import "recentcomment.styl" + +if hexo-config('says.enable') + @import "says.styl" + +if hexo-config('music.enable') + @import "music.styl" + +if hexo-config('google_adsense.enable') + @import "google.styl" + +if $equipment + @import "equipment.styl" + +if $link + @import "links.styl" + +if $about + @import "_about/about" + +@import "other" + +@import "message" + +#page h1.page-title + display inline + margin .4rem 0 1rem + +#page + background 0 0 + border none + padding 0 + box-shadow none + min-height calc(100vh - 464px) + + +maxWidth768() + padding 0 1rem + + > div:not(.author-content-item) + animation slide-in .6s .2s backwards + ++minWidth768() + > div:nth-child(1) > a::before + height: 24px + width: 44px + content: "" + background-size: 38px 24px + position: absolute + top: 0 + left: 0 + + > a:nth-child(0) > i + padding-right: 8px + ++minWidth768() + .needEndHide.hide + bottom -200px !important + opacity 0 + ++maxWidth768() + .needEndHide + display none!important \ No newline at end of file diff --git a/themes/solitude/source/css/_page/links.styl b/themes/solitude/source/css/_page/links.styl new file mode 100644 index 0000000..e742a33 --- /dev/null +++ b/themes/solitude/source/css/_page/links.styl @@ -0,0 +1,331 @@ +.flink#banners + margin-bottom: .5rem + +.flink#article-container + margin-top 1rem + + .flink-desc + margin 0 + color var(--efu-secondtext) + + .site-card-tag + position absolute + top 0 + left 0 + padding 4px 8px + background-color var(--efu-blue) + box-shadow var(--efu-shadow-blue) + color var(--efu-white) + z-index 1 + border-radius 0 0 12px 0 + transition .3s + font-size .6rem + overflow hidden + + .light + cursor pointer + position absolute + top 0 + width 100px + height 50px + background-image -webkit-linear-gradient(0deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, .5), rgba(255, 255, 255, 0)) + animation light_tag 4s both infinite + + &.vip + background-color var(--efu-vip) + + &.speed + background-color var(--efu-speed) + + .site-card-group + padding 20px 0 + display flex + flex-wrap wrap + justify-content flex-start + margin -8px + align-items stretch + + .site-card + margin 8px + display block + line-height 1.4 + border var(--style-border) + border-radius 12px + transition .3s + transition-timing-function ease-in-out + overflow hidden + height 200px + position relative + width calc(100% / 7 - 16px) + background var(--efu-card-bg) + box-shadow var(--efu-shadow-border) + + +maxWidth1200() + width calc(20% - 16px) + + +maxWidth1024() + width calc(25% - 16px) + + +maxWidth768() + width calc(33.3333% - 16px) + + .img + border-radius 0 + height 120px + width 100% + display flex + border none + padding 0 + transition all .3s ease 0s + overflow hidden + + img + border-radius 0 + transform scale(1.03) + transition .3s + margin 0 + max-width 100% + width 100% + height 100% + object-fit cover + + .img-alt + display none + + .info + display flex + border none + padding 0.5rem + width 100% + height 90px + margin 0 + border-radius 0 0 12px 12px + + img + border-radius 32px + transition all .3s ease-out + margin 2px 8px 0 0 + width 20px + height 20px + min-width 20px + min-height 20px + transform scale(1.1) + background var(--efu-secondbg) + + .site-card-text + display flex + flex-direction column + align-items flex-start + + .title + color var(--efu-fontcolor) + text-align left + font-weight 600 + display -webkit-box + -webkit-box-orient vertical + overflow hidden + -webkit-line-clamp 1 + transition all .3s ease 0s + + .desc + font-size .7rem + color var(--efu-fontcolor) + opacity .7 + transition all .3s + text-align left + overflow-wrap break-word + line-height 1.2 + display -webkit-box + -webkit-box-orient vertical + overflow hidden + -webkit-line-clamp 2 + + &:hover + border var(--style-border-hover) + box-shadow var(--efu-shadow-main) + background var(--efu-main) + + .site-card-tag + left: -60px + + .img + transform scale(1) + filter brightness(.3) + border-radius 12px + background var(--efu-lighttext) + background var(--efu-main) + +minWidth768() + height 80px + + img + transform scale(1.1) + + a + color var(--efu-white) + background var(--efu-main) + box-shadow var(--efu-shadow-main) + + .info + height 120px + background-color var(--efu-theme) + + img + width 0 + height 0 + opacity 0 + min-width 0 + min-height 0 + + .title + color var(--efu-white) + + .desc + color var(--efu-white) + text-align left + -webkit-line-clamp 4 + width 100% + + .flink-list + padding 0 + margin 0.5rem -6px 1rem -6px + overflow-x hidden + text-align center + + &.mini + > .flink-list-item + height 60px + + a + img + width 30px + height 30px + min-width 30px + min-height 30px + + .flink-item-desc + display none + + > .flink-list-item + margin 6px 6px + transition .3s + border-radius 12px + transition-timing-function ease-in-out + position relative + width calc(20% - 12px) + border var(--style-border-always) + box-shadow var(--efu-shadow-border) + background var(--efu-card-bg) + display flex + float left + overflow hidden + height 90px + line-height 17px + transform translateZ(0) + + +maxWidth1200() + width calc(25% - 12px) + + +maxWidth1024() + width calc(33.3333% - 12px) + + +maxWidth768() + width calc(50% - 12px) + + +maxWidth600() + width calc(100% - 12px) + + a + display flex + width 100% + height 100% + border none + align-items center + + .img-alt + display none + + img + border-radius 32px + margin 15px 20px 15px 15px + transition .3s + background var(--efu-background) + min-width 60px + min-height 60px + float left + width 60px + height 60px + + .flink-item-info + display flex + flex-direction column + justify-content center + width calc(100% - 90px) + height fit-content + padding 0 4px + + span + transition .3s + + .flink-item-name + text-align left + font-size 19px + line-height 20px + color var(--efu-fontcolor) + display block + padding 0 10px 0 0 + font-weight 700 + max-width calc(100% - 12px) + overflow hidden + text-overflow ellipsis + white-space nowrap + + .flink-item-desc + white-space normal + padding 5px 10px 16px 0 + color var(--efu-fontcolor) + text-align left + height 40px + text-overflow ellipsis + opacity .7 + display -webkit-box + overflow hidden + -webkit-box-orient vertical + -webkit-line-clamp 2 + font-size .93em + + &:hover + background var(--efu-theme) + + .site-card-tag + left: -50px + + a + background 0 0 + + img + transition .6s + width 0 + height 0 + opacity 0 + margin 5px + min-width 0 + min-height 0 + + .flink-item-info + min-width calc(100% - 20px) + + .flink-item-name + color var(--efu-card-bg) + + .flink-item-desc + color var(--efu-card-bg) + overflow hidden + width 100% + +@keyframes light_tag + 0% + transform skewx(0) + left -150px + 99% + transform skewx(-25deg) + left 50px \ No newline at end of file diff --git a/themes/solitude/source/css/_page/message.styl b/themes/solitude/source/css/_page/message.styl new file mode 100644 index 0000000..c6a9b6c --- /dev/null +++ b/themes/solitude/source/css/_page/message.styl @@ -0,0 +1,64 @@ +.switch_message + display flex + justify-content center + margin 1rem 0 + gap .5rem + button + background-color var(--efu-main) + border var(--style-border-always) + border-radius 50px + color var(--efu-card-bg) + padding 0.5rem 1rem + transition background-color 0.3s + +#barrage + display flex + justify-content center + width 100% + height calc(100% - 60px) + position fixed + left 0 + top 60px + z-index 1 + pointer-events none + + .default-style + pointer-events all + cursor pointer + font-size 16px + border-radius 100px + overflow hidden + + a + background-color rgba(0, 0, 0, 0.5) + transition .3s + color #eee + display flex + align-items center + justify-content center + padding 6px 16px 6px 6px + text-decoration none + border-bottom none + + &:hover + background-color rgba(0, 0, 0, 0.7) + + img + pointer-events none + height 30px + width 30px + margin 0 5px 0 0 !important + border-radius 50% !important + + p + line-height 1 + pointer-events none + margin 0 !important + max-width 300px + white-space nowrap + overflow hidden + text-overflow ellipsis + +#barrage.hide + z-index -1 + opacity 0 \ No newline at end of file diff --git a/themes/solitude/source/css/_page/music.styl b/themes/solitude/source/css/_page/music.styl new file mode 100644 index 0000000..a2dd1aa --- /dev/null +++ b/themes/solitude/source/css/_page/music.styl @@ -0,0 +1,510 @@ +body[data-type=music] + #page-header #nav a + color var(--efu-white) + + #page-header.not-top-img #nav .back-home-button + color var(--efu-white) + + .page + .layout#content-inner + background none + + #page + padding 0 + background transparent + overflow hidden + + #footer, + #nav-music + display none + +#Music-bg + display none + position fixed + z-index -999 + width 200% + height 200% + top -50% + left -50% + background-position 0 0 + background-size 40% + transition 0.6s + background-color rgba(0, 0, 0, 0.4) + + &:before + display none + content '' + background rgba(0, 0, 0, 0.4) + backdrop-filter blur(200px) + -webkit-backdrop-filter blur(200px) + position fixed + z-index -998 + top -50% + left -50% + width 200% + height 200% + + &.show + &:before + display block + +#Music-page + max-width 1400px + + meting-js + .aplayer + display flex + flex-direction row-reverse + background transparent + box-shadow none + justify-content space-between + overflow visible + + .aplayer-body + width 70% + height 75vh + + +maxWidth798() + width 100% + overflow hidden + position fixed + margin auto + margin-top 50px + left 0 + right 0 + top 0 + height calc(var(--vh) - 230px) + + ol + max-height calc(var(--vh) - 170px)!important + + & > li + font-size 14px + opacity 0.6 + border-top none + + +maxWidth798() + display flex + + &:hover + background var(--efu-black-op) + border-radius 6px + + &.aplayer-list-light + background var(--efu-black-op) + border-radius 6px + height 60px + display flex + flex-direction column + opacity 1 + transition none + + +maxWidth798() + background var(--efu-main) + padding 5px 20px + border-radius 10px + height 52px + justify-content center + + .aplayer-list-index + display none + + .aplayer-list-title + font-size 20px + line-height 20px + margin-top 8px + font-weight bold + overflow hidden + text-overflow ellipsis + white-space nowrap + + +maxWidth798() + margin-top 4px + + .aplayer-list-cur + display none + + span + +maxWidth798() + color #fff + + &.aplayer-list-author + max-width 100% + + +maxWidth798() + margin-left 0 + right 15px + + span + color var(--efu-white) + + +maxWidth798() + color var(--efu-black) + + &.aplayer-list-title + line-height 32px + + +maxWidth798() + max-width 55% + display -webkit-box + -webkit-line-clamp 1 + overflow hidden + -webkit-box-orient vertical + width 30% + + &.aplayer-list-author + opacity 0.6 + overflow hidden + text-overflow ellipsis + white-space nowrap + max-width 40% + line-height 32px + + +maxWidth798() + right 10px + width auto + max-width 35% + display -webkit-box + -webkit-line-clamp 1 + overflow hidden + -webkit-box-orient vertical + margin-left auto + + .aplayer-list-index + line-height 32px + opacity 0.6 + + &::-webkit-scrollbar-thumb + background-color var(--efu-white-op) + + .aplayer-list + transition none + + .aplayer-pic + float none + width 60px + height 60px + border-radius 12px + margin auto + bottom 30px + left 90px + position fixed + z-index 999 + display none + + .aplayer-info + margin 0 20px 0 20px + border-bottom none + + .aplayer-music + display none + + +maxWidth798() + display flex + position fixed + top calc(var(--vh) - 178px) + left 0 + margin 0 + margin-left 32px + height 21px + max-width calc(100vw - 110px) + white-space nowrap + overflow hidden + text-overflow ellipsis + opacity 0.6 + align-items center + line-height 1 + + .aplayer-title + +maxWidth798() + margin 0 + + .aplayer-author + +maxWidth798() + margin-left 4px + + .aplayer-author, + .aplayer-title + +maxWidth798() + white-space nowrap + overflow hidden + text-overflow ellipsis + max-width calc(100vw - 176px) + font-size 16px + font-weight normal + line-height 1 + color #fff + + .aplayer-lrc + padding-top 24% + height var(--vh) + + &:hover + p + filter blur(0px) + + p + font-size 36px + line-height 44px !important + height 44px !important + margin-bottom 36px !important + color #fff + font-weight bold + text-align left + filter blur(2px) + opacity 0.3 + transition all 0.9s cubic-bezier(0.56, 0.17, 0.22, 0.76) + user-select none + text-shadow 0 4px 0 #ffffff00 + overflow hidden + + +maxWidth798() + font-size 32px + margin-bottom 38px + line-height 42px + height 42px + + &.aplayer-lrc-current + filter blur(0px) + opacity 1 + transition all 0.3s cubic-bezier(0.56, 0.17, 0.22, 0.76), text-shadow 8s 4s ease-in + height fit-content !important + text-shadow 0 4px 4px #ffffff94 + + &:first-child + text-shadow 0 4px 4px #ffffff00 + + .aplayer-controller + position fixed + max-width 1400px + margin auto + left 0 + right 0 + bottom 38px + display flex + justify-content center + align-items center + + +maxWidth798() + width 100% + bottom 120px + + .aplayer-bar-wrap + margin 0 160px 0 150px + + +maxWidth798() + margin 0 32px + + .aplayer-played + background var(--efu-white) !important + + .aplayer-thumb + -webkit-transform none + transform none + background #fff !important + + .aplayer-time + position absolute + width 100% + bottom 26px + height 0 + display flex + justify-content flex-end + + +maxWidth798() + bottom -40px + align-items center + + .aplayer-icon + width 1.8rem + height 1.8rem + margin-left 16px + + path + fill var(--efu-white) + opacity 0.8 + + .aplayer-time-inner + margin-right 18px + margin-top -8px + + +maxWidth798() + position absolute + width 100% + margin-right 4px + margin-top -60px + + .aplayer-dtime + position absolute + right 30px + + .aplayer-ptime + position absolute + left 44px + + .aplayer-icon-back + position absolute + left 0 + display inline + + +maxWidth798() + margin auto + right 110px + + .aplayer-icon-play + position absolute + left 40px + display inline + + +maxWidth798() + margin auto + right 0 + left 0 + width 56px + height 56px + + .aplayer-icon-forward + position absolute + left 80px + display inline + + +maxWidth798() + margin auto + left 110px + right 0 + + .aplayer-icon-order + +maxWidth798() + position absolute + left 22px + width 24px + height 24px + opacity 0.4 + + .aplayer-icon-loop + +maxWidth798() + position absolute + right 25px + width 24px + height 24px + opacity 0.4 + + .aplayer-icon-menu + display none + + +maxWidth798() + display inline + position absolute + right 30px + top -100px + width 24px + height 24px + opacity 0.4 + + .aplayer-list + width 40% + max-width 480px + max-height none !important + height 100% + min-width 200px + + +maxWidth798() + position fixed + z-index 1002 + width 100% + bottom 0 + left 0 + background var(--efu-white) + border-radius 16px 16px 0 0 + padding 15px 0 + max-width 100% + height 75vh + transition all .3s + + &.aplayer-list-hide + bottom -100% !important + + .aplayer + .aplayer-lrc + +maxWidth798() + overflow inherit + + &:after, + &:before + display none + + .aplayer-lrc-contents + width 90% + margin-left auto + transition all .5s cubic-bezier(0.49, 0.21, 0.22, 0.84) + position relative + + +maxWidth798() + width 100% + + .aplayer-info + .aplayer-controller + .aplayer-bar-wrap + .aplayer-bar + height 8px + border-radius 8px + background var(--efu-white-op) + + .aplayer-loaded + background var(--efu-white-op) + height 8px + border-radius 8px + + .aplayer-played + height 8px + border-radius 8px + + .aplayer-thumb + height 16px + width 16px + + .aplayer-time + color var(--efu-white) + + + .aplayer-volume-wrap + &:hover + .aplayer-volume-bar-wrap + height 120px + border-radius 40px + width 30px + + .aplayer-volume-bar-wrap + width 30px + right 6px + + .aplayer-volume-bar + width 100% + height 100% + left 0 + + .aplayer-volume + width: 100% + background: var(--efu-white) !important + + .aplayer-icon-volume-down + display block + + +maxWidth798() + display none + + .aplayer-volume-bar-wrap + +maxWidth798() + bottom 0 + right 7px + +.Music-loading + display flex + align-items center + justify-content center + height 50vh + + div + font-size 1rem + font-weight bold + letter-spacing 2px \ No newline at end of file diff --git a/themes/solitude/source/css/_page/other.styl b/themes/solitude/source/css/_page/other.styl new file mode 100644 index 0000000..0c8b592 --- /dev/null +++ b/themes/solitude/source/css/_page/other.styl @@ -0,0 +1,270 @@ +div#banners + display flex + width 100% + background var(--efu-card-bg) + border var(--style-border-always) + border-radius 12px + overflow hidden + position relative + box-shadow var(--efu-shadow-border) + flex-direction column + transition .3s + will-change transform + animation slide-in .6s .1s backwards + + #home_top & + +maxWidth1200() + height calc(328px + .5rem) + + :not(.flink)&:hover + box-shadow var(--efu-shadow-main) + + .banner-button-group + position absolute + right 2rem + top 2rem + display flex + + +maxWidth768() + display none + + .banner-button + padding 8px 12px + background var(--efu-fontcolor) + border-radius 12px + color var(--efu-card-bg) + display flex + align-items center + z-index 1 + transition .3s + cursor pointer + box-shadow var(--efu-shadow-black) + + &.secondary + background var(--efu-secondbg) + border var(--style-border-always) + color var(--efu-lighttext) + margin-right 1rem + box-shadow var(--efu-shadow-border) + + &:hover + background var(--efu-theme) + color var(--efu-white) + + i + margin-right 8px + font-size 1rem + + /.banners-title + top 2.6rem + left 2rem + position absolute + display flex + flex-direction column + + &-big + font-size 36px + line-height 1 + font-weight 700 + margin-bottom 8px + + &-small + font-size 12px + line-height 1 + color var(--efu-secondtext) + margin-top 8px + margin-bottom 0.5rem + margin-left 2px + + /.flink + .banners-title + top 1.5rem + + .bannerText + font-size 4rem + line-height 4rem + font-weight 700 + +/.tags-group-all + display flex + + #home_top & + +maxWidth600() + opacity 0.06 + filter blur(8px) + z-index -1 + + &.nowrapMove + padding-bottom 2rem + + .tags-group-wrapper + margin-top: 7rem + animation: rowleft 120s linear infinite + display flex + + +maxWidth768() + margin-top 7.5rem + + .tags-group-icon + border-radius 50% + + img + min-width 100% + min-height 100% + border-radius 50% + object-fit cover + + .tags-group-icon-pair + margin-left 1rem + user-select none + + a img + border-radius 50% + + /.tags-group-icon + width 120px + height 120px + border-radius 30px + display flex + align-items center + justify-content center + color #fff + font-size 66px + font-weight 700 + box-shadow var(--efu-shadow-blackdeep) + + &:nth-child(even) + margin-top 1rem + transform translate(-60px) + + img + width 60% + +.author-content + display flex + flex-wrap wrap + justify-content space-between + width 100% + gap .5rem + + +maxWidth768() + margin-top 0 + + .author-content-item + +maxWidth1300() + animation slide-in .6s 0s backwards + +maxWidth768() + width 100% !important + padding 1rem + +.author-content.author-content-item.sharePage + height 19rem + background-size cover + color var(--efu-white) + overflow hidden + margin-top 0 + +.author-content-item + width 49.5% + border-radius 12px + background var(--efu-card-bg) + border var(--style-border-always) + box-shadow var(--efu-shadow-border) + position relative + overflow hidden + padding 1rem 2rem + + &.single + width 100% + + .author-content-item-title + font-size 36px + font-weight 700 + line-height 1 + + .author-content-item-tips + opacity .8 + font-size .6rem + margin-bottom .5rem + + .content-bottom + margin-top auto + display flex + align-items center + justify-content space-between + + .icon-group + display flex + + i + display inline-block + width 22px + height 18px + margin-right .5rem + + .card-content + position absolute + width 100% + height 100% + top 0 + left 0 + display flex + flex-direction column + padding 1rem 2rem + + +maxWidth768() + padding 1rem + + .author-content-item-title + margin-bottom .5rem + + .banner-button-group + position absolute + bottom 1rem + right 2rem + + .banner-button + height 40px + width 118px + border-radius 20px + justify-content center + background var(--efu-black-op) + color var(--efu-white) + display flex + align-items center + z-index 1 + transition .3s + cursor pointer + backdrop-filter saturate(180%) blur(20px) + -webkit-backdrop-filter blur(20px) + transform translateZ(0) + + &:hover + background var(--efu-main) + color var(--efu-card-bg) + + i + margin-right 8px + font-size 22px + ++maxWidth900() + .author-content-item + .card-content + .banner-button-group + right 1rem + bottom 1rem + + .banner-button-group + .banner-button + background 0 0 + color var(--efu-white) + padding 0 + width 30px + height 30px + + i + margin-right 0 + font-size 1.5rem + + .banner-button-text + display none \ No newline at end of file diff --git a/themes/solitude/source/css/_page/recentcomment.styl b/themes/solitude/source/css/_page/recentcomment.styl new file mode 100644 index 0000000..8ca5a16 --- /dev/null +++ b/themes/solitude/source/css/_page/recentcomment.styl @@ -0,0 +1,85 @@ +div#comments-page + display flex + flex-wrap wrap + gap 12px + min-height 100px + width 100% + margin-top .5rem + +.comment-card + position relative + width calc(100% / 3 - 8px) + background var(--efu-card-bg) + border-radius 12px + border var(--style-border-always) + padding 14px + cursor pointer + transition .3s + overflow hidden + gap 8px + display flex + flex-direction column + + +maxWidth900() + width calc(100% / 2 - 6px) + + +maxWidth768() + width 100% + + &:hover + border-color var(--style-border-hover-always) + +.comment-info + display flex + align-items center + gap 8px + border-bottom var(--style-border-always) + padding-bottom 8px + + div + display flex + flex-direction column + line-height 1.5 + +.comment-article, .comment-content + transition .3s + overflow hidden + text-overflow ellipsis + display -webkit-box + -webkit-box-orient vertical + -webkit-line-clamp 2 + line-height 1.7 + font-size 14px + +.comment-title + font-size 12px + color var(--efu-secondtext) + margin-top auto + transition .3s + overflow hidden + text-overflow ellipsis + display -webkit-box + -webkit-box-orient vertical + -webkit-line-clamp 1 + line-height 1 + opacity .6 + padding-top 8px + + i + font-size 12px + line-height 12px + +#comments-page .comment-info img + width 30px + height 30px + object-fit cover + border-radius 30px + margin 0 + +span.comment-user + font-weight 700 + +time.comment-time + font-size 12px + color var(--efu-secondtext) + margin-left auto \ No newline at end of file diff --git a/themes/solitude/source/css/_page/says.styl b/themes/solitude/source/css/_page/says.styl new file mode 100644 index 0000000..f0624d2 --- /dev/null +++ b/themes/solitude/source/css/_page/says.styl @@ -0,0 +1,370 @@ +if hexo-config('says.home_mini') + #bbTimeList + background var(--efu-card-bg) + border-radius 12px + display flex + white-space nowrap + overflow hidden + border var(--style-border) + transition .3s + height 50px + width 100% + justify-content space-between + user-select none + align-items center + padding .5rem 1rem + animation slide-in .6s 0s backwards + margin-bottom .5rem + + &.more-page + margin-bottom 0 + + +minWidth1300() + &:hover + border var(--style-border-hover) + box-shadow var(--efu-shadow-main) + + +maxWidth768() + margin 0 + background var(--efu-background) + border none + i.bber-logo, + i.bber-gotobb + transition .3s + cursor pointer + + &:hover + opacity .8 + color var(--efu-theme) + + i.bber-logo + font-size 2rem + margin-right 1rem + + i.bber-gotobb + font-size 16px + margin-left 1rem + +if hexo-config('says.enable') + #bber + margin-top .5rem + width 100% + + if hexo-config('says.style') == 2 + .meta + display flex + align-items center + line-height 1.5 + position relative + width 100% + margin-bottom 4px + + .avatar + margin 0 + width 50px + height 50px + border-radius 10px + + .info + display flex + flex-direction column + margin-left 10px + + span.bber_nick + color var(--efu-main) + font-size .9rem + + time.bber_date + font-size 14px + opacity .6 + + .goComment + position: absolute + top: 0 + right: 0 + + div + &.bber-content + display flex + flex-direction initial + flex-wrap wrap + border-radius 12px + width 100% + height 100% + + if hexo-config('says.style') == 1 + .bber-bottom + display flex + justify-content space-between + width 100% + user-select none + + .bber-info + display flex + align-items center + + .fa-rectangles-mixed + margin-right 8px + + .bber-info-time, .bber-info-location + margin-right .5rem + color var(--efu-fontcolor) + font-size .7rem + background-color var(--efu-gray-op) + padding 0 8px + border-radius 20px + cursor default + display flex + align-items center + + i + margin-right 8px + font-size 16px + + .datafrom + order 2 + color var(--efu-secondtext) + font-size .7rem + margin-left 8px + + small + font-size .7rem + + .bber-content-link + display flex + margin-right .5rem + color var(--efu-secondtext) + font-size .7rem + align-items center + background-color rgba(245, 108, 108, .13) + padding 0 8px + border-radius 20px + + &:hover + background-color var(--efu-main) + color var(--efu-white) + + i + margin-right 3px + font-size 16px + + .count + color var(--efu-secondtext) + font-size .8rem + + p + margin 0 + + .datafrom + i + margin-right 4px + + .bber-music + width 100% + height 90px + margin .5rem 0 + border-radius 8px + overflow hidden + border var(--style-border-always) + background var(--efu-secondbg) + + .aplayer-lrc + display none + + .aplayer + margin 0 + + .aplayer-info + .aplayer-music + height 23px + + .aplayer-title + font-size .8rem + font-weight 700 + margin 0 + color var(--efu-black) + + .aplayer-controller + align-items center + + .aplayer-bar-wrap + padding 0 + + .aplayer-bar + background var(--efu-gray) + height 8px + border-radius 12px + transition .3s + overflow hidden + + .aplayer-played + height 100% + border-radius 12px + + .aplayer-thumb + display none + + .aplayer-loaded + height 100% + border-radius 12px + + &:hover + .aplayer-bar + height 12px + + .aplayer-time + position initial + + &.aplayer-withlrc + .aplayer-pic + height 82px + width 82px + margin 4px + border-radius 4px + + .bber-video + position relative + padding 30% 50% + margin 0.5rem 0 + + .bber-content-img + height 100px + margin auto + margin-top 0.2rem + margin-bottom 0.3rem + margin-left 0 + border-radius 12px + overflow hidden + display flex + position relative + + img + margin-right 10px + object-fit cover + max-height 100% + border-radius 12px + min-height 100px + height 100px + + .bber-content + .datacont + order 0 + font-size .8rem + font-weight 700 + color var(--efu-fontcolor) + width 100% + line-height 1.38 + border-radius 12px + margin-bottom .5rem + display flex + flex-direction column + text-align justify + + .timeline + ul + li + &.item + position relative + width calc(33% - .06rem) + border var(--style-border-always) + border-radius 12px + padding 1rem 1rem .5rem + transition .3s + display flex + flex-direction column + flex-wrap nowrap + justify-content space-between + align-items flex-start + background var(--efu-card-bg) + margin-right .5rem + margin-bottom .5rem + box-shadow var(--efu-shadow-border) + + +maxWidth1300() + width 49.5% + margin-right 1% + + +maxWidth768() + width 100% + margin-right 0 + padding 16px 20px + + hr + display flex + position relative + margin 8px 0 + border 1px dashed var(--efu-theme-op) + width 100% + + &:hover + border var(--style-border-hover) + + ul + &.list + display flex + flex-direction row + flex-wrap wrap + + li + &.item + display flex + flex-direction column + flex-wrap nowrap + align-items flex-start + + #bber .bber-video video, + #bber .bber-video iframe + position absolute + width 100% + height 100% + left 0 + top 0 + margin 0 + border-radius 8px + border var(--style-border) + + #bber-tips + font-size 14px + display flex + justify-content center + margin-top 1rem + color var(--efu-secondtext) + + #bber-talk + width 100% + height 25px + line-height 25px + display flex + flex-direction column + + .li-style + width auto + max-width 100% + height 25px + text-align center + overflow hidden + text-overflow ellipsis + transition .3s + display flex + justify-content center + align-items center + font-weight 700 + margin auto + cursor pointer + white-space nowrap + + .solitude + font-size 1rem + margin-left .5rem + + #bbtalk + overflow hidden + width 100% + text-overflow ellipsis + white-space nowrap + + #bbTimeList + .li-style + &:hover + color var(--efu-theme) + transition .3s \ No newline at end of file diff --git a/themes/solitude/source/css/_page/tag.styl b/themes/solitude/source/css/_page/tag.styl new file mode 100644 index 0000000..bfea334 --- /dev/null +++ b/themes/solitude/source/css/_page/tag.styl @@ -0,0 +1,59 @@ +#tag + +minWidth1300() + padding: 4rem 2rem 1rem 2rem!important + overflow hidden + + +maxWidth768() + padding 0 1rem + + #tag-page-tags + display flex + flex-direction row + flex-wrap wrap + margin 0 + margin-bottom 0.5rem + position absolute + z-index 1 + width 100% + padding 1rem 2rem + left 0 + top 0 + max-height 64px + overflow hidden + background var(--efu-card-bg) + backdrop-filter saturate(180%) blur(20px) + transition .1s ease-out + + &:hover + max-height 1000px + transition .3s ease-out + background var(--efu-maskbgdeep) + + a + padding .1rem .5rem + margin .25rem .25rem + line-height 1.6 + border-radius 8px + color var(--efu-fontcolor) !important + border var(--style-border-always) + display flex + align-items center + background var(--efu-card-bg) + transition all .3s ease-out 0s + + &.select + order -1 + color var(--efu-card-bg) !important + background var(--efu-theme) + box-shadow var(--efu-shadow-theme) + + &:hover + color var(--efu-white) !important + background var(--efu-theme) + box-shadow var(--efu-shadow-theme) + + &.select .tagsPageCount + background var(--efu-card-bg) + color var(--efu-lighttext) + +maxWidth768() + display none \ No newline at end of file diff --git a/themes/solitude/source/css/_post/ads.styl b/themes/solitude/source/css/_post/ads.styl new file mode 100644 index 0000000..8127f76 --- /dev/null +++ b/themes/solitude/source/css/_post/ads.styl @@ -0,0 +1,4 @@ +#post + .google-ads-warp + +maxWidth900() + margin 0 1rem \ No newline at end of file diff --git a/themes/solitude/source/css/_post/commentBarrage.styl b/themes/solitude/source/css/_post/commentBarrage.styl new file mode 100644 index 0000000..3db3141 --- /dev/null +++ b/themes/solitude/source/css/_post/commentBarrage.styl @@ -0,0 +1,135 @@ +.comment-barrage + position fixed + bottom 0 + right 20px + padding 0 0 20px 10px + display none + flex-direction column + justify-content flex-end + z-index 999 + transition all .3s ease 0s + user-select none + + +maxWidth768() + display none !important + + .comment-barrage-item + min-width 300px + max-width 300px + width fit-content + min-height 80px + max-height 150px + margin 4px + padding 8px 14px + background var(--efu-maskbgdeep) + border-radius 8px + color var(--efu-fontcolor) + animation 0.6s cubic-bezier(0.42, 0, 0.3, 1.11) 0s 1 normal none running barrageIn; + transition all 0.3s ease 0s + display: flex + flex-direction column + border var(--style-border) + backdrop-filter saturate(180%) blur(20px) + box-shadow var(--efu-shadow-border) + overflow hidden + + &:hover + border var(--style-border-hover) + box-shadow var(--efu-shadow-main) + + &.out + opacity 0 + animation 0.6s cubic-bezier(0.42, 0, 0.3, 1.11) 0s 1 normal none running barrageOut + + &.hovered + opacity 0 + + .comment-barrage-close + color var(--efu-secondtext) + cursor pointer + line-height 1 + margin 4px + + &:hover + color var(--efu-main) + + .solitude + color var(--efu-fontcolor) + font-size 18px + + .barrageHead + height 30px + padding 0 0 6px + line-height 30px + font-size 12px + border-bottom var(--style-border) + display flex + justify-content space-between + align-items center + font-weight 700 + + .barrageTitle + color var(--efu-card-bg) + margin-right 8px + background var(--efu-fontcolor) + line-height 1 + padding 4px + border-radius 4px + white-space nowrap + + &:hover + background var(--efu-main) + color var(--efu-white) + + .barrageAvatar + width 16px + height 16px + margin 0 8px 0 auto + border-radius 50% + background var(--efu-secondbg) + + .barrageContent + height calc(100% - 30px) + overflow hidden + width fit-content + max-height 48px + font-size 14px !important + font-weight 400 !important + + h1, h2, h3, h4 + font-size 14px !important + font-weight 400 !important + margin 8px 0 !important + + a + pointer-events none + font-size 14px !important + + p + margin 8px 0 + line-height 1.3 + overflow hidden + text-overflow ellipsis + -webkit-line-clamp 2 + display -webkit-box + -webkit-box-orient vertical + font-size 14px + max-width 270px + + img:not(.tk-owo-emotion) + display none + img.tk-owo-emotion + width 16px + padding 0 + margin 0 + transform translateY(2px) + + pre, li, blockquote, br + display none + + &::-webkit-scrollbar + height 0 + width 4px + + &::-webkit-scrollbar-button + display none \ No newline at end of file diff --git a/themes/solitude/source/css/_post/copyright.styl b/themes/solitude/source/css/_post/copyright.styl new file mode 100644 index 0000000..a9bd1b9 --- /dev/null +++ b/themes/solitude/source/css/_post/copyright.styl @@ -0,0 +1,214 @@ +#post + .post-copyright + background var(--efu-secondbg) + border-width 1px + transition 0.3s + position relative + margin 80px 0 .5rem + border-radius 12px + padding 34px 0 20px 0 + border var(--style-border-always) + + +maxWidth768() + box-shadow var(--efu-shadow-border) + padding: 1rem 1.3rem; + + .post-copyright__author_group + .post-copyright__author_img + width 64px + height 64px + margin auto + border-radius 64px + overflow hidden + position absolute + left calc(50% - 33px) + top -33px + border var(--style-border-always) + box-shadow var(--efu-shadow-main) + + img + width 100% + height 100% + object-fit cover + object-position center + position absolute + bottom 0 + left 0 + + &:hover + transform scale(1.3) + + .post-copyright__author_name + text-align center + font-size 20px + font-weight 700 + margin-top 16px + color var(--efu-fontcolor) + line-height 1 + + .post-copyright__author_desc + text-align center + font-size 14px + color var(--efu-secondtext) + margin-top 4px + + .post-copyright__notice + font-size 12px + margin 0.5rem 0 + display flex + justify-content center + + .post-copyright-info + padding-left 0 + color var(--efu-secondtext) + overflow hidden + display -webkit-box + -webkit-line-clamp 3 + -webkit-box-orient vertical + text-align center + max-width 500px + + +maxWidth768() + -webkit-line-clamp 2 + + a + text-decoration none + word-break break-word + padding 0 4px + border-radius 4px + color var(--efu-fontcolor) + font-weight 700 + + &:hover + text-decoration none + background-color var(--efu-main) + color var(--efu-white) + cursor pointer + border-radius 4px + + .social-share + display flex + justify-content center + height 40px + margin .5rem auto + gap .5rem + flex-wrap wrap + + .social-share-ico + display flex + justify-content center + align-items center + width 40px + height 40px + border-radius 12px + border var(--style-border) + cursor pointer + transition .3s + + +maxWidth768() + &:nth-child(n+6) + display none + + &:hover + color white + + .icon-qq + color #56b6e7 + border-color #56b6e7 + &:hover + background-color #56b6e7 + + .icon-weibo + color #d44040 + border-color #d44040 + + &:hover + background-color #d44040 + + .icon-facebook + color #415dc9 + border-color #415dc9 + + &:hover + background-color #415dc9 + + .icon-twitter + color #56b6e7 + border-color #56b6e7 + + &:hover + background-color #56b6e7 + + .icon-telegram + color #56b6e7 + border-color #56b6e7 + + &:hover + background-color #56b6e7 + + .icon-linkedin + color #0077b5 + border-color #0077b5 + + &:hover + background-color #0077b5 + .icon-whatsapp + color #25d366 + border-color #25d366 + + &:hover + background-color #25d366 + .icon-link + color #425AEF + border-color #425AEF + + &:hover + background-color #425AEF + .icon-qrcode + position relative + color #000 + border-color #000 + + +maxWidth900() + display none + + &:hover + background-color #000 + + .share-main + display flex + + .share-main + display none + position absolute + bottom 1.7rem + z-index 100 + padding-bottom 15px + + &-all + padding 12px + border-radius 12px + background var(--efu-background) + animation donate_effcet 0.3s 0.1s ease both + flex-direction column + border var(--style-border-always) + + .reward-dec + font-size 0.6rem + color var(--efu-fontcolor)!important + text-align center + + #qrcode + width 150px + height 150px + min-width 150px + min-height 150px + background var(--efu-white) + padding 8px + border-radius 8px + margin-bottom 8px + border var(--style-border-always) + + img + width 132px + height 132px \ No newline at end of file diff --git a/themes/solitude/source/css/_post/index.styl b/themes/solitude/source/css/_post/index.styl new file mode 100644 index 0000000..ae414ee --- /dev/null +++ b/themes/solitude/source/css/_post/index.styl @@ -0,0 +1,18 @@ +if hexo-config('comment.commentBarrage') + @import 'commentBarrage' + +@import "copyright" + +@import "meta" + +@import "relatedPost" + +@import "tools" + +@import "pagination" + +if hexo-config('post_ai.enable') + @import "postAI" + +if hexo-config('google_adsense.enable') + @import "ads.styl" \ No newline at end of file diff --git a/themes/solitude/source/css/_post/meta.styl b/themes/solitude/source/css/_post/meta.styl new file mode 100644 index 0000000..cacba57 --- /dev/null +++ b/themes/solitude/source/css/_post/meta.styl @@ -0,0 +1,377 @@ +.post + #page-header.post-bg + height 20rem + background-color var(--efu-background) + transition .6s + overflow hidden + + +minWidth1300() + height: 25rem + + +maxWidth768() + height 30rem + background-color var(--efu-main) !important + transition 0s + margin-bottom -12px + + &::before + transition .3s + height 20rem + background-color var(--efu-main) + opacity 1 + position absolute + top 0 + left 0 + display block + width 100% + content "" + + +minWidth1300() + height 25rem + opacity 0 + background-color var(--efu-main) + animation slide-in-op .6s 0s forwards + + +maxWidth768() + height 15rem + + .post-bg + .main-hero-waves-area + width 100% + position absolute + left 0 + bottom -11px + + .waves-area .waves-svg + width 100% + height 60px + + .parallax > use + animation move-forever 30s cubic-bezier(.55, .5, .45, .5) infinite + + .parallax > use:nth-child(1) + animation-delay -2s + animation-duration 7s + fill var(--efu-background) + opacity .5 + + .parallax > use:nth-child(2) + animation-delay -3s + animation-duration 10s + fill var(--efu-background) + opacity .6 + + .parallax > use:nth-child(3) + animation-delay -4s + animation-duration 13s + fill var(--efu-background) + opacity .7 + + .parallax > use:nth-child(4) + animation-delay -5s + animation-duration 20s + fill var(--efu-background) + + +maxWidth768() + .main-hero-waves-area + display none + + #post-cover + width 100% + height 100% + object-fit cover + min-width 50vw + min-height 20rem + opacity .8 + + +minWidth768() + min-height 15rem !important + height 70% !important + opacity 1 !important + + .coverdiv + width 70% + height 100% + position relative + overflow hidden + margin 0 -20% 0 auto + transform rotate(10deg) translateY(-10%) scale(2) + filter blur(10px) + + &:after + position absolute + content '' + width 100% + height 100% + top 0 + left 0 + box-shadow 110px -130px 300px 60px var(--efu-main) inset + + +minWidth768() + width 70% + height 100% + position relative + overflow hidden + margin 0 -20% 0 auto + transform rotate(10deg) translateY(-8%) scale(1.8) + filter blur(10px) + opacity 0 + + &.loaded + display block + opacity .5 + animation showCover 1s .3s backwards + transform rotate(10deg) translateY(-10%) scale(2) + + +maxWidth768() + margin 0 0 0 auto + transform rotate(0) translateY(0) scale(1) + filter blur(0) + width 100% + height 30rem + + &:after + box-shadow 0 0 205px 59px var(--efu-main) inset + + &.loaded + display block + + #post-info + top 0 + position absolute + padding 0 3rem + margin 0 auto + color var(--efu-white) + max-width 1400px + display flex + flex-direction column + align-items flex-start + height calc(100% + 0px) + justify-content center + animation slide-in .6s 0s backwards + width 100% + text-align center + + +minWidth1300() + height calc(100% + 0px) + top 0 + display flex + justify-content center + + +maxWidth900() + bottom 1.5rem + text-align left + + +maxWidth768() + padding 0 6% + justify-content normal + padding-top 18rem + + .post-title + color var(--efu-white) + font-weight 700 + font-size 2.3rem + line-height 1.2 + text-align left + margin 1rem 0 1rem 0 + -webkit-line-clamp 2 + padding 0 + overflow hidden + + +maxWidth768() + font-size 1.2rem + -webkit-line-clamp 3 + margin .2rem auto + text-align center + z-index 1 + + +minWidth1300() + width 1100px + font-size 2.6rem !important + + #post-meta + margin-top .4rem + transition .3s + display flex + user-select none + color var(--light-grey) + font-size 95% + + +maxWidth768() + font-size 90% + padding 0 2rem + + a + color var(--light-grey) + transition all .3s ease-out 0s + + i + font-size 16px + margin-right 4px + + > div + text-align left + + .meta-secondline + display flex + flex-direction row + flex-wrap wrap + justify-content flex-start + align-items center + + +maxWidth768() + justify-content center + + > span + display: flex + align-items center + line-height 1 + margin 0 .5rem + + +maxWidth768() + line-height 1.5 + + > span:first-child + margin-left 0 + + .post-meta-date, .post-meta-wordcount, .post-meta-position, .post-meta-pv + opacity .6 + + .post-meta-separator + margin 0 1rem 0 0 + + .post-meta-pv + margin-right 8px + padding 0 8px + display flex + align-items center + border-radius 12px + + &:hover + opacity 1 + background var(--efu-white-op) + text-decoration none + color var(--efu-white) + + .post-meta-pv-cv + margin-left .8rem + + #busuanzi_value_page_pv + font-weight 800 + + .post-meta-commentcount + opacity .6 + cursor pointer + transition .3s + border-radius 12px + padding 8px + + &:hover + opacity 1 + background var(--efu-white-op) + + .post-meta-wechat + margin-right .8rem + opacity .6 + transition .3s + cursor pointer + + &:hover + opacity 1 + background var(--efu-white-op) + + #post-firstinfo + text-align left + display flex + white-space nowrap + user-select none + + +maxWidth768() + white-space nowrap + margin 0 auto + z-index 1 + + .tag_share + display none + + .meta-firstline + display flex + align-items center + height 32px + + +maxWidth768() + margin-bottom .4rem + + .post-meta-original + background var(--efu-white-op) + color var(--efu-white) + padding 0 .5rem + font-size .7rem + margin auto + border-radius 8px + font-weight 700 + line-height 32px + width 100% + height 100% + display flex + + &:hover + color var(--efu-main) + background var(--efu-white) + border-radius 8px + + .tag_share + margin-left .5rem + + .post-meta__tag-list + display flex + flex-direction row + align-items center + + +maxWidth768() + display none + + &::-webkit-scrollbar + display none + + .post-meta__tags + color var(--efu-white) + opacity .8 + margin-right 8px + padding 0 8px + border-radius 12px + display flex + align-items center + flex-direction row + + &:hover + color var(--efu-white) + opacity 1 + background var(--efu-white-op) + + +maxWidth768() + margin 0 .5rem 0 0 + + span.post-meta-categories + background-color var(--efu-white-op) + border-radius 8px + line-height 32px + height 32px + transition .3s + + &:not(:first-child) + margin-left 8px + + &:hover + background-color var(--efu-white) + + a.post-meta-categories + color var(--efu-white) + font-size .7rem + width 100% + height 100% + display flex + padding 0 .5rem + + &:hover + color var(--efu-main) \ No newline at end of file diff --git a/themes/solitude/source/css/_post/pagination.styl b/themes/solitude/source/css/_post/pagination.styl new file mode 100644 index 0000000..0f0c143 --- /dev/null +++ b/themes/solitude/source/css/_post/pagination.styl @@ -0,0 +1,190 @@ +#post #pagination + overflow hidden + position inherit + border var(--style-border-always) + + div:only-child + width 100%!important + + +minWidth1300() + position fixed + width 300px + bottom -100px + right 20px + z-index 7 + height fit-content + transition cubic-bezier(.42, 0, .3, 1.11) .3s + border var(--style-border) + border-radius 12px + overflow hidden + cursor pointer + opacity 0 + + +maxWidth768() + border-radius 12px + border var(--style-border-always) + box-shadow var(--efu-shadow-border) + + &.pagination-post + margin-top 1.5rem + background var(--efu-card-bg) + + +minWidth768() + border-radius 12px + margin-top 1rem + + +minWidth1300() + margin-top 0 + + .next-post, .prev-post, .next-post.pull-right, .prev-post.pull-left + background var(--efu-secondbg) + + +minWidth1300() + background var(--efu-maskbgdeep) + backdrop-filter blur(5px) + transform translateZ(0) + + +maxWidth768() + background var(--efu-card-bg) + + .next-post.pull-full, .prev-post.pull-full + +minWidth1300() + width 100% + + .prev-post.pull-left + +minWidth1300() + display none + + +maxWidth768() + border-bottom var(--style-border-always) + + .next-post.pull-right + +minWidth1300() + width 100% + + .next-post, .prev-post + width 50% + + +minWidth1300() + text-align left + position relative + + +maxWidth768() + width 100% + + .label + color var(--efu-fontcolor) + text-transform uppercase + font-size 90% + + +minWidth1300() + color var(--efu-fontcolor) + font-weight 700 + font-size 12px + margin-bottom 0.5rem + border-bottom var(--style-border) + line-height 1 + padding-bottom 0.5rem + + +maxWidth768() + text-align left + + a + position relative + display block + overflow hidden + height 150px + + +minWidth768() + &:hover + background var(--efu-main) + + div + color: var(--efu-white) + + +maxWidth768() + &:hover + background var(--efu-none) + + .prev-post + .pagination-info + text-align left + + a + +minWidth768() + border-right var(--efu-main-op) + border-right-width 1px + border-right-style solid + + +minWidth1300() + border none + height fit-content + padding 0.5rem 0 + + .next-post + .pagination-info + text-align right + + +minWidth1300() + text-align left + + a + +minWidth768() + border-left var(--efu-main-op) + border-left-width 1px + border-left-style solid + display flex + align-items flex-start + height 150px + + +minWidth1300() + border none + height fit-content + padding 0.5rem 0 + + .pagination-info + position absolute + top 50% + padding 1rem 2rem + width 100% + transform translate(0, -50%) + + +minWidth768() + padding 1rem 1.5rem 1rem 1.5rem + position relative + display flex + top 0 + transform none + flex-direction column + justify-content center + margin auto + height 100% + + +minWidth1300() + padding 0.5rem 1rem + transform none + + .next_info, .prev_info + color var(--efu-fontcolor) + font-weight 700 + -webkit-line-clamp 2 + white-space normal + line-height 1.3 + font-size .9rem + display -webkit-box + -webkit-box-orient vertical + overflow hidden + margin-bottom 10px + + +minWidth1300() + font-size 14px + font-weight 400 + margin-bottom 0 + + +maxWidth768() + text-align left + + &.show-window + +minWidth1300() + bottom 20px + opacity 1 \ No newline at end of file diff --git a/themes/solitude/source/css/_post/postAI.styl b/themes/solitude/source/css/_post/postAI.styl new file mode 100644 index 0000000..af9bb43 --- /dev/null +++ b/themes/solitude/source/css/_post/postAI.styl @@ -0,0 +1,130 @@ +.post-ai + background var(--efu-secondbg) + border-radius 12px + padding 12px + line-height 1.3 + border var(--style-border-always) + margin-top 16px + min-height 101.22px + box-shadow var(--efu-shadow-border) + + +maxWidth768() + margin-top 22px + + .ai-title + display flex + color var(--efu-lighttext) + border-radius 8px + align-items center + padding 0 12px + user-select none + + .ai-title-left + display flex + align-items center + color var(--efu-lighttext) + + i.ai-title-icon + width 24px + height 24px + display flex + background var(--efu-lighttext) + color var(--efu-card-bg) + font-size 14px + border-radius 20px + justify-content center + align-items center + + .ai-title-text + font-weight 700 + margin-left 8px + line-height 1 + font-size 14px + + .ai-tag + font-size 12px + background-color var(--efu-lighttext) + box-shadow var(--efu-shadow-main) + color var(--efu-card-bg) + font-weight 700 + border-radius 12px + margin-left auto + line-height 12px + padding 6px 8px + display flex + align-items center + justify-content center + cursor pointer + transition .3s + + &.loadingAI + animation-duration 2s + animation-name AILoading + animation-iteration-count infinite + animation-direction alternate + cursor default + + &:hover:not(.loadingAI) + background var(--efu-fontcolor) + color var(--efu-card-bg) + + .ai-explanation + margin-top 12px + padding 8px 12px + background var(--efu-card-bg) + border-radius 8px + border var(--style-border-always) + font-size 15px + line-height 1.4 + display none + text-align left + + .blinking-cursor + background-color var(--efu-lighttext) + width 14px + height 14px + border-radius 16px + display inline-block + vertical-align middle + animation blinking-cursor 2s infinite + margin-left 4px + margin-bottom 3px + transform scale(.6) + + .ai-suggestions + display flex + flex-wrap wrap + + .ai-suggestions-item + margin-top 12px + padding 8px 12px + background var(--efu-card-bg) + border-radius 8px 8px 8px 0 + border var(--style-border-always) + font-size 14px + line-height 1.4 + display flex + width fit-content + margin-right 12px + cursor pointer + transition .3s + + &:hover + background var(--efu-main) + color var(--efu-white) + + .ai-bottom + width 100% + margin-top 12px + padding 0 12px + display flex + + .ai-tips + font-size 12px + color var(--efu-secondtext) + margin-right auto + + .ai-report + font-size 12px + color var(--efu-secondtext) + white-space nowrap \ No newline at end of file diff --git a/themes/solitude/source/css/_post/relatedPost.styl b/themes/solitude/source/css/_post/relatedPost.styl new file mode 100644 index 0000000..fd385c4 --- /dev/null +++ b/themes/solitude/source/css/_post/relatedPost.styl @@ -0,0 +1,149 @@ +.relatedPosts + margin-top 2rem + user-select none + + .relatedPosts-list > div + position relative + display inline-block + overflow hidden + margin 3px + width calc(33.333% - 6px) + height 200px + background var(--efu-main) + vertical-align bottom + + .cover + width 360px + min-width 45% + height 100% + transition all .6s ease 0s + object-fit cover + filter brightness(.9) + max-width 45% + + &::after + content ' ' + display block + position absolute + z-index 0 + top 0 + left 0 + width 100% + height 100% + background url(error_img) 50% + background-size cover + + .content + padding 0 1rem + width 100% + + .date + color var(--light-grey) + font-size 90% + + .title + color var(--efu-white) + -webkit-line-clamp 2 + margin-right auto + + a + display flex + width 100% + height 100% + + .headline + margin-bottom .5rem + font-weight 700 + font-size 20px + display flex + align-items center + + span + margin-right auto + margin-left 8px + + a + font-weight 400 + + &:hover + color var(--efu-lighttext) + + &-link + display block + justify-content space-between + margin-left 8px + font-size 13px + +.relatedPosts-list + display flex + flex-wrap wrap + justify-content space-between + flex-direction column + ++maxWidth768() + .relatedPosts, + .relatedPosts-list > div + margin 2px + width calc(50% - 4px) + height 150px + ++maxWidth600() + .relatedPosts, + .relatedPosts-list > div + width calc(100% - 4px) + ++minWidth768() + #post > div.relatedPosts > div.relatedPosts-list > div + -webkit-mask-image -webkit-radial-gradient(center, #fff, #000) + border-radius 12px + + .relatedPosts > .headline + font-size .8em + ++maxWidth1300() + #post > div.relatedPosts > div.relatedPosts-list > div:nth-child(7), + #post > div.relatedPosts > div.relatedPosts-list > div:nth-child(8) + display none + +.relatedPosts > .relatedPosts-list > div + background var(--efu-secondbg) + border var(--style-border) + transition .3s + cursor pointer + overflow hidden + width 100% + margin-bottom 8px + + &:hover + background var(--efu-main) + + .content + .title + color var(--efu-fontcolor) + font-weight 700 + line-height 1.5 + -webkit-line-clamp 4 + font-size .9rem + text-align left + overflow hidden + + .date + color var(--efu-fontcolor) + display none + + &:hover + a + .title + color var(--efu-white) + ++maxWidth768() + .relatedPosts + display none + + > .relatedPosts-list + > div + border-radius 4px + ++minWidth768() + .relatedPosts + margin-top .5rem \ No newline at end of file diff --git a/themes/solitude/source/css/_post/tools.styl b/themes/solitude/source/css/_post/tools.styl new file mode 100644 index 0000000..26b8dc2 --- /dev/null +++ b/themes/solitude/source/css/_post/tools.styl @@ -0,0 +1,260 @@ +#post + .post-tools + display: flex + width: 100% + justify-content: center + margin-top: 8px + flex-wrap: wrap + user-select: none + + .post-tools-left + white-space: nowrap + display: flex + text-overflow: ellipsis + justify-content: center + flex-wrap: wrap + + #quit-box + position: fixed + width: 100vw + height: 100vh + background: rgba(0, 0, 0, .2) + top: 0 + left: 0 + opacity: .01 + display: none + z-index: 101 + margin: 0 + + +maxWidth768() + height: calc(100vh - 380px) + + // reward + /.post-reward + position: relative + text-align: center + display: flex + justify-content: center + + &:hover + > .reward-main + display: block + + +minWidth768() + > .reward-main + display: flex + justify-content: left + + .reward-button + color: var(--efu-white) + background: var(--efu-theme) + box-shadow: none + + .reward-button + background: var(--efu-red) + color: var(--efu-white) + padding: 0 16px + height: 40px + border-radius: 8px + line-height: 39px + box-shadow: var(--efu-shadow-red) + display: inline-block + cursor: pointer + transition: all .4s ease 0s + + i + margin-right: 4px + + &:hover + background-color: var(--efu-theme) + + .reward-main + animation: .3s ease .1s 1 normal both running donate_effcet + position: absolute + bottom: 40px + left: -96px + z-index: 100 + display: none + padding: 0 0 15px + width: fit-content + + +maxWidth768() + justify-content: center !important + position: fixed + bottom: 0 + left: 0 + right: 0 + z-index: 1003 + width: 100% + margin: auto + padding: 0 + + .reward-all + margin: 0 + padding: .8rem + border-radius: 12px + background: var(--efu-card-bg) + border: var(--style-border-always) + display: flex + box-shadow: var(--efu-shadow-border) + flex-direction: column + align-items: center + + +maxWidth768() + width: 100% + display: flex + flex-wrap: wrap + justify-content: space-around + padding: 30px 10px 60px + border-radius: 12px 12px 0 0 + + &::before + position: absolute + bottom: -10px + left: 0 + width: 100% + height: 20px + content: "" + + .reward-title + font-weight: 700 + color: var(--efu-red) + text-wrap: wrap + + .reward-group + display: flex + margin-top: .5rem + + .reward-item + display: inline-block + padding: 0 8px + list-style-type: none + vertical-align: top + + img + width: 130px + height: 130px + + .post-qr-code-desc + padding-top: .4rem + width: 130px + color: var(--efu-gray) + margin-top: -8px + margin-bottom: 8px + + .post-qr-code-img + box-shadow: var(--efu-shadow-lightblack) + border-radius: 12px + border: var(--style-border-always) + + .reward-main-btn + background: var(--efu-secondbg) + color: var(--efu-fontcolor) + display: flex + flex-direction: column + border-radius: 12px + padding: 4px 0 + border: var(--style-border-always) + width: 100% + + &:hover + color: var(--efu-white) + background: var(--efu-red) + background-image: url(/img/flower.gif) + box-shadow: var(--efu-shadow-red) + + .reward-text + margin-bottom: 0 + font-weight: 700 + + .reward-dec + font-size: .6rem + text-wrap: wrap + + // rss + + .reward-link.mode + background: var(--efu-green) + color: var(--efu-white) + padding: 0 16px + height: 40px + line-height: 39px + box-shadow: var(--efu-shadow-green) + border-radius: 8px + margin-left: .5rem + cursor: pointer + text-align: center + transition: .3s + + a + color: var(--efu-white) + + i + margin-right: 4px + + &:hover + background: var(--efu-theme) + box-shadow: none + + + .post-tools-right + padding-right: 0 + display: flex + align-items: center + flex-direction: row + justify-content: space-between + flex-wrap: wrap + + .tag_share + .post-meta__tag-list + display: flex + padding: 0 + width: 100% + flex-wrap: wrap + flex-direction: row + + a + margin-bottom: 8px + margin-right: 8px + + .post-meta__tags + background: var(--efu-card-bg) + border: var(--style-border-always) + color: var(--efu-fontcolor) + border-radius: 8px + display: flex + align-items: center + white-space: nowrap + height: 40px + padding: 0 .6rem + width: fit-content + font-size: .85em + transition: all .2s ease-in-out 0s + + &:hover + background: var(--efu-lighttext) + box-shadow: var(--efu-shadow-main) + color: var(--efu-white) + + span.tagsPageCount + color: var(--efu-lighttext) + background: var(--efu-maskbgdeep) + transition: all .2s ease-in-out 0s + + span.tags-punctuation + font-size: 12px + margin-right: 1px + display: flex + align-items: center + + .tagsPageCount, / #tag-page-tags .tagsPageCount + padding: 2px + background: var(--efu-fontcolor) + border: var(--style-border-always) + min-width: 22.5px + display: inline-block + border-radius: 4px + text-align: center + font-size: .6rem + color: var(--efu-card-bg) + margin-left: 4px \ No newline at end of file diff --git a/themes/solitude/source/css/_search/algolia-search.styl b/themes/solitude/source/css/_search/algolia-search.styl new file mode 100644 index 0000000..2b9534b --- /dev/null +++ b/themes/solitude/source/css/_search/algolia-search.styl @@ -0,0 +1,181 @@ +.search-dialog + position fixed + top 5rem + left 50% + z-index 1001 + display none + margin-left -15rem + padding 1rem + width 30rem + box-shadow var(--efu-shadow-lightblack) + background var(--efu-card-bg) + border var(--style-border) + transition 0.3s + border-radius 8px + animation slide-in .6s ease 0s 1 normal none running + + &:hover + border var(--style-border-hover) + box-shadow var(--efu-shadow-theme) + +maxWidth768() + border none + + +maxWidth768() + top 0 + left 0 + margin 0 + width 100% + height 100% + border 0 + + .algolia-navbar + display flex + align-items center + margin-bottom 8px + + .algolia-tips + color var(--efu-secondtext) + right 0 + margin-left auto + opacity .8 + + .search-close-button + color var(--efu-secondtext) + font-size 1.4em + line-height 1 + cursor pointer + padding 4px + border-radius 50px + margin-left 4px + transition .3s + + &:hover + color var(--efu-main) + + .algolia-tips-text + margin-left .4rem + + #algolia-input-panel + margin-bottom 8px + + .search-box, .ais-SearchBox + padding-top 8px + max-width 100% + position relative + width 100% + min-width 100% + + input, .ais-SearchBox-input + height 100% + width 100% + padding 0.25rem 0.7rem + outline 0 + border var(--style-border) + border-radius 8px + background var(--efu-secondbg) + color var(--efu-fontcolor) + + &:focus + border var(--style-border-hover) + + .ais-Pagination + .ais-Pagination-item--disabled + visibility hidden + + #search-results + padding-top 8px + max-height calc(80vh - 130px) + overflow-y auto + + +maxWidth768() + max-height 80vh !important + + .ais-Hits-list + padding 0 + + .ais-Hits-item + margin 10px 0 + + .algolia-hit-item-content + margin 0 + padding-left 10px + font-size 14px + color var(--efu-gray) + + .algolia-hit-item-link + width auto + max-width 100% + white-space nowrap + text-overflow ellipsis + overflow hidden + font-weight bold + + mark + color var(--efu-theme) + font-style normal + background var(--efu-card-bg) + + .ais-Hits--empty + text-align center + font-weight 600 + + .ais-Pagination-list + margin 0.2rem 0 0 + padding 0 + text-align center + + .ais-Pagination-item.pagination-item + margin 0 0.2rem + padding 0 + display inline-block + + a + border-radius 4px + color var(--efu-white) + cursor pointer + display inline-block + min-width 1.2rem + text-align center + line-height 1.2rem + + .search-dialog__title + font-weight 700 + padding 0 0 0.7rem + color var(--efu-main) + font-size 1.4em + line-height 1 + + #algolia-tips + padding-top 12px + color var(--efu-secondtext) + right 0 + margin auto + + .algolia-tips-text + margin-left .4rem + +#search-mask + position fixed + inset 0 + z-index 1000 + display none + background rgba(0, 0, 0, 0.6) + backdrop-filter blur(12px) + -webkit-backdrop-filter blur(12px) + transform translateZ(0) + background var(--efu-maskbgdeep) + +#algolia-hits + .tag-list + padding 4px 8px + border-radius 8px + margin-right 0.5rem + margin-top 0.5rem + border var(--style-border-always) + + &:hover + background var(--efu-main) + color var(--efu-white) + +.ais-Pagination-item--selected a + background var(--efu-main) \ No newline at end of file diff --git a/themes/solitude/source/css/_search/local-search.styl b/themes/solitude/source/css/_search/local-search.styl new file mode 100644 index 0000000..fc2ae4e --- /dev/null +++ b/themes/solitude/source/css/_search/local-search.styl @@ -0,0 +1,161 @@ +.search-dialog + position fixed + top 5rem + left 50% + z-index 1001 + display none + margin-left -15rem + padding 1rem + width 30rem + box-shadow var(--efu-shadow-lightblack) + background var(--efu-card-bg) + border var(--style-border) + transition 0.3s + border-radius 8px + animation slide-in .6s ease 0s 1 normal none running + + &:hover + border var(--style-border-hover) + box-shadow var(--efu-shadow-theme) + +maxWidth768() + border none + + +maxWidth768() + top 0 + left 0 + margin 0 + width 100% + height 100% + border 0 + + .search-dialog-title + font-weight 700 + color var(--efu-main) + padding 0 0 0.7rem + font-size 1.4em + line-height 1 + + .search-close-button + position absolute + top 0.8rem + right 1rem + color var(--efu-gray) + font-size 1.4em + line-height 1 + cursor pointer + transition color .2s ease-in-out 0s + + &:hover + color var(--efu-main) + + #search-results + max-height calc(80vh - 130px) + overflow-y auto + margin-top 8px + + .search-result-item + padding-left 0 + font-weight 700 + + .search-result-title + position relative + transition color .2s ease-in-out 0s + white-space nowrap + text-overflow ellipsis + overflow hidden + display block + + &:hover + color var(--efu-hovertext) + + em + color var(--efu-theme) + font-style normal + + +maxWidth768() + max-height 80vh !important + + #search-pagination + .pagination-list + margin 0.2rem 0 0 + padding 0 + text-align center + + .pagination-item + color var(--efu-fontcolor) + display inline-block + min-width 1.2rem + height 1.2rem + text-align center + line-height 1.2rem + cursor pointer + + &:hover + color var(--efu-main) + + &.select + border-radius 4px + background var(--efu-main) + color var(--efu-white) + cursor default + + &:hover + color var(--efu-white) + + #search-tips + padding-top 12px + color var(--efu-secondtext) + right 0 + margin auto + + .search-result-count + color var(--efu-gray) + + b + color var(--efu-main) + + .search-box + position relative + margin 0 auto + max-width 100% + width 100% + padding-top 8px + padding-bottom 8px + + input + height 100% + width 100% + border-radius 8px + border var(--style-border) + padding 0.25rem 0.7rem; + outline 0 + background var(--efu-secondbg) + color var(--efu-fontcolor) + caret-color var(--efu-theme) + + ::placeholder + color var(--efu-gray) + opacity .5 + +#search-mask + position fixed + inset 0 + z-index 1000 + display none + background rgba(0, 0, 0, 0.6) + backdrop-filter blur(12px) + -webkit-backdrop-filter blur(12px) + transform translateZ(0) + background var(--efu-maskbgdeep) + +#search-hits + .tag-list + padding 4px 8px + border-radius 8px + margin-right 0.5rem + margin-top 0.5rem + border var(--style-border-always) + + &:hover + background var(--efu-main) + color var(--efu-white) \ No newline at end of file diff --git a/themes/solitude/source/css/_tags/btns.styl b/themes/solitude/source/css/_tags/btns.styl new file mode 100644 index 0000000..1a45b70 --- /dev/null +++ b/themes/solitude/source/css/_tags/btns.styl @@ -0,0 +1,212 @@ +[data-theme="dark"] + div + &.btns + filter brightness(0.7) + a + background 0 0 +div + &.btns + margin 0 -8px + display flex + flex-wrap wrap + align-items flex-start + overflow visible + line-height 1.8 + b + font-size 0.875rem + &.wide + & > a + padding-left 32px + padding-right 32px + &.fill + & > a + flex-grow 1 + width auto + &.around + justify-content space-around + &.center + justify-content center + &.grid2 + & > a + width calc(100% / 2 - 16px) + &.grid3 + & > a + width calc(100% / 3 - 16px) + &.grid4 + & > a + width calc(100% / 4 - 16px) + &.grid5 + & > a + width calc(100% / 5 - 16px) + a + transition all 0.28s ease + -moz-transition all 0.28s ease + -webkit-transition all 0.28s ease + -o-transition all 0.28s ease + margin 8px + margin-top calc(1.25 * 16px + 32px) + min-width 120px + font-weight bold + display flex + justify-content flex-start + align-content center + align-items center + flex-direction column + padding 8px + text-align center + background #f6f6f6 + border-radius 4px + border-bottom none!important + & > i + background #2196f3!important + &:first-child + color #fff + background #2196f3 + b + font-weight bold + line-height 1.3 + img + margin 0.4em auto !important + &:not([href]) + cursor default + color inherit + a[href]:hover + background: var(--efu-main) + color: var(--efu-white) !important + & > i + &:first-child + background: var(--efu-main) + +div.btns, +div.btns p, +div.btns a + font-size 0.8125rem + color #555 + +@media screen and (max-width: 1200px) + div + &.btns + &.grid2 + & > a + width calc(100% / 2 - 16px) + +@media screen and (max-width: 768px) + div + &.btns + &.grid2 + & > a + width calc(100% / 2 - 16px) + +@media screen and (max-width: 500px) + div + &.btns + &.grid2 + & > a + width calc(100% / 1 - 16px) + +@media screen and (max-width: 1200px) + div + &.btns + &.grid3 + & > a + width calc(100% / 3 - 16px) + +@media screen and (max-width: 768px) + div + &.btns + &.grid3 + & > a + width calc(100% / 3 - 16px) + +@media screen and (max-width: 500px) + div + &.btns + &.grid3 + & > a + width calc(100% / 1 - 16px) + +@media screen and (max-width: 1200px) + div + &.btns + &.grid4 + & > a + width calc(100% / 3 - 16px) + +@media screen and (max-width: 768px) + div + &.btns + &.grid4 + & > a + width calc(100% / 3 - 16px) + +@media screen and (max-width: 500px) + div + &.btns + &.grid4 + & > a + width calc(100% / 2 - 16px) + +@media screen and (max-width: 1200px) + div + &.btns + &.grid5 + & > a + width calc(100% / 4 - 16px) + +@media screen and (max-width: 768px) + div + &.btns + &.grid5 + & > a + width calc(100% / 3 - 16px) + +@media screen and (max-width: 500px) + div + &.btns + &.grid5 + & > a + width calc(100% / 2 - 16px) + +div.btns a > img:first-child, +div.btns a > i:first-child + transition all 0.28s ease + -moz-transition all 0.28s ease + -webkit-transition all 0.28s ease + -o-transition all 0.28s ease + height 64px + width 64px + box-shadow 0 1px 2px 0 rgba(0, 0, 0, 0.1) + margin 16px 8px 4px 8px + margin-top calc(-1.25 * 16px - 32px) + border 2px solid #fff + background #fff + line-height 60px + font-size 28px + +div.btns a > img:first-child.auto, +div.btns a > i:first-child.auto + width auto + +div.btns a p, +div.btns a b + margin 0.25em + font-weight normal + line-height 1.25 + word-wrap break-word + +div.btns a[href]:hover, +div.btns a[href]:hover b + color #ff5722 + +div.btns a[href]:hover > img:first-child, +div.btns a[href]:hover > i:first-child + transform scale(1.1) translateY(-8px) + box-shadow 0 4px 8px 0 rgba(0, 0, 0, 0.1) + +div.btns.circle a > img:first-child, +div.btns.circle a > i:first-child + border-radius 32px + +div.btns.rounded a > img:first-child, +div.btns.rounded a > i:first-child + border-radius 16px \ No newline at end of file diff --git a/themes/solitude/source/css/_tags/button.styl b/themes/solitude/source/css/_tags/button.styl new file mode 100644 index 0000000..3678417 --- /dev/null +++ b/themes/solitude/source/css/_tags/button.styl @@ -0,0 +1,40 @@ +#article-container + .btn-sco + position relative + padding 8px 15px + text-transform uppercase + border var(--style-border) + border-radius 10px + overflow hidden + transition all 0.3s + display inline-flex + justify-content center + align-items center + + &.outline + background var(--efu-white) + color var(--efu-main) + border-color var(--efu-main) + + &:hover + background var(--efu-main) + color var(--efu-white) + border-color var(--efu-main) + + i + transition all 0.3s + padding-right 8px + + span + transition all 0.3s + + &:hover + background var(--efu-main) + + span + transform all 0.3s ease-in-out + color var(--efu-white) + + i + transform all 0.3s ease-in-out + color var(--efu-white) \ No newline at end of file diff --git a/themes/solitude/source/css/_tags/checkbox.styl b/themes/solitude/source/css/_tags/checkbox.styl new file mode 100644 index 0000000..bc7b4ed --- /dev/null +++ b/themes/solitude/source/css/_tags/checkbox.styl @@ -0,0 +1,204 @@ +.checkbox + display flex + align-items center + + input + appearance none + position relative + height 16px + width 16px + transition all .15s ease-out 0s + cursor pointer + display inline-block + outline 0 + border-radius 2px + flex-shrink 0 + margin-right 8px + border 2px solid #2196f3 + pointer-events none + + &[type=checkbox] + &:before + left 1px + top 5px + width 0 + height 2px + transition all .2s ease-in + transform rotate(45deg) + + &:after + right 7px + bottom 3px + width 2px + height 0 + transition all .2s ease-out + transform rotate(40deg) + transition-delay .25s + + &:checked + background #2196f3 + + &:checked:before + left 0 + top 7px + width 6px + height 2px + + &:checked:after + right 3px + bottom 1px + width 2px + height 10px + + &.minus + input[type=checkbox]:before + transform rotate(0) + left 1px + top 5px + width 0 + height 2px + + input[type=checkbox]:after + transform rotate(0) + left 1px + top 5px + width 0 + height 2px + + input[type=checkbox]:checked:before + left 1px + top 5px + width 10px + height 2px + + input[type=checkbox]:checked:after + left 1px + top 5px + width 10px + height 2px + + &.plus + input[type=checkbox]:before + transform rotate(0) + left 1px + top 5px + width 0 + height 2px + + input[type=checkbox]:after + transform rotate(0) + left 5px + top 1px + width 2px + height 0 + + input[type=checkbox]:checked:before + left 1px + top 5px + width 10px + height 2px + + input[type=checkbox]:checked:after + left 5px + top 1px + width 2px + height 10px + + &.times + input[type=checkbox]:before + transform rotate(45deg) + left 3px + top 1px + width 0 + height 2px + + input[type=checkbox]:after + transform rotate(135deg) + right 3px + top 1px + width 0 + height 2px + + input[type=checkbox]:checked:before + left 1px + top 5px + width 10px + height 2px + + input[type=checkbox]:checked:after + right 1px + top 5px + width 10px + height 2px + + input[type=radio] + border-radius 50% + + &:before + content "" + display block + width 8px + height 8px + border-radius 50% + margin 2px + transform scale(0) + transition all .25s ease-out + + &:checked:before + transform scale(1) + background var(--text-bg-hover) + + &.red input + border-color #fe5f58 + + &[type=checkbox]:checked + background #fe5f58 + + &[type=radio]:checked:before + background #fe5f58 + + &.green input + border-color #3dc550 + + &[type=checkbox]:checked + background #3dc550 + + &[type=radio]:checked:before + background #3dc550 + + &.yellow input + border-color #ffbd2b + + &[type=checkbox]:checked + background #ffbd2b + + &[type=radio]:checked:before + background #ffbd2b + + &.cyan input + border-color #1bcdfc + + &[type=checkbox]:checked + background #1bcdfc + + &[type=radio]:checked:before + background #1bcdfc + + &.blue input + border-color #2196f3 + + &[type=checkbox]:checked + background #2196f3 + + &[type=radio]:checked:before + background #2196f3 + + p + display: inline-block + margin-top 2px !important + margin-bottom 0 !important + + input[type=checkbox]:after, input[type=checkbox]:before + position absolute + content "" + background #fff diff --git a/themes/solitude/source/css/_tags/fold.styl b/themes/solitude/source/css/_tags/fold.styl new file mode 100644 index 0000000..020f216 --- /dev/null +++ b/themes/solitude/source/css/_tags/fold.styl @@ -0,0 +1,65 @@ +details + display: block + position: relative + margin-bottom: 1rem + min-height: 54px + overflow: hidden + border-radius: 12px + border: var(--style-border) + transition: border .3s +details:hover + border: var(--style-border-hover-always) +details summary + position: absolute + padding: .5rem 1rem + background: var(--efu-card-bg) + margin: 0 + transition: .3s + box-shadow: var(--efu-shadow-border) + left: 0 + width: 100% + font-weight: 700 + white-space: nowrap + overflow: hidden + text-overflow: ellipsis +details>:nth-child(2) + margin-top: calc(54px + 1rem)!important +details[open] summary + background: var(--efu-lighttext) + color: var(--efu-card-bg) +details summary::before + content: '' + padding: 4px +details summary:hover + cursor: pointer + background: var(--efu-lighttext) + color: var(--efu-card-bg) + transition: .3s + box-shadow: var(--efu-shadow-main) +details summary:focus + outline: 0 +details summary::marker + color: var(--efu-lighttext) + transition: .3s +details[open] summary::marker + color: var(--efu-card-bg) +details summary:hover::marker + color: var(--efu-card-bg) +details[open] + border-radius: 12px + border: var(--style-border-hover-always) + padding: 0 1.5rem + background: var(--efu-card-bg) +details summary:hover:after + position: absolute + content: '+' + text-align: center + top: calc(50% - 2px) + transform: translateY(-50%) + right: 16px + line-height: 1 +details[open]>summary:hover:after + content: '-' +@media screen and (max-width: 768px) + details[open] + padding:0 16px \ No newline at end of file diff --git a/themes/solitude/source/css/_tags/gallery.styl b/themes/solitude/source/css/_tags/gallery.styl new file mode 100644 index 0000000..1dca96a --- /dev/null +++ b/themes/solitude/source/css/_tags/gallery.styl @@ -0,0 +1,124 @@ +#article-container + figure.gallery-group + position: relative + float: left + overflow: hidden + margin: 0 + width: calc(50% - 8px) + height: 250px + border-radius: 8px + background: var(--efu-black) + -webkit-transform: translate3d(0, 0, 0) + + +maxWidth600() + width: calc(100% - 8px) + + &:hover + img + opacity: .4 + transform: translate3d(0, 0, 0) + + .gallery-group-name::after + transform: translate3d(0, 0, 0) + + p + opacity: 1 + transform: translate3d(0, 0, 0) + + img + position: relative + margin: 0 + max-width: none + width: calc(100% + 20px) + height: 250px + backface-visibility: hidden + opacity: .8 + transition: all .3s, filter 375ms ease-in .2s + transform: translate3d(-10px, 0, 0) + object-fit: cover + border none + + figcaption + position: absolute + top: 0 + left: 0 + padding: 30px + width: 100% + height: 100% + color: var(--efu-white) + text-transform: uppercase + backface-visibility: hidden + + & > a + position: absolute + top: 0 + right: 0 + bottom: 0 + left: 0 + z-index: 1000 + opacity: 0 + + p + @extend .limit-more-line + margin: 0 + padding: 8px 0 0 + letter-spacing: 1px + font-size: 1.1em + line-height: 1.5 + opacity: 0 + transition: opacity .35s, transform .35s + transform: translate3d(100%, 0, 0) + -webkit-line-clamp: 4 + + .gallery-group-name + @extend .limit-more-line + position: relative + margin: 0 + padding: 8px 0 + font-weight: bold + font-size: 1.65em + line-height: 1.5 + -webkit-line-clamp: 2 + + &:after + position: absolute + bottom: 0 + left: 0 + width: 100% + height: 2px + background: var(--efu-white) + content: '' + transition: transform .35s + transform: translate3d(-100%, 0, 0) + + .gallery-group-main + overflow auto + display flex + gap .5rem + margin-top .5rem + + .gallery-item + min-height 5rem + width 24.97% + padding 4px + position relative + + +maxWidth1200() + width 32.97% + + +maxWidth768() + width 49.97% + + img + max-width: 100%; + border-radius: 0; + margin 0 + + / #page & + border-radius 8px + +.waterfall + opacity 0 + transition .3s + &.show + opacity 1 \ No newline at end of file diff --git a/themes/solitude/source/css/_tags/index.styl b/themes/solitude/source/css/_tags/index.styl new file mode 100644 index 0000000..345932e --- /dev/null +++ b/themes/solitude/source/css/_tags/index.styl @@ -0,0 +1,63 @@ +.red + color var(--efu-red) + +.green + color var(--efu-green) + +.blue + color var(--efu-blue) + +.yellow + color var(--efu-yellow) + +.pink + color var(--efu-pink) + +.purple + color var(--efu-purple) + +.orange + color var(--efu-orange) + +.bg-red + background-color var(--efu-red) + color var(--efu-white) + +.bg-green + background-color var(--efu-green) + color var(--efu-white) + +.bg-blue + background-color var(--efu-blue) + color var(--efu-white) + +.bg-yellow + background-color var(--efu-yellow) + +.bg-pink + background-color var(--efu-pink) + color var(--efu-white) + +.bg-purple + background-color var(--efu-purple) + color var(--efu-white) + +.bg-orange + background-color var(--efu-orange) + color var(--efu-white) + +.block + display block + +.center + margin 0 auto + +.right + margin-left auto + +.larger + font-size 1.5rem + margin 5px + + i + transform scale(1.5) \ No newline at end of file diff --git a/themes/solitude/source/css/_tags/label.styl b/themes/solitude/source/css/_tags/label.styl new file mode 100644 index 0000000..26a3df8 --- /dev/null +++ b/themes/solitude/source/css/_tags/label.styl @@ -0,0 +1,4 @@ +#article-container + .hl-label + padding 2px 4px + border-radius 3px \ No newline at end of file diff --git a/themes/solitude/source/css/_tags/link.styl b/themes/solitude/source/css/_tags/link.styl new file mode 100644 index 0000000..ce6b8e3 --- /dev/null +++ b/themes/solitude/source/css/_tags/link.styl @@ -0,0 +1,59 @@ +#article-container + a.tag-link + background var(--efu-secondbg) + border-radius 8px !important + display flex + border var(--style-border) + flex-direction column + padding 0.5rem 1rem + border-width 1px + margin 1rem 0 + + &:hover + background var(--efu-main) + border var(--style-border-hover) !important + + .tag-link-tips + color var(--efu-white) + + i + opacity 1 + + i + transition .3s + margin-left auto + opacity .6 + + .tag-link-bottom + display flex + margin-top 0.5rem + align-items center + justify-content space-around + + .tag-link-left + width 60px + min-width 60px + height 60px + background-size cover + border-radius 8px + background-color var(--efu-card-bg) + display flex + align-items center + justify-content center + + i + padding 0 + margin auto + font-size 24px + color var(--efu-fontcolor) + + .tag-link-right + margin-left 1rem + max-width calc(100% - 76px - 1rem) + + .tag-link-tips + border-bottom var(--style-border) + padding-bottom 4px + font-size 12px + color var(--efu-gray) + font-weight 400 \ No newline at end of file diff --git a/themes/solitude/source/css/_tags/media.styl b/themes/solitude/source/css/_tags/media.styl new file mode 100644 index 0000000..fb7bc88 --- /dev/null +++ b/themes/solitude/source/css/_tags/media.styl @@ -0,0 +1,57 @@ +trans($time = 0.28s) + transition: all $time ease + -moz-transition: all $time ease + -webkit-transition: all $time ease + -o-transition: all $time ease + +audio,video + border-radius: 4px + max-width: 100% +video + z-index: 1 + trans() + &:hover + box-shadow: 0 4px 8px 0px rgba(0, 0, 0, 0.24), 0 8px 16px 0px rgba(0, 0, 0, 0.24) + +div.video + line-height: 0 + text-align: center + +div.videos + max-width: "calc(100% + 2 * %s)" % 4px + display: flex + flex-wrap: wrap + justify-content: flex-start + align-items: flex-end + margin: 1em 0 - 4px + .video,iframe + width: 100% + margin: 4px + + iframe + border-radius: 4px + width: 100% + min-height: 300px + &.left + justify-content: flex-start + &.center + justify-content: center + &.right + justify-content: flex-end + &.stretch + align-items: stretch + &[col='1'] + .video,iframe + width: 100% + &[col='2'] + .video,iframe + width: "calc(50% - 2 * %s)" % 4px + &[col='3'] + .video,iframe + width: "calc(33.33% - 2 * %s)" % 4px + &[col='4'] + .video,iframe + width: "calc(25% - 2 * %s)" % 4px +[data-theme="dark"] + audio,video + filter brightness(0.7) diff --git a/themes/solitude/source/css/_tags/mermaid.styl b/themes/solitude/source/css/_tags/mermaid.styl new file mode 100644 index 0000000..a8984f8 --- /dev/null +++ b/themes/solitude/source/css/_tags/mermaid.styl @@ -0,0 +1,6 @@ +.mermaid + display flex + justify-content center + + text + fill var(--efu-fontcolor) !important \ No newline at end of file diff --git a/themes/solitude/source/css/_tags/note.styl b/themes/solitude/source/css/_tags/note.styl new file mode 100644 index 0000000..2e83e10 --- /dev/null +++ b/themes/solitude/source/css/_tags/note.styl @@ -0,0 +1,104 @@ +$colors = { + info: #428bca, + danger: #d9534f, + primary: #6f42c1, + warning: #f0ad4e, + success: #5cb85c, + default: #777 +} + +.note + position relative + margin .5rem 0 + padding 15px + border-radius 3px + + &.default:not(.no-icon)::before + content: '\e0a9' + + &.info:not(.no-icon)::before + content: '\e0a7' + + &.danger:not(.no-icon)::before + content: '\e0aa' + + &.primary:not(.no-icon)::before + content: '\e0a8' + + &.warning:not(.no-icon)::before + content: '\e0a5' + + &.success:not(.no-icon)::before + content: '\e0a4' + + &::before + font-family 'solitude' + + &.icon + padding-left 2.25rem + + > .note-icon + position absolute + top calc(50% - .4rem) + left .7rem + font-size larger + + a + color inherit !important + &:hover + color var(--efu-white) !important + + for $color, $value in $colors + &.{$color}:not(.no-icon)::before + color $value + &.{$color}:not(.disabled) + border-left-color $value + + &.modern + color $value + + &:not(.simple) + background lighten($value, 75%) + + > .note-icon + color $value + + &.simple + border-width 1px 1px 1px 5px + border-style solid + border-color #eee + border-image initial + + &.modern + background-color #f5f5f5 + color #4c4948 + border 1px solid transparent !important + + &.flat + border initial + border-image initial + border-left 5px solid #eee + background-color #f9f9f9 + color #4c4948 + + h2, h3, h4, h5, h6 + margin-top 3px + margin-bottom 0 + border-bottom initial + padding-top 0 + + blockquote:first-child, img:first-child, ol:first-child, p:first-child, pre:first-child, table:first-child, ul:first-child + margin-top 0 !important + + blockquote:last-child, img:last-child, ol:last-child, p:last-child, pre:last-child, table:last-child, ul:last-child + margin-bottom 0 !important + font-size 14px !important + + &:not(.no-icon) + padding-left 2.25rem + + &::before + position absolute + top calc(50% - 19px) + left .7rem + font-size larger \ No newline at end of file diff --git a/themes/solitude/source/css/_tags/span.styl b/themes/solitude/source/css/_tags/span.styl new file mode 100644 index 0000000..85ae6b6 --- /dev/null +++ b/themes/solitude/source/css/_tags/span.styl @@ -0,0 +1,34 @@ +#article-container + .p + &.left + text-align left + + &.center + text-align center + + &.right + text-align right + + &.small + font-size .5rem + + &.h1 + font-size 2.5rem + + &.h2 + font-size 1.625rem + + &.h3 + font-size 1.375rem + + &.h4 + font-size 1.125rem + + &.large + font-size 1.5rem + + &.huge + font-size 4rem + + &.ultra + font-size 6rem \ No newline at end of file diff --git a/themes/solitude/source/css/_tags/tabs.styl b/themes/solitude/source/css/_tags/tabs.styl new file mode 100644 index 0000000..bec3a4f --- /dev/null +++ b/themes/solitude/source/css/_tags/tabs.styl @@ -0,0 +1,107 @@ + +#article-container .tabs + position relative + border 1px solid var(--tab-border-color) + + > .nav-tabs + > .tab + margin 4px + padding 0 + list-style none + + +maxWidth768() + -webkit-box-flex 1 + flex-grow 1 + + button i + width 1.5em + font-size inherit + + &.active button + cursor default + border var(--style-border-hover-always) + background var(--efu-background) + border-radius 8px; + + &:not(.active) button:hover + border-top 2px solid var(--tab-button-hover-bg) + background var(--tab-button-hover-bg) + + > .tab-contents .tab-item-content + position relative + display none + padding 1.8rem 1.2rem + background var(--efu-background) + border var(--style-border-always) + + +maxWidth768() + padding 1.2rem .7rem + + &.active + display block + animation .5s ease 0s 1 normal none running tabshow + + .tab-to-top + position relative + display block + margin 16px 0 0 auto + color #99a9bf + + margin 1rem 0 !important + border-radius 12px + overflow hidden + box-shadow var(--efu-shadow-border) + padding 8px + background var(--efu-card-bg) + border var(--style-border) + + .nav-tabs + background var(--efu-card-bg) + padding 16px + display flex + justify-content center + flex-wrap wrap + flex-direction row + + +maxWidth768() + padding 0 + margin-bottom 8px + + > .nav-tabs > .tab button + -webkit-transition all 0s + background var(--efu-secondbg) + transition .3s + border var(--style-border-always) + border-radius 8px + font-size 14px + line-height 1 + padding 8px 16px + display flex + width 100% + justify-content center + align-items center + color var(--efu-fontcolor) + + > .nav-tabs > .tab:not(.active) button:hover + background var(--efu-main) + color var(--efu-white) + transition .3s + border var(--style-border-hover-always) + +.tab-item-content + background var(--efu-card-bg) + +#article-container .tabs + + > .tab-contents .tab-item-content.active + animation tabshow 0s + -webkit-animation tabshow 0s + padding 1.2rem 1.2rem + border-radius 8px + + +maxWidth768() + padding .5rem .5rem + +.tab-contents + border-radius 8px + overflow hidden diff --git a/themes/solitude/source/css/_tags/timeline.styl b/themes/solitude/source/css/_tags/timeline.styl new file mode 100644 index 0000000..d82c055 --- /dev/null +++ b/themes/solitude/source/css/_tags/timeline.styl @@ -0,0 +1,79 @@ +div.timenode + position relative + + &:before, + &:after + content '' + z-index 1 + position absolute + background var(--efu-theme) + width 2px + left 7px + + &:before + top 0 + height 6px + + &:after + top 26px + height 100% + + &:last-child:after + height calc(100% - 26px - 16px) + border-bottom-left-radius 2px + border-bottom-right-radius 2px + + .meta + position relative + line-height 32px + height 32px + left 27px + + &:before, + &:after + content '' + position absolute + top 8px + z-index 2 + left -27px + + &:before + background var(--efu-theme) + width 16px + height 16px + border-radius 8px + + &:after + background var(--efu-card-bg) + margin-left 2px + margin-top 2px + width 12px + height 12px + border-radius 6px + transform scale(0.5) + transition all 0.28s ease + + p + font-weight 500 + margin 0 0 0 24px + + .body + margin 4px 0 16px 24px + padding 16px + border-radius 8px + background var(--blockquote-bg) + + p:first-child + margin-top 0 + + p:last-child + margin-bottom 0 + + &:hover + .meta + &:before + background var(--efu-theme) + + &:after + background var(--efu-theme-op) + transform scale(1) \ No newline at end of file diff --git a/themes/solitude/source/css/index.styl b/themes/solitude/source/css/index.styl new file mode 100644 index 0000000..d42779d --- /dev/null +++ b/themes/solitude/source/css/index.styl @@ -0,0 +1,34 @@ +@charset "UTF-8" + +if hexo-config('css_prefix') + @import 'nib' + +@import "third_party/snackbar.min.css" +// project +@import "var.styl" +@import '_global/*' +@import '_layout/*' +@import '_page/index.styl' +@import '_post/index.styl' +@import '_mode/*' + +// highlight +@import '_highlight/index' + +// search +if hexo-config('search.enable') + if hexo-config('search.type') == 'algolia' + @import '_search/algolia-search' + else if hexo-config('search.type') == 'local' + @import '_search/local-search' + +// tags plugin +@import "_tags/*" + +// comment +if hexo-config('comment.use') + @import '_comments/comment.styl' + +// third party +if hexo-config('tianli_talk.enable') + @import 'third_party/tianli_talk.styl' \ No newline at end of file diff --git a/themes/solitude/source/css/third_party/snackbar.min.css b/themes/solitude/source/css/third_party/snackbar.min.css new file mode 100644 index 0000000..68100be --- /dev/null +++ b/themes/solitude/source/css/third_party/snackbar.min.css @@ -0,0 +1 @@ +@keyframes snackbar-progress{0%{width:0}to{width:100%}}.snackbar-container{transition:.5s;font-size:14px;position:fixed;align-items:center;line-height:22px;padding:18px 24px;bottom:-100px;top:-100px;opacity:0;z-index:9999;background:var(--efu-lighttext)!important;color:var(--efu-card-bg);border-radius:0;display:flex;justify-content:center;max-width:none;min-width:100%;margin:0;left:0;height:60px;transform:none}.snackbar-container p{color:var(--efu-card-bg)!important;font-weight:700!important;text-align:center;font-size:.8rem!important;display:flex;justify-content:center}.snackbar-container .action{display:inline-block;font-size:inherit;margin:0 0 0 24px;min-width:min-content;cursor:pointer;color:var(--efu-card-bg)!important;background:var(--efu-lighttext)!important;padding:4px 6px;font-weight:700;border-radius:8px;transition:.3s;border:var(--style-border)}.snackbar-container .action:hover{background:var(--efu-card-bg)!important;color:var(--efu-lighttext)!important}.snackbar-container:after{position:absolute;width:0;height:100%;left:0;top:0;background:var(--efu-white);opacity:.1;content:"";animation:snackbar-progress var(--efu-snackbar-time) linear forwards;pointer-events:none}.snackbar-pos.top-center,.snackbar-pos.top-left{bottom:auto;top:0;left:0}.snackbar-pos.top-right{bottom:auto;top:0;right:0} \ No newline at end of file diff --git a/themes/solitude/source/css/third_party/tianli_talk.styl b/themes/solitude/source/css/third_party/tianli_talk.styl new file mode 100644 index 0000000..4315387 --- /dev/null +++ b/themes/solitude/source/css/third_party/tianli_talk.styl @@ -0,0 +1,77 @@ +#efuTalk + display flex + align-items center + z-index 1001 + position fixed + bottom 70px + left 20px + height 38px + cursor pointer + transition .3s + box-shadow var(--efu-shadow-border) + background var(--efu-card-bg) + border-radius 20px + overflow hidden + padding 8px + color var(--efu-fontcolor) + width 42px + border var(--style-border-always) + +#efuTalk.on, #efuTalk:hover + background var(--efu-lighttext) + color var(--efu-card-bg) + width 159px + border-color var(--efu-lighttext) + +#efuTalk span.efuTalkTitle + display flex + font-size 14px + padding 0 12px + line-height 1 + white-space nowrap + opacity 0 + transition .3s + +#post_chat_button + display none + + +maxWidth768() + display block + +#postChat_iframeContainer + z-index 1000 + border var(--style-border-always) + background var(--efu-card-bg) + animation to_show_fromLeftBottom .2s ease-out + border-radius 12px + + +maxWidth768() + width 100% !important + height 100% !important + bottom 0 !important + left 0 !important + max-width 100% !important + max-height 100% !important + border-radius 0 !important + +#efuTalk.on span.efuTalkTitle, #efuTalk:hover span.efuTalkTitle + color var(--efu-card-bg) + opacity 1 + +#postChat_button + display none !important + +#efuTalk i.solitude.efuTalkIcon + width 18px + height 18px + font-size 18px + margin-left 3px + line-height 1 + +@keyframes to_show_fromLeftBottom + from + opacity 0 + transform scale(0) + to + opacity 1 + transform scale(1) \ No newline at end of file diff --git a/themes/solitude/source/css/var.styl b/themes/solitude/source/css/var.styl new file mode 100644 index 0000000..e38ac58 --- /dev/null +++ b/themes/solitude/source/css/var.styl @@ -0,0 +1,32 @@ +error_img = hexo-config('errorpage.img') + +$dark_theme = convert(hexo-config('theme_color.dark')) +$dark_theme_op = convert(hexo-config('theme_color.dark_op')) +$dark_theme_op_deep = convert(hexo-config('theme_color.dark_op_deep')) +$dark_theme_none = hexo-config('theme_color.dark_none') +$light_theme = convert(hexo-config('theme_color.light')) +$light_theme_op = convert(hexo-config('theme_color.light_op')) +$light_theme_op_deep = convert(hexo-config('theme_color.light_op_deep')) +$light_theme_none = hexo-config('theme_color.light_none') + +$todayCardColor = convert(hexo-config('hometop.recommendList.color')) + +// code +if hexo-config('highlight.theme') == 'default' + $hl_bg_light = #fff + $hltools_bg_light = #f7f7f9 + $hl_bg_dark = #1b1c20 + $hltools_bg_dark = #21232a +else if hexo-config('highlight.theme') == 'mac' + $hl_bg_light = #FFFFFF + $hltools_bg_light = #E7E7E7 + $hl_bg_dark = #1C1E1E + $hltools_bg_dark = #454a50 + +$line-height-code-block = 1.6 + +// font-family +$font-size = unquote(hexo-config('font.font-size')) +$code-font-size = unquote(hexo-config('font.code-font-size')) +$font-family = unquote(hexo-config('font.font-family')) +$code-font-family = unquote(hexo-config('font.code-font-family')) \ No newline at end of file diff --git a/themes/solitude/source/img/404.avif b/themes/solitude/source/img/404.avif new file mode 100644 index 0000000000000000000000000000000000000000..4906e1288ed4f2750e1384c226ef2dbcb0ea841a GIT binary patch literal 5006 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 IRiO_4KM@Q^cmMzZ literal 0 HcmV?d00001 diff --git a/themes/solitude/source/img/default.avif b/themes/solitude/source/img/default.avif new file mode 100644 index 0000000000000000000000000000000000000000..551dcf19fb46d1faff5c6d02ea46ebbf0ddd0e54 GIT binary patch literal 6260 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 Pk;s1bwJYD4ruhE>_O;>* literal 0 HcmV?d00001 diff --git a/themes/solitude/source/img/error_load.avif b/themes/solitude/source/img/error_load.avif new file mode 100644 index 0000000000000000000000000000000000000000..7be8d4d44c14d7120a709df7ffaf7942d7dbf054 GIT binary patch literal 3803 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 literal 0 HcmV?d00001 diff --git a/themes/solitude/source/img/flower.gif b/themes/solitude/source/img/flower.gif new file mode 100644 index 0000000000000000000000000000000000000000..43559d7e036d4da259c1c6193287946f72e696c5 GIT binary patch literal 200944 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±c$3y(~+$PJm3Jd|tZS(!zO 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%0A9HG{=5n2u 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 z zkMGncchJOq%tl7cv#1guInHhbEPsx!Et4}mC0<8$MgJHl^jF!=l`ww78jFqd8PFo6 z*d!V7=Nl%9aqy?%sq8Mx+eD~8wKW}z#m2{!bV4_IyZ7cxIf`4F4|z3_`&{hO+Yb~r zb)!hy(=M~j37(1T+F)rH>ua!?=wx;1m$4;)+c&QV;1uyj=?gszJbR`f1cb*3c=bZT z#_fr8O9zZtnL3qcjTfj_-HNWgzI~@INAEC2v)#Ng2;cC&{bVO`P=F{WU=pqJUYbcv z8T|Uly{wFe7aP2aLzz5Q@4UJnXDm?F6Yi7<9h50$F=;#%Zx^rfmgt;fWV$Kc7N>bT zeZMis=Ws9=&Bs2w-6IEbTP@LQ`F(aXhIdg}Bt|2!b^=$s@jX%kf`n_mxu{!n!b2Hr(aiR%gjls(S^OZrE^71op2T-}V-QwB(vw)cD{A32iV4gedkd zhrou!+S4U)YaZq2a_lPPO{Cp4gC{%$JBvF-BnzwY{FysNsfsPzVD^t8_p@pVc{vG> zgM1Ds<0C7}3iU9o{*SSA{%^+mFAE4nSWZdG?|(AZ+A1z(cdU!O{5<9ejybJqMFR*F zy*viJtPsY-H22s_<`rq`zac;iP0b1d_($t)ZTh|B+LcU!vMibYnRZHp-_}8)E5iF$ zQoG~uBL8VISzC3_3fJ`lFvAf1{T8Fl2WB>T6Q%S|{Eun1Dp)gM%P6})#xa(N;y4Jsy8zh1svL;>v_mBWp|V?hN8x(EhCj9~a~J$Wa-cbh zu&vUGYYXv&BZVBlJyCwiI}og-+4$0i>;YWIBmoM%MM?fh&aD8~@Z(x#`ZBabRbd5) zs_}OP>j0SV=UAYO&RmMunSFM!n`j-h={P9funInKnfWpG@CbqO*-eAXE6)jcKw%?mr?0X6|7&+-9U+X%EBIV@LQeeHDDW80h%v9s$`R*Zk+=y`TmW7(cmldB473o2umz4 zgm=h2EI_mkOhM?;5kucz3#HvKuE&q511^9Sl=7Mi8Nwc}11&(VhZ;Lqvj@p4~ z@|+?m!T-i8R;vnbIpHoN_Lo=b%8_NK49Rf;^k3Iy+ZRJ6|ErwA{hQh&l_eh-VfGI~ zXr*-&Wl=@FJNaE08^CgQ4C6$oHXT@JMSSxD#j!urj%|68J{J zSfRu)Z9AbFN(<9=Bk7MNy62P?Z)2Ds9{bJUBu7i+QEbc9jFQ}MI7KYdANd;F)j-!l z3Rik6P%BV=lp~}dbee7Z+P#m4?pqdbHr zX($XPnpBnYs*DFb`TbS&#r{Fm+g%Uaf1O|c5r1%MZz@wJz7-aFA`c)I_~hziT)wJ? zd-}x7J4@dgdDQm4yGUPL`^iv^1licMqdFQsKM4=fyyTo@$XW0^=_M(Bd-mCSrhE5M zr}t=DQzTvqmY1Nz)0+CKxDi(Kh-aLq?cojT+(e&?*aLIUo3z91|0hPhQ*wYm~urA!=!O- zD@cmxUhNjquOG%QZ~BHxC!0``#C=3E2x$>Ik`;0aB=3IO`py-CB(8Ci=N#}SPL34g4Q zOO~Z;0Xu$(w&mRLPCu5^u@o4bg22mbSffuoF_(wTPhII+qCo%^-70L-7WxWhzT`z>F5I^ zBzBl4O-?zxY(8DIF`n;zEHCYb6IfkfJ_(3qH$r~S;_9MwbP20rOeJTzW}Z1!3+%`! z-g8U(nA$@%w3rg>^zS)yLpZ;DZnQ%*3v`tdn~ERUTaXL#p_hRKyHmaaouMJPvkIHk zFUNe1%N}@mwnr4*^~9Y?S7dCwWF1!imr+flZxvkLjf;>4%J5_^olE-(=B8+o$*iBlt_(*2RGVaW6xciW&JZwqZ#o6kO+KmiVQ~j(Lv9a4s**?3qvi z2QM+Ew^LojEMMJg!Jui-U1_z2DF{w}H=bLZwG@p}2|k^7&#~G=dn#<+BGM|ht_x3c z?_g~@Q`Qsx)VsMm8zji9rucD^F*+#WTfg`NW`Q9MX{yF|QP!^FIwPb$)4VMMeKK$C z`+6~PG~lN$5lTFR0iz$CeK9q}lO_hUf@G7JK!5AVB0Q}RY;mYWCNZ8qH#nXRGogKrS~A~uBDkN?xuie? zeU+r$5wIHodP0bw!Hv$m@STi6P(c@RQHG6Gi9@IOdhz&%CM{IGT?AXy_O`h zGzsLh{96hrgm0_!DBa2~!iNlF5;m+VckY~Q1&^vG^}x$hajUfuF7$X_@VqxR#=E(+ zaFmjN#rYE=iwZh*t$FR@yPSwTUE~D2Irnu`QHcs_eZ0TQbh!%Xu0sXX$^7O(T7t>E z0fRgYN+Gmh*M7s=q}gIss)q*)4HFPjc`Z1x(y$I`f>^qq6^7w_4TbgC8FCosB3rzJ zLakAR`0{k`$kM{3L&e%P3*4S;OKlGak2JoKEBT* z{j1|=D;m>7Q($7OMq(HB6`w?_ionu)VBJdxX$dntDqI@3JNzD0zRcSq7I<{ko`^x%551jXhmM7HbU)6|td!u2I( zX`f7_fl7UR6R0C(r3VCoiNB#TJKM*+xK9RNdae@UB`f`TFc-npBnm>oYo6sbm&jqE zZ>A5hFqLBX*cJR#P(V5yA%=|VlljVQ>n|R~!0zHjME>)!8z7Z=tLt&c;7+gwx@@c6 z^^$v^U)H-*zdLB(&ifO5yFeFx^gty6Q2&>^@f>?hr`GVcL+bd#!Q{17C^ch<)#7sJ zIN0_0g~QU>`d7|&u2-ZRA-pB;i(#avOAh7fG`pk{mR5i5`7^@rZ;or|R`uonp?z+m z%=!)xw65lV2z_?1fL$ar8u|*iK1iK3fK{tDuiF6`lyMJ20z4Qb+~^0hCNz9-*n(AH z9aW#4H92kf)Sj~REy1*@I>6N09{zW3S>=>Wd4xxVJ?VR!9L!qp$S*eI&5E_&UA|Te zdNm0jaJ~=yZY>*H`tb01L!m4N4ImMaR%x*xixa&lj5E-Iu?(iydl%)30l;;-^qjxW z#|^h>-g-u=P+X{i^GiyzxZH+>CdruUy3ZU$A9oHrcMaQ{rPQv9n@JnX0K9Dk^UT<@ zsGmO89Z5t)wfB0m*K|W6bnX93TUGhrg!ScG{0g0+`f@P-Ls((|gRs_h))qPPGCrCS ztsy*iEHON&Go-)KT|2~c=zXH}G1tGJ`NWug=~5u}c55*yl_AYCH#H$JH`WlUAW1vI z#pUoKDc2(JPX=ucJJKXyc{H}xHV(I8JfEn>!NxG43pfd=Fwq&u7jITJUl$RAE$2#S`Ia&@uSjB$xj}J32=gbgyC>h$%TI7 z+8R9h87P|V=br@IixLoa#|yXu)NsuJLi14_p{Srd{e|SOcXn4{m!x}LB^?Nn_R1)xpqUs=mQo_uCAE`HKg3qhHd7%EEpI zRr~m9y;>e+#qIv-}ZlH zz#6Qx85xF#nSn=vG;xiBD|2asUyy0v5RHxpWYn(WSxj}>c zl?&xKS#0r4Km{uBaRZUKV;lUtZBjrmdW}#>qKn(=<9it zaY}n1R?8UkHQdIO*Q{TicjjXb^nCyU;-09Ux*TgBY@FwOtW9>SnG6`r38Hm_@Yn4W zw&l+8M~y`U@L2+DuOVM+M7EwbX&<0&TOOv~8qfXS&bZ5yRBYB*pOX-_)!&Rr0y!E7JV^dn$=Mku+Q+hyPFKADZ+;4+4I;S}aYj^lk!A z632OU7RW>N+7GiH?kV`F7uR3baMKl%{8@`otYI;;pIyx2<2sNCH1pIBSx>cN#D?w( zhWx9Xr9)Q+LXAx)@b}IesPXCx*DB*I-1hj$3h9gTboME2NeB!TuYW&($5IlF@9xrB z$FXnK++Cmm`7$_gXnuU3;6#e*0L}6c&(eorznWH7YJ(99e1E_z?8dU7+x!WUf?4_& z$=axKMKA@ciTbD~Q(_BQ6^W8mF2KAMaorWu!f(HVWpzaQI_(p#A5s(|ai61@Vna3? zOi?4q#}7|d1Nw}}J-dlDJH~Xz%1pj2wYsJQ3BUQ<$Bub@-VS{QJ@&%s0ZEx2FxQ>L zlXf65S}hG3HWzjo+x#kQV{}t>mLD3elI-To7u$w>_j4SB)q3~2zLZIT@^MHVQr+%y zN(z!e{f>-oHCw#ci6CXbOB2M&?|YYk&eY6SGdd3{tIU>b;LyI!z_3c{g5ux`n}e4Z zR;^H<4=4Bmj5FY9K1B7#-FY?S#$sNAJ^4jQJ2l(`NVelO{PuR1~nS?{;RR?DFh?6Qj zn3D{5vz07 z`=i$fy|nu(88yFa*UbgxlvJdH=dfY4rW}pZh8=H0pl@$~ho4PrHqbTJpb9zvbx6jW zxPwMTT08*-e(j%eO+R}h^hSI@G6-#WxK9qY$d-3)z5&7J+owvAz5u}$y>L30NmEN@ z#QQ51p9v4SG@n)Y#do^W)0_$;#86t|`rt`(SnEZjaV)qGEp7ctsaNUV~x)yz2{wf+o5qR58vmr!Q)A+1l^nt z_?T~XW4WoX6zTIr_b_f658qH@4jn{e8N@WkTxw@aA44%WeogMPEfWyHUQ>XWJ$l2S z?dk8U2>f#HWrH1R(QUyKm;(g$sNM1YKJu-P|LuZ#YeswBaZ_Rbz2 z2;|i=XORjJb8q0W@2aDeRef+{n@FRT?RU!k<4gTBoo2r*jm7c@Y%-6|0SzAe$+wB! zK8VW}s>k*&O(|Lr>V}IlLs|E&%>E%(ky`?p#Z!Fovf+0QxxJgcSg(lQI*T$!DGgo@ zMc_5^@lNA4p?B8L(0Xb_d41!B{AD|rP{BvgseTP-;smh%3SA^Vxh^w+!8?Y;#a=J* z=4YpE>qI#d*{goqJ6W@)=6TvLj1bDb5jT>PYfKGI#$yP6KttLHjd%=}zMKiFz}3zj zQjdjzz@oXrrWU;rmG_LU%_Kss+6O%PhfBUVtq)8c8{GkU(&H2CgmK>AWj=-uF7HyJ z`ua{or$8tAdW|u%)2GnN!0Z_E6PDdzt_Y>0;MG4=B#yYV-#+zFy|SBn=i*)xTztK; zViC@ku#6Ena6f6Y18ZQSWdEo?o92723j-1$DPm$}Dqm{7A@C~ZA8eaZL%*lCM6dSe zrFAF2H-~&|bn7pHr?3<9&>i+>PhFj}XT4wQ+6nb7@nJ7V0F5uVH1$*+T~xd!0}l*$ z-gw!5(YCKMW@1)yE`$n+MjTAJPt<;&Io(ZH+22{3m0tCmR}haAn}%Ft$9Ju@rmw~d zwabKHJOW4(v2eKJsh?>r5-}Q33}$4|x`H1jXPLIL$q~u)n?)#l>_yhVPV(HxS>RFK zVQp&+mJpWO>uP4ITI(%bCa4gF6_ohK3fs*~hzCQxs$9$!pKg?^Jzv4^_QL5r<2!~s z3xoh*e~ZUvddnwF2HMw)%s8=Fq1er37YqM>8DFW}Pn>%ll4b51h|AD@nRnN$%Iv(e zMoLJeK^G83NCr47aPw64`#?@*cwnUtBGSYob=`iuqKVHEsUHqtG6*^utzBET=7_+k zE^(dGpPp?wG@flWNj-bHo-0XWN-Kw-^|7fL0(hka@waCuzhZ+UiPv0akVW4u^Z9nY&9C!M%TyX;F*=V?J_`!s=E7{(hW-4_JJ$IEWo+ITK`CEjlO675lYhVvJ%P}UcU9Kz@ zP~J9xJutM?&*>S&X0=yev!@YCFt+no3kXftsEryKC3bMOvo-Kz5MO3qm*@?XY-U%b zzA(l|qi+t8|(_?O*f1f3z5#=5sb2WR7V%r72|`ftC2Ix zaV9nGIG<0PTgqdE)W0LJ*c(wTFjT1{;}F(Kd%|(=@kAS_)hWC z(16D0!TODxj1f$5n>(;2M$&jZyoJ|hgwyfg{wkBQ)nDjxA8GQ@{2vvV2<+(IYl$8h3kX?Uw zf-!-o_*KX7EHJFG-=8CPp}={6j$|>%vXJtxVAtQnt(l2!*s; zqo8Cyv^L>EYVb%2vLn>{9+t$2&hXs9$?yg~v`_FbTQY;!E)rTIuaG+qIJ?Bk>7z_T z@qiOiJ~D5o)`Ebq4r_!QUrdgNgM3r5sO$0&XzBRIpayKe6GNN?Er6 z2=iBy+8G53G0sR)N<8zd!XFCG5`j+xGN|Hz`flPK*_NbxtXT0RoICU=xx8>-H;!t3 zgcA~51h^)p(WL|SKm+HVQK1 zlVjQ`5Y>Lh1oOH1PNo53IWT8JlZ)Y>aH9)p8R4mjvkiZv2O1Bk{E-e1dRrSvM4u1S zrvaMGNmebPasU#MibtOao(MNMlexF7wJ(%XG-(7&h7)^r+m%240rpiBjrvechW@Gt zDjPRI9ox`zb9D%vfy2)F%~U$P?Wfq*m--yI{0K4wPw#6qgN!5%k3tM?8hD=-DG2sY z^I_jV&4=IrA+i6GI+gw*F;WuJnFz!Gl140uaztUb38(b^a%%eNZqcecrd|by3Cr_l z33>>tHpsktKX+bxy@Y|Fr}&?|v*Yv4)8NItZ*e&sl}llM`M#*Wgg;gL<6Jj#c(Ia~ zK%aYoZreUjjL)5P-TTk&^SI-1Ul}7?fBY`_tF}Vu{`k}`&cQUS`Akjny>amhHO*^U zI#U^Zzs&0QyI%4O%h6JQJyb@5arjM*@%cbi?p^Djr(&$!ILdpK?q|69c{4~lf73Ch z4Mnk-4L6DP7qOCQwo~s8Gt| ziwq+o&=zEx=}M{_ZdveIY4QUSwnbw2>Sk$4mh1zmL{B(!<+fJ`5!Ycq?Tp#)m`?JX z)3ckRHweH~oAdsBzXt8ijjXiXu8*>`#5vE(ZiVHir3(s+iFHOiX^VyfUV9*0ei0sb z?C8r2RxZ6WjQpVhWEs-%TsgAM z1CAhVae>JNjevs>guXwAz`|6bRAC3FAg8rQ zusJt)t*3!Ei2LF2m5F8_8=K_1)T+D>%ym??`9E6}+voKc+RA)w>QTeNY&OAcBoo53 zp%L>5;aVedZM|a}r9X^yLG0d~6L-AF%zR{VtlPvD(H9p8;^0e>`qmh2mEth8@!bie zBEl%KlLoptiN5d-OaN#_3fw(;uJ3-a!OPlALB`$B`DQOi^VE_Gc|Ws*hw~}q!VeIa zK_Wkdt~dKT!ap#P?ryK-&m>#jO!s60Nqj@w6Ey8^|E6ZdQ^x{kqQr8YD%CmlwsoTZ!Mmr={f@0ZyLQoj71O z_`HQ$>9vDGSoOnOa=K6Nv3ojD30Hcm;;j-AI3 z%A{i<;-Js!ppKMFFx0>6zI|x>eE(=SC-5sxe>mpDtCje|yZem^W+>A`R}sgp%Fh=G zz)yVUGgxo?C9CKPby`k7wx7|0>Yc2gT4o0busxHv7DSfXg+>+MU&DoD6x0fmeD&M z{*n86x}VsA1?w(cbxiVDx}}!P{J0w$mFQP+mg=e%6GVzp!oIjqklzX${Y=UDQ%GYy znEt9>dbh1aJ;Lso=*9x3kdT9A?8cyzbT#5zLKICgujmwqlJ8m#Ipr)9b!l13 zrRwAzhIGH-uqQ*5aJZcFwTHc^*G7ZT2DVD2=eqx|y3Q#`(na02W!tuG+qPX@w(aV2 z7rSiRwr$(C?OSW@dv@H26F1*8B408y#y{qqpB0hXh{0;LVUZYdPtE#}dML|);8iEx zyrf!6`TFwc)cq{6jC4 zzcesvq}&cEV|H{Rt!hzNxS5hKa>dw`3`AAv9jjH0NLghe1SbI&v27&`wCo1#D4L0u z3h7&1d68zd)m6SVN(80#5q+W zXg|BItW7-c{V3UcDd2dT(#6HhFF++~-6V=KCRk5r7~T!rvPv(2jrR=w4jVDX@rxD} zL}w@;Jq7>Q=I|b?$wQE{zv4{6!P>&FsYT$@wA!qsUy^~Mgs1ax1-i3uC?8pBPWyR2 zcNXqc6-!A}VP9)qu8#$K>uN|C9#LU8UB<)7qZ033%cdVrwJ*}qf#liExtR(Udal(t z%?p^!X$wu0HPtr3&y~UKTCH!gX24Jr?EUw{{FzXqK69XG*2Ym5MPI^LacC(ob7;Jm zndt-cJ}L!@{-AKO{L#2gdtnm|6S;HD$`j+LjWn;n#_`0?nAwjyrENo%ZrbIKxNSP< z=E~CUH{%+382mL&j2uv-sPz!<)#=CGX6d%?u&FKx` z2Vt6jYjXG{7XWS#+AH@>PyHf{N}M$~>!$vzZ1urWOn_GMM{W63AxYujCRjrF(Q3!Ri`hs?kM)N*-YbLa zxoV8M5NBh@vGgbLh5J7Pn36v~*<7ds6!Qu5s9pmaeMU>+t%i|W;_(g0SQqQA|q zSS0Kw|7d24JZE2)CjP0zzm1YfA%A38_mMFOd%5A~zj36iLzV8%ggst24`N+-UpJYM z4Eb$~TiqbTqRv=kdbJrIt5-Gv1nfRP`@DfV<{eTEDO5N4$iau5;_Fy>x0r&eX!~g+ zH1TQ4OL5#FfWl29`dsdZfQ9J-OI zY`~&Rt@FgsHj_5Z`V_hW8`T^ZEW1$qwI3fqEKf3EtY_&4p(gVz@hU#TQH3$URKoWb zx)x)=Wq3@ht+abeEWOlTDOMU%Nka*|^uQ0^))50;FY^b~yIr63F)o`o+3x)pYiSgH zrySaIsM%GM6KtDImhOi(ylKh~YeLjyKk&ZV*jE*X6r-G@P4oSGT{0k!-YPzT#c~v64A-``#jERW zziD;=ofu}&cdEB4b+q)>n?eUypfjtV9YUo=NHHR&EmP|lSg}j_-YxUEQ+3}m>DkB5 z-%7k#jg2$IKD;|~qPS}v?j^EQdik_`K8JS~g`?0^_Tk)e!qoR1;zo)~Q2m3i6IQ*4 zcJ0*37gyz5felPSRm0an;#`#xAlT5{k#kJRvYV9Vp%kdNH*#R4vAY}WV7EQ#h5lvl zxALLvJ!B>Q=kA7OB@lmdLBO;4$8P4*&3@<_c)VH!@icx;KPgtYeTXlKH3K59<(=>$ zi9)uIrdwZs^t9e&3>U^~mOFSzYzSP3CU2QsUqVIV2gOJf9TvPP#Tw>IeandYeaq9i zM?{V|-+ec+?(Nt>(Bk2^T|LiAY|B)d<9wMTRA|?d!gkk71ZhAT5MLN9G$0K~15*Fs zTVnMB+)2bXr)5aIlKVqU;%2N&|6LvvOJx=T;l_GwfB!+c%FJg4LKvgc^c85cU?mnP zAP#V(ujO5+lYs|bzUvhDgT_Mn$lNW?e3ScMXEAVh;s@57%zX#NjGq{k1PXp!i7)11 z%HxkVsvQ<@wHJ@xk7{K?7yQMk<*`%N$@i~+FI{|r%y0jqr4win^5bGDShSYkA*e}7 z;_%G^*tm@=B&IoHqoV!#>g#hr?_X-gPObTTmk9IKHg>uvfxKJkzxW(^E8{2Zn%~EW z5@#I4%&#>A+5or?3Br?SKdro^-HE#|XVEDd!CT;M74#yyFe->iQqr=QG8-~pY4ykd&71N0J1iRgGUm2nlifXIrzpxeLZ|R#*`25 zdymDhy^GT9{Ei!Ri}L17cj(H=U)AlTF_8%JZHqm6QiBT-`Qk_asagF?sBk}o`qQcZ zdHvV@{kx5s_P+>q!+iaRQ2En#KWu>6OJbc8gdmN#N&sXeDToSz#V|`l>&uPh*RK1` z{!Li^oLN-5(%$!hvB`7I%bKxR(!JXV8^|y8yNdHVihpF&7m=ps$HZtAm31lx#pCz#OH)!w z(ElV1m!Ou5{jHcQQZkvxvl*)>Ny{v5W!XfSKl6zMLxaExNB|LZ*#4yu7-$d?KeuBF zN{8_AVHTl{sgu3)B+Y^Bt+IhTRSBtL4>~0e83LlbF$Hl9ONRo2);vBl4EkCt4*>_^ z3JC`>1*r#-w^#L3K$E&bJjO#oclZS>2Z4vGjn{M&p>_#~SNH}})7%Th z76N8V=KjYC7HIHu3Lm?LsXY4`gVpS>y4Gl>Mb;=(RE5oGv!)9k0uPe=VC$QyDX{%w zk4v*XI;@WR4RxTB!|YB{1an|BhnrkY%)J>%pc`yPvwrUs$T2v`9e&E7KRbfEWU#9V z05ov*do>#E*h`dwKyVyLPvR3sD`*a*Kd8wkSTkrBRtt*O26GLgJxrE2=uJn9%}!6x zkUxg`?GEe&tcpzEIIWh-Rvgsjn1IqvAfQ>!@Om%*exf(U6yIoGkE$eSmlPdDw#cnR zB@&cl)Cu%o?}#B(8ZA~+P<7T{)jJYYAA!x0BGb13RUEPau{dUs1o3bICCpMA;8-?_ zu>r)O&xjn31=_uee+q!wm;r!i1(;%CbsF5;!H&T4ZqU$f^wT_fGBNENO0t$dm^RQ6 z8qIP(ACB-)U0UK(jlzSpUPR)&N+2fD*m;BD*rI3%KvKvWs81n zATbJM%l~CiIe!IEVQu7XMN2>KYD#j&GY-|~NBlSb72piBpCgIa8t`I%%RU199gjF~ z0L}&9mZL(q==U-G^nEcr?e^9r@Pn<~u!$Qi9y4-cQg65RBJ_EX+KH&Z!u}Fkf4B^`S0;Pu}BBwFWTvOjo;}yBPrVhjnF;j_6zUA z`tkO?d2@WjTwSYy2(J#A*q`R~mwzS_D((2kTn+gGRP!XVLi`<;0dRRutAOxQV)UuS z0evntqW2g&hkEKy$0*H`7+CYc_dqKYm(Mt$udRQr!c?ap-fBxf$;;*51&l|{!7a8Q zQEDObA6d3$@v}g0k*Ue{Qf_vDZ6@Xi4Bj>9t2jX^T+FYtN54j7Wwo>6A_T(to-~v0 zU0yvCi=V&8YC+akd!#Uk0)7{HazHo0hoekN-#|8~rHA=?RqRFh-ETgt8BUOy?>OM^ zrj$6+cELVD+qj_0Z;&z+@E|>RW+7tP%uSo$T%S7+$(~BQX^f!qY1sO@w+VcdCw!an ze7OUznJ?K(#3k`(s2V}`I5HbFN-)R;IkE6H~U&dho0P*LPosbxcb6a1nyR zV-al*0Q=q3-i<@^P{P|w zqOaJtEWVR|JT%U1gE5^yM<}Z=*wb0qixS*L<>{WJJ&=DpwDS_7Bb6Uk?8GXN?Mx4v zL;BbU9J*t#eohP!UO*dp9-uRY=B+`tk^H$3u*+A?DI@lR{z+ec0@3gDIg6toUe03C z!p^>B1{tU+$Lb85R;O1|khoy+)dS^jjpk|ig@!1)r!PsIxVqS5*j0ry zePquT^*Kkw-EZtoivwvN%&cqcyVgeJWxq<;BVvVkx==f>d)RJr?%?~c!uo!(%3BZj zYDutGa;GeVT@zj=uYPLI_>X(G36Xzw3H>B@qsS(nVX8|LCaMT&2T7^2Pr;3R5uJBN zA#(;8x;9~Oi>-q#=wZjF9NJP`1Q1(p@`+naU{HVbuzXu}h7{@(;XqqYO0rDBusj-1j=}pfWUK zd+ORGzG@sds44Cp2g8U!`1-e#9C#Qst#**g12WDrHxGwTgVU;m7)8NB+N%DJD8A2> zes&2c&E!dWo@{3$%wBB@%gA|z}x;lO3LJekLp@z z1JKEy!lAE)oB~?FuP5z4!aVC>4b(E4qg%JO5pT;;@i!k)^S0V0CFfe4!D15QmKr3A z!&z=L{J?be#Kc3sU!gtxATIacXFx;Wf^$~eKqz739%TORQAeoo%!MTM@75dJaDQH< z06TFe`P|ixXGk9mqMPrafCr`L!xAk9K+W7-K0;2d`=hTU4nBV@`0%KDaL z_TkhdhK4ekO~UqsyW(^=tul`J*9;V0S>F>SFXVkBo+g&e9W$cHY#YB%Lo9?rQ{HjvBiUJ49QBy*$lhDp-0{A#!X0@R5 zVcYSE%EH7-!(LN9o@eC<5XujG+s$r<`Ws9WSNf)?eK`}uL!p{ocJWUGYM@& zRv#$)Y~>LZ1IHKB;*%~oUsW+qAHt?_XhLvoe?GJBgMowA(0R$4EATi#2&DZ^|4^9I z)mX9z6uX&8@A2A2ZnHie_SHY7!9?h_igz6(jrB8t8$ipmZOQ2G@ngIHSbCJr_6#Ja z<3S4~+SMdc?QW~Pf0#s+D%S6h&UBLKGQfxl3U6>4W;Ph-T6MNX4W`CMV?9V}_M7ag zV<8&LoJ(y!12#)9W($fmJ&5H-d2heJ?niZtdzo00I`3!*mcc|Pt<^1b6 z*aG8m1sImPHV*j7{1aO3288983oiNlNGJ^va!@}CeY%?wf+3%QAjPN`%b50ux*%a_9U!N zJV$^IhF#r!5=8bY)#%*8vA%7bi%QoPC}1g678z%%!B}$W#rl|`VCXk z5mp4HP$~w4g#w2)vZuoI3#k4~=o>CNjPJR7mnugHDRMeaBsVoac z?Kzf@ceA9J{o4&+>}RxsV=q%Hx-n%NMUTJMg6k*sJVWhQn6T5(P08$-$+g<{(Fi4m zify;57=|vS`?2^fBYN2ILh}1;{|VZjGX+DjRR!Q(UQ8& zk{#t!`P!#X6Ki~Dw?OVmciV2!iqtwyjn9xl9X)QI9OR;VpL-cM$HjhqB$WWDN$Vj-v>ll!)o27n8A#^6!VtOO ziEN03tR)~k+vcZUQCEZi@?%r2ji@2{2d)4yim1fFOaQHB1S!TGJ}0nhyFC0 zso~4Yv_l7`u-0TOR)?shwLlLbaRR`@$evBSfWgsN0|9$kdwGQ_P`jmo_{*mZf(CnC zuwHeL2qzdn5K~%X5YDO=Vt3NmMgvHujhBd>q@2+EKzaH) z%z-m~oyanfz7TDJ+2~4>p{{NDC(Uf3WnvfN=dQ@ z7nw9={*F6^KBNpTnIF6`XQ4Zg4x$6#amJtt)Fey>jCgE-=@jR@(B_;)D(XPKz?Jy+ zIJ#B?@(=ez^sxpoI}XCar^g1EY01%)yPDD^;npoau5*Rqf+&Xwtlefb-FhNpP4 zu$Sn66|`!qTQ7oI>DJU~&}2fP?~1*{{o^SQ{^{n){lkb*|JgVBS+(S6N&08iQtf(p z)Jp+$2Yv<$mjc{i0*)0Ph2z*INAnvvVJ&|-TgUw%n8qZGK2vc*z!~?uPxQ$7`E8gpT4wZ~QFZ6ht zc|{8i;-HsNs)4BHTiL7Jf*m|-X8nwSH35Y+j#? zj@n)8r`;UD3H@PSIry8k&V8Le60-*qv_99c1aFUtQE=<|Su5+QbhB$}$b}^14cT(n z^EbO#UZKXf0ncQWkY(tB`qW3*Ru7r{L)_>Re9(6>xAk|9t{$r9x`y))oz$;4Uen$h zE<{Ji-X`qg6HZaqBJ{lWH6=gqXnMY9+BN7SMh}87;N(?f!B#5~XTTT5dClbT8s-{B zLnpSZ`?Hl+Ti_MpEp4ysA@ZPQJgY6Wh-hEI_Yp_9n78Pj*Z^9Jf1 zDE8iiDOHRKHujKSW4Z=;bT+pGc^B@Ew)>(Q>e$}-g5!anpIJ_B&3fDj`N&?9IjEm& znQOMM(VKVXJ<7elA75v8`7)9inY;np@yta;U?I-UEG21a{ybIt`n22E1jL!6X_*3D z+GIW@JM`t%I;T%63+BlfRayyM46**z5a_w+p|ah9jmFjL^CF2VNPlv z`(T}b;W;dH=Y6V#z@`f!0dv4r2KiOgQtD|P>d#o$Iu)gYRo>RPN}(_Q*1w}_Nwtqq2%sMbT=E8*q9q%Umbx6 zz>y@SAAA#XgBjPmf%49zCXFu7FU}0X~Yg zLV_h82OR8c9JSTRg{;{AS=PUdQ@ZzQ$SPoJ+sqjiTfa#E(d}B#s-e^^R_7Jr?N2f5 zHabY8Hsf9~12$guEB$+@maAuX@EAS?n9IPZ4AszsIh?XIHh=#d5wX{ietD+JHF*l+ zr(=23At%0by!eSo5fb-(L6hO;C4Bl7Kz>g?t@=Vr*~WvK;HnF{KvztfHZ`lx@A55Q z<_MKC24OC>bKf4VQ2?&9`DAD#v*v>=QRXks(^{QkQW%IZ5ZGqb-@`$owwX0Iqav-o%idq#m=wF z(PH|(A)z6u_X80}`VyH$t*LmZgG$L3Yy#6A!}jSYsb`fvMkdXutNj|6LLIKgr|t)Q ze|XeF_Xy|kD{(9$Kg3aAt$`zp1Ex+qdAMid1vDI4vuz6X!}C6jT>{;q2eydPlVL?7 zo>$z6)!X|u=#xO=TOcl9{R}FbaVH3q@jNr~$7MIc{bH?FIhla_Y@7*Iu`=|xN0RWu zN7rKd`a0||(ri33YdI%dsXFCQX{i*k|F0gF-r60+wSK@=PD^!OR&Gc+3rR_L^LyA= zU{l_?wE@yG*!tJXC1;1~@DGkOgLoZ)j(qkv%Njo7MG#tndmUl}l*oR?j7+F^no+Zs zHIY=Q6E#r+HaM!biTAgUMMEJbN4TpV4_G1x6lr7$#s0a&Rq9DY;rCoYw`4082#J)c zzVzj?Bgc27vp?j48_#J?%~Q!2EQM}qnx%-$tG@f%;3z@Em+88%DK)7a2U@$VRdnpu zK*kw%uMVxV)}JwT5nt_iE=Zih&yp=EY!u2h1-5|-9o=6EbYhMDDsx`smGBWQK8A20 zQX`9pZg09BxBw*Kx8+33NCDf&}OLN+xuw+`N=Iu>edC|~SLQ{O9=(6{L@!ERLv#47eenipQ5xCh{0jzrs zHz2KAeWmL?n|4r9q8MLvXr(ddoDQ9oJ_x-@OoNbS4Z9i7r!>)J62k?KX;^r_S%A35 zU-@o4)`JGWl+pIU4g5Xud}M=Y0vRd0b;(VRi;WrdQ@JyMgGxQk4ZqgRUEn;i@mZJ>c5y^Z~GRzyhl`}`uDv)Wje2;5+w z@9?hv=b3cqm|Gu&HUVIh0I_76K1FU9l2UgoB%R%p_4xI4%!tp?$>(r!rAUmVr1@Oh(BipcYjm>i|oC)Z)2oQV|OHZGMm|RuD@j`hs~Edf7>o1 zl_Ee_e}$!Gb_lbZm!{?KFpRAM!eqjxxm7&a<42?SR{zS|N;fsAd93(Mext8th<>VF zXh!ih{-_$N*q*wc=K#yx1CE?tml*)R{XRWg50D-=l2n(47;rPAJu31pJs>3{Z9-Ke5O#nH#eX`Dcl8;6my&YM@zC6Mtup$yjjb z$-b@=p$*!wbK|Bx;x6M=RtBcrS1Vlkw$>r5ad&?qp@oFt5px35ST8SiTBMNXIsNs} z1o;vBrSLv7`LTSW+L-2P*;fGzYQ$dJiwMgpj?2eHVf)L`3imv4%@x@6Hwk z6_DSQ!&BN$xB!~aZ-T*AW*vHB4ibb8qn{C?h<5^xUkKjWIpPM8U%9#v$Uv+u-B5Jo z93&VB-iY38_Q-*uRB{++EqMXh2p!}ty<~#uKZ4$0)~GEde|5kVqR& z!96=misCt7M|~_6VKWeEr9o431e1Mrv1T?Puy+Wfq$?H*GOR6-z1>Ziy^L2;93u!? z!(kSrdzv^PB)hkg$XqPK#!J$thal>4A-smJW>E#yi|UXO(h=nmmPizYijJtqjri9Q z#o>y@zW1RBs>Y3wVQ{MsIFt0YGfrLYm{XQum~oK6Oxd476&rzpa}Yad?KB6mehgpizlQHW^d^@lM@IZ(`0g|$VW9?}^K3-8@&nM_($|L%x?Wg$7{@KuHe8uaF>{G7E zPVhFR?~d1T%et5JSMZ(d-R>NWlhw^v;KAqRubwRRu0}tb z&bV(Q+iwzZRp7D!Knt|OIwW?f9KA&mda%+8N(5-MV~anI7%t01XpXqxYFveyiF)%q zqNDF0!B1H??*7m3*4MF!fE@I@^$ho4SXG)0P=6AjX94vqu4)$s%ww*#-o6#YExgrwHE&wpocW@x|W2*cu=t*|J$IL~5D zo%Fdzr90OFy2uqCVgLYjn1xnuK)E?5;d%V0e#2Ppjw zD%sT|iLBR?`&f7EHfuGXZA>X|eyt6Zgq~tGbo^~(?6~~idE8IG3nC7}dyqj_xt$r$ zmuu^pIW$-yiX4GKAk6zDKbQKs?`n7aZt$paU3~Jr5VJ#+f2xCX$huBEz2shsusvIH z{;fNRNo89Q1$hQ#mQU(LRLQ$eE!Msf#{|3Z-f%PbRV6!!PJHQwOuXT6GXoM{v{$(R ze+?0)LuanX{r%IJQ;+@4n;Ney^8vHQL3P-f)$Z4?n;kxV940*-kqOQvfsJ7{=qTgT z_-CW{xrznV9F%#h2Jl`K(2`(f{2UkD97Bm*0Ve&0^2FzaCS?dCL4ikl6Qg9*^Xe8;y?17HukyWS&e({-M2yq4r6)v}@KatBz%ls(an}!uMR3jTs%f z#6`b0i=+&MY56 zy}2L`)g-lNYFf61|LQlb-UY?uJlpXKQQ0(lEK>fYQDw1mj@ zO{3b4#+mV`zsG+2?g7!q72g?}AJ;v|VBHqvX&=2}F)Sb6Y{WShb`VpU*LOk)Q(Ub? za>U992gbRnDuMJ-G7Qq@e+g6TW{bED$W&bTRwKQ~4Hjb?bc75~mz&}10hC?8tUHn^ zAE&D-OxFJLom#`Mzh|E5nG%9(+?+-dL2Hj)pN(D)p*0O|lURP9B;-Z?c!|b@ahAJ2 zObL2J8l-uADu|wNXuV1m@%vtvpj@9eO*0FtwvOu&p2G#aw0Ecu=fhK+b-wYhP{ACf zNRRaBpFZK&Zoi23OV$+kZDcSmhpf>hT%y?)(N2kOhv*6Wqn2kRp>U;897}@;xOF@e z&!pF%w*c0>o@E(PQPAM%smkjYAUfYtDtjjDltOzOqm7<|+m=kVSSaQg{iu_) zbT*_iC1%x~ohFrTV47AZa_;Dq1#RE~?`FdDy#{bTP(si{d8AQd;k&#)INF@EeGO16 zh)_R(Jrv}Or!D?ePakTvTBJG2w5SDrxVPXR4{OrTKC(MX4GX;=8!PcnGKqB}NIlR@+mGA!;$G_2TGB=Z!_jG{E0ka*qaFLBEFJ*= z9a9<&RUv$H<8g8Y|H`I5E&uKB;<{bfz-!U=)t1#|WJn;eW79daI_Hvg z|Ewg%R$dS(nyyDPrk)HM8I0(lUS7tMgVe^>$qPzq<>#{>Xi1DN5`c1XWVi#wcEZ3; zn=~f)I6+OsW={$WId|b!LubdjM+<8OHI;V~IJfE*j+bz+u%7=rvj>R7Rbfg~oR-qi zNrQtMzRr_y=D=_xmM~b`C(xbdZ|;b8RP*mor?^m?$0Qa0LzaAL;yUJn-@Aa;+mgjv z!IEf|I-VFkCcZDz_}yWrMsVwYM%5UGI4A5!-cR(r+msyLfQdqmQ|=yAS{K4aO57f3CsyzPM=QeVt9oacI0b5T0#Cii$Xa^!#OS>Wz+Ol#;VlI zJ&dy^x*V&$6-rPrzh)mb;-oNNrls3CCpn`bD%ciHKV(RTE@d z{KBCJtdU_CXVaEc_nu8qB-XUQ4Dz|+v(Gyy(DXr6kJnUo$m1JuNyLV`#dXipqzRqq zpw`3IDFnx#(}t#!QK0b5%uwNy8}=QX&RZxzexU3kH>qJLXg@)Fy_o^uTAE zM7!xPiAypA-p=MyK9~2)9~#q=oXbNR=N8wMPFSVOTe>28f^8itGX3OPs68$$UvIr! z8XdMqu-ff3dp?y0{izxmUx#LSs0nRrb@sWw_6oCfW9*7$(K|+q71EF3KUPoa|Imr*F6TsAjh zh2lXo(%yx0gb0ADn6XfpISd+Ki1rQE)wSOX-$U2`Xgf<{&C(luEug{`tU}Es!~^yq zuz#|mQs-e|&Vs3nDj$wS%kT7uSgl*$8Q}}`bxg}6^;C|UF?3EoD!z(MrSx8qbKr^u zS_Y92P5_Qq>orWNj)@4DB5h(}lEt{8kvgQAFq(%HLau@#zf~e3G*Agl5C#=?rgFmw zsD;%`G)T=+$%NGqPZh<)2RQ;})G_`td_Us}Oo*2oQ^EW$f!$k>sYffS`F%(g*_&`2Ci zToE`z{w*6u=N=8ndczYmBeDsr5x<>U!?U<}LpFPb`J{dtEGfs8l(nxm%d*^Non{y< z@J3sPw~&|0F^gN6r6Dg#PTqG(zD4d;;Wr={7+e zSDyWDjPbdqiE$ZI-P2hu%pJ;$!_f$!*5j6I=5$#_WRjL%GL87 z7AHrj-M(J)9z<$xYuCpz6QH2WOV3bp7CJMe5R(DZqxDL%u1SL z(3+)VMHd8&boaEo7h%+iCtfUv@~SO#IYo`^l39N9P*Pl1>`dR%8qjLx1UXRA7b=of z-~0oD;0No6!)W&+5X4BVmxpd#E_zkX3!jlun6B(K=8#?@jM_8eTnJqD#4o+q zc^2A~2~jhd3W-fWm)xm!glV4o@bCGJ0{x&rxTYEn0kOlkwP!*#bm+$H3O0&tz>1l_~7=WfGV3OGK34N}`_cWm)mSz)rsify z-y?~1gi`=CLKCTw#3F29Vq8R9l*u8V*tgH|1SoeT z*RYnnm_Yf!uNgR8QP0ZFZZ4TTBV1A>$yn^WL9K0E70-6oVxr>oxRyP04cno1;Za}a za9%#{mpref^s!%-8!MmmQR_9*ZZM`L{iZc-YArhtALtQ)*i)v^C?W`bBfCIZEf3kf zTy7)AlwXN6!MbawraM`)KqTpGw-&~y#8^fKSHMn{;r=|*O%bkGG)@@$0F0joVfW_( zEy6Bv#eU`p3HH`wwvT}Nl4Ovy9}X+=b_}z--7aWz71x(*jT=A+%3)Vx{;6oPn(wWv zO@a2wiC_(C@+S)E1qD5mS-AZ^C5&udPJ|*wyFrpnVK)lZ)FzHKeN7q9X_8CR1F07! z?Cci`i$#ODdcnH2mvI3)Rz49gEL(A}drg(P5TaWXUq~V4ry=gW0J>)|^AqEGb@zKx zYBx!+N_ruTz|MawEJT?m#`h(UZeYhouE&Rq9H_f-n+8_ zd;v24GUnoz0m*5mL6U8xfW%FI#eW6T7u8-2S@Rf39*CpgRN5YrWN*oEQ3G>(^*ci) zoDS3atoiJWY1n@iLYQ5I%N{9kK9N*NRE&aeIh|;L>hvS19N*>1)0W{wM?jd+ zcPdYvZ9ih7VFws^xPpIw(S9UGs|o+oNCUzvA|v=6aqPA=N@alIODk4ar0fK$0_(-o zc5l+yc7#oto)#pf*b|mfdC8acYIP5Cev$Uj#b57a2SV_ywch|SNWtWqs&M9KC+eCP z*v}p4w2V37wk+z7-NTu$HINRho#i5O#dmR}IrO6^Tq33kIMat^!}_A#krUhbd!Ni& z`co6iKg96NsrwVkSkyovFS{|Zv5x=@-i#?H=%a5HpMy~KT5u~TP6|gM3BMC6YaQoW z%qM$GVY+^c8(VZs`MvXd?q`&lmD3#^+CE`#;Z~>!%!J1(PU;lQjJmNC{@x*qL*cZ} ztPqpn*WrdP$&7P5)OMaZF)-(GWlyKG0~44agcfEjR*F?an$71=sr>WEPsb3ISOK1ZLWiOj}gvrPrl(i%5r z-jYjG{#Ne`1lz}4P&&yrhogizJ`W|G#z>a%e*!UZUZJzhk)}i zUgD2N1ZEp(RYy&PfJ{q@f7GeV%-WZ8(!GPV5hK-QMuh4{=4?==WWIoex$J!sZ(ivQ zR)9p{3=nVWQjT^fVTxwHI!7Ms@78PFq=i9F3vTaY_#0pwcSPAF)1t0rL(IzE^evD! z7t?!*VV`Tj$-o8bU^(;18qkn>MWxuOiegDQb}$6)S3X>IN8}zfepS-{a0-958opUF z?i&H)wG(%oqrF$t52zC7kzByf0zMn=q!TXBrKu&G6$6D3sFq20FmSn_@N=e+nVo9W>KIzF?csEMzZtw2&Nm}F35*0v{6Hdb?+xmd(B)$H$e^92mf;6=X&f#n=pp{+yF+Bw79R0 z-#lN++FeX66!-gt>a-K`)opJOz)N)}x&gat3X9D@IQD&R|0ymK0Ir8`dv~0_TDtwo zfJ}XpYgD{roMaC??l(5HxW7xTzy>FLHw&C8Vu=$|(lmJ1Q!?)U6poVp_v8zy=+-=w z-g@8$O?-V-i}G?z>Zs#-ZlEJ#T?WU&>_6C!~HNt*jr&w9{O?#M(yegaJ%}7jIWrqmWZx8vr#D z97ov=M!lo{@^ak5#JHwuGks4y2douM9AzA=z1|-5L?S0Ds=g^!t8;bpTpXG!-v-C1 zF4F?V6vH}Qx_liSm;@K9^q)f z;oZ5udhx=v2vU_|3PH)yhil57kZV!EFF2?05#&24N?&*sXWfRZ;Yf|SW<9^aL%zil zU@|qCZ?8&1v&X!a-SN4h6u}2TEvBG%APg2*Gk z4RRFulz)C_2Rp~|mlQf0n{ox^uEGm9Mz-XtIrZ#xFnXK_N``XWRdO*PO(1+8PiJGg zRe=aIO^q literal 0 HcmV?d00001 diff --git a/themes/solitude/source/img/happy-sticker.avif b/themes/solitude/source/img/happy-sticker.avif new file mode 100644 index 0000000000000000000000000000000000000000..622a90d2d63046179cd7684b442ca9bea04c78ae GIT binary patch literal 1523 zcmZutc{r476#r(7!RXpbS0WjSY#Cb`5hH818$;q#FM5`M@?P(UhKz`>wf3nYaR z`OyggfCKytWbnrTAfyS!f(Z5mLLOu|5DXPeB4Fg9Ab?-Oe}RwI#aM=s!UO~S%Rn@r zu^>@`@cc@7Fe2c)0su(hqhd&cp8T$3ASHqVVIxQ(hC#RsjHCoW$UhE{IYK5y0b@XZ zLP%6p6oMW2XpCh7u!Eo4Nem-Jgc3HZnGn8bFT3LNy=>#7D$p@jq7D2U5s_-Jqw?2O?nbL<9gw2qROW z4hTK6Kb|TBppbHVDuzH8y=B;mB(cg}-oVR?SQ%$4?pkYBeENA(;h2v$=xCE}F{G2susc_Cb_}(MYR-DKYM<*yn$+1q7!>+R zjMF--5Dz@TKT9^RrVXa0Vk9nWC%UkdCquuWt52R*EdPlsJyyq(pOJ2tV^@(j3O^Wr%u_;Z)t8R^keiYHHE~s|6sHO# zOQ7||`0EEHz=Uvmw~#VY2$t=r)eG|p%~SG2KJkvy*hkSyLs6#MtKz~&OUZIA-f>1H zR-*11&y2P0&f+|b${H9kUgJB1f;olvmY*3WuiPE&=k*?037wzPaSyrw{_uwkES1eY znACbPH^HD<`w`s6_i{?Ug@|PR6>-01v+l`LigLPbKsvs65xYqX_j+5RS6k!B*0q7J zHPTIuLzNtST`j%q(Tfz-4=qF5Kucyu;RJ^Z*=&&E=s7q}?>rnXMYkT6M)E9U=@xBVGC*+)oR<-gqB68$Ip^6dRXHkbR zs;pYpk(zOB6Vy59nW_t%8|=p~ ztPx*58G|*lLD`I##`CZIdiG}zDr~7xTjD4}hJzx1e;l(WFv|V6M{d*WEGDuCG$eFX z;VoO*(Hi&c_r(rORS{+#N;A|drKFQ{;*M6GW?b-?K2qN)Tht`$(O6L2t(J2SDQtGP z(-Y}?+ucobVWd&Drg*dTh@$Cwy3CaVk)FR6BBI)p!C&kZG#fHy8CIOkq~Y0)^sqy; zhIriP+<65xk?Mt#KoPTTF+-;A(!<`GlQ-(dVB=Z#ruUQU7cq3 gts4i4BfYEGjUj^Vr|_pe2CLgXbr>rcO-tGQAHbYz7XSbN literal 0 HcmV?d00001 diff --git a/themes/solitude/source/img/loading.avif b/themes/solitude/source/img/loading.avif new file mode 100644 index 0000000000000000000000000000000000000000..81039f4a66c966cd212e0152d7da39cd7c2339ab GIT binary patch literal 9833 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 albjS@+6h8?qJo-RcrCHjpQ&DP@Ban5XfMbB literal 0 HcmV?d00001 diff --git a/themes/solitude/source/img/pwa/favicon.ico b/themes/solitude/source/img/pwa/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b06b5beabfcdbcd1b685006572f0285d99c92565 GIT binary patch literal 16958 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 literal 0 HcmV?d00001 diff --git a/themes/solitude/source/img/pwa/favicon_16.ico b/themes/solitude/source/img/pwa/favicon_16.ico new file mode 100644 index 0000000000000000000000000000000000000000..e25d23e39e80000005592ee21ef9dc4581719954 GIT binary patch literal 1150 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 { + const path = document.getElementById("post-cover")?.src; + path ? handleApiColor(path) : setDefaultThemeColors(); +} + +function handleApiColor(path) { + const cacheGroup = JSON.parse(localStorage.getItem('Solitude')) || {}; + cacheGroup.postcolor && cacheGroup.postcolor[path] ? setThemeColors(cacheGroup.postcolor[path].value) : img2color(path); +} + +function img2color(src) { + fetch(coverColorConfig.api + encodeURIComponent(src)) + .then(response => response.json()) + .then(data => { + setThemeColors(data.RGB); + cacheColor(src, data.RGB); + }) + .catch(console.error); +} + +function setThemeColors(value) { + if (value) { + const [r, g, b] = value.match(/\w\w/g).map(x => parseInt(x, 16)); + document.documentElement.style.setProperty('--efu-main', value); + document.documentElement.style.setProperty('--efu-main-op', value + '23'); + document.documentElement.style.setProperty('--efu-main-op-deep', value + 'dd'); + document.documentElement.style.setProperty('--efu-main-none', value + '00'); + adjustBrightness(r, g, b); + document.getElementById("coverdiv").classList.add("loaded"); + initThemeColor(); + } else { + setDefaultThemeColors(); + } +} + +function setDefaultThemeColors() { + document.documentElement.style.setProperty('--efu-main', 'var(--efu-theme)'); + document.documentElement.style.setProperty('--efu-main-op', 'var(--efu-theme-op)'); + document.documentElement.style.setProperty('--efu-main-op-deep', 'var(--efu-theme-op-deep)'); + document.documentElement.style.setProperty('--efu-main-none', 'var(--efu-theme-none)'); + initThemeColor(); +} + +function cacheColor(src, color) { + const cacheGroup = JSON.parse(localStorage.getItem('Solitude')) || {}; + cacheGroup.postcolor = cacheGroup.postcolor || {}; + cacheGroup.postcolor[src] = {value: color, expiration: Date.now() + coverColorConfig.time}; + localStorage.setItem('Solitude', JSON.stringify(cacheGroup)); +} + +function adjustBrightness(r, g, b) { + if (Math.round(((r * 299) + (g * 587) + (b * 114)) / 1000) < 125) { + [...document.getElementsByClassName('card-content')].forEach(item => item.style.setProperty('--efu-card-bg', 'var(--efu-white)')); + [...document.getElementsByClassName('author-info__sayhi')].forEach(item => { + item.style.setProperty('background', 'var(--efu-white-op)'); + item.style.setProperty('color', 'var(--efu-white)'); + }); + } +} \ No newline at end of file diff --git a/themes/solitude/source/js/covercolor/local.js b/themes/solitude/source/js/covercolor/local.js new file mode 100644 index 0000000..760f2d7 --- /dev/null +++ b/themes/solitude/source/js/covercolor/local.js @@ -0,0 +1,136 @@ +const coverColor = () => { + const path = document.getElementById("post-cover")?.src; + path ? localColor(path) : setDefaultThemeColors(); +} + +function setDefaultThemeColors() { + document.documentElement.style.setProperty('--efu-main', 'var(--efu-theme)'); + document.documentElement.style.setProperty('--efu-main-op', 'var(--efu-theme-op)'); + document.documentElement.style.setProperty('--efu-main-op-deep', 'var(--efu-theme-op-deep)'); + document.documentElement.style.setProperty('--efu-main-none', 'var(--efu-theme-none)'); + initThemeColor(); +} + +const localColor = path => { + const img = new Image(); + img.crossOrigin = "Anonymous"; + img.onload = () => setThemeColors(calculateColor(img)); + img.onerror = () => console.error('Image Error'); + img.src = path; +} + +const calculateColor = img => { + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d"); + ctx.drawImage(img, 0, 0); + const data = ctx.getImageData(0, 0, img.width, img.height).data; + const {r, g, b} = calculateRGB(data); + let value = rgbToHex(r, g, b); + return getContrastYIQ(value) === "light" ? LightenDarkenColor(value, -50) : value; +} + +function calculateRGB(data) { + let r = 0, g = 0, b = 0; + const step = 5; + for (let i = 0; i < data.length; i += 4 * step) { + r += data[i]; + g += data[i + 1]; + b += data[i + 2]; + } + r = Math.floor(r / (data.length / 4 / step)); + g = Math.floor(g / (data.length / 4 / step)); + b = Math.floor(b / (data.length / 4 / step)); + return {r, g, b}; +} + +function rgbToHex(r, g, b) { + return "#" + [r, g, b].map(x => x.toString(16).padStart(2, '0')).join(''); +} + +function LightenDarkenColor(col, amt) { + let usePound = false; + + if (col[0] === "#") { + col = col.slice(1); + usePound = true; + } + + const num = parseInt(col, 16); + const r = Math.min(255, Math.max(0, (num >> 16) + amt)); + const b = Math.min(255, Math.max(0, ((num >> 8) & 0xff) + amt)); + const g = Math.min(255, Math.max(0, (num & 0xff) + amt)); + + return `${usePound ? "#" : ""}${(g | (b << 8) | (r << 16)).toString(16).padStart(6, "0")}`; +} + +function getContrastYIQ(hexcolor) { + let colorrgb = colorRgb(hexcolor); + let colors = colorrgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/); + let red = colors[1]; + let green = colors[2]; + let blue = colors[3]; + let brightness = (red * 299) + (green * 587) + (blue * 114); + brightness = brightness / 255000; + return brightness >= 0.5 ? "light" : "dark"; +} + +function colorRgb(str) { + const HEX_SHORT_REGEX = /^#([0-9a-fA-f]{3})$/; + const HEX_LONG_REGEX = /^#([0-9a-fA-f]{6})$/; + const HEX_SHORT_LENGTH = 4; + + if (!str || typeof str !== 'string') { + return str; + } + + const sColor = str.toLowerCase(); + let hexValue = ""; + + if (sColor && (HEX_SHORT_REGEX.test(sColor) || HEX_LONG_REGEX.test(sColor))) { + hexValue = sColor.length === HEX_SHORT_LENGTH ? + sColor.replace(/^#(.)/g, "#$1$1") : + sColor; + + const rgbValue = hexValue.slice(1) + .match(/.{2}/g) + .map(val => parseInt(val, 16)); + + return `rgb(${rgbValue[0]}, ${rgbValue[1]}, ${rgbValue[2]})`; + } else { + return sColor; + } +} + +function setThemeColors(value, r = null, g = null, b = null) { + if (value) { + document.documentElement.style.setProperty('--efu-main', value); + document.documentElement.style.setProperty('--efu-main-op', value + '23'); + document.documentElement.style.setProperty('--efu-main-op-deep', value + 'dd'); + document.documentElement.style.setProperty('--efu-main-none', value + '00'); + + if (r && g && b) { + let brightness = Math.round(((parseInt(r) * 299) + (parseInt(g) * 587) + (parseInt(b) * 114)) / 1000); + if (brightness < 125) { + let cardContents = document.getElementsByClassName('card-content'); + for (let i = 0; i < cardContents.length; i++) { + cardContents[i].style.setProperty('--efu-card-bg', 'var(--efu-white)'); + } + + let authorInfo = document.getElementsByClassName('author-info__sayhi'); + for (let i = 0; i < authorInfo.length; i++) { + authorInfo[i].style.setProperty('background', 'var(--efu-white-op)'); + authorInfo[i].style.setProperty('color', 'var(--efu-white)'); + } + } + } + + document.getElementById("coverdiv").classList.add("loaded"); + initThemeColor(); + } else { + document.documentElement.style.setProperty('--efu-main', 'var(--efu-theme)'); + document.documentElement.style.setProperty('--efu-main-op', 'var(--efu-theme-op)'); + document.documentElement.style.setProperty('--efu-main-op-deep', 'var(--efu-theme-op-deep)'); + document.documentElement.style.setProperty('--efu-main-none', 'var(--efu-theme-none)'); + initThemeColor(); + } +} \ No newline at end of file diff --git a/themes/solitude/source/js/main.js b/themes/solitude/source/js/main.js new file mode 100644 index 0000000..308c78a --- /dev/null +++ b/themes/solitude/source/js/main.js @@ -0,0 +1,667 @@ +const sidebarFn = () => { + const $toggleMenu = document.getElementById('toggle-menu'); + const $mobileSidebarMenus = document.getElementById('sidebar-menus'); + const $menuMask = document.getElementById('menu-mask'); + const $body = document.body; + + const toggleMobileSidebar = (isOpen) => { + utils.sidebarPaddingR(); + $body.style.overflow = isOpen ? 'hidden' : ''; + $body.style.paddingRight = isOpen ? '' : ''; + utils[isOpen ? 'fadeIn' : 'fadeOut']($menuMask, 0.5); + $mobileSidebarMenus.classList[isOpen ? 'add' : 'remove']('open'); + } + const closeMobileSidebar = () => { + if ($mobileSidebarMenus.classList.contains('open')) { + toggleMobileSidebar(false); + } + } + $toggleMenu.addEventListener('click', () => toggleMobileSidebar(true)); + $menuMask.addEventListener('click', closeMobileSidebar); + + window.addEventListener('resize', () => { + if (utils.isHidden($toggleMenu) && $mobileSidebarMenus.classList.contains('open')) { + closeMobileSidebar(); + } + sco.refreshWaterFall(); + }); +} +const scrollFn = () => { + const innerHeight = window.innerHeight; + let initTop = 0; + const $header = document.getElementById('page-header'); + const throttledScroll = utils.throttle((e) => { + initThemeColor(); + const currentTop = window.scrollY || document.documentElement.scrollTop; + const isDown = scrollDirection(currentTop); + if (currentTop > 0) { + if (isDown) { + if ($header.classList.contains('nav-visible')) $header.classList.remove('nav-visible'); + } else { + if (!$header.classList.contains('nav-visible')) $header.classList.add('nav-visible'); + } + $header.classList.add('nav-fixed'); + } else { + $header.classList.remove('nav-fixed', 'nav-visible'); + } + }, 200); + window.addEventListener('scroll', (e) => { + throttledScroll(e); + if (window.scrollY === 0) { + $header.classList.remove('nav-fixed', 'nav-visible'); + } + }); + + function scrollDirection(currentTop) { + const result = currentTop > initTop; + initTop = currentTop; + return result; + } +} +const percent = () => { + const docEl = document.documentElement; + const body = document.body; + const scrollPos = window.pageYOffset || docEl.scrollTop; + const totalScrollableHeight = Math.max(body.scrollHeight, docEl.scrollHeight, body.offsetHeight, docEl.offsetHeight, body.clientHeight, docEl.clientHeight) - docEl.clientHeight; + const scrolledPercent = Math.round((scrollPos / totalScrollableHeight) * 100); + const navToTop = document.querySelector("#nav-totop"); + const percentDisplay = document.querySelector("#percent"); + const isNearEnd = (window.scrollY + docEl.clientHeight) >= (document.getElementById("post-comment") || document.getElementById("footer")).offsetTop; + navToTop.classList.toggle("long", isNearEnd || scrolledPercent > 90); + percentDisplay.textContent = isNearEnd || scrolledPercent > 90 ? GLOBAL_CONFIG.lang.backtop : scrolledPercent; + document.querySelectorAll(".needEndHide").forEach(item => item.classList.toggle("hide", totalScrollableHeight - scrollPos < 100)); +} +const showTodayCard = () => { + const el = document.getElementById('todayCard'); + const topGroup = document.querySelector('.topGroup'); + topGroup?.addEventListener('mouseleave', () => el?.classList.remove('hide')); +} +const initObserver = () => { + const commentElement = document.getElementById("post-comment"); + const paginationElement = document.getElementById("pagination"); + const commentBarrageElement = document.querySelector(".comment-barrage"); + if (commentElement && paginationElement) { + const observer = new IntersectionObserver(entries => { + entries.forEach(entry => { + const action = entry.isIntersecting ? 'add' : 'remove'; + paginationElement.classList[action]("show-window"); + if (GLOBAL_CONFIG.comment.commentBarrage) { + commentBarrageElement.style.bottom = entry.isIntersecting ? "-200px" : "0px"; + } + }); + }); + observer.observe(commentElement); + } +}; +const addCopyright = () => { + if (!GLOBAL_CONFIG.copyright) return; + const {limit, author, link, source, info} = GLOBAL_CONFIG.copyright; + document.body.addEventListener('copy', (e) => { + e.preventDefault(); + const copyText = window.getSelection().toString(); + const text = copyText.length > limit ? `${copyText}\n\n${author}\n${link}${window.location.href}\n${source}\n${info}` : copyText; + e.clipboardData.setData('text', text); + }); +}; +const asideStatus = () => { + const status = utils.saveToLocal.get('aside-status'); + document.documentElement.classList.toggle('hide-aside', status === 'hide'); +} +function initThemeColor() { + const currentTop = window.scrollY || document.documentElement.scrollTop; + const themeColor = currentTop > 0 ? '--efu-card-bg' : PAGE_CONFIG.is_post ? '--efu-main' : '--efu-background'; + applyThemeColor(getComputedStyle(document.documentElement).getPropertyValue(themeColor)); +} +function applyThemeColor(color) { + const themeColorMeta = document.querySelector('meta[name="theme-color"]'); + const appleMobileWebAppMeta = document.querySelector('meta[name="apple-mobile-web-app-status-bar-style"]'); + themeColorMeta?.setAttribute("content", color); + appleMobileWebAppMeta?.setAttribute("content", color); + if (window.matchMedia("(display-mode: standalone)").matches) { + document.body.style.backgroundColor = color; + } +} +const handleThemeChange = mode => { + const themeChange = window.globalFn?.themeChange || {} + for (let key in themeChange) { + themeChange[key](mode) + } +} +const sco = { + lastSayHello: "", + wasPageHidden: false, + musicPlaying: false, + hideCookie() { + const cookiesWindow = document.getElementById("cookies-window"); + if (cookiesWindow) { + setTimeout(() => { + cookiesWindow.classList.add("cw-hide"); + setTimeout(() => cookiesWindow.style.display = "none", 1000); + }, 3000); + } + }, + scrollTo(elementId) { + const targetElement = document.getElementById(elementId); + if (targetElement) { + const targetPosition = targetElement.getBoundingClientRect().top + window.pageYOffset - 80; + window.scroll({ + top: targetPosition, + behavior: "smooth" + }); + } + }, + musicToggle() { + const $music = document.querySelector('#nav-music'); + const $meting = document.querySelector('meting-js'); + const $console = document.getElementById('consoleMusic'); + const $rm_text = document.querySelector('#menu-music-toggle span'); + const $rm_icon = document.querySelector('#menu-music-toggle i'); + this.musicPlaying = !this.musicPlaying; + $music.classList.toggle("playing", this.musicPlaying); + $console.classList.toggle("on", this.musicPlaying); + if (this.musicPlaying) { + $meting.aplayer.play(); + rm?.menuItems.music[0] && ($rm_text.textContent = GLOBAL_CONFIG.right_menu.music.stop) && ($rm_icon.className = 'solitude st-pause-fill') + } else { + $meting.aplayer.pause(); + rm?.menuItems.music[0] && ($rm_text.textContent = GLOBAL_CONFIG.right_menu.music.start) && ($rm_icon.className = 'solitude st-play-fill') + } + }, + switchCommentBarrage() { + let commentBarrageElement = document.querySelector(".comment-barrage"); + if (!commentBarrageElement) return; + const isDisplayed = window.getComputedStyle(commentBarrageElement).display === "flex"; + commentBarrageElement.style.display = isDisplayed ? "none" : "flex"; + document.querySelector("#consoleCommentBarrage").classList.toggle("on", !isDisplayed); + utils.saveToLocal.set("commentBarrageSwitch", !isDisplayed, .2); + rm?.menuItems.barrage && rm.barrage(isDisplayed) + }, + switchHideAside() { + const htmlClassList = document.documentElement.classList; + const consoleHideAside = document.querySelector("#consoleHideAside"); + const isHideAside = htmlClassList.contains("hide-aside"); + utils.saveToLocal.set("aside-status", isHideAside ? "show" : "hide", 1); + htmlClassList.toggle("hide-aside"); + consoleHideAside.classList.toggle("on", !isHideAside); + }, + switchKeyboard() { + this.sco_keyboards = !this.sco_keyboards; + const consoleKeyboard = document.querySelector("#consoleKeyboard"); + const keyboardFunction = this.sco_keyboards ? openKeyboard : closeKeyboard; + consoleKeyboard.classList.toggle("on", this.sco_keyboards); + keyboardFunction(); + localStorage.setItem("keyboard", this.sco_keyboards); + document.getElementById('keyboard-tips')?.classList.remove('show'); + }, + initConsoleState() { + const consoleHideAside = document.querySelector("#consoleHideAside"); + consoleHideAside.classList.toggle("on", !document.documentElement.classList.contains("hide-aside")); + }, + changeSayHelloText() { + const greetings = GLOBAL_CONFIG.aside.sayhello2; + const greetingElement = document.getElementById("author-info__sayhi"); + let randomGreeting; + do { + randomGreeting = greetings[Math.floor(Math.random() * greetings.length)]; + } while (randomGreeting === this.lastSayHello); + greetingElement.textContent = randomGreeting; + this.lastSayHello = randomGreeting; + }, + switchDarkMode() { + const isDarkMode = document.documentElement.getAttribute('data-theme') === 'dark'; + const newMode = isDarkMode ? 'light' : 'dark'; + document.documentElement.setAttribute('data-theme', newMode); + utils.saveToLocal.set('theme', newMode, 0.02); + utils.snackbarShow(GLOBAL_CONFIG.lang.theme[newMode], false, 2000); + if(typeof rm === 'object') rm.mode(!isDarkMode) && rm.hideRightMenu(); + handleThemeChange(newMode); + }, + hideTodayCard: () => document.getElementById('todayCard').classList.add('hide'), + toTop: () => utils.scrollToDest(0), + showConsole: () => document.getElementById('console')?.classList.toggle('show', true), + hideConsole: () => document.getElementById('console')?.classList.remove('show'), + refreshWaterFall() { + const observer = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + setTimeout(() => { + waterfall(entry.target) || entry.target.classList.add('show'); + }, 300); + } + }); + }); + document.querySelectorAll('.waterfall').forEach(el => observer.observe(el)); + }, + addRuntime() { + let el = document.getElementById('runtimeshow'); + el && GLOBAL_CONFIG.runtime && (el.innerText = utils.timeDiff(new Date(GLOBAL_CONFIG.runtime), new Date()) + GLOBAL_CONFIG.lang.day); + }, + toTalk(txt) { + const inputs = ["#wl-edit", ".el-textarea__inner", "#veditor", ".atk-textarea"]; + inputs.forEach(selector => { + const el = document.querySelector(selector); + if (el) { + el.dispatchEvent(new Event('input', { bubble: true, cancelable: true })); + el.value = '> ' + txt.replace(/\n/g, '\n> ') + '\n\n'; + utils.scrollToDest(utils.getEleTop(document.getElementById('post-comment')), 300); + el.focus(); + el.setSelectionRange(-1, -1); + } + }); + utils.snackbarShow(GLOBAL_CONFIG.lang.totalk, false, 2000); + }, + initbbtalk() { + const bberTalkElement = document.querySelector('#bber-talk'); + if (bberTalkElement) { + new Swiper('.swiper-container', { + direction: 'vertical', + loop: true, + autoplay: { + delay: 3000, + pauseOnMouseEnter: true + }, + }); + } + }, + addPhotoFigcaption() { + document.querySelectorAll('#article-container img:not(.gallery-item img)').forEach(image => { + const captionText = image.getAttribute('alt'); + captionText && image.insertAdjacentHTML('afterend', `
    ${captionText}
    `); + }); + }, + scrollToComment: () => utils.scrollToDest(utils.getEleTop(document.getElementById('post-comment')), 300), + setTimeState() { + const el = document.getElementById('author-info__sayhi'); + if (el) { + const hours = new Date().getHours(); + const lang = GLOBAL_CONFIG.aside.sayhello; + + const localData = getLocalData(['twikoo', 'WALINE_USER_META', 'WALINE_USER', '_v_Cache_Meta', 'ArtalkUser']); + + function getLocalData(keys) { + for (let key of keys) { + const data = localStorage.getItem(key); + if (data) { + return JSON.parse(data); + } + } + return null; + }; + const nick = localData ? (localData.nick ? localData.nick : localData.display_name) : null; + + let prefix; + if (this.wasPageHidden) { + prefix = GLOBAL_CONFIG.aside.sayhello3.back + nick; + this.wasPageHidden = false; + } else { + prefix = GLOBAL_CONFIG.aside.sayhello3.prefix + nick; + } + + const greetings = [ + { start: 0, end: 5, text: nick ? prefix : lang.goodnight }, + { start: 6, end: 10, text: nick ? prefix : lang.morning }, + { start: 11, end: 14, text: nick ? prefix : lang.noon }, + { start: 15, end: 18, text: nick ? prefix : lang.afternoon }, + { start: 19, end: 24, text: nick ? prefix : lang.night }, + ]; + const greeting = greetings.find(g => hours >= g.start && hours <= g.end); + el.innerText = greeting.text; + } + }, + tagPageActive() { + const decodedPath = decodeURIComponent(window.location.pathname); + const isTagPage = /\/tags\/.*?\//.test(decodedPath); + if (isTagPage) { + const tag = decodedPath.split("/").slice(-2, -1)[0]; + const tagElement = document.getElementById(tag); + if (tagElement) { + document.querySelectorAll("a.select").forEach(link => { + link.classList.remove("select"); + }); + tagElement.classList.add("select"); + } + } + }, + categoriesBarActive() { + const categoryBar = document.querySelector("#category-bar"); + const currentPath = decodeURIComponent(window.location.pathname); + const isHomePage = currentPath === "/"; + if (categoryBar) { + const categoryItems = categoryBar.querySelectorAll(".category-bar-item"); + categoryItems.forEach(item => item.classList.remove("select")); + const activeItemId = isHomePage ? "category-bar-home" : currentPath.split("/").slice(-2, -1)[0]; + const activeItem = document.getElementById(activeItemId); + if (activeItem) { + activeItem.classList.add("select"); + } + } + }, + scrollCategoryBarToRight() { + const scrollBar = document.getElementById("category-bar-items"); + const nextElement = document.getElementById("category-bar-next"); + if (scrollBar) { + const isScrollBarAtEnd = () => scrollBar.scrollLeft + scrollBar.clientWidth >= scrollBar.scrollWidth - 8; + const scroll = () => { + if (isScrollBarAtEnd()) { + scrollBar.scroll({ left: 0, behavior: "smooth" }); + } else { + scrollBar.scrollBy({ left: scrollBar.clientWidth, behavior: "smooth" }); + } + }; + scrollBar.addEventListener("scroll", () => { + clearTimeout(this.timeoutId); + this.timeoutId = setTimeout(() => { + nextElement.style.transform = isScrollBarAtEnd() ? "rotate(180deg)" : ""; + }, 150); + }); + scroll(); + } + }, + openAllTags() { + document.querySelectorAll(".card-allinfo .card-tag-cloud").forEach(tagCloudElement => tagCloudElement.classList.add("all-tags")); + document.getElementById("more-tags-btn")?.remove(); + }, + listenToPageInputPress() { + const toGroup = document.querySelector(".toPageGroup") + const pageText = document.getElementById("toPageText"); + if (!pageText) return; + const pageButton = document.getElementById("toPageButton"); + const pageNumbers = document.querySelectorAll(".page-number"); + const lastPageNumber = +pageNumbers[pageNumbers.length - 1].textContent; + if (!pageText || lastPageNumber === 1) { + toGroup.style.display = "none"; + return + } + pageText.addEventListener("keydown", (event) => { + if (event.keyCode === 13) { + sco.toPage(); + pjax.loadUrl(pageButton.href); + } + }); + pageText.addEventListener("input", () => { + pageButton.classList.toggle("haveValue", pageText.value !== "" && pageText.value !== "0"); + if (+pageText.value > lastPageNumber) { + pageText.value = lastPageNumber; + } + }); + }, + addNavBackgroundInit() { + const scrollTop = document.documentElement.scrollTop; + (scrollTop !== 0) && document.getElementById("page-header").classList.add("nav-fixed", "nav-visible"); + }, + toPage() { + const pageNumbers = document.querySelectorAll(".page-number"); + const maxPageNumber = parseInt(pageNumbers[pageNumbers.length - 1].innerHTML); + const inputElement = document.getElementById("toPageText"); + const inputPageNumber = parseInt(inputElement.value); + document.getElementById("toPageButton").href = (!isNaN(inputPageNumber) && inputPageNumber <= maxPageNumber && inputPageNumber > 1) + ? window.location.href.replace(/\/page\/\d+\/$/, "/") + "page/" + inputPageNumber + "/" + : '/'; + }, + owoBig(owoSelector) { + let owoBig = document.getElementById('owo-big'); + if (!owoBig) { + owoBig = document.createElement('div'); + owoBig.id = 'owo-big'; + document.body.appendChild(owoBig); + } + const showOwoBig = event => { + const target = event.target; + const owoItem = target.closest(owoSelector.item); + if (owoItem && target.closest(owoSelector.body)) { + const imgSrc = owoItem.querySelector('img')?.src; + if (imgSrc) { + owoBig.innerHTML = ``; + owoBig.style.display = 'block'; + positionOwoBig(owoItem); + } + } + }; + const hideOwoBig = event => { + if (event.target.closest(owoSelector.item) && event.target.closest(owoSelector.body)) { + owoBig.style.display = 'none'; + } + }; + const positionOwoBig = owoItem => { + const itemRect = owoItem.getBoundingClientRect(); + owoBig.style.left = `${itemRect.left - (owoBig.offsetWidth / 4)}px`; + owoBig.style.top = `${itemRect.top}px`; + } + document.addEventListener('mouseover', showOwoBig); + document.addEventListener('mouseout', hideOwoBig); + }, + changeTimeFormat(selector) { + selector.forEach(item => { + const timeVal = item.getAttribute('datetime') + item.textContent = utils.diffDate(timeVal, true) + item.style.display = 'inline' + }) + }, + switchComments() { + const switchBtn = document.getElementById('switch-btn') + if (!switchBtn) return + let switchDone = false + const commentContainer = document.getElementById('post-comment') + const handleSwitchBtn = () => { + commentContainer.classList.toggle('move') + if (!switchDone && typeof loadTwoComment === 'function') { + switchDone = true + loadTwoComment() + } + } + utils.addEventListenerPjax(switchBtn, 'click', handleSwitchBtn) + } +}; +const addHighlight = () => { + const highlight = GLOBAL_CONFIG.highlight; + if (!highlight) return; + const {copy, expand, limit, syntax} = highlight; + const $isPrismjs = syntax === 'prismjs'; + const $isShowTool = highlight.enable || copy || expand || limit; + const expandClass = !expand === true ? 'closed' : '' + const $syntaxHighlight = syntax === 'highlight.js' ? document.querySelectorAll('figure.highlight') : document.querySelectorAll('pre[class*="language-"]') + if (!(($isShowTool || limit) && $syntaxHighlight.length)) return + const copyEle = copy ? `` : ''; + const expandEle = ``; + const limitEle = limit ? `` : ''; + const alertInfo = (ele, text) => utils.snackbarShow(text, false, 2000) + const copyFn = (e) => { + const $buttonParent = e.parentNode + $buttonParent.classList.add('copy-true') + const selection = window.getSelection() + const range = document.createRange() + const preCodeSelector = $isPrismjs ? 'pre code' : 'table .code pre' + range.selectNodeContents($buttonParent.querySelectorAll(`${preCodeSelector}`)[0]) + selection.removeAllRanges() + selection.addRange(range) + document.execCommand('copy') + alertInfo(e.lastChild, GLOBAL_CONFIG.lang.copy.success) + selection.removeAllRanges() + $buttonParent.classList.remove('copy-true') + } + const expandClose = (e) => e.classList.toggle('closed') + const shrinkEle = function () { + this.classList.toggle('expand-done') + } + const ToolsFn = function (e) { + const $target = e.target.classList + if ($target.contains('expand')) expandClose(this) + else if ($target.contains('copy-button')) copyFn(this) + } + const createEle = (lang, item, service) => { + const fragment = document.createDocumentFragment() + if ($isShowTool) { + const hlTools = document.createElement('div') + hlTools.className = `highlight-tools ${expandClass}` + hlTools.innerHTML = expandEle + lang + copyEle + utils.addEventListenerPjax(hlTools, 'click', ToolsFn) + fragment.appendChild(hlTools) + } + if (limit && item.offsetHeight > limit + 30) { + const ele = document.createElement('div') + ele.className = 'code-expand-btn' + ele.innerHTML = limitEle + utils.addEventListenerPjax(ele, 'click', shrinkEle) + fragment.appendChild(ele) + } + if (service === 'hl') { + item.insertBefore(fragment, item.firstChild) + } else { + item.parentNode.insertBefore(fragment, item) + } + } + if ($isPrismjs) { + $syntaxHighlight.forEach(item => { + const langName = item.getAttribute('data-language') || 'Code' + const highlightLangEle = `
    ${langName}
    ` + utils.wrap(item, 'figure', { + class: 'highlight' + }) + createEle(highlightLangEle, item) + }) + } else { + $syntaxHighlight.forEach(item => { + let langName = item.getAttribute('class').split(' ')[1] + if (langName === 'plain' || langName === undefined) langName = 'Code' + const highlightLangEle = `
    ${langName}
    ` + createEle(highlightLangEle, item, 'hl') + }) + } +} +class toc { + static init() { + const tocContainer = document.getElementById('card-toc') + if (!tocContainer || !tocContainer.querySelector('.toc a')) { + tocContainer.style.display = 'none' + return + } + const el = document.querySelectorAll('.toc a') + el.forEach((e) => { + e.addEventListener('click', (event) => { + event.preventDefault() + utils.scrollToDest(utils.getEleTop(document.getElementById(decodeURI((event.target.className === 'toc-text' ? event.target.parentNode.hash : event.target.hash).replace('#', '')))), 300) + }) + }) + this.active(el) + } + static active(toc) { + const $article = document.getElementById('article-container') + const $tocContent = document.getElementById('toc-content') + const list = $article.querySelectorAll('h1,h2,h3,h4,h5,h6') + let detectItem = '' + function autoScroll(el) { + const activePosition = el.getBoundingClientRect().top + const sidebarScrollTop = $tocContent.scrollTop + if (activePosition > (document.documentElement.clientHeight - 100)) { + $tocContent.scrollTop = sidebarScrollTop + 150 + } + if (activePosition < 100) { + $tocContent.scrollTop = sidebarScrollTop - 150 + } + } + function findHeadPosition(top) { + if (top === 0) return false + let currentIndex = '' + list.forEach(function (ele, index) { + if (top > utils.getEleTop(ele) - 80) { + currentIndex = index + } + }) + if (detectItem === currentIndex) return + detectItem = currentIndex + document.querySelectorAll('.toc .active').forEach((i) => { + i.classList.remove('active') + }) + const activeitem = toc[detectItem] + if (activeitem) { + let parent = toc[detectItem].parentNode + activeitem.classList.add('active') + autoScroll(activeitem) + for (; !parent.matches('.toc'); parent = parent.parentNode) { + if (parent.matches('li')) parent.classList.add('active') + } + } + } + window.tocScrollFn = utils.throttle(function () { + const currentTop = window.scrollY || document.documentElement.scrollTop + findHeadPosition(currentTop) + }, 100) + window.addEventListener('scroll', tocScrollFn) + } +} +class tabs { + static init() { + this.clickFnOfTabs(); + this.backToTop(); + } + static clickFnOfTabs() { + document.querySelectorAll('#article-container .tab > button').forEach((item) => { + item.addEventListener('click', function (e) { + const that = this; + const $tabItem = that.parentNode; + if (!$tabItem.classList.contains('active')) { + const $tabContent = $tabItem.parentNode.nextElementSibling; + const $siblings = utils.siblings($tabItem, '.active')[0]; + $siblings && $siblings.classList.remove('active'); + $tabItem.classList.add('active'); + const tabId = that.getAttribute('data-href').replace('#', ''); + const childList = [...$tabContent.children]; + childList.forEach((item) => { + if (item.id === tabId) item.classList.add('active'); + else item.classList.remove('active'); + }); + } + }); + }); + } + static backToTop() { + document.querySelectorAll('#article-container .tabs .tab-to-top').forEach((item) => { + item.addEventListener('click', function () { + utils.scrollToDest(utils.getEleTop(item.parentElement.parentElement.parentNode), 300); + }); + }); + } +} + +window.refreshFn = () => { + const {is_home, is_page, page, is_post} = PAGE_CONFIG; + const {runtime, lazyload, lightbox, randomlink, covercolor, post_ai} = GLOBAL_CONFIG; + const timeSelector = (is_home ? '.post-meta-date time' : is_post ? '.post-meta-date time' : '.datatime') + ', .webinfo-item time'; + document.body.setAttribute('data-type', page); + sco.changeTimeFormat(document.querySelectorAll(timeSelector)); + runtime && sco.addRuntime(); + [scrollFn, sidebarFn, sco.hideCookie, sco.addPhotoFigcaption, sco.setTimeState, sco.tagPageActive, sco.categoriesBarActive, sco.listenToPageInputPress, sco.addNavBackgroundInit, sco.refreshWaterFall].forEach(fn => fn()); + lazyload.enable && utils.lazyloadImg(); + lightbox && utils.lightbox(document.querySelectorAll("#article-container img:not(.flink-avatar,.gallery-group img)")); + randomlink && randomLinksList(); + post_ai && is_post && efu_ai.init(); + sco.switchComments(); + initObserver(); + if (is_home) showTodayCard(); + if (is_post || is_page) { + addHighlight(); + tabs.init(); + } + if (covercolor.enable) coverColor(); + if (PAGE_CONFIG.toc) toc.init(); +} +document.addEventListener('DOMContentLoaded', () => { + [addCopyright, sco.initConsoleState, window.refreshFn, asideStatus, () => window.onscroll = percent].forEach(fn => fn()); +}); +document.addEventListener('visibilitychange', () => { + if (document.hidden) { + sco.wasPageHidden = true; + } +}); +window.onkeydown = e => { + const { keyCode, ctrlKey, shiftKey } = e; + if (keyCode === 123 || (ctrlKey && shiftKey && keyCode === 67)) { + utils.snackbarShow(GLOBAL_CONFIG.lang.f12, false, 3000); + } + if (keyCode === 27) { + sco.hideConsole(); + } +}; +document.addEventListener('copy', () => { + utils.snackbarShow(GLOBAL_CONFIG.lang.copy.success, false, 3000); +}); \ No newline at end of file diff --git a/themes/solitude/source/js/music.js b/themes/solitude/source/js/music.js new file mode 100644 index 0000000..83a8870 --- /dev/null +++ b/themes/solitude/source/js/music.js @@ -0,0 +1,123 @@ +/** + * Music Player + * @description Initialize the music player and add event listeners to control the player + */ +class ScoMusicPlayer { + constructor() { + this.init(); + } + init() { + document.documentElement.style.setProperty('--vh', `${window.innerHeight}px`); + this.getCustomPlayList(); + this.addEventListenerToDocument(); + this.addButtonListEventListener(); + } + + getCustomPlayList() { + this.changeMusicBg(false); + } + addEventListenerToDocument() { + document.addEventListener("keydown", this.handleKeydown.bind(this)); + } + + addButtonListEventListener() { + const aplayerList = document.querySelector(".aplayer-list"); + document.querySelector(".aplayer-lrc")?.addEventListener("click", () => { + aplayerList.classList.toggle("aplayer-list-hide"); + }); + } + + changeMusicBg(isChangeBg = true) { + const musicBg = document.getElementById("Music-bg"); + const musicLoading = document.getElementsByClassName("Music-loading")[0]; + + if (isChangeBg) { + this.updateBackgroundImage(musicBg); + } else { + this.setLoadingScreen(musicLoading, musicBg); + } + } + + updateBackgroundImage(element) { + const musicCover = document.querySelector("#Music-page .aplayer-pic"); + const img = new Image(); + img.src = this.extractValue(musicCover.style.backgroundImage); + img.onload = () => { + element.style.backgroundImage = musicCover.style.backgroundImage; + }; + element.className = 'show' + } + + setLoadingScreen(loadingElement, backgroundElement) { + const timer = setInterval(() => { + const musicCover = document.querySelector("#Music-page .aplayer-pic"); + if (musicCover) { + loadingElement.style.display = "none"; + clearInterval(timer); + document.querySelector('meting-js').aplayer.volume(0.8, true); + this.addEventListenerChangeMusicBg(); + backgroundElement.style.display = "block"; + } + this.addButtonListEventListener(); + }, 100); + } + + extractValue(input) { + const valueRegex = /url\("([^"]+)"\)/; + const match = valueRegex.exec(input); + return match ? match[1] : ''; + } + + addEventListenerChangeMusicBg() { + const aplayer = document.querySelector("#Music-page meting-js").aplayer; + aplayer.on('loadeddata', this.changeMusicBg.bind(this, true)); + aplayer.on('timeupdate', this.lrcUpdate.bind(this)); + } + + lrcUpdate() { + const aplayerLrcContents = document.querySelector('.aplayer-lrc-contents'); + const currentLrc = aplayerLrcContents.querySelector('p.aplayer-lrc-current'); + if (currentLrc) { + const currentIndex = Array.from(aplayerLrcContents.children).indexOf(currentLrc); + aplayerLrcContents.style.transform = `translateY(${-currentIndex * 80}px)`; + } + } + + handleKeydown(event) { + const aplayer = document.querySelector('meting-js').aplayer; + switch (event.code) { + case "Space": + event.preventDefault(); + aplayer.toggle(); + break; + case "ArrowRight": + event.preventDefault(); + aplayer.skipForward(); + break; + case "ArrowLeft": + event.preventDefault(); + aplayer.skipBack(); + break; + case "ArrowUp": + event.preventDefault(); + if (aplayer.volume < 1) aplayer.volume(aplayer.volume + 0.1); + break; + case "ArrowDown": + event.preventDefault(); + if (aplayer.volume > 0) aplayer.volume(aplayer.volume - 0.1); + break; + } + } + destroy() { + document.removeEventListener("keydown", this.handleKeydown); + } +} + +/** + * Initialize the music player + */ +function initializeMusicPlayer() { + let exitingMusic = window.scoMusic; + if (exitingMusic) exitingMusic.destroy(); + window.scoMusic = new ScoMusicPlayer(); +} \ No newline at end of file diff --git a/themes/solitude/source/js/right_menu.js b/themes/solitude/source/js/right_menu.js new file mode 100644 index 0000000..8be13db --- /dev/null +++ b/themes/solitude/source/js/right_menu.js @@ -0,0 +1,253 @@ +let selectTextNow = ""; +const selectText = () => { + selectTextNow = document.selection + ? document.selection.createRange().text + : window.getSelection() + "" || ""; +}; +document.onmouseup = document.ondbclick = selectText; + +const rm = { + mask: document.getElementById("rightmenu-mask"), + menu: document.getElementById("rightMenu"), + get width() { + return this.menu.offsetWidth; + }, + get height() { + return this.menu.offsetHeight; + }, + domhref: "", + domsrc: "", + globalEvent: null, + menuItems: { + other: document.getElementsByClassName("rightMenuOther"), + plugin: document.getElementsByClassName("rightMenuPlugin"), + back: document.getElementById("menu-backward"), + forward: document.getElementById("menu-forward"), + refresh: document.getElementById("menu-refresh"), + top: document.getElementById("menu-top"), + copy: document.getElementById("menu-copytext"), + paste: document.getElementById("menu-pastetext"), + comment: document.getElementById("menu-commenttext"), + new: document.getElementById("menu-newwindow"), + copyLink: document.getElementById("menu-copylink"), + copyImg: document.getElementById("menu-copyimg"), + downloadImg: document.getElementById("menu-downloadimg"), + search: document.getElementById("menu-search"), + barrage: document.getElementById("menu-commentBarrage"), + mode: document.getElementById("menu-darkmode"), + translate: document.getElementById("menu-translate"), + music: [ + document.getElementById("menu-music-toggle"), + document.getElementById("menu-music-back"), + document.getElementById("menu-music-forward"), + document.getElementById("menu-music-copyMusicName"), + ], + }, + showRightMenu(e, x = 0, y = 0) { + this.menu.style.top = y + "px"; + this.menu.style.left = x + "px"; + this.menu.style.display = e ? "block" : "none"; + e ? stopMaskScroll() : (this.mask.style.display = "none"); + }, + hideRightMenu() { + rm.showRightMenu(false); + rm.mask.style.display = "none"; + }, + reLoadSize() { + this.menu.style.display = "block"; + this.menu.style.display = "none"; + }, + copyText(e) { + navigator.clipboard && navigator.clipboard.writeText(e); + utils.snackbarShow(GLOBAL_CONFIG.lang.copy.success, false, 2000); + this.hideRightMenu(); + }, + async downloadImage(imageUrl = this.domsrc, filename = "photo") { + try { + const response = await fetch(imageUrl); + const blob = await response.blob(); + const url = URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + link.download = filename || "image.jpg"; + link.style.display = "none"; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); + } catch (error) { + utils.snackbarShow(GLOBAL_CONFIG.right_menu.img_error, false, 2000); + } + }, + copyImage(imgUrl = this.domsrc) { + window.open(imgUrl); + }, + mode(darkmode) { + darkmode + ? (document.querySelector(".menu-darkmode-text").textContent = + GLOBAL_CONFIG.right_menu.mode.light) + : (document.querySelector(".menu-darkmode-text").textContent = + GLOBAL_CONFIG.right_menu.mode.dark); + this.hideRightMenu(); + }, + barrage(enable) { + enable + ? (document.querySelector(".menu-commentBarrage-text").textContent = + GLOBAL_CONFIG.right_menu.barrage.open) + : (document.querySelector(".menu-commentBarrage-text").textContent = + GLOBAL_CONFIG.right_menu.barrage.close); + this.hideRightMenu(); + }, +}; + +function stopMaskScroll() { + utils.addEventListenerPjax(rm.menu, "mousewheel", rm.hideRightMenu); + utils.addEventListenerPjax(rm.mask, "mousewheel", rm.hideRightMenu); + utils.addEventListenerPjax(rm.mask, "click", rm.hideRightMenu); +} + +window.oncontextmenu = (ele) => { + if (document.body.clientWidth <= 768) return; + let x = ele.clientX + 10; + let y = ele.clientY; + Array.from(rm.menuItems.other).forEach((item) => (item.style.display = "block")); + rm.globalEvent = ele; + + let display = false; + let link = ele.target.href; + let src = ele.target.currentSrc; + + if (selectTextNow && window.getSelection()) { + display = true; + rm.menuItems.copy.style.display = "block"; + GLOBAL_CONFIG.comment && (rm.menuItems.comment.style.display = "block"); + rm.menuItems.search && (rm.menuItems.search.style.display = "block"); + } else { + rm.menuItems.copy.style.display = "none"; + GLOBAL_CONFIG.comment && (rm.menuItems.comment.style.display = "none"); + rm.menuItems.search && (rm.menuItems.search.style.display = "none"); + } + + if (link) { + display = true; + rm.menuItems.new.style.display = "block"; + rm.menuItems.copyLink.style.display = "block"; + rm.domhref = link; + } else { + rm.menuItems.new.style.display = "none"; + rm.menuItems.copyLink.style.display = "none"; + } + + if (src) { + display = true; + rm.menuItems.copyImg.style.display = "block"; + rm.menuItems.downloadImg.style.display = "block"; + rm.domsrc = src; + } else { + rm.menuItems.copyImg.style.display = "none"; + rm.menuItems.downloadImg.style.display = "none"; + } + + let tagName = ele.target.tagName.toLowerCase(); + if (tagName === "input" || tagName === "textarea") { + display = true; + rm.menuItems.paste.style.display = "block"; + } else { + rm.menuItems.paste.style.display = "none"; + } + + if (tagName === "meting-js") { + display = true; + rm.menuItems.music.forEach((item) => (item.style.display = "block")); + } else { + rm.menuItems.music[0] && + rm.menuItems.music.forEach((item) => (item.style.display = "none")); + } + + Array.from(display ? rm.menuItems.other : rm.menuItems.plugin).forEach( + (item) => (item.style.display = "none") + ); + Array.from(display ? rm.menuItems.plugin : rm.menuItems.other).forEach( + (item) => (item.style.display = "block") + ); + rm.reLoadSize(); + x + rm.width > window.innerWidth && (x -= rm.width + 10); + y + rm.height > window.innerHeight && (y -= y + rm.height - window.innerHeight); + rm.mask.style.display = "flex"; + rm.showRightMenu(true, x, y); + return false; +}; + +(function () { + const addEventListener = (element, event, handler) => + element.addEventListener(event, handler); + + addEventListener(rm.menuItems.back, "click", () => + window.history.back() || rm.hideRightMenu() + ); + addEventListener(rm.menuItems.forward, "click", () => + window.history.forward() || rm.hideRightMenu() + ); + addEventListener(rm.menuItems.refresh, "click", () => + window.location.reload() + ); + addEventListener(rm.menuItems.top, "click", () => + sco.toTop() || rm.hideRightMenu() + ); + + if (GLOBAL_CONFIG.right_menu.music) { + addEventListener(rm.menuItems.music[0], "click", () => { + sco.musicToggle(); + rm.hideRightMenu(); + }); + addEventListener(rm.menuItems.music[1], "click", () => { + document.querySelector("meting-js").aplayer.skipBack(); + rm.hideRightMenu(); + }); + addEventListener(rm.menuItems.music[2], "click", () => { + document.querySelector("meting-js").aplayer.skipForward(); + rm.hideRightMenu(); + }); + addEventListener(rm.menuItems.music[3], "click", () => { + const title = Array.from(document.querySelectorAll(".aplayer-title")).map( + (e) => e.innerText + )[0]; + rm.copyText(title); + }); + } + + addEventListener(rm.menuItems.copy, "click", () => { + if (GLOBAL_CONFIG.copyright) { + const { limit, author, link, source, info } = GLOBAL_CONFIG.right_menu; + if (selectTextNow.length > limit) { + selectTextNow = `${selectTextNow}\n\n${author}\n${link}${window.location.href}\n${source}\n${info}`; + } + } + rm.copyText(selectTextNow); + rm.hideRightMenu(); + }); + + if (utils.saveToLocal.get("commentBarrageSwitch") !== null) { + rm.menuItems.barrage && rm.barrage(!utils.saveToLocal.get("commentBarrageSwitch")); + } + + addEventListener(rm.menuItems.paste, "click", () => + rm.pasteText() && rm.hideRightMenu() + ); + GLOBAL_CONFIG.comment && + addEventListener(rm.menuItems.comment, "click", () => + rm.hideRightMenu() || sco.toTalk(selectTextNow) + ); + addEventListener(rm.menuItems.new, "click", () => + window.open(rm.domhref) && rm.hideRightMenu() + ); + addEventListener(rm.menuItems.downloadImg, "click", () => + rm.downloadImage() && rm.hideRightMenu() + ); + addEventListener(rm.menuItems.copyImg, "click", () => + rm.copyImage() && rm.hideRightMenu() + ); + addEventListener(rm.menuItems.copyLink, "click", () => + rm.copyText(rm.domhref) && rm.hideRightMenu() + ); +})(); \ No newline at end of file diff --git a/themes/solitude/source/js/search/algolia.js b/themes/solitude/source/js/search/algolia.js new file mode 100644 index 0000000..4e5741a --- /dev/null +++ b/themes/solitude/source/js/search/algolia.js @@ -0,0 +1,181 @@ +window.addEventListener("load", () => { + const $searchMask = document.getElementById("search-mask"); + const $searchDialog = document.querySelector("#algolia-search .search-dialog"); + + window.openSearch = () => { + utils.animateIn($searchMask, "to_show 0.5s"); + $searchDialog.style.display = "block"; + setTimeout(() => { + document.querySelector("#algolia-search .ais-SearchBox-input").focus(); + }, 100); + document.addEventListener("keydown", function f(event) { + if (event.code === "Escape") { + closeSearch(); + document.removeEventListener("keydown", f); + } + }); + fixSafariHeight(); + window.addEventListener("resize", fixSafariHeight); + }; + + const closeSearch = () => { + utils.animateOut($searchDialog, "search_close .5s"); + utils.animateOut($searchMask, "to_hide 0.5s"); + window.removeEventListener("resize", fixSafariHeight); + }; + + const fixSafariHeight = () => { + if (window.innerWidth < 768) { + $searchDialog.style.setProperty("--search-height", window.innerHeight + "px"); + } + }; + + const addEventCtrlK = () => { + document.addEventListener("keydown", function (event) { + if (event.ctrlKey && event.key === "k") { + event.preventDefault(); + openSearch(); + } + }); + } + + addEventCtrlK() + + const searchClickFn = () => { + utils.addEventListenerPjax(document.querySelector("#search-button > .search"), "click", openSearch); + + GLOBAL_CONFIG.right_menu && document.getElementById("menu-search").addEventListener("click", function (){ + rm.hideRightMenu(); + openSearch(); + let t=document.getElementsByClassName('ais-SearchBox-input')[0]; + let evt = document.createEvent('HTMLEvents'); + evt.initEvent('input', true,true) + t.value = selectTextNow + t.dispatchEvent(evt) + }) + }; + + const searchFnOnce = () => { + $searchMask.addEventListener("click", closeSearch); + document.querySelector("#algolia-search .search-close-button").addEventListener("click", closeSearch); + }; + + const algolia = GLOBAL_CONFIG.algolia; + const isAlgoliaValid = algolia.appId && algolia.apiKey && algolia.indexName; + if (!isAlgoliaValid) { + return console.error("Algolia setting is invalid!"); + } + + const search = instantsearch({ + indexName: algolia.indexName, + searchClient: algoliasearch(algolia.appId, algolia.apiKey), + searchFunction(helper) { + if (helper.state.query) { + let innerLoading = ''; + document.getElementById("algolia-hits").innerHTML = innerLoading; + helper.search(); + } + }, + }); + + const configure = instantsearch.widgets.configure({ + hitsPerPage: algolia.hits.per_page || 5, + }); + + const searchBox = instantsearch.widgets.searchBox({ + container: "#algolia-search-input", + showReset: false, + showSubmit: false, + placeholder: GLOBAL_CONFIG.lang.search.placeholder, + showLoadingIndicator: true, + searchOnEnterKeyPressOnly: true, + searchAsYouType: false, + }); + + const hits = instantsearch.widgets.hits({ + container: "#algolia-hits", + templates: { + item(data) { + const link = data.permalink ? data.permalink : GLOBAL_CONFIG.root + data.path; + const result = data._highlightResult; + const loadingLogo = document.querySelector("#algolia-hits .st-spin"); + if (loadingLogo) { + loadingLogo.style.display = "none"; + } + setTimeout(() => { + document.querySelector("#algolia-search .ais-SearchBox-input").focus(); + }, 200); + return ` +
    + ${result.title.value || "no-title"} + `; + }, + empty: function (data) { + const loadingLogo = document.querySelector("#algolia-hits .st-spin"); + if (loadingLogo) { + loadingLogo.style.display = "none"; + } + setTimeout(() => { + document.querySelector("#algolia-search .ais-SearchBox-input").focus(); + }, 200); + return ( + '
    ' + + GLOBAL_CONFIG.lang.search.empty.replace(/\$\{query}/, data.query) + + "
    " + ); + }, + }, + cssClasses: { + item: "algolia-hit-item", + }, + }); + + const pagination = instantsearch.widgets.pagination({ + container: "#algolia-pagination", + totalPages: algolia.hits.per_page ?? 5, + scrollTo: false, + showFirstLast: false, + templates: { + first: '', + last: '', + previous: '', + next: '', + }, + cssClasses: { + root: "pagination", + item: "pagination-item", + link: "page-number", + active: "current", + disabled: "disabled-item", + }, + }); + + const stats = instantsearch.widgets.stats({ + container: "#algolia-tips > #algolia-stats", + templates: { + text: function (data) { + const stats = GLOBAL_CONFIG.lang.search.hit + .replace(/\$\{hits}/, data.nbHits) + .replace(/\$\{time}/, data.processingTimeMS); + return `
    ${stats}`; + }, + }, + }); + + search.addWidgets([configure, searchBox,stats, hits, pagination]); + + search.start(); + + searchClickFn(); + searchFnOnce(); + + window.addEventListener("pjax:complete", () => { + !utils.isHidden($searchMask) && closeSearch(); + searchClickFn(); + }); + + window.pjax && + search.on("render", () => { + window.pjax.refresh(document.getElementById("algolia-hits")); + }); +}); \ No newline at end of file diff --git a/themes/solitude/source/js/search/local.js b/themes/solitude/source/js/search/local.js new file mode 100644 index 0000000..2c2f2ac --- /dev/null +++ b/themes/solitude/source/js/search/local.js @@ -0,0 +1,205 @@ +window.addEventListener("load", () => { + let store = []; + const $searchMask = document.getElementById("search-mask"); + const $searchDialog = document.querySelector("#local-search .search-dialog"); + window.openSearch = () => { + utils.animateIn($searchMask, "to_show 0.5s"); + $searchDialog.style.display = "block"; + setTimeout(() => { + document.querySelector("#local-search .search-box-input").focus(); + }, 100); + document.addEventListener("keydown", function f(event) { + if (event.code === "Escape") { + closeSearch(); + document.removeEventListener("keydown", f); + } + }); + fixSafariHeight(); + window.addEventListener("resize", fixSafariHeight); + }; + const fixSafariHeight = () => { + if (window.innerWidth < 768) { + $searchDialog.style.setProperty("--search-height", window.innerHeight + "px"); + } + }; + const closeSearch = () => { + utils.animateOut($searchDialog, "search_close .5s"); + utils.animateOut($searchMask, "to_hide 0.5s"); + window.removeEventListener("resize", fixSafariHeight); + }; + + const addEventTagList = () => { + const list = document.querySelectorAll("#local-search .tag-list"); + if (list.length > 0) { + list.forEach(el => el.addEventListener("click", (e) => closeSearch())) + } + } + + addEventTagList() + + const addEventCtrlK = () => { + document.addEventListener("keydown", function (event) { + if (event.ctrlKey && event.key === "k") { + event.preventDefault(); + openSearch(); + } + }); + } + + addEventCtrlK() + + const searchFnOnce = () => { + $searchMask.addEventListener("click", closeSearch); + utils.addEventListenerPjax(document.querySelector("#local-search .search-close-button"), "click", closeSearch); + }; + + searchFnOnce(); + + const searchClickFn = () => { + utils.addEventListenerPjax(document.querySelector("#search-button > .search"), "click", openSearch); + + GLOBAL_CONFIG.right_menu && document.getElementById("menu-search").addEventListener("click", function () { + rm.hideRightMenu(); + openSearch(); + let t = document.getElementsByClassName('search-box-input')[0]; + let evt = document.createEvent('HTMLEvents'); + evt.initEvent('input', true, true) + t.value = selectTextNow + t.dispatchEvent(evt) + }) + } + + searchClickFn(); + + function init() { + fetch(GLOBAL_CONFIG.localsearch.path) + .then(response => response.text()) + .then(data => { + let parser = new DOMParser(); + let xmlDoc = parser.parseFromString(data, "text/xml"); + let entries = xmlDoc.getElementsByTagName("entry"); + for (let i = 0; i < entries.length; i++) { + let entry = entries[i]; + let title = entry.getElementsByTagName("title")[0].textContent; + let link = entry.getElementsByTagName("url")[0].textContent; + let content = entry.getElementsByTagName("content")[0].textContent; + store.push({ + 'title': title, + 'link': link, + 'content': content + }); + } + }) + .catch(err => console.error("Error loading search data:", err)); + } + + let query = '' + let currentPage = 0; + const resultsPerPage = 10; + let results = []; + + function initUI() { + const $results = document.getElementById("search-results"); + const $search = document.getElementById("search-input"); + $search.addEventListener('keydown', function (e) { + if (e.keyCode === 13) { + e.preventDefault(); + $results.innerHTML = ''; + query = this.value.trim(); + if (query !== '') { + results = search(query); + renderResults(results, currentPage); + renderPagination(results.length); + } else { + clearSearchResults(); + } + } + }); + } + + function clearSearchResults() { + const $results = document.getElementById("search-results"); + const $pagination = document.getElementById("search-pagination"); + const $tips = document.getElementById("search-tips"); + + $results.innerHTML = ''; + $pagination.innerHTML = ''; + $tips.innerHTML = ''; + } + + function search(query) { + const regex = new RegExp(query.split('').join('.*'), 'i'); + return store.filter(page => regex.test(page.title) || regex.test(page.content)); + } + + function renderResults(results, page) { + const $search_results = document.getElementById("search-results"); + $search_results.innerHTML = ''; + const $tips = document.getElementById("search-tips"); + $tips.innerHTML = ''; + const start = page * resultsPerPage; + const end = start + resultsPerPage; + if (!results.length) { + const $empty = document.createElement("span"); + $empty.className = "search-result-empty"; + $empty.textContent = GLOBAL_CONFIG.lang.search.empty.replace(/\$\{query}/, query); + $search_results.appendChild($empty); + return; + } + results.slice(start, end).forEach(function (result) { + const $result = document.createElement("li"); + $result.className = "search-result-item"; + const $link = document.createElement("a"); + $link.className = "search-result-title"; + $link.href = result.link; + $link.innerHTML = highlightSearchKeyword(result.title, query); + $result.appendChild($link); + $search_results.appendChild($result); + }); + const count = document.createElement("span"); + count.className = "search-result-count"; + count.innerHTML = GLOBAL_CONFIG.lang.search.count.replace(/\$\{count}/, results.length) + $tips.appendChild(count); + } + + function highlightSearchKeyword(text, keyword) { + const regex = new RegExp(`(${keyword.split(' ').join('|')})`, 'gi'); + return text.replace(regex, '$1'); + } + + function renderPagination(totalResults) { + const totalPages = Math.ceil(totalResults / resultsPerPage); + const paginationContainer = document.getElementById("search-pagination"); + paginationContainer.innerHTML = ''; + const paginationList = document.createElement("ul"); + paginationList.className = "pagination-list"; + + for (let i = 0; i < totalPages; i++) { + const button = document.createElement("li"); + button.className = "pagination-item"; + button.textContent = i + 1; + if (i === currentPage) { + button.classList.add('select'); + } + button.addEventListener('click', function () { + currentPage = i; + renderResults(results, i); + document.querySelectorAll(".pagination-item").forEach(function (btn) { + btn.classList.remove('select'); + }); + button.classList.add('select'); + }); + paginationList.appendChild(button); + } + paginationContainer.appendChild(paginationList); + } + + init(); + initUI(); + window.addEventListener('DOMContentLoaded', (event) => { + initUI(); + }); + window.addEventListener('pjax:complete', () => { + searchClickFn() + }) +}); \ No newline at end of file diff --git a/themes/solitude/source/js/third_party/barrage.min.js b/themes/solitude/source/js/third_party/barrage.min.js new file mode 100644 index 0000000..991eec2 --- /dev/null +++ b/themes/solitude/source/js/third_party/barrage.min.js @@ -0,0 +1,6 @@ +/** + * Barrage Comment + * author: @efuo + * date: 2024-04-28 + */ +function _0x2736(_0x423b83,_0x26de1b){const _0x562b41=_0x562b();return _0x2736=function(_0x2736dc,_0x1e863c){_0x2736dc=_0x2736dc-0x11f;let _0x1c44ad=_0x562b41[_0x2736dc];return _0x1c44ad;},_0x2736(_0x423b83,_0x26de1b);}const _0xf096ba=_0x2736;(function(_0x244294,_0x51eb5a){const _0x2047ac=_0x2736,_0x461abb=_0x244294();while(!![]){try{const _0x362f69=-parseInt(_0x2047ac(0x12f))/0x1+-parseInt(_0x2047ac(0x126))/0x2+-parseInt(_0x2047ac(0x120))/0x3+-parseInt(_0x2047ac(0x15b))/0x4+parseInt(_0x2047ac(0x13c))/0x5+parseInt(_0x2047ac(0x153))/0x6*(parseInt(_0x2047ac(0x15c))/0x7)+parseInt(_0x2047ac(0x132))/0x8*(parseInt(_0x2047ac(0x152))/0x9);if(_0x362f69===_0x51eb5a)break;else _0x461abb['push'](_0x461abb['shift']());}catch(_0x59d2ed){_0x461abb['push'](_0x461abb['shift']());}}}(_0x562b,0xa9d59));class Barrage{constructor(_0x35d098){const _0xc51bb8=_0x2736;this['comments']=_0x35d098,this[_0xc51bb8(0x136)]=document[_0xc51bb8(0x15a)](_0xc51bb8(0x142)),this[_0xc51bb8(0x12c)]=[],this[_0xc51bb8(0x133)]=0x0,this[_0xc51bb8(0x139)]=[],this[_0xc51bb8(0x14b)]=![],this[_0xc51bb8(0x146)]();}[_0xf096ba(0x13e)]=_0x50912d=>{const _0x243af9=_0xf096ba;return _0x50912d['flatMap'](_0x18bbb5=>_0x18bbb5[_0x243af9(0x14a)]?[_0x18bbb5,...this['filterAndFlatten'](_0x18bbb5[_0x243af9(0x14a)])]:[_0x18bbb5]);};[_0xf096ba(0x135)](_0x25b918){const _0x4cf7a3=_0xf096ba;return _0x25b918[_0x4cf7a3(0x124)](/(<([^>]+)>)/ig,'')[_0x4cf7a3(0x12e)]();}[_0xf096ba(0x147)](_0x3c5b88){const _0x58f618=_0xf096ba,_0x1c09f9=this[_0x58f618(0x135)](_0x3c5b88[_0x58f618(0x156)]);if(!_0x1c09f9)return![];const _0xbed29a=document[_0x58f618(0x127)]('div');return _0xbed29a[_0x58f618(0x122)]=_0x58f618(0x138),_0xbed29a[_0x58f618(0x12d)]=''+GLOBAL_CONFIG[_0x58f618(0x125)][_0x58f618(0x158)][_0x58f618(0x134)]+_0x58f618(0x140)+_0x3c5b88['nick']+_0x58f618(0x149)+GLOBAL_CONFIG[_0x58f618(0x130)][_0x58f618(0x13b)]+_0x58f618(0x143)+_0x3c5b88[_0x58f618(0x131)]+_0x58f618(0x14d)+(_0x3c5b88['id']?_0x58f618(0x14f)+_0x3c5b88['id']+'\x27)':'javascript:sco.scrollTo(\x27post-comment\x27)')+'\x22>'+_0x1c09f9+_0x58f618(0x11f),this[_0x58f618(0x136)][_0x58f618(0x155)](_0xbed29a),this[_0x58f618(0x139)][_0x58f618(0x12a)](_0xbed29a),!![];}[_0xf096ba(0x141)](_0x4142a6){const _0x5da976=_0xf096ba;_0x4142a6[_0x5da976(0x13a)][_0x5da976(0x14e)](_0x5da976(0x13f)),setTimeout(()=>this[_0x5da976(0x136)][_0x5da976(0x121)](_0x4142a6),0x3e8);}[_0xf096ba(0x154)](){const _0x3d0cb8=_0xf096ba;if(this['barrageList'][_0x3d0cb8(0x159)]&&!this[_0x3d0cb8(0x14b)]){if(!this[_0x3d0cb8(0x147)](this['barrageList'][this[_0x3d0cb8(0x133)]]))return this[_0x3d0cb8(0x133)]=(this[_0x3d0cb8(0x133)]+0x1)%this[_0x3d0cb8(0x12c)][_0x3d0cb8(0x159)],this[_0x3d0cb8(0x154)]();this[_0x3d0cb8(0x133)]=(this[_0x3d0cb8(0x133)]+0x1)%this['barrageList'][_0x3d0cb8(0x159)];}this[_0x3d0cb8(0x139)][_0x3d0cb8(0x159)]>Math['min'](0x1,this['barrageList'][_0x3d0cb8(0x159)])&&!this[_0x3d0cb8(0x14b)]&&this[_0x3d0cb8(0x141)](this['barrageTimer'][_0x3d0cb8(0x150)]());}['initBarrage'](){const _0x571de5=_0xf096ba,_0x2e2e3e=utils[_0x571de5(0x157)][_0x571de5(0x137)](_0x571de5(0x128));this[_0x571de5(0x136)]['style']['display']=_0x2e2e3e?_0x571de5(0x13d):_0x571de5(0x144),this[_0x571de5(0x12c)]=this['filterAndFlatten'](this[_0x571de5(0x145)]),this[_0x571de5(0x136)][_0x571de5(0x12d)]='',clearInterval(this['commentInterval']),this[_0x571de5(0x14c)]=setInterval(()=>this[_0x571de5(0x154)](),0x1388);}[_0xf096ba(0x146)](){const _0x81bb1e=_0xf096ba;this['initBarrage'](),this['dom'][_0x81bb1e(0x148)]('mouseover',()=>this['hoverOnCommentBarrage']=!![]),this[_0x81bb1e(0x136)][_0x81bb1e(0x148)](_0x81bb1e(0x151),()=>this[_0x81bb1e(0x14b)]=![]);}[_0xf096ba(0x123)](){const _0x569798=_0xf096ba;clearInterval(this[_0x569798(0x14c)]),this[_0x569798(0x136)][_0x569798(0x129)]('mouseover',()=>this[_0x569798(0x14b)]=!![]),this[_0x569798(0x136)][_0x569798(0x129)](_0x569798(0x151),()=>this['hoverOnCommentBarrage']=![]),this[_0x569798(0x136)][_0x569798(0x12d)]='';}}function _0x562b(){const _0x3031bd=['
    ','3742368aCgLQg','removeChild','className','destroy','replace','lang','1438760uXBNRa','createElement','commentBarrageSwitch','removeEventListener','push','currentBarrage','barrageList','innerHTML','trim','271090IyHbzI','comment','mailMd5','8MDfQRc','barrageIndex','title','sanitizeContent','dom','get','comment-barrage-item','barrageTimer','classList','avatar','5632610YtcmxI','flex','filterAndFlatten','out','','removeBarrageItem','.comment-barrage','/avatar/','none','comments','init','createBarrageItem','addEventListener'];_0x562b=function(){return _0x3031bd;};return _0x562b();}function initializeCommentBarrage(_0x506af1){const _0x438d69=_0xf096ba;if(_0x506af1[_0x438d69(0x159)]===0x0)return;let _0x6d138e=window[_0x438d69(0x12b)];if(_0x6d138e)_0x6d138e[_0x438d69(0x123)]();window[_0x438d69(0x12b)]=new Barrage(_0x506af1);} \ No newline at end of file diff --git a/themes/solitude/source/js/third_party/efu_ai.min.js b/themes/solitude/source/js/third_party/efu_ai.min.js new file mode 100644 index 0000000..db87199 --- /dev/null +++ b/themes/solitude/source/js/third_party/efu_ai.min.js @@ -0,0 +1,6 @@ +/** + * author: Efu + * email: o@efu.me + * website: https://efu.me + */ +class efuAI{constructor(){this.root="https://summary.tianli0.top",this.aiTalkMode=!1,this.aiPostExplanation='',this.config=GLOBAL_CONFIG.post_ai,this.scoGPTIsRunning=!1}init(){if(!document.querySelector(".ai-explanation"))return;this.scoGPTIsRunning=!1;this.aiPostExplanation=PAGE_CONFIG.ai_text?PAGE_CONFIG.ai_text+"":false;if(!this.aiPostExplanation){this.generate()}else{this.aiShowAnimation(Promise.resolve(this.aiPostExplanation))}this.AIEngine()}getTitleAndContent(){const e=document.getElementById("article-container"),t=document.title,n=e.getElementsByTagName("p"),i=e.querySelectorAll("h1, h2, h3, h4, h5");return(t+" "+Array.from(i).concat(Array.from(n)).map((e=>e.innerText.replace(/https?:\/\/[^\s]+/g,""))).join(" ")).slice(0,1e3)}async generate(){this.aiShowAnimation(this.fetch(document.title,this.getTitleAndContent(),this.config.key))}async fetch(e,t,n){const i=`${this.root}/?content=${encodeURIComponent(t)}&title=${e}&key=${encodeURIComponent(n)}&url=${encodeURIComponent(window.location.href)}`,s=await fetch(i),o=await s.json();return s.ok?(this.aiPostExplanation=o.summary,o.summary):(console.error("Request failed:",o.err_msg),o.err_msg)}aiShowAnimation(e,t=!1){const n=document.querySelector(".ai-explanation"),i=document.querySelector(".ai-tag");if(!n||this.scoGPTIsRunning)return;this.scoGPTIsRunning=!0,this.cleanSuggestions(),i.classList.add("loadingAI"),n.style.display="block",n.innerHTML='生成中...';let s,o,a=!0,c=0,r=!0;const l=new IntersectionObserver((e=>{a=e[0].isIntersecting,a&&requestAnimationFrame(o)}),{threshold:0});e.then((e=>{s=performance.now(),o=()=>{if(c=(u?100*Math.random()+100:m?10:25)&&(n.innerText=e.slice(0,c+1),s=r,c++,c':(n.innerHTML=e,n.style.display="block",this.scoGPTIsRunning=!1,i.classList.remove("loadingAI"),l.disconnect(),t&&this.createSuggestions())),a&&requestAnimationFrame(o)}},a&&r&&setTimeout((()=>{requestAnimationFrame(o),r=!1}),3e3),l.observe(n)})).catch((e=>{console.error("检索信息失败:",e),n.innerHTML="检索信息失败",n.style.display="block",this.scoGPTIsRunning=!1,i.classList.remove("loadingAI"),l.disconnect()}))}AIEngine(){const e=document.querySelector(".ai-tag");e&&e.addEventListener("click",(()=>{this.scoGPTIsRunning||(this.aiTalkMode=!0,this.aiShowAnimation(Promise.resolve(this.config.talk),!0))}))}cleanSuggestions(){const e=document.querySelector(".ai-suggestions");e?e.innerHTML="":console.error("没有这个元素:'ai-suggestions'")}createSuggestions(){this.aiTalkMode&&(this.cleanSuggestions(),this.createSuggestionItemWithAction("这篇文章讲了什么?",(()=>{""===this.aiPostExplanation?this.generate():this.aiShowAnimation(Promise.resolve(this.aiPostExplanation),!0)})),this.config.randomPost&&this.createSuggestionItemWithAction("带我去看看其他文章",(()=>toRandomPost())),this.aiTalkMode=!0)}createSuggestionItemWithAction(e,t){const n=document.querySelector(".ai-suggestions");if(!n)return void console.error("无法找到具有class为ai-suggestions的元素");const i=document.createElement("div");i.classList.add("ai-suggestions-item"),i.textContent=e,i.addEventListener("click",t),n.appendChild(i)}}const efu_ai=new efuAI; \ No newline at end of file diff --git a/themes/solitude/source/js/third_party/envelope.min.js b/themes/solitude/source/js/third_party/envelope.min.js new file mode 100644 index 0000000..ef5f436 --- /dev/null +++ b/themes/solitude/source/js/third_party/envelope.min.js @@ -0,0 +1,5 @@ +/** + * EasyDanmaku v1.0.0 + * author: Leonus + */ +class EasyDanmaku{constructor(t){this.container=this.checkParams(t),this.pathname=t.page||null,this.wrapperStyle=t.wrapperStyle||null,this.line=t.line||10,this.speed=t.speed||5,this.runtime=t.runtime||10,this.colourful=t.colourful||!1,this.loop=t.loop||!1,this.hover=t.hover||!1,this.coefficient=t.coefficient||1.38,this.originIndex=0,this.originList=null,this.offsetValue=this.container.offsetHeight/this.line,this.vipIndex=0,this.overflowArr=[],this.clearIng=!1,this.cleartimer=null,this.init(),this.handleEvents(t)}handleEvents(t){this.onComplete=t.onComplete||null,this.onHover=t.onHover||null}init(){this.runstatus=1,this.aisle=[],this.container.style.overflow="hidden",this.hover&&this.handleMouseHover(),"relative"!==Utils.getStyle(this.container,"position")&&"fixed"!==Utils.getStyle(this.container,"position")&&(this.container.style.position="relative");for(let t=0;t{l+=t,l>n.offsetWidth*this.coefficient&&(this.aisle[r].normalRow=!0,clearInterval(o))}),16.66),setTimeout((()=>{1!=n.getAttribute("relieveDel")&&(i&&i({runtime:s,target:n,width:n.offsetWidth}),n.remove())}),1e3*s)}else{this.aisle.some((t=>!0===t.normalRow))?a.call(this):(()=>{this.overflowArr.push({content:t,normalClass:e}),this.clearIng||this.clearOverflowDanmakuArray()})()}}.call(this)}batchSend(t,e=!1,i=null){let n=this.runtime||1.23*t.length;this.originList=t,this.hasAvatar=e,this.normalClass=i;let r=setInterval((()=>{location.pathname!=this.pathname&&clearInterval(r),this.originIndex>t.length-1?(clearInterval(r),this.originIndex=0,this.onComplete&&this.onComplete(),this.loop&&this.batchSend(this.originList,e,i)):(e?this.send(`${t[this.originIndex].url?'':""}\n

    ${t[this.originIndex].content}

    ${t[this.originIndex].url?"
    ":""}\n `,i||this.wrapperStyle):this.send(t[this.originIndex],i||this.wrapperStyle),this.originIndex++)}),n/t.length*1e3)}centeredSend(t,e,i=3e3,n=null){let r=document.createElement("div"),s=0;r.innerHTML=t,(e||this.wrapperStyle)&&r.classList.add(e||this.wrapperStyle),function t(){if(this.aisle[s].vipRow)this.container.appendChild(r),r.style.cssText=`\n position:absolute;\n left:50%;\n transform:translateX(-50%);\n top: ${s*this.offsetValue}px;\n `,this.aisle[s].vipRow=!1,setTimeout((()=>{n&&n({duration:i,target:r,width:r.offsetWidth}),r.remove(),this.aisle[s].vipRow=!0}),i);else{if(s++,s>this.line-1)return;t.call(this)}}.call(this)}play(){const t=this.container.children;for(let e=0;e{t.remove()}),1e3*this.speed)}else if(e===i){clearTimeout(t.timer);const e=Utils.getStyle(t,"transform").match(n)[1];t.style.transition="transform 0s linear",t.style.transform=`translateX(-${e}px)`,t.setAttribute("relieveDel",1)}}handleMouseHover(){Utils.eventDelegation(this.container,"default-style","mouseover",(t=>{t.style["z-index"]=1e3,this.controlDanmakurunStatus(t,0),this.onHover&&this.onHover(t)})),Utils.eventDelegation(this.container,"default-style","mouseout",(t=>{t.style.zIndex=1,1==this.runstatus&&this.controlDanmakurunStatus(t,1)}))}clearOverflowDanmakuArray(){clearInterval(this.cleartimer),this.clearIng=!0;let t=0;this.cleartimer=setInterval((()=>{0===this.overflowArr.length?(t++,t>20&&(clearInterval(this.cleartimer),this.clearIng=!1)):(this.send(this.overflowArr[0].content,this.overflowArr[0].normalClass||this.wrapperStyle),this.overflowArr.shift())}),500)}}class Utils{static getStyle(t,e){return window.getComputedStyle(t,null)[e]}static eventDelegation(t,e,i,n){t.addEventListener(i,(t=>{try{t.target.className.includes(e)?n(t.target):t.target.parentNode.className.includes(e)&&n(t.target.parentNode)}catch(t){}}))}} \ No newline at end of file diff --git a/themes/solitude/source/js/third_party/universe.min.js b/themes/solitude/source/js/third_party/universe.min.js new file mode 100644 index 0000000..10b43ee --- /dev/null +++ b/themes/solitude/source/js/third_party/universe.min.js @@ -0,0 +1,5 @@ +/** + * @name: Universe + * author: Leonus + */ +function dark(){window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame;var t,i,e,s,n=.05,h=document.getElementById("universe"),a=!0,o="226,225,224",r=[];function d(){t=window.innerWidth,i=window.innerHeight,e=.216*t,h.setAttribute("width",t),h.setAttribute("height",i)}function c(){s.clearRect(0,0,t,i);for(var e=r.length,n=0;nthis.opacityTresh),this.opacity+=this.do)},this.fadeOut=function(){this.fadingOut&&(this.fadingOut=!(this.opacity<0),this.opacity-=this.do/2,(this.x>t||this.y<0)&&(this.fadingOut=!1,this.reset()))},this.draw=function(){if(s.beginPath(),this.giant)s.fillStyle="rgba(180,184,240,"+this.opacity+")",s.arc(this.x,this.y,2,0,2*Math.PI,!1);else if(this.comet){s.fillStyle="rgba("+o+","+this.opacity+")",s.arc(this.x,this.y,1.5,0,2*Math.PI,!1);for(var t=0;t<30;t++)s.fillStyle="rgba("+o+","+(this.opacity-this.opacity/20*t)+")",s.rect(this.x-this.dx/4*t,this.y-this.dy/4*t-2,2,2),s.fill()}else s.fillStyle="rgba(226,225,142,"+this.opacity+")",s.rect(this.x,this.y,this.r,this.r);s.closePath(),s.fill()},this.move=function(){this.x+=this.dx,this.y+=this.dy,!1===this.fadingOut&&this.reset(),(this.x>t-t/4||this.y<0)&&(this.fadingOut=!0)},setTimeout((function(){a=!1}),50)}function u(t){return Math.floor(1e3*Math.random())+1<10*t}function m(t,i){return Math.random()*(i-t)+t}d(),window.addEventListener("resize",d,!1),function(){s=h.getContext("2d");for(var t=0;t 0 || + obj === translateButtonObject + ) { + continue + } + if (obj.title !== '' && obj.title != null) { + obj.title = translateText(obj.title) + } + if (obj.alt !== '' && obj.alt != null) obj.alt = translateText(obj.alt) + if (obj.placeholder !== '' && obj.placeholder != null) { + obj.placeholder = translateText(obj.placeholder) + } + if ( + obj.tagName === 'INPUT' && + obj.value !== '' && + obj.type !== 'text' && + obj.type !== 'hidden' + ) { + obj.value = translateText(obj.value) + } + if (obj.nodeType === 3) obj.data = translateText(obj.data) + else translateBody(obj) + } + } + + function translatePage() { + if (targetEncoding === 1) { + currentEncoding = 1 + targetEncoding = 2 + translateButtonObject.lastChild.textContent = msgToTraditionalChinese + translateButtonObject.firstChild.className = 'solitude st-panben-line' + utils.snackbarShow('你已切换为简体') + } else if (targetEncoding === 2) { + currentEncoding = 2 + targetEncoding = 1 + translateButtonObject.lastChild.textContent = msgToSimplifiedChinese + translateButtonObject.firstChild.className = 'solitude st-jianben-line' + utils.snackbarShow('你已切換為繁體') + } + utils.saveToLocal.set(targetEncodingCookie, targetEncoding, 2) + setLang() + translateBody() + rm.hideRightMenu() + } + + function JTPYStr() { + return '万与丑专业丛东丝丢两严丧个丬丰临为丽举么义乌乐乔习乡书买乱争于亏云亘亚产亩亲亵亸亿仅从仑仓仪们价众优伙会伛伞伟传伤伥伦伧伪伫体余佣佥侠侣侥侦侧侨侩侪侬俣俦俨俩俪俭债倾偬偻偾偿傥傧储傩儿兑兖党兰关兴兹养兽冁内冈册写军农冢冯冲决况冻净凄凉凌减凑凛几凤凫凭凯击凼凿刍划刘则刚创删别刬刭刽刿剀剂剐剑剥剧劝办务劢动励劲劳势勋勐勚匀匦匮区医华协单卖卢卤卧卫却卺厂厅历厉压厌厍厕厢厣厦厨厩厮县参叆叇双发变叙叠叶号叹叽吁后吓吕吗吣吨听启吴呒呓呕呖呗员呙呛呜咏咔咙咛咝咤咴咸哌响哑哒哓哔哕哗哙哜哝哟唛唝唠唡唢唣唤唿啧啬啭啮啰啴啸喷喽喾嗫呵嗳嘘嘤嘱噜噼嚣嚯团园囱围囵国图圆圣圹场坂坏块坚坛坜坝坞坟坠垄垅垆垒垦垧垩垫垭垯垱垲垴埘埙埚埝埯堑堕塆墙壮声壳壶壸处备复够头夸夹夺奁奂奋奖奥妆妇妈妩妪妫姗姜娄娅娆娇娈娱娲娴婳婴婵婶媪嫒嫔嫱嬷孙学孪宁宝实宠审宪宫宽宾寝对寻导寿将尔尘尧尴尸尽层屃屉届属屡屦屿岁岂岖岗岘岙岚岛岭岳岽岿峃峄峡峣峤峥峦崂崃崄崭嵘嵚嵛嵝嵴巅巩巯币帅师帏帐帘帜带帧帮帱帻帼幂幞干并广庄庆庐庑库应庙庞废庼廪开异弃张弥弪弯弹强归当录彟彦彻径徕御忆忏忧忾怀态怂怃怄怅怆怜总怼怿恋恳恶恸恹恺恻恼恽悦悫悬悭悯惊惧惨惩惫惬惭惮惯愍愠愤愦愿慑慭憷懑懒懔戆戋戏戗战戬户扎扑扦执扩扪扫扬扰抚抛抟抠抡抢护报担拟拢拣拥拦拧拨择挂挚挛挜挝挞挟挠挡挢挣挤挥挦捞损捡换捣据捻掳掴掷掸掺掼揸揽揿搀搁搂搅携摄摅摆摇摈摊撄撑撵撷撸撺擞攒敌敛数斋斓斗斩断无旧时旷旸昙昼昽显晋晒晓晔晕晖暂暧札术朴机杀杂权条来杨杩杰极构枞枢枣枥枧枨枪枫枭柜柠柽栀栅标栈栉栊栋栌栎栏树栖样栾桊桠桡桢档桤桥桦桧桨桩梦梼梾检棂椁椟椠椤椭楼榄榇榈榉槚槛槟槠横樯樱橥橱橹橼檐檩欢欤欧歼殁殇残殒殓殚殡殴毁毂毕毙毡毵氇气氢氩氲汇汉污汤汹沓沟没沣沤沥沦沧沨沩沪沵泞泪泶泷泸泺泻泼泽泾洁洒洼浃浅浆浇浈浉浊测浍济浏浐浑浒浓浔浕涂涌涛涝涞涟涠涡涢涣涤润涧涨涩淀渊渌渍渎渐渑渔渖渗温游湾湿溃溅溆溇滗滚滞滟滠满滢滤滥滦滨滩滪漤潆潇潋潍潜潴澜濑濒灏灭灯灵灾灿炀炉炖炜炝点炼炽烁烂烃烛烟烦烧烨烩烫烬热焕焖焘煅煳熘爱爷牍牦牵牺犊犟状犷犸犹狈狍狝狞独狭狮狯狰狱狲猃猎猕猡猪猫猬献獭玑玙玚玛玮环现玱玺珉珏珐珑珰珲琎琏琐琼瑶瑷璇璎瓒瓮瓯电画畅畲畴疖疗疟疠疡疬疮疯疱疴痈痉痒痖痨痪痫痴瘅瘆瘗瘘瘪瘫瘾瘿癞癣癫癯皑皱皲盏盐监盖盗盘眍眦眬着睁睐睑瞒瞩矫矶矾矿砀码砖砗砚砜砺砻砾础硁硅硕硖硗硙硚确硷碍碛碜碱碹磙礼祎祢祯祷祸禀禄禅离秃秆种积称秽秾稆税稣稳穑穷窃窍窑窜窝窥窦窭竖竞笃笋笔笕笺笼笾筑筚筛筜筝筹签简箓箦箧箨箩箪箫篑篓篮篱簖籁籴类籼粜粝粤粪粮糁糇紧絷纟纠纡红纣纤纥约级纨纩纪纫纬纭纮纯纰纱纲纳纴纵纶纷纸纹纺纻纼纽纾线绀绁绂练组绅细织终绉绊绋绌绍绎经绐绑绒结绔绕绖绗绘给绚绛络绝绞统绠绡绢绣绤绥绦继绨绩绪绫绬续绮绯绰绱绲绳维绵绶绷绸绹绺绻综绽绾绿缀缁缂缃缄缅缆缇缈缉缊缋缌缍缎缏缐缑缒缓缔缕编缗缘缙缚缛缜缝缞缟缠缡缢缣缤缥缦缧缨缩缪缫缬缭缮缯缰缱缲缳缴缵罂网罗罚罢罴羁羟羡翘翙翚耢耧耸耻聂聋职聍联聩聪肃肠肤肷肾肿胀胁胆胜胧胨胪胫胶脉脍脏脐脑脓脔脚脱脶脸腊腌腘腭腻腼腽腾膑臜舆舣舰舱舻艰艳艹艺节芈芗芜芦苁苇苈苋苌苍苎苏苘苹茎茏茑茔茕茧荆荐荙荚荛荜荞荟荠荡荣荤荥荦荧荨荩荪荫荬荭荮药莅莜莱莲莳莴莶获莸莹莺莼萚萝萤营萦萧萨葱蒇蒉蒋蒌蓝蓟蓠蓣蓥蓦蔷蔹蔺蔼蕲蕴薮藁藓虏虑虚虫虬虮虽虾虿蚀蚁蚂蚕蚝蚬蛊蛎蛏蛮蛰蛱蛲蛳蛴蜕蜗蜡蝇蝈蝉蝎蝼蝾螀螨蟏衅衔补衬衮袄袅袆袜袭袯装裆裈裢裣裤裥褛褴襁襕见观觃规觅视觇览觉觊觋觌觍觎觏觐觑觞触觯詟誉誊讠计订讣认讥讦讧讨让讪讫训议讯记讱讲讳讴讵讶讷许讹论讻讼讽设访诀证诂诃评诅识诇诈诉诊诋诌词诎诏诐译诒诓诔试诖诗诘诙诚诛诜话诞诟诠诡询诣诤该详诧诨诩诪诫诬语诮误诰诱诲诳说诵诶请诸诹诺读诼诽课诿谀谁谂调谄谅谆谇谈谊谋谌谍谎谏谐谑谒谓谔谕谖谗谘谙谚谛谜谝谞谟谠谡谢谣谤谥谦谧谨谩谪谫谬谭谮谯谰谱谲谳谴谵谶谷豮贝贞负贠贡财责贤败账货质贩贪贫贬购贮贯贰贱贲贳贴贵贶贷贸费贺贻贼贽贾贿赀赁赂赃资赅赆赇赈赉赊赋赌赍赎赏赐赑赒赓赔赕赖赗赘赙赚赛赜赝赞赟赠赡赢赣赪赵赶趋趱趸跃跄跖跞践跶跷跸跹跻踊踌踪踬踯蹑蹒蹰蹿躏躜躯车轧轨轩轪轫转轭轮软轰轱轲轳轴轵轶轷轸轹轺轻轼载轾轿辀辁辂较辄辅辆辇辈辉辊辋辌辍辎辏辐辑辒输辔辕辖辗辘辙辚辞辩辫边辽达迁过迈运还这进远违连迟迩迳迹适选逊递逦逻遗遥邓邝邬邮邹邺邻郁郄郏郐郑郓郦郧郸酝酦酱酽酾酿释里鉅鉴銮錾钆钇针钉钊钋钌钍钎钏钐钑钒钓钔钕钖钗钘钙钚钛钝钞钟钠钡钢钣钤钥钦钧钨钩钪钫钬钭钮钯钰钱钲钳钴钵钶钷钸钹钺钻钼钽钾钿铀铁铂铃铄铅铆铈铉铊铋铍铎铏铐铑铒铕铗铘铙铚铛铜铝铞铟铠铡铢铣铤铥铦铧铨铪铫铬铭铮铯铰铱铲铳铴铵银铷铸铹铺铻铼铽链铿销锁锂锃锄锅锆锇锈锉锊锋锌锍锎锏锐锑锒锓锔锕锖锗错锚锜锞锟锠锡锢锣锤锥锦锨锩锫锬锭键锯锰锱锲锳锴锵锶锷锸锹锺锻锼锽锾锿镀镁镂镃镆镇镈镉镊镌镍镎镏镐镑镒镕镖镗镙镚镛镜镝镞镟镠镡镢镣镤镥镦镧镨镩镪镫镬镭镮镯镰镱镲镳镴镶长门闩闪闫闬闭问闯闰闱闲闳间闵闶闷闸闹闺闻闼闽闾闿阀阁阂阃阄阅阆阇阈阉阊阋阌阍阎阏阐阑阒阓阔阕阖阗阘阙阚阛队阳阴阵阶际陆陇陈陉陕陧陨险随隐隶隽难雏雠雳雾霁霉霭靓静靥鞑鞒鞯鞴韦韧韨韩韪韫韬韵页顶顷顸项顺须顼顽顾顿颀颁颂颃预颅领颇颈颉颊颋颌颍颎颏颐频颒颓颔颕颖颗题颙颚颛颜额颞颟颠颡颢颣颤颥颦颧风飏飐飑飒飓飔飕飖飗飘飙飚飞飨餍饤饥饦饧饨饩饪饫饬饭饮饯饰饱饲饳饴饵饶饷饸饹饺饻饼饽饾饿馀馁馂馃馄馅馆馇馈馉馊馋馌馍馎馏馐馑馒馓馔馕马驭驮驯驰驱驲驳驴驵驶驷驸驹驺驻驼驽驾驿骀骁骂骃骄骅骆骇骈骉骊骋验骍骎骏骐骑骒骓骔骕骖骗骘骙骚骛骜骝骞骟骠骡骢骣骤骥骦骧髅髋髌鬓魇魉鱼鱽鱾鱿鲀鲁鲂鲄鲅鲆鲇鲈鲉鲊鲋鲌鲍鲎鲏鲐鲑鲒鲓鲔鲕鲖鲗鲘鲙鲚鲛鲜鲝鲞鲟鲠鲡鲢鲣鲤鲥鲦鲧鲨鲩鲪鲫鲬鲭鲮鲯鲰鲱鲲鲳鲴鲵鲶鲷鲸鲹鲺鲻鲼鲽鲾鲿鳀鳁鳂鳃鳄鳅鳆鳇鳈鳉鳊鳋鳌鳍鳎鳏鳐鳑鳒鳓鳔鳕鳖鳗鳘鳙鳛鳜鳝鳞鳟鳠鳡鳢鳣鸟鸠鸡鸢鸣鸤鸥鸦鸧鸨鸩鸪鸫鸬鸭鸮鸯鸰鸱鸲鸳鸴鸵鸶鸷鸸鸹鸺鸻鸼鸽鸾鸿鹀鹁鹂鹃鹄鹅鹆鹇鹈鹉鹊鹋鹌鹍鹎鹏鹐鹑鹒鹓鹔鹕鹖鹗鹘鹚鹛鹜鹝鹞鹟鹠鹡鹢鹣鹤鹥鹦鹧鹨鹩鹪鹫鹬鹭鹯鹰鹱鹲鹳鹴鹾麦麸黄黉黡黩黪黾龙历志制一台皋准复猛钟注范签' + } + + function FTPYStr() { + return '萬與醜專業叢東絲丟兩嚴喪個爿豐臨為麗舉麼義烏樂喬習鄉書買亂爭於虧雲亙亞產畝親褻嚲億僅從侖倉儀們價眾優夥會傴傘偉傳傷倀倫傖偽佇體餘傭僉俠侶僥偵側僑儈儕儂俁儔儼倆儷儉債傾傯僂僨償儻儐儲儺兒兌兗黨蘭關興茲養獸囅內岡冊寫軍農塚馮衝決況凍淨淒涼淩減湊凜幾鳳鳧憑凱擊氹鑿芻劃劉則剛創刪別剗剄劊劌剴劑剮劍剝劇勸辦務勱動勵勁勞勢勳猛勩勻匭匱區醫華協單賣盧鹵臥衛卻巹廠廳曆厲壓厭厙廁廂厴廈廚廄廝縣參靉靆雙發變敘疊葉號歎嘰籲後嚇呂嗎唚噸聽啟吳嘸囈嘔嚦唄員咼嗆嗚詠哢嚨嚀噝吒噅鹹呱響啞噠嘵嗶噦嘩噲嚌噥喲嘜嗊嘮啢嗩唕喚呼嘖嗇囀齧囉嘽嘯噴嘍嚳囁嗬噯噓嚶囑嚕劈囂謔團園囪圍圇國圖圓聖壙場阪壞塊堅壇壢壩塢墳墜壟壟壚壘墾坰堊墊埡墶壋塏堖塒塤堝墊垵塹墮壪牆壯聲殼壺壼處備複夠頭誇夾奪奩奐奮獎奧妝婦媽嫵嫗媯姍薑婁婭嬈嬌孌娛媧嫻嫿嬰嬋嬸媼嬡嬪嬙嬤孫學孿寧寶實寵審憲宮寬賓寢對尋導壽將爾塵堯尷屍盡層屭屜屆屬屢屨嶼歲豈嶇崗峴嶴嵐島嶺嶽崠巋嶨嶧峽嶢嶠崢巒嶗崍嶮嶄嶸嶔崳嶁脊巔鞏巰幣帥師幃帳簾幟帶幀幫幬幘幗冪襆幹並廣莊慶廬廡庫應廟龐廢廎廩開異棄張彌弳彎彈強歸當錄彠彥徹徑徠禦憶懺憂愾懷態慫憮慪悵愴憐總懟懌戀懇惡慟懨愷惻惱惲悅愨懸慳憫驚懼慘懲憊愜慚憚慣湣慍憤憒願懾憖怵懣懶懍戇戔戲戧戰戩戶紮撲扡執擴捫掃揚擾撫拋摶摳掄搶護報擔擬攏揀擁攔擰撥擇掛摯攣掗撾撻挾撓擋撟掙擠揮撏撈損撿換搗據撚擄摑擲撣摻摜摣攬撳攙擱摟攪攜攝攄擺搖擯攤攖撐攆擷擼攛擻攢敵斂數齋斕鬥斬斷無舊時曠暘曇晝曨顯晉曬曉曄暈暉暫曖劄術樸機殺雜權條來楊榪傑極構樅樞棗櫪梘棖槍楓梟櫃檸檉梔柵標棧櫛櫳棟櫨櫟欄樹棲樣欒棬椏橈楨檔榿橋樺檜槳樁夢檮棶檢欞槨櫝槧欏橢樓欖櫬櫚櫸檟檻檳櫧橫檣櫻櫫櫥櫓櫞簷檁歡歟歐殲歿殤殘殞殮殫殯毆毀轂畢斃氈毿氌氣氫氬氳彙漢汙湯洶遝溝沒灃漚瀝淪滄渢溈滬濔濘淚澩瀧瀘濼瀉潑澤涇潔灑窪浹淺漿澆湞溮濁測澮濟瀏滻渾滸濃潯濜塗湧濤澇淶漣潿渦溳渙滌潤澗漲澀澱淵淥漬瀆漸澠漁瀋滲溫遊灣濕潰濺漵漊潷滾滯灩灄滿瀅濾濫灤濱灘澦濫瀠瀟瀲濰潛瀦瀾瀨瀕灝滅燈靈災燦煬爐燉煒熗點煉熾爍爛烴燭煙煩燒燁燴燙燼熱煥燜燾煆糊溜愛爺牘犛牽犧犢強狀獷獁猶狽麅獮獰獨狹獅獪猙獄猻獫獵獼玀豬貓蝟獻獺璣璵瑒瑪瑋環現瑲璽瑉玨琺瓏璫琿璡璉瑣瓊瑤璦璿瓔瓚甕甌電畫暢佘疇癤療瘧癘瘍鬁瘡瘋皰屙癰痙癢瘂癆瘓癇癡癉瘮瘞瘺癟癱癮癭癩癬癲臒皚皺皸盞鹽監蓋盜盤瞘眥矓著睜睞瞼瞞矚矯磯礬礦碭碼磚硨硯碸礪礱礫礎硜矽碩硤磽磑礄確鹼礙磧磣堿镟滾禮禕禰禎禱禍稟祿禪離禿稈種積稱穢穠穭稅穌穩穡窮竊竅窯竄窩窺竇窶豎競篤筍筆筧箋籠籩築篳篩簹箏籌簽簡籙簀篋籜籮簞簫簣簍籃籬籪籟糴類秈糶糲粵糞糧糝餱緊縶糸糾紆紅紂纖紇約級紈纊紀紉緯紜紘純紕紗綱納紝縱綸紛紙紋紡紵紖紐紓線紺絏紱練組紳細織終縐絆紼絀紹繹經紿綁絨結絝繞絰絎繪給絢絳絡絕絞統綆綃絹繡綌綏絛繼綈績緒綾緓續綺緋綽緔緄繩維綿綬繃綢綯綹綣綜綻綰綠綴緇緙緗緘緬纜緹緲緝縕繢緦綞緞緶線緱縋緩締縷編緡緣縉縛縟縝縫縗縞纏縭縊縑繽縹縵縲纓縮繆繅纈繚繕繒韁繾繰繯繳纘罌網羅罰罷羆羈羥羨翹翽翬耮耬聳恥聶聾職聹聯聵聰肅腸膚膁腎腫脹脅膽勝朧腖臚脛膠脈膾髒臍腦膿臠腳脫腡臉臘醃膕齶膩靦膃騰臏臢輿艤艦艙艫艱豔艸藝節羋薌蕪蘆蓯葦藶莧萇蒼苧蘇檾蘋莖蘢蔦塋煢繭荊薦薘莢蕘蓽蕎薈薺蕩榮葷滎犖熒蕁藎蓀蔭蕒葒葤藥蒞蓧萊蓮蒔萵薟獲蕕瑩鶯蓴蘀蘿螢營縈蕭薩蔥蕆蕢蔣蔞藍薊蘺蕷鎣驀薔蘞藺藹蘄蘊藪槁蘚虜慮虛蟲虯蟣雖蝦蠆蝕蟻螞蠶蠔蜆蠱蠣蟶蠻蟄蛺蟯螄蠐蛻蝸蠟蠅蟈蟬蠍螻蠑螿蟎蠨釁銜補襯袞襖嫋褘襪襲襏裝襠褌褳襝褲襇褸襤繈襴見觀覎規覓視覘覽覺覬覡覿覥覦覯覲覷觴觸觶讋譽謄訁計訂訃認譏訐訌討讓訕訖訓議訊記訒講諱謳詎訝訥許訛論訩訟諷設訪訣證詁訶評詛識詗詐訴診詆謅詞詘詔詖譯詒誆誄試詿詩詰詼誠誅詵話誕詬詮詭詢詣諍該詳詫諢詡譸誡誣語誚誤誥誘誨誑說誦誒請諸諏諾讀諑誹課諉諛誰諗調諂諒諄誶談誼謀諶諜謊諫諧謔謁謂諤諭諼讒諮諳諺諦謎諞諝謨讜謖謝謠謗諡謙謐謹謾謫譾謬譚譖譙讕譜譎讞譴譫讖穀豶貝貞負貟貢財責賢敗賬貨質販貪貧貶購貯貫貳賤賁貰貼貴貺貸貿費賀貽賊贄賈賄貲賃賂贓資賅贐賕賑賚賒賦賭齎贖賞賜贔賙賡賠賧賴賵贅賻賺賽賾贗讚贇贈贍贏贛赬趙趕趨趲躉躍蹌蹠躒踐躂蹺蹕躚躋踴躊蹤躓躑躡蹣躕躥躪躦軀車軋軌軒軑軔轉軛輪軟轟軲軻轤軸軹軼軤軫轢軺輕軾載輊轎輈輇輅較輒輔輛輦輩輝輥輞輬輟輜輳輻輯轀輸轡轅轄輾轆轍轔辭辯辮邊遼達遷過邁運還這進遠違連遲邇逕跡適選遜遞邐邏遺遙鄧鄺鄔郵鄒鄴鄰鬱郤郟鄶鄭鄆酈鄖鄲醞醱醬釅釃釀釋裏钜鑒鑾鏨釓釔針釘釗釙釕釷釺釧釤鈒釩釣鍆釹鍚釵鈃鈣鈈鈦鈍鈔鍾鈉鋇鋼鈑鈐鑰欽鈞鎢鉤鈧鈁鈥鈄鈕鈀鈺錢鉦鉗鈷缽鈳鉕鈽鈸鉞鑽鉬鉭鉀鈿鈾鐵鉑鈴鑠鉛鉚鈰鉉鉈鉍鈹鐸鉶銬銠鉺銪鋏鋣鐃銍鐺銅鋁銱銦鎧鍘銖銑鋌銩銛鏵銓鉿銚鉻銘錚銫鉸銥鏟銃鐋銨銀銣鑄鐒鋪鋙錸鋱鏈鏗銷鎖鋰鋥鋤鍋鋯鋨鏽銼鋝鋒鋅鋶鐦鐧銳銻鋃鋟鋦錒錆鍺錯錨錡錁錕錩錫錮鑼錘錐錦鍁錈錇錟錠鍵鋸錳錙鍥鍈鍇鏘鍶鍔鍤鍬鍾鍛鎪鍠鍰鎄鍍鎂鏤鎡鏌鎮鎛鎘鑷鐫鎳鎿鎦鎬鎊鎰鎔鏢鏜鏍鏰鏞鏡鏑鏃鏇鏐鐔钁鐐鏷鑥鐓鑭鐠鑹鏹鐙鑊鐳鐶鐲鐮鐿鑔鑣鑞鑲長門閂閃閆閈閉問闖閏闈閑閎間閔閌悶閘鬧閨聞闥閩閭闓閥閣閡閫鬮閱閬闍閾閹閶鬩閿閽閻閼闡闌闃闠闊闋闔闐闒闕闞闤隊陽陰陣階際陸隴陳陘陝隉隕險隨隱隸雋難雛讎靂霧霽黴靄靚靜靨韃鞽韉韝韋韌韍韓韙韞韜韻頁頂頃頇項順須頊頑顧頓頎頒頌頏預顱領頗頸頡頰頲頜潁熲頦頤頻頮頹頷頴穎顆題顒顎顓顏額顳顢顛顙顥纇顫顬顰顴風颺颭颮颯颶颸颼颻飀飄飆飆飛饗饜飣饑飥餳飩餼飪飫飭飯飲餞飾飽飼飿飴餌饒餉餄餎餃餏餅餑餖餓餘餒餕餜餛餡館餷饋餶餿饞饁饃餺餾饈饉饅饊饌饢馬馭馱馴馳驅馹駁驢駔駛駟駙駒騶駐駝駑駕驛駘驍罵駰驕驊駱駭駢驫驪騁驗騂駸駿騏騎騍騅騌驌驂騙騭騤騷騖驁騮騫騸驃騾驄驏驟驥驦驤髏髖髕鬢魘魎魚魛魢魷魨魯魴魺鮁鮃鯰鱸鮋鮓鮒鮊鮑鱟鮍鮐鮭鮚鮳鮪鮞鮦鰂鮜鱠鱭鮫鮮鮺鯗鱘鯁鱺鰱鰹鯉鰣鰷鯀鯊鯇鮶鯽鯒鯖鯪鯕鯫鯡鯤鯧鯝鯢鯰鯛鯨鯵鯴鯔鱝鰈鰏鱨鯷鰮鰃鰓鱷鰍鰒鰉鰁鱂鯿鰠鼇鰭鰨鰥鰩鰟鰜鰳鰾鱈鱉鰻鰵鱅鰼鱖鱔鱗鱒鱯鱤鱧鱣鳥鳩雞鳶鳴鳲鷗鴉鶬鴇鴆鴣鶇鸕鴨鴞鴦鴒鴟鴝鴛鴬鴕鷥鷙鴯鴰鵂鴴鵃鴿鸞鴻鵐鵓鸝鵑鵠鵝鵒鷳鵜鵡鵲鶓鵪鶤鵯鵬鵮鶉鶊鵷鷫鶘鶡鶚鶻鶿鶥鶩鷊鷂鶲鶹鶺鷁鶼鶴鷖鸚鷓鷚鷯鷦鷲鷸鷺鸇鷹鸌鸏鸛鸘鹺麥麩黃黌黶黷黲黽龍歷誌製壹臺臯準復勐鐘註範籤' + } + + function Traditionalized(cc) { + let str = '' + const ss = JTPYStr() + const tt = FTPYStr() + for (let i = 0; i < cc.length; i++) { + if (cc.charCodeAt(i) > 10000 && ss.indexOf(cc.charAt(i)) !== -1) { + str += tt.charAt(ss.indexOf(cc.charAt(i))) + } else str += cc.charAt(i) + } + return str + } + + function Simplized(cc) { + let str = '' + const ss = JTPYStr() + const tt = FTPYStr() + for (let i = 0; i < cc.length; i++) { + if (cc.charCodeAt(i) > 10000 && tt.indexOf(cc.charAt(i)) !== -1) { + str += ss.charAt(tt.indexOf(cc.charAt(i))) + } else str += cc.charAt(i) + } + return str + } + + function translateInitialization() { + translateButtonObject = document.getElementById('menu-translate') + if (translateButtonObject) { + if (currentEncoding !== targetEncoding) { + translateButtonObject.lastChild.textContent = targetEncoding === 1 ? msgToSimplifiedChinese : msgToTraditionalChinese + translateButtonObject.firstChild.className = targetEncoding === 1 ? 'solitude st-jianben-line' : 'solitude st-panben-line' + setLang() + setTimeout(translateBody, translateDelay) + } + translateButtonObject.addEventListener('click', translatePage, false) + } + } + + translateInitialization() + document.addEventListener('pjax:complete', () => { + translateInitialization() + }) +}) \ No newline at end of file diff --git a/themes/solitude/source/js/utils.js b/themes/solitude/source/js/utils.js new file mode 100644 index 0000000..7b088b4 --- /dev/null +++ b/themes/solitude/source/js/utils.js @@ -0,0 +1,208 @@ +(() => { + const utilsFn = { + throttle: (func, wait, {leading = true, trailing = true} = {}) => { + let timeout, previous = 0; + const later = (context, args) => { + timeout = previous = leading === false ? 0 : Date.now(); + func.apply(context, args); + }; + return function () { + const now = Date.now(); + if (!previous && leading === false) previous = now; + const remaining = wait - (now - previous); + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + later(this, arguments); + } else if (!timeout && trailing !== false) { + timeout = setTimeout(() => later(this, arguments), remaining); + } + }; + }, + fadeIn: (ele, time) => ele.style.cssText = `display:block;animation: to_show ${time}s`, + fadeOut: (ele, time) => { + const resetStyles = () => { + ele.style.cssText = "display: none; animation: '' "; + ele.removeEventListener('animationend', resetStyles); + }; + ele.addEventListener('animationend', resetStyles); + ele.style.animation = `to_hide ${time}s`; + }, + sidebarPaddingR: () => { + const paddingRight = window.innerWidth - document.body.clientWidth; + if (paddingRight > 0) { + document.body.style.paddingRight = `${paddingRight}px`; + } + }, + snackbarShow: (text, showAction = false, duration = 5000) => { + document.styleSheets[0].addRule(':root', `--efu-snackbar-time:${duration}ms!important`); + Snackbar.show({ + text, + showAction, + duration, + pos: 'top-center' + }); + }, + copy: async (text) => { + const message = await navigator.clipboard.writeText(text) + .then(() => GLOBAL_CONFIG.lang.copy.success) + .catch(() => GLOBAL_CONFIG.lang.copy.error); + utils.snackbarShow(message, false, 2000); + }, + getEleTop: ele => { + let actualTop = ele.offsetTop; + while (ele.offsetParent) { + ele = ele.offsetParent; + actualTop += ele.offsetTop; + } + return actualTop; + }, + siblings: (ele, selector) => { + return [...ele.parentNode.children].filter((child) => { + if (selector) { + return child !== ele && child.matches(selector) + } + return child !== ele + }) + }, + randomNum: (length) => { + return Math.floor(Math.random() * length) + }, + timeDiff: (timeObj, today) => { + const timeDiff = today.getTime() - timeObj.getTime(); + return Math.floor(timeDiff / (1000 * 3600 * 24)); + }, + scrollToDest: (pos, time = 500) => { + const currentPos = window.pageYOffset; + const isNavFixed = document.getElementById('page-header').classList.contains('nav-fixed'); + pos = currentPos > pos || isNavFixed ? pos - 70 : pos; + + if ('scrollBehavior' in document.documentElement.style) { + window.scrollTo({top: pos, behavior: 'smooth'}); + return; + } + + const distance = pos - currentPos; + const step = currentTime => { + const start = start || currentTime; + const progress = currentTime - start; + + if (progress < time) { + window.scrollTo(0, currentPos + distance * progress / time); + window.requestAnimationFrame(step); + } else { + window.scrollTo(0, pos); + } + }; + + window.requestAnimationFrame(step); + }, + isMobile: () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent), + isHidden: e => 0 === e.offsetHeight && 0 === e.offsetWidth, + addEventListenerPjax: (ele, event, fn, option = false) => { + ele.addEventListener(event, fn, option) + utils.addGlobalFn('pjax', () => { + ele.removeEventListener(event, fn, option) + }) + }, + animateIn: (ele, text) => { + Object.assign(ele.style, {display: 'block', animation: text}); + }, + animateOut: (ele, text) => { + const resetAnimation = () => { + ele.style.display = ''; + ele.style.animation = ''; + ele.removeEventListener('animationend', resetAnimation); + }; + ele.addEventListener('animationend', resetAnimation); + ele.style.animation = text; + }, + wrap: (selector, eleType, options) => { + const createEle = document.createElement(eleType) + for (const [key, value] of Object.entries(options)) { + createEle.setAttribute(key, value) + } + selector.parentNode.insertBefore(createEle, selector) + createEle.appendChild(selector) + }, + lazyloadImg: () => { + window.lazyLoadInstance = new LazyLoad({ + elements_selector: 'img', + threshold: 0, + data_src: 'lazy-src', + callback_error: img => img.src = GLOBAL_CONFIG.lazyload.error + }); + }, + lightbox: function (selector) { + const lightboxType = GLOBAL_CONFIG.lightbox; + const options = { + class: 'fancybox', + 'data-fancybox': 'gallery', + }; + + if (lightboxType === 'mediumZoom') { + mediumZoom && mediumZoom(selector, {background: "var(--efu-card-bg)"}); + } else if (lightboxType === 'fancybox') { + selector.forEach(i => { + if (i.parentNode.tagName !== 'A') { + options.href = options['data-thumb'] = i.dataset.lazySrc || i.src; + options['data-caption'] = i.title || i.alt || ''; + utils.wrap(i, 'a', options); + } + }); + + if (!window.fancyboxRun) { + Fancybox.bind('[data-fancybox]', { + Hash: false, + animated: true, + Thumbs: {showOnStart: false}, + Images: {Panzoom: {maxScale: 4}}, + Carousel: {transition: 'slide'}, + Toolbar: { + display: { + left: ['infobar'], + middle: ['zoomIn', 'zoomOut', 'toggle1to1', 'rotateCCW', 'rotateCW', 'flipX', 'flipY'], + right: ['slideshow', 'thumbs', 'close'] + } + }, + }); + window.fancyboxRun = true; + } + } + }, + diffDate: (d, more = false) => { + const dateNow = new Date(); + const datePost = new Date(d); + const dateDiff = dateNow - datePost; + const minute = 60000; + const hour = 3600000; + const day = 86400000; + const month = 2592000000; + const {time} = GLOBAL_CONFIG.lang; + const dayCount = Math.floor(dateDiff / day) + if (!more) return dayCount + const minuteCount = Math.floor(dateDiff / minute) + const hourCount = Math.floor(dateDiff / hour) + const monthCount = Math.floor(dateDiff / month) + if (monthCount > 12) return datePost.toISOString().slice(0, 10) + if (monthCount >= 1) return `${monthCount} ${time.month}` + if (dayCount >= 1) return `${dayCount} ${time.day}` + if (hourCount >= 1) return `${hourCount} ${time.hour}` + if (minuteCount >= 1) return `${minuteCount} ${time.min}` + return time.just + }, + loadComment: (dom, callback) => { + const observerItem = 'IntersectionObserver' in window ? new IntersectionObserver((entries) => { + if (entries[0].isIntersecting) { + callback(); + observerItem.disconnect(); + } + }, {threshold: [0]}) : null; + + observerItem ? observerItem.observe(dom) : callback(); + }, + } + window.utils = {...window.utils, ...utilsFn}; +})() \ No newline at end of file