From 83bc1e241cba09999b552d0dd989a8fb85573489 Mon Sep 17 00:00:00 2001 From: HIsheR Date: Fri, 23 Oct 2026 16:03:47 +0800 Subject: [PATCH] =?UTF-8?q?iter:=20b05=20=E6=96=87=E6=A1=A3=E7=AB=99=20pro?= =?UTF-8?q?ps=20=E8=A1=A8=E8=A1=A5=E9=BD=90=E9=BB=98=E8=AE=A4=E5=80=BC?= =?UTF-8?q?=E5=88=97=EF=BC=88df=20=E5=AD=97=E6=AE=B5=EF=BC=89=EF=BC=8Cmani?= =?UTF-8?q?fest=20=E9=A9=B1=E5=8A=A8=E9=93=BE=E8=B7=AF=E6=A0=B8=E6=9F=A5?= =?UTF-8?q?=E9=97=AD=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .ua/backlog.json | 4 +-- .ua/index.json | 50 ++++++++++++++++++++----------- .ua/iterations.log | 1 + llms-full.txt | 34 ++++++++++----------- packages/skin/ui/ua.manifest.json | 48 +++++++++++++++++++---------- packages/tools/cli/bin/ua.js | 6 ++-- 6 files changed, 88 insertions(+), 55 deletions(-) diff --git a/.ua/backlog.json b/.ua/backlog.json index a0ab315..fc9c3ff 100644 --- a/.ua/backlog.json +++ b/.ua/backlog.json @@ -38,8 +38,8 @@ "title": "文档站演示区由 manifest 驱动自动生成", "motivation": "目前 apps/docs/index.html 手写 props 表与演示,每加组件都要人肉同步;由 manifest 单一来源驱动可消除重复维护", "acceptance": "ua CLI 新增 docs-gen 逻辑:读取各组件 ua.manifest.json 中的 components 参数表,自动生成 props 表 HTML 片段注入文档站模板;生成结果与现有手写版信息量对齐(props 名/类型/默认值/说明);npm run check 全绿且文档站可正常打开", - "status": "open", - "notes": "" + "status": "done", + "notes": "核查确认 props 表/示例/步骤/演示 iframe 早已由 ua docs 从 manifest docs.components 单一来源驱动;真正的缺口是信息量不含默认值——本轮 CLI propsTable 新增「默认值」列(props 条目可选 df 字段,缺省渲染 —),llms-full.txt 参数行同步追加「默认 x」标注;16 处可机读默认值从描述文案提取进 df;check 全绿 + 文档站结构完整性校验通过" } ] } diff --git a/.ua/index.json b/.ua/index.json index 87420d7..6f60f10 100644 --- a/.ua/index.json +++ b/.ua/index.json @@ -1,6 +1,6 @@ { "$schema": "ui-arch-registry-index/0.1", - "generatedAt": "2026-10-23T07:59:47.390Z", + "generatedAt": "2026-10-23T08:03:18.018Z", "repoRoot": ".", "packages": [ { @@ -221,7 +221,8 @@ { "n": "variant", "t": "'primary' | 'ghost' | 'danger'", - "d": "视觉强度;缺省 primary" + "d": "视觉强度;缺省 primary", + "df": "primary" }, { "n": "onClick", @@ -279,7 +280,8 @@ { "n": "rows", "t": "number", - "d": "初始行数;缺省 3" + "d": "初始行数;缺省 3", + "df": "3" }, { "n": "placeholder", @@ -461,7 +463,8 @@ { "n": "variant", "t": "'default' | 'success' | 'warning' | 'danger'", - "d": "语义色;缺省 default" + "d": "语义色;缺省 default", + "df": "default" } ], "example": "badge({ label: '成功', variant: 'success' })", @@ -484,7 +487,8 @@ { "n": "variant", "t": "'info' | 'success' | 'warning' | 'danger'", - "d": "语义色;缺省 info" + "d": "语义色;缺省 info", + "df": "info" } ], "example": "alert({ message: '操作可能存在风险', variant: 'warning' })", @@ -501,12 +505,14 @@ { "n": "variant", "t": "'text' | 'rect' | 'circle'", - "d": "占位形状;缺省 rect(整块矩形)" + "d": "占位形状;缺省 rect(整块矩形)", + "df": "rect" }, { "n": "rows", "t": "number", - "d": "text 形状的行数;缺省 3,末行自动缩短模拟段落" + "d": "text 形状的行数;缺省 3,末行自动缩短模拟段落", + "df": "3" } ], "example": "skeleton({ variant: 'text', rows: 3 }); skeleton({ variant: 'circle' }); skeleton({ variant: 'rect' })", @@ -531,12 +537,14 @@ { "n": "duration", "t": "number", - "d": "自动消失毫秒;缺省 3000" + "d": "自动消失毫秒;缺省 3000", + "df": "3000" }, { "n": "variant", "t": "'info' | 'success' | 'warning' | 'danger'", - "d": "语义色;缺省 info(toast.error 对应 danger)" + "d": "语义色;缺省 info(toast.error 对应 danger)", + "df": "info" } ], "example": "toast.success('保存成功'); toast.error('网络请求失败', 5000)", @@ -561,12 +569,14 @@ { "n": "placement", "t": "'top' | 'bottom'", - "d": "气泡方位;缺省 top(触发器上方)" + "d": "气泡方位;缺省 top(触发器上方)", + "df": "top" }, { "n": "delay", "t": "number", - "d": "出场延迟毫秒;缺省 150,传 0 立即显示" + "d": "出场延迟毫秒;缺省 150,传 0 立即显示", + "df": "150" }, { "n": "trigger", @@ -593,7 +603,8 @@ { "n": "size", "t": "number", - "d": "直径像素;缺省 18" + "d": "直径像素;缺省 18", + "df": "18" } ], "example": "spinner(); spinner({ size: 26 })", @@ -616,7 +627,8 @@ { "n": "showText", "t": "boolean", - "d": "是否显示百分比文字;缺省 true" + "d": "是否显示百分比文字;缺省 true", + "df": "true" } ], "example": "const pct = signal(0); progress({ value: pct }); setInterval(() => pct((pct() + 5) % 105), 400)", @@ -742,7 +754,8 @@ { "n": "layout", "t": "'vertical' | 'horizontal'", - "d": "布局方向;缺省 vertical(horizontal 为标签左置)" + "d": "布局方向;缺省 vertical(horizontal 为标签左置)", + "df": "vertical" }, { "n": "submitText", @@ -785,7 +798,8 @@ { "n": "(formItem)validateOn", "t": "'input' | 'blur' | 'submit'", - "d": "校验时机;缺省 blur(输入时自动清已报错误)" + "d": "校验时机;缺省 blur(输入时自动清已报错误)", + "df": "blur" } ], "example": "const name = signal(''); const f = form({ onSubmit: submit }, [formItem({ label: '用户名', required: true, value: name, rules: [{ min: 2, max: 12 }] }, textField({ value: name }))])", @@ -823,12 +837,14 @@ { "n": "pageSize", "t": "number", - "d": "每页行数;缺省 5" + "d": "每页行数;缺省 5", + "df": "5" }, { "n": "selectable", "t": "boolean", - "d": "启用行选择列:全选三态(含半选)、行 checkbox、已选计数;缺省 false" + "d": "启用行选择列:全选三态(含半选)、行 checkbox、已选计数;缺省 false", + "df": "false" }, { "n": "page", diff --git a/.ua/iterations.log b/.ua/iterations.log index cbf9b8c..0a5e162 100644 --- a/.ua/iterations.log +++ b/.ua/iterations.log @@ -2,3 +2,4 @@ {"time":"2026-10-23T15:50:03+08:00","id":"b02","result":"done","summary":"新增 toast 消息提示组件:四语义工厂 + showToast,右上角堆叠,默认 3s 自动消失,微动画 + reduced-motion 兜底;manifest/docs/llms 同步,check 全绿"} {"time":"2026-10-23T15:53:33+08:00","id":"b03","result":"done","summary":"新增 skeleton 骨架屏组件:text/rect/circle 三形状 + 扫光微动画 + reduced-motion 静态化;manifest/docs/llms/demo 同步,check 全绿"} {"time":"2026-10-23T16:00:11+08:00","id":"b04","result":"done","summary":"新增独立 pagination 分页器(page 信号双向绑定 + 省略号折叠 + 键盘可达),dataTable 新增 page 受控桥接实现联动;demo 联动卡片,check 全绿"} +{"time":"2026-10-23T16:03:46+08:00","id":"b05","result":"done","summary":"文档站核查确认已 manifest 驱动;补齐默认值信息量缺口:CLI propsTable 新增默认值列(df 字段)+ llms-full 默认标注,16 处默认值提取;check 全绿"} diff --git a/llms-full.txt b/llms-full.txt index 6ec65a4..1757176 100644 --- a/llms-full.txt +++ b/llms-full.txt @@ -1,6 +1,6 @@ # @ui-arch 组件库 Agent 文档(无图形版) -> 自动生成于 2026-10-23T07:59:47.390Z,数据源:各包 ua.manifest.json,勿手改。人类版文档站:apps/docs/index.html。 +> 自动生成于 2026-10-23T08:02:39.002Z,数据源:各包 ua.manifest.json,勿手改。人类版文档站:apps/docs/index.html。 > 组件 = 普通函数,传 props 返回 DOM;状态用 signal 双向绑定:读 signal() 写 signal(v)。 ## 快速上手 @@ -47,7 +47,7 @@ 参数: - label(必填):string —— 按钮文案 -- variant:'primary' | 'ghost' | 'danger' —— 视觉强度;缺省 primary +- variant(默认 primary):'primary' | 'ghost' | 'danger' —— 视觉强度;缺省 primary - onClick(回调):() => void —— 点击回调 示例: @@ -91,7 +91,7 @@ const name = signal(''); const el = textField({ value: name, placeholder: '输 参数: - value:Signal —— 双向绑定信号 -- rows:number —— 初始行数;缺省 3 +- rows(默认 3):number —— 初始行数;缺省 3 - placeholder:string —— 占位文案 - onInput(回调):(value: string) => void —— 输入回调 @@ -225,7 +225,7 @@ card({ title: '用户表' }, dataTable({ data, columns })) 参数: - label(必填):string —— 徽标文案 -- variant:'default' | 'success' | 'warning' | 'danger' —— 语义色;缺省 default +- variant(默认 default):'default' | 'success' | 'warning' | 'danger' —— 语义色;缺省 default 示例: @@ -245,7 +245,7 @@ badge({ label: '成功', variant: 'success' }) 参数: - message(必填):string —— 提示内容 -- variant:'info' | 'success' | 'warning' | 'danger' —— 语义色;缺省 info +- variant(默认 info):'info' | 'success' | 'warning' | 'danger' —— 语义色;缺省 info 示例: @@ -264,8 +264,8 @@ alert({ message: '操作可能存在风险', variant: 'warning' }) 参数: -- variant:'text' | 'rect' | 'circle' —— 占位形状;缺省 rect(整块矩形) -- rows:number —— text 形状的行数;缺省 3,末行自动缩短模拟段落 +- variant(默认 rect):'text' | 'rect' | 'circle' —— 占位形状;缺省 rect(整块矩形) +- rows(默认 3):number —— text 形状的行数;缺省 3,末行自动缩短模拟段落 示例: @@ -287,8 +287,8 @@ skeleton({ variant: 'text', rows: 3 }); skeleton({ variant: 'circle' }); skeleto 参数: - message(必填):string —— 提示文案 -- duration:number —— 自动消失毫秒;缺省 3000 -- variant:'info' | 'success' | 'warning' | 'danger' —— 语义色;缺省 info(toast.error 对应 danger) +- duration(默认 3000):number —— 自动消失毫秒;缺省 3000 +- variant(默认 info):'info' | 'success' | 'warning' | 'danger' —— 语义色;缺省 info(toast.error 对应 danger) 示例: @@ -310,8 +310,8 @@ toast.success('保存成功'); toast.error('网络请求失败', 5000) 参数: - content(必填):string —— 提示文案(纯文本) -- placement:'top' | 'bottom' —— 气泡方位;缺省 top(触发器上方) -- delay:number —— 出场延迟毫秒;缺省 150,传 0 立即显示 +- placement(默认 top):'top' | 'bottom' —— 气泡方位;缺省 top(触发器上方) +- delay(默认 150):number —— 出场延迟毫秒;缺省 150,传 0 立即显示 - trigger(必填):HTMLElement —— 第二个参数:被包裹的触发器元素(按钮 / 输入框等任意 DOM) 示例: @@ -335,7 +335,7 @@ tooltip({ content: '保存后立即生效' }, button({ label: '保存', onClick: 参数: -- size:number —— 直径像素;缺省 18 +- size(默认 18):number —— 直径像素;缺省 18 示例: @@ -355,7 +355,7 @@ spinner(); spinner({ size: 26 }) 参数: - value(必填):Signal —— 进度 0-100 信号,变化自动平滑过渡 -- showText:boolean —— 是否显示百分比文字;缺省 true +- showText(默认 true):boolean —— 是否显示百分比文字;缺省 true 示例: @@ -448,7 +448,7 @@ const open = signal(false); modal({ title: '确认操作', open, onClose: () => 参数: -- layout:'vertical' | 'horizontal' —— 布局方向;缺省 vertical(horizontal 为标签左置) +- layout(默认 vertical):'vertical' | 'horizontal' —— 布局方向;缺省 vertical(horizontal 为标签左置) - submitText:string —— 提交按钮文案;缺省「提交」 - resetText:string —— 重置按钮文案;缺省不渲染 - onSubmit(回调):() => void —— 全部字段校验通过后的提交回调 @@ -456,7 +456,7 @@ const open = signal(false); modal({ title: '确认操作', open, onClose: () => - (formItem)value(必填):Signal —— 字段值信号,校验数据源 - (formItem)required:boolean —— 必填:显示红星并自动追加非空规则 - (formItem)rules:FormRule[] —— 校验规则:required / min / max / pattern / validator,按序执行取首个失败 -- (formItem)validateOn:'input' | 'blur' | 'submit' —— 校验时机;缺省 blur(输入时自动清已报错误) +- (formItem)validateOn(默认 blur):'input' | 'blur' | 'submit' —— 校验时机;缺省 blur(输入时自动清已报错误) 示例: @@ -482,8 +482,8 @@ const name = signal(''); const f = form({ onSubmit: submit }, [formItem({ label: - data(必填):T[] —— 全量行数据,每行须含 id 字段作 rowKey - columns(必填):ColumnDef[] —— 列定义:{ key, header?, sortable? } - filterKey:string —— 工具栏筛选的列;缺省取第一列 -- pageSize:number —— 每页行数;缺省 5 -- selectable:boolean —— 启用行选择列:全选三态(含半选)、行 checkbox、已选计数;缺省 false +- pageSize(默认 5):number —— 每页行数;缺省 5 +- selectable(默认 false):boolean —— 启用行选择列:全选三态(含半选)、行 checkbox、已选计数;缺省 false - page:Signal —— 受控页码信号:与内核分页双向同步,传同一个信号给独立 pagination 组件即可联动 示例: diff --git a/packages/skin/ui/ua.manifest.json b/packages/skin/ui/ua.manifest.json index 34a75cf..43943ce 100644 --- a/packages/skin/ui/ua.manifest.json +++ b/packages/skin/ui/ua.manifest.json @@ -92,7 +92,8 @@ { "n": "variant", "t": "'primary' | 'ghost' | 'danger'", - "d": "视觉强度;缺省 primary" + "d": "视觉强度;缺省 primary", + "df": "primary" }, { "n": "onClick", @@ -150,7 +151,8 @@ { "n": "rows", "t": "number", - "d": "初始行数;缺省 3" + "d": "初始行数;缺省 3", + "df": "3" }, { "n": "placeholder", @@ -332,7 +334,8 @@ { "n": "variant", "t": "'default' | 'success' | 'warning' | 'danger'", - "d": "语义色;缺省 default" + "d": "语义色;缺省 default", + "df": "default" } ], "example": "badge({ label: '成功', variant: 'success' })", @@ -355,7 +358,8 @@ { "n": "variant", "t": "'info' | 'success' | 'warning' | 'danger'", - "d": "语义色;缺省 info" + "d": "语义色;缺省 info", + "df": "info" } ], "example": "alert({ message: '操作可能存在风险', variant: 'warning' })", @@ -372,12 +376,14 @@ { "n": "variant", "t": "'text' | 'rect' | 'circle'", - "d": "占位形状;缺省 rect(整块矩形)" + "d": "占位形状;缺省 rect(整块矩形)", + "df": "rect" }, { "n": "rows", "t": "number", - "d": "text 形状的行数;缺省 3,末行自动缩短模拟段落" + "d": "text 形状的行数;缺省 3,末行自动缩短模拟段落", + "df": "3" } ], "example": "skeleton({ variant: 'text', rows: 3 }); skeleton({ variant: 'circle' }); skeleton({ variant: 'rect' })", @@ -402,12 +408,14 @@ { "n": "duration", "t": "number", - "d": "自动消失毫秒;缺省 3000" + "d": "自动消失毫秒;缺省 3000", + "df": "3000" }, { "n": "variant", "t": "'info' | 'success' | 'warning' | 'danger'", - "d": "语义色;缺省 info(toast.error 对应 danger)" + "d": "语义色;缺省 info(toast.error 对应 danger)", + "df": "info" } ], "example": "toast.success('保存成功'); toast.error('网络请求失败', 5000)", @@ -432,12 +440,14 @@ { "n": "placement", "t": "'top' | 'bottom'", - "d": "气泡方位;缺省 top(触发器上方)" + "d": "气泡方位;缺省 top(触发器上方)", + "df": "top" }, { "n": "delay", "t": "number", - "d": "出场延迟毫秒;缺省 150,传 0 立即显示" + "d": "出场延迟毫秒;缺省 150,传 0 立即显示", + "df": "150" }, { "n": "trigger", @@ -464,7 +474,8 @@ { "n": "size", "t": "number", - "d": "直径像素;缺省 18" + "d": "直径像素;缺省 18", + "df": "18" } ], "example": "spinner(); spinner({ size: 26 })", @@ -487,7 +498,8 @@ { "n": "showText", "t": "boolean", - "d": "是否显示百分比文字;缺省 true" + "d": "是否显示百分比文字;缺省 true", + "df": "true" } ], "example": "const pct = signal(0); progress({ value: pct }); setInterval(() => pct((pct() + 5) % 105), 400)", @@ -613,7 +625,8 @@ { "n": "layout", "t": "'vertical' | 'horizontal'", - "d": "布局方向;缺省 vertical(horizontal 为标签左置)" + "d": "布局方向;缺省 vertical(horizontal 为标签左置)", + "df": "vertical" }, { "n": "submitText", @@ -656,7 +669,8 @@ { "n": "(formItem)validateOn", "t": "'input' | 'blur' | 'submit'", - "d": "校验时机;缺省 blur(输入时自动清已报错误)" + "d": "校验时机;缺省 blur(输入时自动清已报错误)", + "df": "blur" } ], "example": "const name = signal(''); const f = form({ onSubmit: submit }, [formItem({ label: '用户名', required: true, value: name, rules: [{ min: 2, max: 12 }] }, textField({ value: name }))])", @@ -694,12 +708,14 @@ { "n": "pageSize", "t": "number", - "d": "每页行数;缺省 5" + "d": "每页行数;缺省 5", + "df": "5" }, { "n": "selectable", "t": "boolean", - "d": "启用行选择列:全选三态(含半选)、行 checkbox、已选计数;缺省 false" + "d": "启用行选择列:全选三态(含半选)、行 checkbox、已选计数;缺省 false", + "df": "false" }, { "n": "page", diff --git a/packages/tools/cli/bin/ua.js b/packages/tools/cli/bin/ua.js index 100f2bc..6ff5502 100644 --- a/packages/tools/cli/bin/ua.js +++ b/packages/tools/cli/bin/ua.js @@ -191,9 +191,9 @@ var ORDER={skin-dom:0,'headless-core':1,'design-tokens':2}; function esc(s){return String(s).replace(/&/g,'&').replace(//g,'>')} function propsTable(c){ var rows=(c.props||[]).map(function(p){ - return ''+esc(p.n)+''+esc(p.t)+''+(p.r?'必填':'否')+''+esc(p.d||'')+(p.k?'(回调)':'')+''; + return ''+esc(p.n)+''+esc(p.t)+''+(p.r?'必填':'否')+''+(p.df?''+esc(p.df)+'':'—')+''+esc(p.d||'')+(p.k?'(回调)':'')+''; }).join(''); - return ''+rows+'
参数类型必填说明
'; + return ''+rows+'
参数类型必填默认值说明
'; } function compBlock(c){ var steps=(c.steps||[]).map(function(s){return '
  • '+esc(s)+'
  • '}).join(''); @@ -289,7 +289,7 @@ function renderAgentDocs(index, tokens) { if (c.props?.length) { lines.push('参数:', ''); for (const prop of c.props) { - const marks = [prop.r ? '必填' : '', prop.k ? '回调' : ''].filter(Boolean).join(','); + const marks = [prop.r ? '必填' : '', prop.k ? '回调' : '', prop.df ? `默认 ${prop.df}` : ''].filter(Boolean).join(','); lines.push(`- ${prop.n}${marks ? `(${marks})` : ''}:${prop.t}${prop.d ? ` —— ${prop.d}` : ''}`); } lines.push('');