添加忽略文件

This commit is contained in:
liuzhihang 2022-10-09 22:29:05 +08:00
parent 7d523d7955
commit eb7501de6b
42 changed files with 18090 additions and 0 deletions

22
HELP.md Normal file
View File

@ -0,0 +1,22 @@
## 本地环境搭建
### 部署 Halo2.0
[使用 Docker 部署](https://docs.halo.run/2.0.0-SNAPSHOT/getting-started/install/docker)
参考相关文档,在本地部署 Halo2.0,主题目录在 `~/halo-next` 下。
本地启动需要添加配置 `-e SPRING_THYMELEAF_CACHE=FALSE` 这样可以关闭缓存,就可以实时刷新主题了。
`-e SPRING_PROFILES_ACTIVE=dev` 则可以打开 swagger-ui。
### 下载主题
下载[halo-theme-hao](https://github.com/liuzhihang/halo-theme-hao)主题,并压缩为 zip 包,然后在 halo console 控制台上传主题,此时可以在
halo 的主题路径下看到刚才上传的主题。
> 路径为
> ~/halo-next/theme

25
README.md Normal file
View File

@ -0,0 +1,25 @@
# Halo Theme Ha
---
> 如果大家喜欢这个主题,请多多 star 和 fork。你的 star 和支持就是我的动力
> If you like this theme. Please star or fork.
> Halo-Theme-Ha 移植于 Hexo 社区 [Hexo-Theme-Butterfly](https://github.com/jerryc127/hexo-theme-butterfly)
> ,同时参考了 [Heo](https://blog.zhheo.com/) 的魔改
## 说明
## 预览
## 支持的功能
- [x] 适配 Halo 最新 2.0 版本
## 更新日志
- 2022-10-05 发布
## 安装
## 支持

131
TODO.md Normal file
View File

@ -0,0 +1,131 @@
### 全站
- [ ] 自定义字体
- [ ] 自定义背景图
- [ ] 响应式主题
- [ ] 自定义社交渠道
- [ ] 页面加载条
- [ ] RSS 订阅
- [ ] 页面元数据控制 百度收录查询 + 主动推送
- [ ] 谷歌分析收录
- [ ] 全站 Pjax
- [ ] 多主题风格设置 (支持夜间模式)
- [ ] 开发者模式提示
- [ ] 复制等操作提示
### 菜单栏
- [ ] 相关链接
- [ ] Home 主页
- [ ] 多级菜单
- [ ] 随机文章
- [ ] 随机友链
- [ ] 文章搜索
- [ ] 控制台
- [ ] 滚动条百分比
### 首页
- [ ] 随机文章(背景图设置)
- [ ] 固定文章
- [ ] 推荐文章
### 导航栏
- [ ] 自定义导航目录
### 文章列表
- [ ] 自定义单栏、双栏、三栏
- [ ] 封面图缺省随机
- [ ] 文章简介控制
- [ ] 自定义分页
### 侧边栏
- [ ] 侧栏控制,左右及隐藏
#### 自我介绍
- [ ] 自定义欢迎标题
- [ ] 自定义名称
- [ ] 自定义介绍内容
- [ ] 自定义跳转
- [ ] 自定义社交渠道 < 2
#### 推广
- [ ] 公众号图配置
#### 标签
- [ ] 标签列表
- [ ] 自定义标签突出
#### 归档
- [ ] 自定义归档 (列表、日历)
#### 最近评论
#### 分类
#### 广告
#### 站点信息
- [ ] 文章总数
- [ ] 建站天数
- [ ] 全站字数
- [ ] 访问统计
#### 目录
- [ ] 目录跳转 (仅文章页面)
- [ ] 多级目录
#### 最近文章
- [ ] 自定义最近文章
### 底部
- [ ] 社交链接展示
- [ ] 自定义相关链接
- [ ] 版权信息设置
- [ ] 随机友链
### 文章页面
- [ ] 字数、阅读时长、时间、访问量、留言数等信息展示
- [ ] 标签、目录展示
- [ ] 自定义过期提示
- [ ] 自定义代码高亮
- [ ] 代码高亮 + 行号 + 复制 + 折叠
- [ ] 文章分享 AddThis/Sharejs/Addtoany
- [ ] 二维码打赏
- [ ] 文章页复制版权
- [ ] 阅读模式
- [ ] Mathjax 和 Katex
- [ ] 自定义文章开头、结尾
- [ ] 自定义相关文章推荐
- [ ] 上一篇下一篇文章展示
### 评论模块
- [ ] UI 设置
### 右键菜单
- [ ] 自定义右键菜单
### 页面
- [ ] 隐私协议
- [ ] 版权协议
- [ ] Cookies
- [ ] 友链
- [ ] 日志
- [ ] 相册
- [ ] 标签页
- [ ] 分类页

6
package.json Normal file
View File

@ -0,0 +1,6 @@
{
"name": "halo-theme-hao",
"version": "1.0.0",
"dependencies": {
}
}

41
pom.xml Normal file
View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.liuzhihang</groupId>
<artifactId>halo-theme-hao</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>halo-theme-hao</name>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

239
settings.yaml Normal file
View File

@ -0,0 +1,239 @@
apiVersion: v1alpha1
kind: Setting
metadata:
name: theme-hao-setting
spec:
forms:
- group: layout
label: 布局
formSchema:
- $formkit: select
name: post_list_layout
label: 文章列表布局
value: grid_3
options:
- label: 网格(一行三列)
value: grid_3
- label: 网格(一行两列)
value: grid_2
- label: 单条
value: single
help: "选择单条时,文章卡片的图片将位于左侧"
- $formkit: select
name: header_widget
label: 首页顶部模块
value: none
options:
- label:
value: none
- label: 最新一篇文章
value: latest_post
- label: 文章网格(最新五篇文章)
value: latest_post_grid
- label: 轮播图
value: carousel
- label: 站点标题
value: site_title
- $formkit: select
name: header_background_type
label: 首页顶部背景
value: manual
options:
- label: 手动设置
value: manual
- label: 图片
value: image
- $formkit: text
name: header_background
label: 首页顶部背景
- $formkit: text
name: header_background_image
label: 首页顶部背景图片
- $formkit: radio
name: content_header
label: 文章页顶部
value: true
options:
- label: 显示
value: true
- label: 隐藏
value: false
- group: sidebar
label: 侧边栏
formSchema:
- $formkit: textarea
name: widgets
label: 小部件
value: "profile,popular-posts,latest-comments,categories,tags"
help: "目前提供的小部件有profile站点资料, popular-posts热门文章, latest-comments最新评论, categories文章分类, tags文章标签。你可以随意组合或排序以逗号隔开。"
- group: content
label: 内容设置
formSchema:
- $formkit: radio
name: enable_lightgallery
label: 图片放大
value: false
options:
- label: 开启
value: true
- label: 关闭
value: false
- $formkit: radio
name: enable_code_highlight
label: 代码块高亮
value: false
options:
- label: 开启
value: true
- label: 关闭
value: false
- $formkit: textarea
name: code_highlight_extra_languages
label: 代码块额外高亮语言
help: "默认已经包含php,diff,java,css,bash,json,perl,swift,plaintext,ruby,yaml,sql,vbnet,ini,scss,less,cpp,typescript,csharp,rust,python,python-repl,objectivec,r,shell,makefile,go,xml,markdown,lua,javascript,php-template,kotlin,c 如果需要添加其他语言,请按照相同格式添加。"
- $formkit: select
name: code_highlight_style
label: 代码块高亮主题
value: "default.min.css"
options:
- value: "a11y-dark.min.css"
label: "a11y-dark.min.css"
- value: "a11y-light.min.css"
label: "a11y-light.min.css"
- value: "agate.min.css"
label: "agate.min.css"
- value: "an-old-hope.min.css"
label: "an-old-hope.min.css"
- value: "androidstudio.min.css"
label: "androidstudio.min.css"
- value: "arduino-light.min.css"
label: "arduino-light.min.css"
- value: "arta.min.css"
label: "arta.min.css"
- value: "ascetic.min.css"
label: "ascetic.min.css"
- value: "atom-one-dark-reasonable.min.css"
label: "atom-one-dark-reasonable.min.css"
- value: "atom-one-dark.min.css"
label: "atom-one-dark.min.css"
- value: "atom-one-light.min.css"
label: "atom-one-light.min.css"
- value: "brown-paper.min.css"
label: "brown-paper.min.css"
- value: "codepen-embed.min.css"
label: "codepen-embed.min.css"
- value: "color-brewer.min.css"
label: "color-brewer.min.css"
- value: "dark.min.css"
label: "dark.min.css"
- value: "default.min.css"
label: "default.min.css"
- value: "devibeans.min.css"
label: "devibeans.min.css"
- value: "docco.min.css"
label: "docco.min.css"
- value: "far.min.css"
label: "far.min.css"
- value: "felipec.min.css"
label: "felipec.min.css"
- value: "foundation.min.css"
label: "foundation.min.css"
- value: "github-dark-dimmed.min.css"
label: "github-dark-dimmed.min.css"
- value: "github-dark.min.css"
label: "github-dark.min.css"
- value: "github.min.css"
label: "github.min.css"
- value: "gml.min.css"
label: "gml.min.css"
- value: "googlecode.min.css"
label: "googlecode.min.css"
- value: "gradient-dark.min.css"
label: "gradient-dark.min.css"
- value: "gradient-light.min.css"
label: "gradient-light.min.css"
- value: "grayscale.min.css"
label: "grayscale.min.css"
- value: "hybrid.min.css"
label: "hybrid.min.css"
- value: "idea.min.css"
label: "idea.min.css"
- value: "intellij-light.min.css"
label: "intellij-light.min.css"
- value: "ir-black.min.css"
label: "ir-black.min.css"
- value: "isbl-editor-dark.min.css"
label: "isbl-editor-dark.min.css"
- value: "isbl-editor-light.min.css"
label: "isbl-editor-light.min.css"
- value: "kimbie-dark.min.css"
label: "kimbie-dark.min.css"
- value: "kimbie-light.min.css"
label: "kimbie-light.min.css"
- value: "lightfair.min.css"
label: "lightfair.min.css"
- value: "lioshi.min.css"
label: "lioshi.min.css"
- value: "magula.min.css"
label: "magula.min.css"
- value: "mono-blue.min.css"
label: "mono-blue.min.css"
- value: "monokai-sublime.min.css"
label: "monokai-sublime.min.css"
- value: "monokai.min.css"
label: "monokai.min.css"
- value: "night-owl.min.css"
label: "night-owl.min.css"
- value: "nnfx-dark.min.css"
label: "nnfx-dark.min.css"
- value: "nnfx-light.min.css"
label: "nnfx-light.min.css"
- value: "nord.min.css"
label: "nord.min.css"
- value: "obsidian.min.css"
label: "obsidian.min.css"
- value: "paraiso-dark.min.css"
label: "paraiso-dark.min.css"
- value: "paraiso-light.min.css"
label: "paraiso-light.min.css"
- value: "pojoaque.min.css"
label: "pojoaque.min.css"
- value: "purebasic.min.css"
label: "purebasic.min.css"
- value: "qtcreator-dark.min.css"
label: "qtcreator-dark.min.css"
- value: "qtcreator-light.min.css"
label: "qtcreator-light.min.css"
- value: "rainbow.min.css"
label: "rainbow.min.css"
- value: "routeros.min.css"
label: "routeros.min.css"
- value: "school-book.min.css"
label: "school-book.min.css"
- value: "shades-of-purple.min.css"
label: "shades-of-purple.min.css"
- value: "srcery.min.css"
label: "srcery.min.css"
- value: "stackoverflow-dark.min.css"
label: "stackoverflow-dark.min.css"
- value: "stackoverflow-light.min.css"
label: "stackoverflow-light.min.css"
- value: "sunburst.min.css"
label: "sunburst.min.css"
- value: "tokyo-night-dark.min.css"
label: "tokyo-night-dark.min.css"
- value: "tokyo-night-light.min.css"
label: "tokyo-night-light.min.css"
- value: "tomorrow-night-blue.min.css"
label: "tomorrow-night-blue.min.css"
- value: "tomorrow-night-bright.min.css"
label: "tomorrow-night-bright.min.css"
- value: "vs.min.css"
label: "vs.min.css"
- value: "vs2015.min.css"
label: "vs2015.min.css"
- value: "xcode.min.css"
label: "xcode.min.css"
- value: "xt256.min.css"
label: "xt256.min.css"

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 B

125
templates/assets/js/heo.js Normal file
View File

@ -0,0 +1,125 @@
"use strict";
var heo_cookiesTime = null, heo_musicPlaying = !1, heo_keyboard = !0, heo = {
darkModeStatus: function () {
"light" == ("dark" === document.documentElement.getAttribute("data-theme") ? "dark" : "light") ? $(".menu-darkmode-text").text("深色模式") : $(".menu-darkmode-text").text("浅色模式")
}, changeTimeInEssay: function () {
document.querySelector("#bber") && document.querySelectorAll("#bber time").forEach(function (e) {
var t = e, o = t.getAttribute("datetime");
t.innerText = btf.diffDate(o, !0), t.style.display = "inline"
})
}, initIndexEssay: function () {
document.querySelector("#bber-talk") && new Swiper(".swiper-container", {
direction: "vertical", loop: !0, autoplay: {delay: 3e3, pauseOnMouseEnter: !0}
})
}, onlyHome: function () {
var e = window.location.pathname;
"/" == (e = decodeURIComponent(e)) ? $(".only-home").attr("style", "display: flex") : $(".only-home").attr("style", "display: none")
}, is_Post: function () {
return 0 <= window.location.href.indexOf("/p/")
}, addNavBackgroundInit: function () {
var e, t = 0, o = 0;
document.body && (t = document.body.scrollTop), document.documentElement && (o = document.documentElement.scrollTop), e = 0 < t - o ? t : o, console.log("滚动高度" + e), 0 != e && (document.getElementById("page-header").classList.add("nav-fixed"), document.getElementById("page-header").classList.add("nav-visible"), $("#cookies-window").hide(), console.log("已添加class"))
}, tagPageActive: function () {
var e = window.location.pathname, e = decodeURIComponent(e);
console.log(e);
var t, o, n = /\/tags\/.*?\//.test(e);
console.log(n), n && (t = e.split("/"), console.log(t[2]), o = t[2], document.querySelector("#tag-page-tags") && document.getElementById(o).classList.add("select"))
}, categoriesBarActive: function () {
document.querySelector("#category-bar") && $(".category-bar-item").removeClass("select");
var e, t = window.location.pathname, t = decodeURIComponent(t);
console.log(t), "/" == t ? document.querySelector("#category-bar") && document.getElementById("category-bar-home").classList.add("select") : /\/categories\/.*?\//.test(t) && (e = t.split("/")[2], document.querySelector("#category-bar") && document.getElementById(e).classList.add("select"))
}, addFriendLinksInFooter: function () {
fetch("https://moments.zhheo.com/randomfriend?num=3").then(function (e) {
return e.json()
}).then(function (e) {
for (var t = getArrayItems(e, 3), o = "", n = 0; n < t.length; ++n) {
var a = t[n];
o += "<a class='footer-item' href='".concat(a.link, '\' target="_blank" rel="noopener nofollow">').concat(a.name, "</a>")
}
o += "<a class='footer-item' href='/link/'>更多</a>", document.getElementById("friend-links-in-footer").innerHTML = o
})
}, stopImgRightDrag: function () {
$("img").on("dragstart", function () {
return !1
})
}, topPostScroll: function () {
var o;
document.getElementById("recent-post-top") && (o = document.getElementById("recent-post-top")).addEventListener("mousewheel", function (e) {
var t = -e.wheelDelta / 2;
o.scrollLeft += t, document.body.clientWidth < 1300 && e.preventDefault()
}, !1)
}, topCategoriesBarScroll: function () {
var o;
document.getElementById("category-bar-items") && (o = document.getElementById("category-bar-items")).addEventListener("mousewheel", function (e) {
var t = -e.wheelDelta / 2;
o.scrollLeft += t, e.preventDefault()
}, !1)
}, sayhi: function () {
document.querySelector("#author-info__sayhi") && (document.getElementById("author-info__sayhi").innerHTML = getTimeState() + "!我是")
}, addTag: function () {
document.querySelector(".heo-tag-new") && $(".heo-tag-new").append('<sup class="heo-tag heo-tag-new-view">N</sup>'), document.querySelector(".heo-tag-hot") && $(".heo-tag-hot").append('<sup class="heo-tag heo-tag-hot-view">H</sup>')
}, qrcodeCreate: function () {
document.getElementById("qrcode") && new QRCode(document.getElementById("qrcode"), {
text: window.location.href,
width: 250,
height: 250,
colorDark: "#000",
colorLight: "#ffffff",
correctLevel: QRCode.CorrectLevel.H
})
}, reflashEssayWaterFall: function () {
document.querySelector("#waterfall") && setTimeout(function () {
waterfall("#waterfall"), document.getElementById("waterfall").classList.add("show")
}, 500)
}, addMediumInEssay: function () {
document.querySelector("#waterfall") && mediumZoom(document.querySelectorAll("[data-zoomable]"))
}, downloadImage: function (e, c) {
rm.hideRightMenu(), 0 == rm.downloadimging ? (rm.downloadimging = !0, btf.snackbarShow("正在下载中,请稍后", !1, 1e4), setTimeout(function () {
var a = new Image;
a.setAttribute("crossOrigin", "anonymous"), a.onload = function () {
var e = document.createElement("canvas");
e.width = a.width, e.height = a.height, e.getContext("2d").drawImage(a, 0, 0, a.width, a.height);
var t = e.toDataURL("image/png"), o = document.createElement("a"), n = new MouseEvent("click");
o.download = c || "photo", o.href = t, o.dispatchEvent(n)
}, a.src = e, btf.snackbarShow("图片已添加盲水印,请遵守版权协议"), rm.downloadimging = !1
}, "10000")) : btf.snackbarShow("有正在进行中的下载,请稍后再试")
}, switchCommentBarrage: function () {
document.querySelector(".comment-barrage") && ($(".comment-barrage").is(":visible") ? ($(".comment-barrage").hide(), $(".menu-commentBarrage-text").text("显示热评"), document.querySelector("#consoleCommentBarrage").classList.remove("on"), localStorage.setItem("commentBarrageSwitch", "false")) : $(".comment-barrage").is(":hidden") && ($(".comment-barrage").show(), $(".menu-commentBarrage-text").text("关闭热评"), document.querySelector("#consoleCommentBarrage").classList.add("on"), localStorage.removeItem("commentBarrageSwitch"))), rm.hideRightMenu()
}, hidecookie: function () {
heo_cookiesTime = setTimeout(function () {
document.getElementById("cookies-window").classList.add("cw-hide"), setTimeout(function () {
$("#cookies-window").hide()
}, 1e3)
}, 3e3)
}, hideTodayCard: function () {
document.getElementById("todayCard") && document.getElementById("todayCard").classList.add("hide")
}, changeThemeColor: function (e) {
null !== document.querySelector('meta[name="theme-color"]') && document.querySelector('meta[name="theme-color"]').setAttribute("content", e)
}, initThemeColor: function () {
var e, t, o;
heo.is_Post() ? 0 === (window.scrollY || document.documentElement.scrollTop) ? (e = getComputedStyle(document.documentElement).getPropertyValue("--heo-main"), heo.changeThemeColor(e)) : (t = getComputedStyle(document.documentElement).getPropertyValue("--heo-background"), heo.changeThemeColor(t)) : (o = getComputedStyle(document.documentElement).getPropertyValue("--heo-background"), heo.changeThemeColor(o))
}, jumpTo: function (e) {
$(document).ready(function () {
$("html,body").animate({scrollTop: $(e).eq(i).offset().top}, 500)
})
}, showLoading: function () {
document.querySelector("#loading-box").classList.remove("loaded")
}, hideLoading: function () {
document.querySelector("#loading-box").classList.add("loaded")
}, musicToggle: function () {
heo_musicPlaying = heo_musicPlaying ? (document.querySelector("#nav-music").classList.remove("playing"), document.getElementById("menu-music-toggle").innerHTML = '<i class="fa-solid fa-play"></i><span>播放音乐</span>', document.getElementById("nav-music-hoverTips").innerHTML = "音乐已暂停", document.querySelector("#consoleMusic").classList.remove("on"), !1) : (document.querySelector("#nav-music").classList.add("playing"), document.getElementById("menu-music-toggle").innerHTML = '<i class="fa-solid fa-pause"></i><span>暂停音乐</span>', document.querySelector("#consoleMusic").classList.add("on"), !0), document.querySelector("meting-js").aplayer.toggle(), rm.hideRightMenu()
}, musicSkipBack: function () {
document.querySelector("meting-js").aplayer.skipBack(), rm.hideRightMenu()
}, musicSkipForward: function () {
document.querySelector("meting-js").aplayer.skipForward(), rm.hideRightMenu()
}, musicGetName: function () {
for (var e = $(".aplayer-title"), t = [], o = e.length - 1; 0 <= o; o--) t[o] = e[o].innerText;
return t[0]
}, showConsole: function () {
document.querySelector("#console").classList.add("show")
}, hideConsole: function () {
document.querySelector("#console").classList.remove("show")
}, keyboardToggle: function () {
heo_keyboard ? (heo_keyboard = !1, document.querySelector("#consoleKeyboard").classList.remove("on"), localStorage.setItem("keyboardToggle", "false")) : (heo_keyboard = !0, document.querySelector("#consoleKeyboard").classList.add("on"), localStorage.setItem("keyboardToggle", "true"))
}
};

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
"use strict";function _toConsumableArray(e){return _arrayWithoutHoles(e)||_iterableToArray(e)||_unsupportedIterableToArray(e)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(e,t){if(e){if("string"==typeof e)return _arrayLikeToArray(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(e,t):void 0}}function _iterableToArray(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function _arrayWithoutHoles(e){if(Array.isArray(e))return _arrayLikeToArray(e)}function _arrayLikeToArray(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var btf={debounce:function(r,o,i){var a;return function(){var e=this,t=arguments,n=i&&!a;clearTimeout(a),a=setTimeout(function(){a=null,i||r.apply(e,t)},o),n&&r.apply(e,t)}},throttle:function(n,r,o){var i,a,s,u=0;o=o||{};function l(){u=!1===o.leading?0:(new Date).getTime(),i=null,n.apply(a,s),i||(a=s=null)}return function(){var e=(new Date).getTime();u||!1!==o.leading||(u=e);var t=r-(e-u);a=this,s=arguments,t<=0||r<t?(i&&(clearTimeout(i),i=null),u=e,n.apply(a,s),i||(a=s=null)):i||!1===o.trailing||(i=setTimeout(l,t))}},sidebarPaddingR:function(){var e=window.innerWidth,t=document.body.clientWidth,n=e-t;e!==t&&(document.body.style.paddingRight=n+"px")},snackbarShow:function(e,t,n){var r=void 0!==t&&t,o=void 0!==n?n:5e3,i=GLOBAL_CONFIG.Snackbar.position,a="light"===document.documentElement.getAttribute("data-theme")?GLOBAL_CONFIG.Snackbar.bgLight:GLOBAL_CONFIG.Snackbar.bgDark;document.styleSheets[0].addRule(":root","--heo-snackbar-time:"+o+"ms!important"),Snackbar.show({text:e,backgroundColor:a,showAction:r,duration:o,pos:i})},initJustifiedGallery:function(e){e instanceof jQuery||(e=$(e)),e.each(function(e,t){$(this).is(":visible")&&$(this).justifiedGallery({rowHeight:220,margins:4})})},diffDate:function(e,t){var n,r,o,i=1<arguments.length&&void 0!==t&&t,a=new Date,s=new Date(e),u=a.getTime()-s.getTime();return i?(n=u/864e5,r=u/36e5,o=u/6e4,12<u/2592e6?s.toLocaleDateString():7<=n?s.toLocaleDateString().substr(5):1<=n?parseInt(n)+""+GLOBAL_CONFIG.date_suffix.day:1<=r||1<=o?"最近":GLOBAL_CONFIG.date_suffix.just):parseInt(u/864e5)},loadComment:function(e,t){var n;"IntersectionObserver"in window?(n=new IntersectionObserver(function(e){e[0].isIntersecting&&(t(),n.disconnect())},{threshold:[0]})).observe(e):t()},scrollToDest:function(o,i){var a,s;o<0||i<0||(a=window.scrollY||window.screenTop,o-=70,"CSS"in window&&CSS.supports("scroll-behavior","smooth")?window.scrollTo({top:o,behavior:"smooth"}):(s=null,i=i||500,window.requestAnimationFrame(function e(t){var n,r;s=s||t,a<o?(n=t-s,window.scrollTo(0,(o-a)*n/i+a),n<i?window.requestAnimationFrame(e):window.scrollTo(0,o)):(r=t-s,window.scrollTo(0,a-(a-o)*r/i),r<i?window.requestAnimationFrame(e):window.scrollTo(0,o))})))},fadeIn:function(e,t){e.style.cssText="display:block;animation: to_show ".concat(t,"s")},fadeOut:function(t,e){t.addEventListener("animationend",function e(){t.style.cssText="display: none; animation: '' ",t.removeEventListener("animationend",e)}),t.style.animation="to_hide ".concat(e,"s")},getParents:function(e,t){for(;e&&e!==document;e=e.parentNode)if(e.matches(t))return e;return null},siblings:function(t,n){return _toConsumableArray(t.parentNode.children).filter(function(e){return n?e!==t&&e.matches(n):e!==t})},wrap:function(e,t,n,r){var o=2<arguments.length&&void 0!==n?n:"",i=3<arguments.length&&void 0!==r?r:"",a=document.createElement(t);o&&(a.id=o),i&&(a.className=i),e.parentNode.insertBefore(a,e),a.appendChild(e)},unwrap:function(e){var t=e.parentNode;t!==document.body&&(t.parentNode.insertBefore(e,t),t.parentNode.removeChild(t))},isJqueryLoad:function(e){"undefined"==typeof jQuery?getScript(GLOBAL_CONFIG.source.jQuery).then(e):e()},isHidden:function(e){return 0===e.offsetHeight&&0===e.offsetWidth},getEleTop:function(e){for(var t=e.offsetTop,n=e.offsetParent;null!==n;)t+=n.offsetTop,n=n.offsetParent;return t}};

View File

@ -0,0 +1,95 @@
.snackbar-container {
transition: all 500ms ease;
transition-property: top, right, bottom, left, opacity;
font-family: Roboto, sans-serif;
font-size: 14px;
min-height: 14px;
background-color: #070b0e;
position: fixed;
display: flex;
justify-content: space-between;
align-items: center;
color: white;
line-height: 22px;
padding: 18px 24px;
bottom: -100px;
top: -100px;
opacity: 0;
z-index: 9999;
}
.snackbar-container .action {
background: inherit;
display: inline-block;
border: none;
font-size: inherit;
text-transform: uppercase;
color: #4caf50;
margin: 0 0 0 24px;
padding: 0;
min-width: min-content;
cursor: pointer;
}
@media (min-width: 640px) {
.snackbar-container {
min-width: 288px;
max-width: 568px;
display: inline-flex;
border-radius: 2px;
margin: 24px;
}
}
@media (max-width: 640px) {
.snackbar-container {
left: 0;
right: 0;
width: 100%;
}
}
.snackbar-pos.bottom-center {
top: auto !important;
bottom: 0;
left: 50%;
transform: translate(-50%, 0);
}
.snackbar-pos.bottom-left {
top: auto !important;
bottom: 0;
left: 0;
}
.snackbar-pos.bottom-right {
top: auto !important;
bottom: 0;
right: 0;
}
.snackbar-pos.top-left {
bottom: auto !important;
top: 0;
left: 0;
}
.snackbar-pos.top-center {
bottom: auto !important;
top: 0;
left: 50%;
transform: translate(-50%, 0);
}
.snackbar-pos.top-right {
bottom: auto !important;
top: 0;
right: 0;
}
@media (max-width: 640px) {
.snackbar-pos.bottom-center, .snackbar-pos.top-center {
left: 0;
transform: none;
}
}

View File

@ -0,0 +1,7 @@
{
"version": 3,
"mappings": "AAAA,mBAAmB;EACjB,UAAU,EAAE,cAAc;EAC1B,mBAAmB,EAAE,iCAAiC;EACtD,WAAW,EAAE,kBAAkB;EAC/B,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,IAAI;EAChB,gBAAgB,EAAE,OAAoB;EACtC,QAAQ,EAAE,KAAK;EACf,OAAO,EAAE,KAAK;EACd,eAAe,EAAE,aAAa;EAC9B,WAAW,EAAE,MAAM;EACnB,KAAK,EAAE,KAAK;EACZ,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,SAAS;EAClB,MAAM,EAAE,CAAC;EACT,GAAG,EAAE,CAAC;EACN,OAAO,EAAE,CAAC;EACV,OAAO,EAAE,IAAI;;AACb,2BAAO;EACL,UAAU,EAAE,OAAO;EACnB,OAAO,EAAE,YAAY;EACrB,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,OAAO;EAClB,cAAc,EAAE,SAAS;EACzB,KAAK,EAAE,OAAO;EACd,MAAM,EAAE,UAAU;EAClB,OAAO,EAAE,CAAC;EACV,SAAS,EAAE,WAAW;EACtB,MAAM,EAAE,OAAO;;;AAEnB,yBAAyB;EACvB,mBAAmB;IACjB,SAAS,EAAE,KAAK;IAChB,SAAS,EAAE,KAAK;IAChB,OAAO,EAAE,WAAW;IACpB,aAAa,EAAE,GAAG;IAClB,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,MAAM;;;AAElB,yBAAyB;EACvB,mBAAmB;IACjB,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;;;AAGV,2BAAe;EACb,GAAG,EAAE,eAAe;EACpB,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,GAAG;EACT,SAAS,EAAE,qBAAqB;;AAClC,yBAAa;EACX,GAAG,EAAE,eAAe;EACpB,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,CAAC;;AACT,0BAAc;EACZ,GAAG,EAAE,eAAe;EACpB,MAAM,EAAE,CAAC;EACT,KAAK,EAAE,CAAC;;AACV,sBAAU;EACR,MAAM,EAAE,eAAe;EACvB,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;;AACT,wBAAY;EACV,MAAM,EAAE,eAAe;EACvB,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,GAAG;EACT,SAAS,EAAE,qBAAqB;;AAClC,uBAAW;EACT,MAAM,EAAE,eAAe;EACvB,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,CAAC",
"sources": ["../src/sass/snackbar.sass"],
"names": [],
"file": "snackbar.css"
}

View File

@ -0,0 +1,189 @@
/*!
* Snackbar v0.1.14
* http://polonel.com/Snackbar
*
* Copyright 2018 Chris Brame and other contributors
* Released under the MIT license
* https://github.com/polonel/Snackbar/blob/master/LICENSE
*/
(function (root, factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
define([], function () {
return (root.Snackbar = factory());
});
} else if (typeof module === 'object' && module.exports) {
module.exports = root.Snackbar = factory();
} else {
root.Snackbar = factory();
}
})(this, function () {
var Snackbar = {};
Snackbar.current = null;
var $defaults = {
text: 'Default Text',
textColor: '#FFFFFF',
width: 'auto',
showAction: true,
actionText: 'Dismiss',
actionTextAria: 'Dismiss, Description for Screen Readers',
alertScreenReader: false,
actionTextColor: '#4CAF50',
showSecondButton: false,
secondButtonText: '',
secondButtonAria: 'Description for Screen Readers',
secondButtonTextColor: '#4CAF50',
backgroundColor: '#323232',
pos: 'bottom-left',
duration: 5000,
customClass: '',
onActionClick: function (element) {
element.style.opacity = 0;
},
onSecondButtonClick: function (element) {
},
onClose: function (element) {
}
};
Snackbar.show = function ($options) {
var options = Extend(true, $defaults, $options);
if (Snackbar.current) {
Snackbar.current.style.opacity = 0;
setTimeout(
function () {
var $parent = this.parentElement;
if ($parent)
// possible null if too many/fast Snackbars
$parent.removeChild(this);
}.bind(Snackbar.current),
500
);
}
Snackbar.snackbar = document.createElement('div');
Snackbar.snackbar.className = 'snackbar-container ' + options.customClass;
Snackbar.snackbar.style.width = options.width;
var $p = document.createElement('p');
$p.style.margin = 0;
$p.style.padding = 0;
$p.style.color = options.textColor;
$p.style.fontSize = '14px';
$p.style.fontWeight = 300;
$p.style.lineHeight = '1em';
$p.innerHTML = options.text;
Snackbar.snackbar.appendChild($p);
Snackbar.snackbar.style.background = options.backgroundColor;
if (options.showSecondButton) {
var secondButton = document.createElement('button');
secondButton.className = 'action';
secondButton.innerHTML = options.secondButtonText;
secondButton.setAttribute('aria-label', options.secondButtonAria);
secondButton.style.color = options.secondButtonTextColor;
secondButton.addEventListener('click', function () {
options.onSecondButtonClick(Snackbar.snackbar);
});
Snackbar.snackbar.appendChild(secondButton);
}
if (options.showAction) {
var actionButton = document.createElement('button');
actionButton.className = 'action';
actionButton.innerHTML = options.actionText;
actionButton.setAttribute('aria-label', options.actionTextAria);
actionButton.style.color = options.actionTextColor;
actionButton.addEventListener('click', function () {
options.onActionClick(Snackbar.snackbar);
});
Snackbar.snackbar.appendChild(actionButton);
}
if (options.duration) {
setTimeout(
function () {
if (Snackbar.current === this) {
Snackbar.current.style.opacity = 0;
// When natural remove event occurs let's move the snackbar to its origins
Snackbar.current.style.top = '-100px';
Snackbar.current.style.bottom = '-100px';
}
}.bind(Snackbar.snackbar),
options.duration
);
}
if (options.alertScreenReader) {
Snackbar.snackbar.setAttribute('role', 'alert');
}
Snackbar.snackbar.addEventListener(
'transitionend',
function (event, elapsed) {
if (event.propertyName === 'opacity' && this.style.opacity === '0') {
if (typeof (options.onClose) === 'function')
options.onClose(this);
this.parentElement.removeChild(this);
if (Snackbar.current === this) {
Snackbar.current = null;
}
}
}.bind(Snackbar.snackbar)
);
Snackbar.current = Snackbar.snackbar;
document.body.appendChild(Snackbar.snackbar);
var $bottom = getComputedStyle(Snackbar.snackbar).bottom;
var $top = getComputedStyle(Snackbar.snackbar).top;
Snackbar.snackbar.style.opacity = 1;
Snackbar.snackbar.className =
'snackbar-container ' + options.customClass + ' snackbar-pos ' + options.pos;
};
Snackbar.close = function () {
if (Snackbar.current) {
Snackbar.current.style.opacity = 0;
}
};
// Pure JS Extend
// http://gomakethings.com/vanilla-javascript-version-of-jquery-extend/
var Extend = function () {
var extended = {};
var deep = false;
var i = 0;
var length = arguments.length;
if (Object.prototype.toString.call(arguments[0]) === '[object Boolean]') {
deep = arguments[0];
i++;
}
var merge = function (obj) {
for (var prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
if (deep && Object.prototype.toString.call(obj[prop]) === '[object Object]') {
extended[prop] = Extend(true, extended[prop], obj[prop]);
} else {
extended[prop] = obj[prop];
}
}
}
};
for (; i < length; i++) {
var obj = arguments[i];
merge(obj);
}
return extended;
};
return Snackbar;
});

View File

@ -0,0 +1 @@
.snackbar-container{transition:all .5s ease;transition-property:top,right,bottom,left,opacity;font-family:Roboto,sans-serif;font-size:14px;min-height:14px;background-color:#070b0e;position:fixed;display:flex;justify-content:space-between;align-items:center;color:#fff;line-height:22px;padding:18px 24px;bottom:-100px;top:-100px;opacity:0;z-index:9999}.snackbar-container .action{background:inherit;display:inline-block;border:none;font-size:inherit;text-transform:uppercase;color:#4caf50;margin:0 0 0 24px;padding:0;min-width:min-content;cursor:pointer}@media (min-width:640px){.snackbar-container{min-width:288px;max-width:568px;display:inline-flex;border-radius:2px;margin:24px}}@media (max-width:640px){.snackbar-container{left:0;right:0;width:100%}}.snackbar-pos.bottom-center{top:auto!important;bottom:0;left:50%;transform:translate(-50%,0)}.snackbar-pos.bottom-left{top:auto!important;bottom:0;left:0}.snackbar-pos.bottom-right{top:auto!important;bottom:0;right:0}.snackbar-pos.top-left{bottom:auto!important;top:0;left:0}.snackbar-pos.top-center{bottom:auto!important;top:0;left:50%;transform:translate(-50%,0)}.snackbar-pos.top-right{bottom:auto!important;top:0;right:0}@media (max-width:640px){.snackbar-pos.bottom-center,.snackbar-pos.top-center{left:0;transform:none}}

View File

@ -0,0 +1,17 @@
/*!
* Snackbar v0.1.14
* http://polonel.com/Snackbar
*
* Copyright 2018 Chris Brame and other contributors
* Released under the MIT license
* https://github.com/polonel/Snackbar/blob/master/LICENSE
*/
!function(a,b){"use strict";"function"==typeof define&&define.amd?define([],function(){return a.Snackbar=b()}):"object"==typeof module&&module.exports?module.exports=a.Snackbar=b():a.Snackbar=b()}(this,function(){var a={};a.current=null;var b={text:"Default Text",textColor:"#FFFFFF",width:"auto",showAction:!0,actionText:"Dismiss",actionTextAria:"Dismiss, Description for Screen Readers",alertScreenReader:!1,actionTextColor:"#4CAF50",showSecondButton:!1,secondButtonText:"",secondButtonAria:"Description for Screen Readers",secondButtonTextColor:"#4CAF50",backgroundColor:"#323232",pos:"bottom-left",duration:5e3,customClass:"",onActionClick:function(a){a.style.opacity=0},onSecondButtonClick:function(a){},onClose:function(a){}};a.show=function(d){var e=c(!0,b,d);a.current&&(a.current.style.opacity=0,setTimeout(function(){var a=this.parentElement;a&&
// possible null if too many/fast Snackbars
a.removeChild(this)}.bind(a.current),500)),a.snackbar=document.createElement("div"),a.snackbar.className="snackbar-container "+e.customClass,a.snackbar.style.width=e.width;var f=document.createElement("p");if(f.style.margin=0,f.style.padding=0,f.style.color=e.textColor,f.style.fontSize="14px",f.style.fontWeight=300,f.style.lineHeight="1em",f.innerHTML=e.text,a.snackbar.appendChild(f),a.snackbar.style.background=e.backgroundColor,e.showSecondButton){var g=document.createElement("button");g.className="action",g.innerHTML=e.secondButtonText,g.setAttribute("aria-label",e.secondButtonAria),g.style.color=e.secondButtonTextColor,g.addEventListener("click",function(){e.onSecondButtonClick(a.snackbar)}),a.snackbar.appendChild(g)}if(e.showAction){var h=document.createElement("button");h.className="action",h.innerHTML=e.actionText,h.setAttribute("aria-label",e.actionTextAria),h.style.color=e.actionTextColor,h.addEventListener("click",function(){e.onActionClick(a.snackbar)}),a.snackbar.appendChild(h)}e.duration&&setTimeout(function(){a.current===this&&(a.current.style.opacity=0,
// When natural remove event occurs let's move the snackbar to its origins
a.current.style.top="-100px",a.current.style.bottom="-100px")}.bind(a.snackbar),e.duration),e.alertScreenReader&&a.snackbar.setAttribute("role","alert"),a.snackbar.addEventListener("transitionend",function(b,c){"opacity"===b.propertyName&&"0"===this.style.opacity&&("function"==typeof e.onClose&&e.onClose(this),this.parentElement.removeChild(this),a.current===this&&(a.current=null))}.bind(a.snackbar)),a.current=a.snackbar,document.body.appendChild(a.snackbar);getComputedStyle(a.snackbar).bottom,getComputedStyle(a.snackbar).top;a.snackbar.style.opacity=1,a.snackbar.className="snackbar-container "+e.customClass+" snackbar-pos "+e.pos},a.close=function(){a.current&&(a.current.style.opacity=0)};
// Pure JS Extend
// http://gomakethings.com/vanilla-javascript-version-of-jquery-extend/
var c=function(){var a={},b=!1,d=0,e=arguments.length;"[object Boolean]"===Object.prototype.toString.call(arguments[0])&&(b=arguments[0],d++);for(var f=function(d){for(var e in d)Object.prototype.hasOwnProperty.call(d,e)&&(b&&"[object Object]"===Object.prototype.toString.call(d[e])?a[e]=c(!0,a[e],d[e]):a[e]=d[e])};d<e;d++){var g=arguments[d];f(g)}return a};return a});
//# sourceMappingURL=snackbar.min.js.map

View File

@ -0,0 +1 @@
{"version":3,"sources":["../src/js/snackbar.js"],"names":["root","factory","define","amd","Snackbar","module","exports","this","current","$defaults","text","textColor","width","showAction","actionText","actionTextAria","alertScreenReader","actionTextColor","showSecondButton","secondButtonText","secondButtonAria","secondButtonTextColor","backgroundColor","pos","duration","customClass","onActionClick","element","style","opacity","onSecondButtonClick","onClose","show","$options","options","Extend","setTimeout","$parent","parentElement","removeChild","bind","snackbar","document","createElement","className","$p","margin","padding","color","fontSize","fontWeight","lineHeight","innerHTML","appendChild","background","secondButton","setAttribute","addEventListener","actionButton","top","bottom","event","elapsed","propertyName","body","getComputedStyle","close","extended","deep","i","length","arguments","Object","prototype","toString","call","merge","obj","prop","hasOwnProperty"],"mappings":";;;;;;;;CASA,SAAUA,EAAMC,GACZ,YAEsB,mBAAXC,SAAyBA,OAAOC,IACvCD,UAAW,WACP,MAAQF,GAAKI,SAAWH,MAEH,gBAAXI,SAAuBA,OAAOC,QAC5CD,OAAOC,QAAUN,EAAKI,SAAWH,IAEjCD,EAAKI,SAAWH,KAErBM,KAAM,WACL,GAAIH,KAEJA,GAASI,QAAU,IACnB,IAAIC,IACAC,KAAM,eACNC,UAAW,UACXC,MAAO,OACPC,YAAY,EACZC,WAAY,UACZC,eAAgB,0CAChBC,mBAAmB,EACnBC,gBAAiB,UACjBC,kBAAkB,EAClBC,iBAAkB,GAClBC,iBAAkB,iCAClBC,sBAAuB,UACvBC,gBAAiB,UACjBC,IAAK,cACLC,SAAU,IACVC,YAAa,GACbC,cAAe,SAASC,GACpBA,EAAQC,MAAMC,QAAU,GAE5BC,oBAAqB,SAASH,KAC9BI,QAAS,SAASJ,KAGtBvB,GAAS4B,KAAO,SAASC,GACrB,GAAIC,GAAUC,GAAO,EAAM1B,EAAWwB,EAElC7B,GAASI,UACTJ,EAASI,QAAQoB,MAAMC,QAAU,EACjCO,WACI,WACI,GAAIC,GAAU9B,KAAK+B,aACfD;;AAEAA,EAAQE,YAAYhC,OAC1BiC,KAAKpC,EAASI,SAChB,MAIRJ,EAASqC,SAAWC,SAASC,cAAc,OAC3CvC,EAASqC,SAASG,UAAY,sBAAwBV,EAAQT,YAC9DrB,EAASqC,SAASb,MAAMhB,MAAQsB,EAAQtB,KACxC,IAAIiC,GAAKH,SAASC,cAAc,IAWhC,IAVAE,EAAGjB,MAAMkB,OAAS,EAClBD,EAAGjB,MAAMmB,QAAU,EACnBF,EAAGjB,MAAMoB,MAAQd,EAAQvB,UACzBkC,EAAGjB,MAAMqB,SAAW,OACpBJ,EAAGjB,MAAMsB,WAAa,IACtBL,EAAGjB,MAAMuB,WAAa,MACtBN,EAAGO,UAAYlB,EAAQxB,KACvBN,EAASqC,SAASY,YAAYR,GAC9BzC,EAASqC,SAASb,MAAM0B,WAAapB,EAAQZ,gBAEzCY,EAAQhB,iBAAkB,CAC1B,GAAIqC,GAAeb,SAASC,cAAc,SAC1CY,GAAaX,UAAY,SACzBW,EAAaH,UAAYlB,EAAQf,iBACjCoC,EAAaC,aAAa,aAActB,EAAQd,kBAChDmC,EAAa3B,MAAMoB,MAAQd,EAAQb,sBACnCkC,EAAaE,iBAAiB,QAAS,WACnCvB,EAAQJ,oBAAoB1B,EAASqC,YAEzCrC,EAASqC,SAASY,YAAYE,GAGlC,GAAIrB,EAAQrB,WAAY,CACpB,GAAI6C,GAAehB,SAASC,cAAc,SAC1Ce,GAAad,UAAY,SACzBc,EAAaN,UAAYlB,EAAQpB,WACjC4C,EAAaF,aAAa,aAActB,EAAQnB,gBAChD2C,EAAa9B,MAAMoB,MAAQd,EAAQjB,gBACnCyC,EAAaD,iBAAiB,QAAS,WACnCvB,EAAQR,cAActB,EAASqC,YAEnCrC,EAASqC,SAASY,YAAYK,GAG9BxB,EAAQV,UACRY,WACI,WACQhC,EAASI,UAAYD,OACrBH,EAASI,QAAQoB,MAAMC,QAAU;;AAEjCzB,EAASI,QAAQoB,MAAM+B,IAAM,SAC7BvD,EAASI,QAAQoB,MAAMgC,OAAS,WAEtCpB,KAAKpC,EAASqC,UAChBP,EAAQV,UAIZU,EAAQlB,mBACTZ,EAASqC,SAASe,aAAa,OAAQ,SAG1CpD,EAASqC,SAASgB,iBACd,gBACA,SAASI,EAAOC,GACe,YAAvBD,EAAME,cAAqD,MAAvBxD,KAAKqB,MAAMC,UACf,kBAArBK,GAAe,SACtBA,EAAQH,QAAQxB,MAEpBA,KAAK+B,cAAcC,YAAYhC,MAC3BH,EAASI,UAAYD,OACrBH,EAASI,QAAU,QAG7BgC,KAAKpC,EAASqC,WAGpBrC,EAASI,QAAUJ,EAASqC,SAE5BC,SAASsB,KAAKX,YAAYjD,EAASqC,SACrBwB,kBAAiB7D,EAASqC,UAAUmB,OACvCK,iBAAiB7D,EAASqC,UAAUkB,GAC/CvD,GAASqC,SAASb,MAAMC,QAAU,EAClCzB,EAASqC,SAASG,UACd,sBAAwBV,EAAQT,YAAc,iBAAmBS,EAAQX,KAGjFnB,EAAS8D,MAAQ,WACT9D,EAASI,UACTJ,EAASI,QAAQoB,MAAMC,QAAU;;;AAMzC,GAAIM,GAAS,WACT,GAAIgC,MACAC,GAAO,EACPC,EAAI,EACJC,EAASC,UAAUD,MAE8B,sBAAjDE,OAAOC,UAAUC,SAASC,KAAKJ,UAAU,MACzCH,EAAOG,UAAU,GACjBF,IAeJ,KAZA,GAAIO,GAAQ,SAASC,GACjB,IAAK,GAAIC,KAAQD,GACTL,OAAOC,UAAUM,eAAeJ,KAAKE,EAAKC,KACtCV,GAAsD,oBAA9CI,OAAOC,UAAUC,SAASC,KAAKE,EAAIC,IAC3CX,EAASW,GAAQ3C,GAAO,EAAMgC,EAASW,GAAOD,EAAIC,IAElDX,EAASW,GAAQD,EAAIC,KAM9BT,EAAIC,EAAQD,IAAK,CACpB,GAAIQ,GAAMN,UAAUF,EACpBO,GAAMC,GAGV,MAAOV,GAGX,OAAO/D","file":"snackbar.min.js"}

View File

@ -0,0 +1,306 @@
"use strict";
function _createForOfIteratorHelper(e, t) {
var o = "undefined" != typeof Symbol && e[Symbol.iterator] || e["@@iterator"];
if (!o) {
if (Array.isArray(e) || (o = _unsupportedIterableToArray(e)) || t && e && "number" == typeof e.length) {
o && (e = o);
var n = 0, r = function () {
};
return {
s: r, n: function () {
return n >= e.length ? {done: !0} : {done: !1, value: e[n++]}
}, e: function (e) {
throw e
}, f: r
}
}
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")
}
var a, i = !0, c = !1;
return {
s: function () {
o = o.call(e)
}, n: function () {
var e = o.next();
return i = e.done, e
}, e: function (e) {
c = !0, a = e
}, f: function () {
try {
i || null == o.return || o.return()
} finally {
if (c) throw a
}
}
}
}
function _unsupportedIterableToArray(e, t) {
if (e) {
if ("string" == typeof e) return _arrayLikeToArray(e, t);
var o = Object.prototype.toString.call(e).slice(8, -1);
return "Object" === o && e.constructor && (o = e.constructor.name), "Map" === o || "Set" === o ? Array.from(e) : "Arguments" === o || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o) ? _arrayLikeToArray(e, t) : void 0
}
}
function _arrayLikeToArray(e, t) {
(null == t || t > e.length) && (t = e.length);
for (var o = 0, n = new Array(t); o < t; o++) n[o] = e[o];
return n
}
function _typeof(e) {
return (_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) {
return typeof e
} : function (e) {
return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e
})(e)
}
function checkOpen() {
}
function coverColor() {
var _document$getElementB,
path = null === (_document$getElementB = document.getElementById("post-cover")) || void 0 === _document$getElementB ? void 0 : _document$getElementB.src,
httpRequest;
void 0 !== path ? (httpRequest = new XMLHttpRequest, httpRequest.open("GET", path + "?imageAve", !0), httpRequest.send(), httpRequest.onreadystatechange = function () {
var json, obj, value, value;
4 == httpRequest.readyState && 200 == httpRequest.status && (json = httpRequest.responseText, obj = eval("(" + json + ")"), value = obj.RGB, value = "#" + value.slice(2), "light" == getContrastYIQ(value) && (value = LightenDarkenColor(colorHex(value), -40)), document.styleSheets[0].addRule(":root", "--heo-main:" + value + "!important"), document.styleSheets[0].addRule(":root", "--heo-main-op:" + value + "23!important"), document.styleSheets[0].addRule(":root", "--heo-main-none:" + value + "00!important"), heo.initThemeColor(), document.getElementById("coverdiv").classList.add("loaded"))
}) : (document.styleSheets[0].addRule(":root", "--heo-main: var(--heo-theme)!important"), document.styleSheets[0].addRule(":root", "--heo-main-op: var(--heo-theme-op)!important"), document.styleSheets[0].addRule(":root", "--heo-main-none: var(--heo-theme-none)!important"), heo.initThemeColor())
}
function colorHex(e) {
var t = e;
if (/^(rgb|RGB)/.test(t)) {
for (var o = t.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(","), n = "#", r = 0; r < o.length; r++) {
var a = Number(o[r]).toString(16);
"0" === a && (a += a), n += a
}
return 7 !== n.length && (n = t), n
}
if (!/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(t)) return t;
var i = t.replace(/#/, "").split("");
if (6 === i.length) return t;
if (3 === i.length) {
for (var c = "#", r = 0; r < i.length; r += 1) c += i[r] + i[r];
return c
}
}
function colorRgb(e) {
var t = e.toLowerCase();
if (t && /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(t)) {
if (4 === t.length) {
for (var o = "#", n = 1; n < 4; n += 1) o += t.slice(n, n + 1).concat(t.slice(n, n + 1));
t = o
}
for (var r = [], n = 1; n < 7; n += 2) r.push(parseInt("0x" + t.slice(n, n + 2)));
return "rgb(" + r.join(",") + ")"
}
return t
}
function LightenDarkenColor(e, t) {
var o = !1;
"#" == e[0] && (e = e.slice(1), o = !0);
var n = parseInt(e, 16), r = (n >> 16) + t;
255 < r ? r = 255 : r < 0 && (r = 0);
var a = (n >> 8 & 255) + t;
255 < a ? a = 255 : a < 0 && (a = 0);
var i = (255 & n) + t;
return 255 < i ? i = 255 : i < 0 && (i = 0), (o ? "#" : "") + String("000000" + (i | a << 8 | r << 16).toString(16)).slice(-6)
}
function getContrastYIQ(e) {
var t = colorRgb(e).match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/), o = 299 * t[1] + 587 * t[2] + 114 * t[3];
return .5 <= (o /= 255e3) ? "light" : "dark"
}
function navTitle() {
var e = document.title.replace(" | 张洪Heo", "");
document.getElementById("page-name-text").innerHTML = e
}
function showcopy() {
var e;
void 0 !== GLOBAL_CONFIG.Snackbar ? btf.snackbarShow(GLOBAL_CONFIG.copy.success) : ((e = ctx.previousElementSibling).innerText = GLOBAL_CONFIG.copy.success, e.style.opacity = 1, setTimeout(function () {
e.style.opacity = 0
}, 700))
}
checkOpen.toString = function () {
this.opened = !0
}, window.onload = function () {
for (var e = document.getElementsByClassName("copybtn"), t = 0; t < e.length; t++) document.getElementsByClassName("copybtn")[t].addEventListener("click", function () {
showcopy()
});
heo.initThemeColor()
};
var getTimeState = function () {
var e = (new Date).getHours(), t = "";
return 0 <= e && e <= 5 ? t = "晚安" : 5 < e && e <= 10 ? t = "早上好" : 10 < e && e <= 14 ? t = "中午好" : 14 < e && e <= 18 ? t = "下午好" : 18 < e && e <= 24 && (t = "晚上好"), t
};
function fly_to_top() {
document.getElementById("guli_top").classList.add("open_wing"), setTimeout(function () {
document.getElementById("guli_top").classList.add("flying"), btf.scrollToDest(0, 300)
}, 300), setTimeout(function () {
document.getElementById("guli_top").classList.remove("flying"), document.getElementById("guli_top").classList.remove("open_wing"), document.getElementById("guli_top").style.cssText = "opacity: ''; transform: ''"
}, 600)
}
var navFn = {
switchDarkMode: function () {
"light" == ("dark" === document.documentElement.getAttribute("data-theme") ? "dark" : "light") ? (activateDarkMode(), saveToLocal.set("theme", "dark", 2), void 0 !== GLOBAL_CONFIG.Snackbar && btf.snackbarShow(GLOBAL_CONFIG.Snackbar.day_to_night, !1, 2e3)) : (activateLightMode(), saveToLocal.set("theme", "light", 2), void 0 !== GLOBAL_CONFIG.Snackbar && btf.snackbarShow(GLOBAL_CONFIG.Snackbar.night_to_day, !1, 2e3)), "function" == typeof utterancesTheme && utterancesTheme(), "object" === ("undefined" == typeof FB ? "undefined" : _typeof(FB)) && window.loadFBComment(), window.DISQUS && document.getElementById("disqus_thread").children.length && setTimeout(function () {
return window.disqusReset()
}, 200);
var e, t, o, n = "light" === document.documentElement.getAttribute("data-theme") ? "#363636" : "#F7F7FA";
document.getElementById("posts-chart") && ((e = postsOption).textStyle.color = n, e.title.textStyle.color = n, e.xAxis.axisLine.lineStyle.color = n, e.yAxis.axisLine.lineStyle.color = n, postsChart.setOption(e)), document.getElementById("tags-chart") && ((t = tagsOption).textStyle.color = n, t.title.textStyle.color = n, t.xAxis.axisLine.lineStyle.color = n, t.yAxis.axisLine.lineStyle.color = n, tagsChart.setOption(t)), document.getElementById("categories-chart") && ((o = categoriesOption).textStyle.color = n, o.title.textStyle.color = n, o.legend.textStyle.color = n, categoriesChart.setOption(o))
}
};
function RemoveRewardMask() {
$(".reward-main").attr("style", "display: none"), $("#quit-box").attr("style", "display: none")
}
function AddRewardMask() {
$(".reward-main").attr("style", "display: flex")
}
function travelling() {
fetch("https://moments.zhheo.com/randomfriend").then(function (e) {
return e.json()
}).then(function (e) {
var t = e.name, o = e.link,
n = "点击前往按钮进入随机一个友链,不保证跳转网站的安全性和可用性。本次随机到的是本站友链:「" + t + "」";
document.styleSheets[0].addRule(":root", "--heo-snackbar-time:8000ms!important"), Snackbar.show({
text: n,
duration: 1e4,
pos: "top-center",
actionText: "前往",
onActionClick: function (e) {
$(e).css("opacity", 0), window.open(o, "_blank")
}
})
})
}
function toforeverblog() {
Snackbar.show({
text: "点击前往按钮进入「十年之约」项目中的成员博客,不保证跳转网站的安全性和可用性",
duration: 8e3,
pos: "top-center",
actionText: "前往",
onActionClick: function (e) {
$(e).css("opacity", 0), window.open(link, "https://www.foreverblog.cn/go.html")
}
})
}
function totraveling() {
btf.snackbarShow("即将跳转到「开往」项目的成员博客,不保证跳转网站的安全性和可用性", !1, 5e3), setTimeout(function () {
window.open("https://travellings.link/")
}, "5000")
}
function removeLoading() {
setTimeout(function () {
preloader.endLoading()
}, 3e3)
}
function addFriendLink() {
var e = document.getElementsByClassName("el-textarea__inner")[0], t = document.createEvent("HTMLEvents");
t.initEvent("input", !0, !0), e.value = "昵称:\n网站地址\n头像图片url\n描述\n", e.dispatchEvent(t);
var o = document.querySelector("#post-comment").offsetTop;
window.scrollTo(0, o - 80), e.focus(), e.setSelectionRange(-1, -1)
}
function getArrayItems(e, t) {
var o = new Array;
for (var n in e) o.push(e[n]);
for (var r = new Array, a = 0; a < t && 0 < o.length; a++) {
var i = Math.floor(Math.random() * o.length);
r[a] = o[i], o.splice(i, 1)
}
return r
}
function owoBig() {
document.getElementById("post-comment").addEventListener("DOMNodeInserted", function (e) {
var t, o, n, a;
!e.target.classList || "OwO-body" != e.target.classList.value || (t = e.target) && (n = !(o = ""), (a = document.createElement("div")).id = "owo-big", document.querySelector("body").appendChild(a), t.addEventListener("contextmenu", function (e) {
return e.preventDefault()
}), t.addEventListener("mouseover", function (r) {
"LI" == r.target.tagName && n && (n = !1, o = setTimeout(function () {
var e = 3 * r.path[0].clientHeight, t = 3 * r.path[0].clientWidth,
o = r.x - r.offsetX - (t - r.path[0].clientWidth) / 2, n = r.y - r.offsetY;
a.style.height = e + "px", a.style.width = t + "px", a.style.left = o + "px", a.style.top = n + "px", a.style.display = "flex", a.innerHTML = '<img src="'.concat(r.target.querySelector("img").src, '">')
}, 300))
}), t.addEventListener("mouseout", function (e) {
a.style.display = "none", n = !0, clearTimeout(o)
}))
})
}
function percent() {
var e = document.documentElement.scrollTop || window.pageYOffset,
t = Math.max(document.body.scrollHeight, document.documentElement.scrollHeight, document.body.offsetHeight, document.documentElement.offsetHeight, document.body.clientHeight, document.documentElement.clientHeight) - document.documentElement.clientHeight,
o = Math.round(e / t * 100), n = document.querySelector("#percent"),
r = window.scrollY + document.documentElement.clientHeight,
a = document.getElementById("post-tools") || document.getElementById("footer");
a.offsetTop + a.offsetHeight / 2 < r || 90 < o ? (document.querySelector("#nav-totop").classList.add("long"), n.innerHTML = "返回顶部") : (document.querySelector("#nav-totop").classList.remove("long"), n.innerHTML = o)
}
document.addEventListener("touchstart", function (e) {
RemoveRewardMask()
}, !1), $(document).unbind("keydown").bind("keydown", function (e) {
if ((e.ctrlKey || e.metaKey) && 67 == e.keyCode && "" != selectTextNow) return btf.snackbarShow("复制成功,复制和转载请标注本文地址"), rm.rightmenuCopyText(selectTextNow), !1
}), document.addEventListener("scroll", btf.throttle(function () {
heo.initThemeColor()
}, 200)), navigator.serviceWorker.getRegistrations().then(function (e) {
var t, o = _createForOfIteratorHelper(e);
try {
for (o.s(); !(t = o.n()).done;) {
t.value.unregister()
}
} catch (e) {
o.e(e)
} finally {
o.f()
}
}), window.onkeydown = function (e) {
123 === e.keyCode && btf.snackbarShow("开发者模式已打开请遵循GPL协议", !1, 3e3)
}, document.querySelector("#algolia-search").addEventListener("wheel", function (e) {
e.preventDefault()
}), document.querySelector("#console").addEventListener("wheel", function (e) {
e.preventDefault()
}), window.addEventListener("resize", function () {
document.querySelector("#waterfall") && heo.reflashEssayWaterFall()
}), $(".topGroup").hover(function () {
console.log("卡片悬浮")
}, function () {
hoverOnCommentBarrage = !1, document.getElementById("todayCard").classList.remove("hide"), document.getElementById("todayCard").style.zIndex = 1, console.log("卡片停止悬浮")
}), document.getElementById("post-comment") && owoBig(), document.addEventListener("scroll", btf.throttle(function () {
var e, t = window.scrollY + document.documentElement.clientHeight,
o = (window.scrollY, document.getElementById("pagination")), n = document.getElementById("post-tools");
n && o && (e = n.offsetTop + n.offsetHeight / 2, 1300 < document.body.clientWidth && (e < t ? o.classList.add("show-window") : o.classList.remove("show-window")))
}, 200)), "false" !== localStorage.getItem("keyboardToggle") ? document.querySelector("#consoleKeyboard").classList.add("on") : document.querySelector("#consoleKeyboard").classList.remove("on"), $(window).on("keydown", function (e) {
if (27 == e.keyCode && (heo.hideLoading(), heo.hideConsole(), rm.hideRightMenu()), heo_keyboard && e.shiftKey) {
if (16 == e.keyCode && document.querySelector("#keyboard-tips").classList.add("show"), 75 == e.keyCode) return heo.keyboardToggle(), !1;
if (65 == e.keyCode) return heo.showConsole(), !1;
if (77 == e.keyCode) return heo.musicToggle(), !1;
if (82 == e.keyCode) return toRandomPost(), !1;
if (66 == e.keyCode) return pjax.loadUrl("/"), !1;
if (68 == e.keyCode) return rm.switchDarkMode(), !1;
if (70 == e.keyCode) return pjax.loadUrl("/moments/"), !1
}
}), $(window).on("keyup", function (e) {
16 == e.keyCode && document.querySelector("#keyboard-tips").classList.remove("show")
}), document.addEventListener("pjax:send", function () {
heo.showLoading()
}), document.addEventListener("pjax:complete", function () {
heo.categoriesBarActive(), heo.tagPageActive(), heo.onlyHome(), heo.addNavBackgroundInit(), heo.initIndexEssay(), heo.changeTimeInEssay(), heo.reflashEssayWaterFall(), heo.darkModeStatus(), heo.initThemeColor(), percent(), window.onscroll = percent, heo.hideLoading()
}), heo.initThemeColor(), percent(), window.onscroll = percent;

View File

@ -0,0 +1 @@
.comment-barrage{position:fixed;bottom:0;right:20px;padding:0 0 20px 10px;z-index:100;display:flex;flex-direction:column;justify-content:end;align-items:flex-end;z-index:999;transition:.3s}@media screen and (max-width:768px){.comment-barrage{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(--heo-maskbgdeep);border-radius:8px;color:var(--heo-fontcolor);animation:barrageIn .6s cubic-bezier(.42,0,.3,1.11);transition:.3s;display:flex;flex-direction:column;border:var(--style-border);backdrop-filter:saturate(180%) blur(20px);-webkit-backdrop-filter:blur(20px);position:fixed;box-shadow:var(--heo-shadow-border)}.comment-barrage-item:hover{border:var(--style-border-hover);box-shadow:var(--heo-shadow-main)}.comment-barrage-item.out{opacity:0;animation:barrageOut .6s cubic-bezier(.42,0,.3,1.11)}.comment-barrage-item.hovered{opacity:0}.comment-barrage-item .comment-barrage-close{color:var(--heo-secondtext);cursor:pointer;line-height:1;padding:4px}.comment-barrage-item .comment-barrage-close:hover{color:var(--heo-main)}.comment-barrage-item pre{display:none}.comment-barrage-item p img:not(.tk-owo-emotion){display:none}.comment-barrage-item blockquote{display:none}.comment-barrage-item .barrageHead{height:30px;padding:0;line-height:30px;font-size:12px;border-bottom:var(--style-border);display:flex;justify-content:space-between;align-items:center;font-weight:700;padding-bottom:6px}.comment-barrage-item .barrageHead .barrageTitle{color:var(--heo-card-bg);margin-right:8px;background:var(--heo-fontcolor);line-height:1;padding:4px;border-radius:4px}.comment-barrage-item .barrageAvatar{width:16px;height:16px;margin:0;margin-left:auto;margin-right:8px;border-radius:50%;background:var(--heo-secondbg)}.comment-barrage-item .barrageContent{font-size:14px!important;font-weight:400!important;height:calc(100% - 30px);overflow:scroll}.comment-barrage-item .barrageContent::-webkit-scrollbar{height:0;width:4px}.comment-barrage-item .barrageContent::-webkit-scrollbar-button{display:none}.comment-barrage-item .barrageContent p{margin:8px 0;line-height:1.3;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;display:-webkit-box;-webkit-box-orient:vertical}.comment-barrage-item .barrageContent h1,.comment-barrage-item .barrageContent h2,.comment-barrage-item .barrageContent h3,.comment-barrage-item .barrageContent h4{font-size:14px!important;font-weight:400!important;margin:8px 0!important}

View File

@ -0,0 +1 @@
"use strict";function _toConsumableArray(e){return _arrayWithoutHoles(e)||_iterableToArray(e)||_unsupportedIterableToArray(e)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(e,r){if(e){if("string"==typeof e)return _arrayLikeToArray(e,r);var a=Object.prototype.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?_arrayLikeToArray(e,r):void 0}}function _iterableToArray(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function _arrayWithoutHoles(e){if(Array.isArray(e))return _arrayLikeToArray(e)}function _arrayLikeToArray(e,r){(null==r||r>e.length)&&(r=e.length);for(var a=0,t=new Array(r);a<r;a++)t[a]=e[a];return t}var commentBarrageConfig={maxBarrage:1,barrageTime:4e3,twikooUrl:"https://twikoo.zhheo.com/",accessToken:"ad44f65c5bda8a966a13f8a5326960b7",pageUrl:window.location.pathname,barrageTimer:[],barrageList:[],barrageIndex:0,dom:document.querySelector(".comment-barrage")},commentInterval=null,hoverOnCommentBarrage=!1;function initCommentBarrage(){var e=JSON.stringify({event:"COMMENT_GET","commentBarrageConfig.accessToken":commentBarrageConfig.accessToken,url:commentBarrageConfig.pageUrl}),r=new XMLHttpRequest;r.withCredentials=!0,r.addEventListener("readystatechange",function(){4===this.readyState&&(commentBarrageConfig.barrageList=commentLinkFilter(JSON.parse(this.responseText).data),commentBarrageConfig.dom.innerHTML="")}),r.open("POST",commentBarrageConfig.twikooUrl),r.setRequestHeader("Content-Type","application/json"),r.send(e),clearInterval(commentInterval),commentInterval=null,commentInterval=setInterval(function(){commentBarrageConfig.barrageList.length&&!hoverOnCommentBarrage&&(popCommentBarrage(commentBarrageConfig.barrageList[commentBarrageConfig.barrageIndex]),commentBarrageConfig.barrageIndex+=1,commentBarrageConfig.barrageIndex%=commentBarrageConfig.barrageList.length),commentBarrageConfig.barrageTimer.length>(commentBarrageConfig.barrageList.length>commentBarrageConfig.maxBarrage?commentBarrageConfig.maxBarrage:commentBarrageConfig.barrageList.length)&&!hoverOnCommentBarrage&&removeCommentBarrage(commentBarrageConfig.barrageTimer.shift())},commentBarrageConfig.barrageTime)}function commentLinkFilter(e){e.sort(function(e,r){return e.created-r.created});var r=[];return e.forEach(function(e){r.push.apply(r,_toConsumableArray(getCommentReplies(e)))}),r}function getCommentReplies(e){if(e.replies){var r=[e];return e.replies.forEach(function(e){r.push.apply(r,_toConsumableArray(getCommentReplies(e)))}),r}return[]}function popCommentBarrage(e){var r=document.createElement("div");commentBarrageConfig.dom.clientWidth,commentBarrageConfig.dom.clientHeight;r.className="comment-barrage-item",r.innerHTML='\n\t\t<div class="barrageHead">\n <div class="barrageTitle">热评</div>\n\t\t\t<div class="barrageNick">'.concat(e.nick,'</div>\n\t\t\t<img class="barrageAvatar" src="https://cravatar.cn/avatar/').concat(e.mailMd5,'"/>\n\t\t\t<a class="comment-barrage-close" href="javascript:heo.switchCommentBarrage()"><i class="fa-solid fa-xmark"></i></a>\n\t\t</div>\n\t\t<div class="barrageContent">').concat(e.comment,"</div>\n\t"),commentBarrageConfig.barrageTimer.push(r),commentBarrageConfig.dom.append(r)}function removeCommentBarrage(e){e.className="comment-barrage-item out",setTimeout(function(){commentBarrageConfig.dom.removeChild(e)},1e3)}$(".comment-barrage").hover(function(){hoverOnCommentBarrage=!0,console.log("热评悬浮")},function(){hoverOnCommentBarrage=!1,console.log("停止悬浮")}),document.addEventListener("scroll",btf.throttle(function(){var e,r=window.scrollY+document.documentElement.clientHeight,a=(window.scrollY,document.querySelector(".comment-barrage")),t=document.getElementById("post-tools");t&&a&&(e=t.offsetTop+t.offsetHeight/2,768<document.body.clientWidth&&(a.style.bottom=r<e?"0":"-200px"))},200)),initCommentBarrage(),"false"!==localStorage.getItem("commentBarrageSwitch")?($(".comment-barrage").show(),$(".menu-commentBarrage-text").text("关闭热评"),document.querySelector("#consoleCommentBarrage").classList.add("on")):($(".comment-barrage").hide(),$(".menu-commentBarrage-text").text("显示热评"),document.querySelector("#consoleCommentBarrage").classList.remove("on")),document.addEventListener("pjax:send",function(){clearInterval(commentInterval)});

View File

@ -0,0 +1 @@
"use strict";function getIpInfo(){fetch("https://api.ooomn.com/api/ip").then(function(e){return e.json()}).then(function(e){var n=e.country,t=e.ip,r=e.province,i=e.city,o=e.isp;document.getElementById("userAgentIp").innerHTML=t,document.getElementById("userAgentCountry").innerHTML=n,document.getElementById("userAgentRegion").innerHTML=r,document.getElementById("userAgentCity").innerHTML=i,document.getElementById("userAgentIsp").innerHTML=o;var u=navigator.userAgent;document.getElementById("userAgentDevice").innerHTML=u})}getIpInfo();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

4
templates/category.html Normal file
View File

@ -0,0 +1,4 @@
<!DOCTYPE html>
<html lang="en">
</html>

4
templates/index.html Normal file
View File

@ -0,0 +1,4 @@
<!DOCTYPE html>
<html th:replace="modules/layouts/layout :: layout (header,content,head,footer,contentClass)"
xmlns:th="https://www.thymeleaf.org">
</html>

View File

@ -0,0 +1,88 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<div class="aside-content" id="aside-content" th:fragment="aside">
<div class="card-widget card-info">
<!-- 描述信息 -->
<!--<div class="card-content">-->
<!-- <div class="card-info-avatar is-center">-->
<!-- <div class="author-info__sayhi" id="author-info__sayhi" th:text="${theme.config.aside.subtitle}">-->
<!-- 你好啊!我是-->
<!-- </div>-->
<!-- <div class="author-info__name" th:text="${theme.config.aside.title}">Liu ZhiHang</div>-->
<!-- <div class="author-info__description" th:utext="${theme.config.aside.description}">-->
<!-- 这里可以写一些<b>公告信息</b>或者<b>个人介绍</b>。-->
<!-- </div>-->
<!-- </div>-->
<!--</div>-->
<!-- 跳转信息 -->
<!--<div class="banner-button-group">-->
<!-- <a class="banner-button" th:href="${theme.config.aside.button_link}">-->
<!-- <i class="fas fa-circle-arrow-up-right"></i>-->
<!-- <span class="banner-button-text" th:text="${theme.config.aside.button_text}">了解更多</span>-->
<!-- </a>-->
<!--</div>-->
<!--<div class="card-info-social-icons is-center">-->
<!-- <a class="social-icon" th:href="${theme.config.aside.github}" rel="external nofollow" target="_blank"-->
<!-- title="Github">-->
<!-- <i class="ri-github-line"></i>-->
<!-- </a>-->
<!-- <a class="social-icon" th:href="${theme.config.aside.mail}" rel="external nofollow" target="_blank"-->
<!-- title="Mail">-->
<!-- <i class="ri-mail-line"></i>-->
<!-- </a>-->
<!--</div>-->
</div>
<!-- 微信公众号 -->
<div class="card-widget heo-right-widget" id="card-wechat" onclick='window.open("/wechat/")'>
<div id="flip-wrapper">
<div id="flip-content">
<div class="face"></div>
<div class="back face"></div>
</div>
</div>
</div>
<div class="sticky_layout">
<div class="card-widget card-tags card-archives card-webinfo card-allinfo">
<div class="item-headline"><i class="fas fa-tags"></i><span>标签</span></div>
<div class="card-tag-cloud">
<a href="tags/AfterEffects/index.html"
style="font-size:1em;color:#d3d3d3">AfterEffects<sup>11</sup></a> <a
href="tags/Chrome/index.html" style="font-size:1em;color:#d3d3d3">Chrome<sup>10</sup></a> <a
href="tags/Docker/index.html" style="font-size:1em;color:#d3d3d3">Docker<sup>1</sup></a> <a
href="tags/Dribbble/index.html" style="font-size:1em;color:#d3d3d3">Dribbble<sup>9</sup></a>
<a href="tags/FinalCutPro/index.html"
style="font-size:1em;color:#d3d3d3">FinalCutPro<sup>5</sup></a> <a
href="tags/Heocan/index.html"
style="font-size:1em;color:#d3d3d3">Heocan<sup>21</sup></a> <a
href="tags/Heomagic/index.html" style="font-size:1em;color:#d3d3d3">Heomagic<sup>5</sup></a>
</div>
<hr>
<div class="item-headline"><i class="fas fa-chart-line"></i><span>统计</span></div>
<div class="webinfo">
<div class="webinfo-item">
<div class="webinfo-item-title"><i class="item-icon fas fa-file-alt"></i>
<div class="item-name">文章总数 :</div>
</div>
<div class="item-count">649</div>
</div>
<div class="webinfo-item">
<div class="webinfo-item-title"><i class="item-icon fas fa-stopwatch"></i>
<div class="item-name">建站天数 :</div>
</div>
<div class="item-count" data-publishdate="2019-10-27T16:00:00.000Z" id="runtimeshow"></div>
</div>
<div class="webinfo-item">
<div class="webinfo-item-title"><i class="item-icon fas fa-font"></i>
<div class="item-name">全站字数 :</div>
</div>
<div class="item-count">606.7k</div>
</div>
</div>
</div>
</div>
</div>
</html>

View File

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<div id="category-bar" th:fragment="category-bar">
<div class="category-bar-items" id="category-bar-items">
<div class="category-bar-item select" id="category-bar-home"><a href="index.html">首页</a></div>
<div class="category-bar-item" id="我的项目"><a
href="categories/%E6%88%91%E7%9A%84%E9%A1%B9%E7%9B%AE/index.html">我的项目</a></div>
</div>
<a class="category-bar-more" href="categories/index.html">更多</a>
</div>
</html>

View File

@ -0,0 +1,4 @@
<!DOCTYPE html>
<html lang="en">
</html>

View File

@ -0,0 +1,118 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<!-- 页脚模块 -->
<footer id="footer" th:fragment="foot">
<div id="footer_deal"><a class="deal_link" href="mailto:zh@zhheo.com" rel="external nofollow" title="mail"><i
class="fa-regular fa-envelope"></i></a><a class="deal_link" target="_blank"
href="https://weibo.com/zhheo" title="微博"
rel="noopener external nofollow noreferrer noopener"><i
class="ri-weibo-line" style="font-size:1.1rem"></i></a><a class="deal_link" target="_blank"
href="https://www.facebook.com/zhheo/"
rel="noopener external nofollow noreferrer noopener"
title="facebook"><i
class="ri-facebook-circle-line" style="font-size:1.2rem"></i></a><a class="deal_link" target="_blank"
href="https://dribbble.com/zhheo/"
rel="noopener external nofollow noreferrer noopener"
title="dribbble"><i
class="ri-dribbble-line" style="font-size:1.2rem"></i></a><img class="footer_mini_logo"
src="../img.zhheo.com/i/2022/08/31/630ef3b505ef5.webp"
title="返回顶部"
onclick="btf.scrollToDest(0,500)"><a
class="deal_link" target="_blank" href="https://github.com/zhheo/"
rel="noopener external nofollow noreferrer noopener" title="github"><i class="ri-github-line"
style="font-size:1.1rem"></i></a><a
class="deal_link" target="_blank" href="https://www.pinterest.com/zhheocom/_created/" title="pinterest"
rel="noopener external nofollow noreferrer noopener"><i class="ri-pinterest-line"
style="font-size:1.2rem"></i></a><a
class="deal_link" target="_blank" href="https://space.bilibili.com/4218173/"
rel="noopener external nofollow noreferrer noopener" title="bilibili"><i class="ri-bilibili-fill"
style="font-size:1.1rem"></i></a><a
class="deal_link" target="_blank" href="https://v.douyin.com/6SMbLRQ/"
rel="noopener external nofollow noreferrer noopener" title="Tiktok"><i class="fa-brands fa-tiktok"></i></a>
</div>
<div id="heo-footer">
<div class="footer-group"><h3 class="footer-title">软件</h3>
<div class="footer-links"><a class="footer-item" href="p/4db484b3.html">轻节食</a><a class="footer-item"
href="p/a170ac02.html">DelSpace3</a><a
class="footer-item" href="p/9df485ea.html">比例计</a></div>
</div>
<div class="footer-group"><h3 class="footer-title">产品</h3>
<div class="footer-links"><a class="footer-item"
href="tags/%E8%AE%BE%E8%AE%A1%E6%8A%A5%E5%91%8A/index.html">设计报告</a><a
class="footer-item" href="tags/%E4%BA%A7%E5%93%81/index.html">优质报告</a></div>
</div>
<div class="footer-group"><h3 class="footer-title">设计</h3>
<div class="footer-links"><a class="footer-item" href="tags/Heocan/index.html">Heocan</a><a
class="footer-item" href="tags/Sketch/index.html">Sketch</a><a class="footer-item"
href="tags/%E4%BC%98%E8%B4%A8%E6%8A%A5%E5%91%8A/index.html">设计报告</a><a
class="footer-item" href="tags/Photoshop/index.html">Photoshop</a></div>
</div>
<div class="footer-group"><h3 class="footer-title">开发</h3>
<div class="footer-links"><a class="footer-item" href="tags/Hexo/index.html">Hexo魔改</a><a
class="footer-item" href="tags/Swift/index.html">Swift开发</a><a class="footer-item"
href="tags/%E7%BD%91%E9%A1%B5%E5%89%8D%E7%AB%AF/index.html">网页前端</a>
</div>
</div>
<div class="footer-group"><h3 class="footer-title">生活</h3>
<div class="footer-links"><a class="footer-item" href="musiclist/index.html">音乐榜单</a><a
class="footer-item" href="movies/index.html">我的电影</a><a class="footer-item"
href="tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/index.html">读书笔记</a><a
class="footer-item" href="tags/%E6%B7%B7%E5%89%AA/index.html">视频剪辑</a></div>
</div>
<div class="footer-group"><h3 class="footer-title">导航</h3>
<div class="footer-links"><a class="footer-item" href="essay/index.html">即刻短文</a><a
class="footer-item" href="tlink/index.html">在线工具</a><a class="footer-item"
href="link/index.html#%E5%8F%8B%E9%93%BE%E6%96%87%E7%AB%A0">友链文章</a><a
class="footer-item" href="moments/index.html">鱼塘</a></div>
</div>
<div class="footer-group"><h3 class="footer-title">服务</h3>
<div class="footer-links"><a class="footer-item" href="https://invite.51.la/1NzKqTeb?target=V6"
target="_blank" rel="noopener nofollow">51la统计</a><a class="footer-item"
href="https://bf.zzxworld.com/s/612"
target="_blank"
rel="noopener nofollow">BlogFinder</a><a
class="footer-item" href="https://www.foreverblog.cn/blog/2050.html" target="_blank"
rel="noopener nofollow">十年之约</a><a class="footer-item" href="https://wangzhan.qianxin.com/"
target="_blank" rel="noopener nofollow">奇安信</a></div>
</div>
<div class="footer-group"><h3 class="footer-title">协议</h3>
<div class="footer-links"><a class="footer-item" href="privacy/index.html">隐私协议</a><a
class="footer-item" href="cookies/index.html">Cookies</a><a class="footer-item"
href="cc/index.html">版权协议</a>
</div>
</div>
<div class="footer-group"><h3 class="footer-title">友链</h3>
<div class="footer-links" id="friend-links-in-footer"><a class="footer-item"
href="link/index.html">随机生成中..</a><a
class="footer-item" href="link/index.html">随机生成中..</a><a class="footer-item"
href="link/index.html">随机生成中..</a><a
class="footer-item" href="link/index.html">随机生成中..</a></div>
</div>
</div>
<div id="footer-banner">
<div class="footer-banner-links">
<div class="footer-banner-left">
<div id="footer-banner-tips">
<div class="copyright">©2019 - 2022 By 张洪Heo</div>
</div>
</div>
<div class="footer-banner-right"><a class="footer-banner-link" href="/rss/">订阅</a><a
class="footer-banner-link" href="/update/">主题</a><a class="footer-banner-link"
href="/about/">关于</a><a
class="footer-banner-link" target="_blank" href="https://beian.miit.gov.cn/#/Integrated/index"
rel="noopener external nofollow noreferrer noopener">京ICP备19051325号</a><a
class="footer-banner-link cc" href="/cc/" title="cc协议"><i class="iconfont icon-occ"></i><i
class="iconfont icon-occ-by"></i><i class="iconfont icon-onc"></i><i
class="iconfont icon-ond"></i></a></div>
</div>
</div>
<div id="cookies-window">
<div class="cookies-window-title">协议提醒助手</div>
<div class="cookies-window-content"><span class="cookies-tip">查看本站为你的个人隐私做出的努力</span><a
class="cookies-link" href="privacy/index.html" title="本站如何保护你的隐私"><i
class="fas fa-arrow-circle-right"></i></a></div>
</div>
<div id="quit-box" onclick="RemoveRewardMask()"></div>
<div class="comment-barrage"></div>
</footer>
</html>

View File

@ -0,0 +1,117 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<header class="not-top-img" id="page-header" th:fragment="header">
<nav id="nav">
<div id="nav-group">
<div id="blog_name">
<div class="back-home-button" tabindex="-1">
<i class="back-home-button-icon fas fa-grip-vertical"></i>
<div class="back-menu-list-groups">
<div class="back-menu-list-group">
<div class="back-menu-list-title">标题</div>
<div class="back-menu-list">
<a class="back-menu-item" href="https://zhheo.com/"
rel="external nofollow" target="_blank"
title="这是标题">
<img class="back-menu-item-icon"
src="https://cdn.zhheo.com/Guli/img/www-mini.png"><span
class="back-menu-item-text">主页</span>
</a>
</div>
</div>
</div>
</div>
<!-- 返回主页 -->
<a href="index.html" id="site-name" title="返回博客主页">
<!-- 返回主页的 icon 可以使用文字代替-->
<i class="iconfont icon-heo"></i>
</a>
</div>
<div id="page-name-mask">
<div id="page-name"><a id="page-name-text" onclick="btf.scrollToDest(0,500)"></a></div>
</div>
<!-- 菜单 -->
<div id="menus">
<div class="menus_items">
<div class="menus_item"><a class="site-page" href="javascript:void(0);"
rel="external nofollow"><span>文库</span><i
class="fas fa-chevron-down expand"></i></a>
<ul class="menus_item_child">
<li><a class="site-page child" href="archives/index.html"><i
class="fa-fw fa-duotone fa-list-timeline"></i> <span>文章列表</span></a></li>
<li><a class="site-page child" href="categories/index.html"><i
class="fa-fw fa-duotone fa-list-tree"></i> <span>全部分类</span></a></li>
<li><a class="site-page child" href="tags/index.html"><i
class="fa-fw fa-duotone fa-tags"></i> <span>全部标签</span></a></li>
<li><a class="site-page child" href="essay/index.html"><i
class="fa-fw fa-duotone fa-rectangles-mixed"></i> <span>即刻短文</span></a></li>
</ul>
</div>
<div class="menus_item"><a class="site-page" href="javascript:void(0);"
rel="external nofollow"><span>专栏</span><i
class="fas fa-chevron-down expand"></i></a>
<ul class="menus_item_child">
<li><a class="site-page child"
href="tags/%E8%AE%BE%E8%AE%A1%E6%8A%A5%E5%91%8A/index.html"><i
class="fa-fw fa-duotone fa-swatchbook"></i> <span>设计报告</span></a></li>
<li><a class="site-page child" href="tags/Heocan/index.html"><i
class="fa-fw fa-duotone fa-pen-paintbrush"></i> <span>设计分享</span></a></li>
<li><a class="site-page child" href="tags/Sketch/index.html"><i
class="fa-fw fa-duotone fa-palette"></i> <span>设计工具</span></a></li>
<li><a class="site-page child" href="tags/%E6%B7%B7%E5%89%AA/index.html"><i
class="fa-fw fa-duotone fa-scissors"></i> <span>视频混剪</span></a></li>
</ul>
</div>
<div class="menus_item"><a class="site-page" href="javascript:void(0);"
rel="external nofollow"><span>友链</span><i
class="fas fa-chevron-down expand"></i></a>
<ul class="menus_item_child">
<li><a class="site-page child" href="moments/index.html"><i
class="fa-fw fa-duotone fa-fish-fins"></i> <span>友链鱼塘</span></a></li>
<li><a class="site-page child" href="link/index.html"><i
class="fa-fw fa-duotone fa-user-group"></i> <span>友情链接</span></a></li>
<li><a class="site-page child" href="javascript:travelling()" rel="external nofollow"><i
class="fa-fw fa-duotone fa-treasure-chest"></i> <span>宝藏博主</span></a></li>
</ul>
</div>
<div class="menus_item"><a class="site-page" href="javascript:void(0);"
rel="external nofollow"><span>我的</span><i
class="fas fa-chevron-down expand"></i></a>
<ul class="menus_item_child">
<li><a class="site-page child" href="tlink/index.html"><i
class="fa-fw fa-duotone fa-screwdriver-wrench"></i> <span>在线工具</span></a>
</li>
<li><a class="site-page child" href="movies/index.html"><i
class="fa-fw fa-duotone fa-film-simple"></i> <span>电影推荐</span></a></li>
<li><a class="site-page child" href="about/index.html"><i
class="fa-fw fa-duotone fa-face-awesome"></i> <span>关于本站</span></a></li>
</ul>
</div>
</div>
</div>
<div id="nav-right">
<div class="nav-button only-home" id="travellings_button"><a class="site-page"
href="javascript:void(0);"
onclick="totraveling()"
rel="external nofollow"
title="随机前往一个开往项目网站"><i
class="fa-duotone fa-train-subway" style="font-size:1rem"></i></a></div>
<div class="nav-button" id="randomPost_button"><a class="site-page" onclick="toRandomPost()"
title="随机前往一个文章"><i
class="fa-duotone fa-dice" style="font-size:1rem"></i></a></div>
<div class="nav-button" id="search-button"><a class="site-page social-icon search"
href="javascript:void(0);"
rel="external nofollow" title="站内搜索"><i
class="fas fa-magnifying-glass" style="font-size:1rem"></i></a></div>
<div class="nav-button"><a class="console_switchbutton" href="javascript:void(0);"
onclick="heo.showConsole()" rel="external nofollow" title="显示中控台"><i
class="fa-duotone fa-gear" style="font-size:1rem"></i></a></div>
<div class="nav-button" id="nav-totop" onclick="btf.scrollToDest(0,500)"><a class="totopbtn"><i
class="fas fa-arrow-up"></i><span id="percent">0</span></a></div>
<div id="toggle-menu"><a class="site-page"><i class="fas fa-bars fa-fw"></i></a></div>
</div>
</div>
</nav>
</header>
</html>

View File

@ -0,0 +1,773 @@
<!DOCTYPE html>
<html lang="en" th:fragment="layout (header,content,head,footer,contentClass)" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width,initial-scale=1" name="viewport">
<title th:text="${site.title}"></title>
<meta content="telephone=no" name="format-detection">
<meta content="var(--heo-card-bg)" name="theme-color">
<script th:src="@{/assets/js/heo.js}"></script>
<meta name="format-detection" content="telephone=no"/>
<meta name="theme-color" content="var(--heo-card-bg)"/>
<link rel="stylesheet" th:href="@{/assets/zhheo/zhheoblog.css}">
<!-- fontawesome-pro https://github.com/duyplus/fontawesome-pro -->
<link href="https://cdn.jsdelivr.net/gh/duyplus/fontawesome-pro/css/all.min.css"
media="print"
onload='this.media="all"'
rel="stylesheet"
/>
<!-- 右下角通知 -->
<link href="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/node-snackbar/0.1.16/snackbar.min.css"
media="print"
onload='this.media="all"'
rel="stylesheet"
/>
<!-- 全局配置 -->
<script>var GLOBAL_CONFIG = {
root: "/",
localSearch: void 0,
translate: {defaultEncoding: 2, translateDelay: 0, msgToTraditionalChinese: "简", msgToSimplifiedChinese: "繁"},
noticeOutdate: void 0,
highlight: {plugin: "highlighjs", highlightCopy: !0, highlightLang: !0, highlightHeightLimit: 400},
copy: {success: "复制成功", error: "复制错误", noSupport: "浏览器不支持"},
relativeDate: {homepage: !0, post: !1},
runtime: "天",
date_suffix: {just: "刚刚", min: "分钟前", hour: "小时前", day: "天前", month: "个月前"},
copyright: void 0,
lightbox: "fancybox",
Snackbar: {
chs_to_cht: "你已切换为繁体",
cht_to_chs: "你已切换为简体",
day_to_night: "你已切换为深色模式",
night_to_day: "你已切换为浅色模式",
bgLight: "#49b1f5",
bgDark: "#121212",
position: "top-center"
},
source: {
jQuery: "https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/3.6.0/jquery.min.js",
justifiedGallery: {
js: "https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/justifiedGallery/3.8.1/js/jquery.justifiedGallery.min.js",
css: "https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/justifiedGallery/3.8.1/css/justifiedGallery.min.css"
},
fancybox: {
js: "https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/fancybox/3.5.7/jquery.fancybox.min.js",
css: "https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/fancybox/3.5.7/jquery.fancybox.min.css"
}
},
isPhotoFigcaption: !0,
islazyload: !0,
isanchor: !1
}</script>
<!-- 站点配置 -->
<script id="config-diff">var GLOBAL_CONFIG_SITE = {
title: "张洪Heo",
isPost: !1,
isHome: !0,
isHighlightShrink: !1,
isToc: !1,
postUpdate: "2022-09-30 12:24:38"
}</script>
<noscript>
<style>#nav {
opacity: 1
}
.justified-gallery img {
opacity: 1
}
#post-meta time, #recent-posts time {
display: inline !important
}</style>
</noscript>
<script>(win => {
win.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
}
}
win.getScript = url => 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()
}
document.head.appendChild(script)
})
win.activateDarkMode = function () {
document.documentElement.setAttribute('data-theme', 'dark')
heo.initThemeColor()
}
win.activateLightMode = function () {
document.documentElement.setAttribute('data-theme', 'light')
heo.initThemeColor()
}
const t = saveToLocal.get('theme')
const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches
const isLightMode = window.matchMedia('(prefers-color-scheme: light)').matches
const isNotSpecified = window.matchMedia('(prefers-color-scheme: no-preference)').matches
const hasNoSupport = !isDarkMode && !isLightMode && !isNotSpecified
if (t === undefined) {
if (isLightMode) activateLightMode()
else if (isDarkMode) activateDarkMode()
else if (isNotSpecified || hasNoSupport) {
const now = new Date()
const hour = now.getHours()
const isNight = hour <= 6 || hour >= 18
isNight ? activateDarkMode() : activateLightMode()
}
window.matchMedia('(prefers-color-scheme: dark)').addListener(function (e) {
if (saveToLocal.get('theme') === undefined) {
e.matches ? activateDarkMode() : activateLightMode()
}
})
} else if (t === 'light') activateLightMode()
else activateDarkMode()
const asideStatus = saveToLocal.get('aside-status')
if (asideStatus !== undefined) {
if (asideStatus === 'hide') {
document.documentElement.classList.add('hide-aside')
} else {
document.documentElement.classList.remove('hide-aside')
}
}
})(window)</script>
<script src="https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/3.6.0/jquery.min.js"></script>
<link href="https://at.alicdn.com/t/font_1891866_47sukspu18q.css" rel="stylesheet">
<link href="https://cdn2.tianli0.top/npm/remixicon@2.5.0/fonts/remixicon.css" rel="stylesheet">
<link href="https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/Swiper/8.0.6/swiper-bundle.min.css" rel="stylesheet">
<link th:href="@{/assets/zhheo/commentBarrage.css}" rel="stylesheet">
<script data-pace-options='{ "restartOnRequestAfter":false,"eventLag":false}'
src="https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/pace/1.2.4/pace.min.js"></script>
</head>
<body>
<!-- loading 页面 -->
<div id="loading-box" onclick="heo.hideLoading()">
<div class="loading-bg"><img class="loading-img" src="https://img.zhheo.com/i/2022/08/31/630f01a3755aa.webp"></div>
</div>
<div id="web_bg"></div>
<!-- 控制台 -->
<div id="console">
<div class="close-btn" href="javascript:void(0);" onclick="heo.hideConsole()"><i class="fas fa-circle-xmark"></i>
</div>
<div class="console-card-group">
<div class="console-card-group-left">
<div class="console-card" id="card-newest-comments" onclick="heo.hideConsole()">
<div class="card-content">
<div class="author-content-item-tips">互动</div>
<span class="author-content-item-title">最近评论</span></div>
<div class="aside-list"><span>正在加载中...</span></div>
</div>
</div>
<div class="console-card-group-right">
<div class="console-card tags" onclick="heo.hideConsole()">
<div class="card-content">
<div class="author-content-item-tips">标签</div>
<span class="author-content-item-title">寻找感兴趣的领域</span></div>
<div class="card-tag-cloud"><a href="tags/AfterEffects/index.html" style="font-size:1em;color:#d3d3d3">AfterEffects<sup>11</sup></a>
<a href="tags/Chrome/index.html" style="font-size:1em;color:#d3d3d3">Chrome<sup>10</sup></a> <a
href="tags/Docker/index.html" style="font-size:1em;color:#d3d3d3">Docker<sup>1</sup></a> <a
href="tags/Dribbble/index.html" style="font-size:1em;color:#d3d3d3">Dribbble<sup>9</sup></a>
<a href="tags/FinalCutPro/index.html"
style="font-size:1em;color:#d3d3d3">FinalCutPro<sup>5</sup></a> <a href="tags/Heocan/index.html"
style="font-size:1em;color:#d3d3d3">Heocan<sup>21</sup></a>
<a href="tags/Heomagic/index.html" style="font-size:1em;color:#d3d3d3">Heomagic<sup>5</sup></a> <a
href="tags/Hexo/index.html" style="font-size:1em;color:#d3d3d3">Hexo<sup>43</sup></a> <a
href="tags/HomePod/index.html" style="font-size:1em;color:#d3d3d3">HomePod<sup>2</sup></a>
<a href="tags/Mac/index.html" style="font-size:1em;color:#d3d3d3">Mac<sup>48</sup></a> <a
href="tags/Photoshop/index.html" style="font-size:1em;color:#d3d3d3">Photoshop<sup>23</sup></a>
<a href="tags/Principle/index.html" style="font-size:1em;color:#d3d3d3">Principle<sup>2</sup></a> <a
href="tags/Python/index.html" style="font-size:1em;color:#d3d3d3">Python<sup>9</sup></a> <a
href="tags/Sketch/index.html" style="font-size:1em;color:#d3d3d3">Sketch<sup>75</sup></a> <a
href="tags/Sketch-Data/index.html"
style="font-size:1em;color:#d3d3d3">Sketch-Data<sup>3</sup></a> <a
href="tags/Swift/index.html" style="font-size:1em;color:#d3d3d3">Swift<sup>98</sup></a> <a
href="tags/SwiftUI-100days/index.html"
style="font-size:1em;color:#d3d3d3">SwiftUI-100days<sup>48</sup></a> <a
href="tags/VI/index.html" style="font-size:1em;color:#d3d3d3">VI<sup>10</sup></a> <a
href="tags/VLOG/index.html" style="font-size:1em;color:#d3d3d3">VLOG<sup>2</sup></a> <a
href="tags/iOS/index.html" style="font-size:1em;color:#d3d3d3">iOS<sup>30</sup></a> <a
href="tags/illustrator/index.html"
style="font-size:1em;color:#d3d3d3">illustrator<sup>8</sup></a> <a
href="tags/%E4%BA%A7%E5%93%81/index.html"
style="font-size:1em;color:#d3d3d3">产品<sup>16</sup></a> <a
href="tags/%E4%BC%98%E8%B4%A8%E6%8A%A5%E5%91%8A/index.html"
style="font-size:1em;color:#d3d3d3">优质报告<sup>3</sup></a> <a
href="tags/%E4%BD%93%E9%AA%8C%E5%AE%98/index.html" style="font-size:1em;color:#d3d3d3">体验官<sup>3</sup></a>
<a href="tags/%E5%8A%9E%E5%85%AC/index.html"
style="font-size:1em;color:#d3d3d3">办公<sup>1</sup></a> <a
href="tags/%E5%AD%97%E4%BD%93/index.html"
style="font-size:1em;color:#d3d3d3">字体<sup>10</sup></a> <a
href="tags/%E5%B9%B2%E8%B4%A7/index.html"
style="font-size:1em;color:#d3d3d3">干货<sup>138</sup></a> <a
href="tags/%E5%BC%80%E5%8F%91/index.html"
style="font-size:1em;color:#d3d3d3">开发<sup>179</sup></a> <a
href="tags/%E5%BF%85%E7%9C%8B/index.html"
style="font-size:1em;color:#d3d3d3">必看<sup>45</sup></a> <a
href="tags/%E6%95%99%E7%A8%8B/index.html"
style="font-size:1em;color:#d3d3d3">教程<sup>254</sup></a> <a
href="tags/%E6%97%A5%E5%B8%B8/index.html"
style="font-size:1em;color:#d3d3d3">日常<sup>27</sup></a> <a
href="tags/%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97/index.html"
style="font-size:1em;color:#d3d3d3">更新日志<sup>7</sup></a> <a
href="tags/%E6%B7%B7%E5%89%AA/index.html"
style="font-size:1em;color:#d3d3d3">混剪<sup>5</sup></a> <a
href="tags/%E7%83%AD%E9%97%A8/index.html"
style="font-size:1em;color:#d3d3d3">热门<sup>50</sup></a> <a
href="tags/%E7%94%B5%E5%AD%90%E4%B9%A6/index.html" style="font-size:1em;color:#d3d3d3">电子书<sup>1</sup></a>
<a href="tags/%E7%BD%91%E9%A1%B5%E5%89%8D%E7%AB%AF/index.html" style="font-size:1em;color:#d3d3d3">网页前端<sup>44</sup></a>
<a href="tags/%E8%A1%A8%E6%83%85/index.html"
style="font-size:1em;color:#d3d3d3">表情<sup>2</sup></a> <a
href="tags/%E8%A7%86%E9%A2%91/index.html"
style="font-size:1em;color:#d3d3d3">视频<sup>17</sup></a> <a
href="tags/%E8%AE%BE%E8%AE%A1/index.html"
style="font-size:1em;color:#d3d3d3">设计<sup>216</sup></a> <a
href="tags/%E8%AE%BE%E8%AE%A1%E6%8A%A5%E5%91%8A/index.html"
style="font-size:1em;color:#d3d3d3">设计报告<sup>12</sup></a> <a
href="tags/%E8%AF%84%E6%B5%8B/index.html"
style="font-size:1em;color:#d3d3d3">评测<sup>10</sup></a> <a
href="tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/index.html"
style="font-size:1em;color:#d3d3d3">读书笔记<sup>6</sup></a> <a
href="tags/%E8%BD%AF%E4%BB%B6/index.html"
style="font-size:1em;color:#d3d3d3">软件<sup>50</sup></a> <a
href="tags/%E8%BF%90%E7%BB%B4/index.html"
style="font-size:1em;color:#d3d3d3">运维<sup>8</sup></a> <a
href="tags/%E8%BF%90%E8%90%A5/index.html"
style="font-size:1em;color:#d3d3d3">运营<sup>4</sup></a> <a
href="tags/%E9%97%B2%E8%81%8A/index.html"
style="font-size:1em;color:#d3d3d3">闲聊<sup>18</sup></a> <a
href="tags/%E9%9F%B3%E4%B9%90/index.html"
style="font-size:1em;color:#d3d3d3">音乐<sup>6</sup></a></div>
</div>
<div class="console-card history" onclick="heo.hideConsole()">
<div class="item-headline"><i class="fas fa-archive"></i><span>文章</span></div>
<ul class="card-archive-list">
<li class="card-archive-list-item"><a class="card-archive-list-link"
href="archives/2022/index.html"><span
class="card-archive-list-date">2022</span>
<div class="card-archive-list-count-group"><span class="card-archive-list-count">92</span><span
class="card-archive-list-count-unit">篇</span></div>
</a></li>
<li class="card-archive-list-item"><a class="card-archive-list-link"
href="archives/2021/index.html"><span
class="card-archive-list-date">2021</span>
<div class="card-archive-list-count-group"><span class="card-archive-list-count">147</span><span
class="card-archive-list-count-unit">篇</span></div>
</a></li>
<li class="card-archive-list-item"><a class="card-archive-list-link"
href="archives/2020/index.html"><span
class="card-archive-list-date">2020</span>
<div class="card-archive-list-count-group"><span class="card-archive-list-count">319</span><span
class="card-archive-list-count-unit">篇</span></div>
</a></li>
<li class="card-archive-list-item"><a class="card-archive-list-link"
href="archives/2019/index.html"><span
class="card-archive-list-date">2019</span>
<div class="card-archive-list-count-group"><span class="card-archive-list-count">62</span><span
class="card-archive-list-count-unit">篇</span></div>
</a></li>
<li class="card-archive-list-item"><a class="card-archive-list-link"
href="archives/2018/index.html"><span
class="card-archive-list-date">2018</span>
<div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span
class="card-archive-list-count-unit">篇</span></div>
</a></li>
<li class="card-archive-list-item"><a class="card-archive-list-link"
href="archives/2017/index.html"><span
class="card-archive-list-date">2017</span>
<div class="card-archive-list-count-group"><span class="card-archive-list-count">6</span><span
class="card-archive-list-count-unit">篇</span></div>
</a></li>
<li class="card-archive-list-item"><a class="card-archive-list-link"
href="archives/2016/index.html"><span
class="card-archive-list-date">2016</span>
<div class="card-archive-list-count-group"><span class="card-archive-list-count">3</span><span
class="card-archive-list-count-unit">篇</span></div>
</a></li>
<li class="card-archive-list-item"><a class="card-archive-list-link"
href="archives/2015/index.html"><span
class="card-archive-list-date">2015</span>
<div class="card-archive-list-count-group"><span class="card-archive-list-count">19</span><span
class="card-archive-list-count-unit">篇</span></div>
</a></li>
</ul>
</div>
</div>
</div>
<div class="button-group">
<div class="console-btn-item"><a class="darkmode_switchbutton" href="javascript:void(0);"
onclick="rm.switchDarkMode()" rel="external nofollow" title="显示模式切换"><i
class="fa-duotone fa-moon" style="font-size:1rem"></i></a></div>
<div class="console-btn-item" id="consoleKeyboard" onclick="heo.keyboardToggle()" title="快捷键开关"><a
class="keyboard-switch"><i class="fa-duotone fa-keyboard"></i></a></div>
<div class="console-btn-item" id="assist-open" onclick="heo.hideConsole()" title="无障碍工具栏"><a
class="assist-btn"><i class="fa-duotone fa-wheelchair"></i></a></div>
<div class="console-btn-item" id="consoleCommentBarrage" onclick="heo.switchCommentBarrage()" title="热评开关">
<a class="commentBarrage"><i class="fa-solid fa-message-captions"></i></a></div>
<div class="console-btn-item" id="consoleMusic" onclick="heo.musicToggle()" title="音乐开关"><a
class="music-switch"><i class="fa-duotone fa-music"></i></a></div>
</div>
<div class="console-mask" href="javascript:void(0);" onclick="heo.hideConsole()" rel="external nofollow"></div>
</div>
<!-- 侧边栏 -->
<div id="sidebar">
<div id="menu-mask"></div>
<div id="sidebar-menus">
<div class="author-avatar"></div>
<div class="site-data">
<div class="data-item is-center">
<div class="data-item-link"><a href="archives/index.html">
<div class="headline">文章</div>
<div class="length-num">649</div>
</a></div>
</div>
<div class="data-item is-center">
<div class="data-item-link"><a href="tags/index.html">
<div class="headline">标签</div>
<div class="length-num">47</div>
</a></div>
</div>
<div class="data-item is-center">
<div class="data-item-link"><a href="categories/index.html">
<div class="headline">分类</div>
<div class="length-num">11</div>
</a></div>
</div>
</div>
<hr>
<div class="menus_items">
<div class="menus_item"><a class="site-page" href="javascript:void(0);"
rel="external nofollow"><span>文库</span><i
class="fas fa-chevron-down expand"></i></a>
<ul class="menus_item_child">
<li><a class="site-page child" href="archives/index.html"><i
class="fa-fw fa-duotone fa-list-timeline"></i> <span>文章列表</span></a></li>
<li><a class="site-page child" href="categories/index.html"><i
class="fa-fw fa-duotone fa-list-tree"></i> <span>全部分类</span></a></li>
<li><a class="site-page child" href="tags/index.html"><i class="fa-fw fa-duotone fa-tags"></i>
<span>全部标签</span></a></li>
<li><a class="site-page child" href="essay/index.html"><i
class="fa-fw fa-duotone fa-rectangles-mixed"></i> <span>即刻短文</span></a></li>
</ul>
</div>
<div class="menus_item"><a class="site-page" href="javascript:void(0);"
rel="external nofollow"><span>专栏</span><i
class="fas fa-chevron-down expand"></i></a>
<ul class="menus_item_child">
<li><a class="site-page child" href="tags/%E8%AE%BE%E8%AE%A1%E6%8A%A5%E5%91%8A/index.html"><i
class="fa-fw fa-duotone fa-swatchbook"></i> <span>设计报告</span></a></li>
<li><a class="site-page child" href="tags/Heocan/index.html"><i
class="fa-fw fa-duotone fa-pen-paintbrush"></i> <span>设计分享</span></a></li>
<li><a class="site-page child" href="tags/Sketch/index.html"><i
class="fa-fw fa-duotone fa-palette"></i> <span>设计工具</span></a></li>
<li><a class="site-page child" href="tags/%E6%B7%B7%E5%89%AA/index.html"><i
class="fa-fw fa-duotone fa-scissors"></i> <span>视频混剪</span></a></li>
</ul>
</div>
<div class="menus_item"><a class="site-page" href="javascript:void(0);"
rel="external nofollow"><span>友链</span><i
class="fas fa-chevron-down expand"></i></a>
<ul class="menus_item_child">
<li><a class="site-page child" href="moments/index.html"><i
class="fa-fw fa-duotone fa-fish-fins"></i> <span>友链鱼塘</span></a></li>
<li><a class="site-page child" href="link/index.html"><i class="fa-fw fa-duotone fa-user-group"></i>
<span>友情链接</span></a></li>
<li><a class="site-page child" href="javascript:travelling()" rel="external nofollow"><i
class="fa-fw fa-duotone fa-treasure-chest"></i> <span>宝藏博主</span></a></li>
</ul>
</div>
<div class="menus_item"><a class="site-page" href="javascript:void(0);"
rel="external nofollow"><span>我的</span><i
class="fas fa-chevron-down expand"></i></a>
<ul class="menus_item_child">
<li><a class="site-page child" href="tlink/index.html"><i
class="fa-fw fa-duotone fa-screwdriver-wrench"></i> <span>在线工具</span></a></li>
<li><a class="site-page child" href="movies/index.html"><i
class="fa-fw fa-duotone fa-film-simple"></i> <span>电影推荐</span></a></li>
<li><a class="site-page child" href="about/index.html"><i
class="fa-fw fa-duotone fa-face-awesome"></i> <span>关于本站</span></a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="page" id="body-wrap">
<!-- 头部导航栏 -->
<header th:replace="modules/header :: header"></header>
<div id="home_top">
<!-- 每日说说 -->
<div th:replace="modules/time-list :: time-list"></div>
<!-- 置顶内容 -->
<div th:replace="modules/top-post :: top-post"></div>
</div>
<main class="layout" id="content-inner">
<div class="recent-posts" id="recent-posts">
<!-- 分类导航栏 -->
<div th:replace="modules/category-bar :: category-bar"></div>
<th:block th:replace="modules/post-list :: post-list"></th:block>
</div>
<div th:replace="modules/aside :: aside"></div>
</main>
<!--&lt;!&ndash; foot &ndash;&gt;-->
<footer th:replace="modules/footer :: foot"></footer>
</div>
<!--<div th:replace="module/rightside :: rightside"></div>-->
<div id="rightside">
<div id="rightside-config-hide">
<button id="translateLink" title="简繁转换" type="button"></button>
<button id="darkmode" title="浅色和深色模式转换" type="button"><i class="fas fa-adjust"></i></button>
<button id="hide-aside-btn" title="单栏和双栏切换" type="button"><i class="fas fa-arrows-alt-h"></i></button>
</div>
<div id="rightside-config-show">
<button id="rightside_config" title="设置" type="button"><i class="fas fa-cog fa-spin"></i></button>
<button id="go-up" title="回到顶部" type="button"><i class="fas fa-arrow-up"></i></button>
</div>
</div>
<div class="js-pjax">
<div id="rightMenu">
<div class="rightMenu-group rightMenu-small">
<div class="rightMenu-item" id="menu-backward"><i class="fa-solid fa-arrow-left"></i></div>
<div class="rightMenu-item" id="menu-forward"><i class="fa-solid fa-arrow-right"></i></div>
<div class="rightMenu-item" id="menu-refresh"><i class="fa-solid fa-arrow-rotate-right"></i></div>
<div class="rightMenu-item" id="menu-top"><i class="fa-solid fa-arrow-up"></i></div>
</div>
<div class="rightMenu-group rightMenu-line rightMenuPlugin">
<div class="rightMenu-item" id="menu-copytext"><i class="fa-duotone fa-copy"></i><span>复制选中文本</span>
</div>
<div class="rightMenu-item" id="menu-pastetext"><i class="fa-duotone fa-paste"></i><span>粘贴文本</span>
</div>
<a class="rightMenu-item" id="menu-commenttext"><i
class="fa-duotone fa-comment-medical"></i><span>引用到评论</span></a>
<div class="rightMenu-item" id="menu-newwindow"><i
class="fa-duotone fa-window-restore"></i><span>新窗口打开</span></div>
<div class="rightMenu-item" id="menu-copylink"><i
class="fa-duotone fa-link-horizontal"></i><span>复制链接地址</span></div>
<div class="rightMenu-item" id="menu-copyimg"><i class="fa-duotone fa-images"></i><span>复制此图片</span>
</div>
<div class="rightMenu-item" id="menu-downloadimg"><i
class="fa-duotone fa-download"></i><span>下载此图片</span></div>
<div class="rightMenu-item" id="menu-search"><i
class="fa-solid fa-magnifying-glass"></i><span>站内搜索</span></div>
<div class="rightMenu-item" id="menu-searchBaidu"><i
class="fa-solid fa-magnifying-glass"></i><span>百度搜索</span></div>
<div class="rightMenu-item" id="menu-music-toggle"><i class="fas fa-play"></i><span>播放音乐</span></div>
<div class="rightMenu-item" id="menu-music-back"><i
class="fa-duotone fa-backward"></i><span>切换到上一首</span></div>
<div class="rightMenu-item" id="menu-music-forward"><i
class="fa-duotone fa-forward"></i><span>切换到下一首</span></div>
<div class="rightMenu-item" id="menu-music-playlist"
onclick='window.open("https://music.163.com/#/playlist?app_version=8.8.36&amp;id=5197802668","_blank")'>
<i class="fa-duotone fa-list-music"></i><span>查看所有歌曲</span></div>
<div class="rightMenu-item" id="menu-music-copyMusicName"><i class="fa-duotone fa-copy"></i>
<span>复制歌名</span></div>
</div>
<div class="rightMenu-group rightMenu-line rightMenuOther"><a class="rightMenu-item menu-link"
id="menu-randomPost"><i
class="fa-duotone fa-dice"></i><span>随便逛逛</span></a><a class="rightMenu-item menu-link"
href="categories/index.html"><i
class="fa-duotone fa-list-tree"></i><span>博客分类</span></a><a class="rightMenu-item menu-link"
href="tags/index.html"><i
class="fa-duotone fa-tags"></i><span>文章标签</span></a></div>
<div class="rightMenu-group rightMenu-line"><a class="rightMenu-item menu-link" href="cc/index.html"><i
class="fa-solid fa-hand"></i><span>隐私协议</span></a><a class="rightMenu-item menu-link"
href="cc/index.html"><i
class="fa-solid fa-closed-captioning"></i><span>版权协议</span></a></div>
<div class="rightMenu-group rightMenu-line rightMenuOther">
<div class="rightMenu-item" id="menu-copy"><i
class="fa-duotone fa-link-horizontal"></i><span>复制地址</span></div>
<div class="rightMenu-item" id="menu-commentBarrage"><i class="fa-solid fa-message-captions"></i><span
class="menu-commentBarrage-text">关闭热评</span></div>
<div class="rightMenu-item" id="menu-darkmode"><i class="fa-solid fa-moon"></i><span
class="menu-darkmode-text">显示模式</span></div>
<div class="rightMenu-item" id="menu-translate"><i class="fa-duotone fa-language"></i><span>轉為繁體</span>
</div>
</div>
</div>
<div id="rightmenu-mask"></div>
</div>
<div>
<script th:src="@{/assets/js/utils.js}"></script>
<script th:src="@{/assets/js/main.js}"></script>
<script charset="utf-8" data-pjax="" th:src="@{/assets/zhheo/blogex.js}"></script>
<script src="https://cdn.zhheo.com/JS-Heo/translate/tw_cn.js"></script>
<script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/instant.page/5.1.0/instantpage.min.js"
type="module"></script>
<script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/vanilla-lazyload/17.3.1/lazyload.iife.min.js"></script>
<script src="https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/node-snackbar/0.1.16/snackbar.min.js"></script>
<script defer src="https://cdn.zhheo.com/public/algolia/algolia.js"></script>
<script>var preloader = {
endLoading: () => {
//- document.body.style.overflow = 'auto';
document.getElementById('loading-box').classList.add("loaded")
},
initLoading: () => {
//- document.body.style.overflow = '';
document.getElementById('loading-box').classList.remove("loaded")
}
}
window.addEventListener('load', preloader.endLoading())
setTimeout(function () {
preloader.endLoading();
}, 3000)</script>
<div class="js-pjax"></div>
<script>window.addEventListener('load', () => {
const changeContent = (content) => {
if (content === '') return content
content = content.replace(/<img.*?src="(.*?)"?[^\>]+>/ig, '[图片]') // replace image link
content = content.replace(/<a[^>]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, '[链接]') // replace url
content = content.replace(/<pre><code>.*?<\/pre>/gi, '[代码]') // replace code
content = content.replace(/<[^>]+>/g, "") // remove html tag
if (content.length > 150) {
content = content.substring(0, 150) + '...'
}
return content
}
const getComment = () => {
const runTwikoo = () => {
twikoo.getRecentComments({
envId: 'https://twikoo.zhheo.com',
region: '',
pageSize: 6,
includeReply: true
}).then(function (res) {
const twikooArray = res.map(e => {
return {
'content': changeContent(e.comment),
'avatar': e.avatar,
'nick': e.nick,
'url': e.url + '#' + e.id,
'date': new Date(e.created).toISOString()
}
})
saveToLocal.set('twikoo-newest-comments', JSON.stringify(twikooArray), 10 / (60 * 24))
generateHtml(twikooArray)
}).catch(function (err) {
const $dom = document.querySelector('#card-newest-comments .aside-list')
$dom.innerHTML = "无法获取评论,请确认相关配置是否正确"
})
}
if (typeof twikoo === 'object') {
runTwikoo()
} else {
getScript('https://cdn2.tianli0.top/npm/twikoo@1.6.5/dist/twikoo.all.min.js').then(runTwikoo)
}
}
const generateHtml = array => {
let result = ''
if (array.length) {
for (let i = 0; i < array.length; i++) {
result += '<div class=\'aside-list-item\'>'
if (true) {
const name = 'data-lazy-src'
result += `<a href='${array[i].url}' class='thumbnail'><img ${name}='${array[i].avatar}' alt='${array[i].nick}'><div class='name'><span>${array[i].nick}</span></div></a>`
}
result += `<div class='content'>
<a class='comment' href='${array[i].url}'>${array[i].content}</a>
<time datetime="${array[i].date}">${btf.diffDate(array[i].date, true)}</time></div>
</div>`
}
} else {
result += '没有评论'
}
let $dom = document.querySelector('#card-newest-comments .aside-list')
$dom.innerHTML = result
window.lazyLoadInstance && window.lazyLoadInstance.update()
window.pjax && window.pjax.refresh($dom)
}
const newestCommentInit = () => {
if (document.querySelector('#card-newest-comments .aside-list')) {
const data = saveToLocal.get('twikoo-newest-comments')
if (data) {
generateHtml(JSON.parse(data))
} else {
getComment()
}
}
}
newestCommentInit()
document.addEventListener('pjax:complete', newestCommentInit)
})</script>
<script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/qrcodejs/1.0.0/qrcode.min.js"></script>
<script data-pjax=""
src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/Swiper/6.6.2/swiper-bundle.min.js"></script>
<script th:src="@{/assets/zhheo/rightmenu.js}"></script>
<script th:src="@{/assets/zhheo/random.js}"></script>
<script data-pjax th:src="@{/zhheo/commentBarrage.js}"></script>
<script src="https://cdn.zhheo.com/public/waterfall/waterfall.min.js"></script>
<script src="https://cdn.zhheo.com/public/assist/assist-entry.min.js"></script>
<script src="https://cdn.zhheo.com/public/aplayer/Meting2.min.js"></script>
<script src="https://cdn.zhheo.com/public/pjax/pjax.min.js"></script>
<script>let pjaxSelectors = [
'title',
'#config-diff',
'#body-wrap',
'#rightside-config-hide',
'#rightside-config-show',
'.js-pjax'
]
if (false) {
pjaxSelectors.unshift('meta[property="og:image"]', 'meta[property="og:title"]', 'meta[property="og:url"]')
}
var pjax = new Pjax({
elements: 'a:not([target="_blank"])',
selectors: pjaxSelectors,
cacheBust: false,
analytics: false,
scrollRestoration: false
})
document.addEventListener('pjax:send', function () {
// removeEventListener toc scroll
window.removeEventListener('scroll', window.tocScrollFn)
typeof preloader === 'object' && preloader.initLoading()
if (window.aplayers) {
for (let i = 0; i < window.aplayers.length; i++) {
if (!window.aplayers[i].options.fixed) {
window.aplayers[i].destroy()
}
}
}
typeof typed === 'object' && typed.destroy()
//reset readmode
const $bodyClassList = document.body.classList
$bodyClassList.contains('read-mode') && $bodyClassList.remove('read-mode')
})
document.addEventListener('pjax:complete', function () {
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()
typeof chatBtnFn === 'function' && chatBtnFn()
typeof panguInit === 'function' && panguInit()
// google analytics
typeof gtag === 'function' && gtag('config', '', {'page_path': window.location.pathname});
typeof loadMeting === 'function' && document.getElementsByClassName('aplayer').length && loadMeting()
// Analytics
if (false) {
MtaH5.pgv()
}
// prismjs
typeof Prism === 'object' && Prism.highlightAll()
typeof preloader === 'object' && preloader.endLoading()
})
document.addEventListener('pjax:error', (e) => {
if (e.request.status === 404) {
pjax.loadUrl('/404.html')
}
})</script>
<script>!function () {
var d = document.createElement("script");
d.src = "https://lf1-cdn-tos.bytegoofy.com/goofy/ttzz/push.js?b6b512a6a0006dd6fcb565df2b0da0b748a4d749e4d1f2212c129ca4a479426dfd9a9dcb5ced4d7780eb6f3bbd089073c2a6d54440560d63862bbf4ec01bba3a", d.id = "ttzz";
var e = document.getElementsByTagName("script")[0];
e.parentNode.insertBefore(d, e)
}(window)</script>
<script async data-pjax src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
</div>
<div class="js-pjax">
<script>
coverColor(),
removeLoading(),
addRightMenuClickEvent(),
navTitle(),
heo.topPostScroll(),
heo.topCategoriesBarScroll(),
heo.sayhi(),
heo.addTag(),
heo.stopImgRightDrag(),
heo.addFriendLinksInFooter(),
heo.qrcodeCreate(),
heo.hidecookie(),
heo.onlyHome(),
heo.addNavBackgroundInit(),
heo.initIndexEssay(),
heo.changeTimeInEssay(),
heo.reflashEssayWaterFall(),
heo.addMediumInEssay(),
heo.darkModeStatus(),
heo.categoriesBarActive(),
heo.initThemeColor()
</script>
</div>
</body>
</html>

View File

@ -0,0 +1,88 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<th:block th:with="postItems=${posts.items}" th:fragment="post-list">
<!-- card需要添加在没有图片时使用随机图片 -->
<div class="recent-post-item lastestpost-item" th:each="post : ${postItems}">
<div class="post_cover left_radius">
<a th:attr="title=${post.spec.title}" th:href="${post.status.permalink}">
<img class="post_bg" th:alt="${post.spec.title}" th:attr="data-lazy-src=${post.spec.cover}">
</a>
</div>
<!-- 类别非空时 -->
<th:block th:if="${not #lists.isEmpty(post.categories)}">
<a class="article-meta__categories"
th:each="category : ${post.categories}"
th:href="${category.status.permalink}"
th:text="${category.spec.displayName}"
th:title="${category.spec.displayName}">
</a>
</th:block>
<div class="recent-post-info">
<div class="recent-post-info-top">
<span class="lastestpost">最新文章</span>
<a class="article-title"
th:attr="title=${post.spec.title}"
th:href="${post.status.permalink}"
th:text="${post.spec.title}">
</a>
<div class="content" th:text="${post.status.excerpt}"></div>
</div>
<div class="article-meta-wrap">
<!-- tag -->
<th:block th:if="${not #lists.isEmpty(post.tags)}">
<span class="article-meta tags">
<a class="article-meta__tags" event.cancelbubble
onclick="window.event.cancelBubble=!0"
th:each="tag : ${post.tags}"
th:href="${tag.status.permalink}"
th:text="${tag.spec.displayName}"
th:title="${tag.spec.displayName}">
<span class="tags-punctuation">#</span>
</a>
</span>
</th:block>
<!-- 创建时间 -->
<span class="post-meta-date">
<i class="far fa-calendar-alt"></i>
<span class="article-meta-label">创建</span>
<time th:text="${#dates.format(post.spec.publishTime,'yyyy-MM-dd')}"
th:title="${#dates.format(post.spec.publishTime,'yyyy-MM-dd')}">
</time>
</span>
</div>
</div>
</div>
<div th:if="${posts.hasPrevious() || posts.hasNext()}">
<div class="pagination">
<!-- 上一页 -->
<a class="extend prev" data-pjax-state="" rel="prev" th:href="${posts.prevUrl}"
th:if="${posts.hasPrevious()}">
<i class="fas fa-chevron-left fa-fw"></i>
<div class="pagination_tips_prev">上页</div>
</a>
<span class="text-sm" th:text="${posts.page} +'/'+ ${posts.total}"></span>
<!-- 下一页 -->
<a class="extend next" data-pjax-state="" rel="next"
th:href="${posts.nextUrl}"
th:if="${posts.hasNext()}">
<div class="pagination_tips_next">下页</div>
<i class="fas fa-chevron-right fa-fw"></i>
</a>
</div>
</div>
</th:block>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<div id="rightside" th:fragment="rightside">
<div id="rightside-config-hide">
<button id="translateLink" type="button" title="简繁转换"></button>
<button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button>
<button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button>
</div>
<div id="rightside-config-show">
<button id="rightside_config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button>
<button id="go-up" type="button" title="回到顶部"><i class="fas fa-arrow-up"></i></button>
</div>
</div>
</html>

View File

@ -0,0 +1,19 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<div class="bbTimeList container" id="bbTimeList" th:fragment="time-list">
<i class="bber-logo iconfont icon-bblogo"
onclick="pjax.loadUrl(&quot;/essay/&quot;)"
style="font-size:2rem" title="说说"></i>
<div class="swiper-container swiper-no-swiping" id="bbtalk" tabindex="-1">
<div class="swiper-wrapper" id="bber-talk" onclick="pjax.loadUrl(&quot;/essay/&quot;)">
<div class="li-style swiper-slide">
日志模块
</div>
</div>
</div>
<i class="bber-gotobb fas fa-arrow-circle-right" onclick="pjax.loadUrl(&quot;/essay/&quot;)"
title="查看全文"></i></div>
<style>.topGroup .todayCard::after {
box-shadow: 0 -109px 133px -9px #201e1d inset
}</style>
</html>

View File

@ -0,0 +1,307 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<!-- 置顶的文章-->
<div class="recent-top-post-group" id="recent-top-post-group" th:fragment="top-post">
<div class="recent-post-top" id="recent-post-top">
<div id="bannerGroup">
<div id="banners">
<div class="banners-title">
<div class="banners-title-big">分享设计</div>
<div class="banners-title-big">与科技生活</div>
<div class="banners-title-small">ZHHEO.COM</div>
</div>
<div class="tags-group-all">
<div class="tags-group-wrapper">
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#989bf8"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/6302f0748a83b.png"
title="AfterEffect">
</div>
<div class="tags-group-icon" style="background:#fff"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/63030a85d6458.png"
title="Sketch">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#57b6e6"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/6303102c049d1.png"
title="Docker">
</div>
<div class="tags-group-icon" style="background:#4082c3"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/63030fe730a69.png"
title="Photoshop">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#fff"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/630310dea00f5.png"
title="FinalCutPro">
</div>
<div class="tags-group-icon" style="background:#fff"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/63031127e8e2b.png"
title="Python">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#eb6840"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/630311760ca04.png"
title="Swift">
</div>
<div class="tags-group-icon" style="background:#8f55ba"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/630311cf9dded.png"
title="Principle">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#f29e39"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/6303121db0410.png"
title="illustrator">
</div>
<div class="tags-group-icon" style="background:#2c51db"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/630312c06cdc5.png"
title="CSS3">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#f7cb4f"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/630312f898a1c.png"
title="JS">
</div>
<div class="tags-group-icon" style="background:#e9572b"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/6303132113bbb.png"
title="HTML">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#df5b40"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/09/23/632d2d33b1e1b.webp"
title="Git">
</div>
<div class="tags-group-icon" style="background:#e65164"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/09/23/632d2e083fc9b.webp"
title="Apifox">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#989bf8"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/6302f0748a83b.png"
title="AfterEffect">
</div>
<div class="tags-group-icon" style="background:#fff"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/63030a85d6458.png"
title="Sketch">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#57b6e6"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/6303102c049d1.png"
title="Docker">
</div>
<div class="tags-group-icon" style="background:#4082c3"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/63030fe730a69.png"
title="Photoshop">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#fff"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/630310dea00f5.png"
title="FinalCutPro">
</div>
<div class="tags-group-icon" style="background:#fff"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/63031127e8e2b.png"
title="Python">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#eb6840"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/630311760ca04.png"
title="Swift">
</div>
<div class="tags-group-icon" style="background:#8f55ba"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/630311cf9dded.png"
title="Principle">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#f29e39"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/6303121db0410.png"
title="illustrator">
</div>
<div class="tags-group-icon" style="background:#2c51db"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/630312c06cdc5.png"
title="CSS3">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#f7cb4f"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/630312f898a1c.png"
title="JS">
</div>
<div class="tags-group-icon" style="background:#e9572b"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/08/22/6303132113bbb.png"
title="HTML">
</div>
</div>
<div class="tags-group-icon-pair">
<div class="tags-group-icon" style="background:#df5b40"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/09/23/632d2d33b1e1b.webp"
title="Git">
</div>
<div class="tags-group-icon" style="background:#e65164"><img
onerror='this.onerror=null,this.src="https://cdn.zhheo.com/Guli/others/imgerror.png"'
src="https://img.zhheo.com/i/2022/09/23/632d2e083fc9b.webp"
title="Apifox">
</div>
</div>
</div>
</div>
<!-- 随机前往一篇文章 -->
<a id="banner-hover" onclick="toRandomPost()"><span class="bannerText">随便逛逛</span><i
class="fas fa-arrow-right banner-righticon"></i></a></div>
<div class="categoryGroup">
<div class="categoryItem" style="box-shadow:var(--heo-shadow-blue)"><a
class="categoryButton CB1 bikan" href="tags/%E5%BF%85%E7%9C%8B/index.html"><span
class="categoryButtonText">必看精选</span><i class="fas fa-dove"></i></a></div>
<div class="categoryItem" style="box-shadow:var(--heo-shadow-red)"><a
class="categoryButton remen" href="tags/%E7%83%AD%E9%97%A8/index.html"><span
class="categoryButtonText">热门文章</span><i class="fas fa-burn"></i></a></div>
<div class="categoryItem" style="box-shadow:var(--heo-shadow-green)"><a
class="categoryButton shiyong" href="tags/%E6%95%99%E7%A8%8B/index.html"><span
class="categoryButtonText">实用教程</span><i class="fas fa-book"></i></a></div>
</div>
</div>
<div class="topGroup">
<div class="recent-post-item">
<div class="post_cover left_radius"><a href="p/1b0d95ef.html"
title="摸鱼 for Mac - 系统更新界面模拟器高仿苹果macOS系统升级黑屏界面"><span
class="recent-post-top-text"
onclick="pjax.loadUrl(&quot;/p/1b0d95ef.html&quot;)">荐</span> <img
alt="摸鱼 for Mac - 系统更新界面模拟器高仿苹果macOS系统升级黑屏界面"
class="post_bg"
data-lazy-src="https://p.zhheo.com/eHesos21190681656557411689.png!cover"
onerror='this.onerror=null,this.src="https://img.zhheo.com/i/2022/08/31/630efd3d82799.webp"'></a>
</div>
<div class="recent-post-info" onclick="pjax.loadUrl(&quot;/p/1b0d95ef.html&quot;)"><a
class="article-title" href="p/1b0d95ef.html"
title="摸鱼 for Mac - 系统更新界面模拟器高仿苹果macOS系统升级黑屏界面">摸鱼 for Mac -
系统更新界面模拟器高仿苹果macOS系统升级黑屏界面</a></div>
</div>
<div class="recent-post-item">
<div class="post_cover right_radius"><a href="p/5115d869.html" title="微信表情:熊猫二憨已上线!"><span
class="recent-post-top-text"
onclick="pjax.loadUrl(&quot;/p/5115d869.html&quot;)">荐</span> <img
alt="微信表情:熊猫二憨已上线!"
class="post_bg"
data-lazy-src="https://p.zhheo.com/PvbpiY20190381646706601470.png!cover"
onerror='this.onerror=null,this.src="https://img.zhheo.com/i/2022/08/31/630efd3d82799.webp"'></a>
</div>
<div class="recent-post-info" onclick="pjax.loadUrl(&quot;/p/5115d869.html&quot;)"><a
class="article-title" href="p/5115d869.html"
title="微信表情:熊猫二憨已上线!">微信表情:熊猫二憨已上线!</a>
</div>
</div>
<div class="recent-post-item">
<div class="post_cover left_radius"><a href="p/9df485ea.html"
title="比例计 for Mac - 设计师的比例计算工具|比例计算 尺寸计算 常用比例 比例计算器"><span
class="recent-post-top-text"
onclick="pjax.loadUrl(&quot;/p/9df485ea.html&quot;)">荐</span> <img
alt="比例计 for Mac - 设计师的比例计算工具|比例计算 尺寸计算 常用比例 比例计算器"
class="post_bg"
data-lazy-src="https://p.zhheo.com/BDDRvO24291281640141622573.png!cover"
onerror='this.onerror=null,this.src="https://img.zhheo.com/i/2022/08/31/630efd3d82799.webp"'></a>
</div>
<div class="recent-post-info" onclick="pjax.loadUrl(&quot;/p/9df485ea.html&quot;)"><a
class="article-title" href="p/9df485ea.html"
title="比例计 for Mac - 设计师的比例计算工具|比例计算 尺寸计算 常用比例 比例计算器">比例计
for Mac - 设计师的比例计算工具|比例计算 尺寸计算 常用比例 比例计算器</a></div>
</div>
<div class="recent-post-item">
<div class="post_cover right_radius"><a href="p/a170ac02.html"
title="DelSpace3 for Mac - 文本处理工具|去空行 去空格 正则表达式替换"><span
class="recent-post-top-text"
onclick="pjax.loadUrl(&quot;/p/a170ac02.html&quot;)">荐</span> <img
alt="DelSpace3 for Mac - 文本处理工具|去空行 去空格 正则表达式替换"
class="post_bg"
data-lazy-src="https://p.zhheo.com/rcVHOw24491281640158664890.png!cover"
onerror='this.onerror=null,this.src="https://img.zhheo.com/i/2022/08/31/630efd3d82799.webp"'></a>
</div>
<div class="recent-post-info" onclick="pjax.loadUrl(&quot;/p/a170ac02.html&quot;)"><a
class="article-title" href="p/a170ac02.html"
title="DelSpace3 for Mac - 文本处理工具|去空行 去空格 正则表达式替换">DelSpace3 for Mac
- 文本处理工具|去空行 去空格 正则表达式替换</a></div>
</div>
<div class="recent-post-item">
<div class="post_cover left_radius"><a href="p/4db484b3.html"
title="轻节食APP正式上线快速减肥可以从今天开始定个小目标坚持一个月"><span
class="recent-post-top-text"
onclick="pjax.loadUrl(&quot;/p/4db484b3.html&quot;)">荐</span> <img
alt="轻节食APP正式上线快速减肥可以从今天开始定个小目标坚持一个月"
class="post_bg"
data-lazy-src="https://p.zhheo.com/7rZ69c20991281640144589173.png!cover"
onerror='this.onerror=null,this.src="https://img.zhheo.com/i/2022/08/31/630efd3d82799.webp"'></a>
</div>
<div class="recent-post-info" onclick="pjax.loadUrl(&quot;/p/4db484b3.html&quot;)"><a
class="article-title" href="p/4db484b3.html"
title="轻节食APP正式上线快速减肥可以从今天开始定个小目标坚持一个月">轻节食APP正式上线快速减肥可以从今天开始定个小目标坚持一个月</a>
</div>
</div>
<div class="recent-post-item">
<div class="post_cover right_radius"><a href="p/2daa6a7b.html"
title="Sticker-Heo表情发布个人博客的基础表情系列"><span
class="recent-post-top-text"
onclick="pjax.loadUrl(&quot;/p/2daa6a7b.html&quot;)">荐</span> <img
alt="Sticker-Heo表情发布个人博客的基础表情系列"
class="post_bg"
data-lazy-src="https://p.zhheo.com/Kjhrny22490581621235364737.png!cover"
onerror='this.onerror=null,this.src="https://img.zhheo.com/i/2022/08/31/630efd3d82799.webp"'></a>
</div>
<div class="recent-post-info" onclick="pjax.loadUrl(&quot;/p/2daa6a7b.html&quot;)"><a
class="article-title" href="p/2daa6a7b.html"
title="Sticker-Heo表情发布个人博客的基础表情系列">Sticker-Heo表情发布个人博客的基础表情系列</a>
</div>
</div>
<div class="todayCard" id="todayCard"
onclick='window.open("https://www.bilibili.com/video/BV1A841147Ef/")'>
<div class="todayCard-info">
<div class="todayCard-tips">音乐推荐</div>
<div class="todayCard-title">逐星</div>
</div>
<div class="todayCard-cover"
style="background:url(https://img.zhheo.com/i/2022/09/23/632d1625aa0d7.webp) no-repeat center/cover"></div>
<div class="banner-button-group"><a class="banner-button"
onclick="window.event.cancelBubble=!0,heo.hideTodayCard()"><i
class="fas fa-circle-plus"></i><span class="banner-button-text">更多推荐</span></a>
</div>
</div>
</div>
</div>
</div>
</html>

4
templates/page.html Normal file
View File

@ -0,0 +1,4 @@
<!DOCTYPE html>
<html lang="en">
</html>

4
templates/post.html Normal file
View File

@ -0,0 +1,4 @@
<!DOCTYPE html>
<html lang="en">
</html>

4
templates/tag.html Normal file
View File

@ -0,0 +1,4 @@
<!DOCTYPE html>
<html lang="en">
</html>

17
theme.yaml Normal file
View File

@ -0,0 +1,17 @@
apiVersion: theme.halo.run/v1alpha1
kind: Theme
metadata:
name: theme-hao
spec:
displayName: Hao
author:
name: 程序员小航
website: 'https://liuzhihang.com'
description: Halo 2.0 Theme base on Thymeleaf, Referring to Butterfly and Heo
logo: 'https://liuzhihang.com/logo'
website: 'https://liuzhihang.com'
repo: 'https://github.com/liuzhihang/halo-theme-hao'
settingName: "theme-hao-setting"
configMapName: "theme-hao-configMap"
version: 1.0.0
require: 2.0.0