@umituz/react-native-ai-generation-content 1.37.3 β†’ 1.37.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umituz/react-native-ai-generation-content",
3
- "version": "1.37.3",
3
+ "version": "1.37.5",
4
4
  "description": "Provider-agnostic AI generation orchestration for React Native with result preview components",
5
5
  "main": "src/index.ts",
6
6
  "types": "src/index.ts",
@@ -6,6 +6,7 @@
6
6
  import { executeVideoFeature } from "../../../../../infrastructure/services/video-feature-executor.service";
7
7
  import { createCreationsRepository } from "../../../../creations/infrastructure/adapters";
8
8
  import type { WizardScenarioData } from "../../presentation/hooks/useWizardGeneration";
9
+ import type { ScenarioInputType } from "../../../../scenarios/domain/Scenario";
9
10
  import type { WizardStrategy } from "./wizard-strategy.types";
10
11
  import { VIDEO_PROCESSING_PROMPTS } from "./wizard-strategy.constants";
11
12
  import { extractPrompt, extractDuration, extractAspectRatio, extractResolution } from "../utils";
@@ -15,12 +16,42 @@ import type { WizardVideoInput, CreateVideoStrategyOptions } from "./video-gener
15
16
 
16
17
  declare const __DEV__: boolean;
17
18
 
18
- // Re-export types for external use
19
19
  export type { WizardVideoInput, WizardVideoResult, CreateVideoStrategyOptions } from "./video-generation.types";
20
20
 
21
- // ============================================================================
22
- // Input Builder
23
- // ============================================================================
21
+ interface PhotoValidationResult {
22
+ isValid: boolean;
23
+ errorKey?: string;
24
+ }
25
+
26
+ function validatePhotoCount(
27
+ photoCount: number,
28
+ inputType: ScenarioInputType | undefined,
29
+ ): PhotoValidationResult {
30
+ const effectiveInputType = inputType ?? "single";
31
+
32
+ switch (effectiveInputType) {
33
+ case "dual":
34
+ if (photoCount < 2) {
35
+ return {
36
+ isValid: false,
37
+ errorKey: "error.generation.dualPhotosRequired",
38
+ };
39
+ }
40
+ break;
41
+ case "single":
42
+ if (photoCount < 1) {
43
+ return {
44
+ isValid: false,
45
+ errorKey: "error.generation.photoRequired",
46
+ };
47
+ }
48
+ break;
49
+ case "text":
50
+ break;
51
+ }
52
+
53
+ return { isValid: true };
54
+ }
24
55
 
