VueHexoReact博客

soul-blog-theme — Vue 博客模板

作者 callmesoul

基于 Web Components 的跨框架博客主题 Monorepo,一套 UI 同时适配原生 JS、Vue 3、React 18 与 Hexo,核心组件库使用 Shadow DOM 封装。

看看你的网站会是什么样

浏览真实页面截图,比较内容排版与手机效果。点击下方缩略图切换,放大查看整页细节。

1 个预览视图
作者提供的预览
作者提供的预览

来自项目 README 的原始预览。

目前有 1 张原始预览,可打开完整图片查看设计细节。

截图用于了解视觉与布局,交互效果请以实际项目为准。

采集于 2026-10-01查看来源

值得关注的模板亮点

从已有项目资料中,快速了解它的特点。

01

核心库 @soul-blog/wc 使用 Shadow DOM 封装,不依赖前端框架,原生 JS、Vue 3、React 18 与 Hexo 共用同一套 UI

02

提供 11 个 Web Components,覆盖背景、侧栏、文章列表、归档、关于我、友链、阅读器、搜索、音乐播放器与登录面板

03

文章阅读器支持 FLIP 翻转动画、面包屑、Giscus 评论与相关推荐,移动端切换为单栏滚动

04

全文模糊搜索支持标题、目录与正文关键词,可用 Ctrl/Cmd + Shift + F 唤起弹出层,也有独立 /search 结果页

05

站点品牌、主题色、关于我、友链与 Giscus 评论通过 site-config.json 配置,支持运行时热覆盖

06

Hexo 以独立运行包发布,包含模板、脚本、JS/CSS、默认图片和音乐,个人配置与资源放在站点独立目录

模板详细介绍

soul-blog-theme 是一个以 Web Components 为核心的博客主题 Monorepo。核心库 @soul-blog/wc 使用 Shadow DOM 封装、不依赖前端框架,各端通过 thin wrapper 集成,因此原生 JS、Vue 3、React 18 与 Hexo 可以共用同一套 UI 组件。仓库按 pnpm workspace 组织,包含 packages/core 与 themes/vanilla、themes/vue、themes/react、themes/hexo 四个主题目录,另有 assets/site-config.json 作为品牌信息、社交栏、主题色、关于我、友链与 Giscus 评论的配置入口,支持运行时热覆盖。

功能层面,主题提供首页文章卡片网格、分类与标签筛选、归档时间线、关于我、友链画廊、独立搜索结果页、登录页与文章阅读器;阅读器支持 FLIP 翻转动画、面包屑、Giscus 评论与相关推荐,底部音乐播放器支持播放列表、音量记忆与跨页状态保持。搜索支持标题、目录与正文的模糊匹配,并可用 Ctrl/Cmd + Shift + F 唤起弹出层。数据接入通过 TypeScript 类型契约约束,Article 与 Category 字段结构一致即可替换数据源。

使用限制方面,项目要求 Node.js >= 20、pnpm >= 9,开发时需先构建核心组件库再启动各端主题;Hexo 主题以独立运行包形式发布,个人配置与资源放在站点独立目录,便于整体替换更新。Giscus 评论默认开启,未填写完整必要字段时评论区会展示配置引导而不加载 iframe。代码采用 MIT 许可,但演示图片、字体、图标等第三方素材需按各自许可核对。

VueHexoReact博客

适合你的项目吗?

适用场景

  • 希望用同一套博客 UI 同时维护原生 JS、Vue 3、React 18 与 Hexo 多个站点
  • 为已有 Hexo 博客替换主题,并使用归档时间线、标签筛选、友链画廊与 Giscus 评论
  • 在 Vue 3 或 React 18 项目中集成基于 Web Components 的博客组件,而不引入额外 UI 框架
  • 需要带音乐播放器、动态背景与 FLIP 文章过渡动画的个人博客
  • 通过 site-config.json 在部署后调整品牌信息、主题色、关于我与友链内容,无需重新打包

