feat(v1.2.7): 全面校准文档并精简三个可选 API 配置项文案

- 文档对齐 1.2.7:feed/RSS 聚合改由官方链接管理插件订阅承担、Halo 要求统一 >=2.27.0、补齐设置分组文档、清理与代码不符的描述,并修复正文引用块留白
- 三个可选 API 设置项 help 只保留功能说明,隐私披露统一由 README「外部资源与隐私」与文档站承载;字段恢复按开关条件显示,修正配置块缩进
- audit:external 改为防回潮检查:字段存在、help 不得出现披露文案、README 必须保留隐私披露章节
This commit is contained in:
nxxy335 committed 2026-11-11 22:34:32 +08:00
1 parent c92429d139
commit 5c7c6325b1
34 files changed
+500 -210

No files matched your search

+21 -13
View File
@@ -12,7 +12,7 @@
## 特点 ## 特点
1. **响应式设计** — 适配桌面端与移动端,支持暗色模式,移动端使用动态视口单位适配地址栏 1. **响应式设计** — 适配桌面端与移动端,支持暗色模式,移动端使用动态视口单位适配地址栏
2. **插件兼容性** — 适配 11 款常用 Halo 插件,安装即用;提供页面布局契约,插件前台页面自动复用主题外观 2. **插件兼容性** — 适配 10 款常用 Halo 插件,安装即用;提供页面布局契约,插件前台页面自动复用主题外观
3. **内置灯箱** — 主题内置 LightGallery 灯箱(GPLv3,随主题自托管打包),支持 EXIF 信息展示;安装 lightgallery.js 插件后自动禁用 3. **内置灯箱** — 主题内置 LightGallery 灯箱(GPLv3,随主题自托管打包),支持 EXIF 信息展示;安装 lightgallery.js 插件后自动禁用
4. **可配置性** — 17 个设置分组、126 个配置项,几乎所有模块可独立开关 4. **可配置性** — 17 个设置分组、126 个配置项,几乎所有模块可独立开关
5. **性能优化** — 服务端字数统计(API 扩展包)、图片懒加载与响应式缩略图、首屏整屏吸附(仅首屏边界接管,内容区保留原生滚动)、Hero 离屏停绘、CSS/HTML 压缩;详见[开发指南 - 性能与滚动顺滑](https://nxxy335.top/WarmIsland/customize/development.html) 5. **性能优化** — 服务端字数统计(API 扩展包)、图片懒加载与响应式缩略图、首屏整屏吸附(仅首屏边界接管,内容区保留原生滚动)、Hero 离屏停绘、CSS/HTML 压缩;详见[开发指南 - 性能与滚动顺滑](https://nxxy335.top/WarmIsland/customize/development.html)
@@ -38,29 +38,33 @@
| 服务 / 资源 | 用途 | 涉及的数据类型 | 默认状态 | 关闭 / 替换方法 | | 服务 / 资源 | 用途 | 涉及的数据类型 | 默认状态 | 关闭 / 替换方法 |
| --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- |
| 主题自身静态资源 `/themes/warm-island/assets/*` | 样式、脚本、字体、图标、Logo、内置句子库 | 无(同域请求,不含用户数据) | 始终启用,渲染必需 | 不可关闭;均为随包自托管文件 | | 主题自身静态资源 `/themes/warm-island/assets/*` | 样式、脚本、字体、图标、Logo、内置句子库 | 无(同域请求,不含用户数据) | 始终启用,渲染必需 | 不可关闭;均为随包自托管文件 |
| 自定义一言 API `hero_hitokoto_api` | Hero 首屏随机句子 | 无请求体;发起 GET 时第三方可见访客 IP / User-Agent | **默认不启用**:「描述文案来源」默认「无」,一言元素不渲染,零请求;选择「一言」时自动填入 `https://v1.hitokoto.cn/` | 主题设置 → Hero 首屏 → 描述来源改为「无」或「自定义」,或清空该字段回退到 `assets/data/hitokoto.json` 内置本地句子库 | | 自定义一言 API `hero_hitokoto_api` | Hero 首屏随机句子 | 无请求体;发起 GET 时第三方可见访客 IP / User-Agent | **默认不启用**:「描述文案来源」默认「无」,一言元素不渲染,零请求;该字段默认预填 `https://v1.hitokoto.cn/`,仅在「一言」模式生效 | 主题设置 → Hero 首屏 → 描述来源改为「无」或「自定义」,或清空该字段回退到 `assets/data/hitokoto.json` 内置本地句子库 |
| 自定义 IP 定位主 / 备选 API `welcome_popup_api` / `welcome_popup_fallback_api` | 欢迎弹窗显示「欢迎来自 XX 的朋友」 | **访客 IP** 与第三方返回的粗略地理位置 | **关闭**:两项均留空,弹窗只显示本地欢迎语;且欢迎弹窗开关本身默认关闭。可选接口见下方清单 | 主题设置 → 欢迎弹窗 → 关闭开关,或清空两个 API 字段 | | 自定义 IP 定位主 / 备选 API `welcome_popup_api` / `welcome_popup_fallback_api` | 欢迎弹窗显示「欢迎来自 XX 的朋友」 | **访客 IP** 与第三方返回的粗略地理位置 | **关闭**:两项均留空,弹窗只显示本地欢迎语;且欢迎弹窗开关本身默认关闭。可选接口见下方清单 | 主题设置 → 欢迎弹窗 → 关闭开关,或清空两个 API 字段 |
| 分享按钮:QQ / 微博 / X / Facebook / Telegram | 分享文章到对应平台 | 文章 URL 与标题(写在目标站 URL 参数中) | 默认开启 `qq,wechat,weibo`;**仅在访客点击后**跳转,页面加载时不请求 | 主题设置 → 文章 → 关闭「显示分享按钮」,或在「分享渠道」取消勾选 | | 分享按钮:QQ / 微博 / X / Facebook / Telegram | 分享文章到对应平台 | 文章 URL 与标题(写在目标站 URL 参数中) | 默认开启 `qq,wechat,weibo`;**仅在访客点击后**跳转,页面加载时不请求 | 主题设置 → 文章 → 关闭「显示分享按钮」,或在「分享渠道」取消勾选 |
| 微信分享弹层 | 生成并复制文章链接 | 文章 URL(浏览器本地字符串,不发送) | 与分享按钮一致 | 同上;已移除二维码远程库,改为「复制链接」 | | 微信分享弹层 | 生成并复制文章链接 | 文章 URL(浏览器本地字符串,不发送) | 与分享按钮一致 | 同上;已移除二维码远程库,改为「复制链接」 |
| 页脚备案 / Halo / 应用市场外链 | 备案信息、致谢、插件安装提示 | 无(访客主动点击才跳转) | 由站点配置决定,默认仅显示 Halo 致谢 | 主题设置 → 页脚 → 关闭对应显示项 | | 页脚备案 / Halo / 应用市场外链 | 备案信息、致谢、插件安装提示 | 无(访客主动点击才跳转) | 由站点配置决定,默认仅显示 Halo 致谢 | 主题设置 → 页脚 → 关闭对应显示项 |
| 插件前台页面(豆瓣、Steam、朋友圈、微信读书等) | 展示插件提供的数据 | 由对应插件决定,主题不发起请求 | 安装并启用对应插件后才出现 | 卸载 / 停用对应插件;主题自动降级隐藏 | | 插件前台页面(豆瓣、Steam、微信读书、订阅动态等) | 展示插件提供的数据 | 由对应插件决定,主题不发起请求 | 安装并启用对应插件后才出现 | 卸载 / 停用对应插件;主题自动降级隐藏 |
| 内置 LightGallery 灯箱 | 图片放大预览、EXIF 展示 | 无(本地打包,不联网) | 默认启用 | 安装 lightgallery.js 插件后主题自动让位 | | 内置 LightGallery 灯箱 | 图片放大预览、EXIF 展示 | 无(本地打包,不联网) | 默认启用 | 安装 lightgallery.js 插件后主题自动让位 |
#### 可选第三方接口地址(均为候选值,主题不预置请求) #### 可选第三方接口地址(均为候选值,主题不预置请求)
| 能力 | 设置项 | 可选地址 | | 能力 | 设置项 | 可选地址 |
| --- | --- | --- | | --- | --- | --- |
| Hero 一言 | `hero_hitokoto_api` | `https://v1.hitokoto.cn/`(选择「一言」时自动填入;清空则使用内置本地句子库) | | Hero 一言 | `hero_hitokoto_api` | `https://v1.hitokoto.cn/`(默认预填,仅「一言」模式生效;清空则使用内置本地句子库) |
| IP 定位主接口 | `welcome_popup_api` | `https://myip.ipip.net/json` 或 `https://r.inews.qq.com/api/ip2city?otype=json` | | IP 定位主接口 | `welcome_popup_api` | `https://myip.ipip.net/json` 或 `https://r.inews.qq.com/api/ip2city?otype=json` |
| IP 定位备选接口 | `welcome_popup_fallback_api` | 同上两个地址任选其一,主接口失败时兜底 | | IP 定位备选接口 | `welcome_popup_fallback_api` | 同上两个地址任选其一,主接口失败时兜底 |
**描述文案来源默认为「无」**,可选「一言」「自定义」,此时不渲染一言元素、不发起任何请求。选择「一言」后自动填入 **描述文案来源默认为「无」**,可选「一言」「自定义」,此时不渲染一言元素、不发起任何请求。API 字段默认预填
`https://v1.hitokoto.cn/`;选择「一言」或「自定义」后若把 API 留空,则使用主题内置的本地句子库(零外部请求)。 `https://v1.hitokoto.cn/`(仅「一言」模式生效);选择「一言」或「自定义」后若把 API 留空,则使用主题内置的本地句子库(零外部请求)。
**只有填写后才会向该地址发起请求**,需自行在站点隐私说明中披露,详见本章节「逐项说明」与下方「隐私说明(5.1)」。 **只有填写后才会向该地址发起请求**,需自行在站点隐私说明中披露,详见本章节「逐项说明」与下方「隐私说明(5.1)」。
IP 定位接口同样默认留空;**填写后会把访客 IP 发送给该第三方服务换取地理位置**, IP 定位接口同样默认留空;**填写后会把访客 IP 发送给该第三方服务换取地理位置**,
需自行在站点隐私说明中披露,详见本章节「逐项说明」与下方「隐私说明(5.1)」。主题不会代替站点做这项声明。 需自行在站点隐私说明中披露,详见本章节「逐项说明」与下方「隐私说明(5.1)」。主题不会代替站点做这项声明。
> 三个可选 API 配置项的 `help` 只保留功能说明(候选地址、留空回退规则);完整的第三方数据流向与
> 隐私披露统一在 README「外部资源与隐私」章节和配置文档中说明,主题设置界面不重复展示冗长文案。
> 字段是否显示由对应功能开关决定,且字段可见不等于发起请求:默认值与模板的条件渲染共同保证默认零外部请求。
> 自定义 API 属于**站点管理员主动配置**的可选能力:一旦填写,浏览器会按设置向该第三方发起请求。请自行评估服务商的隐私政策,并在站点隐私说明中补充披露;主题不会代替站点做这项声明。 > 自定义 API 属于**站点管理员主动配置**的可选能力:一旦填写,浏览器会按设置向该第三方发起请求。请自行评估服务商的隐私政策,并在站点隐私说明中补充披露;主题不会代替站点做这项声明。
### 隐私说明(5.1) ### 隐私说明(5.1)
@@ -107,8 +111,7 @@ IP 定位接口同样默认留空;**填写后会把访客 IP 发送给该第
|----------|---------|-------------|------| |----------|---------|-------------|------|
| [瞬间](https://halo.run/store/apps/app-SnwWD) | `PluginMoments` | `/moments` | 瞬间动态页面,支持点赞、评论、标签筛选、顶部封面 | | [瞬间](https://halo.run/store/apps/app-SnwWD) | `PluginMoments` | `/moments` | 瞬间动态页面,支持点赞、评论、标签筛选、顶部封面 |
| [图库](https://halo.run/store/apps/app-BmQJW) | `PluginPhotos` | `/photos` | 图片展示页面,支持分组、灯箱预览 | | [图库](https://halo.run/store/apps/app-BmQJW) | `PluginPhotos` | `/photos` | 图片展示页面,支持分组、灯箱预览 |
| [友情链接](https://halo.run/store/apps/app-hfbQg) | `PluginLinks` | `/links` | 友链展示页面,支持随机排列、随机传送门、评论区开关 | | [友情链接(链接管理)](https://halo.run/store/apps/app-hfbQg) | `PluginLinks` | `/links` | 友链展示页面,支持随机排列、随机传送门、评论区开关;同一插件的 RSS 订阅驱动「订阅」页面 |
| [朋友圈](https://www.halo.run/store/apps/app-yISsV) | `plugin-friends` | `/friends` | RSS 订阅朋友圈页面 |
| [装备管理](https://github.com/chengzhongxue/plugin-equipment) | `equipment` | `/equipments` | 装备展示页面,按分组展示,支持封面图 | | [装备管理](https://github.com/chengzhongxue/plugin-equipment) | `equipment` | `/equipments` | 装备展示页面,按分组展示,支持封面图 |
| [豆瓣](https://github.com/chengzhongxue/plugin-douban) | `plugin-douban` | `/douban` | 豆瓣记录页面,支持类型/状态/标签筛选,默认音乐;需插件 **v1.2.6+**(SQLite 数据结构) | | [豆瓣](https://github.com/chengzhongxue/plugin-douban) | `plugin-douban` | `/douban` | 豆瓣记录页面,支持类型/状态/标签筛选,默认音乐;需插件 **v1.2.6+**(SQLite 数据结构) |
| [Steam 信息展示](https://github.com/Tim0x0/halo-plugin-steam) | `PluginSteam` | `/steam` | Steam 游戏库页面,含用户资料、统计数据、最近游玩、游戏库分页 | | [Steam 信息展示](https://github.com/Tim0x0/halo-plugin-steam) | `PluginSteam` | `/steam` | Steam 游戏库页面,含用户资料、统计数据、最近游玩、游戏库分页 |
@@ -118,22 +121,27 @@ IP 定位接口同样默认留空;**填写后会把访客 IP 发送给该第
| [API 扩展包](https://github.com/HowieHz/halo-plugin-extra-api) | `extra-api` | 全站 | 服务端字数统计、中英文混排排版、可选服务端代码高亮 | | [API 扩展包](https://github.com/HowieHz/halo-plugin-extra-api) | `extra-api` | 全站 | 服务端字数统计、中英文混排排版、可选服务端代码高亮 |
> **注意**:插件需要单独安装,安装后主题会自动适配对应页面。若未安装某插件,对应页面或功能自动隐藏/降级,不会报错。 > **注意**:插件需要单独安装,安装后主题会自动适配对应页面。若未安装某插件,对应页面或功能自动隐藏/降级,不会报错。
>
> **「朋友圈」(`plugin-friends`)插件已不再提供**:原先的 feed / RSS 聚合能力由官方
> **「链接管理」(PluginLinks)插件的订阅**取代,对应下方的「订阅」自定义页面模板。
> 主题保留 `friends.html` 与「朋友圈」设置分组仅用于兼容旧站点,新站点请勿再依赖;
> 插件不可用时会显示空状态,不会报错。
## 自定义页面模板 ## 自定义页面模板
在 Halo 后台「页面 → 新建 → 自定义模板」中选择使用: 在 Halo 后台「页面 → 新建 → 自定义模板」中选择使用(页面地址由 slug 决定,无固定路由):
| 模板名 | 模板文件 | 说明 | | 模板名 | 模板文件 | 说明 |
|--------|---------|------| |--------|---------|------|
| 留言板 | `page_messageboard.html` | 留言墙页面,标题与副标题可配置 | | 留言板 | `page_messageboard.html` | 留言墙页面,标题与副标题可配置 |
| 订阅 | `page_subscriptions.html` | 博友文章订阅动态,依赖链接管理插件的 RSS 订阅,支持分页/下滑加载与列表/网格布局 | | 订阅 | `page_subscriptions.html` | 博友文章订阅动态,由官方链接管理插件的 RSS 订阅提供,支持分页 / 下滑加载与列表 / 网格布局 |
| 微信读书 | `weread.html` | 微信读书书架展示,依赖微信读书插件,访客免登录查看 | | 微信读书 | `weread.html` | 微信读书书架展示,依赖微信读书插件,访客免登录查看 |
## 主要功能 ## 主要功能
### 首页 ### 首页
- Hero 首屏:明暗双背景图、大标题/副标题独立配色、描述文案(默认「无」;选「一言」自动填入 `https://v1.hitokoto.cn/`,清空则使用内置本地句子库;可选自定义文案与自动刷新)、下滑箭头平滑滚动 - Hero 首屏:明暗双背景图、大标题/副标题独立配色、描述文案(默认「无」;API 字段默认预填 `https://v1.hitokoto.cn/`,仅「一言」模式生效,清空则使用内置本地句子库;可选自定义文案与自动刷新)、下滑箭头平滑滚动
- 欢迎弹窗:默认显示纯本地静态欢迎语,支持 5 种位置、会话去重开关;仅在显式配置自定义 IP 定位 API 时才显示访客所在地(见[外部资源与隐私](#外部资源与隐私)) - 欢迎弹窗:默认显示纯本地静态欢迎语,支持 5 种位置、会话去重开关;仅在显式配置自定义 IP 定位 API 时才显示访客所在地(见[外部资源与隐私](#外部资源与隐私))
- 滚动吸附:首屏与内容区之间滚轮/触摸自动吸附,进入内容区后恢复原生自由滚动 - 滚动吸附:首屏与内容区之间滚轮/触摸自动吸附,进入内容区后恢复原生自由滚动
- 文章卡片:可配置显示字数(依赖 API 扩展包)、阅读量、分类、标签、摘要行数 - 文章卡片:可配置显示字数(依赖 API 扩展包)、阅读量、分类、标签、摘要行数
@@ -278,12 +286,12 @@ pnpm smoke
| 页面 | 检查要点 | | 页面 | 检查要点 |
| --- | --- | | --- | --- |
| 首页 | Hero(描述文案默认「无」)、切换「一言」后的自动填充与清空回退、滚动吸附、文章卡片、欢迎弹窗(默认本地文案) | | 首页 | Hero(描述文案默认「无」)、三个可选 API 设置项(help 仅功能说明,隐私披露见 README)、一言 API 清空回退、滚动吸附、文章卡片、欢迎弹窗(默认本地文案) |
| 文章 | 正文 / 代码块配色、目录、分享按钮与微信复制链接、灯箱、点赞 | | 文章 | 正文 / 代码块配色、目录、分享按钮与微信复制链接、灯箱、点赞 |
| 分类 / 标签 / 归档 | 列表、分页、空状态、暗色模式 | | 分类 / 标签 / 归档 | 列表、分页、空状态、暗色模式 |
| 搜索 / 错误页 | 搜索页与空结果状态、404 / 500 兜底页、暗色模式(4.4.1) | | 搜索 / 错误页 | 搜索页与空结果状态、404 / 500 兜底页、暗色模式(4.4.1) |
| 内容与表单 | 标题 / 瞬间正文含尖括号时不执行脚本、JSON-LD 合法、评论与表单校验(4.4.2) | | 内容与表单 | 标题 / 瞬间正文含尖括号时不执行脚本、JSON-LD 合法、评论与表单校验(4.4.2) |
| 友链 / 留言板 / 订阅 | 空字段兜底(作者为空不报错)、表单与分页 | | 友链 / 留言板 / 订阅 | 空字段兜底(作者为空不报错)、表单与分页、订阅动态空状态与插件未安装提示 |
| 全局 | 导航栏、页脚、移动端抽屉、深浅色切换、键盘可达主要导航与搜索、正文对比度、控制台无报错 / 无外部请求(4.4.3 / 4.4.4) | | 全局 | 导航栏、页脚、移动端抽屉、深浅色切换、键盘可达主要导航与搜索、正文对比度、控制台无报错 / 无外部请求(4.4.3 / 4.4.4) |
## 技术栈 ## 技术栈
+1
View File
@@ -0,0 +1 @@
@charset "UTF-8";:root{--bg: #faf7f2;--bg-raised: #f3ede5;--bg-overlay: color-mix(in srgb, var(--bg) 85%, transparent);--ink: #2c2420;--ink-2: #7a6e64;--ink-3: #b5a99e;--rule: #e8e0d6;--accent: #d4764e;--accent-hover: #c4613a;--accent-bg: #fdf0e8;--mist-pink: #f0e4de;--sea-salt: #e8e0d6;--caramel: #8b6f5e;--glass-bg: color-mix(in srgb, var(--bg) 72%, transparent);--glass-border: color-mix(in srgb, var(--rule) 50%, transparent);--shadow-sm: 0 1px 3px color-mix(in srgb, var(--ink) 6%, transparent);--shadow-md: 0 4px 16px color-mix(in srgb, var(--ink) 8%, transparent);--shadow-lg: 0 8px 32px color-mix(in srgb, var(--ink) 12%, transparent);--shadow-glow: 0 0 40px color-mix(in srgb, var(--accent) 15%, transparent)}html.dark{--bg: #1e1c1a;--bg-raised: #292623;--bg-overlay: color-mix(in srgb, var(--bg) 85%, transparent);--ink: #e9e4dd;--ink-2: #aaa096;--ink-3: #7c7268;--rule: #3b362f;--accent: #e89a64;--accent-hover: #f2ad79;--accent-bg: #2c231b;--mist-pink: #2e2823;--sea-salt: #302b26;--caramel: #a38b7b;--glass-bg: color-mix(in srgb, var(--bg) 72%, transparent);--glass-border: color-mix(in srgb, var(--rule) 50%, transparent);--shadow-sm: 0 1px 3px rgba(0, 0, 0, .24);--shadow-md: 0 4px 16px rgba(0, 0, 0, .3);--shadow-lg: 0 8px 32px rgba(0, 0, 0, .4);--shadow-glow: 0 0 40px rgba(232, 154, 100, .12)}html[data-palette=matcha]{--bg: #f6f8f1;--bg-raised: #ecf1e3;--ink: #26302a;--ink-2: #6d7a6e;--ink-3: #a8b3a4;--rule: #dde5d4;--accent: #6f9d52;--accent-hover: #5d8943;--accent-bg: #ecf3e2;--mist-pink: #e7eddc;--sea-salt: #dfe8d3;--caramel: #7d8a68}html[data-palette=matcha].dark{--bg: #1b1f1a;--bg-raised: #252b22;--ink: #e6e9e0;--ink-2: #a3ab9c;--ink-3: #767e70;--rule: #363d33;--accent: #9cc47f;--accent-hover: #aed493;--accent-bg: #242c1f;--mist-pink: #262d22;--sea-salt: #282f24;--caramel: #98a387}html[data-palette=indigo]{--bg: #f5f7fa;--bg-raised: #eaeff5;--ink: #232a33;--ink-2: #66707d;--ink-3: #a3adb8;--rule: #dce2ea;--accent: #4a6fa5;--accent-hover: #3d5d8c;--accent-bg: #e9eff8;--mist-pink: #e2e8f0;--sea-salt: #dbe4ee;--caramel: #707c8e}html[data-palette=indigo].dark{--bg: #191d23;--bg-raised: #222831;--ink: #e4e7ec;--ink-2: #9aa4b1;--ink-3: #6d7683;--rule: #323a45;--accent: #7fa3d1;--accent-hover: #93b4dc;--accent-bg: #1f2632;--mist-pink: #232830;--sea-salt: #252b34;--caramel: #8b95a6}html[data-palette=sakura]{--bg: #faf5f6;--bg-raised: #f3eaec;--ink: #322a2c;--ink-2: #7d6e72;--ink-3: #b4a6aa;--rule: #ecdfe2;--accent: #d97387;--accent-hover: #c85d72;--accent-bg: #fbeef1;--mist-pink: #f2e2e6;--sea-salt: #eddfe3;--caramel: #96757e}html[data-palette=sakura].dark{--bg: #201b1c;--bg-raised: #2a2425;--ink: #ece5e6;--ink-2: #b0a4a7;--ink-3: #7f7276;--rule: #3c3436;--accent: #e89aab;--accent-hover: #f0aec0;--accent-bg: #2d2225;--mist-pink: #2f2729;--sea-salt: #31282a;--caramel: #a88d94}html[data-palette=violet]{--bg: #f7f5fa;--bg-raised: #eeeaf5;--ink: #2b2733;--ink-2: #6f6a7c;--ink-3: #aaa5b6;--rule: #e2ddeb;--accent: #8a6fc0;--accent-hover: #7759ae;--accent-bg: #f0eaf9;--mist-pink: #e8e2f0;--sea-salt: #e3dcee;--caramel: #7f7590}html[data-palette=violet].dark{--bg: #1c1a21;--bg-raised: #26222f;--ink: #e8e5ee;--ink-2: #a49eaf;--ink-3: #746e80;--rule: #373241;--accent: #b49ae0;--accent-hover: #c3ace8;--accent-bg: #262033;--mist-pink: #292434;--sea-salt: #2b2536;--caramel: #948caa}html[data-palette=sea]{--bg: #f3f8f7;--bg-raised: #e8f0ee;--ink: #21302d;--ink-2: #647872;--ink-3: #9fb1ac;--rule: #d9e6e3;--accent: #3d9c8f;--accent-hover: #2f8578;--accent-bg: #e5f3f0;--mist-pink: #dee9e6;--sea-salt: #d6e5e1;--caramel: #6c8680}html[data-palette=sea].dark{--bg: #181f1e;--bg-raised: #212a28;--ink: #e3eae8;--ink-2: #9aaba6;--ink-3: #6d7d79;--rule: #2f3b39;--accent: #6cc3b4;--accent-hover: #82d0c2;--accent-bg: #1d2a27;--mist-pink: #222c2a;--sea-salt: #242e2c;--caramel: #869894}html[data-palette=amber]{--bg: #faf7ef;--bg-raised: #f3eddc;--ink: #322b1e;--ink-2: #7d7360;--ink-3: #b5ab94;--rule: #eae1cb;--accent: #b97f1c;--accent-hover: #9f6a0e;--accent-bg: #f9efd8;--mist-pink: #f0e8d2;--sea-salt: #ebe2ca;--caramel: #96835c}html[data-palette=amber].dark{--bg: #201d16;--bg-raised: #2a261d;--ink: #ebe6d9;--ink-2: #b0a893;--ink-3: #7f7866;--rule: #3c3729;--accent: #e0a83e;--accent-hover: #ebba5c;--accent-bg: #2c251a;--mist-pink: #2f2a1e;--sea-salt: #312c20;--caramel: #a89a76}html[data-palette=plum]{--bg: #f9f4f5;--bg-raised: #f1e8ea;--ink: #2f2427;--ink-2: #796a6f;--ink-3: #b1a2a7;--rule: #e9dde0;--accent: #a4506b;--accent-hover: #8d3f59;--accent-bg: #f7e9ee;--mist-pink: #ecdee2;--sea-salt: #e5d8db;--caramel: #8d6f77}html[data-palette=plum].dark{--bg: #1f1a1b;--bg-raised: #292223;--ink: #eae2e4;--ink-2: #ada0a4;--ink-3: #7c6e73;--rule: #3a3133;--accent: #d98aa3;--accent-hover: #e39fb5;--accent-bg: #2b2023;--mist-pink: #2d2527;--sea-salt: #2f2729;--caramel: #a08890}html[data-palette=graphite]{--bg: #f7f7f6;--bg-raised: #eeedeb;--ink: #262626;--ink-2: #6e6e6c;--ink-3: #ababa8;--rule: #e0e0de;--accent: #3f3f3e;--accent-hover: #262626;--accentLine truncated
+1
View File
@@ -0,0 +1 @@
@charset "UTF-8";:root{--bg: #faf7f2;--bg-raised: #f3ede5;--bg-overlay: color-mix(in srgb, var(--bg) 85%, transparent);--ink: #2c2420;--ink-2: #7a6e64;--ink-3: #b5a99e;--rule: #e8e0d6;--accent: #d4764e;--accent-hover: #c4613a;--accent-bg: #fdf0e8;--mist-pink: #f0e4de;--sea-salt: #e8e0d6;--caramel: #8b6f5e;--glass-bg: color-mix(in srgb, var(--bg) 72%, transparent);--glass-border: color-mix(in srgb, var(--rule) 50%, transparent);--shadow-sm: 0 1px 3px color-mix(in srgb, var(--ink) 6%, transparent);--shadow-md: 0 4px 16px color-mix(in srgb, var(--ink) 8%, transparent);--shadow-lg: 0 8px 32px color-mix(in srgb, var(--ink) 12%, transparent);--shadow-glow: 0 0 40px color-mix(in srgb, var(--accent) 15%, transparent)}html.dark{--bg: #1e1c1a;--bg-raised: #292623;--bg-overlay: color-mix(in srgb, var(--bg) 85%, transparent);--ink: #e9e4dd;--ink-2: #aaa096;--ink-3: #7c7268;--rule: #3b362f;--accent: #e89a64;--accent-hover: #f2ad79;--accent-bg: #2c231b;--mist-pink: #2e2823;--sea-salt: #302b26;--caramel: #a38b7b;--glass-bg: color-mix(in srgb, var(--bg) 72%, transparent);--glass-border: color-mix(in srgb, var(--rule) 50%, transparent);--shadow-sm: 0 1px 3px rgba(0, 0, 0, .24);--shadow-md: 0 4px 16px rgba(0, 0, 0, .3);--shadow-lg: 0 8px 32px rgba(0, 0, 0, .4);--shadow-glow: 0 0 40px rgba(232, 154, 100, .12)}html[data-palette=matcha]{--bg: #f6f8f1;--bg-raised: #ecf1e3;--ink: #26302a;--ink-2: #6d7a6e;--ink-3: #a8b3a4;--rule: #dde5d4;--accent: #6f9d52;--accent-hover: #5d8943;--accent-bg: #ecf3e2;--mist-pink: #e7eddc;--sea-salt: #dfe8d3;--caramel: #7d8a68}html[data-palette=matcha].dark{--bg: #1b1f1a;--bg-raised: #252b22;--ink: #e6e9e0;--ink-2: #a3ab9c;--ink-3: #767e70;--rule: #363d33;--accent: #9cc47f;--accent-hover: #aed493;--accent-bg: #242c1f;--mist-pink: #262d22;--sea-salt: #282f24;--caramel: #98a387}html[data-palette=indigo]{--bg: #f5f7fa;--bg-raised: #eaeff5;--ink: #232a33;--ink-2: #66707d;--ink-3: #a3adb8;--rule: #dce2ea;--accent: #4a6fa5;--accent-hover: #3d5d8c;--accent-bg: #e9eff8;--mist-pink: #e2e8f0;--sea-salt: #dbe4ee;--caramel: #707c8e}html[data-palette=indigo].dark{--bg: #191d23;--bg-raised: #222831;--ink: #e4e7ec;--ink-2: #9aa4b1;--ink-3: #6d7683;--rule: #323a45;--accent: #7fa3d1;--accent-hover: #93b4dc;--accent-bg: #1f2632;--mist-pink: #232830;--sea-salt: #252b34;--caramel: #8b95a6}html[data-palette=sakura]{--bg: #faf5f6;--bg-raised: #f3eaec;--ink: #322a2c;--ink-2: #7d6e72;--ink-3: #b4a6aa;--rule: #ecdfe2;--accent: #d97387;--accent-hover: #c85d72;--accent-bg: #fbeef1;--mist-pink: #f2e2e6;--sea-salt: #eddfe3;--caramel: #96757e}html[data-palette=sakura].dark{--bg: #201b1c;--bg-raised: #2a2425;--ink: #ece5e6;--ink-2: #b0a4a7;--ink-3: #7f7276;--rule: #3c3436;--accent: #e89aab;--accent-hover: #f0aec0;--accent-bg: #2d2225;--mist-pink: #2f2729;--sea-salt: #31282a;--caramel: #a88d94}html[data-palette=violet]{--bg: #f7f5fa;--bg-raised: #eeeaf5;--ink: #2b2733;--ink-2: #6f6a7c;--ink-3: #aaa5b6;--rule: #e2ddeb;--accent: #8a6fc0;--accent-hover: #7759ae;--accent-bg: #f0eaf9;--mist-pink: #e8e2f0;--sea-salt: #e3dcee;--caramel: #7f7590}html[data-palette=violet].dark{--bg: #1c1a21;--bg-raised: #26222f;--ink: #e8e5ee;--ink-2: #a49eaf;--ink-3: #746e80;--rule: #373241;--accent: #b49ae0;--accent-hover: #c3ace8;--accent-bg: #262033;--mist-pink: #292434;--sea-salt: #2b2536;--caramel: #948caa}html[data-palette=sea]{--bg: #f3f8f7;--bg-raised: #e8f0ee;--ink: #21302d;--ink-2: #647872;--ink-3: #9fb1ac;--rule: #d9e6e3;--accent: #3d9c8f;--accent-hover: #2f8578;--accent-bg: #e5f3f0;--mist-pink: #dee9e6;--sea-salt: #d6e5e1;--caramel: #6c8680}html[data-palette=sea].dark{--bg: #181f1e;--bg-raised: #212a28;--ink: #e3eae8;--ink-2: #9aaba6;--ink-3: #6d7d79;--rule: #2f3b39;--accent: #6cc3b4;--accent-hover: #82d0c2;--accent-bg: #1d2a27;--mist-pink: #222c2a;--sea-salt: #242e2c;--caramel: #869894}html[data-palette=amber]{--bg: #faf7ef;--bg-raised: #f3eddc;--ink: #322b1e;--ink-2: #7d7360;--ink-3: #b5ab94;--rule: #eae1cb;--accent: #b97f1c;--accent-hover: #9f6a0e;--accent-bg: #f9efd8;--mist-pink: #f0e8d2;--sea-salt: #ebe2ca;--caramel: #96835c}html[data-palette=amber].dark{--bg: #201d16;--bg-raised: #2a261d;--ink: #ebe6d9;--ink-2: #b0a893;--ink-3: #7f7866;--rule: #3c3729;--accent: #e0a83e;--accent-hover: #ebba5c;--accent-bg: #2c251a;--mist-pink: #2f2a1e;--sea-salt: #312c20;--caramel: #a89a76}html[data-palette=plum]{--bg: #f9f4f5;--bg-raised: #f1e8ea;--ink: #2f2427;--ink-2: #796a6f;--ink-3: #b1a2a7;--rule: #e9dde0;--accent: #a4506b;--accent-hover: #8d3f59;--accent-bg: #f7e9ee;--mist-pink: #ecdee2;--sea-salt: #e5d8db;--caramel: #8d6f77}html[data-palette=plum].dark{--bg: #1f1a1b;--bg-raised: #292223;--ink: #eae2e4;--ink-2: #ada0a4;--ink-3: #7c6e73;--rule: #3a3133;--accent: #d98aa3;--accent-hover: #e39fb5;--accent-bg: #2b2023;--mist-pink: #2d2527;--sea-salt: #2f2729;--caramel: #a08890}html[data-palette=graphite]{--bg: #f7f7f6;--bg-raised: #eeedeb;--ink: #262626;--ink-2: #6e6e6c;--ink-3: #ababa8;--rule: #e0e0de;--accent: #3f3f3e;--accent-hover: #262626;--accentLine truncated
+4 -2
View File
@@ -35,7 +35,9 @@ export default defineConfig({
{ text: '瞬间', link: '/config/moments' }, { text: '瞬间', link: '/config/moments' },
{ text: '图库', link: '/config/photos' }, { text: '图库', link: '/config/photos' },
{ text: '友情链接', link: '/config/links' }, { text: '友情链接', link: '/config/links' },
{ text: '朋友圈', link: '/config/friends' }, { text: '订阅', link: '/config/subscriptions' },
{ text: '欢迎弹窗', link: '/config/welcome-popup' },
{ text: '微信读书', link: '/config/weread' },
{ text: '记得', link: '/config/important-dates' }, { text: '记得', link: '/config/important-dates' },
{ text: '留言板', link: '/config/messageboard' }, { text: '留言板', link: '/config/messageboard' },
{ text: '评论', link: '/config/comment' }, { text: '评论', link: '/config/comment' },
@@ -53,7 +55,7 @@ export default defineConfig({
{ text: '瞬间', link: '/pages/moments' }, { text: '瞬间', link: '/pages/moments' },
{ text: '图库', link: '/pages/photos' }, { text: '图库', link: '/pages/photos' },
{ text: '友情链接', link: '/pages/links' }, { text: '友情链接', link: '/pages/links' },
{ text: '朋友圈', link: '/pages/friends' }, { text: '订阅', link: '/pages/subscriptions' },
{ text: '记得', link: '/pages/important-dates' }, { text: '记得', link: '/pages/important-dates' },
{ text: '自定义页面', link: '/pages/custom-page' }, { text: '自定义页面', link: '/pages/custom-page' },
{ text: '扩展页面', link: '/pages/extended' }, { text: '扩展页面', link: '/pages/extended' },
+35
View File
@@ -1,5 +1,40 @@
# 更新日志 # 更新日志
## v1.2.7
### 文档全面校准(与最新版主题对齐)
- 🔌 **移除「朋友圈」插件的全部使用说明**:`plugin-friends` 已不再提供,原先的 feed / RSS 聚合能力
由官方 **「链接管理」(PluginLinks)插件的订阅**承担。主题的对应实现是 `page_subscriptions.html`
自定义模板与 `subscriptions` 设置分组;新增订阅配置 / 订阅页面文档,删除旧的朋友圈配置与页面文档
- 📌 主题保留 `friends.html` 模板与「朋友圈」设置分组**仅用于兼容旧站点**,`pluginFinder` 检测不到
该插件时会显示空状态;新站点请勿再依赖,文档已明确标注
- ⬆️ 全文统一 Halo 版本要求为 **2.27.0+**(`docs/guide/getting-started.md` 原写 `2.24.0`,与
`theme.yaml` 的 `requires: ">=2.27.0"` 不一致)
- 🧹 清理与代码不符的描述:已移除的光感跟随 `animation_cursor_glow`、主题并不自带的
i18n 国际化、没有对应模板的「足迹页面」;`docs/config/style.md` 补上实际存在的
`click_effect_enabled` / `click_effect_type`
- 📚 补齐此前完全没有文档的三个设置分组:**欢迎弹窗、订阅、微信读书**;自定义页面模板清单
同步为 4 个(默认 / 留言板 / 订阅 / 微信读书)
- 🔢 配置数量统一为 **17 组 / 126 项**,插件适配表按实际 **10 款**校准,VitePress 侧边栏同步调整
- 🔗 所有文档内部相对链接复核为 0 处失效
### 可选 API 设置项文案精简
- ✂️ 主题设置中「自定义 IP 定位主 API」「自定义 IP 定位备选 API」「自定义一言 API」
三个配置项的 `help` 移除三段冗长的隐私披露文案,仅保留功能说明(候选接口地址、留空回退规则)
- 🛡️ 第三方数据流向与隐私披露仍由 README「外部资源与隐私」章节、配置文档与 FAQ 完整承载,
满足 5.1 要求;设置界面文案精简不影响「默认零第三方请求」的结论
- ↩️ 三个字段恢复按功能开关条件显示(「启用欢迎弹窗」开关 / 「描述文案来源」),与 v1.2.6
的设计一致;同时修正三个配置块的缩进,与 `settings.yaml` 其余字段对齐
- 🔒 `pnpm audit:external` 的 5.1 检查改为:三个字段必须存在、`help` 不得回潮出现披露文案、
README 必须保留隐私披露章节
### 正文引用块留白(与上一轮改动合并)
- 🎨 修复文章 / 单页 / 留言板正文引用块文字下方空白过大:块内元素外边距与 `padding` 叠加导致
双层留白,现统一收敛,并折叠编辑器生成的空段落;引用块上下外边距同步收紧
## v1.2.6 ## v1.2.6
> v1.2.5 为审核被拒的未发布版本,从未对外分发;其全部整改内容纳入 v1.2.6 一并发布。 > v1.2.5 为审核被拒的未发布版本,从未对外分发;其全部整改内容纳入 v1.2.6 一并发布。
+2
View File
@@ -22,6 +22,8 @@
| `article_related_title` | 文本 | `相关推荐` | 相关文章标题 | | `article_related_title` | 文本 | `相关推荐` | 相关文章标题 |
| `article_show_share` | 开关 | `true` | 显示分享按钮 | | `article_show_share` | 开关 | `true` | 显示分享按钮 |
| `article_share_title` | 文本 | `分享` | 分享区域标题 | | `article_share_title` | 文本 | `分享` | 分享区域标题 |
| `article_extra_spacing` | 开关 | `true` | 中英文混排自动加空格;依赖「API 扩展包」,插件未安装时自动跳过 |
| `article_extra_highlight` | 开关 | `false` | 服务端代码高亮;依赖「API 扩展包」全量版(含 JS 运行时),开启后替代主题自带配色,环境不支持请勿开启 |
## 详细说明 ## 详细说明
+2 -17
View File
@@ -13,7 +13,6 @@
| `label_search` | 文本 | `搜索` | 搜索按钮的标签文案 | | `label_search` | 文本 | `搜索` | 搜索按钮的标签文案 |
| `label_theme_switch` | 文本 | `切换主题` | 主题切换按钮的标签文案 | | `label_theme_switch` | 文本 | `切换主题` | 主题切换按钮的标签文案 |
| `label_archives_title` | 文本 | `归档` | 归档页面的标题文案 | | `label_archives_title` | 文本 | `归档` | 归档页面的标题文案 |
| `language` | 下拉 | `auto` | 主题界面语言 |
## 详细说明 ## 详细说明
@@ -70,22 +69,8 @@ label_archives_title: "Archives"
``` ```
::: tip ::: tip
标签文案的修改会即时生效,无需重启 Halo。如果使用多语言场景,可以配合 Halo 的多语言插件实现更完整的国际化。 标签文案的修改会即时生效,无需重启 Halo。主题**不内置界面语言切换 / 多语言包**,
::: 需要多语言站点时请使用 Halo 或相应插件提供的能力;主题内置的少量界面文案可通过上方 3 个标签项自定义。
### 语言(language)
设置主题界面的显示语言,影响导航栏、文章页、错误页等所有主题内置文案。提供以下选项:
| 值 | 说明 |
| --- | --- |
| `auto` | 跟随浏览器语言自动匹配(默认) |
| `zh_CN` | 简体中文 |
| `zh_TW` | 繁體中文 |
| `en` | English |
::: tip
选择 `auto` 时,主题会根据访客浏览器的语言设置自动匹配最接近的语言。如果浏览器语言不在支持列表中,将回退到简体中文。
::: :::
## 相关页面 ## 相关页面
+6
View File
@@ -12,6 +12,12 @@
| `footer_show_powered` | 开关 | `true` | 显示「Powered by Halo」 | | `footer_show_powered` | 开关 | `true` | 显示「Powered by Halo」 |
| `footer_show_theme` | 开关 | `true` | 显示主题版本 | | `footer_show_theme` | 开关 | `true` | 显示主题版本 |
| `footer_custom_html` | 代码 | — | 自定义 HTML(统计代码等) | | `footer_custom_html` | 代码 | — | 自定义 HTML(统计代码等) |
| `footer_show_stats` | 开关 | `true` | 在页脚显示全站统计 |
| `footer_stats_items` | 多选 | `post,category,comment,visit` | 统计项:`post` 文章 / `category` 分类 / `comment` 评论 / `visit` 访问 / `upvote` 点赞 / `word` 总字数(总字数依赖「API 扩展包」,未安装时自动隐藏) |
| `footer_show_icp` | 开关 | `false` | 显示 ICP 备案号(开启后 `footer_icp` 才会显示) |
| `footer_show_mps` | 开关 | `false` | 显示公网安备号与徽标 |
| `footer_mps` | 文本 | — | 公网安备号(需开启上方开关) |
| `footer_mps_url` | 文本 | — | 公网安备跳转链接,留空默认 `https://beian.mps.gov.cn/` |
## 详细说明 ## 详细说明
-62
View File
@@ -1,62 +0,0 @@
# 朋友圈
朋友圈模块用于聚合展示你订阅的站点最新动态,类似于 RSS 阅读器的社交化呈现。访客可以在你的站点上浏览友站最新文章,发现更多优质内容。
## 配置项一览
| 配置项 | 类型 | 默认值 | 说明 |
| --- | --- | --- | --- |
| `friends_page_title` | 文本 | `朋友圈` | 页面标题 |
## 前置依赖
::: danger
朋友圈功能依赖 Halo 的 **plugin-friends** 插件。如果未安装此插件,朋友圈页面将无法正常工作。
安装方式:Halo 后台 → **插件** → **安装** → 搜索「朋友圈」或从 [GitHub Releases](https://www.halo.run/store/apps/app-yISsV) 下载安装。
:::
## 详细说明
### 页面标题(friends_page_title)
朋友圈页面的标题,显示在页面顶部。
```yaml
friends_page_title: "朋友圈" # 默认
friends_page_title: "友圈" # 简称
friends_page_title: "Friends" # 英文站点
```
## RSS 订阅说明
朋友圈的核心机制是通过 RSS 订阅聚合友站内容:
1. 在 Halo 后台的 Friends 插件设置中添加友站的 RSS 订阅地址
2. 插件会定期抓取这些 RSS 源的最新文章
3. 朋友圈页面按时间倒序展示所有订阅源的最新文章
### 添加订阅源
1. 登录 Halo 后台管理控制台
2. 进入 **链接** 管理页面
3. 点击 **新建** 或 **编辑** 填写:元数据 **RSS 地址** 友站的 RSS 订阅地址
4. 保存后,插件会在下次抓取周期自动拉取内容,亦可进入 **朋友圈** 自行同步
::: tip
大多数博客平台都提供 RSS 订阅功能。常见的 RSS 地址格式:
- WordPress:`/feed/`
- Halo:`/rss.xml` 或 `/feed/`
- Hexo:`/atom.xml` 或 `/rss2.xml`
- Typecho:`/feed/`
:::
::: warning
RSS 抓取频率取决于插件配置,通常为每 30 分钟到数小时一次。新添加的订阅源可能需要等待一个抓取周期才能在页面显示内容。
:::
## 相关页面
- [友情链接](/config/links) — 友情链接页面配置
- [页脚](/config/footer) — 页脚社交链接配置
- [朋友圈页面](/pages/friends) — 朋友圈模板与结构说明
+15 -8
View File
@@ -10,7 +10,7 @@ Hero 首屏是 WarmIsland 主题的标志性区域,占据首页首屏的全部
| `hero_title` | 文本 | — | 主标题(留空则使用站点标题) | | `hero_title` | 文本 | — | 主标题(留空则使用站点标题) |
| `hero_subtitle` | 文本 | — | 副标题(留空则使用站点副标题) | | `hero_subtitle` | 文本 | — | 副标题(留空则使用站点副标题) |
| `hero_description_mode` | 下拉 | `none` | 描述文案来源:`none` / `hitokoto` / `custom`,默认不显示描述文案 | | `hero_description_mode` | 下拉 | `none` | 描述文案来源:`none` / `hitokoto` / `custom`,默认不显示描述文案 |
| `hero_hitokoto_api` | URL | `https://v1.hitokoto.cn/` | 选「一言」时自动填入官方接口;留空则使用内置本地句子库(零外部请求) | | `hero_hitokoto_api` | URL | `https://v1.hitokoto.cn/` | 默认预填官方接口(描述来源非「无」时显示,仅「一言」模式生效);清空则使用内置本地句子库(零外部请求) |
| `hero_hitokoto_categories` | 多选 | `d, i, k` | 句子类型筛选,仅对自定义 API 生效 | | `hero_hitokoto_categories` | 多选 | `d, i, k` | 句子类型筛选,仅对自定义 API 生效 |
| `hero_custom_description` | 多行文本 | — | 自定义描述文案 | | `hero_custom_description` | 多行文本 | — | 自定义描述文案 |
| `hero_hitokoto_auto_refresh` | 开关 | `false` | 一言自动刷新 | | `hero_hitokoto_auto_refresh` | 开关 | `false` | 一言自动刷新 |
@@ -49,23 +49,30 @@ hero_subtitle: "记录温暖与灵感"
| 值 | 说明 | | 值 | 说明 |
| --- | --- | | --- | --- |
| `none` | **默认**。不显示描述文案,不渲染一言元素,也不发起任何请求 | | `none` | **默认**。不显示描述文案,不渲染一言元素,也不发起任何请求 |
| `hitokoto` | 显示一句话文案;自动填入官方接口 `https://v1.hitokoto.cn/`,清空该字段则使用内置本地句子库 | | `hitokoto` | 显示一句话文案;API 字段默认预填官方接口 `https://v1.hitokoto.cn/`,清空该字段则使用内置本地句子库 |
| `custom` | 显示自定义的描述文案(静态文本,不发起任何请求) | | `custom` | 显示自定义的描述文案(静态文本,不发起任何请求) |
### 一言模式(hitokoto) ### 一言模式(hitokoto)
默认 `none` 时一言元素不渲染。切换到 `hitokoto` 后,设置项「自定义一言 API」自动填入 默认 `none` 时一言元素不渲染。「自定义一言 API」设置项在描述来源非「无」时显示,并默认预填
`https://v1.hitokoto.cn/`,浏览器会向该地址发起 GET 请求获取句子(第三方可见访客 IP / User-Agent)。 `https://v1.hitokoto.cn/`;切换到 `hitokoto` 后该值生效,浏览器会向该地址发起 GET 请求
获取句子(第三方可见访客 IP / User-Agent)。
若把该字段清空,则回退到主题内置的本地句子库 `assets/data/hitokoto.json` 若把该字段清空,则回退到主题内置的本地句子库 `assets/data/hitokoto.json`
(随主题自托管的静态 JSON,零外部请求),每次刷新随机展示一条,也不会因为第三方接口不可用而出现空白。 (随主题自托管的静态 JSON,零外部请求),每次刷新随机展示一条,也不会因为第三方接口不可用而出现空白。
可直接编辑该 JSON 替换成自己喜欢的句子。 可直接编辑该 JSON 替换成自己喜欢的句子。
#### 自定义一言 API(hero_hitokoto_api) #### 自定义一言 API(hero_hitokoto_api)
选择「一言」或「自定义」后才会显示该设置项。选择「一言」时自动填入 `https://v1.hitokoto.cn/`; 该设置项在「描述文案来源」非「无」时显示,`help` 只说明候选地址与留空回退规则;
**选择「一言」或「自定义」后若留空,则使用主题内置的本地句子库(零外部请求)**。 字段默认预填 `https://v1.hitokoto.cn/`,**仅在「一言」模式下生效**。
**只有填写后才会向该地址发起请求**,需自行在站点隐私说明中披露,详见 README「外部资源与隐私」。 **选择「一言」或「自定义」后若把该字段留空,则使用主题内置的本地句子库(零外部请求)**。
也可换成自建实例或其他兼容接口。 只有填写后才会向该地址发起请求,第三方可见访客 IP / User-Agent;完整的数据流向与隐私披露
见 README「外部资源与隐私」章节。也可换成自建实例或其他兼容接口。
::: tip
「描述文案来源」默认「无」时一言元素不渲染,因此即使字段预填了官方地址,
也不会产生任何外部请求。隐私披露统一在 README 与本文档说明,设置界面不重复展示。
:::
::: warning ::: warning
这是站点管理员主动开启的可选能力。把描述文案来源改回「无」、或清空该字段即可随时停止外部请求,无需重装主题。 这是站点管理员主动开启的可选能力。把描述文案来源改回「无」、或清空该字段即可随时停止外部请求,无需重装主题。
+9 -1
View File
@@ -6,8 +6,12 @@
| 配置项 | 类型 | 默认值 | 说明 | | 配置项 | 类型 | 默认值 | 说明 |
| --- | --- | --- | --- | | --- | --- | --- | --- |
| `links_apply_form_enabled` | 开关 | `true` | 页底显示友链申请表单;需插件开启「友链申请」,否则自动隐藏 |
| `links_page_title` | 文本 | `友情链接` | 页面标题 | | `links_page_title` | 文本 | `友情链接` | 页面标题 |
| `links_style` | 下拉 | `cards` | 展示样式:`grid` / `list` / `cards` | | `links_style` | 下拉 | `cards` | 展示样式:`grid` / `list` / `cards` |
| `links_show_comment` | 开关 | `false` | 页面底部显示评论区 |
| `links_random_order` | 开关 | `false` | 友链卡片随机排列 |
| `links_random_portal` | 开关 | `true` | 页面右上角显示「随机传送」按钮 |
## 前置依赖 ## 前置依赖
@@ -15,6 +19,9 @@
友情链接功能依赖 Halo 的 **PluginLinks** 插件。如果未安装此插件,友情链接页面将无法正常工作。 友情链接功能依赖 Halo 的 **PluginLinks** 插件。如果未安装此插件,友情链接页面将无法正常工作。
安装方式:Halo 后台 → **插件** → **安装** → 搜索「链接管理」→ 安装并启用。 安装方式:Halo 后台 → **插件** → **安装** → 搜索「链接管理」→ 安装并启用。
同一个插件还提供 **RSS 订阅能力**(原「朋友圈」插件的 feed 聚合功能已由它取代),
对应主题的[订阅配置](/config/subscriptions)与[订阅页面](/pages/subscriptions)。
::: :::
## 详细说明 ## 详细说明
@@ -65,6 +72,7 @@ PluginLinks 支持链接分组功能。你可以将友链按不同类别分组
## 相关页面 ## 相关页面
- [朋友圈](/config/friends) — 朋友圈页面配置 - [订阅配置](/config/subscriptions) — 同一插件提供的 RSS 订阅动态
- [订阅页面](/pages/subscriptions) — 博友文章动态页面
- [页脚](/config/footer) — 页脚社交链接配置 - [页脚](/config/footer) — 页脚社交链接配置
- [友情链接页面](/pages/links) — 友链模板与结构说明 - [友情链接页面](/pages/links) — 友链模板与结构说明
+1
View File
@@ -10,6 +10,7 @@
| `moments_style` | 下拉 | `cards` | 展示样式:`cards` / `masonry` | | `moments_style` | 下拉 | `cards` | 展示样式:`cards` / `masonry` |
| `moments_loading_mode` | 下拉 | `infinite_scroll` | 加载方式:`infinite_scroll` / `pagination` | | `moments_loading_mode` | 下拉 | `infinite_scroll` | 加载方式:`infinite_scroll` / `pagination` |
| `moments_page_size` | 数字 | `10` | 每页显示数量 | | `moments_page_size` | 数字 | `10` | 每页显示数量 |
| `moments_cover` | 附件 | — | 瞬间页顶部封面图,建议尺寸 1500×500 |
## 前置依赖 ## 前置依赖
+3
View File
@@ -9,6 +9,9 @@
| `navbar_style` | 下拉 | `glass` | 导航栏样式:`glass` / `minimal` / `float` | | `navbar_style` | 下拉 | `glass` | 导航栏样式:`glass` / `minimal` / `float` |
| `navbar_show_search` | 开关 | `true` | 显示搜索按钮 | | `navbar_show_search` | 开关 | `true` | 显示搜索按钮 |
| `navbar_show_theme_switch` | 开关 | `true` | 显示主题切换按钮 | | `navbar_show_theme_switch` | 开关 | `true` | 显示主题切换按钮 |
| `navbar_brand_type` | 下拉 | `title` | 左侧显示:`title` 站点名称 / `logo` Logo |
| `navbar_logo` | 附件 | — | 导航栏 Logo;仅在「Logo」模式下显示,留空回退到基础设置的自定义 Logo |
| `navbar_logo_radius` | 下拉 | `rounded` | Logo 圆角:`square` / `rounded` / `circle`(Logo 模式下生效) |
## 详细说明 ## 详细说明
+6 -7
View File
@@ -14,7 +14,8 @@
| `animation_enabled` | 开关 | `true` | 全局动画总开关 | | `animation_enabled` | 开关 | `true` | 全局动画总开关 |
| `animation_breath` | 开关 | `true` | 呼吸动画效果 | | `animation_breath` | 开关 | `true` | 呼吸动画效果 |
| `animation_scroll_reveal` | 开关 | `true` | 滚动渐入动画 | | `animation_scroll_reveal` | 开关 | `true` | 滚动渐入动画 |
| `animation_cursor_glow` | 开关 | `false` | 光感跟随效果 | | `click_effect_enabled` | 开关 | `false` | 鼠标点击效果总开关 |
| `click_effect_type` | 下拉 | `values` | 点击效果类型(8 种效果 + 关闭,仅在总开关开启时显示) |
| `custom_css` | 代码 | — | 自定义 CSS 代码 | | `custom_css` | 代码 | — | 自定义 CSS 代码 |
## 详细说明 ## 详细说明
@@ -121,13 +122,11 @@ WarmIsland 提供了丰富的动画效果,所有动画都可以独立开关:
滚动渐入动画基于 Intersection Observer API 实现,对性能影响极小。如果页面内容较多,建议保持开启以提升浏览体验。 滚动渐入动画基于 Intersection Observer API 实现,对性能影响极小。如果页面内容较多,建议保持开启以提升浏览体验。
::: :::
#### 光感跟随(animation_cursor_glow) #### 鼠标点击效果(click_effect_enabled / click_effect_type)
启用后,鼠标移动时会在光标附近产生柔和的光晕跟随效果,为页面增添灵动感。 `click_effect_enabled` 默认关闭;开启后 `click_effect_type` 才会显示,可选 8 种效果:
社会主义核心价值观、随机彩色爱心、烟花、烟花波纹、粒子、星星、星星拖尾、粒子拖尾,
::: warning 另可选「关闭」。特效在访客点击时由浏览器本地绘制,不加载远程脚本、不发送任何数据。
光感跟随效果在移动端不会生效(因为移动端没有鼠标光标)。在低端设备上可能会影响渲染性能,如遇卡顿建议关闭。
:::
### 自定义 CSS(custom_css) ### 自定义 CSS(custom_css)
+59
View File
@@ -0,0 +1,59 @@
# 订阅
订阅模块用于展示博友们的最新文章动态(feed / RSS 聚合)。这项能力由 **Halo 官方「链接管理」(PluginLinks)插件的订阅**提供,主题只负责把插件抓取到的订阅动态渲染成页面。
> `plugin-friends`(朋友圈)插件已不再提供,原来的 feed 聚合功能由链接管理插件的订阅取代。
> 主题中的 `friends.html` 模板与「朋友圈」设置分组仅用于兼容旧站点,新站点请使用订阅页面模板,
> 详见[历史兼容说明](#历史兼容说明)。
## 配置项一览
| 配置项 | 类型 | 默认值 | 说明 |
| --- | --- | --- | --- |
| `subscriptions_page_title` | 文本 | `订阅` | 页面标题 |
| `subscriptions_subtitle` | 文本 | `博友们的最新文章` | 页面副标题 |
| `subscriptions_page_size` | 数字 | `20` | 每页展示的动态条数,范围 1–100 |
| `subscriptions_loading_mode` | 下拉 | `pagination` | `pagination` 分页 / `infinite_scroll` 下滑加载 |
| `subscriptions_layout` | 下拉 | `list` | `list` 列表卡片 / `grid` 网格卡片 |
## 前置依赖
::: danger
订阅页面依赖 Halo 官方 **「链接管理」(PluginLinks)** 插件的 RSS 订阅能力,
可在[应用市场](https://www.halo.run/store/apps/app-hfbQg)安装。未安装或未启用订阅时,
页面会显示空状态提示,不会报错。
:::
订阅源由链接管理插件维护(为博友链接配置 RSS 订阅地址、按插件自身的周期抓取),
主题通过 Halo 的 `linkFeedFinder` 读取已抓取的动态列表,不自行抓取、不缓存、不向第三方发起请求。
订阅源的添加入口与抓取频率以所安装插件版本的说明为准。
## 详细说明
### 加载方式(subscriptions_loading_mode)
- `pagination`:页面底部显示「较新 / 较旧」翻页链接,按时间游标分页。
- `infinite_scroll`:滚动到列表底部时自动加载下一页,并显示加载状态与「没有更多了」提示。
### 布局样式(subscriptions_layout)
- `list`:单列宽卡片,默认布局,适合长摘要阅读。
- `grid`:一行三列(窄屏自动降为两列 / 一列),卡片内容垂直排列。
两种方式下每条动态都展示作者头像 / 名称、发布日期、文章标题与摘要,标题与作者链接均带
`rel="noopener noreferrer"`;作者名为空时会显示占位字符,不会因字符串截取报错。
## 历史兼容说明
主题仍保留 `templates/friends.html` 与设置中的「朋友圈」分组(`friends_page_title`),
它们只读取旧 `plugin-friends` 插件的数据。该插件已不再提供,因此:
- 新站点**不要**再创建 `/friends` 页面或依赖这个分组;
- 旧站点若已停用该插件,`friends.html` 会显示空状态而不会报错;
- 需要 feed 聚合时,请改用 `page_subscriptions.html` 订阅模板。
## 相关页面
- [订阅页面](/pages/subscriptions) — 页面结构、模板选择与迁移说明
- [友情链接配置](/config/links) — 同一插件的友链展示配置
- [自定义页面](/pages/custom-page) — 全部自定义页面模板
+44
View File
@@ -0,0 +1,44 @@
# 欢迎弹窗
欢迎弹窗在首页以浮层形式向访客打招呼。**默认关闭**,开启后也只显示主题内置的本地静态欢迎语,
不会自动向任何第三方发起请求。
## 配置项一览
| 配置项 | 类型 | 默认值 | 说明 |
| --- | --- | --- | --- |
| `welcome_popup_enabled` | 开关 | `false` | 启用欢迎弹窗 |
| `welcome_popup_position` | 下拉 | `top-center` | 弹窗位置,共 5 种 |
| `welcome_popup_duration` | 数字 | `5` | 自动消失时间(秒),范围 3–60 |
| `welcome_popup_show_once` | 开关 | `true` | 同一浏览器会话内仅显示一次 |
| `welcome_popup_api` | URL | 留空 | 自定义 IP 定位主 API(可选) |
| `welcome_popup_fallback_api` | URL | 留空 | 自定义 IP 定位备选 API(可选) |
## 弹窗位置
| 值 | 位置 |
| --- | --- |
| `top-center` | 顶端居中(默认) |
| `top-left` / `top-right` | 左上 / 右上 |
| `bottom-left` / `bottom-right` | 左下 / 右下 |
`welcome_popup_show_once` 使用浏览器 `sessionStorage` 记录同会话已显示状态;
关闭该开关后每次访问首页都会弹出。清除浏览器站点数据即可重置。
## 可选的 IP 定位能力(默认关闭)
两个 API 字段仅在「启用欢迎弹窗」开关打开时显示,`help` 只说明候选地址与留空规则;
第三方数据流向与隐私披露由本文档下方条目及 README「外部资源与隐私」章节承载。
字段**默认留空**,此时弹窗只显示本地欢迎语,不发起任何外部请求。
只有管理员显式填写后,浏览器才会向该地址请求并把**访客 IP**暴露给第三方服务以换取粗略地理位置:
- 候选主 / 备选接口:`https://myip.ipip.net/json`、`https://r.inews.qq.com/api/ip2city?otype=json`
- 数据流向与隐私披露要求见 README「外部资源与隐私」章节
- 清空字段或关闭弹窗即可立即停止,无需重装主题
> 主题不预置、不代理这些接口,也不保存访客位置数据;填写前请自行评估服务商的隐私政策。
## 相关页面
- [基础设置](/config/basic) — 站点名称、Logo 等
- [首页](/pages/home) — 首页模块说明
+30
View File
@@ -0,0 +1,30 @@
# 微信读书
微信读书模块用于展示书架与阅读记录,主题提供 `weread.html` 自定义页面模板,
数据由[微信读书插件](https://github.com/yeora26/halo-weread-plugin)提供,访客无需登录即可查看。
::: info
该页面依赖 Halo **2.27+** 的能力;主题声明的兼容范围为 `>=2.27.0`。
:::
## 配置项一览
| 配置项 | 类型 | 默认值 | 说明 |
| --- | --- | --- | --- |
| `weread_page_title` | 文本 | — | 页面标题(顶部标题与浏览器标签页标题);插件自带的标题区会自动隐藏以避免重复 |
| `weread_page_subtitle` | 文本 | — | 页面副标题 |
留空时由模板回退到默认文案,不会导致页面报错。
## 使用方式
1. 安装并启用微信读书插件
2. Halo 后台 → **页面** → **新建** → 自定义模板选择「**微信读书**」(`WeRead`)
3. 发布页面并加入导航菜单
页面地址由创建页面时设定的 slug 决定,主题不提供固定路由。
## 相关页面
- [自定义页面](/pages/custom-page) — 全部自定义页面模板
- [扩展页面](/pages/extended) — 插件前台页面一览
+2 -2
View File
@@ -125,7 +125,7 @@ WarmIsland/
│ │ # LightGallery / ClickEffect / ScrollReveal / ThemeSwitcher 等 │ │ # LightGallery / ClickEffect / ScrollReveal / ThemeSwitcher 等
│ ├── layouts/ # Layout.astro(含页面布局契约渲染模式) │ ├── layouts/ # Layout.astro(含页面布局契约渲染模式)
│ ├── pages/ # index / post / page / archives / categories / category / │ ├── pages/ # index / post / page / archives / categories / category /
│ │ # tags / tag / links / friends / moments / moment / photos / │ │ # tags / tag / links / friends(历史兼容)/ moments / moment / photos /
│ │ # douban / equipments / important-dates / steam / weread / │ │ # douban / equipments / important-dates / steam / weread /
│ │ # page_messageboard / page_subscriptions / layout │ │ # page_messageboard / page_subscriptions / layout
│ └── styles/ # main.scss + 12 个 _*.scss 片段 │ └── styles/ # main.scss + 12 个 _*.scss 片段
@@ -154,7 +154,7 @@ WarmIsland/
| 技术 | 版本 | 用途 | | 技术 | 版本 | 用途 |
|------|------|------| |------|------|------|
| [Halo](https://www.halo.run/) | 2.27+ | 博客运行时,提供 Finder API 与主题渲染 | | [Halo](https://www.halo.run/) | 2.27.0+ | 博客运行时,提供 Finder API 与主题渲染 |
| [Astro](https://astro.build) | 6.x | 组件开发,构建输出静态 `.html` 模板 | | [Astro](https://astro.build) | 6.x | 组件开发,构建输出静态 `.html` 模板 |
| [Thymeleaf](https://www.thymeleaf.org/) | - | Halo 服务端模板引擎(源码里直接写 `th:*`) | | [Thymeleaf](https://www.thymeleaf.org/) | - | Halo 服务端模板引擎(源码里直接写 `th:*`) |
+2 -1
View File
@@ -202,6 +202,7 @@ else if (!stored && prefersDark) { isDark = true; }
| `animation_enabled` | 启用动效 | `true` | | `animation_enabled` | 启用动效 | `true` |
| `animation_breath` | 呼吸动画 | `true` | | `animation_breath` | 呼吸动画 | `true` |
| `animation_scroll_reveal` | 滚动渐入 | `true` | | `animation_scroll_reveal` | 滚动渐入 | `true` |
| `animation_cursor_glow` | 光感跟随 | `false` | | `click_effect_enabled` | 鼠标点击效果 | `false` |
| `click_effect_type` | 点击效果类型(8 种 + 关闭) | `values` |
关闭动效时,`html` 元素添加 `wi-no-animations` 类名。 关闭动效时,`html` 元素添加 `wi-no-animations` 类名。
+21 -7
View File
@@ -116,10 +116,23 @@ v1.2.1 起安装包会保留各版本的哈希资源(v1.1.7 之后全部覆盖
| 瞬间 | [PluginMoments](https://www.halo.run/store/apps/app-SnwWD) | | 瞬间 | [PluginMoments](https://www.halo.run/store/apps/app-SnwWD) |
| 图库 | [PluginPhotos](https://www.halo.run/store/apps/app-BmQJW) | | 图库 | [PluginPhotos](https://www.halo.run/store/apps/app-BmQJW) |
| 友链 | [PluginLinks](https://www.halo.run/store/apps/app-hfbQg) | | 友链 | [PluginLinks](https://www.halo.run/store/apps/app-hfbQg) |
| 朋友圈 | [PluginFriends](https://www.halo.run/store/apps/app-yISsV) | | 订阅动态 | 同为 [PluginLinks](https://www.halo.run/store/apps/app-hfbQg) 的 RSS 订阅能力,需选择「订阅」自定义模板 |
安装并启用插件后,页面会自动显示内容。未安装插件时页面会显示友好的提示信息。 安装并启用插件后,页面会自动显示内容。未安装插件时页面会显示友好的提示信息。
**「朋友圈」插件已不再提供**:feed / RSS 聚合已由官方「链接管理」插件的订阅取代,
主题保留 `friends.html` 模板与「朋友圈」设置分组仅用于兼容旧站点。新站点请新建页面并选择
「订阅」自定义模板,详见 README「自定义页面模板」与[订阅页面](https://nxxy335.top/WarmIsland/pages/subscriptions.html)。
### 原来的「朋友圈」页面不能用了,怎么迁移?
1. 安装 / 启用官方「链接管理」(PluginLinks)插件,把 RSS 订阅源迁到该插件的订阅中
2. Halo 后台 → 页面 → 新建 → 自定义模板选择「订阅」(`page_subscriptions.html`)
3. 在主题设置 → 订阅中调整每页条数、分页 / 下滑加载与列表 / 网格布局
4. 确认动态正常展示后,删除旧的 `/friends` 页面与菜单项
旧的 `friends.html` 检测不到 `plugin-friends` 时只会显示空状态,不会影响站点其他页面。
### 主题会向第三方服务发请求吗? ### 主题会向第三方服务发请求吗?
**默认不会。** 所有脚本、样式、字体、图标、主题 Logo 与一言句子库都随主题自托管, **默认不会。** 所有脚本、样式、字体、图标、主题 Logo 与一言句子库都随主题自托管,
@@ -128,14 +141,14 @@ v1.2.1 起安装包会保留各版本的哈希资源(v1.1.7 之后全部覆盖
1. 访客**主动点击**分享按钮 / 备案链接 / 应用市场链接时才跳转到对应站点; 1. 访客**主动点击**分享按钮 / 备案链接 / 应用市场链接时才跳转到对应站点;
2. 站点管理员在主题设置里**显式填写**了「自定义一言 API」或「自定义 IP 定位 API」—— 2. 站点管理员在主题设置里**显式填写**了「自定义一言 API」或「自定义 IP 定位 API」——
后者会把访客 IP 发送给该第三方服务换取地理位置,**需自行在站点隐私说明中披露**, 后者会把访客 IP 发送给该第三方服务换取地理位置;数据流向与披露要求见
详见 README「外部资源与隐私」。 README「外部资源与隐私」。
可选接口地址(仅作候选,主题不会自动请求): 可选接口地址(仅作候选,主题不会自动请求):
| 能力 | 可选地址 | | 能力 | 可选地址 |
| --- | --- | | --- | --- |
| 一言 | `https://v1.hitokoto.cn/`(选择「一言」时自动填入) | | 一言 | `https://v1.hitokoto.cn/`(默认预填,仅「一言」模式生效) |
| IP 定位主 / 备选 API | `https://myip.ipip.net/json`、`https://r.inews.qq.com/api/ip2city?otype=json` | | IP 定位主 / 备选 API | `https://myip.ipip.net/json`、`https://r.inews.qq.com/api/ip2city?otype=json` |
完整逐项说明见 README 的「外部资源与隐私」章节。发版前可运行 `pnpm audit:external` 复核。 完整逐项说明见 README 的「外部资源与隐私」章节。发版前可运行 `pnpm audit:external` 复核。
@@ -144,10 +157,11 @@ v1.2.1 起安装包会保留各版本的哈希资源(v1.1.7 之后全部覆盖
1. Hero「描述文案来源」**默认为「无」**,此时不显示描述文案、不渲染一言元素,零外部请求; 1. Hero「描述文案来源」**默认为「无」**,此时不显示描述文案、不渲染一言元素,零外部请求;
想显示句子请改为「一言」 想显示句子请改为「一言」
2. 选择「一言」后会自动填入 `https://v1.hitokoto.cn/`,此时才会产生外部请求; 2. 「自定义一言 API」字段在「描述文案来源」非「无」时显示,且默认预填 `https://v1.hitokoto.cn/`,
选择「一言」后该值才生效并产生外部请求;
**把该字段清空即回退到主题内置的 `assets/data/hitokoto.json` 本地句子库(零外部请求)**, **把该字段清空即回退到主题内置的 `assets/data/hitokoto.json` 本地句子库(零外部请求)**,
直接编辑该 JSON 即可替换文案。只有填写后才会向该地址发起请求,需自行在站点隐私说明中披露, 直接编辑该 JSON 即可替换文案。只有填写后才会向该地址发起请求,数据流向与披露要求见
详见 README「外部资源与隐私」 README「外部资源与隐私」
3. 「自定义」模式显示「自定义描述文案」中的静态文本,不发起任何请求; 3. 「自定义」模式显示「自定义描述文案」中的静态文本,不发起任何请求;
「句子类型」筛选仅对填写了 API 的一言模式生效 「句子类型」筛选仅对填写了 API 的一言模式生效
+20 -6
View File
@@ -8,13 +8,15 @@ WarmIsland(暖屿)是一款为 [Halo](https://halo.run) 打造的博客主
- 🌙 **深色模式** — 跟随系统/浅色/深色三种方案,平滑切换 - 🌙 **深色模式** — 跟随系统/浅色/深色三种方案,平滑切换
- 📱 **响应式布局** — 桌面到手机完美适配 - 📱 **响应式布局** — 桌面到手机完美适配
- 📝 **沉浸阅读** — 侧边目录、进度条、代码高亮、图片灯箱 - 📝 **沉浸阅读** — 侧边目录、进度条、代码高亮、图片灯箱
- 🔌 **插件生态** — 瞬间、图库、友链、朋友圈、豆瓣、装备、Steam - 🔌 **插件生态** — 瞬间、图库、友链、订阅动态、豆瓣、装备、Steam
- ⚙️ **灵活配置** — 全维度自定义面板,无需改代码 - 🔒 **默认零第三方请求** — 静态资源全部自托管,可选 API 默认留空
- ⚙️ **灵活配置** — 17 个分组 / 126 个配置项,无需改代码
## 前置要求 ## 前置要求
- Halo >= 2.24.0 - **Halo >= 2.27.0**(主题 `theme.yaml` 声明 `requires: ">=2.27.0"`;页面布局契约与微信读书页面依赖 2.27 的能力)
- 已安装并运行 Halo 实例 - 已安装并运行 Halo 实例
- 如需插件页面(瞬间、图库、友链、订阅等),另需安装对应插件
## 安装方式 ## 安装方式
@@ -33,6 +35,11 @@ WarmIsland(暖屿)是一款为 [Halo](https://halo.run) 打造的博客主
4. 上传下载的 `.zip` 文件 4. 上传下载的 `.zip` 文件
5. 点击 **启用** 激活主题 5. 点击 **启用** 激活主题
::: warning
从源码自行打包时,必须先执行 `pnpm release`(build → snapshot → package)。
只上传源码或漏跑构建的 ZIP 会因缺少 `templates/` 导致首页 404,详见 [FAQ](/faq)。
:::
## 初始配置 ## 初始配置
安装并启用主题后,建议按以下顺序进行初始配置: 安装并启用主题后,建议按以下顺序进行初始配置:
@@ -49,8 +56,8 @@ WarmIsland(暖屿)是一款为 [Halo](https://halo.run) 打造的博客主
进入 **样式设置**: 进入 **样式设置**:
- 选择 **配色方案**(跟随系统/浅色/深色) - 选择 **配色方案**(跟随系统/浅色/深色)与 **主题配色**(11 套预设)
- 设置 **强调色**(默认 `#d4764e` 暖橘色) - 设置 **强调色**(留空则跟随所选配色,暖屿·赤陶为 `#d4764e`)
- 选择 **圆角风格** 和 **容器宽度** - 选择 **圆角风格** 和 **容器宽度**
### 第三步:导航菜单 ### 第三步:导航菜单
@@ -64,7 +71,7 @@ WarmIsland(暖屿)是一款为 [Halo](https://halo.run) 打造的博客主
进入 **Hero 首屏** 设置: 进入 **Hero 首屏** 设置:
- 设置主标题和副标题 - 设置主标题和副标题
- 选择描述文案来源(默认「无」/ 一言 / 自定义);默认不显示描述、不发起请求;选「一言」自动填入 `https://v1.hitokoto.cn/`,清空该字段则使用内置本地句子库(零外部请求) - 选择描述文案来源(默认「无」/ 一言 / 自定义);默认不显示描述、不发起请求;「自定义一言 API」字段在来源非「无」时显示并默认预填 `https://v1.hitokoto.cn/`(仅「一言」模式生效),清空该字段则使用内置本地句子库(零外部请求)
- 可选上传背景图片 - 可选上传背景图片
### 第五步:页脚信息 ### 第五步:页脚信息
@@ -75,7 +82,14 @@ WarmIsland(暖屿)是一款为 [Halo](https://halo.run) 打造的博客主
- 添加社交链接(GitHub、微博等) - 添加社交链接(GitHub、微博等)
- 可选添加自定义 HTML(统计代码等) - 可选添加自定义 HTML(统计代码等)
### 可选:订阅动态页面
如需展示博友文章动态,安装官方「链接管理」(PluginLinks)插件并维护 RSS 订阅源,
再新建一个页面选择「订阅」自定义模板即可。原先的「朋友圈」插件已不再提供,
详见[订阅页面](/pages/subscriptions)。
## 下一步 ## 下一步
- [基础设置](/config/basic) — 完整的主题配置说明 - [基础设置](/config/basic) — 完整的主题配置说明
- [样式设置](/config/style) — 调整配色、圆角、动画 - [样式设置](/config/style) — 调整配色、圆角、动画
- [订阅配置](/config/subscriptions) — feed 聚合动态设置
+29 -14
View File
@@ -2,10 +2,15 @@
**WarmIsland(暖屿)** 是一款为 [Halo](https://halo.run) 打造的博客主题。暖如灯火,静如留白——它以柔和的色调和舒缓的节奏回归内容本身,为记录与阅读留出一方安静从容的角落。 **WarmIsland(暖屿)** 是一款为 [Halo](https://halo.run) 打造的博客主题。暖如灯火,静如留白——它以柔和的色调和舒缓的节奏回归内容本身,为记录与阅读留出一方安静从容的角落。
> 本主题由 AI 开发完成。 > 本项目使用 AI 辅助开发,产出已由开发者完成代码审查、构建产物核验与 Halo 开发生态适配。
它的名字来源于一个画面——深夜里温暖的小岛。我们希望每一个来到你站点的访客,都能感受到那份安静而舒适的氛围。 它的名字来源于一个画面——深夜里温暖的小岛。我们希望每一个来到你站点的访客,都能感受到那份安静而舒适的氛围。
## 环境要求
- Halo **2.27.0 及以上**(`theme.yaml` 的 `requires` 为 `>=2.27.0`):页面布局契约、微信读书页面均依赖 2.27 的能力
- v1.2.0 起内置主题配色系统(纯 CSS 变量实现);更低版本的 Halo 请使用主题 v1.1.x
## 设计理念 ## 设计理念
暖屿的设计围绕三个核心词展开:**温暖、沉浸、精致**。 暖屿的设计围绕三个核心词展开:**温暖、沉浸、精致**。
@@ -28,19 +33,20 @@
- **暖色调设计语言** — 橘色强调色 + 呼吸光球 + 渐变背景 - **暖色调设计语言** — 橘色强调色 + 呼吸光球 + 渐变背景
- **三种导航栏样式** — Glass(毛玻璃)/ Minimal(极简)/ Float(浮动胶囊) - **三种导航栏样式** — Glass(毛玻璃)/ Minimal(极简)/ Float(浮动胶囊)
- **内置配色系统** — 11 套预设调色板,每套含浅色 / 深色完整色板
- **深色模式** — 跟随系统、浅色、深色三种方案,一键切换平滑过渡 - **深色模式** — 跟随系统、浅色、深色三种方案,一键切换平滑过渡
- **动效系统** — 滚动渐入、光感跟随、呼吸动画,均可独立开关 - **动效系统** — 滚动渐入、呼吸动画、点击特效,均可独立开关
### 📝 阅读体验 ### 📝 阅读体验
- **文章目录** — 桌面端侧边悬浮 + 移动端底部抽屉,支持展开模式选项 - **文章目录** — 桌面端侧边悬浮 + 移动端底部抽屉,支持展开模式选项
- **阅读进度条** — 实时显示阅读进度 - **阅读进度条** — 实时显示阅读进度
- **代码高亮** — 由代码高亮插件 / API 扩展包输出,主题提供 Warm / Cold 本地配色,不加载远程脚本 - **代码高亮** — 由代码高亮插件 / API 扩展包输出,主题提供 Warm / Cold 本地配色,不加载远程脚本
- **图片灯箱** — 点击放大,支持左右切换 - **图片灯箱** — 点击放大,支持左右切换与 EXIF 信息
- **图片懒加载** — blur-up 渐显效果,优化加载体验 - **图片懒加载** — blur-up 渐显效果,优化加载体验
- **点赞功能** — 一键点赞,状态持久化 - **点赞功能** — 一键点赞,状态持久化
- **相关文章推荐** — 文章底部推荐相关内容 - **相关文章推荐** — 文章底部推荐相关内容
- **分享功能** — 微博 / X / Facebook / Telegram / 复制链接 - **分享功能** — QQ / 微博 / X / Facebook / Telegram / 复制文章链接
### 📱 响应式 ### 📱 响应式
@@ -49,11 +55,10 @@
- 文章卡片自动切换为上下布局 - 文章卡片自动切换为上下布局
- 目录自动切换为悬浮按钮 + 抽屉 - 目录自动切换为悬浮按钮 + 抽屉
### 🔍 SEO 与国际化 ### 🔍 SEO 与结构化数据
- **Open Graph 元标签** — 优化社交媒体分享预览 - **Open Graph 元标签** — 优化社交媒体分享预览
- **JSON-LD 结构化数据** — 提升搜索引擎理解与展示 - **JSON-LD 结构化数据** — 文章标题 / 作者 / 日期 / 封面,由转义后的 `<meta>` 生成,不拼接不可信字符串
- **i18n 国际化** — 简体中文、繁体中文、英语,支持跟随浏览器自动匹配
### 🔌 插件生态 ### 🔌 插件生态
@@ -64,28 +69,38 @@
| 瞬间 | PluginMoments | Timeline / Cards / Masonry 三种布局 | | 瞬间 | PluginMoments | Timeline / Cards / Masonry 三种布局 |
| 图库 | PluginPhotos | Masonry / Grid / Carousel + 分组浏览 | | 图库 | PluginPhotos | Masonry / Grid / Carousel + 分组浏览 |
| 友情链接 | PluginLinks | Cards / Grid / List 三种布局 | | 友情链接 | PluginLinks | Cards / Grid / List 三种布局 |
| 朋友圈 | plugin-friends | 友站动态时间线 | | 订阅 | PluginLinks(RSS 订阅) | 博友文章动态,分页 / 下滑加载、列表 / 网格布局 |
| 豆瓣 | 豆瓣插件 | 观影/读书/音乐记录 | | 豆瓣 | 豆瓣插件 | 观影/读书/音乐记录 |
| 装备 | 装备插件 | 按分组展示装备清单 | | 装备 | 装备插件 | 按分组展示装备清单 |
| Steam | Steam 插件 | 游戏资料与徽章 | | Steam | Steam 插件 | 游戏资料与徽章 |
| 记得 | plugin-important-dates | 重要日期 / 牵挂的人 / 爱车双视图 |
> 「朋友圈」(`plugin-friends`)插件已不再提供,其 feed 聚合能力由官方「链接管理」插件的订阅取代,
> 详见[订阅页面](/pages/subscriptions)。
### ⚙️ 灵活配置 ### ⚙️ 灵活配置
17 个配置分组、120 余个配置项,覆盖站点的方方面面: 17 个配置分组、126 个配置项,覆盖站点的方方面面:
- 基础信息、样式、导航栏、Hero 首屏 - 基础信息、样式、导航栏、Hero 首屏、欢迎弹窗
- 首页、文章、瞬间、图库、友情链接 - 首页、文章、瞬间、图库、友情链接、订阅
- 朋友圈、留言板、评论、页脚 - 微信读书、记得、留言板、评论、页脚
所有配置都在 Halo 后台的图形化面板中完成,无需修改代码。 所有配置都在 Halo 后台的图形化面板中完成,无需修改代码。
### 🔒 默认零第三方请求
全部脚本、样式、字体、图标、句子库与主题 Logo 随主题自托管;Hero 描述文案默认「无」、
欢迎弹窗默认关闭、两个可选 API 字段默认留空,页面不会自动向第三方发起请求。
详见 README「外部资源与隐私」。
## 技术栈 ## 技术栈
- **Astro 6** — 构建输出 Thymeleaf 模板 - **Astro 6** — 构建输出 Thymeleaf 模板
- **Thymeleaf** — Halo 使用的服务端模板引擎 - **Thymeleaf** — Halo 使用的服务端模板引擎
- **原生 JavaScript + SCSS** — 交互与样式(无 Vue / 无远程运行时) - **原生 JavaScript + SCSS** — 交互与样式(无 Vue / 无远程运行时)
- **LightGallery 2.9.0(GPLv3)** — 图片灯箱,随构建自托管打包 - **LightGallery 2.9.0(GPLv3)** — 图片灯箱,随构建自托管打包
- **LXGW WenKai(OFL 1.1)** — 本地字体分片,无远程字体请求 - **LXGW WenKai(OFL 1.1)** — 本地字体分片,许可证全文随包分发
- **代码高亮** — 交由 Halo 应用市场插件提供,主题只自托管配色 CSS - **代码高亮** — 交由 Halo 应用市场插件提供,主题只自托管配色 CSS
## 适用场景 ## 适用场景
@@ -95,7 +110,7 @@ WarmIsland 适合以下类型的站点:
- 📖 **个人博客** — 记录生活、分享思考 - 📖 **个人博客** — 记录生活、分享思考
- 📸 **摄影站** — 图库页面展示作品 - 📸 **摄影站** — 图库页面展示作品
- 🎮 **游戏博客** — Steam 页面展示游戏资料 - 🎮 **游戏博客** — Steam 页面展示游戏资料
- 📚 **读书笔记** — 豆瓣页面展示阅读记录 - 📚 **读书笔记** — 豆瓣 / 微信读书页面展示阅读记录
- 💭 **碎碎念** — 瞬间页面记录日常灵感 - 💭 **碎碎念** — 瞬间页面记录日常灵感
## 下一步 ## 下一步
+1 -1
View File
@@ -26,7 +26,7 @@ features:
- title: 📝 沉浸阅读 - title: 📝 沉浸阅读
details: 文章目录侧边悬浮、阅读进度条、代码高亮、图片灯箱,打造专注的阅读体验 details: 文章目录侧边悬浮、阅读进度条、代码高亮、图片灯箱,打造专注的阅读体验
- title: 🔌 插件生态 - title: 🔌 插件生态
details: 深度集成瞬间、图库、友情链接、朋友圈、豆瓣、装备、Steam 等插件页面 details: 深度集成瞬间、图库、友情链接、订阅动态、豆瓣、装备、Steam 等插件页面
- title: ⚙️ 灵活配置 - title: ⚙️ 灵活配置
details: 丰富的主题设置面板,涵盖样式、导航、首页、文章、评论等全维度自定义 details: 丰富的主题设置面板,涵盖样式、导航、首页、文章、评论等全维度自定义
--- ---
+30 -13
View File
@@ -1,32 +1,49 @@
# 自定义页面 # 自定义页面
自定义页面是 Halo 的独立页面功能,用于创建关于、友链等独立内容页面。 自定义页面是 Halo 的独立页面功能,用于创建关于、留言板、订阅动态、微信读书等独立内容页面。
## 使用方式 ## 使用方式
1. 进入 Halo 后台 → **页面** → **新建** 1. 进入 Halo 后台 → **页面** → **新建**
2. 填写页面标题和内容 2. 填写页面标题和内容
3. 可选择自定义模板 3. 可选:在「自定义模板」中选择主题提供的模板
4. 发布页面 4. 发布页面,并把页面加入导航菜单
页面地址由创建时设定的 slug 决定,主题不为自定义模板提供固定路由。
## 页面模板 ## 页面模板
主题提供以下自定义页面模板: `theme.yaml` 中注册了 3 个自定义模板,加上默认的 `page.html` 共 4 种:
| 模板 | 文件 | 说明 | | 模板 | 模板文件 | 说明 |
|------|------|------| |------|---------|------|
| 默认 | page.html | 标准内容页面 | | 默认 | `page.html` | 标准内容页面 |
| 留言板 | page_messageboard.html | 带评论的留言板页面 | | 留言板(MessageBoard) | `page_messageboard.html` | 带评论的留言墙,标题与副标题可配置 |
| 订阅(Subscriptions) | `page_subscriptions.html` | 博友文章订阅动态,依赖官方「链接管理」插件的 RSS 订阅 |
| 微信读书(WeRead) | `weread.html` | 微信读书书架,依赖微信读书插件,访客免登录查看 |
### 留言板模板 ### 留言板模板
选择留言板模板后,页面会自动集成评论组件,访客可以直接留言。标题和副标题使用主题设置中的配置。 选择留言板模板后,页面会集成评论组件,访客可以直接留言。标题和副标题在
**主题设置 → 留言板** 中配置,详见[留言板配置](/config/messageboard)。
使用步骤: ### 订阅模板
1. 新建页面,选择自定义模板为「留言板」 feed / RSS 聚合不再依赖已停止提供的「朋友圈」插件,而由官方
2. 在主题设置 → 留言板中配置标题和副标题 「链接管理」(PluginLinks)插件的订阅能力提供。使用步骤:
3. 发布页面,添加到导航菜单
1. 安装并启用[链接管理插件](https://www.halo.run/store/apps/app-hfbQg),维护博友链接的 RSS 订阅源
2. 新建页面,自定义模板选择「订阅」
3. 在**主题设置 → 订阅**中调整每页条数、加载方式与布局,详见[订阅配置](/config/subscriptions)
未安装插件或暂无订阅动态时页面会显示友好提示,不会报错。
完整说明见[订阅页面](/pages/subscriptions)。
### 微信读书模板
选择「微信读书」模板后展示书架与阅读记录,标题 / 副标题在
**主题设置 → 微信读书** 中配置,详见[微信读书配置](/config/weread)。
该页面依赖 Halo 2.27+ 的能力。
## 页面功能 ## 页面功能
+25 -20
View File
@@ -6,31 +6,37 @@ WarmIsland 主题深度集成了多款 Halo 插件,提供了丰富的扩展页
| 页面 | 所需插件 | 路由 | | 页面 | 所需插件 | 路由 |
|------|----------|------| |------|----------|------|
| 瞬间 | [PluginMoments](https://www.halo.run/store/apps/app-SnwWD) | /moments | | 瞬间 | [PluginMoments](https://www.halo.run/store/apps/app-SnwWD) | `/moments` |
| 图库 | [PluginPhotos](https://www.halo.run/store/apps/app-BmQJW) | /photos | | 图库 | [PluginPhotos](https://www.halo.run/store/apps/app-BmQJW) | `/photos` |
| 友情链接 | [PluginLinks](https://www.halo.run/store/apps/app-hfbQg) | /links | | 友情链接 | [PluginLinks](https://www.halo.run/store/apps/app-hfbQg) | `/links` |
| 朋友圈 | [plugin-friends](https://www.halo.run/store/apps/app-yISsV) | /friends | | 订阅动态 | [PluginLinks](https://www.halo.run/store/apps/app-hfbQg)(RSS 订阅) | 自定义页面,无固定路由 |
| 豆瓣 | [plugin-douban](https://www.halo.run/store/apps/app-srBOL) | /douban | | 豆瓣 | [plugin-douban](https://www.halo.run/store/apps/app-srBOL) | `/douban` |
| 装备 | [equipment](https://www.halo.run/store/apps/app-ytygyqml) | /equipments | | 装备 | [equipment](https://www.halo.run/store/apps/app-ytygyqml) | `/equipments` |
| 足迹 | [footprint](https://www.halo.run/store/apps/app-XCtAQ) | /footprints | | Steam | [steam](https://www.halo.run/store/apps/app-0ojqyzfh) | `/steam` |
| Steam | [steam](https://www.halo.run/store/apps/app-0ojqyzfh) | /steam | | 记得 | [plugin-important-dates](https://github.com/yyliucha/plugin-important-dates) | `/important-dates` |
| 记得 | [plugin-important-dates](https://github.com/yyliucha/plugin-important-dates) | /important-dates |
> 「朋友圈」(`plugin-friends`)插件已不再提供,其 feed / RSS 聚合能力由官方「链接管理」插件的订阅取代。
> 主题保留的 `friends.html` 仅供旧站点兼容,新站点请使用订阅模板,详见[订阅页面](/pages/subscriptions)。
## 订阅页面
订阅页面依赖官方「链接管理」插件的 RSS 订阅,展示博友们的最新文章,
支持分页 / 下滑加载与列表 / 网格布局。它属于自定义页面模板,地址由你创建页面时的 slug 决定。
使用前请在 Halo 后台 → 页面 → 新建 → 自定义模板中选择「订阅」。
详见[订阅页面](/pages/subscriptions)与[订阅配置](/config/subscriptions)。
## 豆瓣页面 ## 豆瓣页面
[豆瓣插件](https://www.halo.run/store/apps/app-srBOL)
展示豆瓣观影/读书/音乐记录,支持按类型和状态筛选。 [豆瓣插件](https://www.halo.run/store/apps/app-srBOL)展示豆瓣观影/读书/音乐记录,支持按类型和状态筛选。
## 装备页面 ## 装备页面
[装备管理插件](https://www.halo.run/store/apps/app-ytygyqml)
展示个人装备清单,按分组分类展示。
## 足迹页面 [装备管理插件](https://www.halo.run/store/apps/app-ytygyqml)展示个人装备清单,按分组分类展示。
[足迹插件](https://www.halo.run/store/apps/app-XCtAQ)
展示个人足迹地图。
## Steam 页面 ## Steam 页面
[Steam](https://www.halo.run/store/apps/app-0ojqyzfh)
展示 Steam 游戏资料,包括: [Steam](https://www.halo.run/store/apps/app-0ojqyzfh)展示 Steam 游戏资料,包括:
- 玩家头像和昵称 - 玩家头像和昵称
- 游戏统计 - 游戏统计
@@ -39,8 +45,7 @@ WarmIsland 主题深度集成了多款 Halo 插件,提供了丰富的扩展页
## 记得页面 ## 记得页面
[记得插件](https://github.com/yyliucha/plugin-important-dates) [记得插件](https://github.com/yyliucha/plugin-important-dates)记录重要的日子、牵挂的人与座驾,「生活 / 爱车」双视图展示:
记录重要的日子、牵挂的人与座驾,「生活 / 爱车」双视图展示:
- 重要日期(含农历)与倒计时便签 - 重要日期(含农历)与倒计时便签
- 牵挂的人:大头贴、昵称、关系与生日倒计时 - 牵挂的人:大头贴、昵称、关系与生日倒计时
-25
View File
@@ -1,25 +0,0 @@
# 朋友圈
朋友圈页面展示订阅的友站最新文章动态,需要安装 [朋友圈插件](https://www.halo.run/store/apps/app-yISsV)。
## 功能说明
页面以时间线形式展示友站更新,每条动态包含:
- 友站名称和头像
- 文章标题和链接
- 发布时间
## 使用方式
1. 在 Halo 后台安装并启用朋友圈插件
2. 在插件设置中添加友站 RSS 订阅源
3. 主题自动读取并展示友站动态
::: tip
朋友圈插件负责数据抓取,主题负责前端展示。如需调整抓取频率或内容,请在插件设置中操作。
:::
## 相关配置
- [朋友圈配置](/config/friends) — 页面标题
+1 -1
View File
@@ -16,7 +16,7 @@ Hero 区域占据整个视口高度,包含:
- **主标题**:默认使用站点标题,可在主题设置中自定义 - **主标题**:默认使用站点标题,可在主题设置中自定义
- **副标题**:默认使用站点副标题 - **副标题**:默认使用站点副标题
- **描述文案**:默认「无」(不显示、零请求);可选「一言」(自动填入 `https://v1.hitokoto.cn/`,清空则用内置本地句子库)或「自定义」静态文案 - **描述文案**:默认「无」(不显示、零请求);可选「一言」(API 字段默认预填 `https://v1.hitokoto.cn/`,清空则用内置本地句子库)或「自定义」静态文案
- **视觉效果**:渐变背景 + 呼吸光球 + 滚动模糊 - **视觉效果**:渐变背景 + 呼吸光球 + 滚动模糊
页面滚动时,Hero 区域会产生模糊效果,内容向上淡出,底部有向下箭头提示滚动。 页面滚动时,Hero 区域会产生模糊效果,内容向上淡出,底部有向下箭头提示滚动。
+2
View File
@@ -29,3 +29,5 @@
## 相关配置 ## 相关配置
- [友情链接配置](/config/links) — 展示样式 - [友情链接配置](/config/links) — 展示样式
- [订阅配置](/config/subscriptions) — 同一插件提供的 RSS 订阅动态
- [订阅页面](/pages/subscriptions) — 博友文章动态页面
+53
View File
@@ -0,0 +1,53 @@
# 订阅页面
订阅页面按时间倒序展示博友们的最新文章,即原先「朋友圈 / feed 聚合」所提供的能力。
现在它由 **Halo 官方「链接管理」(PluginLinks)插件的 RSS 订阅**驱动,主题提供
`page_subscriptions.html` 自定义模板负责前端展示。
## 使用方式
1. 安装并启用 [链接管理插件](https://www.halo.run/store/apps/app-hfbQg),在插件中维护博友链接的 RSS 订阅源
2. 进入 Halo 后台 → **页面** → **新建**
3. 选择自定义模板「**订阅**」(`Subscriptions`,对应 `page_subscriptions.html`)
4. 发布页面,并按需加入导航菜单
> 页面地址由你创建页面时设定的 slug 决定,主题**不提供固定的 `/subscriptions` 路由**;
> 只有插件提供的扩展页面(如 `/links`、`/moments`)才是固定路由。
## 页面内容
每条订阅动态是一张卡片,包含:
- 作者头像(缺失时显示首字占位)、作者名称与主页链接
- 发布日期
- 文章标题(点击跳转原文)、摘要
- 空数据时的友好提示,以及未安装链接管理插件时的安装引导
标题与作者链接均使用 `target="_blank"` + `rel="noopener noreferrer"`,
主题本身不会向第三方发起请求。
## 展示与加载
在[订阅配置](/config/subscriptions)中可调:
| 能力 | 可选值 |
| --- | --- |
| 布局 | 单列列表卡片 / 网格卡片(窄屏自动收敛列数) |
| 加载方式 | 底部分页(较新 / 较旧)/ 下滑自动加载 |
| 每页条数 | 1–100,默认 20 |
| 标题与副标题 | 自定义文本 |
## 从「朋友圈」迁移
`plugin-friends`(朋友圈)插件已不再提供,原来的 `/friends` 页面与「朋友圈」设置分组
仅作为旧站点兼容保留,模板检测到插件不可用时会显示空状态。迁移步骤:
1. 安装 / 启用「链接管理」插件,把原本在朋友圈插件里维护的 RSS 订阅源迁到链接管理插件的订阅中
2. 新建一个页面并选择「订阅」自定义模板
3. 确认动态正常展示后,删除旧的 `/friends` 页面与菜单项
## 相关配置
- [订阅配置](/config/subscriptions) — 全部 5 个设置项
- [友情链接页面](/pages/links) — 同一插件的友链展示
- [扩展页面](/pages/extended) — 插件前台页面一览
+1 -1
View File
@@ -1,5 +1,5 @@
{ {
"version": "1.2.6", "version": "1.2.7",
"type": "module", "type": "module",
"engines": { "engines": {
"node": ">=22.12.0" "node": ">=22.12.0"
+41 -3
View File
@@ -5,7 +5,8 @@
* - 1.4 远程执行与动态加载:禁止远程加载核心代码 / 动态拉取并执行组件 * - 1.4 远程执行与动态加载:禁止远程加载核心代码 / 动态拉取并执行组件
* - 4.4.4 性能与外部资源:不得预连接外部 CDN、加载远程脚本样式、打包无关大资源 * - 4.4.4 性能与外部资源:不得预连接外部 CDN、加载远程脚本样式、打包无关大资源
* - 4.4.2 内容渲染安全:不得把站点内容用 th:utext 拼进 <script> 原始文本 * - 4.4.2 内容渲染安全:不得把站点内容用 th:utext 拼进 <script> 原始文本
* - 5.2 / 2.2:第三方字体必须随包携带许可证全文;上架说明数字必须与配置定义一致 * - 5.1 / 5.2 / 2.2:第三方字体必须随包携带许可证全文;可选 API 的数据流向与隐私披露
* 由 README「外部资源与隐私」及文档站承载;上架说明数字必须与配置定义一致
* - 4.6 / 2.2:不得出现占位内容、无效链接 * - 4.6 / 2.2:不得出现占位内容、无效链接
* *
* 检查项: * 检查项:
@@ -16,6 +17,7 @@
* 5. README 中的相对链接必须在安装包清单中真实存在 * 5. README 中的相对链接必须在安装包清单中真实存在
* 6. 任何 <script> 开标签不得带 th:utext;字体许可证全文必须在制品清单中; * 6. 任何 <script> 开标签不得带 th:utext;字体许可证全文必须在制品清单中;
* README 的设置分组 / 配置项数量必须与 settings.yaml 一致 * README 的设置分组 / 配置项数量必须与 settings.yaml 一致
* 7. 三个可选 API 字段存在且 help 为精简功能说明;隐私披露文案不得回潮到设置界面(5.1)
* *
* 说明:<a href="https://..."> 这类需要访客主动点击的分享 / 备案 / 应用市场外链是允许的, * 说明:<a href="https://..."> 这类需要访客主动点击的分享 / 备案 / 应用市场外链是允许的,
* 不属于「自动外部请求」,但已在 README「外部资源与隐私」章节逐项披露。 * 不属于「自动外部请求」,但已在 README「外部资源与隐私」章节逐项披露。
@@ -181,6 +183,7 @@ export function auditCompliance(entryNames = null) {
const readmePath = path.join(root, "README.md"); const readmePath = path.join(root, "README.md");
let groupCount = 0; let groupCount = 0;
let fieldCount = 0; let fieldCount = 0;
let conciseCount = 0;
if (fs.existsSync(settingsPath) && fs.existsSync(readmePath)) { if (fs.existsSync(settingsPath) && fs.existsSync(readmePath)) {
const settings = fs.readFileSync(settingsPath, "utf8"); const settings = fs.readFileSync(settingsPath, "utf8");
const readme = fs.readFileSync(readmePath, "utf8"); const readme = fs.readFileSync(readmePath, "utf8");
@@ -190,9 +193,44 @@ export function auditCompliance(entryNames = null) {
if (!readme.includes(expected)) { if (!readme.includes(expected)) {
problems.push(`README 配置数量与 settings.yaml 不一致,应为「${expected}」(2.2)`); problems.push(`README 配置数量与 settings.yaml 不一致,应为「${expected}」(2.2)`);
} }
// 4. 5.1 隐私披露:完整的数据流向说明统一由 README「外部资源与隐私」章节及文档站承载,
// 设置界面的三个可选 API 字段只保留精简功能说明,不得回潮出现冗长披露文案。
const apiFields = [
"welcome_popup_api",
"welcome_popup_fallback_api",
"hero_hitokoto_api",
];
const bannedSnippets = [
"需自行在站点隐私说明中披露",
"填写后会把访客 IP 发送给该第三方服务换取地理位置",
"填写后同样会把访客 IP 发送给该第三方服务换取地理位置",
"只有填写后才会向该地址发起请求",
];
const blocks = settings.split(/(?=^[ \t]*-[ \t]+\$formkit:)/m).slice(1);
for (const name of apiFields) {
const block = blocks.find((b) => new RegExp(`^\\s+name:[ \\t]*${name}[ \\t]*$`, "m").test(b));
if (!block) {
problems.push(`settings.yaml 缺少可选 API 配置项 ${name}(5.1 隐私披露)`);
continue;
}
const helpLine = block.split(/\r?\n/).find((line) => /^\s+help:/.test(line)) || "";
if (!helpLine.trim()) {
problems.push(`${name} 缺少 help 功能说明(5.1)`);
continue;
}
if (bannedSnippets.some((snippet) => helpLine.includes(snippet))) {
problems.push(`${name} 的 help 出现了已移除的隐私披露文案(5.1)`);
} else {
conciseCount++;
}
}
if (!readme.includes("外部资源与隐私") || !readme.includes("访客 IP")) {
problems.push("README 缺少可选 API 的隐私披露章节(5.1)");
}
} }
return { problems, groupCount, fieldCount }; return { problems, groupCount, fieldCount, conciseCount };
} }
function report(label, problems) { function report(label, problems) {
@@ -214,7 +252,7 @@ if (isCli) {
templates.problems templates.problems
); );
failures += report( failures += report(
`合规审计 4.4.2 / 5.2 / 2.2(${compliance.groupCount} 组 / ${compliance.fieldCount} 配置项)`, `合规审计 4.4.2 / 5.1 / 5.2 / 2.2(${compliance.groupCount} 组 / ${compliance.fieldCount} 配置项 / ${compliance.conciseCount} 条精简提示)`,
compliance.problems compliance.problems
); );
/* 独立运行时按当前磁盘上的打包清单口径检查 README 链接 */ /* 独立运行时按当前磁盘上的打包清单口径检查 README 链接 */
+4 -4
View File
@@ -69,14 +69,14 @@ spec:
id: welcome_popup_api id: welcome_popup_api
label: 自定义 IP 定位主 API(可选) label: 自定义 IP 定位主 API(可选)
value: "" value: ""
help: 留空则只显示本地欢迎语。可选接口 https://myip.ipip.net/json 或 https://r.inews.qq.com/api/ip2city?otype=json。填写后会把访客 IP 发送给该第三方服务换取地理位置,需自行在站点隐私说明中披露,详见 README「外部资源与隐私」 help: 留空则只显示本地欢迎语。可选接口 https://myip.ipip.net/json 或 https://r.inews.qq.com/api/ip2city?otype=json
if: "$get(welcome_popup_enabled).value === true" if: "$get(welcome_popup_enabled).value === true"
- $formkit: url - $formkit: url
name: welcome_popup_fallback_api name: welcome_popup_fallback_api
id: welcome_popup_fallback_api id: welcome_popup_fallback_api
label: 自定义 IP 定位备选 API(可选) label: 自定义 IP 定位备选 API(可选)
value: "" value: ""
help: 留空不使用备选;可填 https://myip.ipip.net/json 或 https://r.inews.qq.com/api/ip2city?otype=json 作为主接口的备选。填写后同样会把访客 IP 发送给该第三方服务换取地理位置,需自行在站点隐私说明中披露,详见 README「外部资源与隐私」 help: 留空不使用备选;可填 https://myip.ipip.net/json 或 https://r.inews.qq.com/api/ip2city?otype=json 作为主接口的备选
if: "$get(welcome_popup_enabled).value === true" if: "$get(welcome_popup_enabled).value === true"
- $formkit: switch - $formkit: switch
name: welcome_popup_show_once name: welcome_popup_show_once
@@ -281,7 +281,7 @@ spec:
label: 自定义一言 API(可选) label: 自定义一言 API(可选)
value: "https://v1.hitokoto.cn/" value: "https://v1.hitokoto.cn/"
if: "$get(hero_description_mode).value !== 'none'" if: "$get(hero_description_mode).value !== 'none'"
help: 选择「一言」时自动填入官方接口 https://v1.hitokoto.cn/;选择「一言」或「自定义」后若留空,则使用主题内置的本地句子库(零外部请求)。只有填写后才会向该地址发起请求,需自行在站点隐私说明中披露,详见 README「外部资源与隐私」 help: 默认预填官方接口 https://v1.hitokoto.cn/(仅「一言」模式生效);选择「一言」或「自定义」后若留空,则使用主题内置的本地句子库(零外部请求)
- $formkit: checkbox - $formkit: checkbox
name: hero_hitokoto_categories name: hero_hitokoto_categories
label: 一言句子类型 label: 一言句子类型
@@ -584,7 +584,7 @@ spec:
- $formkit: attachment - $formkit: attachment
name: moments_cover name: moments_cover
label: 顶部封面图 label: 顶部封面图
help: 朋友圈样式顶部的封面图片,建议尺寸 1500×500 help: 瞬间页顶部的封面图片,建议尺寸 1500×500
- $formkit: select - $formkit: select
name: moments_loading_mode name: moments_loading_mode
label: 加载方式 label: 加载方式
+28 -1
View File
@@ -120,8 +120,35 @@
border: 1px solid var(--rule); border: 1px solid var(--rule);
} }
/* ---------- 引用块 ----------
全局 blockquote 的 padding 与正文 p 的 margin-bottom 会在块内叠加,
文字下方因此出现一整条空白。这里把引用块内外间距收敛为单一节奏:
块内子元素不再各自产生外边距,多段之间只保留一个较小的段间距。 */
blockquote { blockquote {
margin-block: 2em; margin-block: 1.25em;
padding-block: 0.7em;
padding-inline: 1.25em;
/* :is() 把特异性提到 0,1,2,确保移动端 .wi-post__body p 规则不会让空白回归 */
> :is(p, ul, ol, pre, figure, table, h1, h2, h3, h4, h5, h6) {
margin-block: 0;
}
/* 与上面的归零规则保持同等特异性,靠顺序生效,避免多段引用挤在一起 */
> :is(p, ul, ol, pre, figure, table, h1, h2, h3, h4, h5, h6) + * {
margin-block-start: 0.55em;
}
/* 编辑器常在引用块末尾留下空段落,避免再撑出一段空白 */
> p:empty {
display: none;
}
/* 仅含一个 <br> 的空段落单独成规则:旧浏览器不支持 :has() 时
只会丢弃这一条,不影响上面 p:empty 的兜底 */
> p:has(> br:only-child) {
display: none;
}
} }
:is(ul, ol) { :is(ul, ol) {
+1 -1
View File
@@ -28,7 +28,7 @@ spec:
description: 微信读书书架(依赖微信读书插件) description: 微信读书书架(依赖微信读书插件)
screenshot: screenshot:
file: weread.html file: weread.html
version: "1.2.6" version: "1.2.7"
requires: ">=2.27.0" requires: ">=2.27.0"
license: license:
- name: "GPL-3.0" - name: "GPL-3.0"