import React from 'react'; import { AbsoluteFill, Easing, interpolate, useCurrentFrame } from 'remotion'; import { FakeDashboard, G } from '../../_fixtures/Fixtures'; // wireframe-draw-on〔入场退场〕:界面先以蓝图细线描画成形(stroke-dashoffset // 分组错峰),随后一条发光竖线从左向右扫过,扫过之处线框实体化为真实灰阶界面。 // 节拍:0–20 hold 空底 → 20–82 分组描线 → 88–118 光线扫描实体化 → 118–150 hold。 // FakeDashboard variant A 的几何(1920×1080): // 侧栏 220 宽;顶栏 x220–1920 h72;内容区 padding36 gap28,3×2 卡片 // 卡 w524 h454,x = 256/808/1360,y = 108/590。 const CARD_W = 524; const CARD_H = 454; const CARD_X = [256, 808, 1360]; const CARD_Y = [108, 590]; const seedFrac = (i: number) => { const v = Math.sin(i * 127.3) * 43758.5453; return v - Math.floor(v); }; export const WireframeDrawOn: React.FC = () => { const frame = useCurrentFrame(); // 描线进度:每组 30f 画完,start 错峰 const draw = (start: number) => interpolate(frame, [start, start + 30], [0, 1], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: Easing.bezier(0.4, 0, 0.3, 1), }); const tSide = draw(20); // 侧栏 const tTop = draw(30); // 顶栏 const tCards = Array.from({ length: 6 }, (_, i) => draw(40 + i * 3)); // 卡片错峰 const tChart = draw(52); // 折线图 // 实体化扫描:88–118 从左向右 const scan = interpolate(frame, [88, 118], [0, 1], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp', easing: Easing.bezier(0.55, 0, 0.25, 1), }); const scanX = scan * 1920; const lineOpacity = interpolate(frame, [86, 92, 112, 120], [0, 1, 1, 0], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp', }); // 描线小工具:pathLength=1 + dashoffset 从 1 → 0 const stroke = (t: number): React.SVGAttributes => ({ fill: 'none', stroke: G.mid, strokeWidth: 2.5, pathLength: 1, strokeDasharray: 1, strokeDashoffset: 1 - t, strokeLinecap: 'round', opacity: t > 0 ? 1 : 0, }); // 折线图数据(seed 正弦哈希,落在卡 (1,1) 内部) const chartCardX = CARD_X[1]; const chartCardY = CARD_Y[1]; const chartPts = Array.from({ length: 8 }, (_, i) => { const px = chartCardX + 50 + (i * (CARD_W - 100)) / 7; const py = chartCardY + 130 + seedFrac(i + 3) * 230; return `${px},${py}`; }).join(' '); return ( {/* —— 线框层(蓝图描线) —— */} {/* 侧栏 */} {Array.from({ length: 7 }).map((_, i) => { const w = (216 - 44) * (0.6 + ((i * 29) % 35) / 100); return ( ); })} {/* 顶栏 */} {/* 3×2 卡片:轮廓 + 内部占位线 */} {tCards.map((t, i) => { const cx = CARD_X[i % 3]; const cy = CARD_Y[Math.floor(i / 3)]; const titleW = (CARD_W - 36) * (0.45 + (((i + 1) * 37) % 40) / 100); return ( ); })} {/* 折线图(画在中列下排卡内) */} {/* —— 实体层:clip-path inset 从左向右展开 —— */}
{/* —— 4px 发光扫描竖线(琥珀微光) —— */}
); };