// steep-tilt-glide v5(批次 14 #2)。用户意见(逐字):
// "角度不对,你看看原片这个镜头的角度;以及镜头是固定的,但是页面本身
// 往其3d空间的横面方向移动的效果"
// ——两点落实:①角度对照原片密帧校准(右缘近、左缘远的陡峭 rotateY,
// 顶缘向右上扬、透视灭点在左中下);②运动模型改"物动镜不动":
// perspective / perspectiveOrigin / rotateY / rotateZ 全程一个常数不动,
// 动的只有页面自身沿其 3D 平面横向(局部 X 轴)的滑移 translateX。
// v4 的悬空贴落(FloatWrap 同形软影)保留。
import React, { useId } from 'react';
import { AbsoluteFill, interpolate, useCurrentFrame, Easing } from 'remotion';
const FONT = 'Helvetica, Arial, sans-serif';
const INK = '#2f2f36';
const easeFall = Easing.bezier(0.5, 0.05, 0.6, 1); // 加速贴落、末端软着陆
/* 悬浮 + 同形软影(GrazeFaceTour FloatWrap 模式) */
const FloatWrap: React.FC<{ h: number; children: React.ReactNode }> = ({ h, children }) => (
{/* 顶部 tab 条(贯穿整页;文字悬空贴落) */}
Product analytics
{/* 顶栏右延的淡 tab(对齐 clickup04 顶栏 Widget brainstorm / Design system) */}
{[['Widget brainstorm', 3050], ['Design system', 3900], ['Design', 4650]].map(([tb, x]) => (
{tb}
))}
{/* ClickUp logo 行 */}
{/* 主区圆角灰砖:Dropbox 图标 + 下拉 chevron(原片 f45–f60) */}
{/* Home 宽药丸(紫边细线横贯面板) */}
{/* Inbox 行 */}
{/* 更多侧栏行 */}
{['Docs', 'Dashboards'].map((tb, i) => (
))}
{/* 主区轮播左箭头(原片 f60 中景的 "<") */}
{/* 大 W 字形(原片中程右上滑入的大字残段) */}
W
{/* 主区白色圆角卡群(右下淡白砖) */}
{[[2620, 620, 640, 380], [2740, 1360, 720, 420], [2620, 1900, 560, 330]].map(([x, y, w, h], i) => (
))}
{/* —— 右段:Product Management 列表(原片尾程满幅白页) —— */}
Product Management
{/* List / Board tabs */}
List
11
{/* IN PROGRESS chip */}
IN PROGRESS
TASK NAME
{/* 任务行 */}
{[['New Feature Launch', '#3a3a42'], ['Roadmap Q3', '#55555e'], ['User Testing', '#83838d'], ['Bug Triage', '#b3b3bc']].map(([name, col], i) => (
))}
{/* 亮度:面板内黑罩(随进度揭亮) */}
{/* 左缘额外阴影(起始更暗,随亮度一同退去) */}
);
/* 固定镜头 + 页面沿自身平面横向滑移。
* 镜头常数(对照原片密帧校准):perspective 1150、origin 24% 62%、
* rotateY(-38°)(右缘近、左缘远,顶缘向右上扬)+ rotateZ(-2°)。
* lx = 页面局部 X 平移(页面自己的横面方向),全程唯一动的量 */
// v7(批次 16):用户意见"改成60度吧"——rotY -53 → -60(精确定值)
const CAM = { persp: 1100, origin: '30% 58%', rotY: -60, rotZ: -2, left: '40%', top: '15%', scale: 0.62 };
const PanelLayer: React.FC<{ lx: number; shade: number; opacity: number; t: number }> = ({ lx, shade, opacity, t }) => (