25
56
  export async function buildVideoInput(
26
57
  wizardData: Record<string, unknown>,
@@ -32,7 +63,19 @@ export async function buildVideoInput(
32
63
 
33
64
  const photos = await extractPhotosAsBase64(wizardData, true);
34
65
 
35
- // Extract prompt with fallback to default
66
+ const validation = validatePhotoCount(photos.length, scenario.inputType);
67
+ if (!validation.isValid) {
68
+ if (typeof __DEV__ !== "undefined" && __DEV__) {
69
+ console.log("[VideoStrategy] Validation failed", {
70
+ scenarioId: scenario.id,
71
+ inputType: scenario.inputType,
72
+ photoCount: photos.length,
73
+ errorKey: validation.errorKey,
74
+ });
75
+ }
76
+ throw new Error(validation.errorKey ?? "error.generation.invalidInput");
77
+ }
78
+
36
79
  let prompt = extractPrompt(wizardData, scenario.aiPrompt);
37
80
 
38
81
  if (!prompt) {
@@ -40,7 +83,7 @@ export async function buildVideoInput(
40
83
  if (defaultPrompt) {
41
84
  prompt = defaultPrompt;
42
85
  } else {
43
- throw new Error("Prompt is required for video generation");
86
+ throw new Error("error.generation.promptRequired");
44
87
  }
45
88
  }
46
89
 
@@ -12,13 +12,16 @@ import { createWizardStrategy, buildWizardInput } from "../../infrastructure/str
12
12
 
13
13
  declare const __DEV__: boolean;
14
14
 
15
+ import type { ScenarioInputType } from "../../../../scenarios/domain/Scenario";
16
+
15
17
  export type WizardOutputType = "image" | "video";
16
18
 
17
19
  export interface WizardScenarioData {
18
20
  readonly id: string;
19
- /** AI prompt - optional if prompt comes from wizard data (text_input step) */
20
21
  readonly aiPrompt?: string;
21
22
  readonly outputType?: WizardOutputType;
23
+ /** Input type - determines required photo count. Default: "single" */
24
+ readonly inputType?: ScenarioInputType;
22
25
  readonly model?: string;
23
26
  readonly title?: string;
24
27
  readonly description?: string;
@@ -5,6 +5,8 @@
5
5
  */
6
6
 
7
7
  import type { WizardFeatureConfig } from "../../generation/wizard/domain/entities/wizard-config.types";
8
+ import type { ScenarioInputType } from "../domain/Scenario";
9
+ import { getConfiguredScenario } from "../infrastructure/scenario-registry";
8
10
 
9
11
  declare const __DEV__: boolean;
10
12
 
@@ -27,6 +29,16 @@ export enum WizardInputType {
27
29
  /** @deprecated Use WizardInputType instead */
28
30
  export const FeatureType = WizardInputType;
29
31
 
32
+ /**
33
+ * Map ScenarioInputType to WizardInputType
34
+ * Enables scenarios to define input requirements via inputType field
35
+ */
36
+ const SCENARIO_INPUT_TO_WIZARD_MAP: Record<ScenarioInputType, WizardInputType> = {
37
+ single: WizardInputType.SINGLE_IMAGE,
38
+ dual: WizardInputType.DUAL_IMAGE,
39
+ text: WizardInputType.TEXT_INPUT,
40
+ };
41
+
30
42
  /**
31
43
  * Generic Input Detection Patterns
32
44
  * Only patterns that describe input/output, NOT app-specific scenarios
@@ -234,7 +246,8 @@ export interface WizardConfigOptions {
234
246
  * Priority:
235
247
  * 1. Explicit inputType in options (highest)
236
248
  * 2. Explicit config in SCENARIO_WIZARD_CONFIGS
237
- * 3. Auto-detect from scenario ID patterns
249
+ * 3. Scenario inputType from registry (if configured)
250
+ * 4. Auto-detect from scenario ID patterns
238
251
  *
239
252
  * @example
240
253
  * // Auto-detect from ID
@@ -279,11 +292,35 @@ export const getScenarioWizardConfig = (
279
292
  return config;
280
293
  }
281
294
 
282
- // 3. Auto-detect from scenario ID
295
+ // 3. Check scenario's inputType from registry
296
+ const scenario = getConfiguredScenario(scenarioId);
297
+ if (scenario?.inputType) {
298
+ const wizardInputType = SCENARIO_INPUT_TO_WIZARD_MAP[scenario.inputType];
299
+
300
+ if (typeof __DEV__ !== "undefined" && __DEV__) {
301
+ console.log("[WizardConfig] Using scenario.inputType from registry", {
302
+ scenarioId,
303
+ scenarioInputType: scenario.inputType,
304
+ wizardInputType,
305
+ });
306
+ }
307
+
308
+ const factory = CONFIG_FACTORIES[wizardInputType];
309
+ let config = factory(scenarioId);
310
+ config = mergeConfigOverrides(config, options?.overrides);
311
+
312
+ if (options?.additionalSteps) {
313
+ config = { ...config, steps: [...config.steps, ...options.additionalSteps] };
314
+ }
315
+
316
+ return config;
317
+ }
318
+
319
+ // 4. Auto-detect from scenario ID patterns
283
320
  const inputType = detectWizardInputType(scenarioId);
284
321
 
285
322
  if (typeof __DEV__ !== "undefined" && __DEV__) {
286
- console.log("[WizardConfig] Auto-detected inputType", {
323
+ console.log("[WizardConfig] Auto-detected inputType from patterns", {
287
324
  scenarioId,
288
325
  inputType,
289
326
  });
@@ -569,6 +569,14 @@ export enum ScenarioId {
569
569
 
570
570
  export type ScenarioOutputType = "image" | "video";
571
571
 
572
+ /**
573
+ * Scenario input type - determines required photo count
574
+ * single: Requires exactly 1 photo (solo transformations)
575
+ * dual: Requires exactly 2 photos (couple interactions)
576
+ * text: No photo required (text-only prompts)
577
+ */
578
+ export type ScenarioInputType = "single" | "dual" | "text";
579
+
572
580
  export interface GeneratingMessages {
573
581
  title?: string;
574
582
  waitMessage?: string;
@@ -589,8 +597,9 @@ export interface Scenario {
589
597
  hidden?: boolean;
590
598
  /** Output type - optional, apps should configure via createScenariosForApp() */
591
599
  outputType?: ScenarioOutputType;
592
- model?: string; // AI model from app config
600
+ /** Input type - determines required photo count. Default: "single" */
601
+ inputType?: ScenarioInputType;
602
+ model?: string;
593
603
  enabled?: boolean;
594
- // Optional custom generating screen messages
595
604
  generatingMessages?: GeneratingMessages;
596
605
  }
@@ -8,6 +8,14 @@
8
8
  */
9
9
  export type ScenarioOutputType = "image" | "video";
10
10
 
11
+ /**
12
+ * Input type for scenarios - determines required photo count
13
+ * single: Requires exactly 1 photo (solo transformations)
14
+ * dual: Requires exactly 2 photos (couple interactions)
15
+ * text: No photo required (text-only prompts)
16
+ */
17
+ export type ScenarioInputType = "single" | "dual" | "text";
18
+
11
19
  /**
12
20
  * Scenario represents a pre-configured AI generation template
13
21
  * Used across all AI generation apps (image or video output)
@@ -26,6 +34,8 @@ export interface Scenario {
26
34
  readonly storyTemplate?: string;
27
35
  readonly requiresPhoto?: boolean;
28
36
  readonly outputType: ScenarioOutputType;
37
+ /** Input type - determines required photo count. Default: "single" */
38
+ readonly inputType?: ScenarioInputType;
29
39
  readonly enabled?: boolean;
30
40
  readonly metadata?: Record<string, unknown>;
31
41
  }
@@ -198,10 +208,11 @@ export interface ScenarioData {
198
208
  readonly icon?: string;
199
209
  readonly imageUrl?: string;
200
210
  readonly previewImageUrl?: string;
201
- /** AI prompt - optional if prompt comes from wizard data */
202
211
  readonly aiPrompt?: string;
203
212
  readonly storyTemplate?: string;
204
213
  readonly requiresPhoto?: boolean;
205
214
  readonly hidden?: boolean;
215
+ /** Input type - determines required photo count. Default: "single" */
216
+ readonly inputType?: ScenarioInputType;
206
217
  readonly [key: string]: unknown;
207
218
  }
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  // Types
7
- export type { ScenarioOutputType, GeneratingMessages } from "./domain/Scenario";
7
+ export type { ScenarioOutputType, ScenarioInputType, GeneratingMessages } from "./domain/Scenario";
8
8
  export { ScenarioCategory, ScenarioId } from "./domain/Scenario";
9
9
  export type { Scenario } from "./domain/Scenario";
10
10
 
@@ -1,17 +1,17 @@
1
1
  import { Scenario, ScenarioId } from "../../domain/Scenario";
2
2
  import { createPhotorealisticPrompt, createStoryTemplate } from "../utils/scenario-utils";
3
3
 
4
- export const MOVIE_LEGENDS_SCENARIOS: Omit<Scenario, 'outputType' | 'category'>[] = [
4
+ export const MOVIE_LEGENDS_SCENARIOS: Omit<Scenario, "outputType" | "category">[] = [
5
5
  {
6
6
  id: ScenarioId.TITANIC_BOW,
7
7
  title: "Titanic Bow",
8
8
  description: "I'm flying, Jack!",
9
9
  icon: "🚒",
10
- imageUrl:
11
- "https://images.unsplash.com/photo-1544551763-46a013bb70d5?w=800",
10
+ imageUrl: "https://images.unsplash.com/photo-1544551763-46a013bb70d5?w=800",
11
+ inputType: "dual",
12
12
  aiPrompt: createPhotorealisticPrompt(
13
13
  "a couple recreating iconic Titanic bow pose on grand ocean liner, man in period suspenders and white shirt holding woman from behind, woman with arms outstretched in flowing Edwardian dress with windswept hair, both facing camera with blissful romantic smiles, dramatic orange and pink sunset reflecting on endless ocean in background",
14
- "warm golden sunset backlighting with ocean spray and wind effect"
14
+ "warm golden sunset backlighting with ocean spray and wind effect",
15
15
  ),
16
16
  storyTemplate: createStoryTemplate(
17
17
  "recreate the most romantic moment in cinema history",
@@ -23,11 +23,11 @@ export const MOVIE_LEGENDS_SCENARIOS: Omit<Scenario, 'outputType' | 'category'>[
23
23
  title: "Action Power Couple",
24
24
  description: "Back to back, guns ready",
25
25
  icon: "πŸ”«",
26
- imageUrl:
27
- "https://images.unsplash.com/photo-1540324155974-7523202daa3f?w=800",
26
+ imageUrl: "https://images.unsplash.com/photo-1540324155974-7523202daa3f?w=800",
27
+ inputType: "dual",
28
28
  aiPrompt: createPhotorealisticPrompt(
29
29
  "a couple as action movie spies standing back-to-back, both facing camera with fierce confident expressions, man in tailored black suit with tactical vest, woman in sleek black dress with thigh holster, modern glass architecture with orange sunset light streaming through in background",
30
- "dramatic cinematic lighting with warm orange tones and sharp shadows"
30
+ "dramatic cinematic lighting with warm orange tones and sharp shadows",
31
31
  ),
32
32
  storyTemplate: createStoryTemplate(
33
33
  "step into the shoes of the ultimate power duo",
@@ -40,9 +40,10 @@ export const MOVIE_LEGENDS_SCENARIOS: Omit<Scenario, 'outputType' | 'category'>[
40
40
  description: "Classic 50s diner dance",
41
41
  icon: "πŸ’ƒ",
42
42
  imageUrl: "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=800",
43
+ inputType: "dual",
43
44
  aiPrompt: createPhotorealisticPrompt(
44
45
  "a couple recreating Pulp Fiction twist contest in retro 50s diner, both facing camera with cool deadpan expressions doing classic hand-over-eyes dance move, man in thin black suit and bolo tie, woman in crisp white shirt and slim black pants with sleek dark bob haircut, red vinyl booths and checkered floor and glowing neon signs in background",
45
- "warm retro diner lighting with neon glow and vintage atmosphere"
46
+ "warm retro diner lighting with neon glow and vintage atmosphere",
46
47
  ),
47
48
  storyTemplate: createStoryTemplate(
48
49
  "ignite the dance floor with iconic moves",
@@ -54,11 +55,11 @@ export const MOVIE_LEGENDS_SCENARIOS: Omit<Scenario, 'outputType' | 'category'>[
54
55
  title: "City of Stars",
55
56
  description: "Dancing under the twilight",
56
57
  icon: "✨",
57
- imageUrl:
58
- "https://images.unsplash.com/photo-1533174072545-7a4b6ad7a6c3?w=800",
58
+ imageUrl: "https://images.unsplash.com/photo-1533174072545-7a4b6ad7a6c3?w=800",
59
+ inputType: "dual",
59
60
  aiPrompt: createPhotorealisticPrompt(
60
61
  "a couple dancing on hilltop overlooking Los Angeles at magic hour, recreating La La Land bench scene, woman in flowing bright yellow sundress with skirt twirling, man in white button-down and slim navy tie, purple and orange gradient sunset sky with twinkling city lights of LA sprawling below in background",
61
- "magical twilight lighting with warm golden and cool purple tones"
62
+ "magical twilight lighting with warm golden and cool purple tones",
62
63
  ),
63
64
  storyTemplate: createStoryTemplate(
64
65
  "dance through a dreamscape of stars",
@@ -70,11 +71,11 @@ export const MOVIE_LEGENDS_SCENARIOS: Omit<Scenario, 'outputType' | 'category'>[
70
71
  title: "The Gatsby Toast",
71
72
  description: "Old Sport!",
72
73
  icon: "πŸ₯‚",
73
- imageUrl:
74
- "https://images.unsplash.com/photo-1516939884455-1445c8652f83?w=800",
74
+ imageUrl: "https://images.unsplash.com/photo-1516939884455-1445c8652f83?w=800",
75
+ inputType: "dual",
75
76
  aiPrompt: createPhotorealisticPrompt(
76
77
  "a couple as grand Gatsby party hosts in 1920s mansion, both facing camera with charismatic knowing smiles raising crystal champagne coupes, woman in extravagant gold sequined flapper dress with feathered headpiece and long pearls, man in impeccable white dinner jacket with slicked hair, spectacular fireworks and glamorous party guests and art deco mansion in background",
77
- "lavish golden party lighting with firework sparkle and champagne glow"
78
+ "lavish golden party lighting with firework sparkle and champagne glow",
78
79
  ),
79
80
  storyTemplate: createStoryTemplate(
80
81
  "host the most legendary party of the century",
@@ -86,11 +87,11 @@ export const MOVIE_LEGENDS_SCENARIOS: Omit<Scenario, 'outputType' | 'category'>[
86
87
  title: "Aquarium Glance",
87
88
  description: "Love at first sight",
88
89
  icon: "🐠",
89
- imageUrl:
90
- "https://images.unsplash.com/photo-1544005313-94ddf0286df2?w=800",
90
+ imageUrl: "https://images.unsplash.com/photo-1544005313-94ddf0286df2?w=800",
91
+ inputType: "dual",
91
92
  aiPrompt: createPhotorealisticPrompt(
92
93
  "a couple gazing at each other through large aquarium tank, both visible through glass with mesmerized love-struck expressions, man in 90s silk shirt and chain, woman in sparkly party dress with 90s makeup, colorful tropical fish and blue water creating dreamy barrier between them, soft ethereal aquarium lighting",
93
- "soft blue aquarium glow with dreamy underwater light ripples"
94
+ "soft blue aquarium glow with dreamy underwater light ripples",
94
95
  ),
95
96
  storyTemplate: createStoryTemplate(
96
97
  "relive the moment of first sight",
@@ -102,11 +103,11 @@ export const MOVIE_LEGENDS_SCENARIOS: Omit<Scenario, 'outputType' | 'category'>[
102
103
  title: "The Rain Kiss",
103
104
  description: "It wasn't over!",
104
105
  icon: "🌧️",
105
- imageUrl:
106
- "https://images.unsplash.com/photo-1515694346937-94d85e41e6f0?w=800",
106
+ imageUrl: "https://images.unsplash.com/photo-1515694346937-94d85e41e6f0?w=800",
107
+ inputType: "dual",
107
108
  aiPrompt: createPhotorealisticPrompt(
108
109
  "a couple in passionate embrace during heavy rainstorm recreating The Notebook, both facing camera with intense emotional smiles showing happy tears mixing with rain, completely soaked with clinging wet clothing, man in drenched white t-shirt woman in rain-soaked summer dress, rustic wooden dock and misty lake with moody gray sky in background",
109
- "dramatic stormy lighting with rain streaks and emotional atmosphere"
110
+ "dramatic stormy lighting with rain streaks and emotional atmosphere",
110
111
  ),
111
112
  storyTemplate: createStoryTemplate(
112
113
  "promise to never let go",
@@ -118,11 +119,11 @@ export const MOVIE_LEGENDS_SCENARIOS: Omit<Scenario, 'outputType' | 'category'>[
118
119
  title: "Pottery Romance",
119
120
  description: "Unchained melody",
120
121
  icon: "🏺",
121
- imageUrl:
122
- "https://images.unsplash.com/photo-1501386761578-eac5c94b800a?w=800",
122
+ imageUrl: "https://images.unsplash.com/photo-1501386761578-eac5c94b800a?w=800",
123
+ inputType: "dual",
123
124
  aiPrompt: createPhotorealisticPrompt(
124
125
  "a couple at pottery wheel recreating Ghost scene, man sitting behind woman with his hands gently over hers shaping wet terracotta clay, both facing camera with intimate tender smiles, clay-covered fingers intertwined on spinning vase, soft warm indoor lighting from nearby lamp, rustic pottery studio with shelves of finished ceramics in background",
125
- "warm intimate golden lamp light with soft romantic atmosphere"
126
+ "warm intimate golden lamp light with soft romantic atmosphere",
126
127
  ),
127
128
  storyTemplate: createStoryTemplate(
128
129
  "share a moment of artistic connection",
@@ -134,11 +135,11 @@ export const MOVIE_LEGENDS_SCENARIOS: Omit<Scenario, 'outputType' | 'category'>[
134
135
  title: "Upside-Down Kiss",
135
136
  description: "Hero in the rain",
136
137
  icon: "πŸ•·οΈ",
137
- imageUrl:
138
- "https://images.unsplash.com/photo-1511285560929-80b456fea0bc?w=800",
138
+ imageUrl: "https://images.unsplash.com/photo-1511285560929-80b456fea0bc?w=800",
139
+ inputType: "dual",
139
140
  aiPrompt: createPhotorealisticPrompt(
140
141
  "a couple recreating iconic Spider-Man upside-down kiss in rainy alley, man hanging inverted from fire escape with mask pulled up to nose, woman reaching up to kiss him, both with loving expressions from unique angles, heavy rain pouring down in dark city alley with neon signs reflecting on wet pavement in background",
141
- "dramatic nighttime rain lighting with neon reflections and cinematic atmosphere"
142
+ "dramatic nighttime rain lighting with neon reflections and cinematic atmosphere",
142
143
  ),
143
144
  storyTemplate: createStoryTemplate(
144
145
  "reveal their secret hero love",
@@ -151,9 +152,10 @@ export const MOVIE_LEGENDS_SCENARIOS: Omit<Scenario, 'outputType' | 'category'>[
151
152
  description: "That legendary lift",
152
153
  icon: "πŸ•Ί",
153
154
  imageUrl: "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=800",
155
+ inputType: "dual",
154
156
  aiPrompt: createPhotorealisticPrompt(
155
157
  "a couple recreating iconic Dirty Dancing lift, man with strong arms holding woman high above his head, woman with gracefully arched back and arms spread wide in triumph, both facing camera with ecstatic joyful smiles, 1980s resort ballroom with cheering audience and string lights and stage in background",
156
- "warm spotlight with 80s golden glow and crowd excitement"
158
+ "warm spotlight with 80s golden glow and crowd excitement",
157
159
  ),
158
160
  storyTemplate: createStoryTemplate(
159
161
  "have the time of their lives",
@@ -165,11 +167,11 @@ export const MOVIE_LEGENDS_SCENARIOS: Omit<Scenario, 'outputType' | 'category'>[
165
167
  title: "Modern Fairytale",
166
168
  description: "Rescue on the fire escape",
167
169
  icon: "🏒",
168
- imageUrl:
169
- "https://images.unsplash.com/photo-1540324155974-7523202daa3f?w=800",
170
+ imageUrl: "https://images.unsplash.com/photo-1540324155974-7523202daa3f?w=800",
171
+ inputType: "dual",
170
172
  aiPrompt: createPhotorealisticPrompt(
171
173
  "a couple recreating Pretty Woman fire escape scene, man climbing rusty iron ladder with red rose in mouth and charming grin, woman in silk robe leaning over balcony railing looking down with amazed ecstatic smile, both facing camera, urban LA sunset with palm trees and city buildings in background",
172
- "warm golden sunset backlighting with romantic urban glow"
174
+ "warm golden sunset backlighting with romantic urban glow",
173
175
  ),
174
176
  storyTemplate: createStoryTemplate(
175
177
  "write their own modern fairytale",
@@ -181,11 +183,11 @@ export const MOVIE_LEGENDS_SCENARIOS: Omit<Scenario, 'outputType' | 'category'>[
181
183
  title: "The Meadow",
182
184
  description: "A thousand years",
183
185
  icon: "🌲",
184
- imageUrl:
185
- "https://images.unsplash.com/photo-1464822759023-fed622ff2c3b?w=800",
186
+ imageUrl: "https://images.unsplash.com/photo-1464822759023-fed622ff2c3b?w=800",
187
+ inputType: "dual",
186
188
  aiPrompt: createPhotorealisticPrompt(
187
189
  "a couple lying in lush meadow of purple and yellow wildflowers, heads together hair fanned out, both facing camera with intense devoted smiles, man in casual henley woman in simple cotton dress, golden sunlight filtering through ancient pine forest creating god rays in background",
188
- "soft dreamy golden hour light with ethereal forest atmosphere"
190
+ "soft dreamy golden hour light with ethereal forest atmosphere",
189
191
  ),
190
192
  storyTemplate: createStoryTemplate(
191
193
  "promise a lifetime of devotion",
@@ -197,11 +199,11 @@ export const MOVIE_LEGENDS_SCENARIOS: Omit<Scenario, 'outputType' | 'category'>[
197
199
  title: "Dawn of Love",
198
200
  description: "A walk at sunrise",
199
201
  icon: "πŸšΆβ€β™‚οΈ",
200
- imageUrl:
201
- "https://images.unsplash.com/photo-1500382017468-9049fed747ef?w=800",
202
+ imageUrl: "https://images.unsplash.com/photo-1500382017468-9049fed747ef?w=800",
203
+ inputType: "dual",
202
204
  aiPrompt: createPhotorealisticPrompt(
203
205
  "a couple walking toward each other through misty English field at dawn recreating Pride and Prejudice, man in long dark greatcoat with windswept hair, woman in flowing white nightdress with wool shawl, meeting as golden sun rises behind them casting long shadows through morning mist",
204
- "magical golden dawn light with atmospheric mist and romantic haze"
206
+ "magical golden dawn light with atmospheric mist and romantic haze",
205
207
  ),
206
208
  storyTemplate: createStoryTemplate(
207
209
  "find their way to each other through the mist",
@@ -213,11 +215,11 @@ export const MOVIE_LEGENDS_SCENARIOS: Omit<Scenario, 'outputType' | 'category'>[
213
215
  title: "Casablanca Farewell",
214
216
  description: "Here's looking at you, kid",
215
217
  icon: "πŸ›«",
216
- imageUrl:
217
- "https://images.unsplash.com/photo-1485686531765-ba63b07845a7?w=800",
218
+ imageUrl: "https://images.unsplash.com/photo-1485686531765-ba63b07845a7?w=800",
219
+ inputType: "dual",
218
220
  aiPrompt: createPhotorealisticPrompt(
219
221
  "a couple recreating Casablanca airport farewell at night, both facing camera with dramatic emotional expressions of bittersweet goodbye, man in tan trench coat and fedora, woman in elegant suit and wide-brimmed hat with tears in eyes, 1940s propeller plane and swirling fog on tarmac in background, high-contrast black and white film style",
220
- "dramatic noir lighting with fog and high-contrast black and white aesthetic"
222
+ "dramatic noir lighting with fog and high-contrast black and white aesthetic",
221
223
  ),
222
224
  storyTemplate: createStoryTemplate(
223
225
  "share one last unforgettable look",