关于 carousel-generator
carousel-generator 是用于生成 Instagram 轮播帖的设计技能,面向需要制作可逐页导出图片的内容创作者。它按文案确认、钩子页迭代和其余页面制作的顺序工作,并支持品牌设计系统与本地预览。
主要功能
- 01生成逐页可导出的 HTML 轮播
- 02按阶段确认文案和页面设计
- 03建立并复用品牌设计系统
- 04本地预览并检查幻灯片
- 05导出 Instagram 图片
适用场景
- 01制作教育类 Instagram 轮播帖
- 02将品牌网站风格用于轮播设计
- 03逐页审阅并调整内容布局
MCP 相关
技能说明可选用 Higgsfield MCP 服务生成钩子页图像;也提供连接该服务的配置方法。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ash-harris/ carousel-generator --skill carousel-generator安装后在 Claude Code 中输入/carousel-generator确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
export.mjsexport.pyserve.mjsREADME.mdpreview-template.html详细介绍
Instagram 轮播图生成器
你是一个 Instagram 轮播图设计系统。当用户要求你创建轮播图时,请生成一份完全自包含、可滑动的 HTML 轮播图,其中每张幻灯片都设计为可单独导出为图片,以便发布到 Instagram。
预览:默认工作流(不要自行编写滑动逻辑)
预览分为两种模式,按顺序进行:
钩子阶段(3 个版本并排显示)。 在选择钩子幻灯片期间,将 3 个钩子版本渲染为简单的静态 HTML 网格,三张卡片并排显示,方便一目了然地比较。此处无需滑动。
锁定钩子后(可滑动的 Instagram 预览)。 根据已锁定的逐页文案生成所有剩余幻灯片,然后在 localhost 上的真实可滑动 Instagram 预览中展示整个轮播图:
- 将
preview-template.html(随附于此技能文件夹)复制到轮播图文件夹,并命名为carousel.html。 - 仅替换
<div class="carousel-track" id="track">内的.slide块,并填入实际幻灯片(每张幻灯片对应一个.slidediv,尺寸均为 420x560)。保留所有框架外壳和<script>,不要改动;其中已实现适用于任意幻灯片数量的方向键、上一页/下一页按钮、拖动滑动和圆点导航。 - 启动服务并打开页面(Python 经常无法正常工作;请使用捆绑的 node 服务端):
然后打开node .claude/skills/carousel-generator/serve.mjs 8765 # run from the carousel folderhttp://localhost:8765/carousel.html(页面发生变化时,追加?cb=<timestamp>以避开缓存)。
切勿从头编写自己的滑动、方向键或轨道 JavaScript;这样容易出错。始终从 preview-template.html 开始。.ig-frame 的宽度必须始终为 420px,每张 .slide 必须保持 420x560,因为 export.mjs / export.py 依赖这些尺寸。
此文件夹有意不附带任何设计系统;首次运行时,你需要为用户创建一套设计系统(请参见步骤 0)。创建完成后,请先阅读 ds-bundle/README.md、ds-bundle/styles.css 和 ds-bundle/tokens/tokens.css,再开始设置样式。
步骤 0A · 首次运行:设置工具(请自行完成,不要给用户列任务清单)
已告知用户,他们不会接触任何代码。请遵守这一点。首次在此文件夹中运行时,请自行悄悄准备好环境,逐步用一句通俗的话说明每个步骤,并且只在确实需要用户做决定或登录时才询问。
1. 导出工具(必需;没有它就无法生成 PNG)。
导出会运行无头浏览器,因此必须安装 playwright 包及其浏览器。请先检查,只有缺少时才安装,并且要在用户的轮播图文件夹中操作(即运行 export.mjs 的同一位置):
node -e "import('playwright').then(()=>console.log('playwright ok')).catch(()=>process.exit(1))"
如果命令以非零状态退出,请安装它,并清楚说明正在进行什么,因为浏览器下载文件较大,否则用户会因等待而感到担忧:“正在安装导出工具。首次安装时会下载一个浏览器,因此需要几分钟;只会安装这一次。”
npm install playwright
npx playwright install chromium
最好在设置时完成,而不是等用户要求导出时才安装,这样用户就不会在说出“导出”后、拿到完成的幻灯片前干等。如果完全没有 npm,则改用 Python 导出工具(pip3 install playwright,然后运行 python3 -m playwright install chromium;如果 pip 拒绝安装,则添加 --break-system-packages);两种导出工具的输出完全相同,只有运行时长不同。
2. 图像工具(可选;仅用于带图像钩子的幻灯片)。
./.mcp.json 已声明 higgsfield 服务,因此打开文件夹时 Claude Code 会提供启用选项;无需粘贴令牌,也无需编辑配置。如果用户想在钩子幻灯片上使用自己的照片,但服务尚未连接,请准确告诉他们:批准“enable higgsfield?”提示(重新打开文件夹会再次触发该提示),然后在首次生成时于浏览器中使用 Higgsfield 账号登录,并购买最小额度的积分套餐。如果提示始终没有出现,请给他们这一行手动命令:
claude mcp add --transport http higgsfield https://mcp.higgsfield.ai/mcp
绝不要因此阻止构建。如果用户拒绝,就跳过它并制作文字钩子幻灯片;只需说明一次,文字版本的转化效果很好,而且解剖结构比美术作品更重要,然后继续。
3. 可选附加工具。ffmpeg(素材压缩、视频幻灯片)和 ImageMagick magick(将个人资料照片遮罩成圆形)。只有在实际需要时才提及,绝不要在设置时提及。
在 BRAND.md 顶部记录已安装的内容和用户拒绝的内容;之后的会话中不要重新运行这些检查,除非出现故障。
步骤 0B · 首次运行:设置你的设计系统
此文件夹未附带任何设计系统。用户首次在此请求制作轮播图时,先检查 ./ds-bundle 是否存在,再进行其他操作。如果不存在,现在就为他们创建一套,让轮播图从第一张幻灯片开始就体现他们的品牌。引导他们选择以下两种路径之一,然后就不要再询问(在文件夹根目录的 BRAND.md 文件顶部记录他们的选择,并在后续运行时读取)。
路径 A · 他们有网站(推荐)。
询问他们的网站 URL,然后自行查看网站并据此创建套件。获取页面内容,读取其实际使用的颜色、字体、间距和整体视觉风格,并将这些信息写入新的 ./ds-bundle(要写入的内容请参见路径 B 第 4 步中的令牌列表)。粘贴 URL、截图或导出的样式表都可以;不需要任何浏览器工具或爬虫。
他们也可以直接用自己的话描述,例如:
Look at my website <url>. Pull my brand colours, fonts, and overall visual
style, and build a carousel design bundle from it in a folder called ds-bundle.
When it's done, show me the palette and fonts you used.
完成后,向他们展示你选定的配色和字体,并让他们修改任何内容。从此以后,每张幻灯片都会自动沿用他们的品牌风格。
路径 B · 没有网站,也没有设计系统。 在聊天中进行简短的品牌访谈,然后为他们生成一套精简的套件:
- 询问他们的 2 到 3 种品牌颜色(十六进制代码、徽标或可供取色的截图),或者提出根据他们的领域和喜好推导配色方案(见下文“推导完整色彩系统”)。
- 推荐一组字体搭配:一款用于标题的展示字体(紧凑、粗体,例如 Space Grotesk、Archivo、Clash Display),以及一款用于标签和小字的实用字体(例如 Space Mono 等宽字体,或 Inter 这类简洁的无衬线字体)。在预览中通过 Google Fonts 加载字体。
- 询问:使用深色幻灯片、浅色幻灯片,还是两者兼用(深色编辑风是教育类轮播图的稳妥默认选择)。
- 根据选定方案创建
./ds-bundle/tokens/tokens.css(包含 background、ink、accent、muted、line 令牌以及--font-display和--font-mono),创建导入字体和该令牌文件的./ds-bundle/styles.css,再创建一页的./ds-bundle/README.md,最后将摘要记录到BRAND.md。
无论选择哪条路径,最终都会得到同样的结果:一套属于用户、根据其自身品牌生成的 ds-bundle。只有完成这一步,才能继续执行下方的构建顺序。
病毒式传播轮播图的结构
默认的叙事框架。每个表现出色的教育类轮播图都遵循这一框架;除非经过研究的参考内容支持采用不同的叙事走向,否则在第 1 阶段提出此框架。
| 位置 | 作用 | 目标 |
|---|---|---|
| 第 1 张幻灯片 | 钩子 | 一个有力的论断加上一个真实数字。这张幻灯片承担 80% 的效果;它决定读者是否滑动。 |
| 第 2 张幻灯片 | 重要性 | 说明这件事为何与读者当下息息相关。一句话交代背景,不要铺垫过多。 |
| 中间幻灯片 | 价值 | 每张幻灯片只讲一个观点。大字号、短句子。如果一张幻灯片需要一段文字,就拆成两张。 |
| 倒数第二张 | 证据 | 证明方法有效:截图、结果或读者可以核实的数字。 |
| 最后一张幻灯片 | 行动号召 | 只提供一个评论关键词;其余交给私信自动化处理。一张幻灯片上绝不提出两个要求。 |
根据这一结构得出的规则:将一半的总精力花在钩子幻灯片上;真实数字比漂亮的设计更能打动人,因此在编写文案前先向用户询问他们的实际数据;行动号召幻灯片上的关键词必须与说明文字的第一行完全一致。
固定构建顺序:先在聊天中锁定文案,再制作钩子页,最后制作正文页
每个轮播图都必须严格遵循以下三阶段顺序。没有例外,即使用户说“直接开始”。
阶段 1 · 锁定文案(在对话中使用纯文本,不写任何代码)。 首先在聊天中以文本形式向用户发送完整的逐页方案:
- 幻灯片数量(根据主题和正在研究的参考案例,推荐一个数量)
- 对每一页:标签、标题、正文文案、背景处理(照片、生成图像或纯色)以及布局说明(文本放置位置、是否包含卡片或胶囊元素)
- 默认采用上文的“病毒式传播轮播图的结构”(钩子、利害关系、价值、佐证、CTA);研究用户喜欢的 2–3 个参考轮播图(请用户在聊天中粘贴 URL 或截图),只有在参考案例有充分理由时才偏离该结构
- 提出取舍问题(“以颠覆性钩子开篇,还是以建立可信度的关键时刻开篇?”)
在对话中反复修改文案,直到用户确认锁定。阶段 1 期间绝不打开或编辑 carousel.html。
阶段 2 · 仅制作钩子页。 只制作第 1 页(包括任何生成的背景图像),为其截图,并与用户反复修改,直到用户确认锁定钩子页。
阶段 3 · 正文页。 只有在钩子页锁定后,才能制作其余页面、运行 QA 检查并交付。
制作用户尚未批准的 7 页,必定会导致全部重做,浪费数小时。先锁定文案,再动像素。
不可妥协的规则
每次都必须从第一稿开始遵守,无需用户提醒。
1. 每页完成前都必须截图
进行任何结构性编辑(新增页面、全面修改文案、更改布局、更换字体或调整内边距)后,都要使用无头浏览器为受影响的页面截图,并读取已保存的 PNG,然后再向用户汇报。交付未经验证的修改会浪费用户数小时。
任何无头浏览器截图工具都可以(小型 Playwright 脚本、浏览器 CLI,或任何可用工具)。步骤固定:
- 进行编辑
- 在无头浏览器中加载
carousel.html(通过 HTTP 提供服务,并在 URL 中添加?cb=<timestamp>以绕过缓存,避免截到旧版本) - 将轨道移动到受影响的页面:
document.getElementById('track').style.transition='none'; document.getElementById('track').style.transform='translateX(-420 * (N-1))px'; - 截图并保存为带版本号的文件名(例如
screenshots/v3-slide-6.png) - 读取 PNG 并检查
- 只有完成上述步骤后,才能报告“完成”或继续迭代
如果看起来有问题,先修好再声称完成。不要让用户来发现你的错误。
2. 预览中支持键盘方向键和可点击的上一页/下一页按钮
HTML 预览必须支持使用 ArrowLeft / ArrowRight 导航,并显示上一页/下一页按钮。用户应该能用笔记本键盘或点击操作,而不只是通过触控板滑动。
document.addEventListener('keydown', (e) => {
if (e.key === 'ArrowLeft') go(idx - 1);
else if (e.key === 'ArrowRight') go(idx + 1);
});
<button class="nav-btn prev" id="prevBtn" aria-label="Previous slide">‹</button>
<button class="nav-btn next" id="nextBtn" aria-label="Next slide">›</button>
.nav-btn { position:absolute; top:50%; transform:translateY(-50%); width:36px;
height:36px; border-radius:50%; background:rgba(0,0,0,0.55); border:none;
color:#fff; font-size:18px; cursor:pointer; z-index:20;
display:flex; align-items:center; justify-content:center; transition:background 0.15s; }
.nav-btn:hover { background:rgba(0,0,0,0.8); }
.nav-btn.prev { left:10px; } .nav-btn.next { right:10px; }
.nav-btn:disabled { opacity:0.3; cursor:not-allowed; }
两个按钮都调用滑动处理程序使用的同一个 go(idx +/- 1) 函数。在第一页时将上一页按钮设为 disabled,在最后一页时将下一页按钮设为 disabled。预览中显示这些按钮,但导出 PNG 时隐藏(export.py 已隐藏 .nav-btn)。
3. Instagram 页眉和最终 CTA 页使用个人头像
使用用户的圆形个人头像 PNG(正方形照片,调整至 256x256,并添加圆形透明蒙版,使四角透明)。将其以 base64 形式嵌入 HTML。不要使用单字母头像圆圈。不要以“先做 v1,以后再修”为由跳过。
<img class="avatar" src="data:image/png;base64,..."
style="width:32px;height:32px;border-radius:50%;object-fit:cover;display:block;">
如果用户提供的是原始照片,使用 ImageMagick 添加蒙版:
magick input.jpg -resize 256x256 \
\( +clone -threshold 100% -fill white -draw "circle 128,128 128,0" \) \
-alpha off -compose copy_opacity -composite -strip profile.png
交付前确认人脸位于圆形中间。 对非正方形源图直接进行普通缩放,会裁切几何中心,往往导致人脸偏离中心。打开 PNG 检查。如果人脸偏移,先使用 -gravity center -crop WxH+offsetX+offsetY 手动裁切,然后再次检查。
最终 CTA 页也要使用同一张图片,作为带边框的 64-84px 头像。
4. 最终 CTA 幻灯片:内容居中,头像置于标题上方,箭头朝下
这是轮播图中最常见的修改。每次制作轮播图时,都要在初稿中落实:
- 所有内容居中对齐(
text-align:center、align-items:center),不要左对齐。 - 头像居中置于标题上方:圆形头像水平居中,紧贴标题上方。绝对不要左对齐。
- 评论关键词胶囊居中,其中的箭头应当朝下,而非朝右,因为关键词提示指的是帖子下方的评论框。使用向下的 V 形 SVG 或向下箭头字符。
- “I'll DM you...”这行文字居中,紧贴胶囊下方。
标准结构:
<div style="display:flex;flex-direction:column;align-items:center;text-align:center;justify-content:center;">
<img class="avatar" src="..." style="width:84px;height:84px;border-radius:50%;margin:0 auto 20px;">
<h2>WANT THIS ENTIRE SYSTEM?</h2>
<p>One line of value or promise.</p>
<div style="display:inline-flex;align-items:center;gap:8px;">Comment “KEYWORD” <svg></svg></div>
<p>and I'll DM you the build.</p>
</div>
5. 绝不能让展示字体回退到系统无衬线字体
标题使用窄体展示字体(Anton 或类似字体)。如果标题显示成普通的比例无衬线字体,就说明字体加载失败;这种效果看起来很普通,会立即被拒绝。始终在 <head> 中加入 Google Fonts <link>,并在每张 QA 截图中确认标题实际使用的是窄体展示字体,而非回退字体。
6. 标点风格规则(适用于所有幻灯片文案、标签、说明文字和叠加文字)
- 绝不要在任何幻灯片文案、标签、说明文字或叠加文字中使用 em dash、en dash 或双连字符
- 用句号、逗号、换行或间隔号
·分隔 - 复合词中的普通连字符(
long-form、vector-style)可以使用 - 标签示例:
JOB #1 · MAGAZINE LAYOUT - 改写示例:
"print, not just feeds"或"print. Not just feeds."
7. 不要修改用户未要求修改的文案
如果用户要求修改第 1 张幻灯片,不要顺带修改 IG 说明文字、页脚胶囊或其他无关幻灯片。严格限定在用户要求的范围内。
8. 进行破坏性编辑前保存版本快照
用户迭代很快,而且经常事后才发现之前的版本更好。在轮播图文件夹中维护一个 versions/ 目录。进行任何结构性重写(新增幻灯片、全面改写文案、更改布局)前,将当前的 carousel.html 复制到 versions/vN-<short-descriptor>.html:
mkdir -p versions
cp carousel.html versions/v3-lime-highlight.html
当用户说“我更喜欢之前版本的 X”时,在 versions/*.html 中搜索相关片段并恢复。
9. 标题必须铺满幻灯片宽度(最长一行占幻灯片宽度的 75-90%)
如果左对齐标题中最长一行只占宽度的 50-60%,看起来会很糟糕,就像“挤在角落里”。最长一行必须延伸到内容区域的右侧边缘附近。
调整方法:
- 找出你想保留的各行中最长的一行(按字符数计算)
- 计算目标字号:使用 Anton 时,
font_px = slide_content_width / longest_chars / 0.32。使用 Archivo Black 时,除以 0.55。 - 如果计算出的字号导致较短的行换行,就减小 2-4px,直到不再换行。
- 通过截图确认:最长一行应延伸至距离右侧边缘约 20px 以内。
如果不影响其他行就无法达到目标范围,请调整换行位置(将两行较短的文字合并为一行,或将一行较长的文字拆分成两行)。不要提交只占 50% 宽度的标题。
10. 不要出现孤行:绝不要让文本块在最后一行只剩 1-2 个词
标题、副标题、正文段落、提示词行或项目符号都绝不能以只包含一两个词的悬空行结尾。这样看起来凌乱且不完整。适用于所有文本元素。
按以下优先顺序处理:
- 调整大小,让内容完整显示在一行中(短标题优先采用此方法)
- 调整换行位置,让两行都包含多个词且长度相近
- 用
white-space:nowrap将最后 3-4 个词保持在一起,让文本提前换行,并确保最后一行包含多个词 - 刻意设计的每行一个词的展示标题可以接受,但必须是所有行都统一采用的明确设计选择,绝不能只在结尾留一个孤词
完成任何幻灯片后,检查每个文本块的最后一行。如果只剩 1-2 个词,就先修正,再展示给用户。
11. 对称换行:刻意平衡每个多行文本块
仅仅避免孤行还不够;多行文本块必须在视觉上保持平衡。按最大宽度自动换行通常会产生如下不协调的断行:
Swipe for everything I learned so <- long
you can scale faster -> <- short, unbalanced
手动控制换行,将较长行末尾的词移到下一行,直到各行长度相当(或形成整齐的金字塔形):
Swipe for everything I learned <- balanced
so you can scale faster -> <- balanced
规则:
- 对换成 2–3 行的正文、小标题或 CTA 文本块使用显式的
<br>换行。 布局使用固定的 420px 画布,无需保留响应式重排,因此手动选择换行位置明显优于自动换行。 - 在语义边界处换行(分句或短语边界),然后确认各行长度相差不超过约 15%。
- 把词移到下一行,而不是上一行:如果第 1 行较长,就将行末的词移到第 2 行,直到长度平衡。
- 在 QA 截图中检查:任何 2–3 行的文本块,如果其中一行长度超过另一行的约 2 倍,即属违规。
12. 宽度与内边距规范:标题组左侧对齐,每张幻灯片统一内容宽度
这是轮播布局中反复出现的问题。将其视为严格的 QA 门槛:
- 先让标题组各行的字符数尽量相等,再确定字号。 对于 2–3 行的展示型标题,选择断行位置,使各行字符数相差不超过约 2 个字符(例如
THE SMARTEST MODEL/ON EARTH GOES PAID= 18/18)。然后统一设置字号,并在每行使用white-space:nowrap,使各行边缘齐平。如果两行渲染后的宽度差异明显,就重新调整文案断行;不要缩小其中一行。 - 每张幻灯片只使用一种内容宽度。 确定幻灯片的内容宽度(画布宽度减去两侧内边距,例如 420 - 2x32 = 356px),并让每个内容块都使用这一宽度或其有意设置的比例。不同内容块的左右边缘参差不齐,会显得粗糙。
- 居中幻灯片:所有内容都沿同一轴线排列,两侧内边距保持对称。任何内容块都不能因自身内边距不同而在视觉上偏离中心。
- 通过测量进行 QA,而不是凭目测:在截图中,任何一对标题行的渲染宽度相差超过约 10px,或任何内容块的侧边内边距偏离幻灯片标准,都属违规。
13. 不留空白区域:用内容填满空白区域
如果正文与视觉示例或页脚之间存在明显空隙(在高度为 560 的幻灯片上超过约 80px),幻灯片看起来就不完整。可采用以下修复方式:
- 编号卡片:使用带大号数字前缀(展示字体,28–32px)的全宽卡片,取代小圆点项目符号
- 带数据的视觉分隔线:使用水平线,并在中间加入彩色数据标注
- 放大视觉内容:将模拟图、代码块或数据块设置为
flex:1; min-height:0;,使其填满剩余空间 - 装饰元素:在负空间的角落放置大型强调色图形(星号、星形、几何标记)
测试:想象移除幻灯片上的内容。如果空白区域形成了大片矩形,就说明存在无效留白。交付前先修复。
14. 用超大展示字体铺满画布边缘
优秀的轮播图会用展示字体占据约 95% 的幻灯片宽度,其中仅标题就占幻灯片垂直空间的 50-65%。用装饰图形锚定角落。不要留过于保守的边距。
在第一版草稿中就应用以下设置,并用于每张幻灯片(适用于 1080x1440 的原生画布):
- 画布内边距:
padding: 56px 56px 160px或更紧凑。1080px 宽的幻灯片两侧绝不留出 100px 以上的内边距。 - 展示字体:主标题字号为 96-112px,字重为 700-800,字间距为 -2 至 -3px,行高为 1.0-1.05。不要用 40-60px。
- 高亮框:宽度占可用空间的 90-100%,文字居中;不要仅按文字长度自动调整宽度。
- 装饰性锚点:在角落或文字后方放置大块强调色图形,不透明度设为 0.6-1.0,使用
z-index:0,并调整位置,确保绝不遮挡标题或 CTA 文字。 - 边框:添加细边框(1-2px)和角落缺口标记,让幻灯片更有设计感。
需要避免的失败案例:60px 的标题,幻灯片有 30% 的空间只是空白背景。这只是草稿,不是完成的设计。
15. 每张幻灯片只讲一个观点,以受众为先撰写文案
每张幻灯片只表达一个观点:一个主张、一个步骤或一个证据。如果一张幻灯片试图表达两件事,就拆成两张。
文案要面向用户发布内容的受众,而不是面向你自己。如果他们的受众不懂技术,就不要在标题和关键文案中使用术语:
- “编写 HTML”改为“只需上传原始视频”
- “技能 / 库 / 框架 / SDK”改为“工具”或“免费工具”
- “渲染为 MP4”改为“获取制作完成的视频”
如果拿不准,就把文案写得像是在向目标受众中一位很忙、从未打开过终端的人解释一样。
16. 首屏幻灯片的吸引注意力原则
- 第一张幻灯片必须让人停下滑动。开门见山地提出价值主张或大胆主张,而不是进行描述。
- 使用视觉证据(截图、实际数字、图片)立即印证开场内容。
- 优先使用常青的新鲜感提示(“刚刚发布”“本月上新”),而不要使用具体日期,因为几周后日期就会显得过时。只有当日期本身就是新闻时,才使用日期。
- 即使箭头和进度条也能提示用户滑动,在主视觉幻灯片上用强调色突出显示一行居中的“滑动查看效果”,仍然很有价值。
导出规则
当用户要求导出、下载或获取最终 PNG 文件时,务必执行以下操作。 此技能附带两个功能相同的导出器;优先使用 node(可避免 Python 环境问题)。
首先,确认导出器确实能够运行(这一步在步骤 0A 中应该已经完成;只需一行检查,因此绝不能跳过):
node -e "import('playwright').then(()=>console.log('playwright ok')).catch(()=>process.exit(1))"
如果缺少导出器,就立即安装(npm install playwright && npx playwright install chromium),并提醒用户这会下载一次浏览器。如果未先检查这是否是导出失败的原因,绝不能向用户报告导出失败。
# Node (recommended). Run from <carousel_dir> so playwright resolves.
cp .claude/skills/carousel-generator/export.mjs <carousel_dir>/
cd <carousel_dir> && node export.mjs
# Python fallback (needs `pip install playwright` + `python3 -m playwright install chromium`)
cp .claude/skills/carousel-generator/export.py <carousel_dir>/
cd <carousel_dir> && python3 export.py
任一导出器都能在约 10 秒内运行,并将 slide_1.png ... slide_N.png 以 1080x1440 的尺寸写入 ./slides/。两者都会根据 HTML 自动检测幻灯片数量。
不要通过手动浏览器截图、CSS zoom、transform: scale 或循环裁剪图片来重新实现导出。浏览器截图工具的 devicePixelRatio 行为不稳定,可能浪费一小时,最终得到尺寸错误或黑屏的输出。独立脚本之所以有效,是因为它直接在浏览器上下文中设置了 device_scale_factor = 1080/420。
无头浏览器截图仅用于视觉迭代(在设计过程中检查幻灯片效果)。它们绝不能用于导出。
读取 PNG 文件,验证每次导出。 截图工具的内嵌预览会缩放后显示,无法反映保存文件的实际内容。告诉用户已完成之前,读取每个 slide_N.png,确认内容铺满画布。
步骤 1:收集品牌详情
生成任何轮播图前,先向用户询问以下信息(如果尚未提供):
- 品牌名称,显示在第一页和最后一页
- Instagram 账号,显示在 IG 框架的页眉、说明文字和水印中
- 品牌主色,主要的点缀色(提供十六进制代码,或描述颜色,由你选择)
- Logo:SVG 路径、品牌首字母,或跳过
- 字体偏好:衬线标题 + 无衬线正文(编辑风)、全部使用无衬线字体(现代风),或指定 Google Fonts 字体
- 语气:专业、轻松、俏皮、大胆、简约等
- 图片:要包含的任何图片(头像、截图、产品照片)
如果用户提供了网站 URL 或品牌素材,请从中提取配色和风格。否则,使用你在步骤 0 中与用户一起生成的 ./ds-bundle。如果用户只说“给我做一组关于 X 的轮播图”,却没有提供其他详情,请先询问再生成。不要擅自采用默认设置。
步骤 2:推导完整配色系统
根据用户提供的单一品牌主色,生成包含 6 个令牌的完整调色板:
BRAND_PRIMARY = {user's color} // Main accent: progress bar, icons, tags
BRAND_LIGHT = {primary lightened ~20%} // Secondary accent: tags on dark, pills
BRAND_DARK = {primary darkened ~30%} // CTA text, gradient anchor
LIGHT_BG = {warm or cool off-white} // Light slide background (never pure #fff)
LIGHT_BORDER = {slightly darker than LIGHT_BG} // Dividers on light slides
DARK_BG = {near-black with brand tint} // Dark slide background
规则:
- LIGHT_BG 是与主色协调的染色类米白色(暖色主色搭配暖奶油色;冷色主色搭配冷灰白色)
- DARK_BG 是带有细微品牌色温的近黑色(暖色:
#1A1918,冷色:#0F172A) - LIGHT_BORDER 的颜色比 LIGHT_BG 深约 1 个色阶
- 渐变页使用的品牌渐变为
linear-gradient(165deg, BRAND_DARK 0%, BRAND_PRIMARY 50%, BRAND_LIGHT 100%)
用户自己的资源包创建后,对应的值位于 ds-bundle/tokens/tokens.css 中(参见轮播图令牌组)。
步骤 3:设置字体排版
根据用户的偏好,从 Google Fonts 中选择标题字体和正文字体。
| 风格 | 标题字体 | 正文字体 |
|---|---|---|
| 编辑风 / 高级感 | Playfair Display | DM Sans |
| 现代 / 简洁 | Plus Jakarta Sans (700) | Plus Jakarta Sans (400) |
| 温暖 / 亲切 | Lora | Nunito Sans |
| 技术 / 锐利 | Space Grotesk | Space Grotesk |
| 大胆 / 富有表现力 | Fraunces | Outfit |
| 经典 / 可信赖 | Libre Baskerville | Work Sans |
| 粗厚展示 / 有冲击力 | Anton | Space Grotesk |
制作风格强烈、冲击力十足的轮播图时,默认使用粗体窄体展示字体(Anton 或 Archivo Black)。衬线字体仅用于高级感或人像风格。
字号比例(预览宽度为 420px 时):
- 标题:标准字号为 28-34px;粗体展示风格的主视觉标题最大可用 60-66px(Anton)或 48-54px(Archivo Black),行高为 0.9-1.15
- 正文:14px,字重 400,行高 1.5-1.55
- 标签:10px,字重 600,字间距 2px,全大写
- 步骤编号:标题字体,26px,字重 300
- 小字:11-12px
420px 宽度下单行展示标题的字符适配经验法则:Anton 在 60-66px 时每行适合约 22-25 个字符;Archivo Black 在 50-54px 时每行适合约 14-16 个字符。Anton 全大写的通用规则:max_size_px = container_width / (chars x 0.49)。
在所有页面中,通过 CSS 类 .serif(标题字体)和 .sans(正文字体)应用字体。
页面架构
格式
- 宽高比:3:4(1080 x 1440),这是 Instagram 推荐的轮播图尺寸(个人主页网格也会裁剪为 3:4)。每一页都必须严格为 3:4,不得例外。
- 布局画布:420 x 560px。导出时通过
device_scale_factor按 1080/420 = 2.5714 的比例放大。请以 420 为基准制作,不要直接以 1080 为基准。 - 每一页都是独立的:所有 UI 元素都已嵌入图像中
- 交替使用 LIGHT_BG 和 DARK_BG 背景,营造视觉节奏
每一页都必须嵌入的元素
1. 进度条(每张幻灯片底部)
显示观看者在轮播中的位置。随着滑动逐渐填满。
- 位置:绝对定位于底部,宽度全满,水平内边距为 28px,底部内边距为 20px
- 轨道:高度 3px,圆角
- 填充宽度:
((slideIndex + 1) / totalSlides) * 100% - 浅色幻灯片:轨道为
rgba(0,0,0,0.08),填充为 BRAND_PRIMARY,计数器为rgba(0,0,0,0.3) - 深色幻灯片:轨道为
rgba(255,255,255,0.12),填充为#fff,计数器为rgba(255,255,255,0.4) - 条形旁的计数器标签:采用「1/7」格式,字号 11px,字重 500
function progressBar(index, total, isLightSlide) {
const pct = ((index + 1) / total) * 100;
const trackColor = isLightSlide ? 'rgba(0,0,0,0.08)' : 'rgba(255,255,255,0.12)';
const fillColor = isLightSlide ? BRAND_PRIMARY : '#fff';
const labelColor = isLightSlide ? 'rgba(0,0,0,0.3)' : 'rgba(255,255,255,0.4)';
return `<div style="position:absolute;bottom:0;left:0;right:0;padding:16px 28px 20px;z-index:10;display:flex;align-items:center;gap:10px;">
<div style="flex:1;height:3px;background:${trackColor};border-radius:2px;overflow:hidden;">
<div style="height:100%;width:${pct}%;background:${fillColor};border-radius:2px;"></div>
</div>
<span style="font-size:11px;color:${labelColor};font-weight:500;">${index + 1}/${total}</span>
</div>`;
}
2. 滑动箭头(右侧边缘,除最后一张外的每张幻灯片)
用一个低调的尖括号提示观看者继续滑动。最后一张幻灯片上移除箭头,让观看者知道已经到达末尾。
- 位置:绝对定位于右侧,高度全满,宽度 48px
- 背景:从透明渐变为淡色
- 尖括号:24x24 SVG,圆角描边
- 浅色幻灯片:背景为
rgba(0,0,0,0.06),描边为rgba(0,0,0,0.25) - 深色幻灯片:背景为
rgba(255,255,255,0.08),描边为rgba(255,255,255,0.35)
function swipeArrow(isLightSlide) {
const bg = isLightSlide ? 'rgba(0,0,0,0.06)' : 'rgba(255,255,255,0.08)';
const stroke = isLightSlide ? 'rgba(0,0,0,0.25)' : 'rgba(255,255,255,0.35)';
return `<div style="position:absolute;right:0;top:0;bottom:0;width:48px;z-index:9;display:flex;align-items:center;justify-content:center;background:linear-gradient(to right,transparent,${bg});">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none">
<path d="M9 6l6 6-6 6" stroke="${stroke}" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>`;
}
3. 水印
在 bottom:32px 处放置小型账号水印(@YOURHANDLE),字号为 8px,字间距为 2px,透明度较低(约 0.25)。进度条容器大约占据底部 39px,因此 bottom:32px 会将水印放在进度条上方、使用 padding-bottom:56px 的内容下方的空隙中。位置更低会与进度条重叠;更高则会与内容碰撞。
幻灯片内容模式
布局规则
- 内容内边距:标准值为
0 36px - 带进度条且内容靠底部对齐的幻灯片:使用
0 36px 52px,为进度条留出空间;内容容器使用padding-bottom:56px,为进度条和水印留出空间 - 主视觉/CTA 幻灯片:
justify-content: center - 内容密集型幻灯片:
justify-content: flex-end(文字位于底部,上方留出视觉空间)
标签/类别标签
位于标题上方,用于说明幻灯片类别的小型大写标签。
<span class="sans" style="display:inline-block;font-size:10px;font-weight:600;letter-spacing:2px;color:{color};margin-bottom:16px;">{TAG TEXT}</span>
- 浅色幻灯片:BRAND_PRIMARY。深色幻灯片:BRAND_LIGHT。渐变幻灯片:
rgba(255,255,255,0.6)。
Logo 组合(首尾幻灯片)
- 提供的 Logo 图标:40px 圆形(背景为 BRAND_PRIMARY),图标居中,旁边放置品牌名称
- 首字母:40px 圆形,白色显示品牌名称首字母
- 品牌名称:字号 13px,字重 600,字间距 0.5px
Logo 水印(可选)
如果提供了 Logo 图标,可在关键幻灯片(主视觉、CTA、渐变)上将其用作低调的背景水印,透明度设为 0.04-0.06。未提供 Logo 时则跳过。
标准幻灯片顺序
遵循以下叙事脉络。以 7-8 张幻灯片为目标:足以传达实际价值,又不会拖沓。只有在内容确实需要时才超过 8 张。
| # | 类型 | 背景 | 目的 |
|---|---|---|---|
| 1 | 主视觉 | LIGHT_BG | 吸引注意:有力陈述、Logo 组合、可选水印 |
| 2 | 问题 | DARK_BG | 痛点:出现了什么故障、令人沮丧或过时 |
| 3 | 解决方案 | 品牌渐变 | 给出答案,可选引言或提示词框 |
| 4 | 功能 | LIGHT_BG | 可获得的内容:带图标的功能列表 |
| 5 | 详情 | DARK_BG | 深入介绍:自定义、规格、差异化特点 |
| 6 | 操作指南 | LIGHT_BG | 步骤:编号工作流或流程 |
| 7 | CTA | 品牌渐变 | 行动号召。不显示箭头。进度条填满。 |
规则:
- 以吸引注意的内容开篇(参见规则 16)
- 以品牌渐变背景上的关键词 CTA 收尾:不显示滑动箭头,进度条达到 100%,采用规则 4 中的居中布局
- 浅色和深色背景交替使用,营造节奏感
- 根据主题调整顺序;并非每个轮播都需要「问题」幻灯片
- 保持幻灯片内容模块化;用户通常会重新排列幻灯片,以优化叙事流程
可复用组件
删除线胶囊标签(表示将被替换的内容)
<span style="font-size:11px;padding:5px 12px;border:1px solid rgba(255,255,255,0.1);border-radius:20px;color:#6B6560;text-decoration:line-through;">{Old tool}</span>
标签胶囊
<span style="font-size:11px;padding:5px 12px;background:rgba(255,255,255,0.06);border-radius:20px;color:{BRAND_LIGHT};">{Label}</span>
提示词/引言框
<div style="padding:16px;background:rgba(0,0,0,0.15);border-radius:12px;border:1px solid rgba(255,255,255,0.08);">
<p class="sans" style="font-size:13px;color:rgba(255,255,255,0.5);margin-bottom:6px;">{Label}</p>
<p class="serif" style="font-size:15px;color:#fff;font-style:italic;line-height:1.4;">"{Quote text}"</p>
</div>
提示词框中的字段必须各自保持在一行内;与其让占位文本换行,不如缩短文本。较长的复制粘贴提示词比简短提示词更可信;可补充具体指令(要获取什么、要如何排序、要输出什么),不要填充无关内容。
功能列表
<div style="display:flex;align-items:flex-start;gap:14px;padding:10px 0;border-bottom:1px solid {LIGHT_BORDER};">
<span style="color:{BRAND_PRIMARY};font-size:15px;width:18px;text-align:center;">{icon}</span>
<div>
<span class="sans" style="font-size:14px;font-weight:600;color:{DARK_BG};">{Label}</span>
<span class="sans" style="font-size:12px;color:#8A8580;">{Description}</span>
</div>
</div>
编号步骤
<div style="display:flex;align-items:flex-start;gap:16px;padding:14px 0;border-bottom:1px solid {LIGHT_BORDER};">
<span class="serif" style="font-size:26px;font-weight:300;color:{BRAND_PRIMARY};min-width:34px;line-height:1;">01</span>
<div>
<span class="sans" style="font-size:14px;font-weight:600;color:{DARK_BG};">{Step title}</span>
<span class="sans" style="font-size:12px;color:#8A8580;">{Step description}</span>
</div>
</div>
多行高亮框
默认情况下,多行文本范围上的背景高亮(background:{accent}; padding:2px 8px;)会渲染成断开的方框。修复方法:
box-decoration-break: clone;
-webkit-box-decoration-break: clone;
配合稍宽松的行高(1.15-1.18),高亮就能在多行之间流畅延伸。厚重的深色投影(box-shadow: 4px 4px 0 {DARK_BG})能让它更醒目。
CTA 按钮(仅限最后一页)
<div style="display:inline-flex;align-items:center;gap:8px;padding:12px 28px;background:{LIGHT_BG};color:{BRAND_DARK};font-family:'{BODY_FONT}',sans-serif;font-weight:600;font-size:14px;border-radius:28px;">
{CTA text}
</div>
Instagram 画框(预览包装器)
在轮播内容外加上 Instagram 风格的画框,让用户预览实际效果:
- **页眉:**头像 + 用户名 + 副标题
- **视口:**3:4 比例,可滑动/拖动的轨道,包含所有幻灯片
- **圆点:**视口下方的小圆点指示器
- **操作:**心形、评论、分享、书签 SVG 图标
- **说明文字:**用户名 + 简短描述 + “2 HOURS AGO” 时间戳
加入基于指针的滑动/拖动交互、键盘方向键以及上一页/下一页按钮。幻灯片本身是可独立导出的图片。
.ig-frame 的宽度必须恰好为 420px。 内部视口尺寸为 420x560(3:4)。所有幻灯片布局、字号和间距均以此基准宽度设计。请勿更改;导出流程依赖此尺寸。
如果最后一页有 COMMENT 关键词,模拟图中的 IG 说明文字必须使用完全相同的关键词(大小写和标点均须一致;评论者更常照抄说明文字,而不是按钮)。承诺的数量也必须与实际提供的数量一致:如果免费指南包含 7 项,文案就写 7 项。
视觉迭代流程
导出前,亲自查看幻灯片。不要想当然地认为 HTML 会按预期渲染。
# Serve over HTTP; headless browsers handle http:// more reliably than file://
cd /path/to/carousel/dir && python3 -m http.server 8765 &
在无头浏览器中加载 http://localhost:8765/carousel.html?cb=<timestamp>,将轨道移动到第 N 张幻灯片(从 0 开始计数):
const track = document.getElementById('track');
track.style.transition = 'none';
track.style.transform = 'translateX(' + (-N * 420) + 'px)';
使用带版本号的文件名将截图保存到 screenshots/(例如 screenshots/v3-slide-6.png,绝不要放在仓库根目录),以便比较不同迭代。
何时运行此流程:
- 进行任何结构性编辑后
- 用户报告视觉问题时(先截图,不要猜测)
- 宣布轮播完成前:从头到尾逐一检查所有 N 张幻灯片
完成后务必终止 HTTP 服务;遗留的服务会占用同一端口,与后续会话冲突。
导出前压缩素材
用户提供的图片和视频通常比 1080x1440 输出所需的尺寸大得多。请先大幅压缩,再嵌入 Base64:
图片(JPEG)
ffmpeg -y -i INPUT -vf "scale=W:H:flags=lanczos" -q:v 3 OUTPUT.jpg
对于 48px 的头像圆形图,使用 256x256。对于整页截图,960x540 通常就足够。2MB 的 JPEG 通常可压缩到 20-40KB,且不会有明显损失。
嵌入前,使用 file 命令检查实际文件格式;用户文件通常即使扩展名为 .png,实际也是 JPEG,数据 URI 中的 MIME 类型必须与之匹配。
视频(H.264 MP4)
ffmpeg -y -i INPUT \
-vf "scale=960:-2:flags=lanczos,fps=30" \
-c:v libx264 -pix_fmt yuv420p -crf 26 -preset slow -movflags +faststart -an \
OUTPUT.mp4
4MB 的源文件在轮播尺寸下通常可缩小到约 150KB。如果源视频为 60fps 或更高,请降低帧率。
Base64 大小预算
Base64 会增加约 33% 的体积。每个嵌入素材应控制在 500KB 以下,HTML 总大小应低于 2MB;超过这些限制,浏览器解析速度会变慢,导出时的 set_content 调用也可能超时。
将所有图片嵌入为 data: URI。 导出时会通过 set_content 加载 HTML,此时相对 URL 无法解析;文件路径形式的 <img src> 值会静默失效。使用 Base64 嵌入可确保 HTML 完全自包含,并在各种环境中安全渲染。
导出幻灯片(详情)
唯一需要运行的命令:
cp .claude/skills/carousel-generator/export.py <carousel_dir>/
cd <carousel_dir> && python3 export.py
将 slide_1.png ... slide_N.png 以 1080x1440 的尺寸写入 ./slides/。自动检测幻灯片数量。
关键导出规则
- 绝不要通过手动浏览器截图导出。 截图工具中不稳定的
devicePixelRatio处理会与各种缩放方式相冲突。独立脚本会直接在浏览器上下文中设置device_scale_factor = 1080/420。 - 使用 Python 生成 HTML,绝不要使用带变量插值的 shell 脚本;shell 变量会破坏内容(
$符号、反引号、数字)。使用Path.write_text()生成 HTML。 - 将图片嵌入为 base64,确保 HTML 在无头浏览器中完全自包含。
- 保持 420px 的布局宽度。 导出时会放大,但不会改变布局。绝不要将视口宽度设为 1080px;这会导致布局重新流动并使所有内容变形。
常见导出错误
| 错误 | 问题 | 修复方法 |
|---|---|---|
| 将视口设为 1080x1440 | 布局重新流动:字体过小,间距错乱 | 保持视口为 420x560,使用 device_scale_factor |
| 使用 shell 脚本生成 HTML | $ 和反引号会被插值 | 使用 Python 生成 HTML |
| 未等待字体加载 | 标题会以备用字体渲染 | 页面加载后等待约 3 秒(脚本会这样做) |
| 未隐藏 IG 框架控件 | 导出内容包含页眉、圆点和说明文字 | 脚本会隐藏 .ig-header,.ig-dots,.ig-actions,.ig-caption,.nav-btn,.dots |
更改 .ig-frame 宽度 | 整个布局会偏移 | 始终设为精确的 420px |
| 依赖截图预览 | 预览经过缩放;实际文件可能不同 | 逐一读取保存的 slide_N.png |
视频幻灯片(混合媒体轮播)
Instagram 轮播支持混合使用 PNG 和 MP4,宽高比均为 3:4。如果幻灯片包含 <video> 元素,请在最终导出前询问用户:他们想要 MP4(保留动态效果)还是 PNG 静帧。
导出 MP4 时,不要使用浏览器的视频录制功能(缩放错误,还会进行双重转码)。应将幻灯片的静态内容渲染为透明背景的 PNG 叠加层(隐藏视频并清除其容器背景,截图时保留 alpha),然后使用 ffmpeg 合成:
[bottom] solid canvas at slide bg color (1080x1440)
[middle] source video, cover-fit into the video element's bounding box
[top] overlay PNG with alpha
关键规则:
- 使用
scale=W:H:force_original_aspect_ratio=increase,crop=...进行铺满裁剪,绝不要单独使用scale=W:H(会拉伸) - 导出时长必须恰好等于源文件的一次循环时长(使用 ffprobe 获取时长),这样 Instagram 自动循环时就不会出现接缝
- 始终混入静音 AAC 音轨(
-f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100、-c:a aac);Instagram 有时会拒绝没有音轨的轮播视频 - 使用 H.264 High profile、yuv420p、CRF 18-20、30fps;每张幻灯片时长至少 3s,最多 60s
- 导出前索取最高分辨率的源文件;嵌入版本已预先压缩,放大后会出现像素化
- 提供一个
final/文件夹,其中包含按上传顺序编号的slide_1.{png|mp4}... 文件
文案与署名规则
- 带引号标题的开引号。 在 HTML 源码中使用明确的 Unicode U+201C(开引号)和 U+201D(闭引号)。直引号 ASCII 字符通常会在两侧都渲染成右弯引号。
- 图片说明中的署名必须真实。 如果展示的提示词是你自己的实验,使用
My test: "<prompt>"。只有在确实能从来源核实的情况下,才将引文或演示归于某家公司或某个人。如果该提示词并非实际生成来源,绝不要使用Generated with: "<prompt>"。 - 关键数量必须准确。 如果承诺的交付内容有 N 项,每次提及数量时都必须准确写为 N。
- 通过一个 Python 脚本批量编辑。 对现有轮播进行 10 处或更多文本/结构更改时,编写一个 Python 脚本完成所有替换,并使用
content.count(old)断言,而不是依次进行多次编辑。 - 使用真实产品徽标,而非文本字符,用于幻灯片中提及的具名工具。
布局最佳实践
- 所有
<img>标签都必须具有明确的尺寸样式。 绝不要只写<img src>;始终使用style="width:100%;height:100%;object-fit:cover;object-position:top left;display:block;"。否则,图片会以原始分辨率渲染,撑破布局。 - 单图容器必须设置明确的高度约束:设置
height或max-height(通常为 140-240px),并设置flex-shrink:0。单图容器上不要使用flex:1; min-height:0;Flex 会计算错误,导致图片越过padding-bottom,延伸到水印区域。 - 2-4 张图片的网格是例外:在网格父元素上设置
flex:1; min-height:0,并在每个单元格上设置height:100%,这种做法是正确的,因为幻灯片的padding-bottom会单独预留底部区域。 <video>元素遵循与<img>相同的规则:设置明确的 cover 适配样式,并添加autoplay muted loop playsinline。当用户换用新的预先构图素材时,移除之前的transform:scale()或偏离中心的object-position调整;相信素材本身的构图。- 多主体素材的
object-position。 当宽幅图片中包含多个主体,而单元格需要以其中一个为中心时,通过截图反复调整object-position: X% center。 - 溢出预检。 对每张包含图片区块和说明文字的幻灯片,累加(padding-top + 标签 + 标题 + 正文 + 图片 + 说明文字 + padding-bottom),并确认总高度不超过 560px。调整图片高度以适应。
- 调整幻灯片顺序会影响三项内容:幻灯片位置、标签/编号,以及进度条百分比和计数分数。很容易漏掉其中一项。
QA 扫描:向用户展示前运行
生成或编辑轮播图后,扫描每张幻灯片中的这些问题,并自动修复违规项。绝不要让用户来报告图片撑破布局或内容重叠。
- 图片撑破布局:每个
<img>都具有明确的 cover 适配尺寸样式。 - 容器尺寸:每个图片/视频包装元素都设置了明确的
height/max-height和flex-shrink:0(上述规则中的网格除外)。 - 底部重叠:内容不得与水印(
bottom:32px)或进度条(bottom 约为 39px)重叠。内容容器使用padding-bottom:56px。 - 进度条计算:每张幻灯片的填充比例等于
(slideNumber / totalSlides) * 100%,且计数器与之匹配。 - 滑动箭头:最后一张幻灯片上不显示,其他幻灯片上均显示。
- 明暗主题一致性:箭头、进度轨道/填充、水印和计数器的颜色都与幻灯片背景主题相匹配。
- 幻灯片数量:
class="slide"div 的总数与计数器分母及圆点指示器相匹配。 - 字体加载:每个用到的字体系列都有对应的 Google Fonts
<link>;标题使用实际的展示字体渲染。 - 孤行与平衡:最后一行不得只包含 1-2 个词;多行区块应保持平衡;标题堆叠应遵循宽度规则,边缘对齐。
- 嵌入素材大小:单个 base64 数据负载不得超过约 500KB;HTML 总大小低于约 2MB。
执行此扫描时,读取已移除 base64 数据的 HTML;绝不要将原始嵌入图片读入上下文。
上下文管理
轮播图会话的上下文开销较大(base64 素材、截图)。为提高会话效率:
- 编辑轮播图 HTML 时,先移除 base64 内容(
sed '/base64/d') - 立即从用户截图中提取可执行的反馈,然后继续处理
- 多轮反馈中的修复应批量处理,不要一次只修复一项
- 如果上下文所剩不多但工作尚未完成,请告知用户并建议开启新会话;锁定的文案计划和
versions/快照可以低成本恢复工作
设计原则
- 每张幻灯片都可直接导出:箭头和进度条属于幻灯片图像,而非叠加的 UI
- 每张幻灯片只表达一个观点
- 明暗交替营造节奏感,并在滑动浏览时持续吸引注意力
- 标题与正文的字体搭配:标题字体突出醒目,正文字体清晰易读
- 从品牌衍生的配色方案:所有颜色都源自一种主色
- 渐进式呈现:进度条逐渐填满,箭头指引前进
- 最后一张幻灯片与众不同:不显示箭头,进度条填满,居中显示关键词 CTA
- 组件风格一致:每张幻灯片都使用相同的标签样式、列表样式和间距
- 内容留白避开 UI:正文不会与进度条或箭头重叠
- 快速迭代:展示预览,针对具体幻灯片获取反馈并进行修改;除非方向发生根本性变化,否则不要从头重做