@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 +1 -1
- package/src/domains/generation/wizard/infrastructure/strategies/video-generation.strategy.ts +49 -6
- package/src/domains/generation/wizard/presentation/hooks/useWizardGeneration.ts +4 -1
- package/src/domains/scenarios/configs/wizard-configs.ts +40 -3
- package/src/domains/scenarios/domain/Scenario.ts +11 -2
- package/src/domains/scenarios/domain/scenario.types.ts +12 -1
- package/src/domains/scenarios/index.ts +1 -1
- package/src/domains/scenarios/infrastructure/data/movie-legends-scenarios.ts +41 -39
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@umituz/react-native-ai-generation-content",
|
|
3
|
-
"version": "1.37.
|
|
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",
|
package/src/domains/generation/wizard/infrastructure/strategies/video-generation.strategy.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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("
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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",
|