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;