评论区改为自托管 twikoo 前端,并适配主题

- 前端脚本从 jsDelivr 改为自托管 public/assets/js/twikoo.min.js,
  版本与后端对齐(1.7.20)。国内访问 jsDelivr 实测 3 秒以上且常被墙,
  是评论区空白的根因
- 新增 public/assets/css/twikoo-custom.css 主题适配层:选择器加 #twikoo
  前缀以覆盖运行时注入的样式,颜色引用主题变量,自动跟随亮/暗色
- 修复首屏重复初始化:astro:page-load 在首屏也会触发,用 dataset.mounted 去重
- 评论配置移除已无用的 version 字段;README 与操作指南同步更新
This commit is contained in:
dsh
2026-09-14 20:58:37 +08:00
parent 686b1caa7d
commit 0b99eabfbe
6 changed files with 320 additions and 87 deletions
+178
View File
@@ -0,0 +1,178 @@
/*
* twikoo 评论区的主题适配(朱墨留白 / VermilionVoid)
*
* twikoo 的样式是脚本运行时注入到 <head> 的,会排在本文件之后,
* 所以这里的选择器统一加 #twikoo 前缀提高优先级,保证能覆盖它。
*
* 颜色全部引用主题 CSS 变量,因此会自动跟随亮色/暗色,
* 以及 src/data/site.ts 里的 themeHue 主题色。
*/
/* ---------- 容器 ---------- */
#twikoo {
color: var(--foreground);
font-size: 0.9375rem;
line-height: 1.75;
}
#twikoo .tk-comments-title,
#twikoo .tk-comments-title h4 {
color: var(--foreground);
}
/* 评论条数等次要文字 */
#twikoo .tk-comments-count,
#twikoo .tk-comments-count span {
color: var(--muted-foreground);
}
/* ---------- 单条评论 ---------- */
#twikoo .tk-comment {
border-radius: var(--radius);
padding: 0.75rem 0;
}
#twikoo .tk-comment .tk-content {
color: var(--content-secondary);
line-height: 1.8;
}
#twikoo .tk-comment .tk-content a,
#twikoo .tk-content a {
color: var(--primary);
text-decoration: none;
}
#twikoo .tk-comment .tk-content a:hover {
text-decoration: underline;
}
/* 昵称 */
#twikoo .tk-nick,
#twikoo .tk-nick-link {
color: var(--foreground);
font-weight: 500;
}
/* 时间、设备等元信息 */
#twikoo .tk-time,
#twikoo .tk-meta,
#twikoo .tk-tag {
color: var(--muted-foreground);
}
/* 头像圆角跟随主题 */
#twikoo .tk-avatar,
#twikoo .tk-avatar-img {
border-radius: 9999px;
}
/* 展开/回复等操作 */
#twikoo .tk-action-link,
#twikoo .tk-action-icon {
color: var(--muted-foreground);
transition: color 0.2s ease;
}
#twikoo .tk-action-link:hover,
#twikoo .tk-action-icon:hover,
#twikoo .tk-action-icon.tk-is-active {
color: var(--primary);
}
/* 子评论缩进区域 */
#twikoo .tk-replies {
border-left: 2px solid var(--border);
margin-left: 0.5rem;
padding-left: 1rem;
}
/* 分隔线 */
#twikoo hr,
#twikoo .tk-comment + .tk-comment {
border-color: var(--border);
}
/* ---------- 输入区 ---------- */
#twikoo .tk-submit {
color: var(--foreground);
}
#twikoo .tk-input .el-textarea__inner,
#twikoo .el-textarea__inner,
#twikoo .el-input__inner {
background-color: var(--card);
border-color: var(--border);
border-radius: var(--radius);
color: var(--foreground);
box-shadow: none;
}
#twikoo .el-textarea__inner::placeholder,
#twikoo .el-input__inner::placeholder {
color: var(--muted-foreground);
}
#twikoo .el-textarea__inner:focus,
#twikoo .el-input__inner:focus {
border-color: var(--primary);
}
/* 发送按钮 */
#twikoo .el-button--primary {
background-color: var(--primary);
border-color: var(--primary);
color: var(--primary-foreground);
border-radius: var(--radius);
}
#twikoo .el-button--primary:hover,
#twikoo .el-button--primary:focus {
background-color: var(--primary);
border-color: var(--primary);
opacity: 0.88;
}
#twikoo .el-button {
border-radius: var(--radius);
}
/* 登录方式 / 提示文字 */
#twikoo .tk-login-msg,
#twikoo .tk-login-msg a,
#twikoo .tk-admin-warn {
color: var(--muted-foreground);
}
#twikoo .tk-login-msg a:hover {
color: var(--primary);
}
/* 表情面板 */
#twikoo .tk-panel {
background-color: var(--card);
border: 1px solid var(--border);
border-radius: var(--radius);
}
/* ---------- 分页 ---------- */
#twikoo .tk-pagination .el-pager li,
#twikoo .tk-pagination button {
background-color: transparent;
color: var(--muted-foreground);
}
#twikoo .tk-pagination .el-pager li.is-active {
color: var(--primary);
}
/* ---------- 暗色模式微调 ---------- */
.dark #twikoo .tk-comment .tk-content {
color: var(--foreground);
}
.dark #twikoo .el-textarea__inner,
.dark #twikoo .el-input__inner {
background-color: var(--surface-subtle);
color: var(--foreground);
}