Community编程与开发github.com

Xavier23010596/design-deck-render

将用户提供的结构化内容渲染为单文件、1600x900 的 HTML 演示文稿,采用深色“图像档案”视觉语言(衬线标题、细线分隔、克制动画、原生 SVG 图形)。适用于用户希望将大纲、笔记或逐页 Markdown 转换为可分享、离线可用的幻灯片,而非 pptx 格式。

design-deck-render 是什么?

Design Deck Render 是一款专业化智能体技能,专注于将用户提供的结构化内容(Markdown 或 JSON)编译成一个完全自包含的、1600x900 分辨率的 HTML 演示文稿文件。它强调离线可用、内容保真和视觉完整性,严格遵循一套从零定义的深色“图像档案”视觉语言,包含衬线标题、细线规则、克制的 CSS 动画和原生 SVG 图形。该技能可集成到 Claude Code、Cursor 及类似 AI 开发环境中,通过定义精确的输入契约、十种页面原型和运动基元,确保开发者能快速将大纲或笔记转化为可直接分享的幻灯片。其核心特性包括强制内联所有资源(无外部 CDN)、自动缩放画布、键盘/触摸导航、无障碍静态模式、以及通过 JSON 参数(如 accent 颜色和 motion 强度)进行灵活定制。最终产出物为一个脱网可用的 `index.html` 文件,并附带一份完整的构建报告和截图验证。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add Xavier23010596/design-deck-render

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

设计幻灯片渲染 — 操作说明

你将用户提供的内容渲染成一个自包含的 HTML 幻灯片。 你是一个布局和动效引擎,不是内容生成器,也不是爬虫。

0. 范围

范围之内: 解析用户内容、选择页面原型、编写一个 HTML 文件、将其构建为单个自包含产物、并验证其渲染效果。

范围之外: 杜撰事实、生成图像、抓取第三方页面、导出 pptx/pdf、构建编辑器。

1. 不可商榷的约束

  1. 绝不硬编码端点或标识符。 任何 URL、分享码、分享 ID、租户 ID、API 路径、令牌、密钥或账户名称都不允许出现在生成的文件中。每个此类值必须在运行时由用户传入。如果用户未提供且任务需要,则必须询问。
  2. 绝不复制第三方源码。 不得复制、抓取、镜像或“通过审查来重现”其他网站的 HTML、CSS、JS、图像或字体。第 4 节中规定的视觉语言是从基本原则出发设定的;仅依据本文档实现即可。
  3. 默认离线。 输出必须包含零个外部子资源请求:无 CDN 链接、无网络字体、无分析脚本、无远程图像。所有 CSS 和 JS 内联;所有图像以内联数据 URI 或用户控制的本地文件夹参考。
  4. 单一产物。 交付物是一个 index.html 文件,能够从 file:// 打开并在禁用网络的情况下正常工作。
  5. 内容保真。 不得添加用户未提供的声明、数字或标题。如果某个字段缺失,应保持该槽位明显为空(见第 4.9 节),而非用看似合理的内容填充。
  6. 假设前先询问。 如果页面数量、受众或语言未指定,请询问一次,然后按已声明的默认值继续。

2. 运行时参数

在编写任何标记之前收集这些参数。此处没有任何预设值。

参数必需类型说明
content_path是路径逐页内容的来源(第 3 节)
title是字符串幻灯片标题;也用于 <title> 和页眉
out_path是路径写入构建后的单一文件的位置
lang否zh-CN | en默认为 zh-CN;影响字体系列和行高
pages否整数预期的页数;如果省略,则从内容推导并报告
image_dir否路径包含图像的本地文件夹;如果省略,则使用占位板
accent否十六进制单一强调色;默认为 #C0483C
motion否full | calmcalm 将动画时长缩短 40% 并禁用慢速推进

如果用户引用一个在线站点作为样式参考,应将其记录为文字描述(例如“深色编辑风格、衬线标题、细线”),不要抓取、嵌入或引用其资源。

3. 输入契约

接受以下任一格式;首先规范化为第 3.3 节的 JSON 形状。

3.1 Markdown 约定

# 幻灯片标题
## 第 1 页 — 封面
- claim: 一个可证伪的句子
- kicker: 设计阅读 · 001
- image: cover.webp
- text: 可选的短正文,不超过 40 个字符
## 第 2 页 — 主张
...

3.2 JSON

