diff --git a/src/components/DocDialog.tsx b/src/components/DocDialog.tsx
index cb7ab20..a2ec717 100644
--- a/src/components/DocDialog.tsx
+++ b/src/components/DocDialog.tsx
@@ -162,73 +162,12 @@ const DocContent: Component<{ entry: AnyEntry }> = (props) => {
return (
-
+
{e.icon} {e.title}
-
- :{e.tag}
-
-
{e.description}
-
-
-
- 基本语法
-
-
- {e.syntax}
-
-
-
-
0}>
-
-
- 属性
-
-
-
-
- |
- 属性
- |
-
- 类型
- |
-
- 默认值
- |
- 说明 |
-
-
-
-
- {(prop) => (
-
-
-
- {prop.name}
-
- |
-
- {prop.type}
- |
-
- {prop.default ?? "—"}
- |
- {prop.desc} |
-
- )}
-
-
-
-
-
-
-
-
示例
-
- {e.body}
-
+
+ {e.body}
);
diff --git a/src/components/doc-data.ts b/src/components/doc-data.ts
index e093c59..45d75e1 100644
--- a/src/components/doc-data.ts
+++ b/src/components/doc-data.ts
@@ -4,16 +4,12 @@ export interface DocEntry {
tag: string;
icon: string;
title: string;
- description: string;
- syntax: string;
- props: { name: string; type: string; default?: string; desc: string }[];
- /** Markdown body (everything after frontmatter ---) */
+ /** Full markdown body (everything after frontmatter ---) */
body: string;
}
/** Splits frontmatter and markdown body from a raw .md string. */
function parseFrontmatter(raw: string): Record
| null {
- // Handle CRLF line endings by normalizing to LF first
const normalized = raw.replace(/\r\n/g, "\n");
const match = normalized.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
if (!match) return null;
@@ -27,7 +23,7 @@ function parseFrontmatter(raw: string): Record | null {
function getBody(raw: string): string {
const normalized = raw.replace(/\r\n/g, "\n");
const match = normalized.match(/^---\n[\s\S]*?\n---\n?([\s\S]*)$/);
- return match ? match[1] : raw;
+ return (match ? match[1] : raw).trim();
}
function parseEntry(raw: string): DocEntry | null {
@@ -37,9 +33,6 @@ function parseEntry(raw: string): DocEntry | null {
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: getBody(raw),
};
}
diff --git a/src/components/journal-doc-data.ts b/src/components/journal-doc-data.ts
index 6cbd567..1b1b1dd 100644
--- a/src/components/journal-doc-data.ts
+++ b/src/components/journal-doc-data.ts
@@ -4,9 +4,7 @@ export interface JournalDocEntry {
tag: string;
icon: string;
title: string;
- description: string;
- syntax: string;
- props: { name: string; type: string; default?: string; desc: string }[];
+ /** Full markdown body (everything after frontmatter ---) */
body: string;
}
@@ -24,7 +22,7 @@ function parseFrontmatter(raw: string): Record | null {
function getBody(raw: string): string {
const normalized = raw.replace(/\r\n/g, "\n");
const match = normalized.match(/^---\n[\s\S]*?\n---\n?([\s\S]*)$/);
- return match ? match[1] : raw;
+ return (match ? match[1] : raw).trim();
}
function parseEntry(raw: string): JournalDocEntry | null {
@@ -34,9 +32,6 @@ function parseEntry(raw: string): JournalDocEntry | null {
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 JournalDocEntry["props"]) ?? [],
body: getBody(raw),
};
}
diff --git a/src/doc-entries/journal-gm.md b/src/doc-entries/journal-gm.md
index 17a10bd..03146e0 100644
--- a/src/doc-entries/journal-gm.md
+++ b/src/doc-entries/journal-gm.md
@@ -2,20 +2,12 @@
tag: journal-gm
icon: 🎭
title: 主持人指南
-description: 作为 GM 创建会话、管理玩家、使用动态表单和消息类型。
-syntax: '点击导航栏 📋 图标打开 Journal 面板'
-props:
- - name: 会话管理
- type: —
- desc: 创建、切换、删除会话;通过邀请链接添加玩家
- - name: 消息类型
- type: —
- desc: 发送叙述、掷骰、表单等多种消息类型
- - name: 动态表单
- type: —
- desc: 创建自定义表单收集玩家输入
---
+作为 GM 创建会话、管理玩家、使用命令与玩家互动。
+
+点击顶部导航栏的 📋 按钮打开 Journal 面板。
+
## 快速开始
1. 点击顶部导航栏的 📋 按钮打开 Journal 面板
@@ -32,25 +24,20 @@ props:
玩家通过邀请链接加入后会自动以玩家身份连接。
-## 消息类型
+## 消息与命令
-Journal 支持多种消息类型,通过输入框上方的标签切换:
+Journal 使用斜杠命令来发送不同类型的消息。在输入框中输入命令,按 Enter 发送:
-- **叙述**:普通的文字描述,用于推进剧情
-- **掷骰**:发送掷骰结果,可附带公式
-- **表单**:创建动态表单,收集玩家选择或输入
+- **聊天**:直接输入文字,按 Enter 发送普通叙述消息
+- **`/roll 表达式`**:掷骰或抽取火花表。传入骰子表达式(如 `/roll 3d6`)则掷骰;传入火花表键名(如 `/roll npc`)则抽取火花表
+- **`/link 路径#章节`**:发送可点击的文档链接
+- **`/set $key 值`**:设置变量值,支持数值、标签映射和随机标签
-## 动态表单
-
-表单消息允许你创建交互式问卷:
-
-- 添加文本输入、选择框、复选框等字段
-- 玩家提交后,GM 可以看到汇总结果
-- 适用于投票、决策、角色创建等场景
+输入 `/` 后按 Tab 可打开命令补全下拉菜单。
## 撤回消息
-GM 可以撤回自己发送的最新消息,点击消息旁的撤回按钮即可。
+GM 可以撤回自己发送的最新消息,点击消息卡片右上角的 × 按钮即可。
## 连接状态
@@ -59,4 +46,4 @@ GM 可以撤回自己发送的最新消息,点击消息旁的撤回按钮即
- 🔴 红色:连接错误
- ⚪ 灰色:未连接
-断开连接可点击标题栏的 ⏻ 按钮。
+断开连接可点击标题栏的 ⏻ 按钮。
\ No newline at end of file
diff --git a/src/doc-entries/journal-link.md b/src/doc-entries/journal-link.md
index db58b12..de17a18 100644
--- a/src/doc-entries/journal-link.md
+++ b/src/doc-entries/journal-link.md
@@ -2,27 +2,22 @@
tag: journal-link
icon: 🔗
title: 链接命令
-description: 在 Journal 中发送可点击的文档链接,可指向特定章节。
-syntax: '/link 路径#章节'
-props:
- - name: 路径
- type: string
- desc: 文档路径(不含 .md 扩展名)
- - name: 章节
- type: string
- desc: 可选,文档中的章节标题
---
+在 Journal 中发送可点击的文档链接,可指向特定章节。
+
+**语法:** `/link 路径#章节`
+
## 概述
`/link` 命令用于在 Journal 流中发送文档链接,点击后可在文章区域打开对应文档。
-## 语法
+## 参数
-```
-/link 路径
-/link 路径#章节
-```
+| 参数 | 类型 | 说明 |
+|---|---|---|
+| 路径 | string | 文档路径(不含 `.md` 扩展名) |
+| 章节 | string | 可选,文档中的章节标题 |
## 示例
@@ -36,4 +31,4 @@ props:
- **GM**:可使用
- **玩家**:不可使用
-- **观察者**:不可使用
\ No newline at end of file
+- **观察者**:不可使用
diff --git a/src/doc-entries/journal-player.md b/src/doc-entries/journal-player.md
index 5d6b050..a7e5802 100644
--- a/src/doc-entries/journal-player.md
+++ b/src/doc-entries/journal-player.md
@@ -2,20 +2,12 @@
tag: journal-player
icon: 🎲
title: 玩家指南
-description: 作为玩家加入 GM 的会话,查看消息、提交表单、参与互动。
-syntax: '通过 GM 发送的邀请链接加入'
-props:
- - name: 加入方式
- type: —
- desc: 点击邀请链接自动加入,或手动输入名字和角色
- - name: 查看消息
- type: —
- desc: 实时查看 GM 和其他玩家的消息
- - name: 提交表单
- type: —
- desc: 填写 GM 发送的动态表单并提交
---
+作为玩家加入 GM 的会话,查看消息、使用 `/set` 命令设置变量、参与互动。
+
+通过 GM 发送的邀请链接加入。
+
## 加入会话
有两种方式加入 GM 的会话:
@@ -38,20 +30,17 @@ GM 会发送一个包含 `?session=xxx&player=你的名字&autojoin=1` 的链接
- GM 发送的叙述消息
- 掷骰结果
+- 火花表抽取结果
- 其他玩家的消息
-- 动态表单
消息实时更新,无需刷新页面。
-## 填写表单
+## 使用命令
-当 GM 发送动态表单时:
+玩家可在输入框中使用以下命令:
-1. 表单会显示在消息流中
-2. 根据表单类型填写(文本、选择、复选框等)
-3. 点击提交按钮发送你的回答
-
-GM 可以看到所有玩家的提交结果。
+- **聊天**:直接输入文字,按 Enter 发送普通消息
+- **`/set $key 值`**:设置变量值,支持数值和标签映射
## 角色标识
@@ -63,4 +52,5 @@ GM 可以看到所有玩家的提交结果。
- 玩家无法创建或切换会话
- 玩家无法撤回消息
-- 断开连接后重新加入会保留之前的消息记录
+- 玩家无法使用 `/roll` 和 `/link` 命令
+- 在 CLI 模式下,断开连接后重新加入会保留之前的消息记录
\ No newline at end of file
diff --git a/src/doc-entries/journal-roll.md b/src/doc-entries/journal-roll.md
index 06f4e19..c9da05b 100644
--- a/src/doc-entries/journal-roll.md
+++ b/src/doc-entries/journal-roll.md
@@ -1,28 +1,20 @@
---
tag: journal-roll
icon: 🎲
-title: 掷骰与种子表命令
-description: 在 Journal 中掷骰或随机生成种子表内容。优先匹配种子表,否则作为骰子表达式处理。
-syntax: '/roll 骰子表达式 | 种子表键名'
-props:
- - name: 参数
- type: string
- desc: 骰子表达式(如 3d6、2d8kh1、d20+5)或已定义的种子表 slug
+title: 掷骰与火花表命令
---
+在 Journal 中掷骰或随机抽取火花表内容。优先匹配火花表,否则作为骰子表达式处理。
+
+**语法:** `/roll 骰子表达式 | 火花表键名`
+
## 概述
-`/roll` 命令用于掷骰或随机抽取种子表,并将结果同步到所有客户端。
+`/roll` 命令用于掷骰或随机抽取火花表,并将结果同步到所有客户端。
-- 如果参数匹配已定义的**种子表** slug,则抽取并发布对应种子表的结果。
+- 如果参数匹配已定义的**火花表** slug,则抽取并发布对应火花表的结果。
- 否则,作为**骰子表达式**求值并发布掷骰结果。
-## 语法
-
-```
-/roll 骰子表达式 | 种子表键名
-```
-
## 示例
### 掷骰
@@ -35,7 +27,7 @@ props:
/roll 4d6k3
```
-### 种子表
+### 火花表
```
/roll npc
@@ -53,12 +45,14 @@ props:
| `1d20+5` | 1 个 20 面骰加 5 |
| `4d6k3` | 4 个 6 面骰保留最高 3 个 |
-## 种子表定义
+## 火花表定义
-种子表在文档中通过 `:spark[CSV路径]` 指令或 spark 形状的 markdown 表格定义,CSV 文件的第一列表头为骰子公式(如 d6、d20),后续列为数据列。
+火花表在 markdown 文档中通过 `:spark[CSV路径]` 标记声明,系统扫描文档时自动发现。CSV 文件的第一列表头为骰子公式(如 `d6`、`d20`),后续列为数据列。
+
+抽取时根据骰子公式投掷,查找对应行并将各列数据作为火花表结果发布。
## 权限
- **GM**:可使用
- **玩家**:不可使用
-- **观察者**:不可使用
+- **观察者**:不可使用
\ No newline at end of file
diff --git a/src/doc-entries/journal-set.md b/src/doc-entries/journal-set.md
index cb270ff..aa2b838 100644
--- a/src/doc-entries/journal-set.md
+++ b/src/doc-entries/journal-set.md
@@ -10,7 +10,7 @@ props:
desc: 在任意 .md 文档中使用 ```csv role=declare 代码块定义变量和标签
- name: 命令
type: —
- desc: /set $key expression | /set $key #tag1|#tag2|#tag3
+ desc: /set $key expression | /set $key #tag1:count1;#tag2:count2
- name: 权限
type: —
desc: GM 和玩家均可设置变量
@@ -21,23 +21,25 @@ props:
变量系统允许你定义数值变量和标签,通过命令设置值,系统自动计算派生变量和标签效果。
核心概念:
-- **变量**(`$name`):存储数值或标签,通过 `/set` 命令修改
-- **标签**(`#tag`):当某个变量的值为 `#tag` 时,该标签被激活,触发相应的修饰效果
+- **变量**(`$name`):存储数值或标签映射,通过 `/set` 命令修改
+- **标签映射**(`#tag:count`):变量可以存储一个标签映射(如 `#warrior:2;#druid:1`),每个标签有一个计数值
+- **标签修饰符**:当变量中的标签计数值达到阈值时,修饰符生效
- **声明**(`declare`):在 `role=declare` 代码块中定义派生变量和标签修饰符
## 代码块语法
```csv role=declare
-tag,key,expr
-,$hp,$con*5+$mod_hp
-,$ac,10+$dex
-#warrior,$mod_hp,20
-#warrior,$mod_str,1
+tag,threshold,key,expr
+,,$hp,$con*5+$mod_hp
+,,$ac,10+$dex
+#warrior,1,$mod_hp,20
+#warrior,2,$mod_str,1
```
| 列 | 说明 |
|---|---|
| `tag` | 标签名(空表示普通变量声明) |
+| `threshold` | 激活阈值(可选,默认 `1`)。标签计数值 ≥ 阈值时激活 |
| `key` | 变量名,以 `$` 开头 |
| `expr` | 表达式,支持数字、`$var` 引用、骰子、算术、函数 |
@@ -51,14 +53,18 @@ tag,key,expr
,$ac,10+$dex
```
-**标签修饰符**(tag 非空):当 `#tag` 被激活时,`$key` 的当前值加上表达式的计算结果。
+**标签修饰符**(tag 非空):当源变量的标签映射中 `#tag` 的计数值 ≥ `threshold` 时,`$key` 加上表达式的计算结果。修饰符按阈值独立激活。
```csv role=declare
-tag,key,expr
-#warrior,$mod_hp,20
-#warrior,$mod_str,1
+tag,threshold,key,expr
+#warrior,1,$mod_hp,20
+#warrior,2,$mod_str,1
```
+上例中:
+- `#warrior` 计数 ≥ 1 时,`$mod_hp` 获得 +20
+- `#warrior` 计数 ≥ 2 时,`$mod_str` 获得 +1(需要更高等级)
+
## 表达式语法
支持以下表达式元素:
@@ -72,7 +78,7 @@ tag,key,expr
| 函数 | `floor(x)`, `ceil(x)`, `round(x)` | 取整函数 |
| 括号 | `(2+3)*4` | 分组 |
-变量引用必须解析为数值,不能是标签值(`#warrior`)。如果引用的变量是标签类型,求值会报错。
+变量引用必须解析为数值,不能是标签映射值(`#warrior:1`)。如果引用的变量是标签类型,求值会报错。
## 命令
@@ -81,7 +87,9 @@ tag,key,expr
| 命令 | 示例 | 说明 |
|---|---|---|
| `/set $key expr` | `/set $str 16` | 设置变量为数值 |
-| `/set $key #tag` | `/set $class #warrior` | 设置变量为标签 |
+| `/set $key #tag` | `/set $class #warrior` | 设置单个标签(等价 `#warrior:1`) |
+| `/set $key #tag:count` | `/set $class #warrior:3` | 设置标签及计数值 |
+| `/set $key #t1:c1;#t2:c2` | `/set $class #warrior:2;#druid:1` | 设置多个标签 |
| `/set $key #a\|#b\|#c` | `/set $class #w\|#d\|#s` | 随机选择一个标签 |
### 设置数值
@@ -93,16 +101,23 @@ tag,key,expr
设置后,依赖 `$con` 和 `$dex` 的派生变量(如 `$hp`、`$ac`)会自动重新计算。
-### 设置标签
+### 设置标签映射
```
/set $class #warrior
```
-当 `$class` 设置为 `#warrior` 时:
-1. `#warrior` 标签被激活
-2. 所有 `#warrior` 的修饰符生效:`$mod_hp += 20`,`$mod_str += 1`
-3. 依赖这些变量的派生变量自动重新计算
+等价于 `/set $class #warrior:1`。当 `$class` 的 `#warrior` 计数 ≥ 1 时:
+1. `#warrior` 修饰符中阈值 ≤ 1 的生效
+2. 如 `$mod_hp += 20`,依赖 `$mod_hp` 的派生变量自动重新计算
+
+**多标签示例:**
+
+```
+/set $class #warrior:2;#druid:1
+```
+
+变量 `$class` 同时拥有 `#warrior` 计数 2 和 `#druid` 计数 1,两者的修饰符会同时生效(各自按阈值判断)。
### 随机标签
@@ -110,27 +125,39 @@ tag,key,expr
/set $class #warrior|#druid|#sorcerer|#wizard
```
-从给定标签中随机选择一个设置为变量值。
+从给定标签中随机选择一个,计数值为 1。
## 标签激活
-标签的激活状态由变量的值决定:
+标签的激活状态由变量中标签映射的计数值决定:
-- 如果**任何**变量的值为 `#tag`,该标签被激活
-- 如果**没有**变量的值为 `#tag`,该标签被停用
+- 如果变量的标签映射中 `#tag` 的计数值 = 0(或不存在),该标签停用
+- 计数值 ≥ 修饰符的 `threshold` 时,该修饰符激活
+- 计数值 < `threshold` 时,修饰符停用
- 标签激活时,其修饰符**加到**目标变量上
- 标签停用时,修饰符**从**目标变量中减去
-一个变量只能存储一个值类型:数值或标签,不能同时存储两者。
+### 阈值机制
+
+阈值允许同一标签产生不同层级的效果:
+
+```csv role=declare
+tag,threshold,key,expr
+#warrior,1,$mod_hp,10
+#warrior,3,$mod_hp,20
+```
+
+- `#warrior` 计数 1-2:`$mod_hp` +10
+- `#warrior` 计数 ≥ 3:`$mod_hp` +30(两个修饰符叠加)
+
+一个变量可以存储多个标签(标签映射),支持多职业、混合属性等场景。
## 变量视图
-在 Journal 面板顶部点击 **变量** 标签切换视图:
+在 Journal 面板顶部点击 **变量** 标签切换到变量视图,显示所有已定义的变量及其当前值。
-- **激活标签**:显示当前激活的标签、激活来源和修饰效果
-- **声明变量**:显示由表达式定义的派生变量及其当前值
-- **直接设置**:显示通过 `/set` 直接赋值的变量
-- **标签变量**:显示当前值为标签的变量
+- 每行显示变量名和当前值,标签类型变量以紫色高亮显示
+- 鼠标悬停在变量行上,会弹出气泡显示:声明表达式(如有)和当前激活的标签修饰符(标签名、数值、来源变量)
## 文档模板
@@ -148,20 +175,20 @@ tag,key,expr
在文档中定义:
```csv role=declare
-tag,key,expr
-,$con,10
-,$dex,12
-,$hp,$con*5+$mod_hp
-,$ac,10+$dex
-#warrior,$mod_hp,20
-#warrior,$mod_str,1
+tag,threshold,key,expr
+,,$con,10
+,,$dex,12
+,,$hp,$con*5+$mod_hp
+,,$ac,10+$dex
+#warrior,1,$mod_hp,20
+#warrior,2,$mod_str,1
```
在 Journal 中输入:
```
/set $con 14
-/set $class #warrior
+/set $class #warrior:2
```
结果:
@@ -169,8 +196,8 @@ tag,key,expr
- `$dex = 12`
- `$hp = 14*5 + 20 = 90`
- `$ac = 10 + 12 = 22`
-- `$mod_hp = 20`(来自 `#warrior` 修饰符)
-- `$mod_str = 1`(来自 `#warrior` 修饰符)
+- `$mod_hp = 20`(来自 `#warrior` 修饰符,阈值 1,计数 2 ≥ 1)
+- `$mod_str = 1`(来自 `#warrior` 修饰符,阈值 2,计数 2 ≥ 2)
## 循环依赖
diff --git a/src/doc-entries/journal-spark.md b/src/doc-entries/journal-spark.md
index f60f689..dbb4fd1 100644
--- a/src/doc-entries/journal-spark.md
+++ b/src/doc-entries/journal-spark.md
@@ -1,36 +1,28 @@
---
tag: journal-spark
icon: 🎰
-title: 种子表命令
-description: 在 Journal 中随机生成种子表内容,用于生成随机遭遇、NPC、物品等。
-syntax: '/spark 种子表键名'
-props:
- - name: 种子表键名
- type: string
- desc: 在文档中通过 :spark[CSV路径] 指令定义的种子表 slug
+title: 火花表
---
+在 Journal 中通过 `/roll` 命令随机抽取火花表内容,用于生成随机遭遇、NPC、物品等。
+
+**语法:** `/roll 火花表键名`
+
## 概述
-`/spark` 命令用于从种子表中随机抽取一行并发布结果。种子表在 markdown 文档中通过 `:spark[CSV路径]` 指令定义。
-
-## 语法
-
-```
-/spark 种子表键名
-```
+火花表通过 `/roll` 命令触发:当参数匹配已定义的火花表 slug 时,自动抽取并发布结果,而非作为骰子表达式处理。
## 示例
```
-/spark npc
-/spark encounter
-/spark loot
+/roll npc
+/roll encounter
+/roll loot
```
-## 种子表定义
+## 火花表定义
-种子表在文档中定义:
+火花表在 markdown 文档中通过 `:spark[CSV路径]` 标记声明,CSV 文件的第一列表头为骰子公式(如 `d6`、`d20`),后续列为数据列。系统扫描文档时自动发现这些标记。
```
:spark[npc]
@@ -38,7 +30,7 @@ props:
:spark[loot]
```
-CSV 文件的每一行对应种子表的一个条目,随机选取一行发布。
+抽取时根据骰子公式投掷,查找对应行并发布结果。
## 权限
diff --git a/src/doc-entries/md-bg.md b/src/doc-entries/md-bg.md
index b7af271..03abf12 100644
--- a/src/doc-entries/md-bg.md
+++ b/src/doc-entries/md-bg.md
@@ -2,15 +2,12 @@
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[颜色或图片路径]{选项}`
+
**设置背景图:**
:md-bg[./images/dungeon-bg.jpg]{fit="cover"}
@@ -23,6 +20,12 @@ props:
支持图片路径或任意 CSS 颜色值(hex、rgb、颜色名等)。
+## 属性
+
+| 属性 | 类型 | 默认值 | 说明 |
+|---|---|---|---|
+| `fit` | `cover` \| `contain` \| `fill` \| `none` \| `scale-down` | `cover` | 背景适配方式(仅图片时生效) |
+
## 使用场景
-用于营造场景氛围,如地牢、森林、城镇等不同环境的背景,或纯色区分不同主题。
\ No newline at end of file
+用于营造场景氛围,如地牢、森林、城镇等不同环境的背景,或纯色区分不同主题。
diff --git a/src/doc-entries/md-border.md b/src/doc-entries/md-border.md
index 143b3d9..5bb9d4e 100644
--- a/src/doc-entries/md-border.md
+++ b/src/doc-entries/md-border.md
@@ -2,19 +2,12 @@
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[颜色或图片路径]{方位类 样式类 选项}`
+
**纯色左边框:**
:md-border[#3b82f6]{.l}
@@ -27,9 +20,45 @@ props:
**左右图片竖条:**
:md-border[./images/ornament.png]{.l .r .repeat}
-边 class:`t` `b` `l` `r` `all`(默认)
-样式 class:`solid` `dashed` `dotted` `double`
-图片 class:`stretch` `repeat` `round` `space`
+## 方位类
+
+| class | 说明 |
+|---|---|
+| `t` | 上边框 |
+| `b` | 下边框 |
+| `l` | 左边框 |
+| `r` | 右边框 |
+| `all` | 全部(默认) |
+
+## 样式类
+
+| class | 说明 |
+|---|---|
+| `solid` | 实线 |
+| `dashed` | 虚线 |
+| `dotted` | 点线 |
+| `double` | 双线 |
+| `groove` | 凹槽 |
+| `ridge` | 凸脊 |
+| `inset` | 内嵌 |
+| `outset` | 外凸 |
+| `none` | 无边框 |
+
+## 图片类
+
+| class | 说明 |
+|---|---|
+| `stretch` | 拉伸 |
+| `repeat` | 重复 |
+| `round` | 缩放 |
+| `space` | 间隔 |
+
+## 属性
+
+| 属性 | 类型 | 默认值 | 说明 |
+|---|---|---|---|
+| `width` | string | 纯色 `.2mm`,图片 `2mm` | 边框宽度 |
+| `slice` | string | `"10"` | `border-image-slice`(仅图片模式) |
## 使用场景
diff --git a/src/doc-entries/md-commander.md b/src/doc-entries/md-commander.md
index 341a719..9d23688 100644
--- a/src/doc-entries/md-commander.md
+++ b/src/doc-entries/md-commander.md
@@ -2,28 +2,56 @@
tag: md-commander
icon: 📋
title: 命令追踪器
-description: 支持命令历史和游戏状态追踪,使用类 Emmet 语法创建追踪项。
-syntax: ':md-commander'
-props: []
---
+支持命令历史和游戏状态追踪,使用类 Emmet 语法创建追踪项,支持 CSV 命令模板加载。
+
+**语法:** `:md-commander[./templates.csv]{选项}`
+
**追踪 NPC 血量和防御:**
```
track npc#john.dwarf.warrior[hp=4/4 ac=15 name="John"]
```
-**语法规则:**
+## 语法规则
+
- `#id` 设置 ID
- `.class` 添加类别
- `[attr=value]` 设置属性
-**属性类型:**
+## 属性类型
+
| 格式 | 显示 |
|---|---|
-| x/y | 进度条 |
+| `x/y` | 进度条 |
| 整数 | 计数器 |
| 文本 | 文本字段 |
+## 视图模式
+
+组件有两个标签页,通过顶部标签栏切换:
+
+- **历史**:显示命令执行历史,点击可重新填入命令
+- **追踪**:显示当前追踪的所有项目,支持属性编辑、类管理、排序和删除
+
+## 键盘快捷键
+
+| 快捷键 | 说明 |
+|---|---|
+| `Enter` | 执行命令 |
+| `Tab` | 接受自动补全 |
+| `↑` / `↓` | 补全列表导航 / 命令历史导航 |
+| `Escape` | 关闭补全菜单 |
+
+## 属性
+
+| 属性 | 类型 | 默认值 | 说明 |
+|---|---|---|---|
+| `placeholder` | string | `"输入命令..."` | 输入框占位符 |
+| `class` | string | — | 额外 CSS 类 |
+| `height` | string | `"400px"` | 组件高度 |
+| `commandTemplates` | string | — | CSV 模板文件路径 |
+
## 使用场景
用于追踪战斗中的 NPC 血量、AC、状态等游戏信息。
\ No newline at end of file
diff --git a/src/doc-entries/md-deck.md b/src/doc-entries/md-deck.md
index bee174a..35bae8a 100644
--- a/src/doc-entries/md-deck.md
+++ b/src/doc-entries/md-deck.md
@@ -2,24 +2,46 @@
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: 图层定义,格式 字段:行,列-列,字号
---
+将 CSV 数据渲染为可打印的卡牌布局,支持自定义尺寸、网格、图层和双面排版。
+
+**语法:** `:md-deck[./cards.csv]{选项}`
+
**基础卡牌:**
: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 和显示字段列,通过图层定义控制各字段的位置和大小。
+CSV 包含数据字段列,通过图层定义控制各字段的位置、大小和对齐。
+
+## 图层格式
+
+`layers` 属性格式为 `字段:起始行,起始列-结束列,字号`,多个图层用空格分隔:
+
+- **字段**:CSV 中的列名
+- **起始行,起始列-结束列**:图层在网格中的位置(1-based)
+- **字号**:末尾带 `f` 前缀,如 `f8` 表示 8mm
+
+示例:`"title:1,1-5,1f8 body:1,5-8,8f3"` 表示 title 字段占第 1 行、第 1 到 5 列、字号 8mm;body 字段占第 1 行、第 5 到 8 列、字号 3mm。
+
+## 属性
+
+| 属性 | 类型 | 默认值 | 说明 |
+|---|---|---|---|
+| `grid` | string | — | 卡牌网格布局,格式 `行x列`(如 `"5x8"`) |
+| `gridW` | number | `5` | 网格列数 |
+| `gridH` | number | `8` | 网格行数 |
+| `size` | string | — | 卡牌尺寸,格式 `宽x高`(如 `"54x86"`,单位 mm) |
+| `sizeW` | number | `54` | 卡牌宽度(mm) |
+| `sizeH` | number | `86` | 卡牌高度(mm) |
+| `bleed` | number | `1` | 出血线(mm) |
+| `padding` | number | `2` | 内边距(mm) |
+| `shape` | string | `"rectangle"` | 卡牌形状(`rectangle` 等) |
+| `layers` | string | — | 正面图层定义 |
+| `backLayers` | string | — | 背面图层定义 |
+| `fixed` | boolean | `false` | 固定模式(只读不可编辑) |
## 使用场景
diff --git a/src/doc-entries/md-dice.md b/src/doc-entries/md-dice.md
index b64abcf..39d9300 100644
--- a/src/doc-entries/md-dice.md
+++ b/src/doc-entries/md-dice.md
@@ -2,21 +2,25 @@
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[公式]{key="标识"}`
+
**攻击检定:** :md-dice[1d20+5]{key="attack"}
**伤害掷骰:** :md-dice[2d6+3]{key="damage"}
**优势检定:** :md-dice[2d20k1+5]{key="advantage"}
-点击掷骰文字执行投掷,再次点击重置为公式。
+点击 🎲 图标执行投掷,显示结果;点击文字重置为原始公式。
+
+## 属性
+
+| 属性 | 类型 | 说明 |
+|---|---|---|
+| `key` | string | URL 参数标识,结果记录到 `?dice-key=15` |
## 使用场景
diff --git a/src/doc-entries/md-embed.md b/src/doc-entries/md-embed.md
index b748908..df3b06a 100644
--- a/src/doc-entries/md-embed.md
+++ b/src/doc-entries/md-embed.md
@@ -2,11 +2,12 @@
tag: md-embed
icon: 📄
title: 嵌入组件
-description: 将另一个 Markdown 文件的内容内联嵌入到当前文档中。
-syntax: ':md-embed[./rules.md#combat]'
-props: []
---
+将另一个 Markdown 文件的内容内联嵌入到当前文档中。
+
+**语法:** `:md-embed[路径#章节]{选项}`
+
**嵌入完整文档:**
:md-embed[./rules.md]
@@ -15,6 +16,12 @@ props: []
嵌入后内容直接在当前位置显示,包括其中的表格、骰子等组件也会正常渲染。
+## 属性
+
+| 属性 | 类型 | 默认值 | 说明 |
+|---|---|---|---|
+| `headingBase` | number | `0` | 提升嵌入内容中每一级标题的层级(如 `1` 将 `#` 提升为 `##`) |
+
## 使用场景
用于在文档中引用通用规则、重复使用的数据表格等。
\ No newline at end of file
diff --git a/src/doc-entries/md-font.md b/src/doc-entries/md-font.md
index a326509..298648e 100644
--- a/src/doc-entries/md-font.md
+++ b/src/doc-entries/md-font.md
@@ -2,22 +2,12 @@
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 Fonts、emfont 和系统本地字体三种来源。
+
+**语法:** `:md-font[字体名]{选项}`
+
**Google 字体:**
:md-font[Noto Sans SC]{source="google"}
@@ -34,6 +24,14 @@ props:
字体和颜色将应用到整个文档卡片。
+## 属性
+
+| 属性 | 类型 | 默认值 | 说明 |
+|---|---|---|---|
+| `source` | `google` \| `emfont` \| `local` | `local` | 字体来源 |
+| `weight` | string | `"400"` | 字体粗细 |
+| `color` | string | — | 文字颜色(CSS 颜色值,如 `#ff00dd`、`rgb(255,0,0)`) |
+
## 使用场景
-用于切换文档的显示字体和文字颜色,适配不同风格需求。
\ No newline at end of file
+用于切换文档的显示字体和文字颜色,适配不同风格需求。
diff --git a/src/doc-entries/md-link.md b/src/doc-entries/md-link.md
index c5c44b5..f7277a5 100644
--- a/src/doc-entries/md-link.md
+++ b/src/doc-entries/md-link.md
@@ -2,11 +2,12 @@
tag: md-link
icon: 🔗
title: 链接组件
-description: 点击链接在当前页面内展开显示目标文章内容,支持章节定位。
-syntax: ':md-link[./rules.md#combat]'
-props: []
---
+点击链接在当前页面内展开显示目标文章内容,支持章节定位。
+
+**语法:** `:md-link[路径#章节]`
+
**展开完整文档:**
:md-link[./rules.md]
@@ -17,4 +18,4 @@ props: []
## 使用场景
-用于引用规则书章节、怪物数据、快速预览等场景。
\ No newline at end of file
+用于引用规则书章节、怪物数据、快速预览等场景。
diff --git a/src/doc-entries/md-pins.md b/src/doc-entries/md-pins.md
index 00cbda4..5fb7c81 100644
--- a/src/doc-entries/md-pins.md
+++ b/src/doc-entries/md-pins.md
@@ -2,23 +2,12 @@
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[图片路径]{选项}`
+
**固定标记(只读):**
:md-pins[./images/battle-map.png]{pins="A:25,50 B:75,30" fixed}
@@ -28,7 +17,19 @@ props:
**数字标签:**
:md-pins[./images/dungeon.png]{labelStart="1"}
-非 fixed 模式下点击图片添加标记,点击标记删除。
+非 `fixed` 模式下点击图片添加标记,点击标记删除。
+
+## 复制坐标
+
+非 `fixed` 模式下,图片右上角会显示 📋 复制按钮,点击可将所有标记的坐标复制到剪贴板,方便粘贴回文档的 `pins` 属性中。
+
+## 属性
+
+| 属性 | 类型 | 默认值 | 说明 |
+|---|---|---|---|
+| `pins` | string | `""` | 标记列表,格式 `A:x,y B:x,y` |
+| `fixed` | boolean | `false` | 固定模式(只读不可编辑) |
+| `labelStart` | string | `"A"` | 标签起始值,支持字母或数字 |
## 使用场景
diff --git a/src/doc-entries/md-table.md b/src/doc-entries/md-table.md
index f081b2b..871d6b7 100644
--- a/src/doc-entries/md-table.md
+++ b/src/doc-entries/md-table.md
@@ -2,17 +2,12 @@
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}} 引用同行其他列
---
+将 CSV 数据转换为可切换标签页的表格,支持内联 CSV、随机抽取、加权随机和变量引用。
+
+**语法:** `:md-table[./data.csv]{选项}`
+
**基础表格:**
```markdown
:md-table[./npcs.csv]
@@ -28,7 +23,39 @@ props:
:md-table[./quests.csv]{roll=true remix=true}
```
-CSV 要求包含 label, body 列,可选 group 列分组。支持 YAML front matter 继承行属性。
+**内联 CSV(直接写入内容):**
+```markdown
+:md-table[label,body,group
+A,这是一段描述,第一章
+B,另一段描述,第二章]{}
+```
+
+支持通过文件路径加载 CSV,也可以直接将 CSV 数据内联写在指令中。CSV 要求包含 `label`、`body` 列,可选 `group` 列分组。
+
+## 分组
+
+当 CSV 包含 `group` 列时,表格顶部会显示分组标签页,可切换查看不同分组的数据。
+
+## 随机抽取
+
+当 `roll=true` 时,表格顶部显示 🎲 随机按钮:
+- 普通随机:从所有行中均匀随机选取
+- **加权随机**:当 `label` 列全部为整数或整数范围格式(如 `1-3`)时,以 label 值为权重进行加权随机抽取
+
+## 变量引用
+
+当 `remix=true` 时,`body` 列中可使用 `{{prop}}` 语法引用同行其他列或 YAML front matter 中的数据。开启 `remix` 后每次随机抽取会从所有行中随机选取一行来解析变量。
+
+## YAML Front Matter
+
+CSV 文件可包含 YAML front matter(文件开头的 `---` 块),其中定义的属性可通过 `{{prop}}` 在 `body` 中引用。
+
+## 属性
+
+| 属性 | 类型 | 说明 |
+|---|---|---|
+| `roll` | boolean | 显示随机切换按钮 |
+| `remix` | boolean | 支持 `{{prop}}` 引用同行其他列 |
## 使用场景
diff --git a/src/doc-entries/md-yarn-spinner.md b/src/doc-entries/md-yarn-spinner.md
index f11a1da..1da2024 100644
--- a/src/doc-entries/md-yarn-spinner.md
+++ b/src/doc-entries/md-yarn-spinner.md
@@ -2,16 +2,30 @@
tag: md-yarn-spinner
icon: 🧶
title: 叙事线组件
-description: 展示 Yarn Spinner 格式的分支叙事结构,支持对话选择和分支。
-syntax: ':md-yarn-spinner[./story.yarn]'
-props: []
---
+展示 Yarn Spinner 格式的分支叙事结构,支持对话选择和分支。
+
+**语法:** `:md-yarn-spinner[./story.yarn]{选项}`
+
**加载叙事文件:**
:md-yarn-spinner[./story.yarn]
Yarn Spinner 是用于游戏对话系统的格式,支持选项、条件分支和变量。
+## 交互方式
+
+- **对话历史**:上半部分显示已进行的对话,说话者以蓝色粗体显示,命令以灰色斜体显示
+- **当前选项**:下半部分显示可选的对话选项,点击选项推进剧情
+- **⏩ 继续**:点击右上角继续按钮推进到下一段对话
+- **🔄 重新开始**:点击右上角重启按钮从头开始对话
+
+## 属性
+
+| 属性 | 类型 | 默认值 | 说明 |
+|---|---|---|---|
+| `start` | string | `"start"` | 起始节点名称 |
+
## 使用场景
用于互动故事、分支对话、冒险剧本等。
\ No newline at end of file