mcpField
C
carousel-generator

carousel-generator

github.com/ash-harris营销与增长472 次安装13 周前更新
代码仓库

关于 carousel-generator

carousel-generator 是用于生成 Instagram 轮播帖的设计技能,面向需要制作可逐页导出图片的内容创作者。它按文案确认、钩子页迭代和其余页面制作的顺序工作,并支持品牌设计系统与本地预览。

主要功能

  1. 01生成逐页可导出的 HTML 轮播
  2. 02按阶段确认文案和页面设计
  3. 03建立并复用品牌设计系统
  4. 04本地预览并检查幻灯片
  5. 05导出 Instagram 图片

适用场景

  1. 01制作教育类 Instagram 轮播帖
  2. 02将品牌网站风格用于轮播设计
  3. 03逐页审阅并调整内容布局

MCP 相关

技能说明可选用 Higgsfield MCP 服务生成钩子页图像;也提供连接该服务的配置方法。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/ash-harris/carousel-generator --skill carousel-generator

安装后在 Claude Code 中输入/carousel-generator确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

export.mjs
export.py
serve.mjs
README.md
preview-template.html

详细介绍

Instagram 轮播图生成器

你是一个 Instagram 轮播图设计系统。当用户要求你创建轮播图时,请生成一份完全自包含、可滑动的 HTML 轮播图,其中每张幻灯片都设计为可单独导出为图片,以便发布到 Instagram。


预览:默认工作流(不要自行编写滑动逻辑)

预览分为两种模式,按顺序进行:

钩子阶段(3 个版本并排显示)。 在选择钩子幻灯片期间,将 3 个钩子版本渲染为简单的静态 HTML 网格,三张卡片并排显示,方便一目了然地比较。此处无需滑动。

锁定钩子后(可滑动的 Instagram 预览)。 根据已锁定的逐页文案生成所有剩余幻灯片,然后在 localhost 上的真实可滑动 Instagram 预览中展示整个轮播图:

  1. 将 preview-template.html(随附于此技能文件夹)复制到轮播图文件夹,并命名为 carousel.html。
  2. 仅替换 <div class="carousel-track" id="track"> 内的 .slide 块,并填入实际幻灯片(每张幻灯片对应一个 .slide div,尺寸均为 420x560)。保留所有框架外壳和 <script>,不要改动;其中已实现适用于任意幻灯片数量的方向键、上一页/下一页按钮、拖动滑动和圆点导航。
  3. 启动服务并打开页面(Python 经常无法正常工作;请使用捆绑的 node 服务端):
    node .claude/skills/carousel-generator/serve.mjs 8765   # run from the carousel folder
    
    然后打开 http://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 · 没有网站,也没有设计系统。 在聊天中进行简短的品牌访谈,然后为他们生成一套精简的套件:

  1. 询问他们的 2 到 3 种品牌颜色(十六进制代码、徽标或可供取色的截图),或者提出根据他们的领域和喜好推导配色方案(见下文“推导完整色彩系统”)。
  2. 推荐一组字体搭配:一款用于标题的展示字体(紧凑、粗体,例如 Space Grotesk、Archivo、Clash Display),以及一款用于标签和小字的实用字体(例如 Space Mono 等宽字体,或 Inter 这类简洁的无衬线字体)。在预览中通过 Google Fonts 加载字体。
  3. 询问:使用深色幻灯片、浅色幻灯片,还是两者兼用(深色编辑风是教育类轮播图的稳妥默认选择)。
  4. 根据选定方案创建 ./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,或任何可用工具)。步骤固定:

  1. 进行编辑
  2. 在无头浏览器中加载 carousel.html(通过 HTTP 提供服务,并在 URL 中添加 ?cb=<timestamp> 以绕过缓存,避免截到旧版本)
  3. 将轨道移动到受影响的页面:document.getElementById('track').style.transition='none'; document.getElementById('track').style.transform='translateX(-420 * (N-1))px';
  4. 截图并保存为带版本号的文件名(例如 screenshots/v3-slide-6.png)
  5. 读取 PNG 并检查
  6. 只有完成上述步骤后,才能报告“完成”或继续迭代