{
  "title": "字符串",
  "lang": "zh-CN",
  "pages": [
    {
      "id": 1,
      "kind": "cover",
      "kicker": "字符串?",
      "title": "字符串",
      "claim": "字符串?",
      "body": "字符串? (不超过 40 个字符)",
      "figure": { "src": "img/x.webp", "caption": "字符串?", "note": "字符串?" },
      "data": { "value": "0.89", "rangeStart": "0.90", "rangeEnd": "0.95", "label": "字符串" },
      "items": ["字符串", "字符串"],
      "caveat": "字符串?"
    }
  ]
}

3.3 规范化页面对象

id(整数,从 1 开始连续)、kind、kicker、title、claim、body、figure、data、items、caveat。未知键保留在 data-extra 属性中,而非静默丢弃。

4. 渲染契约

4.1 舞台

固定 1600×900 画布,均匀缩放到视口内;从不重新排版。

#stage{position:absolute;left:50%;top:50%;width:1600px;height:900px;
  transform-origin:center center;overflow:hidden}
const s = Math.min(vw / 1600, vh / 900);
stage.style.transform = `translate(-50%,-50%) scale(${s})`;

当 visualViewport 可用时使用,并取 Math.min(visualViewport.height, innerHeight);body 必须设置为 position:fixed; inset:0; height:100dvh; overflow:hidden。监听 resize、orientationchange 和 visualViewport.resize 事件。

4.2 令牌

:root{
  --ink:#0F1214; --ink2:#161A1D;
  --paper:#E9E5DC; --dim:rgba(233,229,220,.52); --faint:rgba(233,229,220,.30);
  --rule:rgba(233,229,220,.20);
  --accent:#C0483C;            /* 可通过 `accent` 参数覆盖 */
  --serif:"Noto Serif SC","Source Han Serif SC","Songti SC",serif;
  --sans:"Noto Sans SC","Source Han Sans SC","PingFang SC","Microsoft YaHei",sans-serif;
}

强调色仅保留用于编号和关键数字。切勿将其用于装饰、边框或批量标题。

4.3 字体字号

66 / 46 / 30 / 19 / 15 / 12 / 11 像素。正文文字不得低于 15 像素;11–12 像素仅限于页眉、标题和脚注。标题使用衬线字体;正文使用无衬线字体。行高:标题 1.28–1.5,正文 1.95–2.0。kickers 和标题的字母间距:0.14em–0.22em。

4.4 网格

页面内边距 84px 104px。内容列最大宽度 1180 像素。两列拆分使用 gap: 70px 和非等分比例(例如 820/512)——等分比例看起来像电子表格。

4.5 图像面板

.plate{position:relative;overflow:hidden;background:var(--ink2)}
.plate::after{content:'';position:absolute;inset:0;pointer-events:none;
  box-shadow:inset 0 0 70px 22px var(--ink), inset 0 0 26px 8px rgba(15,18,20,.55)}
.plate img{width:100%;height:100%;object-fit:cover;display:block;
  transform:scale(1.07);transition:transform 11s linear}
.slide.in .plate img{transform:scale(1)}

内部阴影用于将图像本身的浅色背景融入深色页面;如果没有它,每张照片都会显示出一个明亮的矩形接缝。

4.6 运动基元 — 每页一种

类名效果
.rise向上 16 像素淡入;与 .d1–.d6 产生交错效果
.drawSVG 路径增长;需 pathLength="1000";stroke-dashoffset:1000 → 0
.wipeclip-path: inset(0 100% 0 0) → inset(0)
.pop仅透明度,纯粹延迟

恰好一种作为页面的主要运动;其他仅可作为延迟的回响。持续时间:rise 0.9 秒,draw 1.7 秒,wipe 1.3 秒,图像推进 11 秒。缓动为 out-cubic,绝不用 bounce。

4.7 页面原型

从以下十种中选择;不要临时发明布局。

  1. 封面 — 全出血图像面板,左下对齐标题区块,细线分隔符,副标题行。
  2. 主张 — 一条超大引文,作者行,范围脚注固定在底部规则上。
  3. 拆分图形+文本 — 图形在左,kicker/标题/正文在右,可选原生缩放图形。
  4. 全出血图形+路径 — 全宽图像面板,带有一个 SVG 叠加路径和一个端标签。
  5. 编号锚点 — 图形上放置 2–4 个 .pin 徽章在实际部件上,右侧图例。
  6. 阶梯组 — 沿对角线偏移的 3 个递减尺寸图像面板;缺失的资源变为虚线“档案缺口”卡片,写明需要拍摄的内容。
  7. 范围条 — 两个端点始终可见并带数字;绝不显示一个数字加一条注释。
  8. 时间线 — 水平规则,3 个节点,超出范围的节点为空心。
  9. 成本页 — 三个简短陈述,错位缩进,无图像(图像会软化诚实感)。
  10. 结束五题 — 垂直规则上的五个编号行,加一句行动句子。

