一键导入
remotion-card-video
用 Remotion + React 生成「极简知识卡片流」风格的视频。当用户说「帮我做成视频」「生成 Remotion 脚本」「把这篇文章做成卡片视频」「出 TSX 代码」时触发。内置设计系统、动效规则和场景模板,适配「克制而不僵硬,活泼而不轻浮」的视觉风格。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
用 Remotion + React 生成「极简知识卡片流」风格的视频。当用户说「帮我做成视频」「生成 Remotion 脚本」「把这篇文章做成卡片视频」「出 TSX 代码」时触发。内置设计系统、动效规则和场景模板,适配「克制而不僵硬,活泼而不轻浮」的视觉风格。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
钉钉知识库文档交付工作流。把仓库里的 Markdown 教程/文档按钉钉格式白名单(修饰只用加粗+代码块,禁引用块和表格)与四段式教程体例(成品展示→所用工具→操作方法→总结与小技巧)收敛成交付母版,走手动导入或 API 推送进钉钉,上级审核过审后下载终版 verbatim 回填 git 仓库并 diff 沉淀规则。当用户说"并入钉钉母文档"、"做钉钉附件版"、"按钉钉规范排版"、"按教程格式重排"、"钉钉审核完了回填"、"下载了钉钉终版"时触发。
《目标是成为 Prompt 大师》系列内容生产工作流。把一个 prompt battle 主题作品,做成面向 AIGC 小白的一期系列内容:抽象主题破题拆解 + 小红书双卡(封面卡 + prompt 四层拆解卡)+ 内敛克制的小红书正文 + 零前置可独立阅读的小白笔记 + 系列归档封版。当用户说「做成一期 Prompt 大师」「把这个 prompt 拆解成小红书卡片」「写小红书正文 / 发小红书」「写一份小白能看懂的 prompt 笔记」「出 prompt 四层拆解卡」时触发。
把本地 Markdown 一键发布为飞书云文档并拿回可分享链接(复用 pb-arena 仓库随附的 feishu-doc-sync CLI,即自建应用"飞书助理小桁")。当用户说「发布到飞书」「导出一份飞书文档」「让小桁发布」「同步到飞书」「给团队发个文档链接」「跟之前一样发飞书」,或任何「本地 md → 飞书云文档」的诉求时使用本 skill,即使没提到小桁、CLI 或 pb-arena。
把知识库(D:\AIGC工作站\知识库)新沉淀的内核档改写成面向所有用户的「公开版」对外帖,B 站 AI 开发者小站首发:按 08_对外分发体例写成独立成篇的白话稿,归档、登记索引、提交推送,并交付可直接粘贴发帖的成稿;发布后回收作者终稿微调,保持库内版与线上版一致。当用户说「发小站 / 写公开版 / 同步对外帖 / 把这篇沉淀分发出去 / 写成帖子」,或一篇知识库复盘/insight 刚沉淀完成需要对外分发时触发——只要涉及「知识库内容 → 对外公开发布」就用本 skill,即使用户没提「小站」二字。
AIGC 作品宣传海报排版工作流。用于把已定稿的核心图、角色锚点图、封面图做成适合 B站、小红书、快手、朋友圈等平台传播的宣传海报;尤其适用于“不能改人脸、不能丢气质、AI 重绘会漂移”的角色/IP 作品。封面精修首选「选帧 + GPT Image 2 图生图叠排(不重绘主体)」,质感优于代码贴字;代码排版退为批量/多比例兜底。
AIGC 内容发布决策工作流。在内容发布前做入场票审计,并给出平台适配建议(快手 / 网易云 / B站等)。当用户说"这个作品要发哪里"、"帮我写发布文案"、"快手标题怎么写"、"网易云怎么填标签"、"要不要投流"时触发。
| name | remotion-card-video |
| description | 用 Remotion + React 生成「极简知识卡片流」风格的视频。当用户说「帮我做成视频」「生成 Remotion 脚本」「把这篇文章做成卡片视频」「出 TSX 代码」时触发。内置设计系统、动效规则和场景模板,适配「克制而不僵硬,活泼而不轻浮」的视觉风格。 |
你是一位熟悉 Remotion 框架的视频工程师,专门把知识类内容翻译成「极简知识卡片流」风格的可渲染视频。你输出的是可以直接跑起来的 TSX 代码,不是伪代码或示意图。
核心美学原则:克制而不僵硬,活泼而不轻浮。
每次生成视频时,在文件顶部定义这些变量,所有组件必须引用这里,不允许硬编码颜色或字号。
// design-tokens.ts(或直接内联在 Root.tsx 顶部)
export const COLORS = {
bg: '#0A0A0F', // 深宇宙黑,主背景
surface: '#13131F', // 卡片背景,比 bg 略亮
surfaceHover: '#1A1A2E', // 强调卡片背景
primary: '#EAEAF0', // 主文字,近白偏蓝灰
secondary: '#6B6B8A', // 次要文字,灰紫
accent: '#5B8CFF', // 冷青蓝,研究员侧,关键词高亮
warm: '#F5A94A', // 暖金橙,创意侧,重点强调
border: '#1E1E30', // 卡片边框,极细
dim: '#2A2A40', // 分隔线、辅助元素
};
export const TYPE = {
hero: 88, // 封面大字
h1: 60, // 章节标题
h2: 44, // 卡片主标题
h3: 32, // 卡片副标题
body: 26, // 正文
caption: 20, // 说明文字、角注
label: 16, // 标签、时间码
};
export const FONT = {
sans: '"PingFang SC", "Noto Sans SC", "Microsoft YaHei", sans-serif',
mono: '"JetBrains Mono", "Fira Code", monospace',
};
export const SPACING = {
cardPadding: 80, // 卡片内边距
sectionGap: 48, // 内容块间距
lineHeight: 1.55, // 行高
};
「克制活泼」的 spring 参数:damping 高(不弹跳),stiffness 中(有响应感)。
import { spring, useVideoConfig } from 'remotion';
// 标准入场 spring(大多数元素用这个)
const SPRING_ENTER = { damping: 22, stiffness: 90, mass: 1 };
// 慢入场 spring(标题、重要内容)
const SPRING_SLOW = { damping: 28, stiffness: 60, mass: 1.2 };
// 弹性强调 spring(偶尔用于关键词,不超过 1 次/视频)
const SPRING_POP = { damping: 14, stiffness: 120, mass: 0.8 };
// 标准用法
const { fps } = useVideoConfig();
const progress = spring({ fps, frame, config: SPRING_ENTER, durationInFrames: 20 });
// 从下淡入(最常用)
const fadeUpStyle = (frame: number, fps: number, delay = 0) => {
const f = Math.max(0, frame - delay);
const progress = spring({ fps, frame: f, config: SPRING_ENTER, durationInFrames: 20 });
return {
opacity: interpolate(progress, [0, 1], [0, 1]),
transform: `translateY(${interpolate(progress, [0, 1], [24, 0])}px)`,
};
};
// 从左淡入(代码块、列表项)
const fadeLeftStyle = (frame: number, fps: number, delay = 0) => {
const f = Math.max(0, frame - delay);
const progress = spring({ fps, frame: f, config: SPRING_ENTER, durationInFrames: 18 });
return {
opacity: interpolate(progress, [0, 1], [0, 1]),
transform: `translateX(${interpolate(progress, [0, 1], [-20, 0])}px)`,
};
};
// 纯淡入(背景、底层元素)
const fadeStyle = (frame: number, fps: number, delay = 0) => {
const f = Math.max(0, frame - delay);
const opacity = interpolate(f, [0, 18], [0, 1], { extrapolateRight: 'clamp' });
return { opacity };
};
// remotion.config.ts
export default {
fps: 30,
width: 1920,
height: 1080, // 横版 B站
// 竖版抖音版:width: 1080, height: 1920
};
import { Composition } from 'remotion';
import { MyVideo } from './MyVideo';
export const RemotionRoot = () => (
<>
<Composition
id="SkillIsAllYouNeed"
component={MyVideo}
durationInFrames={/* 计算所有场景帧数之和 */}
fps={30}
width={1920}
height={1080}
/>
</>
);
export const CoverScene: React.FC<{ frame: number; fps: number }> = ({ frame, fps }) => {
const titleStyle = fadeUpStyle(frame, fps, 0);
const subtitleStyle = fadeUpStyle(frame, fps, 12);
const tagStyle = fadeStyle(frame, fps, 24);
return (
<AbsoluteFill style={{ background: COLORS.bg, justifyContent: 'center', alignItems: 'center' }}>
{/* 顶部极细装饰线 */}
<div style={{
position: 'absolute', top: 80, left: 80, right: 80,
height: 1, background: COLORS.dim, ...fadeStyle(frame, fps, 0)
}} />
<div style={{ textAlign: 'center', maxWidth: 1200 }}>
{/* 主标题 */}
<div style={{ ...titleStyle, fontSize: TYPE.hero, fontFamily: FONT.sans,
color: COLORS.primary, fontWeight: 700, letterSpacing: '-2px', lineHeight: 1.1 }}>
Skill Is All You Need
</div>
{/* 副标题 */}
<div style={{ ...subtitleStyle, fontSize: TYPE.h3, color: COLORS.secondary,
fontFamily: FONT.sans, marginTop: 32, fontWeight: 400 }}>
让 AI 记住你的规则,而不是每次重新教
</div>
{/* 标签 */}
<div style={{ ...tagStyle, display: 'flex', gap: 16, justifyContent: 'center', marginTop: 48 }}>
{['AI工具', 'Cowork', 'SKILL_INDEX'].map(tag => (
<span key={tag} style={{
fontSize: TYPE.label, color: COLORS.accent, fontFamily: FONT.mono,
border: `1px solid ${COLORS.accent}`, borderRadius: 4,
padding: '6px 14px', opacity: 0.8,
}}>{tag}</span>
))}
</div>
</div>
{/* 底部极细装饰线 */}
<div style={{
position: 'absolute', bottom: 80, left: 80, right: 80,
height: 1, background: COLORS.dim, ...fadeStyle(frame, fps, 0)
}} />
</AbsoluteFill>
);
};
interface KnowledgeCardProps {
frame: number;
fps: number;
label?: string; // 左上角标签,如 "问题" / "概念" / "方法"
title: string; // 卡片主标题
body: string; // 正文
highlight?: string; // 高亮词(用 accent 色标记)
accentColor?: string; // 'cold'(默认青蓝)或 'warm'(金橙)
}
export const KnowledgeCard: React.FC<KnowledgeCardProps> = ({
frame, fps, label, title, body, highlight, accentColor = 'cold'
}) => {
const color = accentColor === 'warm' ? COLORS.warm : COLORS.accent;
const labelStyle = fadeStyle(frame, fps, 0);
const titleStyle = fadeUpStyle(frame, fps, 6);
const bodyStyle = fadeUpStyle(frame, fps, 16);
return (
<AbsoluteFill style={{ background: COLORS.bg, justifyContent: 'center', alignItems: 'center' }}>
<div style={{
background: COLORS.surface,
border: `1px solid ${COLORS.border}`,
borderRadius: 16,
padding: SPACING.cardPadding,
maxWidth: 1280, width: '80%',
borderLeft: `3px solid ${color}`,
}}>
{label && (
<div style={{ ...labelStyle, fontSize: TYPE.label, color, fontFamily: FONT.mono,
marginBottom: 24, letterSpacing: '2px', textTransform: 'uppercase' }}>
{label}
</div>
)}
<div style={{ ...titleStyle, fontSize: TYPE.h2, color: COLORS.primary,
fontFamily: FONT.sans, fontWeight: 600, lineHeight: 1.3, marginBottom: 32 }}>
{title}
</div>
<div style={{ ...bodyStyle, fontSize: TYPE.body, color: COLORS.secondary,
fontFamily: FONT.sans, lineHeight: SPACING.lineHeight }}>
{body}
</div>
</div>
</AbsoluteFill>
);
};
export const CodeCard: React.FC<{ frame: number; fps: number; code: string; caption?: string }> = ({
frame, fps, code, caption
}) => {
return (
<AbsoluteFill style={{ background: COLORS.bg, justifyContent: 'center', alignItems: 'center' }}>
<div style={{ width: '80%', maxWidth: 1280 }}>
<div style={{
...fadeUpStyle(frame, fps, 0),
background: COLORS.surfaceHover,
border: `1px solid ${COLORS.border}`,
borderRadius: 12,
padding: '48px 56px',
fontFamily: FONT.mono,
fontSize: TYPE.caption,
color: COLORS.primary,
lineHeight: 1.8,
whiteSpace: 'pre',
}}>
{code}
</div>
{caption && (
<div style={{
...fadeStyle(frame, fps, 20),
fontSize: TYPE.label, color: COLORS.secondary,
fontFamily: FONT.sans, marginTop: 24, textAlign: 'center',
}}>
{caption}
</div>
)}
</div>
</AbsoluteFill>
);
};
export const OutroScene: React.FC<{ frame: number; fps: number }> = ({ frame, fps }) => (
<AbsoluteFill style={{ background: COLORS.bg, justifyContent: 'center', alignItems: 'center' }}>
<div style={{ textAlign: 'center' }}>
<div style={{ ...fadeUpStyle(frame, fps, 0), fontSize: TYPE.h1,
color: COLORS.primary, fontFamily: FONT.sans, fontWeight: 700 }}>
Skill Is All You Need
</div>
<div style={{ ...fadeUpStyle(frame, fps, 16), fontSize: TYPE.body,
color: COLORS.secondary, fontFamily: FONT.sans, marginTop: 24 }}>
把你的流程固化成手册,让 AI 每次都能立刻上手
</div>
<div style={{ ...fadeStyle(frame, fps, 30), display: 'flex',
gap: 40, justifyContent: 'center', marginTop: 56 }}>
<span style={{ fontSize: TYPE.caption, color: COLORS.accent, fontFamily: FONT.mono }}>
@跳蛛先生
</span>
<span style={{ fontSize: TYPE.caption, color: COLORS.dim, fontFamily: FONT.mono }}>·</span>
<span style={{ fontSize: TYPE.caption, color: COLORS.secondary, fontFamily: FONT.mono }}>
D:\AIGC工作站\知识库
</span>
</div>
</div>
</AbsoluteFill>
);
# 预览
npx remotion studio
# 渲染横版 1080p
npx remotion render src/index.ts SkillIsAllYouNeed out/skill-is-all-you-need.mp4
# 渲染竖版(抖音)
npx remotion render src/index.ts SkillIsAllYouNeedVertical out/skill-vertical.mp4 --width=1080 --height=1920
# 多核加速渲染
npx remotion render src/index.ts SkillIsAllYouNeed out/final.mp4 --concurrency=4
# 1. 创建 Remotion 项目
npx create-video@latest
# 选择 Blank 模板
# 2. 安装依赖
cd my-video && npm install
# 3. 预览
npm run dev
# 或
npx remotion studio
# 4. 把 SKILL.md 里的组件代码放到 src/scenes/ 目录下
# 5. 在 src/Root.tsx 注册 Composition
# 6. 渲染
npx remotion render src/index.ts YourCompositionId out/video.mp4