>- 对比图/一图流:生成 A vs B 参数对比图、优劣势对比表、产品参数一图流。 用 HTML+CSS 渲染成可截图的视觉卡片,适合小红书/微博等平台分享。 使用时机:用户说"做个对比图"、"A vs B"、"参数对比"、"优劣对比"、 "一图流"、"对比表"、"哪个好"、"对比一下"。 和 chart-visualization 的区别:chart 做数据图表(柱状图/折线图),comparison-card 做对比表/一图流。 和 infographic 的区别:infographic 做多维信息图,comparison-card 专注 A vs B 对比。
npx skills add https://github.com/ZJU-REAL/Easel --skill comparison-card
> 生成 A vs B 可视化对比卡片,一张截图说清楚差异,适合社媒分享。
> ⚠️ 生成前先读 card-design 设计系统(锁配色/字体层级/填满画幅/去 AI 廉价感)。对比图用「对比表」骨架(左右双栏、≥5 对比行、行高一致),避免渐变、emoji、底部死空白。
| 字段 | 必填 | 说明 |
|------|------|------|
| items | 是 | 要对比的 2-4 个对象(名称) |
| dimensions | 否 | 对比维度列表(如价格、性能、功能等);不指定则自动提取 |
| data | 否 | 结构化对比数据(JSON/表格);不提供则由 SKILL 调研填充 |
| layout | 否 | 布局模式:table(默认)/ versus / pros_cons |
| size | 否 | 尺寸预设:xiaohongshu(1080x1440) / weibo(1080x1080) / wechat(1080x1920) / auto |
| style | 否 | 视觉风格:走 card-design 风格库(瑞士极简/杂志编辑/高奢黑金…),不指定则按内容品类/Profile 选一个立场 |
| winner | 否 | 是否标注胜出项:true / false(默认 false) |
| 模式 | 描述 | 适用场景 |
|------|------|----------|
| table | 经典参数对比表,行=维度,列=对象 | 多维度、多参数的产品对比 |
| versus | 左右对称 VS 布局,中间分割线 | 两个对象的直观对比 |
| pros_cons | 优劣势分栏,绿色优势/红色劣势 | 单一产品的优劣分析 |
outputs/ 目录如果用户提供了完整数据:
如果用户只给了对象名,没给数据:
将数据整理为标准矩阵:
{
"items": ["A", "B"],
"dimensions": [
{"name": "价格", "values": ["¥2999", "¥3499"], "winner": "A"},
{"name": "性能", "values": ["骁龙 8 Gen3", "A17 Pro"], "winner": "B"}
]
}
references/comparison-template.html 作为基础模板layout 模式选择布局结构size 参数)winner 为 true,用视觉标记(高亮/皇冠图标)标注胜出项将 HTML 写入 outputs/ 目录,文件名格式:{A}_vs_{B}_对比_{日期}.html
用共享脚本自动渲染成图:
python skills/shared/scripts/render_card.py \
--html outputs/主题名/assets/A_vs_B_对比.html \
--out outputs/主题名/A_vs_B_对比.png \
--full-page --width 1080 --height 1440
尺寸按 Profile 匹配的平台预设调整(默认小红书 1080×1440)。脚本用 playwright+chromium,对 CDN/字体有界超时不卡死;首次需 pip install playwright && playwright install chromium。
style.md 读取品牌配色,替换模板默认色;从 identity.md 读取账号名作为水印;从 platforms.md 读取主力平台,自动匹配尺寸> 自研溯源与参考项目见同目录 EASEL-META.md。
Take zju-real/comparison-card from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference pip.
Without those the skill loads but fails at the first command.