import { AbsoluteFill, useCurrentFrame, useVideoConfig, interpolate, spring, Img, staticFile, Sequence, } from "remotion"; import { Audio } from "@remotion/media"; import { StatsCounter } from "../../../components/StatsCounter"; import { SparklineChart } from "../../../components/SparklineChart"; // Spring configurations const SNAPPY = { damping: 15, stiffness: 80 }; // Stagger delay between content cards const CARD_STAGGER_DELAY = 8; // Sample sparkline data const MEETUP_TREND_DATA = [12, 15, 18, 14, 22, 25, 28, 32, 35, 42, 48, 55]; const USER_TREND_DATA = [100, 145, 180, 220, 280, 350, 420, 510, 620, 780, 950, 1100]; const EVENT_TREND_DATA = [5, 8, 12, 15, 18, 22, 28, 35, 42, 55, 68, 89]; /** * DashboardOverviewSceneMobile - Scene 3: Dashboard Overview for Mobile (12 seconds / 360 frames @ 30fps) * * Mobile layout adaptations: * - No sidebar (removed for portrait orientation) * - Vertical card stacking instead of horizontal row * - Smaller card widths optimized for 1080px width * - Reduced padding and spacing */ export const DashboardOverviewSceneMobile: React.FC = () => { const frame = useCurrentFrame(); const { fps } = useVideoConfig(); // 3D Perspective entrance animation (0-60 frames) const perspectiveSpring = spring({ frame, fps, config: { damping: 20, stiffness: 60 }, }); const perspectiveX = interpolate(perspectiveSpring, [0, 1], [25, 0]); const perspectiveScale = interpolate(perspectiveSpring, [0, 1], [0.88, 1]); const perspectiveOpacity = interpolate(perspectiveSpring, [0, 1], [0, 1]); // Header entrance animation (delayed) const headerDelay = Math.floor(0.5 * fps); const headerSpring = spring({ frame: frame - headerDelay, fps, config: SNAPPY, }); const headerOpacity = interpolate(headerSpring, [0, 1], [0, 1]); const headerY = interpolate(headerSpring, [0, 1], [-30, 0]); // Subtle background glow pulse const glowIntensity = interpolate( Math.sin(frame * 0.04), [-1, 1], [0.3, 0.5] ); // Mobile card width const cardWidth = 420; // Card entrance delays (staggered) const cardBaseDelay = Math.floor(1 * fps); return ( {/* Audio: card-slide for initial entrance */} {/* Audio: ui-appear for stats */} {/* Wallpaper Background */}
{/* Dark gradient overlay */}
{/* 3D Perspective Container */}
{/* Main Content - Centered for mobile */}
{/* Header */}

Dashboard

Willkommen im Einundzwanzig Portal

{/* Stats Cards - Vertical stack for mobile */}
{/* Meetups Card */}
{/* Users Card */}
{/* Events Card */}
{/* Vignette overlay */}
); }; /** * Stats Card container with animated entrance for mobile */ type StatsCardMobileProps = { title: string; delay: number; width: number; glowIntensity: number; children: React.ReactNode; }; const StatsCardMobile: React.FC = ({ title, delay, width, glowIntensity, children, }) => { const frame = useCurrentFrame(); const { fps } = useVideoConfig(); const adjustedFrame = Math.max(0, frame - delay); const cardSpring = spring({ frame: adjustedFrame, fps, config: SNAPPY, }); const cardScale = interpolate(cardSpring, [0, 1], [0.85, 1]); const cardOpacity = interpolate(cardSpring, [0, 1], [0, 1]); const cardY = interpolate(cardSpring, [0, 1], [30, 0]); return (

{title}

{children}
); };