适合人群

  • 使用 Node.js >= 20 与 pnpm >= 9 的前端开发者
  • 需要跨框架复用博客 UI 的多端项目维护者
  • 使用 Hexo 并希望以独立运行包方式安装主题的博客作者
  • 接受 Web Components 与 Shadow DOM 技术方案的 Vue 3 或 React 18 项目

上手与定制指南

结合仓库当前版本的说明,按下面的资料检查内容、配置与运行要求。

  1. 1

    环境要求 Node.js >= 20、pnpm >= 9,安装依赖使用 pnpm install

  2. 2

    先构建核心组件库 pnpm --filter @soul-blog/wc build,再构建或启动各端主题

  3. 3

    本地开发可运行 pnpm dev:all 并行启动 Vanilla、Vue、React 预览服务与 Hexo 内置预览站点

  4. 4

    Hexo 开发使用 fixtures/hexo 内置配置与示例文章,修改核心组件后需先重新构建 Core

  5. 5

    Giscus 评论需先在目标 GitHub 仓库开启 Discussions 并安装 Giscus App,再填写 repoId 与 categoryId

查看仓库使用说明

授权与来源资料

使用条件与限制

免费使用 · 保留许可声明

本次收录的是公开仓库中采用 MIT 许可的免费版本;免费范围为该版本代码,不代表外部服务或第三方素材免费。

使用时需要遵守

  • 允许免费使用、修改、商用和分发该版本代码。
  • 分发代码副本或实质性部分时,保留原作者版权声明和完整 MIT 许可声明。
  • 代码按现状提供;担保与责任限制以原许可证及适用法律为准。

额外费用与待核对事项

  • 评论功能依赖外部服务 Giscus:需在目标 GitHub 仓库开启 Discussions、安装 Giscus App,并填写 repoId 与 categoryId;字段不完整时评论区仅显示配置引导,不加载 iframe。
  • 运行环境要求 Node.js 20 及以上、pnpm 9 及以上,低于该版本无法按文档安装与构建。
  • Hexo 使用需从 GitHub Release 下载运行包,Git tag 源码不含运行产物、不能替代运行包;旧版 v1.8.0 无运行包,需走源码构建兼容路径。
  • Hexo 站点需将个人配置与资源分别放在 theme/config.yml 及 theme/assets/images、theme/assets/audio 目录,主题目录按可整体删除重建方式管理。
  • 主题更新依赖 npm run theme:update 安装并锁定版本与 SHA256,下载或配置解析失败时保留旧主题。
  • 修改核心组件后必须先重新构建 Core,再启动 Hexo 开发任务,否则改动不生效。
  • Hexo 部署存在根路径部署限制,且需安装必需的 EJS 渲染器并采用站点独立配置,具体见主题安装指南。
  • 演示图片、字体、图标及其他第三方素材需按各自许可核对,不能仅凭代码的 MIT 许可判断。
  • 域名、托管、数据库、支付或 AI 等外部服务可能另外收费。
查看原文依据

Permission is hereby granted, free of charge

许可证原文

