iter(g132): 新增 @提及输入 mentions

This commit is contained in:
HIsheR
2026-10-26 15:22:59 +08:00
parent eac02f0c80
commit 9d0c195beb
12 changed files with 382 additions and 10 deletions
+53 -2
View File
@@ -1,6 +1,6 @@
{
"$schema": "ui-arch-registry-index/0.1",
"generatedAt": "2026-10-26T07:21:05.139Z",
"generatedAt": "2026-10-26T07:22:32.759Z",
"repoRoot": ".",
"packages": [
{
@@ -206,7 +206,8 @@
"calendar(props):月历,整月网格内嵌页面(排期 / 值班 / 日程),每日可带 marker 标记文案,方向键漫游 + Enter 选中,翻月走 onMonthChange",
"typography(props):排版文本,variant 决定语义(标题出 h1-h5 / 段落出 p / 行内出 span),支持语义色、装饰位、对齐、多行截断与复制按钮",
"grid(props, ...children):栅格容器,columns 固定列数或 min 走 auto-fit 自适应列宽,gutter 统一列间距,窄屏自动降为单列",
"floatButton(props):悬浮操作按钮,固定停靠左下 / 右下角,label 缺省为纯图标圆形,badge 走角标,tooltip 兼作 aria-label"
"floatButton(props):悬浮操作按钮,固定停靠左下 / 右下角,label 缺省为纯图标圆形,badge 走角标,tooltip 兼作 aria-label",
"mentions(props):@提及输入,textarea 内键入 @ 弹候选(名字 / 关键词过滤),↑↓ 环形移动、Enter/Tab 选中、Esc 只收本层,选中按光标替换并写回 value"
],
"keyTypes": [
"ButtonProps",
@@ -3262,6 +3263,56 @@
"右下角已被 backTop 占用,页面同时有返回顶部时用 position: 'left-bottom'",
"纯展示 + 单回调,没有选中态与开合状态;需要多级操作请用 menu / popover 挂在 onClick 上"
]
},
{
"id": "mentions",
"title": "@提及输入 Mentions",
"demo": "sec-mentions",
"props": [
{
"n": "items",
"t": "MentionItem[]",
"r": 1,
"d": "候选池:每项含 name(插入正文的名字)、label(显示名)、description(说明)、keywords(只参与过滤的额外匹配词)"
},
{
"n": "value",
"t": "Signal<string>",
"d": "受控文本信号;不传则组件内部维护(拿不到外部读取时不要传)"
},
{
"n": "rows",
"t": "number",
"df": "3",
"d": "输入框行数"
},
{
"n": "placeholder",
"t": "string",
"d": "占位文案"
},
{
"n": "onSelect",
"t": "(item: MentionItem) => void",
"k": 1,
"d": "选中某人后的回调(弹层已收起,正文已替换)"
},
{
"n": "onInput",
"t": "(text: string) => void",
"k": 1,
"d": "每次输入的回调,参数为当前全文(已写回 value 信号)"
}
],
"example": "const text = signal(''); mentions({ items: [{ name: 'zhangsan', label: '张三', description: '前端', keywords: ['zs'] }], value: text, placeholder: '输入 @ 叫人', onSelect: (it) => toast.info(it.label) })",
"steps": [
"在输入框里键入 @ 触发弹层,继续打字按 name / keywords 过滤(拼音、工号放 keywords,不出现在候选行里)",
"键盘:↑↓ 环形移动高亮、Enter 或 Tab 选中、Esc 只收这一层弹层(stopPropagation,不会连带关掉外层弹窗)",
"选中后组件按光标位置把 @片段替换成「@名字 + 空格」,光标落在其后,可以接着打字",
"受控用法:传 value 信号并在 onSelect / onInput 里读最新全文;外部改信号会同步回输入框,别同时再手写 input 事件",
"弹层贴在输入框下沿而非跟随光标行(多行输入里更稳定,也不会被行高算错),需要跟随光标请自绘",
"要限制可选人范围就在 items 上做过滤,组件不做远程搜索;远程场景用 onInput 拉数据后重建 items"
]
}
]
},