让设计 Agent 先给差异再改页面:确认面板的四个状态

本文聚焦于设计Agent驱动的前端确认流程,提出以差异清单为核心的状态机模型,明确划分‘建议—待确认—应用中—结果’四个阶段。强调差异内容(组件、属性、前后值)必须可核对,动效仅反映阶段而非结果,失败与部分成功需独立标识。指出Figma Specs用于协同说明变更范围,Web Animations API仅承担阶段可视化,不替代状态同步与原子性保障。

封面:待确认的设计差异清单与组件卡

让Agent一次修改十个组件,真正困难的未必是“确认”按钮放在哪里,而是用户确认的范围有没有在点击之前变化。预览看的是圆角,执行时却多改了颜色;这种错位再配上流畅动画,也只是更难发现。

10月Figma Specs把设计意图、引用与协作讨论放到同一画布,适合用来说明变更范围。这里进一步提出一条前端约束:确认针对的是一份具体差异清单,不是某个可能继续变化的任务。

先给出可核对的差异

清单应显示组件、属性、前值与后值,并允许打开相应状态。数量只能帮助估计影响面,不能替代差异内容。模型生成尚未结束时,可以显示建议草稿,但不要把尚会变化的内容直接送进应用阶段。

“建议—待确认—应用中—结果”是四个交互阶段。结果也不只有成功:部分失败、状态未知和已应用应逐项列出。下面内存样例让一项故意失败,用来检查显示逻辑,不模拟真实系统收益。

确认凭据绑定这份清单

保存为 confirm.mjs 后用Node运行。签名只是固定结构的规范化字符串,用于本地内容比较;它不是安全签名,也不承担鉴权。

import assert from 'node:assert/strict';
function signature(ops){
  const ids=ops.map(o=>o.id);
  if(new Set(ids).size!==ids.length)throw new Error('duplicate operation');
  return JSON.stringify(ops.map(({id,component,key,before,after})=>
    [id,component,key,before,after]).sort((a,b)=>a[0].localeCompare(b[0])));
}
async function applyConfirmed(ops, receipt, applyOne){
  if(!receipt.confirmed||receipt.signature!==signature(ops))
    throw new Error('confirm this exact change list');
  const result=[];
  for(const op of ops){
    try{await applyOne(op);result.push({id:op.id,status:'applied'});}
    catch(error){result.push({id:op.id,status:'failed',message:error.message});}
  }
  return result;
}
const ops=[
 {id:'a',component:'card',key:'radius',before:4,after:8},
 {id:'b',component:'button',key:'gap',before:8,after:12}
];
const receipt={confirmed:true,signature:signature(ops)};
let calls=0;
const result=await applyConfirmed(ops,receipt,async op=>{
 calls++;if(op.id==='b')throw new Error('teaching failure');
});
assert.deepEqual(result.map(x=>x.status),['applied','failed']);
await assert.rejects(()=>applyConfirmed(
 [{...ops[0],after:16},ops[1]],receipt,async()=>{}),/exact change/);
assert.equal(calls,2);
assert.equal(result[0].id,'a');
console.log('PASS: exact-list confirmation and per-operation results');

为了保持示例集中,这里把所有抛出错误记为failed。真实适配器遇到“请求已发出但结果查不到”时,应给unknown,不能因为本地超时就断言没有修改。也不能把部分成功自动回滚成“全部未应用”;那会掩盖实际产物。

前值比较应由有权写入的系统原子完成。前端凭据只能防止界面在用户不知情时更换清单,不能保证服务器没有并发写入。若应用阶段出现冲突,回到该组件的当前版本重新审阅。

动效该说明阶段,不该代替结果

确认后,按钮可以转为“正在应用”,但动画结束不等于写入完成。结果区域保留每项ID、状态与打开入口;已应用项和失败项都能找回。重复点击应明确说明当前阶段,不让用户因为没有反馈而不断确认。

撤销也要说明边界:是只撤销已成功项,还是准备一份新的反向差异?受影响对象已经再变更时,应展示冲突,不能把旧快照无条件覆盖回去。

建议、确认、应用与分项结果的四阶段

图只描述界面阶段及分项结果,不代表存在一个跨多个组件的后端事务,也不暗示失败会自动重试。

确认面板应该让设计者知道“这次同意了什么”,结果面板则回答“最终发生了什么”。把这两个问题分清,反馈动画才有可信的内容可以表达。

验证范围与资料

本地使用 v26.3.0 检查上述示例。纯 JavaScript 示例已在 Node 权限隔离模式执行,断言通过。只测试内存差异清单和手写失败回调;没有连接Figma、应用真实补丁或验证分布式原子性。

以下发布日期或版本日期与访问日期分开记录;24—31日的新消息须发稿前再核对。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值