Giscus 默认开启。必要字段未填写完整时,文章评论区会直接展示配置引导,不会加载无效 iframe。请先在目标 GitHub 仓库开启 Discussions、安装 [Giscus App](https://github.com/apps/giscus),再通过 [Giscus 配置页](https://giscus.app/zh-CN) 获取 `repoId` 与 `categoryId`。

README 原文

- Node.js >= 20 - pnpm >= 9

README 原文

从 v1.9.0 开始,优先使用 GitHub Release 的 `soul-blog-hexo-vX.Y.Z.tar.gz`,它包含 EJS 模板、CommonJS 主题脚本、默认配置、JS/CSS 和完整默认图片/音频;无需在使用站点安装 pnpm 或构建 monorepo。Git tag 源码不包含运行产物,不能用源码压缩包代替运行包。

README 原文

使用站点应把 `themes/hexo/` 当作可整体删除并重建的目录:个人配置维护在 `theme/config.yml`,个人资源维护在 `theme/assets/images/`、`theme/assets/audio/`。

README 原文

`callmesoul.github.io` 站点已采用此流程:`npm run theme:update -- vX.Y.Z` 安装并锁定版本及 SHA256,`npm run dev` / `npm run build` 自动同步;下载或配置解析失败保留旧主题。

README 原文

修改核心组件后先重新构建 Core,再启动 Hexo 开发任务

README 原文

普通 Hexo 用户可直接按 [Hexo 安装与配置指南](themes/hexo/README.md) 下载、校验并安装运行包;其中说明了必需的 EJS 渲染器、站点独立配置、更新流程以及根路径部署限制。

README 原文
https://github.com/callmesoul/soul-blog-theme/blob/main/LICENSEhttps://github.com/callmesoul/soul-blog-theme/blob/main/README.md

DeepSeek 根据仓库许可证和 README 整理 ·2026-10-01。结果仅覆盖已读取资料,依赖、图片、字体及后续条款变更以各自原文为准。

项目核对记录与介绍依据

模板资料

来源平台
GitHub
资料与维护参考分
资料较完整 · 76 / 100
技术栈
Vue · Hexo · React
网站类型
博客
这个分数如何计算

本站按许可资料(最高30分)、演示链接(12分)、预览图(10分)、Star数(15分)、记录的维护时间(15分)、描述完整度(8分)、功能记录(5分)和分类资料(5分)计算。它不是代码、安全或性能测试,也不是 Google 评分;有链接不代表已实测可用。

这个项目需要核对什么

记录的仓库更新时间
2026-09-16
截图检查日期
2026-10-01

目前没有记录演示链接。请依据仓库说明在本地评估;仅凭截图无法确认交互行为。

目录记录的主要技术栈是 Vue。请通过依赖清单和锁文件核对实际版本与托管要求。这些说明基于收录资料,不代表代码审计或部署实测。

查看具体选型方法 →

介绍的制作与核对状态

介绍由 AI 辅助整理目录与仓库资料。仓库作者不等于这篇介绍的审核者。

已完成服务器许可规则与 AI 来源核对;未经过人工编辑审核。

查看当时使用的来源资料

SHA-256: 68c0ab0023377184462ded078d25f52c1fef27a799d6471f397b8cd24401f492

2026-10-01T03:08:45.108Z

来源文件 / 仓库
# soul-blog-theme

基于 **Web Components** 的跨框架博客主题,一套 UI 同时适配原生 JS、Vue、React、Hexo。

**在线预览:[https://callmesoul.github.io/](https://callmesoul.github.io/)**

核心组件库 `@soul-blog/wc` 使用 Shadow DOM 封装,不依赖任何前端框架,各端通过 thin wrapper 按需集成。

## ✨ 特性

- 🎨 **跨框架一致体验** — 一套核心组件同时支持 Vanilla/Vue/React/Hexo

- 🔍 **全文模糊搜索** — 支持标题、目录、正文关键词模糊搜索,支持键盘导航;既可热键唤起弹出层,也可访问独立 `/search` 结果页

- 🎬 **FLIP 翻转动画** — 从文章卡片到详情页无缝过渡动画

- 🎵 **底部音乐播放器** — 支持播放列表、音量记忆、跨页状态保持、循环 / 单曲 / 随机三种播放模式

- 🌌 **动态背景** — 粒子 / 星尘动效,视觉层次感丰富

- 🗂 **归档时间线** — 按 年 → 月 → 文章 三级倒序归档,年份快捷导航、月份可折叠、滚动触底自动续载(IntersectionObserver)

- 👤 **关于我页面** — 杂志式卡片布局的自我介绍页(Manifesto 卡片、Currently 状态、联系方式),内容由 `site-config.json` 的 `about` 字段驱动,改配置即改页面

- 🤝 **动态友链画廊** — 人物画廊式非对称卡片,支持字符标识或头像;Vanilla、Vue、React 与 Hexo 共用核心组件,内容由站点配置驱动
- 📦 **Hexo 独立运行包** — 发布包包含模板、脚本、JS/CSS、默认图片和音乐;个人配置与资源放在站点独立目录,主题可整体替换更新
- 💬 **Giscus 文章评论** — 基于 GitHub Discussions,按稳定文章键隔离评论;支持 Vanilla、Vue、React 与 Hexo,切换阅读器文章时自动切换 Discussion

- 📖 **沉浸式文章阅读** — 桌面端控制舒适行宽并强化标题、列表、引用、代码块与图片层级;移动端切换为完整单栏滚动,推荐内容自然衔接在正文之后

- 🧭 **面包屑导航** — 文章阅读器、归档页统一展示「首页 > 目录 > 文章」路径

- 🏷 **标签筛选** — 侧栏标签云、文章卡片 tag chip、阅读器内 tag 一键回列表过滤

- 📈 **访问统计** — 四套主题统一接入 Vercount 站点 PV / UV 与单篇文章阅读量,首页文章列表同步展示动态计数

- 📱 **响应式布局** — 适配桌面、平板、移动设备

- 🔐 **登录页** — 带密码验证、记住用户名、自动登录的私有文章入口

- ⚡ **性能优化** — 组件懒加载、图片懒加载、搜索防抖、归档/年份侧栏 IntersectionObserver 续载

## 📸 截图预览

|                     首页                    |                  文章阅读器                   |
| :-------------------------------------: | :--------------------------------------: |
| ![首页](assets/screenshots/home.png) | ![文章阅读器](assets/screenshots/article-viewer.png) |
|                   **登录页**                  |                   **搜索页**                  |
| ![登录页](assets/screenshots/login.png) | ![搜索页](assets/screenshots/search.png) |
|                   **归档页**                  |                 **关于我**                  |
| ![归档页](assets/screenshots/archives.png) | ![关于我](assets/screenshots/about.png) |
|                   **友链**                   |                                          |
| ![友链](assets/screenshots/friends.png) |                                          |

## 🗂️ 项目架构

```
soul-blog-theme/
├── packages/
│   └── core/                      # @soul-blog/wc — 框架无关的组件库(唯一 UI 真源)
│       └── src/
│           ├── components/        # 11 个 Web Components(Shadow DOM + 自包含样式)
│           ├── helpers/           # 工具函数(wc-base、store、search、escape-html、format-time)
│           ├── styles/            # Tailwind v4 主题变量与设计令牌
│           └── types/             # TypeScript 类型契约(Article / Category / FriendLink 等)
│
├── themes/
│   ├── vanilla/                   # 原生 JS 主题(Vite 多页应用)
│   ├── vue/                       # Vue 3 主题(Pinia + Vue Router)
│   ├── react/                     # React 18 主题(Zustand + React Router)
│   └── hexo/                      # Hexo 博客主题(EJS 模板 + Vite 构建)
│
├── assets/
│   ├── site-config.json           # 品牌信息 / 社交栏 / 主题色(运行时可热覆盖)
│   ├── screenshots/               # README 引用截图
│   ├── images/                    # 站点图片资源
│   └── audio/                     # 音乐播放器默认曲目
│
├── fixtures/
│   └── hexo/                      # 仓库内置 Hexo 预览配置与示例文章
│
├── design/                        # 原始设计稿(PSD / PNG)
│
├── pnpm-workspace.yaml
└── package.json
```

## 组件清单

`@soul-blog/wc` 提供以下 Web Components:

| 组件             | 标签                  | 功能                                          |
| -------------- | ------------------- | ------------------------------------------- |
| SiteBackground | `<site-background>` | 背景粒子 / 星尘动效                                  |
| SiteSidebar    | `<site-sidebar>`    | 双轨侧栏:首页 / 目录 / 归档 / 友链 / 关于 + 分类、社交、标签云           |
| ArticleList    | `<article-list>`    | 文章卡片网格(分类筛选、标签筛选、入场动画、滚动续载)                 |
| ArchiveList    | `<archive-list>`    | 归档时间线(年 → 月 → 文章、年份快捷导航、月份折叠、滚动续载)           |
| AboutPage      | `<about-page>`      | 关于我页面(杂志式卡片布局,内容由 site-config 的 `about` 驱动)       |
| FriendsPage    | `<friends-page>`    | 友链人物画廊(动态标题、链接、标识、颜色及可选头像)                    |
| ArticleViewer  | `<article-viewer>`  | 响应式文章阅读器(FLIP 动画、富文本排版、Giscus 评论、相关推荐、tag 点击路由)  |
| SearchPanel    | `<search-panel>`    | 搜索弹出层(模糊搜索、键盘导航;Ctrl/Cmd + Shift + F 唤起)      |
| SearchResults  | `<search-results>`  | 搜索结果列表(独立 `/search` 路由,复用 ArticleList 渲染逻辑)     |
| MusicPlayer    | `<music-player>`    | 音乐播放器(进度、音量、播放列表、跨页保持状态、3 种播放模式)             |
| LoginPanel     | `<login-panel>`     | 登录面板(密码显隐、错误提示、记住用户名、自动登录)                    |

## 技术栈

### 核心层

| 依赖                                          | 用途            |
| ------------------------------------------- | ------------- |
| [Vite 8](https://vite.dev/)                 | 构建工具          |
| [Tailwind CSS v4](https://tailwindcss.com/) | 样式实现          |
| Web Components (Shadow DOM)                 | 组件封装,框架无关     |
| TypeScript                                  | 类型安全          |

### 各端框架

| 主题       | 状态管理    | 路由             | 额外依赖                       |
| -------- | ------- | -------------- | -------------------------- |
| Vanilla  | 模块级变量   | Hash 路由        | —                          |
| Vue 3    | Pinia   | Vue Router 4   | `@vitejs/plugin-vue`       |
| React 18 | Zustand | React Router 6 | `@vitejs/plugin-react`     |
| Hexo     | —       | Hexo 7 路由      | EJS 模板                     |

## 快速开始

### 环境要求

- Node.js >= 20

- pnpm >= 9

### 安装依赖

```bash
pnpm install
```

### 构建核心组件库

```bash
pnpm --filter @soul-blog/wc build
```

### 构建各端主题

```bash
# 原生 JS 主题
pnpm build:vanilla

# Vue 3 主题
pnpm build:vue

# React 18 主题
pnpm build:react

# Hexo 主题
pnpm build:hexo
```

### 本地开发

同时启动全部主题的开发任务:

```bash
pnpm dev:all
```

该命令会并行启动 Vanilla、Vue、React 的预览服务、Hexo 主题资源监听构建,以及使用 `fixtures/hexo` 内置开发站点的 `hexo server`。无需提前创建或同步 `/tmp/hexo-test`;需要生成静态产物时,输出目录已指向该路径。

各主题默认端口:

| 主题       | 端口   | 命令                 |
| -------- | ---- | ------------------ |
| Vanilla  | 5173 | `pnpm dev:vanilla` |
| Vue 3    | 5174 | `pnpm dev:vue`     |
| React 18 | 5175 | `pnpm dev:react`   |
| Hexo     | 4000 | `pnpm dev:hexo`    |

```bash
# 构建核心库(watch 模式)
pnpm dev:core

# 原生 JS 主题
pnpm dev:vanilla

# Vue 3 主题
pnpm dev:vue

# React 18 主题
pnpm dev:react

# Hexo 主题资源(watch 模式)+ 内置预览站点
pnpm dev:hexo
```

> 端口被占用时 Vite 会自动顺延(+1),以启动时实际输出的地址为准。

## 路由 & 页面

各端均提供一致的页面结构(具体路由名以各端实现为准):

| 页面           | 用途                       | 关键组件                                  |
| ------------ | ------------------------ | ------------------------------------- |
| `/`          | 首页:分类 / 标签筛选 + 文章卡片网格    | `site-sidebar`、`article-list`          |
| `/articles/:id` | 文章阅读器(FLIP 翻转打开)      | `article-viewer`、面包屑                   |
| `/search`    | 独立搜索结果页                  | `search-results`                       |
| `/archives`  | 归档时间线(年 → 月 → 文章)        | `archive-list`                         |
| `/about`     | 关于我(杂志式卡片自我介绍页)        | `about-page`                           |
| `/friends`    | 友链(人物画廊式卡片列表)          | `friends-page`、`site-sidebar`            |
| `/login`     | 登录页                      | `login-panel`                          |

> Vanilla 版友链入口为 `friends.html`,Vue 版为 `#/friends`,React 与 Hexo 版为 `/friends`。Hexo 归档对应 `/archives/`(默认 `archive_dir`),正文页在归档 / 首页里通过 FLIP 翻转在原地弹出阅读器,无独立文章页 URL,便于静态托管 SEO。

## 站点配置

品牌信息(logo、主色、社交栏、备案文案)通过 `site-config.json` 配置,运行时生效优先级由高到低:

1. `public/site-config.json` — 部署后直接编辑,无需重新打包
2. `window.__SITE_CONFIG__` — 运行时注入(控制台 / 后台直出)
3. 内置默认值(兜底)

配置字段说明(深合并,数组整体替换、对象逐层覆盖):

```json
{
  "site": {
    "name": "CallMeSoul",
    "icp": "@CallMeSoul 粤ICP备15053557"
  },
  "logo": {
    "home": { "src": "/images/logo-home.png", "width": 60, "height": 55, "alt": "CallMeSoul" },
    "login": { "src": "/images/logo-login.png", "width": 201, "height": 35, "alt": "CallMeSoul" },
    "loginIcon": { "src": "/images/logo-icon.png", "width": 88, "height": 81, "alt": "" }
  },
  "theme": {
    "primary": "#EB4F38",
    "cta": "#EE5B44"
  },
  "about": {
    "kicker": "About · Personal Manifesto",
    "title": "代码是工具,",
    "titleAccent": "表达才是目的。",
    "description": "一句话简介(标题下方段落)",
    "cards": [
      { "eyebrow": "01 · About", "title": "卡片大标题,\\n 支持换行", "variant": "wide" },
      { "eyebrow": "Currently", "title": "Build.\\nWrite.\\nRepeat.", "variant": "accent" },
      { "eyebrow": "02 · Believe", "text": "纯文本卡片" },
      { "eyebrow": "04 · Contact", "text": "有好想法?\\[email protected]", "href": "mailto:[email protected]" }
    ]
  },
  "friends": {
    "kicker": "Friends · Curated People",
    "title": "一些值得",
    "titleAccent": "反复拜访的人。",
    "description": "友链页标题下方的介绍",
    "links": [
      {
        "name": "朋友的站点",
        "url": "https://example.com",
        "domain": "example.com",
        "note": "一句话介绍",
        "mark": "E",
        "color": "#6D8580",
        "avatar": "/images/friends/example.png"
      }
    ]
  },
  "giscus": {
    "enabled": true,
    "repo": "owner/repo",
    "repoId": "R_...",
    "category": "Announcements",
    "categoryId": "DIC_...",
    "termPrefix": "article:",
    "strict": true,
    "reactionsEnabled": true,
    "inputPosition": "top",
    "theme": "dark_dimmed",
    "lang": "zh-CN",
    "loading": "lazy"
  },
  "social": [
    { "name": "微信", "icon": "/images/weixin.png", "href": "", "qr": "/images/qr-weixin.svg", "hue": 74, "width": 22, "height": 18 }
  ],
  "archiveUrl": "/archives/",
  "homeUrl": "/"
}
```

Giscus 默认开启。必要字段未填写完整时,文章评论区会直接展示配置引导,不会加载无效 iframe。请先在目标 GitHub 仓库开启 Discussions、安装 [Giscus App](https://github.com/apps/giscus),再通过 [Giscus 配置页](https://giscus.app/zh-CN) 获取 `repoId` 与 `categoryId`。主题固定使用 `specific` 映射,并以 `termPrefix + article.commentKey`(缺省回退 `article.id`)作为 Discussion 键,避免 Hash/Query SPA 中多篇文章共用同一个 pathname 而串评论。Hexo 对应字段使用 snake_case(如 `repo_id`、`category_id`);如需恢复内置演示评论区,可设置 `enabled: false`。

> **社交栏交互规则**:`href` 为有效外链 → 新窗口跳转;`href` 为空但有 `qr` → hover 弹二维码;两者皆无 → 纯展示图标。

> **关于我页**:`about.cards` 每项为一张卡片,`variant: "wide" | "accent"` 控制大卡/强调色卡,缺省为普通卡;`href` 存在时整卡可点击。

> **友链页**:`friends.links` 按数组顺序渲染并整体替换默认列表;`url` 为实际跳转地址,`domain` 仅控制展示文案,`avatar` 可选,缺省时依次使用 `mark` 和站名首字符。Hexo 在主题 `_config.yml` 中配置同名 `friends` 节点,并使用 `title_accent` 等 snake_case 字段,另支持 `enabled: false` 关闭 `/friends/` 页面生成、`path` 自定义路由(默认 `friends`,对应 `page_title` 为页面标题)。

## 数据接入

各端数据源通过 `TypeScript` 类型契约约束,字段结构一致即可无缝替换:

### 文章 (`Article`)

```typescript
interface Article {
  id: string
  statsKey?: string    // 访问统计稳定键(缺省回退 id)
  commentKey?: string  // 评论系统稳定键(缺省回退 id)
  cat: string          // 所属分类 id
  title: string
  cover: string
  summary: string
  date: string         // 'YYYY/MM/DD'
  views: number
  commentCount: number
  tags?: string[]      // 标签列表(用于筛选 / 卡片 chip)
  paragraphs: string[]
  comments?: ArticleComment[]
}
```

### 分类 (`Category`)

```typescript
interface Category {
  id: string
  name: string         // 展示名(中文)
  en: string           // 英文名 / 副标
  icon: string         // 目录图标 URL
  w: number            // 图标宽度(px)
  h: number            // 图标高度(px)
  count?: number       // 该分类下文章数(可选,用于卡片摘要)
}
```

## 键盘快捷键

| 快捷键                    | 功能                                       |
| ---------------------- | ---------------------------------------- |
| `Ctrl/Cmd + Shift + F` | 打开搜索弹出层(`search-panel`)                |
| `↑ / ↓`                | 在搜索面板 / 阅读器中切换                          |
| `Enter`                | 打开当前结果 / 确认操作                            |
| `Esc`                  | 关闭搜索 / 返回列表 / 关闭阅读器                     |

## 开发指南

### TypeScript 类型检查

```bash
# 核心库
pnpm --filter @soul-blog/wc typecheck

# Vue 主题
pnpm --filter @soul-blog/vue typecheck

# React 主题(内嵌在 build 流程中)
pnpm --filter @soul-blog/react build
```

### Hexo 主题集成开发工作流

仓库内置 `fixtures/hexo` 预览配置与示例文章,并直接加载当前的 `themes/hexo`,因此不需要再复制主题目录。修改核心组件后先重新构建 Core,再启动 Hexo 开发任务:

```bash
cd /path/to/soul-blog-theme
pnpm build:core
pnpm dev:hexo
```

`pnpm dev:hexo` 会同时监听构建主题资源并启动 `http://localhost:4000/`。也可以用 `pnpm dev:all` 连同另外三套主题一起启动。

### 生产部署 Hexo

普通 Hexo 用户可直接按 [Hexo 安装与配置指南](themes/hexo/README.md) 下载、校验并安装运行包;其中说明了必需的 EJS 渲染器、站点独立配置、更新流程以及根路径部署限制。

从 v1.9.0 开始,优先使用 GitHub Release 的 `soul-blog-hexo-vX.Y.Z.tar.gz`,它包含 EJS 模板、CommonJS 主题脚本、默认配置、JS/CSS 和完整默认图片/音频;无需在使用站点安装 pnpm 或构建 monorepo。Git tag 源码不包含运行产物,不能用源码压缩包代替运行包。

主题维护者本地打包:

```bash
pnpm install --frozen-lockfile
pnpm package:hexo
```

输出在 `dist/hexo/`:版本压缩包、`hexo-release.json`(含版本、提交、包 SHA256)及 `SHA256SUMS`。解压后得到 `hexo/` 主题目录,放在站点 `themes/hexo/`,并在站点 `_config.yml` 设置 `theme: hexo`,再运行 `hexo generate`。发布包里的 `theme.json` 可追溯构建源码;本地未提交的包标记为 `dirty`,仅供预览。

使用站点应把 `themes/hexo/` 当作可整体删除并重建的目录:个人配置维护在 `theme/config.yml`,个人资源维护在 `theme/assets/images/`、`theme/assets/audio/`。安装器先校验发布包并准备完整目录,再将默认配置与个人配置合并(对象逐层覆盖、数组整体替换,`[]` 清空),最后覆盖个人资源并替换主题。未修改的默认资源不要复制进个人覆盖目录,未填写的配置继承新版本默认值。

`callmesoul.github.io` 站点已采用此流程:`npm run theme:update -- vX.Y.Z` 安装并锁定版本及 SHA256,`npm run dev` / `npm run build` 自动同步;下载或配置解析失败保留旧主题。旧版 v1.8.0 无运行包,保留源码构建兼容路径,安装新版发布包后切换到直接下载。

正式发布前按 AGENTS.md 完成统一版本、CHANGELOG、README 后提交,并推送对应 `vX.Y.Z` tag。`.github/workflows/release-hexo.yml` 会重新构建、验证 tag/版本/最新 CHANGELOG 和干净工作区,再创建或使用 GitHub Release 上传三个产物;不会覆盖已有同名资源。

### 添加新组件

1. 在 `packages/core/src/components/` 中创建 Web Component(继承 `WcBase`)
2. 在 `packages/core/src/components/index.ts` 中注册
3. 在各端主题中创建对应的 thin wrapper 组件
4. 重新构建 core 和各端主题

## 🎨 主题定制

设计令牌定义在 `packages/core/src/styles/theme.css`(与 `themes/vanilla/src/css/style.css` 同源,跨端复用):

```css
:root {
  /* 品牌色(可在 site-config.theme 中按页面动态覆盖) */
  --brand-primary: #EB4F38;   /* 主题主色 */
  --brand-cta: #EE5B44;        /* 按钮强调色 */

  /* 中性面板色 */
  --color-base: #080808;       /* 页面底色 */
  --color-card: #0f0e0d;       /* 侧栏 / 卡片 / 播放列表面板 */
  --color-panel: #141210;      /* 音量面板 */

  /* 文字色阶 */
  --color-ink: #ffffff;        /* 一级 */
  --color-body: #f2f2f2;       /* 二级正文 */
  --color-mute: #9e9d99;       /* 三级元信息 */
  --color-dim: #6b6b6b;        /* 四级时间等 */

  /* 分隔线 / 边框 */
  --color-line: #2a2a2a;       /* 常规边框 */
  --color-sep: #333333;        /* 列表分隔 / 社交栏顶线 */
}
```

修改后重新构建即可生效。

## ☕ 打赏

如果这个项目对你有用,可以请我喝杯奶茶 🧋

<div align="center">
  <img src="assets/images/payment.png" alt="打赏二维码" width="200">
</div>

## 📝 许可

MIT,详见 [LICENSE](LICENSE)。运行包也包含许可证与 Hexo 安装指南。
反馈内容错误

看看同类模板

对比同技术栈与用途的模板,找到更适合的视觉与内容结构。