diff --git a/assets/items/README.md b/assets/items/README.md
index ec2f838..eb92d39 100644
--- a/assets/items/README.md
+++ b/assets/items/README.md
@@ -39,3 +39,24 @@
- 需要显示堆叠数量时写 `名称:数量`,例如 `b2="stick:2"`;
- `caption` 可选,显示在组件下方居中说明文字;
- 未运行自动同步且贴图缺失时,格子内会显示一个 `?` 占位,方便发现写错的名字。
+
+### pattern 别名模式(另一种写法)
+
+不想数格子时,可以用 `pattern` 先画好形状,再为每个字符别名指定物品:
+
+```markdown
+{{< crafting
+ pattern="a a a\nb b b\nc c c"
+ a="diamond"
+ b="stick"
+ c=""
+ out="diamond_pickaxe"
+ caption="钻石镐"
+>}}
+```
+
+- `pattern` 共 9 个 token(3 行 × 3 列),**必须写在一行内**,行间用 `\n` 表示;
+- 每个 token 对应一个同名参数(`a`、`b`、`c`…),参数值就是物品 id;
+- token 也可以直接写物品 id:`pattern="diamond stick ."`;
+- `.` 表示空格子;
+- 同时给出 `pattern` 和 `a1`~`c3` 时,以 `pattern` 为准(`out` 两者通用)。
diff --git a/layouts/_partials/crafting-slot.html b/layouts/_partials/crafting-slot.html
index 37e6b8b..77a9604 100644
--- a/layouts/_partials/crafting-slot.html
+++ b/layouts/_partials/crafting-slot.html
@@ -1,4 +1,4 @@
-{{- $val := trim (.ctx.Get .key) " " -}}
+{{- $val := .val -}}
{{- $item := "" -}}
{{- $count := 0 -}}
{{- if $val -}}
diff --git a/layouts/_shortcodes/crafting.html b/layouts/_shortcodes/crafting.html
index 687539f..94384b2 100644
--- a/layouts/_shortcodes/crafting.html
+++ b/layouts/_shortcodes/crafting.html
@@ -1,6 +1,11 @@
{{- /* SFCraft 合成配方组件
- - 调用: 页面内写 shortcode, 名为 crafting
- - a1..c3 为 3x3 合成格, out 为输出格
+ 两种用法:
+ 1) 九格直填: a1..c3 为 3x3 合成格, out 为输出格
+ 2) pattern 别名模式(提供 pattern 时优先):
+ pattern="a a a\nb b b\nc c c" 行间用 \n(必须写在一行内), 也可用空格或 ; 分隔, 共 9 个 token
+ a="diamond" b="stick" c="" 每个 token 对应一个同名参数, 值为物品 id
+ token 也可以直接写物品 id, 如 pattern="diamond stick ."
+ "." 表示空格子
- 值为 assets/items/ 下贴图的文件名(不含 .png), 留空表示空格子
- 名称后可加 ":数量" 显示堆叠数, 例如 a1="stick:2"
- 引用的贴图不存在时, 格子内显示 ? 占位提示
@@ -21,6 +26,16 @@
(dict "key" "out" "cls" "out" "x" "70%" "y" "37.5%")
-}}
+{{- $ctx := . -}}
+{{- $pattern := $ctx.Get "pattern" -}}
+{{- $tokens := slice -}}
+{{- if $pattern -}}
+ {{- $flat := replace (replace (replace (replace $pattern "\\n" " ") ";" " ") "\n" " ") "\r" " " -}}
+ {{- range split (trim $flat " ") " " -}}
+ {{- if ne . "" -}}{{- $tokens = $tokens | append . -}}{{- end -}}
+ {{- end -}}
+{{- end -}}
+
{{- $cssOnce := .Page.Store.Get "sfc_crafting_css" -}}
{{- if not $cssOnce -}}
{{- .Page.Store.Set "sfc_crafting_css" true -}}
@@ -104,21 +119,53 @@
font-size: 0.85rem;
color: var(--gray-600, #6c757d);
}
+ .sfc-error {
+ max-width: 540px;
+ margin: 1rem 0;
+ padding: 0.6rem 1rem;
+ border: 1px solid #f5c2c7;
+ border-radius: 6px;
+ background: #f8d7da;
+ color: #842029;
+ font-size: 0.9rem;
+ }
{{- end -}}
-