import React, { useState } from 'react';
import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { Button } from '@/components/ui/button';
import { Textarea } from '@/components/ui/textarea';
import { Camera, Video, Image, Copy, Eye } from 'lucide-react';
const FilmContentCreator = () => {
const [contentTitle, setContentTitle] = useState("The Power of the Insert Shot: Creating Emotional Impact");
const [visualContent] = useState({
type: "video",
placeholder: "/api/placeholder/640/360",
description: "A side-by-side comparison showing two versions of the same scene: one with and one without insert shots"
});
const [unifiedContent, setUnifiedContent] = useState({
hook: "Ever notice how small details can hit harder than big moments? Let's break down the art of the insert shot - your secret weapon for emotional storytelling.",
mainContent: `In my latest short film, I faced a challenge: how to show a character's grief without dialogue or exposition. The solution came through a simple insert shot of worn piano keys.
KEY TECHNIQUES DEMONSTRATED:
1. Motivated Camera Movement
2. Lighting for Texture
3. Timing & Pacing
4. Sound Design Integration
TECHNICAL BREAKDOWN:
• Camera: 85mm lens at f/2.8
• Movement: Slow dolly push
• Lighting: Single source, 45° angle
• Duration: 2.5 seconds
STORYTELLING IMPACT:
This technique transforms ordinary objects into emotional anchors. The worn keys tell a story of repetition, dedication, and loss - all without a word spoken.
PRO TIP: When planning insert shots, ask yourself:
- What's the emotional subtext?
- How does this detail relate to character?
- What's the perfect moment for revelation?`,
callToAction: "🎬 YOUR TURN: Share a meaningful object from your current project. How might you film it to maximize emotional impact?",
hashtags: "#FilmmakingTips #VisualStorytelling #DirectorMasterclass #FilmEducation",
references: "Films Referenced:\n- Whiplash (Chazelle, 2014)\n- Phantom Thread (Anderson, 2017)\n- Vertigo (Hitchcock, 1958)"
});
const platformSpecificFormatting = {
twitter: {
format: (content) => {
// Break into thread-sized chunks
const chunks = content.mainContent.split('\n\n');
return chunks.map((chunk, i) => `${chunk}\n${i === chunks.length-1 ? content.callToAction : ''}\n[${i+1}/${chunks.length}]`);
}
},
instagram: {
format: (content) => {
return `${content.hook}\n\n${content.mainContent}\n\n${content.callToAction}\n\n.\n.\n.\n${content.hashtags}`;
}
},
linkedin: {
format: (content) => {
return `${content.hook}\n\n${content.mainContent}\n\n${content.references}\n\n${content.callToAction}`;
}
}
};
const PreviewPanel = ({ platform, content }) => (
);
return (
Film Education Content Creator
Preview All
Twitter
Instagram
LinkedIn
);
};
export default FilmContentCreator;
{visualContent.description}
{platformSpecificFormatting[platform].format(content)}
import React, { useState } from 'react'; import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Button } from '@/components/ui/button'; import { Textarea } from '@/components/ui/textarea'; import { Camera, Video, Image, Copy, Eye } from 'lucide-react'; const FilmContentCreator = () => { const [contentTitle, setContentTitle] = useState("The Power of the Insert Shot: Creating Emotional Impact"); const [visualContent] = useState({ type: "video", placeholder: "/api/placeholder/640/360", description: "A side-by-side comparison showing two versions of the same scene: one with and one without insert shots" }); const [unifiedContent, setUnifiedContent] = useState({ hook: "Ever notice how small details can hit harder than big moments? Let's break down the art of the insert shot - your secret weapon for emotional storytelling.", mainContent: `In my latest short film, I faced a challenge: how to show a character's grief without dialogue or exposition. The solution came through a simple insert shot of worn piano keys. KEY TECHNIQUES DEMONSTRATED: 1. Motivated Camera Movement 2. Lighting for Texture 3. Timing & Pacing 4. Sound Design Integration TECHNICAL BREAKDOWN: • Camera: 85mm lens at f/2.8 • Movement: Slow dolly push • Lighting: Single source, 45° angle • Duration: 2.5 seconds STORYTELLING IMPACT: This technique transforms ordinary objects into emotional anchors. The worn keys tell a story of repetition, dedication, and loss - all without a word spoken. PRO TIP: When planning insert shots, ask yourself: - What's the emotional subtext? - How does this detail relate to character? - What's the perfect moment for revelation?`, callToAction: "🎬 YOUR TURN: Share a meaningful object from your current project. How might you film it to maximize emotional impact?", hashtags: "#FilmmakingTips #VisualStorytelling #DirectorMasterclass #FilmEducation", references: "Films Referenced:\n- Whiplash (Chazelle, 2014)\n- Phantom Thread (Anderson, 2017)\n- Vertigo (Hitchcock, 1958)" }); const platformSpecificFormatting = { twitter: { format: (content) => { // Break into thread-sized chunks const chunks = content.mainContent.split('\n\n'); return chunks.map((chunk, i) => `${chunk}\n${i === chunks.length-1 ? content.callToAction : ''}\n[${i+1}/${chunks.length}]`); } }, instagram: { format: (content) => { return `${content.hook}\n\n${content.mainContent}\n\n${content.callToAction}\n\n.\n.\n.\n${content.hashtags}`; } }, linkedin: { format: (content) => { return `${content.hook}\n\n${content.mainContent}\n\n${content.references}\n\n${content.callToAction}`; } } }; const PreviewPanel = ({ platform, content }) => ( <div className="relative bg-white rounded-lg p-4 shadow-sm"> <div className="mb-4"> <img src={visualContent.placeholder} alt="Content preview" className="w-full rounded-lg mb-4" /> <div className="text-sm text-gray-500 mb-4"> {visualContent.description} </div> <div className="whitespace-pre-wrap"> {platformSpecificFormatting[platform].format(content)} </div> </div> <Button variant="outline" size="icon" className="absolute top-2 right-2" onClick={() => navigator.clipboard.writeText(platformSpecificFormatting[platform].format(content))} > <Copy className="h-4 w-4" /> </Button> </div> ); return ( <Card className="w-full max-w-4xl"> <CardHeader> <CardTitle className="flex items-center gap-2"> <Camera className="h-6 w-6" /> Film Education Content Creator </CardTitle> </CardHeader> <CardContent> <div className="space-y-6"> <div> <label className="block text-sm font-medium mb-2">Title</label> <Textarea value={contentTitle} onChange={(e) => setContentTitle(e.target.value)} className="h-12" /> </div> <div className="flex gap-4 items-center"> <Button className="flex items-center gap-2"> <Video className="h-4 w-4" /> Add Video </Button> <Button className="flex items-center gap-2"> <Image className="h-4 w-4" /> Add Images </Button> </div> <div> <label className="block text-sm font-medium mb-2">Content</label> <Textarea value={unifiedContent.mainContent} onChange={(e) => setUnifiedContent({...unifiedContent, mainContent: e.target.value})} className="h-64" /> </div> <div> <label className="block text-sm font-medium mb-2">Call to Action</label> <Textarea value={unifiedContent.callToAction} onChange={(e) => setUnifiedContent({...unifiedContent, callToAction: e.target.value})} className="h-24" /> </div> <Tabs defaultValue="preview" className="w-full"> <TabsList className="grid w-full grid-cols-4"> <TabsTrigger value="preview"> <Eye className="h-4 w-4 mr-2" /> Preview All </TabsTrigger> <TabsTrigger value="twitter">Twitter</TabsTrigger> <TabsTrigger value="instagram">Instagram</TabsTrigger> <TabsTrigger value="linkedin">LinkedIn</TabsTrigger> </TabsList> <TabsContent value="preview" className="space-y-4"> <PreviewPanel platform="twitter" content={unifiedContent} /> <PreviewPanel platform="instagram" content={unifiedContent} /> <PreviewPanel platform="linkedin" content={unifiedContent} /> </TabsContent> <TabsContent value="twitter"> <PreviewPanel platform="twitter" content={unifiedContent} /> </TabsContent> <TabsContent value="instagram"> <PreviewPanel platform="instagram" content={unifiedContent} /> </TabsContent> <TabsContent value="linkedin"> <PreviewPanel platform="linkedin" content={unifiedContent} /> </TabsContent> </Tabs> </div> </CardContent> </Card> ); }; export default FilmContentCreator;