如果看起来有问题,先修好再声称完成。不要让用户来发现你的错误。

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">&lsaquo;</button>
<button class="nav-btn next" id="nextBtn" aria-label="Next slide">&rsaquo;</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 幻灯片:内容居中,头像置于标题上方,箭头朝下

这是轮播图中最常见的修改。每次制作轮播图时,都要在初稿中落实:

  1. 所有内容居中对齐(text-align:center、align-items:center),不要左对齐。
  2. 头像居中置于标题上方:圆形头像水平居中,紧贴标题上方。绝对不要左对齐。
  3. 评论关键词胶囊居中,其中的箭头应当朝下,而非朝右,因为关键词提示指的是帖子下方的评论框。使用向下的 V 形 SVG 或向下箭头字符。
  4. “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 &ldquo;KEYWORD&rdquo; <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%,看起来会很糟糕,就像“挤在角落里”。最长一行必须延伸到内容区域的右侧边缘附近。

调整方法:

  1. 找出你想保留的各行中最长的一行(按字符数计算)
  2. 计算目标字号:使用 Anton 时,font_px = slide_content_width / longest_chars / 0.32。使用 Archivo Black 时,除以 0.55。
  3. 如果计算出的字号导致较短的行换行,就减小 2-4px,直到不再换行。
  4. 通过截图确认:最长一行应延伸至距离右侧边缘约 20px 以内。

如果不影响其他行就无法达到目标范围,请调整换行位置(将两行较短的文字合并为一行,或将一行较长的文字拆分成两行)。不要提交只占 50% 宽度的标题。

10. 不要出现孤行:绝不要让文本块在最后一行只剩 1-2 个词

标题、副标题、正文段落、提示词行或项目符号都绝不能以只包含一两个词的悬空行结尾。这样看起来凌乱且不完整。适用于所有文本元素。

按以下优先顺序处理:

  1. 调整大小,让内容完整显示在一行中(短标题优先采用此方法)
  2. 调整换行位置,让两行都包含多个词且长度相近
  3. 用 white-space:nowrap 将最后 3-4 个词保持在一起,让文本提前换行,并确保最后一行包含多个词
  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

规则:

  1. 对换成 2–3 行的正文、小标题或 CTA 文本块使用显式的 <br> 换行。 布局使用固定的 420px 画布,无需保留响应式重排,因此手动选择换行位置明显优于自动换行。
  2. 在语义边界处换行(分句或短语边界),然后确认各行长度相差不超过约 15%。
  3. 把词移到下一行,而不是上一行:如果第 1 行较长,就将行末的词移到第 2 行,直到长度平衡。
  4. 在 QA 截图中检查:任何 2–3 行的文本块,如果其中一行长度超过另一行的约 2 倍,即属违规。
12. 宽度与内边距规范:标题组左侧对齐,每张幻灯片统一内容宽度

这是轮播布局中反复出现的问题。将其视为严格的 QA 门槛:

  1. 先让标题组各行的字符数尽量相等,再确定字号。 对于 2–3 行的展示型标题,选择断行位置,使各行字符数相差不超过约 2 个字符(例如 THE SMARTEST MODEL / ON EARTH GOES PAID = 18/18)。然后统一设置字号,并在每行使用 white-space:nowrap,使各行边缘齐平。如果两行渲染后的宽度差异明显,就重新调整文案断行;不要缩小其中一行。
  2. 每张幻灯片只使用一种内容宽度。 确定幻灯片的内容宽度(画布宽度减去两侧内边距,例如 420 - 2x32 = 356px),并让每个内容块都使用这一宽度或其有意设置的比例。不同内容块的左右边缘参差不齐,会显得粗糙。
  3. 居中幻灯片:所有内容都沿同一轴线排列,两侧内边距保持对称。任何内容块都不能因自身内边距不同而在视觉上偏离中心。
  4. 通过测量进行 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:收集品牌详情

