o2o-infinith-demo/src/types/studio.ts

127 lines
4.0 KiB
TypeScript

// ─── Content Creation Studio Types ───
export type StudioChannel = 'youtube' | 'instagram' | 'naver_blog' | 'tiktok' | 'facebook';
export type ContentFormat =
| 'shorts' | 'long_form' // YouTube
| 'reels' | 'carousel' | 'feed_image' | 'stories' // Instagram
| 'seo_post' | 'faq_post' // Naver Blog
| 'short_video' // TikTok
| 'ad_creative' | 'retarget_content'; // Facebook
export interface ChannelFormatOption {
channel: StudioChannel;
label: string;
icon: string;
formats: { key: ContentFormat; label: string; aspectRatio: '16:9' | '9:16' | '1:1' | '4:5' }[];
}
export type ContentPillarId = string;
export type AssetSourceType = 'collected' | 'my_assets' | 'ai_generated';
export type MusicGenre = 'calm' | 'upbeat' | 'cinematic' | 'corporate' | 'none';
export interface MusicTrack {
id: string;
name: string;
genre: MusicGenre;
duration: string;
}
export type NarrationLanguage = 'ko' | 'en' | 'ja' | 'zh';
export type NarrationVoice = 'male' | 'female';
export interface SoundSettings {
genre: MusicGenre;
trackId: string | null;
narrationEnabled: boolean;
narrationLanguage: NarrationLanguage;
narrationVoice: NarrationVoice;
subtitleEnabled: boolean;
}
export type GenerateOutputType = 'image' | 'video';
export interface StudioState {
channel: StudioChannel | null;
format: ContentFormat | null;
pillarId: ContentPillarId | null;
assetSources: AssetSourceType[];
sound: SoundSettings;
outputType: GenerateOutputType;
}
export const DEFAULT_SOUND: SoundSettings = {
genre: 'calm',
trackId: null,
narrationEnabled: false,
narrationLanguage: 'ko',
narrationVoice: 'female',
subtitleEnabled: true,
};
export const CHANNEL_OPTIONS: ChannelFormatOption[] = [
{
channel: 'youtube',
label: 'YouTube',
icon: 'youtube',
formats: [
{ key: 'shorts', label: 'Shorts', aspectRatio: '9:16' },
{ key: 'long_form', label: 'Long-form', aspectRatio: '16:9' },
],
},
{
channel: 'instagram',
label: 'Instagram',
icon: 'instagram',
formats: [
{ key: 'reels', label: 'Reels', aspectRatio: '9:16' },
{ key: 'carousel', label: 'Carousel', aspectRatio: '1:1' },
{ key: 'feed_image', label: 'Feed Image', aspectRatio: '1:1' },
{ key: 'stories', label: 'Stories', aspectRatio: '9:16' },
],
},
{
channel: 'naver_blog',
label: 'Naver Blog',
icon: 'globe',
formats: [
{ key: 'seo_post', label: 'SEO Post', aspectRatio: '16:9' },
{ key: 'faq_post', label: 'FAQ Post', aspectRatio: '16:9' },
],
},
{
channel: 'tiktok',
label: 'TikTok',
icon: 'tiktok',
formats: [
{ key: 'short_video', label: 'Short Video', aspectRatio: '9:16' },
],
},
{
channel: 'facebook',
label: 'Facebook',
icon: 'facebook',
formats: [
{ key: 'ad_creative', label: 'Ad Creative', aspectRatio: '1:1' },
{ key: 'retarget_content', label: 'Retarget Content', aspectRatio: '16:9' },
],
},
];
export const MUSIC_TRACKS: MusicTrack[] = [
{ id: 'calm-1', name: 'Gentle Morning', genre: 'calm', duration: '2:30' },
{ id: 'calm-2', name: 'Soft Healing', genre: 'calm', duration: '3:15' },
{ id: 'calm-3', name: 'Peaceful Flow', genre: 'calm', duration: '2:45' },
{ id: 'upbeat-1', name: 'Fresh Start', genre: 'upbeat', duration: '2:20' },
{ id: 'upbeat-2', name: 'Bright Day', genre: 'upbeat', duration: '2:50' },
{ id: 'upbeat-3', name: 'Energy Boost', genre: 'upbeat', duration: '3:00' },
{ id: 'cinematic-1', name: 'Grand Reveal', genre: 'cinematic', duration: '3:30' },
{ id: 'cinematic-2', name: 'Transformation', genre: 'cinematic', duration: '4:00' },
{ id: 'cinematic-3', name: 'Before & After', genre: 'cinematic', duration: '2:55' },
{ id: 'corp-1', name: 'Professional Trust', genre: 'corporate', duration: '2:40' },
{ id: 'corp-2', name: 'Clean & Modern', genre: 'corporate', duration: '3:10' },
{ id: 'corp-3', name: 'Confidence', genre: 'corporate', duration: '2:35' },
];