初始化项目版本

This commit is contained in:
Axhub Make
2026-07-29 16:04:39 +08:00
commit 4305a1082b
2629 changed files with 760590 additions and 0 deletions

View File

@@ -0,0 +1,124 @@
# Remotion Composition Checklist
Use this checklist to ensure your Remotion walkthrough video composition is complete and follows best practices.
## ✅ Project Setup
- [ ] Remotion project initialized (or existing project verified)
- [ ] Dependencies installed (`@remotion/transitions`, etc.)
- [ ] Asset directory created (`public/assets/screens/`)
- [ ] Screen manifest created (`screens.json`)
## ✅ Asset Preparation
- [ ] All Stitch screenshots downloaded
- [ ] Images saved with descriptive names
- [ ] Image dimensions recorded in manifest
- [ ] Images optimized for size (if needed)
- [ ] Asset paths are correct and relative to `public/`
## ✅ Component Structure
- [ ] `ScreenSlide.tsx` component created
- [ ] Props interface defined
- [ ] Zoom animation implemented
- [ ] Fade animation implemented
- [ ] Text overlay included
- [ ] `WalkthroughComposition.tsx` created
- [ ] Screen manifest imported
- [ ] `<Sequence>` components for each screen
- [ ] Transitions between screens configured
- [ ] Proper timing offsets calculated
## ✅ Configuration
- [ ] `remotion.config.ts` updated
- [ ] Composition ID set
- [ ] Video dimensions configured
- [ ] Frame rate set (30 or 60 fps)
- [ ] Duration calculated correctly
- [ ] Video metadata set (if applicable)
- [ ] Title
- [ ] Description
## ✅ Animations & Transitions
- [ ] Spring animations use appropriate configs
- [ ] Damping values (8-15 typical)
- [ ] Stiffness values (60-100 typical)
- [ ] Transitions feel smooth
- [ ] Text overlays timed correctly
- [ ] No jarring or abrupt changes
## ✅ Visual Quality
- [ ] Text is readable at all times
- [ ] Sufficient contrast between text and background
- [ ] Font sizes appropriate for video resolution
- [ ] Images display without distortion
- [ ] Aspect ratios maintained
## ✅ Timing
- [ ] Each screen displays for appropriate duration
- [ ] Total video length is reasonable (not too long/short)
- [ ] Transitions don't feel rushed
- [ ] Text has time to be read
## ✅ Preview & Testing
- [ ] Preview in Remotion Studio (`npm run dev`)
- [ ] Scrub through timeline to check all frames
- [ ] Verify smooth playback
- [ ] Check for any rendering errors
- [ ] Test on different screen sizes (if responsive)
## ✅ Rendering
- [ ] Render command tested and works
- [ ] Output format chosen (MP4, WebM, etc.)
- [ ] Quality settings configured
- [ ] Codec specified (h264 recommended)
- [ ] Final video renders without errors
## ✅ Final Output
- [ ] Video file generated successfully
- [ ] File size is reasonable
- [ ] Video plays correctly in media players
- [ ] Audio included (if applicable)
- [ ] Metadata embedded (if needed)
## 🎨 Optional Enhancements
- [ ] Progress indicator showing current screen
- [ ] Custom logo or branding
- [ ] Background music or sound effects
- [ ] Voiceover narration
- [ ] Interactive hotspots highlighting features
- [ ] Call-to-action at end
## 📋 Best Practices Verified
- [ ] Component code is modular and reusable
- [ ] TypeScript interfaces used for props
- [ ] No hardcoded values (use manifest/config)
- [ ] Code follows Remotion conventions
- [ ] Comments added for complex logic
- [ ] Assets organized in clear folder structure
## 🐛 Common Issues Checked
- [ ] No blurry images (check source resolution)
- [ ] No misaligned text (verify positioning)
- [ ] No choppy animations (check spring configs)
- [ ] No missing assets (verify all paths)
- [ ] No build errors (run `npm run build` test)
---
**Notes:**
- Mark items with `[x]` as you complete them
- Add custom checklist items specific to your project
- Review Remotion documentation for updates
- Test final video on target platform (YouTube, social, etc.)

View File

@@ -0,0 +1,123 @@
import {AbsoluteFill, spring, useCurrentFrame, useVideoConfig} from 'remotion';
import {Img} from 'remotion';
interface ScreenSlideProps {
imageSrc: string;
title: string;
description?: string;
width: number;
height: number;
}
export const ScreenSlide: React.FC<ScreenSlideProps> = ({
imageSrc,
title,
description,
width,
height,
}) => {
const frame = useCurrentFrame();
const {fps} = useVideoConfig();
// Zoom in animation
const zoom = spring({
frame,
fps,
from: 0.95,
to: 1,
config: {
damping: 12,
stiffness: 80,
},
});
// Fade in animation
const opacity = spring({
frame,
fps,
from: 0,
to: 1,
config: {
damping: 10,
},
});
// Text overlay fade in (delayed)
const textOpacity = spring({
frame: frame - 15, // Delay by 15 frames
fps,
from: 0,
to: 1,
config: {
damping: 10,
},
});
return (
<AbsoluteFill
style={{
backgroundColor: '#000',
justifyContent: 'center',
alignItems: 'center',
}}
>
{/* Screen Image */}
<div
style={{
transform: `scale(${zoom})`,
opacity,
maxWidth: '90%',
maxHeight: '80%',
position: 'relative',
}}
>
<Img
src={imageSrc}
style={{
width: '100%',
height: 'auto',
borderRadius: '8px',
boxShadow: '0 20px 60px rgba(0, 0, 0, 0.3)',
}}
/>
</div>
{/* Text Overlay */}
<div
style={{
position: 'absolute',
bottom: '10%',
left: '50%',
transform: 'translateX(-50%)',
textAlign: 'center',
opacity: textOpacity,
width: '80%',
}}
>
<h1
style={{
fontSize: '48px',
fontWeight: 'bold',
color: '#fff',
margin: '0 0 12px 0',
textShadow: '0 2px 10px rgba(0, 0, 0, 0.5)',
}}
>
{title}
</h1>
{description && (
<p
style={{
fontSize: '24px',
color: '#ddd',
margin: 0,
textShadow: '0 1px 5px rgba(0, 0, 0, 0.5)',
}}
>
{description}
</p>
)}
</div>
</AbsoluteFill>
);
};