iter(g271): 新增手写签名板组件

This commit is contained in:
HIsheR
2026-10-26 22:56:38 +08:00
parent 6e048c1cd3
commit 1680c4ef8d
12 changed files with 339 additions and 10 deletions
+53 -2
View File
@@ -1,6 +1,6 @@
{
"$schema": "ui-arch-registry-index/0.1",
"generatedAt": "2026-10-26T14:54:40.928Z",
"generatedAt": "2026-10-26T14:56:09.624Z",
"repoRoot": ".",
"packages": [
{
@@ -223,7 +223,8 @@
"layout(props, ...children):布局骨架,页头 / 侧栏 / 内容 / 页脚四区一次成型,侧栏可折叠(collapsed 信号双向绑定)",
"jsonViewer(props):JSON 树查看,按层折叠、分支带计数摘要、叶子按类型着色,只读不编辑",
"diffView(props):文本差异对比,行级 LCS 对齐 + 增删着色 + 双行号列,顶部带 +N / −N 统计",
"codeBlock(props):代码块,等宽多行 + 行号列 + 标题行 + 一键复制原文,只展示不高亮"
"codeBlock(props):代码块,等宽多行 + 行号列 + 标题行 + 一键复制原文,只展示不高亮",
"signaturePad(props):手写签名板,指针绘制 + DPR 位图,返回 handle(el / clear / toDataURL / isEmpty)"
],
"keyTypes": [
"ButtonProps",
@@ -4296,6 +4297,56 @@
"单行代码自动省掉行号列;想彻底不要行号传 lineNumbers: false",
"不需要复制按钮(例如代码本身是操作步骤)传 copyable: false;连标题都没有时头部整条省掉"
]
},
{
"id": "signaturePad",
"title": "手写签名 SignaturePad",
"demo": "sec-sign",
"props": [
{
"n": "value",
"t": "Signal<string>",
"d": "签字结果 dataURL 信号,双向绑定;清空写空串"
},
{
"n": "height",
"t": "number",
"d": "画布高度(px);缺省 160"
},
{
"n": "penWidth",
"t": "number",
"d": "笔宽(px);缺省 2"
},
{
"n": "hint",
"t": "string",
"d": "底部提示文案;缺省「在上方区域手写签名」"
},
{
"n": "disabled",
"t": "boolean | Signal<boolean>",
"d": "禁用态:布尔或信号,禁用时不响应手写"
},
{
"n": "ariaLabel",
"t": "string",
"d": "画布可访问名;缺省「手写签名区」"
},
{
"n": "onChange",
"t": "(dataUrl: string) => void",
"d": "收笔 / 清空时回调(清空回调空串)"
}
],
"example": "const pad = signaturePad({ value: sign, height: 140 }); mount('#box', () => pad.el); pad.toDataURL(); pad.clear();",
"steps": [
"把画布挂上去即可手写:宽度跟随容器、高度由 height 给(缺省 160),不用自己算 DP R",
"签字结果在收笔瞬间写回 value 信号(PNG dataURL);要提交表单就把它塞进字段值,清空会写回空串",
"底部「清空」按钮在未落笔或禁用时自动不可点,避免空操作;也能用返回的 handle.clear() 外部触发",
"需要判空用 handle.isEmpty(),取图用 handle.toDataURL();两者与信号同源,不会出现「有图但信号是空」",
"禁用传布尔或信号:布尔直接置位,信号随状态变灰并挡住手写;移动端画布已关掉浏览器手势,不会边签边滚页"
]
}
]
},