// corner-spotlight-reveal —— 对标 clickup-30.mp4 41.5–44.6s:
// 黑场上,左上角径向聚光从小到大扩张,把白色 Inbox 界面逐步"点亮",
// 照到的区域显影、照不到的沉黑,最终全屏亮起。光即转场。
import React from 'react';
import { AbsoluteFill, useCurrentFrame, interpolate, Easing } from 'remotion';
const FONT = '"Avenir Next", "Helvetica Neue", Helvetica, sans-serif';
// 灰阶 Inbox 界面(自绘,替代真 UI)
const InboxPanel: React.FC = () => (
All
Tasks
Docs
People
Chat
{[0, 1, 2].map((row) => (
))}
);
export const CornerSpotlightReveal: React.FC = () => {
const frame = useCurrentFrame();
// 聚光半径扩张:全程匀速(用户裁决"整个过程要匀速"——严格 linear,无缓动)
// r+feather=1.85r 是光前沿;1.85*1300≈2400 恰在片尾盖满全屏对角,
// 保证扩张动作占满全片时长而不是前 1/3 就饱和
const r = interpolate(frame, [0, 100], [160, 1300], {
extrapolateLeft: 'clamp',
extrapolateRight: 'clamp',
});
// 光心沿左上角匀速游移(linear)
const cx = interpolate(frame, [0, 96], [140, 420], { extrapolateRight: 'clamp' });
const cy = interpolate(frame, [0, 96], [90, 260], { extrapolateRight: 'clamp' });
// 软边宽度:扩张时边缘更羽化
const feather = r * 0.85;
// UI 轻微透视漂移(原片相机贴着界面缓推)
const drift = interpolate(frame, [0, 100], [0, 1]);
const scale = 1.75 - 0.28 * drift;
const tx = -40 + 70 * drift;
const ty = -30 + 50 * drift;
const mask = `radial-gradient(circle ${r + feather}px at ${cx}px ${cy}px, rgba(255,255,255,1) ${Math.max(
0,
((r - feather * 0.25) / (r + feather)) * 100,
)}%, rgba(255,255,255,0) 100%)`;
return (
{/* 聚光自身的白热光晕(叠在界面上方,光心最亮) */}
);
};