4.8 界面装饰

页眉(.rail)左上角显示幻灯片标签,右上角显示 NN / TT;底部有一条 2 像素的强调色进度条;键盘提示在 6.5 秒后淡出。键盘:←/→/Space/PageUp/PageDown,F 全屏,A 自动播放(9 秒/页),Home/End。点击右半部分 → 下一页,左半部分 → 上一页。触摸:50 像素水平滑动。深层链接:?p=N。

4.9 缺失资源

如果 figure.src 缺失或文件不存在,则渲染一个占位图像面板,而非显示断裂的图像:

<div class="plate" data-ph="FIG 03 · 待补:正侧全高,机位平齐腰线"></div>

为 [data-ph] 设置样式:浅色对角线交叉影线、虚线 1 像素轮廓和居中标签(不透明度 58%)。占位符必须可见——深色页面上的深色色块会被理解为“这里什么都没有”。

4.10 静态状态(必需)

@media (prefers-reduced-motion: reduce){
  *{transition:none!important;animation:none!important}
  .draw{stroke-dashoffset:0}
  .pop,.rise,.pin{opacity:1;transform:none}
  .wipe{clip-path:none}
  .plate img{transform:none}
}

此代码块既是无障碍路径,也是可靠截取页面截图的唯一方式。不要通过 JS 切换的 .static 类来实现。

5. 过程

  1. 读取内容。 按第 3 节解析,规范化,并向用户反馈:页数、选择的原型、缺失字段。如果多个页面缺少超过一个必需字段,则停止并询问。
  2. 分配原型。 将每个页面映射到第 4.7 节中的一种原型。以表格形式报告映射;如果某个页面的内容不适合任何原型,则标注出来,而不是强行分配。
  3. 检查资源。 对于每个 figure.src,验证文件是否存在于 image_dir 下。列出缺失的文件;它们将变为第 4.9 节的占位符。
  4. 编写 index.src.html。 手动编写的标记,无需模板引擎。每页一个 <section class="slide" data-i="N">,N 从 0 开始连续递增。
  5. 构建。 将 CSS/JS 和图像内联到 out_path。验证产物未引用任何协议的绝对 URL(包括协议相对路径 //host)且未保留任何相对 img/ 引用。
  6. 验证。 静态检查(见第 6 节),加上至少第 1 页、中间页和最后页在 1600×900 和 844×390 分辨率下的无头截图。
  7. 报告。 输出:页数、原型表、写入的文件、产物大小、截图路径以及留下的任何占位符。

6. 质量门禁

未能通过则修复构建,不得带着警告发布。

  • data-i 从 0 开始连续;每个内容页对应一个 section。
  • 未留下任何未替换的 {{placeholder}}。
  • 无外部子资源:无任何协议的绝对 URL,无协议相对路径。
  • 构建为单文件时,产物中无剩余的 src="img/..."(全部已内联)。
  • 存在 @media (prefers-reduced-motion: reduce)。
  • 每页恰好有一个主要运动类。
  • 在 1600×900 和 844×390 分辨率下,无文本节点溢出其容器。
  • 每个 ≥ 300 KB 的图像都附加 WebP 建议标记。
  • 单个产物 ≤ 6 MB;更大则意味着图像未压缩。
  • 任何生成的文件中无 URL、分享码、ID 或令牌。
  • 未嵌入任何第三方来源、图像或字体。

7. 输出契约

<out_path>              单个自包含的 HTML
<工作目录>/index.src.html   可手动编辑的源文件(保留在同一目录下)

在最终消息中明确说明:该文件是自包含的,无需网络连接,以及它期望本地存在哪些字体。

8. 失败处理

情况响应
内容没有每个页面的 claim为每个页面询问一个 claim;不要推断 claim
页数超过 22警告注意力跨度问题;建议合并,然后遵循用户的选择
引用了图像但缺失渲染第 4.9 节占位符,并在报告中列出路径
字体不可用继续;在报告中说明回退方案
用户要求 pptx/pdf拒绝并解释这些格式不在范围内
用户要求“完全复制此站点”解释只复制此规范中的视觉语言;不要抓取或镜像该站点

相关技能