Quartz v5 站点四处显示问题修复(2026-10-07)
站点:http://${LANIP}:100(Caddy,quartz-vault.service,产物 ${HOME}/github/quartz/public)。
构建:./deploy/rebuild.sh(build → 泄漏/隐私扫描 → 重载服务 → 探测)。
问题 1:侧边「活页夹标签卡片」—— 已关闭
现象:每个页面左边缘竖排一串标签卡片(binder-tab / binder-spine / binder-label,
带 × 关闭按钮),标题就是相邻页面的名字(首页上显示 ops、README 等)。
来源:插件 github:quartz-community/stacked-pages(“Binder-style stacked page tabs”),
在 quartz.config.yaml 里 layout.position: afterBody,客户端脚本把标签条渲染进
#stacked-pages-container(data-show-spines="true")。
修法:quartz.config.yaml 里该插件改 enabled: false(已加注释说明为何关)。
验证:产物中 grep -rl binder-tab public --include=*.html | wc -l = 0。
问题 2:目录页目录列表重复两遍 —— 已修(框架 bug)
现象:没有 index.md 的目录(如 /ops/,55 篇)页面上「此文件夹下有 55 条笔记。」
- 子目录 + 笔记列表整块出现两次,页面高度 13525px(正常 6956px)。
根因:Quartz v5 的 quartz/plugins/pageTypes/dispatcher.ts 里
populateVirtualPageHtmlAst() 为了支持 transclusion,把虚拟页 pageBody 渲染出的 HTML
写回了 ve.tree.children:
const htmlAst = fromHtml(htmlString, { fragment: true }) as HtmlRoot
ve.tree.children = htmlAst.children // ← 元凶
ve.vfile.data.htmlAst = htmlAst而虚拟页的 pageBody 就是 FolderContent(folder-page 插件),它把 tree 当作自己的正文
渲染。于是 emit 阶段再渲染一次 pageBody,就把同一块内容渲染了两遍 —— 目录页出现两份列表。
(populateVirtualPageHtmlAst 真正需要保留的只有 vfile.data.htmlAst,transclusion 读的是它。)
修法(照上游 v5 分支的做法,两处):
- 删掉
ve.tree.children = htmlAst.children这一行(保留htmlAst,transclusion 不受影响)。 emit()与partialEmit()里把allFilesWithVirtual的构造提到populateVirtualPageHtmlAst(...)之前,并传入合并后的 allFiles,这样 Body 渲染时能解析到其它虚拟页。
验证:12 个目录页 page-listing 计数全部 = 1(修前 = 2),/ops/ 页面高度回到 6956px。
注意(给后来者)
- 以上两项修复都在 vendored 的 Quartz 核心/插件配置里:
quartz/是jackyzha0/quartz的克隆 (当前停在ab346fa feat(v5): add plugin system (#2295)),quartz.config.yaml未纳入 git。 将来升级 Quartz 核心可能产生 dispatcher.ts 补丁合并冲突 —— 升级后必须重跑上面两条验证。 - 判据只有产物:
page-listing每页 1 个、binder-tab全站 0 个。
问题 3:文件夹/文件难分辨 + 列表里显示 tags(2026-10-07 同日,纯 CSS)
诉求:① 侧栏与目录列表里文件夹、文件看起来一样,希望一眼能看出「这是文件夹」; ② 目录页/标签页每条笔记链接后面的 tag 胶囊让版面拥挤,去掉。
做法:改 quartz/styles/custom.scss(由 quartz/plugins/emitters/componentResources.ts
引入,构建时打进 public/index.css),不改插件源码 —— 观感调整走官方扩展点,插件升级不丢:
- 侧栏:
.explorer .folder-container .folder-title(文件夹)→ 加粗 600 + 主题色 + 文件夹图标;.explorer .nav-file-title(文件)→ 400 常规字重 +--darkgray。 - 目录/标签列表(
.page-listing):ul.tags { display: none }去掉 tag 胶囊; 文件夹条目用a.internal[href$="/"]命中(指向 index 的链接都以/结尾)→ 加粗 + 主题色 + 同一个图标; 文件条目标题h3 a.internal降为 400。 - 文件夹图标用 lucide “folder” 的 data-URI 走
mask,颜色跟随currentColor(变量--qv-folder-icon)。
踩坑:插件自带 li.section-li>.section>.tags{display:none} 只在 @media (max-width:600px) 里,
桌面端一直显示 —— 别只看打包后的 CSS 就以为已经隐藏,必须用 getComputedStyle 在真实视口里量。
同理,标题默认 600 字重继承给链接,所以「文件夹加粗」在文件也是 600 时等于没做,必须同时把文件降到 400。
验证(浏览器 getComputedStyle,视口 1600px):
.page-listing ul.tags可见数 = 0(/ops/56 个、/tags/ops33 个全部隐藏);- 文件夹条目
weight=600 / color=--secondary / ::before 图标宽度 16px,文件条目weight=400 / content=none; - 侧栏文件夹 600+图标、侧栏文件 400 无图标;笔记正文不含
ul.tags,不受影响。
问题 4:笔记页 Obsidian 按钮的位置与链接(2026-10-07 同日)
诉求:每篇文章标题右侧的 Obsidian 图标按钮 ①位置稍微上移;②链接更新库名与地址。
根因:按钮是本机自建插件 plugins-src/obsidian-open(quartz.config.yaml 用本地源声明,
layout: beforeBody / priority 11,紧跟 article-title)。配置里写的是旧的 vault: agent
—— 库早已改名,而 Obsidian 按库根目录名解析库名,${KNOWLEDGE_ROOT} → 库名就是 a,
所以旧链接点开找不到库。
做法:
quartz.config.yaml:options.vault: agent→a;插件源码src/util/obsidian.ts的DEFAULT_VAULT同步改a(README 选项表与示例一并更新)。- 位置:
src/components/ObsidianOpen.tsx内联 CSS 给a.obsidian-open加position: relative; top: -0.15rem(≈ -2.4px)—— 相对定位只上移图标,不影响行布局。 - 改完必须重建插件 dist:
cd plugins-src/obsidian-open && ../../node_modules/.bin/tsup。 站点构建读的是dist/,只改src/不生效(quartz.config.yaml用本地源 → 软链到.quartz/plugins/)。
验证:
- 产物链接:
obsidian://open?vault=a&file=research/openclaw.md&paneType=tab; - 位置:图标中心比标题文字盒中心低 3.7px(改前 6.1px),与标题同行、不换行;
- 协议与库:
xdg-mime query default x-scheme-handler/obsidian=obsidian.desktop;~/.config/obsidian/obsidian.json中${KNOWLEDGE_ROOT}已注册(open: true),库名解析为a。