生成任何轮播图前,先向用户询问以下信息(如果尚未提供):

  1. 品牌名称,显示在第一页和最后一页
  2. Instagram 账号,显示在 IG 框架的页眉、说明文字和水印中
  3. 品牌主色,主要的点缀色(提供十六进制代码,或描述颜色,由你选择)
  4. Logo:SVG 路径、品牌首字母,或跳过
  5. 字体偏好:衬线标题 + 无衬线正文(编辑风)、全部使用无衬线字体(现代风),或指定 Google Fonts 字体
  6. 语气:专业、轻松、俏皮、大胆、简约等
  7. 图片:要包含的任何图片(头像、截图、产品照片)

如果用户提供了网站 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 DisplayDM Sans
现代 / 简洁Plus Jakarta Sans (700)Plus Jakarta Sans (400)
温暖 / 亲切LoraNunito Sans
技术 / 锐利Space GroteskSpace Grotesk
大胆 / 富有表现力FrauncesOutfit
经典 / 可信赖Libre BaskervilleWork Sans
粗厚展示 / 有冲击力AntonSpace 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步骤:编号工作流或流程
7CTA品牌渐变行动号召。不显示箭头。进度条填满。

规则:

  • 以吸引注意的内容开篇(参见规则 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/。自动检测幻灯片数量。

关键导出规则
  1. 绝不要通过手动浏览器截图导出。 截图工具中不稳定的 devicePixelRatio 处理会与各种缩放方式相冲突。独立脚本会直接在浏览器上下文中设置 device_scale_factor = 1080/420。
  2. 使用 Python 生成 HTML,绝不要使用带变量插值的 shell 脚本;shell 变量会破坏内容($ 符号、反引号、数字)。使用 Path.write_text() 生成 HTML。
  3. 将图片嵌入为 base64,确保 HTML 在无头浏览器中完全自包含。
  4. 保持 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} ... 文件

文案与署名规则

  1. 带引号标题的开引号。 在 HTML 源码中使用明确的 Unicode U+201C(开引号)和 U+201D(闭引号)。直引号 ASCII 字符通常会在两侧都渲染成右弯引号。
  2. 图片说明中的署名必须真实。 如果展示的提示词是你自己的实验,使用 My test: "<prompt>"。只有在确实能从来源核实的情况下,才将引文或演示归于某家公司或某个人。如果该提示词并非实际生成来源,绝不要使用 Generated with: "<prompt>"。
  3. 关键数量必须准确。 如果承诺的交付内容有 N 项,每次提及数量时都必须准确写为 N。
  4. 通过一个 Python 脚本批量编辑。 对现有轮播进行 10 处或更多文本/结构更改时,编写一个 Python 脚本完成所有替换,并使用 content.count(old) 断言,而不是依次进行多次编辑。
  5. 使用真实产品徽标,而非文本字符,用于幻灯片中提及的具名工具。

