// 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 = () => (
Inbox
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 ( {/* 聚光自身的白热光晕(叠在界面上方,光心最亮) */}
); };