Motion · Encerramento
Logo shrink to wordmark lockup
A large neon-cutout ring collapses fast into a small solid white "O" with a settling overshoot, the icon shifts left to make room, letters slide in to complete the lockup, and a tagline closes it out.
Fonte: video-shotcraft (Vincent Wei) ↗ · Apache-2.0 · Composição Remotion (React/TSX) — vídeo de prévia, sem player no navegador
When to use
The film's closing brand seal: collapsing from full-screen graphic energy down to the standard "icon + wordmark + tagline" lockup.
Intention
The closing "stamp of approval": a full-screen neon ring collapses with all its energy into a single small icon, healing its gap and turning pure white (from performance state to standard state), then settles step by step into the brand lockup spec — the icon makes room, the wordmark enters, the tagline closes it out. What the audience sees is the brand "standing still" out of the motion.
Duration & energy
- Duration: About 4.4s (132f@30fps; collapse 0.1–1.2s · making room 1.5–2.1s · letters 2–2.7s · tagline 3.2–3.7s)
- Energy: Medium (the collapse has impact, the overall feel is a settled, steady landing)
Shot recipe (original Chinese — timing, easing, parameter table, known pitfalls)
意图
片尾的"盖章"动作:满屏的霓虹大环携能量坍缩成一枚小图标,愈合缺口、转为纯白(从演出态到标准态),然后按品牌 lockup 的规范一步步落位——图标让位、字标进场、标语押尾。观众看到的是品牌从动态里"站定"。
动效核心
- 收束主曲线:scale 5.4→1(t=0.02–0.28,inOutCubic),t=0.26–0.37 叠
sin(π)*0.06的过冲刹车——到位瞬间胀 6% 再回落,"急停带惯性" - 缺口愈合与变色和收束同轨(t=0.10–0.28):霓虹辉光层淡出、描边从 #dfe9ff 过半切 #fff、实心白 O 淡入——三层交叉在缩小过程中完成,落位时已是干净白标
- t=0.34–0.47 图标整体 translateX(−68px) 左移让位(inOutCubic),为字标腾出中轴右侧
- 五字母按
0.46 + i*0.035stagger 滑入:opacity 0→1 + translateX 8px→0,各 0.10 时长 outCubic - 标语(强调色
ACCENT,13px 宽字距)t=0.72–0.84 整行淡入,不逐字——层级低于字标一档
参数表
| 参数 | 典型值 | 调节手感 | |------|--------|----------| | 收束幅度 | scale 5.4→1 | 起始倍率决定"从多满收到多小";<3 冲击力不足,>7 初始态糊出画 | | 刹车过冲 | +6%,sin 包络 0.26–0.37 | 砍掉读作硬冻结;>10% 变果冻 | | 愈合窗口 | 0.10–0.28(与收束同步) | 愈合必须在落位前完成——落位后还在变色读作"没准备好" | | 左移让位 | −68px,0.34–0.47 | 与字母首入(0.46)几乎无缝衔接,拉开间隔会有"空等"感 | | 字母 stagger | 0.035/字,各 0.10 时长 | 5 字母合计约 0.28;字更多时按 (0.7-0.46)/n 反算间隔保证 0.7 前进完 | | 标语入场 | 0.72–0.84 整行淡入 | 有意不逐字:标语是注脚不是主角;ACCENT 常量换项目色 |
已知坑
WORDMARK(5 字母)与标语BUILD. SHIP. REPEAT.(20 字符)都是占位;换品牌词时字母 stagger 节奏依赖字数,标语保持近似字符数否则宽字距排版会溢出或过疏- 图标是 SVG 双弧切口环(抽象几何 mark),替换为真实品牌 logo 时保留"演出态→标准态"两层结构:一层带效果(辉光/彩色),一层纯净态,用同一条 heal 曲线交叉
- 左移量 −68px 与字标宽度耦合(row 定位在
50%-40px)——字数变化时两处一起调,让 lockup 整体在画面居中 - 收尾后无循环回位设计,作 outro 最后一镜使用;需要循环时在 t=1 后接 1s 静帧
参考实现
demos/outro/logo-shrink-wordmark-lockup/ (LogoShrinkWordmarkLockup.tsx)
Reference implementation (Remotion)
- demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx — https://raw.githubusercontent.com/Vincentwei1021/video-shotcraft/main/demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx
The component imports shared fixtures from demos/_fixtures and helpers from assets/lib in the repo; SKILL.md there documents the render workflow.
Tudo nesta página também é legível por máquina. Aponte seu agente para o JSON ou adicione o servidor MCP do gimgs e peça para buscar templates de motion.
- Baixe o JSON — contém a receita do plano (timing, easing, tabela de parâmetros, armadilhas) e o código TSX completo.
- Clone o repositório video-shotcraft; o componente importa fixtures de demos/_fixtures e helpers de assets/lib.
- Registre o componente como <Composition> em um projeto Remotion e renderize com `npx remotion render`, ou reimplemente a receita no seu próprio engine.
curl -s https://gimgs.net/motion/logo-shrink-wordmark-lockup.jsongit clone https://github.com/Vincentwei1021/video-shotcraft
# component: demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx
npx remotion render <CompositionId> out.mp4claude mcp add --transport http gimgs https://gimgs.net/mcp
# then: search_motion_templates / get_motion_template("logo-shrink-wordmark-lockup")Prompt
Use the video-shotcraft shot recipe "Logo shrink to wordmark lockup" (Remotion composition, Apache-2.0) published on gimgs.net. Recipe JSON (prompt = timing/easing/parameter table/pitfalls, files = TSX source): https://gimgs.net/motion/logo-shrink-wordmark-lockup.json Raw TSX: https://gimgs.net/motion/logo-shrink-wordmark-lockup/template.html Repository: https://github.com/Vincentwei1021/video-shotcraft (component: demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx; imports demos/_fixtures and assets/lib) Spec: 1920x1080, 30 fps, 4.9s 1. Read the JSON and follow its "prompt" section (when to use, intention, parameter table, known pitfalls). 2. Adapt it for: <describe what you want>. 3. Either clone the repo, register the component as a <Composition> in a Remotion project and run npx remotion render <CompositionId> out.mp4 — or re-implement the recipe in your own engine (HTML/WAAPI works: keep the same timing and easing).
// ===== demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx =====
// logo-shrink-wordmark-lockup — Shrink & Lockup 图标收束落位(motion-lab 定稿转原生 Remotion)
// 霓虹切口大环 easeInOut 快速缩成中央实心小白 O(抽象几何 mark,末尾轻微过冲刹车),
// 随后图标左移让位,五个字母从左到右逐个 opacity+8px 滑入完成 lockup,
// 强调色标语延迟整行淡入收尾。设计坐标 480×270(DesignStage 等比放大)。
import React from 'react';
import { DesignStage, E, lerp, seg, useT } from '../../_fixtures/Motion';
export const LOGO_SHRINK_WORDMARK_LOCKUP_DURATION = 132; // 4400ms @30fps
const ACCENT = '#e0342c';
const WORDMARK = 'BRAND';
const ICON = 30; // 图标基准尺寸(px)
const SHIFT = -68; // 图标 lockup 左位偏移
// 圆弧 path(角度制,顺时针 sweep)
const arcPath = (cx: number, cy: number, r: number, a0: number, a1: number) => {
const p = (a: number) => [cx + r * Math.cos((a * Math.PI) / 180), cy + r * Math.sin((a * Math.PI) / 180)];
const [x0, y0] = p(a0);
const [x1, y1] = p(a1);
const large = Math.abs(a1 - a0) > 180 ? 1 : 0;
return `M${x0.toFixed(2)},${y0.toFixed(2)} A${r},${r} 0 ${large} 1 ${x1.toFixed(2)},${y1.toFixed(2)}`;
};
// 双弧组:a0-a1 与其对角(+180°)两段圆弧 —— 带缺口的切口环
const Arcs: React.FC<{ a0: number; a1: number; col: string; w: number; blur: number; opacity: number; stroke?: string }> = ({
a0,
a1,
col,
w,
blur,
opacity,
stroke,
}) => (
<g opacity={opacity}>
{[
[a0, a1],
[a0 + 180, a1 + 180],
].map(([b0, b1], i) => (
<path
key={i}
d={arcPath(15, 15, 10.5, b0, b1)}
fill="none"
stroke={stroke ?? col}
strokeWidth={w}
strokeLinecap="round"
style={blur ? { filter: `blur(${blur}px)` } : undefined}
/>
))}
</g>
);
export const LogoShrinkWordmarkLockup: React.FC = () => {
const t = useT();
// 收束:scale 5.4→1(easeInOut),末尾轻微 1.05 过冲刹车
const k = seg(t, 0.02, 0.28, E.inOutCubic);
const brake = Math.sin(seg(t, 0.26, 0.37) * Math.PI) * 0.06;
const s = lerp(k, 5.4, 1) * (1 + brake);
// 左移让位:落位后 t 0.34-0.47
const shift = seg(t, 0.34, 0.47, E.inOutCubic) * SHIFT;
// 霓虹缺口态 → 实心白 O 交叉淡化(随收束进行)
const heal = seg(t, 0.10, 0.28, E.inOutQuad);
// 底色标定:原样片 mp4(yuv420p,无色彩元数据)把 #05060a 解码回 rgb(3,5,9),
// 深底上 2/255 的恒差会拖垮平坦区 SSIM,这里钉到解码值;其余数值与 effect.js 一致
return (
<DesignStage bg="#030509">
<div style={{ position: 'absolute', inset: 0, overflow: 'hidden' }}>
{/* 图标:SVG 双弧切口环 —— 抽象几何 mark,非任何具体品牌 logo(收束时缺口愈合、霓虹转纯白) */}
<div
style={{
position: 'absolute',
left: '50%',
top: '50%',
width: ICON,
height: ICON,
margin: `${-ICON / 2}px 0 0 ${-ICON / 2}px`,
transform: `translateX(${shift}px) scale(${s})`,
}}
>
<svg
viewBox="0 0 30 30"
style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', overflow: 'visible' }}
>
{/* 霓虹晕(带缺口) */}
<Arcs a0={-32} a1={122} col="rgba(110,90,255,.6)" w={6.5} blur={2.5} opacity={1 - heal} />
{/* 霓虹芯:heal 过半后转纯白 */}
<Arcs
a0={-32}
a1={122}
col="#dfe9ff"
w={3.4}
blur={0}
opacity={1 - heal * 0.75}
stroke={heal > 0.5 ? '#fff' : '#dfe9ff'}
/>
{/* 愈合后的实心白 O */}
<circle cx={15} cy={15} r={10.5} fill="none" stroke="#fff" strokeWidth={5.5} opacity={heal} />
</svg>
</div>
{/* 字母行(图标右侧):从左到右 stagger,opacity 0→1 + translateX 8px→0 */}
<div
style={{
position: 'absolute',
left: 'calc(50% - 40px)',
top: '50%',
height: ICON,
marginTop: -ICON / 2,
display: 'flex',
alignItems: 'center',
gap: 2,
}}
>
{[...WORDMARK].map((ch, i) => {
const lk = seg(t, 0.46 + i * 0.035, 0.46 + i * 0.035 + 0.10, E.outCubic);
return (
<span
key={i}
style={{
color: '#f2f5fa',
font: "800 27px/1 -apple-system,'Helvetica Neue',sans-serif",
letterSpacing: 2,
opacity: lk,
transform: `translateX(${lerp(lk, 8, 0)}px)`,
}}
>
{ch}
</span>
);
})}
</div>
{/* 强调色标语(占位文案):延迟整行淡入 */}
<div
style={{
position: 'absolute',
left: 0,
right: 0,
top: 'calc(50% + 34px)',
textAlign: 'center',
color: ACCENT,
font: '600 13px/1 -apple-system,sans-serif',
letterSpacing: 5,
opacity: seg(t, 0.72, 0.84, E.outQuad),
}}
>
BUILD. SHIP. REPEAT.
</div>
</div>
</DesignStage>
);
};
- Read the recipePrompt = when to use, intention, parameter table with typical values and how each one feels, known pitfalls. Treat values as calibrated starting points.
- Get the codetool: git
git clone https://github.com/Vincentwei1021/video-shotcraft && cd video-shotcraft && npm install - Register + rendertool: remotion
npx remotion render <CompositionId> out.mp4 # component: demos/outro/logo-shrink-wordmark-lockup/LogoShrinkWordmarkLockup.tsx - Or re-implementPort the timing/easing from the recipe to HTML + WAAPI (gimgs motion contract) or any engine; keep the same segment windows and easing.
| param | type | default | description |
|---|---|---|---|
| — | |||
Mais nesta categoria

UI morphs into brand mark
Two UI-to-brand morphs — icon-flip-bloom, an icon flips flat on Y and blooms into a flower mark with the wordmark settling letter by letter, and input-morph-assemble, an input field shrinking into a pill as three primitives assemble into a logo petal.

Strip-away outro
A subtraction outro — after clicking Publish, the editor UI evaporates in staggered layers from the outside in, leaving only the clicked button, which slides to center screen and enlarges before fading to the closing wordmark.

Outro group photo launch
Elements from across the whole film fly in from every direction to pose around the wordmark, staged like a launch-event finale.

Triple neon marquee recap
Three rows of opposing neon marquee text (BETTER/FASTER/STRONGER) scroll endlessly, taking turns lighting up, then fade out.