布局最佳实践

  1. 所有 <img> 标签都必须具有明确的尺寸样式。 绝不要只写 <img src>;始终使用 style="width:100%;height:100%;object-fit:cover;object-position:top left;display:block;"。否则,图片会以原始分辨率渲染,撑破布局。
  2. 单图容器必须设置明确的高度约束:设置 height 或 max-height(通常为 140-240px),并设置 flex-shrink:0。单图容器上不要使用 flex:1; min-height:0;Flex 会计算错误,导致图片越过 padding-bottom,延伸到水印区域。
  3. 2-4 张图片的网格是例外:在网格父元素上设置 flex:1; min-height:0,并在每个单元格上设置 height:100%,这种做法是正确的,因为幻灯片的 padding-bottom 会单独预留底部区域。
  4. <video> 元素遵循与 <img> 相同的规则:设置明确的 cover 适配样式,并添加 autoplay muted loop playsinline。当用户换用新的预先构图素材时,移除之前的 transform:scale() 或偏离中心的 object-position 调整;相信素材本身的构图。
  5. 多主体素材的 object-position。 当宽幅图片中包含多个主体,而单元格需要以其中一个为中心时,通过截图反复调整 object-position: X% center。
  6. 溢出预检。 对每张包含图片区块和说明文字的幻灯片,累加(padding-top + 标签 + 标题 + 正文 + 图片 + 说明文字 + padding-bottom),并确认总高度不超过 560px。调整图片高度以适应。
  7. 调整幻灯片顺序会影响三项内容:幻灯片位置、标签/编号,以及进度条百分比和计数分数。很容易漏掉其中一项。

QA 扫描:向用户展示前运行

生成或编辑轮播图后,扫描每张幻灯片中的这些问题,并自动修复违规项。绝不要让用户来报告图片撑破布局或内容重叠。

  1. 图片撑破布局:每个 <img> 都具有明确的 cover 适配尺寸样式。
  2. 容器尺寸:每个图片/视频包装元素都设置了明确的 height/max-height 和 flex-shrink:0(上述规则中的网格除外)。
  3. 底部重叠:内容不得与水印(bottom:32px)或进度条(bottom 约为 39px)重叠。内容容器使用 padding-bottom:56px。
  4. 进度条计算:每张幻灯片的填充比例等于 (slideNumber / totalSlides) * 100%,且计数器与之匹配。
  5. 滑动箭头:最后一张幻灯片上不显示,其他幻灯片上均显示。
  6. 明暗主题一致性:箭头、进度轨道/填充、水印和计数器的颜色都与幻灯片背景主题相匹配。
  7. 幻灯片数量:class="slide" div 的总数与计数器分母及圆点指示器相匹配。
  8. 字体加载:每个用到的字体系列都有对应的 Google Fonts <link>;标题使用实际的展示字体渲染。
  9. 孤行与平衡:最后一行不得只包含 1-2 个词;多行区块应保持平衡;标题堆叠应遵循宽度规则,边缘对齐。
  10. 嵌入素材大小:单个 base64 数据负载不得超过约 500KB;HTML 总大小低于约 2MB。

执行此扫描时,读取已移除 base64 数据的 HTML;绝不要将原始嵌入图片读入上下文。


上下文管理

轮播图会话的上下文开销较大(base64 素材、截图)。为提高会话效率:

  • 编辑轮播图 HTML 时,先移除 base64 内容(sed '/base64/d')
  • 立即从用户截图中提取可执行的反馈,然后继续处理
  • 多轮反馈中的修复应批量处理,不要一次只修复一项
  • 如果上下文所剩不多但工作尚未完成,请告知用户并建议开启新会话;锁定的文案计划和 versions/ 快照可以低成本恢复工作

设计原则

  1. 每张幻灯片都可直接导出:箭头和进度条属于幻灯片图像,而非叠加的 UI
  2. 每张幻灯片只表达一个观点
  3. 明暗交替营造节奏感,并在滑动浏览时持续吸引注意力
  4. 标题与正文的字体搭配:标题字体突出醒目,正文字体清晰易读
  5. 从品牌衍生的配色方案:所有颜色都源自一种主色
  6. 渐进式呈现:进度条逐渐填满,箭头指引前进
  7. 最后一张幻灯片与众不同:不显示箭头,进度条填满,居中显示关键词 CTA
  8. 组件风格一致:每张幻灯片都使用相同的标签样式、列表样式和间距
  9. 内容留白避开 UI:正文不会与进度条或箭头重叠
  10. 快速迭代:展示预览,针对具体幻灯片获取反馈并进行修改;除非方向发生根本性变化,否则不要从头重做

评论

支持 Markdown