1实现原理 · 为什么它能做到
这个 skill 不是可执行程序,而是注入给本机 coding-agent CLI 的一段提示词:宿主取 SKILL.md 正文,前面压一段全站共享设计指令、后面接用户内容,拼成一条 prompt 交给已登录的 agent,再把 agent 的 stdout 当 HTML 取回。
【输入格式】: ${opts.format} 【用户内容】: ${opts.content}
共享指令层(不属于任何单个 skill,但每个模板都被它压着)把输出钉成『自包含单文件 HTML』,并明令禁止 agent 使用 Write/Edit/Bash 等文件系统工具,HTML 直接以对话正文流式输出。
- **禁止使用 Write / Edit / MultiEdit / Bash / Create / 任何文件系统工具**。不要把 HTML 写到任何 \`.html\` 文件里。前端直接捕获你的 stdout 文本, 文件落盘由前端负责。
SKILL.md 之外还有一条『内容驱动数量』覆盖规则:模板里写的任何页数/帧数/卡片数一律视为参考下限,实际数量由用户内容决定——防止 agent 用模板数字压缩用户内容。
- 模板只定义"可用版面 / 风格 / 配色 / 字体 / 组件库", **不定义** slide / 帧 / 卡片 / section 的数量。
加载约定是『一个 skill = 一个文件夹』:SKILL.md(YAML frontmatter 供选择器 + 正文即模板 prompt),可选 example.md(样本输入)与 example.html(可直接打开的预览样张);新增模板只需加目录,不改 TS 代码。
* SKILL.md — frontmatter (id, scenario, tags, …) + prompt body * example.md — (optional) sample input content * example.html — (optional) pre-rendered preview, shown inline in the picker
选择链路(CLI 侧)是三级漏斗:关键词强信号(每命中 1 词 2 分,阈值 3)→ 退化为 tags/scenario 打分 → 仍无把握就把用户内容前 800 字交给本地 agent 做一句话分类。
const CONFIDENCE_THRESHOLD = 3;
预览链路独立于生成:/api/templates/<id>/preview 把 example.html 原样以 text/html 返回给 iframe;前端 iframe 用 sandbox="allow-scripts allow-same-origin"。
sandbox="allow-scripts allow-same-origin"
流体背景给三级实现路径并默认最稳的一级:CSS 多层 radial-gradient 错位呼吸(3-5 个大椭圆、@keyframes 平移+scale+hue-rotate、8-14s 周期错峰、mix-blend-mode screen/overlay、顶层 backdrop-filter blur(80px))。
1. **CSS 多层 radial-gradient 错位呼吸** (最稳, 默认推荐):
二三级为渐进增强:Canvas + 手写 perlin noise/metaballs(约 80 行 inline JS,requestAnimationFrame,prefers-reduced-motion 时降回静态截图);WebGL fragment shader(jsdelivr 引 regl 或 inline plain WebGL,单 quad + u_time)。
3. **WebGL fragment shader** (高阶, 慎用):
文字层用 mix-blend-mode: difference 解决『在任何流体颜色上都可读』——这是流体背景配文字最实用的技巧,而不是给文字加描边或色板。
- 文字色用 paper white `#fafaf8` 或 ink, 取决于背景明暗; 加 `mix-blend-mode: difference` 让它在任何流体颜色上都可读。
调色被固定为四套命名色板(Solar Peach / Ocean Aqua / Aurora Violet / Forest Mint),明确四选一、不要彩虹。
example_tagline: "Aurora Violet 流体"
画布支持 1920×1080 横版与 1080×1920 竖版二选一,同时明令严禁外链图片——全部 CSS + SVG(+ 可选 canvas)。
- 严禁外链图片; 全部 CSS + SVG + 可选 canvas。
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| network | Tailwind Play CDN(共享指令强制;示例页亦引用) |
| network | Google Fonts(Inter Tight / Source Serif Pro / Noto Sans SC,示例页实际引用) |
| network | jsdelivr CDN(仅第 3 级 WebGL 方案引入 regl,可选、非默认路径) |
| network | hyperframes 目录页(frontmatter 出处标注,非运行时请求) |
4风险提醒 风险提醒:绿色 · 放心使用
- 性能风险:3-5 个大椭圆 + hue-rotate 动画 + backdrop-filter blur(80px) 叠加,低端设备或长时录制可能掉帧;第 3 级 WebGL 更重。 — SKILL.md【流体背景】1 与 3
- 视觉风险:流体背景天然抢眼,文字层若不用 difference 或字号不足,可读性会崩——模板给了方法但没给下限校验。 — SKILL.md【顶层文字层】
- 宿主侧:预览 iframe sandbox="allow-scripts allow-same-origin";若生成物启用 canvas/WebGL 方案,脚本在预览环境权限宽松。 — sandbox="allow-scripts allow-same-origin"(next/src/components/preview-pane.tsx)
- 注入面:用户金句/标题逐字进 prompt;数据输入时模型被要求自行提炼金句,存在语义偏移风险。 — assemblePrompt 末尾直接拼接【用户内容】
5第二遍独立确认
- [ok] 三级实现与文字层规格 — 重读 SKILL.md【流体背景】【顶层文字层】【调色】三段,引用逐字一致(含 blur(80px)、difference、四色板十六进制)。
- [ok] jsdelivr 条目定性 — source 中该词仅出现在 `用 jsdelivr CDN 引 regl 或 inline plain WebGL。`(SKILL.md:35,第 3 级且标注『高阶, 慎用』);按批4 口径未升档,已在 deps/reason 标注。
- [ok] 『单文件可双击打开』宣称 — SKILL.md 写明『WebGL 流体感, 但用 CSS / canvas 退化绘制, 确保单文件可双击打开』——与默认 CSS 方案一致,无夸大。
- [ok] 外部端点存在性 — example.html 实测命中 cdn.tailwindcss.com 与 fonts.googleapis.com;jsdelivr 未出现在示例页(仅 SKILL.md 可选路径)。
- [ok] 安全面 — 目录内 3 个文件无自写脚本(示例页仅 Tailwind CDN 标签)、无凭证、无写盘、无表单外发。
- [ok] meta 元数据 — GitHub API 实查 stars=8827、pushed_at=2026-09-15T03:36:24Z、license Apache-2.0。
- [unlocatable] 安装量 — 无公开安装量数据源,installs=null。
6结论
7995bcbdcff12379…553ed98c28