diff --git a/src/components/DocDialog.tsx b/src/components/DocDialog.tsx
index c955c4b..d566106 100644
--- a/src/components/DocDialog.tsx
+++ b/src/components/DocDialog.tsx
@@ -150,19 +150,12 @@ const DocContent: Component<{ entry: DocEntry }> = (props) => {
-
+
示例
- {e.examples}
+ {e.body}
-
-
);
};
diff --git a/src/components/doc-data.ts b/src/components/doc-data.ts
index 5cad2b4..9f890af 100644
--- a/src/components/doc-data.ts
+++ b/src/components/doc-data.ts
@@ -1,3 +1,5 @@
+import yaml from "js-yaml";
+
export interface DocEntry {
tag: string;
icon: string;
@@ -5,350 +7,72 @@ export interface DocEntry {
description: string;
syntax: string;
props: { name: string; type: string; default?: string; desc: string }[];
- examples: string;
- usage: string;
+ /** Markdown body (everything after frontmatter ---) */
+ body: string;
}
-export const docEntries: DocEntry[] = [
- {
- tag: "md-dice",
- icon: "🎲",
- title: "骰子组件",
- description: "点击文字执行掷骰,可用于属性检定、伤害投掷等场景。",
- syntax: ':md-dice[2d6+d8]{key="attack"}',
- props: [
- {
- name: "key",
- type: "string",
- desc: "URL 参数标识,结果记录到 ?dice-key=15",
- },
- ],
- examples: `**攻击检定:** :md-dice[1d20+5]{key="attack"}
+/** Splits frontmatter and markdown body from a raw .md string. */
+function parseFrontmatter(raw: string): Record | null {
+ const match = raw.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
+ if (!match) return null;
+ try {
+ return yaml.load(match[1]) as Record;
+ } catch {
+ return null;
+ }
+}
-**伤害掷骰:** :md-dice[2d6+3]{key="damage"}
+function getBody(raw: string): string {
+ const match = raw.match(/^---\n[\s\S]*?\n---\n?([\s\S]*)$/);
+ return match ? match[1] : raw;
+}
-**优势检定:** :md-dice[2d20k1+5]{key="advantage"}
+/** Glob import all .md files in src/doc-entries/ */
+const modules = import.meta.webpackContext("./", {
+ recursive: false,
+ regExp: /\.md$/,
+});
-点击掷骰文字执行投掷,再次点击重置为公式。`,
- usage: "用于技能检定、攻击命中、伤害计算等需要随机数的场景。",
- },
- {
- tag: "md-table",
- icon: "📊",
- title: "表格组件",
- description:
- "将 CSV 数据转换为可切换标签页的表格,支持随机抽取和变量引用。",
- syntax: ":md-table[./data.csv]{roll=true remix=true}",
- props: [
- { name: "roll", type: "boolean", desc: "显示随机切换按钮" },
- { name: "remix", type: "boolean", desc: "支持 {{prop}} 引用同行其他列" },
- ],
- examples: `**基础表格:**
-\`\`\`markdown
-:md-table[./npcs.csv]
-\`\`\`
+/** Lazy-loaded doc entries, parsed on first access. */
+let _entries: DocEntry[] | null = null;
-**带随机抽取:**
-\`\`\`markdown
-:md-table[./encounters.csv]{roll=true}
-\`\`\`
+export function loadDocEntries(): DocEntry[] {
+ if (_entries) return _entries;
-**随机 + 变量引用:**
-\`\`\`markdown
-:md-table[./quests.csv]{roll=true remix=true}
-\`\`\`
+ const entries: DocEntry[] = [];
-CSV 要求包含 label, body 列,可选 group 列分组。支持 YAML front matter 继承行属性。`,
- usage: "用于 NPC 列表、遭遇表、宝物生成、随机事件等结构化数据。",
- },
- {
- tag: "md-link",
- icon: "🔗",
- title: "链接组件",
- description: "点击链接在当前页面内展开显示目标文章内容,支持章节定位。",
- syntax: ":md-link[./rules.md#combat]",
- props: [],
- examples: `**展开完整文档:**
-:md-link[./rules.md]
+ for (const key of modules.keys()) {
+ const mod = modules(key);
+ const raw =
+ typeof mod === "string"
+ ? mod
+ : ((mod as { default?: string }).default ?? "");
+ if (!raw) continue;
-**展开特定章节:**
-:md-link[./rules.md#combat]
+ const fm = parseFrontmatter(raw);
+ if (!fm) continue;
-点击链接即可内联展开目标内容,再次点击折叠。`,
- usage: "用于引用规则书章节、怪物数据、快速预览等场景。",
- },
- {
- tag: "md-pins",
- icon: "📍",
- title: "标记组件",
- description:
- "在地图或图片上添加可编辑或固定的位置标记,支持字母或数字标签。",
- syntax: ':md-pins[./images/map.png]{pins="A:30,40 B:10,30" fixed}',
- props: [
- {
- name: "pins",
- type: "string",
- default: '""',
- desc: '标记列表,格式 "A:x,y B:x,y"',
- },
- {
- name: "fixed",
- type: "boolean",
- default: "false",
- desc: "固定模式(只读不可编辑)",
- },
- {
- name: "labelStart",
- type: "string",
- default: '"A"',
- desc: "标签起始值,支持字母或数字",
- },
- ],
- examples: `**固定标记(只读):**
-:md-pins[./images/battle-map.png]{pins="A:25,50 B:75,30" fixed}
+ const body = getBody(raw);
-**可编辑标记:**
-:md-pins[./images/blank-map.png]
+ entries.push({
+ tag: fm.tag as string,
+ icon: fm.icon as string,
+ title: fm.title as string,
+ description: fm.description as string,
+ syntax: fm.syntax as string,
+ props: (fm.props as DocEntry["props"]) ?? [],
+ body,
+ });
+ }
-**数字标签:**
-:md-pins[./images/dungeon.png]{labelStart="1"}
+ // Sort alphabetically by tag
+ entries.sort((a, b) => a.tag.localeCompare(b.tag));
+ _entries = entries;
+ return entries;
+}
-非 fixed 模式下点击图片添加标记,点击标记删除。`,
- usage: "用于战斗地图标注、地牢房间标记、任务地点指示等。",
- },
- {
- tag: "md-font",
- icon: "🔤",
- title: "字体组件",
- description:
- "设置整个文档的字体和文字颜色,支持 Google Fonts、emfont 和系统本地字体三种来源。",
- syntax:
- ':md-font[Noto Sans SC]{source="google" weight="400" color="#ff00dd"}',
- props: [
- {
- name: "source",
- type: "google | emfont | local",
- default: "local",
- desc: "字体来源",
- },
- { name: "weight", type: "string", default: '"400"', desc: "字体粗细" },
- {
- name: "color",
- type: "string",
- desc: "文字颜色(CSS 颜色值,如 #ff00dd、rgb(255,0,0))",
- },
- ],
- examples: `**Google 字体:**
-:md-font[Noto Sans SC]{source="google"}
-
-**Emfont 字体:**
-:md-font[Source Han Serif]{source="emfont" weight="700"}
-
-**本地字体(默认):**
-:md-font[STSong]
-
-**设置文字颜色:**
-:md-font[Noto Sans SC]{source="google" color="#1a1a2e"}
-
-:md-font[Noto Sans SC]{source="google" weight="700" color="crimson"}
-
-字体和颜色将应用到整个文档卡片。`,
- usage: "用于切换文档的显示字体和文字颜色,适配不同风格需求。",
- },
- {
- tag: "md-bg",
- icon: "🖼️",
- title: "背景组件",
- description: "设置背景图片或纯色作为文章卡片背景,支持多种适配方式。",
- syntax: ":md-bg[#ff00dd]",
- props: [
- {
- name: "fit",
- type: "cover | contain | fill | none | scale-down",
- default: "cover",
- desc: "背景适配方式(仅图片时生效)",
- },
- ],
- examples: `**设置背景图:**
-:md-bg[./images/dungeon-bg.jpg]{fit="cover"}
-
-**设置纯色背景:**
-:md-bg[#2a1a3a]
-
-:md-bg[rgb(200,50,50)]
-
-:md-bg[#ff00dd]
-
-支持图片路径或任意 CSS 颜色值(hex、rgb、颜色名等)。`,
- usage:
- "用于营造场景氛围,如地牢、森林、城镇等不同环境的背景,或纯色区分不同主题。",
- },
- {
- tag: "md-font",
- icon: "🔤",
- title: "字体组件",
- description:
- "设置整个文档的字体,支持 Google Fonts、emfont 和系统本地字体三种来源。",
- syntax: ':md-font[Noto Sans SC]{source="google" weight="400"}',
- props: [
- {
- name: "source",
- type: "google | emfont | local",
- default: "local",
- desc: "字体来源",
- },
- { name: "weight", type: "string", default: '"400"', desc: "字体粗细" },
- ],
- examples: `**Google 字体:**
-:md-font[Noto Sans SC]{source="google"}
-
-**Emfont 字体:**
-:md-font[Source Han Serif]{source="emfont" weight="700"}
-
-**本地字体(默认):**
-:md-font[STSong]
-
-字体将应用到整个文档卡片。`,
- usage: "用于切换文档的显示字体,适配不同风格需求。",
- },
- {
- tag: "md-border",
- icon: "🖼️",
- title: "边框组件",
- description: "为文档卡片添加纯色或图片边框,支持指定边、样式和重复模式。",
- syntax: ":md-border[#3b82f6]{.l .dashed}",
- props: [
- {
- name: "width",
- type: "string",
- default: "纯色 .1mm,图片 2mm",
- desc: "边框宽度",
- },
- {
- name: "slice",
- type: "string",
- default: '"10"',
- desc: "border-image-slice(仅图片模式)",
- },
- ],
- examples: `**纯色左边框:**
-:md-border[#3b82f6]{.l}
-
-**虚线上下边框:**
-:md-border[red]{.t .b .dashed width=".2mm"}
-
-**图片边框:**
-:md-border[./images/frame.png]{.all .round}
-
-**左右图片竖条:**
-:md-border[./images/ornament.png]{.l .r .repeat}
-
-边 class:\`t\` \`b\` \`l\` \`r\` \`all\`(默认)\n样式 class:\`solid\` \`dashed\` \`dotted\` \`double\`\n图片 class:\`stretch\` \`repeat\` \`round\` \`space\``,
- usage: "用于装饰文档卡片,配合背景和字体营造特定风格。",
- },
- {
- tag: "md-embed",
- icon: "📄",
- title: "嵌入组件",
- description: "将另一个 Markdown 文件的内容内联嵌入到当前文档中。",
- syntax: ":md-embed[./rules.md#combat]",
- props: [],
- examples: `**嵌入完整文档:**
-:md-embed[./rules.md]
-
-**嵌入指定章节:**
-:md-embed[./rules.md#combat]
-
-嵌入后内容直接在当前位置显示,包括其中的表格、骰子等组件也会正常渲染。`,
- usage: "用于在文档中引用通用规则、重复使用的数据表格等。",
- },
- {
- tag: "md-deck",
- icon: "🃏",
- title: "卡牌组件",
- description: "将 CSV 数据渲染为卡牌布局,支持自定义网格和图层的排版。",
- syntax:
- ':md-deck[./cards.csv]{grid="5x8" layers="title:1,1-5,1f8 body:1,5-8,8f3"}',
- props: [
- { name: "grid", type: "string", desc: "卡牌布局,格式 行x列" },
- {
- name: "layers",
- type: "string",
- desc: "图层定义,格式 字段:行,列-列,字号",
- },
- ],
- examples: `**基础卡牌:**
-:md-deck[./spells.csv]{grid="3x3"}
-
-**多层卡牌:**
-:md-deck[./cards.csv]{grid="5x8" layers="title:1,1-5,1f8 body:1,5-8,8f3"}
-
-CSV 包含 label 和显示字段列,通过图层定义控制各字段的位置和大小。`,
- usage: "用于法术卡、物品卡、NPC 卡等可打印的卡牌排版。",
- },
- {
- tag: "md-yarn-spinner",
- icon: "🧶",
- title: "叙事线组件",
- description: "展示 Yarn Spinner 格式的分支叙事结构,支持对话选择和分支。",
- syntax: ":md-yarn-spinner[./story.yarn]",
- props: [],
- examples: `**加载叙事文件:**
-:md-yarn-spinner[./story.yarn]
-
-Yarn Spinner 是用于游戏对话系统的格式,支持选项、条件分支和变量。`,
- usage: "用于互动故事、分支对话、冒险剧本等。",
- },
- {
- tag: "md-token",
- icon: "🪙",
- title: "代币组件",
- description: "展示游戏代币或棋子的图片。",
- syntax: ":md-token[./token.png]",
- props: [],
- examples: `**展示代币:**
-:md-token[./goblin.png]
-
-代币图片自动渲染为圆形,适合战棋或卡牌中的棋子展示。`,
- usage: "用于展示怪物代币、角色棋子、道具图标等。",
- },
- {
- tag: "md-token-viewer",
- icon: "🎨",
- title: "代币预览组件",
- description:
- "使用 Three.js 在浏览器中 3D 渲染 3MF 格式的代币模型,支持旋转查看。",
- syntax: ":md-token-viewer[./token.3mf]",
- props: [],
- examples: `**3D 预览模型:**
-:md-token-viewer[./dragon.3mf]
-
-支持鼠标拖拽旋转和自动旋转,从多角度查看模型细节。`,
- usage: "用于 3D 打印前的代币模型预览。",
- },
- {
- tag: "md-commander",
- icon: "📋",
- title: "命令追踪器",
- description: "支持命令历史和游戏状态追踪,使用类 Emmet 语法创建追踪项。",
- syntax: ":md-commander",
- props: [],
- examples: `**追踪 NPC 血量和防御:**
-\`\`\`
-track npc#john.dwarf.warrior[hp=4/4 ac=15 name="John"]
-\`\`\`
-
-**语法规则:**
-- \`#id\` 设置 ID
-- \`.class\` 添加类别
-- \`[attr=value]\` 设置属性
-
-**属性类型:**
-| 格式 | 显示 |
-|---|---|
-| x/y | 进度条 |
-| 整数 | 计数器 |
-| 文本 | 文本字段 |`,
- usage: "用于追踪战斗中的 NPC 血量、AC、状态等游戏信息。",
- },
-];
+/**
+ * Direct static array for the DocDialog sidebar — uses webpackContext
+ * so all .md files in doc-entries/ are bundled automatically.
+ */
+export const docEntries = loadDocEntries();
diff --git a/src/doc-entries/md-bg.md b/src/doc-entries/md-bg.md
new file mode 100644
index 0000000..b7af271
--- /dev/null
+++ b/src/doc-entries/md-bg.md
@@ -0,0 +1,28 @@
+---
+tag: md-bg
+icon: 🖼️
+title: 背景组件
+description: 设置背景图片或纯色作为文章卡片背景,支持多种适配方式。
+syntax: ':md-bg[#ff00dd]'
+props:
+ - name: fit
+ type: cover | contain | fill | none | scale-down
+ default: cover
+ desc: 背景适配方式(仅图片时生效)
+---
+
+**设置背景图:**
+:md-bg[./images/dungeon-bg.jpg]{fit="cover"}
+
+**设置纯色背景:**
+:md-bg[#2a1a3a]
+
+:md-bg[rgb(200,50,50)]
+
+:md-bg[#ff00dd]
+
+支持图片路径或任意 CSS 颜色值(hex、rgb、颜色名等)。
+
+## 使用场景
+
+用于营造场景氛围,如地牢、森林、城镇等不同环境的背景,或纯色区分不同主题。
\ No newline at end of file
diff --git a/src/doc-entries/md-border.md b/src/doc-entries/md-border.md
new file mode 100644
index 0000000..143b3d9
--- /dev/null
+++ b/src/doc-entries/md-border.md
@@ -0,0 +1,36 @@
+---
+tag: md-border
+icon: 🖼️
+title: 边框组件
+description: 为文档卡片添加纯色或图片边框,支持指定边、样式和重复模式。
+syntax: ':md-border[#3b82f6]{.l .dashed}'
+props:
+ - name: width
+ type: string
+ default: 纯色 .2mm,图片 2mm
+ desc: 边框宽度
+ - name: slice
+ type: string
+ default: '"10"'
+ desc: border-image-slice(仅图片模式)
+---
+
+**纯色左边框:**
+:md-border[#3b82f6]{.l}
+
+**虚线上下边框:**
+:md-border[red]{.t .b .dashed width=".2mm"}
+
+**图片边框:**
+:md-border[./images/frame.png]{.all .round}
+
+**左右图片竖条:**
+:md-border[./images/ornament.png]{.l .r .repeat}
+
+边 class:`t` `b` `l` `r` `all`(默认)
+样式 class:`solid` `dashed` `dotted` `double`
+图片 class:`stretch` `repeat` `round` `space`
+
+## 使用场景
+
+用于装饰文档卡片,配合背景和字体营造特定风格。
\ No newline at end of file
diff --git a/src/doc-entries/md-commander.md b/src/doc-entries/md-commander.md
new file mode 100644
index 0000000..341a719
--- /dev/null
+++ b/src/doc-entries/md-commander.md
@@ -0,0 +1,29 @@
+---
+tag: md-commander
+icon: 📋
+title: 命令追踪器
+description: 支持命令历史和游戏状态追踪,使用类 Emmet 语法创建追踪项。
+syntax: ':md-commander'
+props: []
+---
+
+**追踪 NPC 血量和防御:**
+```
+track npc#john.dwarf.warrior[hp=4/4 ac=15 name="John"]
+```
+
+**语法规则:**
+- `#id` 设置 ID
+- `.class` 添加类别
+- `[attr=value]` 设置属性
+
+**属性类型:**
+| 格式 | 显示 |
+|---|---|
+| x/y | 进度条 |
+| 整数 | 计数器 |
+| 文本 | 文本字段 |
+
+## 使用场景
+
+用于追踪战斗中的 NPC 血量、AC、状态等游戏信息。
\ No newline at end of file
diff --git a/src/doc-entries/md-deck.md b/src/doc-entries/md-deck.md
new file mode 100644
index 0000000..bee174a
--- /dev/null
+++ b/src/doc-entries/md-deck.md
@@ -0,0 +1,26 @@
+---
+tag: md-deck
+icon: 🃏
+title: 卡牌组件
+description: 将 CSV 数据渲染为卡牌布局,支持自定义网格和图层的排版。
+syntax: ':md-deck[./cards.csv]{grid="5x8" layers="title:1,1-5,1f8 body:1,5-8,8f3"}'
+props:
+ - name: grid
+ type: string
+ desc: 卡牌布局,格式 行x列
+ - name: layers
+ type: string
+ desc: 图层定义,格式 字段:行,列-列,字号
+---
+
+**基础卡牌:**
+:md-deck[./spells.csv]{grid="3x3"}
+
+**多层卡牌:**
+:md-deck[./cards.csv]{grid="5x8" layers="title:1,1-5,1f8 body:1,5-8,8f3"}
+
+CSV 包含 label 和显示字段列,通过图层定义控制各字段的位置和大小。
+
+## 使用场景
+
+用于法术卡、物品卡、NPC 卡等可打印的卡牌排版。
\ No newline at end of file
diff --git a/src/doc-entries/md-dice.md b/src/doc-entries/md-dice.md
new file mode 100644
index 0000000..b64abcf
--- /dev/null
+++ b/src/doc-entries/md-dice.md
@@ -0,0 +1,23 @@
+---
+tag: md-dice
+icon: 🎲
+title: 骰子组件
+description: 点击文字执行掷骰,可用于属性检定、伤害投掷等场景。
+syntax: ':md-dice[2d6+d8]{key="attack"}'
+props:
+ - name: key
+ type: string
+ desc: URL 参数标识,结果记录到 ?dice-key=15
+---
+
+**攻击检定:** :md-dice[1d20+5]{key="attack"}
+
+**伤害掷骰:** :md-dice[2d6+3]{key="damage"}
+
+**优势检定:** :md-dice[2d20k1+5]{key="advantage"}
+
+点击掷骰文字执行投掷,再次点击重置为公式。
+
+## 使用场景
+
+用于技能检定、攻击命中、伤害计算等需要随机数的场景。
\ No newline at end of file
diff --git a/src/doc-entries/md-embed.md b/src/doc-entries/md-embed.md
new file mode 100644
index 0000000..b748908
--- /dev/null
+++ b/src/doc-entries/md-embed.md
@@ -0,0 +1,20 @@
+---
+tag: md-embed
+icon: 📄
+title: 嵌入组件
+description: 将另一个 Markdown 文件的内容内联嵌入到当前文档中。
+syntax: ':md-embed[./rules.md#combat]'
+props: []
+---
+
+**嵌入完整文档:**
+:md-embed[./rules.md]
+
+**嵌入指定章节:**
+:md-embed[./rules.md#combat]
+
+嵌入后内容直接在当前位置显示,包括其中的表格、骰子等组件也会正常渲染。
+
+## 使用场景
+
+用于在文档中引用通用规则、重复使用的数据表格等。
\ No newline at end of file
diff --git a/src/doc-entries/md-font.md b/src/doc-entries/md-font.md
new file mode 100644
index 0000000..a326509
--- /dev/null
+++ b/src/doc-entries/md-font.md
@@ -0,0 +1,39 @@
+---
+tag: md-font
+icon: 🔤
+title: 字体组件
+description: 设置整个文档的字体和文字颜色,支持 Google Fonts、emfont 和系统本地字体三种来源。
+syntax: ':md-font[Noto Sans SC]{source="google" weight="400" color="#ff00dd"}'
+props:
+ - name: source
+ type: google | emfont | local
+ default: local
+ desc: 字体来源
+ - name: weight
+ type: string
+ default: '"400"'
+ desc: 字体粗细
+ - name: color
+ type: string
+ desc: 文字颜色(CSS 颜色值,如 #ff00dd、rgb(255,0,0))
+---
+
+**Google 字体:**
+:md-font[Noto Sans SC]{source="google"}
+
+**Emfont 字体:**
+:md-font[Source Han Serif]{source="emfont" weight="700"}
+
+**本地字体(默认):**
+:md-font[STSong]
+
+**设置文字颜色:**
+:md-font[Noto Sans SC]{source="google" color="#1a1a2e"}
+
+:md-font[Noto Sans SC]{source="google" weight="700" color="crimson"}
+
+字体和颜色将应用到整个文档卡片。
+
+## 使用场景
+
+用于切换文档的显示字体和文字颜色,适配不同风格需求。
\ No newline at end of file
diff --git a/src/doc-entries/md-link.md b/src/doc-entries/md-link.md
new file mode 100644
index 0000000..c5c44b5
--- /dev/null
+++ b/src/doc-entries/md-link.md
@@ -0,0 +1,20 @@
+---
+tag: md-link
+icon: 🔗
+title: 链接组件
+description: 点击链接在当前页面内展开显示目标文章内容,支持章节定位。
+syntax: ':md-link[./rules.md#combat]'
+props: []
+---
+
+**展开完整文档:**
+:md-link[./rules.md]
+
+**展开特定章节:**
+:md-link[./rules.md#combat]
+
+点击链接即可内联展开目标内容,再次点击折叠。
+
+## 使用场景
+
+用于引用规则书章节、怪物数据、快速预览等场景。
\ No newline at end of file
diff --git a/src/doc-entries/md-pins.md b/src/doc-entries/md-pins.md
new file mode 100644
index 0000000..00cbda4
--- /dev/null
+++ b/src/doc-entries/md-pins.md
@@ -0,0 +1,35 @@
+---
+tag: md-pins
+icon: 📍
+title: 标记组件
+description: 在地图或图片上添加可编辑或固定的位置标记,支持字母或数字标签。
+syntax: ':md-pins[./images/map.png]{pins="A:30,40 B:10,30" fixed}'
+props:
+ - name: pins
+ type: string
+ default: '""'
+ desc: 标记列表,格式 "A:x,y B:x,y"
+ - name: fixed
+ type: boolean
+ default: "false"
+ desc: 固定模式(只读不可编辑)
+ - name: labelStart
+ type: string
+ default: '"A"'
+ desc: 标签起始值,支持字母或数字
+---
+
+**固定标记(只读):**
+:md-pins[./images/battle-map.png]{pins="A:25,50 B:75,30" fixed}
+
+**可编辑标记:**
+:md-pins[./images/blank-map.png]
+
+**数字标签:**
+:md-pins[./images/dungeon.png]{labelStart="1"}
+
+非 fixed 模式下点击图片添加标记,点击标记删除。
+
+## 使用场景
+
+用于战斗地图标注、地牢房间标记、任务地点指示等。
\ No newline at end of file
diff --git a/src/doc-entries/md-table.md b/src/doc-entries/md-table.md
new file mode 100644
index 0000000..f081b2b
--- /dev/null
+++ b/src/doc-entries/md-table.md
@@ -0,0 +1,35 @@
+---
+tag: md-table
+icon: 📊
+title: 表格组件
+description: 将 CSV 数据转换为可切换标签页的表格,支持随机抽取和变量引用。
+syntax: ':md-table[./data.csv]{roll=true remix=true}'
+props:
+ - name: roll
+ type: boolean
+ desc: 显示随机切换按钮
+ - name: remix
+ type: boolean
+ desc: 支持 {{prop}} 引用同行其他列
+---
+
+**基础表格:**
+```markdown
+:md-table[./npcs.csv]
+```
+
+**带随机抽取:**
+```markdown
+:md-table[./encounters.csv]{roll=true}
+```
+
+**随机 + 变量引用:**
+```markdown
+:md-table[./quests.csv]{roll=true remix=true}
+```
+
+CSV 要求包含 label, body 列,可选 group 列分组。支持 YAML front matter 继承行属性。
+
+## 使用场景
+
+用于 NPC 列表、遭遇表、宝物生成、随机事件等结构化数据。
\ No newline at end of file
diff --git a/src/doc-entries/md-token-viewer.md b/src/doc-entries/md-token-viewer.md
new file mode 100644
index 0000000..e7408ac
--- /dev/null
+++ b/src/doc-entries/md-token-viewer.md
@@ -0,0 +1,17 @@
+---
+tag: md-token-viewer
+icon: 🎨
+title: 代币预览组件
+description: 使用 Three.js 在浏览器中 3D 渲染 3MF 格式的代币模型,支持旋转查看。
+syntax: ':md-token-viewer[./token.3mf]'
+props: []
+---
+
+**3D 预览模型:**
+:md-token-viewer[./dragon.3mf]
+
+支持鼠标拖拽旋转和自动旋转,从多角度查看模型细节。
+
+## 使用场景
+
+用于 3D 打印前的代币模型预览。
\ No newline at end of file
diff --git a/src/doc-entries/md-token.md b/src/doc-entries/md-token.md
new file mode 100644
index 0000000..7fe7f8d
--- /dev/null
+++ b/src/doc-entries/md-token.md
@@ -0,0 +1,17 @@
+---
+tag: md-token
+icon: 🪙
+title: 代币组件
+description: 展示游戏代币或棋子的图片。
+syntax: ':md-token[./token.png]'
+props: []
+---
+
+**展示代币:**
+:md-token[./goblin.png]
+
+代币图片自动渲染为圆形,适合战棋或卡牌中的棋子展示。
+
+## 使用场景
+
+用于展示怪物代币、角色棋子、道具图标等。
\ No newline at end of file
diff --git a/src/doc-entries/md-yarn-spinner.md b/src/doc-entries/md-yarn-spinner.md
new file mode 100644
index 0000000..f11a1da
--- /dev/null
+++ b/src/doc-entries/md-yarn-spinner.md
@@ -0,0 +1,17 @@
+---
+tag: md-yarn-spinner
+icon: 🧶
+title: 叙事线组件
+description: 展示 Yarn Spinner 格式的分支叙事结构,支持对话选择和分支。
+syntax: ':md-yarn-spinner[./story.yarn]'
+props: []
+---
+
+**加载叙事文件:**
+:md-yarn-spinner[./story.yarn]
+
+Yarn Spinner 是用于游戏对话系统的格式,支持选项、条件分支和变量。
+
+## 使用场景
+
+用于互动故事、分支对话、冒险剧本等。
\ No newline at end of file