AI 差异审阅
差异审阅卡 .ai-diff:parseUnifiedDiff(text) 解析 unified diff(git / 传统头、add/del/rename/binary 均可)→ renderAiDiff(el, {files}) DOM 渲染(行号 + add/del 着色 + hunk 头,全 textContent);initAiDiff 委托展开 / 接受 / 拒绝——icen:ai-diff-accept / icen:ai-diff-reject(detail {path}),决策后盖状态章并淡化。
点头展开行号与着色 · 「接受 / 拒绝」后盖状态章(icen:ai-diff-accept / icen:ai-diff-reject)
<div id="ai-diff-demo" style="width:100%"></div><p class="demo-label" id="ai-diff-log" style="margin-top:8px">点头展开行号与着色 · 「接受 / 拒绝」后盖状态章(icen:ai-diff-accept / icen:ai-diff-reject)</p> 安装
bun add @icen.ai/ui pnpm add @icen.ai/ui npm install @icen.ai/ui yarn add @icen.ai/ui 一行引入该组件(CSS 与 behavior 自动带上,无需关心内部 CSS 文件名):
import '@icen.ai/ui/kit/ai-diff'; 也可以用脚手架直接打印引入行:
bunx --bun @icen.ai/ui add ai-diff
Astro 项目注意:kit 入口里的 CSS import 在页面 <script> 里会被 Astro 的 client bundle 摇掉——请改在布局 frontmatter 里引 CSS(import '@icen.ai/ui/components/ai-diff.css';),JS 行为仍可走 kit。Vite SPA / webpack 项目无此问题。
用法
import { initAiDiff, renderAiDiff, parseUnifiedDiff } from '@icen.ai/ui/kit/ai-diff'; // 真实 unified diff → 结构化 files → DOM 渲染(重复调用替换内容)renderAiDiff(el, { files: parseUnifiedDiff(diffText) });initAiDiff(); // 展开/折叠 + 接受/拒绝(icen:ai-diff-accept / icen:ai-diff-reject,detail {path}) // AiDiffFile:{ path, oldPath?, status: added|modified|deleted|renamed, addCount, delCount, hunks }// hunk:{ oldStart, oldCount, newStart, newCount, header, lines: [{ type: ctx|add|del, oldNo, newNo, text }] }