模板 (Templates)

0.8.7 新增。 模板让您可以把一套完整的替代布局(HTML 结构、partials、CSS、JS)作为独立插件发布。它构建于现有的 theme + customCss 体系之上 —— 并非取而代之。

模板 (Template) 是一个 npm 包,它声明 capabilities: ['template'],并提供一组 .ejs partial 覆盖以及自己的 CSS / JS bundle。@docmd/ui 中的解析器会沿着固定的优先级链查找每个 slot 对应的 partial,遇到任何问题都会回退到默认实现。任何模板问题都不会导致构建失败。

快速开始

1. 安装模板

# 0.8.7 随第一个官方模板一起发布 —— 通过 docmd add 流程安装:
npx @docmd/core add summer

2. 在配置中启用

只需设置 一个键 —— theme.name。docmd 会自动判断这个名字指向的是保留的 CSS 主题(defaultskyrubyretro)还是一个模板包(summer 等)。

docmd.config.json
{
  "theme": {
    "name": "summer"
  }
}

此后每个页面都会使用 summer 模板的 layout.ejs。您没有覆盖的 slot(侧边栏、页脚等)会自动回退到 @docmd/ui 的默认实现。

想在某个 CSS 主题之上叠加模板? 使用显式的 theme.template 键。它始终优先于 theme.name

docmd.config.json
{
  "theme": {
    "name": "sky",
    "template": "summer"
  }
}

summer 的结构 + sky 的配色。

3. 按页面覆盖

只需一个 frontmatter 键,就能让该页面单独使用其他模板:

---
title: "Changelog"
template: "template-changelog"
---

# Changelog

解析链

页面渲染时,解析器自上而下遍历这条链,取首个匹配:

# 来源 示例
1 frontmatter.template template: "template-changelog"
2 config.templates[glob] "blog/*": "template-blog"
3 config.theme.template (显式) "template": "summer"
4 config.theme.name (若不是已知 CSS 主题则自动提升为模板) "name": "summer"
5 内置默认 @docmd/ui 自带的 .ejs 文件

CSS 主题 defaultskyrubyretro 属于保留名 —— 若 theme.name 命中其中之一,就仍是 CSS 主题。其他任何值都会被视作模板名,对应的 @docmd/template-* 包会自动加载。

若解析到的文件在磁盘上不存在,解析器会打印一条 TUI 警告并回退到默认实现。

支持的模板 slot

模板可以覆盖以下 12 个 slot 中的任何一个。未覆盖的 slot 会回退到默认:

Slot 默认文件 用途
layout templates/layout.ejs 完整的 HTML 页面
404 templates/404.ejs 404 页面
toc templates/toc.ejs 目录侧边栏
navigation templates/navigation.ejs 侧边栏导航树
footer templates/partials/footer.ejs 页脚
menubar templates/partials/menubar.ejs 顶部导航栏
options-menu templates/partials/options-menu.ejs 搜索/主题/个人菜单
project-switcher templates/partials/project-switcher.ejs 多项目切换器
version-dropdown templates/partials/version-dropdown.ejs 版本选择器
language-switcher templates/partials/language-switcher.ejs 语言切换器
banner templates/partials/banner.ejs 站点横幅
cookie-consent templates/partials/cookie-consent.ejs Cookie 同意对话框

no-style 页面没有模板专属副本。无论激活的是哪个模板,它们始终使用默认的 templates/no-style.ejs

资源优先级

当多个模板与您的 customCss 都提供了 CSS / JS 时,它们按下表顺序加载(数值小的先加载,数值大的在级联冲突中胜出):

优先级 层级
0 基础 (docmd-main.cssdocmd-main.js)
5 主题配色层(如 docmd-theme-sky.css
10 模板结构(模板的默认优先级)
15 用户 customCss / customJs —— 始终胜出
20 插件 CSS/JS
25+ 高优先级模板(Summer 即使用 25)

若想覆盖某个模板的样式,请将规则放入项目级 customCss(优先级 15)。请避免在模板 CSS 中使用 !important,这样用户无需 fork 就能调整。

模板本地化

当前 locale 会作为普通 local 传入您的模板。翻译仍通过 t(key) helper 查找 —— 您既有的 assets/i18n/<locale>.json 文件继续有效。

接下来