Vault 组件示例
本目录提供文档 Vault 自用的 panel、badge 与 diagram,由同目录 lib.notc 声明。panel 与 badge 使用本地 Web Component,diagram 通过输出配置选择渲染器。本页以 components 导入该模块,数学模块按需直接导入。可复用模块及其边界见 本地模块。
panel
fn panel(title: String = "Panel", expanded: Bool = true)[children: BlockContent] -> BlockContent;
panel 是块级内容函数。title 显示标题,expanded 决定初始展开状态;正文通过唯一的 children 槽传入,组件使用 slot 显示已渲染的内容。children 保留在文档 IR 中,组件内部的 DOM 不进入 IR。
panel/index.js 默认导出 HTMLElement 类,相对导入 style.js;HTML host 按规范函数身份注册组件,并复制组件目录以保留 import 路径。
badge
fn badge(label: String, count: Int = 1) -> InlineContent;
badge 是行内内容函数,显示 label 与 count。badge.js 是单文件组件入口;使用 BigInt 读取 count,保留 i64 精度。HTML host 按规范函数身份注册组件。
完整参数协议与生命周期契约见 BlockContent Function Extensions。
diagram
fn diagram(source: String, theme: String = "auto") -> BlockContent;
diagram 显示块级图形,source 使用 Mermaid 语法。theme 为 auto、light 或 dark;auto 跟随页面或系统主题。具体渲染器通过配置选择。
docs/Notist.toml 选择具体实现:
[[]]
= "replace"
= { = "components/lib.notc", = "../modules/pele/lib.notc" }
= "components.diagram"
= "pele.diagram"
切换为 Mermaid 时,将该规则的 pele 导入改为 mermaid = "../modules/mermaid/lib.notc",并将 to 改为 "mermaid.diagram"。两个目标的参数、默认值与返回类型一致;正文只调用 #components.diagram(...)。
上例使用 Pele 渲染;更换渲染器时,正文中的调用保持不变。
内容状态
状态通过 @(status: "...") 注解已有节点,HTML 映射为 data-status。它不建立函数调用边界,普通内容、查询与源码范围保持原有结构。
status | 含义 | 默认样式 |
|---|---|---|
draft | 方案仍在讨论 | 绿色虚线框与 Draft · 草案标签 |
staged | 方案已确定,等待实现 | 蓝色细框与 Staged · 待实现标签 |
outdate | 已被新设计取代 | 柔和红框与 Outdate · 已过时标签 |
块级节点显示边框与标签;行内节点使用细下划线,outdate 为红色波浪线。cell 的边框沿格子内侧绘制,留出格间空隙。标注任意内容范围可使用带注解的显式 node;直接标注标题时,状态随标题属性归入 section。
样式来自共享的 status.css,静态站点与 Web 预览使用同一份 CSS,不需要 JavaScript。颜色使用宿主的 accent、surface、staged-color 与 outdate-color 变量;打印时边框为实线并去掉背景。属性输出规则见 HTML 属性与状态。
自身配置
文档声明自身的依赖,路径相对于当前文件:
#import "./lib.notc" as components;
正文用 #components.panel[...] 与 #components.badge("标签") 调用,组件资源放在声明文件所在目录。
组合示例使用 components.diagram,并直接导入 KaTeX。docs/Notist.toml 的数学映射独立导入 Typst,把内置 math 映射为 typst.math;文档中的直接 katex.math 调用仍使用 KaTeX。映射保持公式原文,不转换 Typst 与 LaTeX 方言。
Example
A simple
This content remains part of the document tree. Formula:
Nested children retain their order and identity.
Pythagoras:
两个 panel 展示嵌套 children 与 expanded 参数;badge 展示大整数属性;diagram 使用配置选中的图形组件。内置调用和语法糖使用 Typst,直接 katex.math 调用使用 LaTeX。
草案内容与普通正文使用相同的排版;边框仅标识设计状态,不改变内容结构。
方案已确定,等待实现;内容状态由注解与 CSS 呈现。
已过时的设计保留原文,通过边框和状态标签标记。
段落中的 旧术语 BlockContent = Type{...} 使用红色波浪线,前后的文字保持行内排版。
| 状态 | 说明 |
|---|---|
| 旧定义 | 此行仅在 cell 内侧绘制边框。 |
构建与预览
在仓库根目录执行:
通过 HTTP 打开 /target/components-demo/。panel、badge 与状态样式无需构建步骤或 CDN;组合示例中由配置选择的图形组件、Typst 与 KaTeX 从固定版本 CDN 加载依赖。
Web 预览先构建 ./web/build.sh,通过 HTTP 打开 /web/,Vault 根 URL 为 ../docs/,输出配置为 Notist.toml,源码路径为 components/README.not,点击“载入项目”。
验证
web/tests/browser.cjs 验证此 Example 的静态页面、组件更新与重连、status 注解、项目预览、数学替换与模块诊断。运行前导出 target/components-demo 并构建 web/pkg,Playwright 须在 NODEPATH 上可用。NOTISTTESTURL 指定服务地址,NOTISTCHROMIUM 指定 Chromium 路径,NOTISTCOMPONENTSDEMO 可指定示例页面路径。
在相同的浏览器测试环境中执行 node web/tests/diagrams.cjs,验证同一正文通过配置切换 Pele / Mermaid、保留项目函数身份,并且无需加载声明本身的 Web Component。
web/tests/status.cjs 验证三种状态的块、行内与 cell 样式、嵌套内容、主题、窄屏、打印和无 JavaScript 呈现。运行前执行 cargo run -p notist-cli -- build --out-dir target/status-preview 并通过 HTTP 服务仓库;Playwright、NOTISTTESTURL 与 NOTIST_CHROMIUM 的约定相同。