{
 "16": {
  "inputs": {
   "image": "contact_sheet_app_input_1.png"
  },
  "class_type": "LoadImage",
  "_meta": {
   "title": "Load Character Image"
  }
 },
 "88": {
  "inputs": {
   "filename_prefix": "ComfyUI-image_5",
   "images": [
    "228:264",
    0
   ]
  },
  "class_type": "SaveImage",
  "_meta": {
   "title": "Save Image"
  }
 },
 "89": {
  "inputs": {
   "filename_prefix": "ComfyUI-image_6",
   "images": [
    "228:265",
    0
   ]
  },
  "class_type": "SaveImage",
  "_meta": {
   "title": "Save Image"
  }
 },
 "90": {
  "inputs": {
   "filename_prefix": "ComfyUI-image_7",
   "images": [
    "228:268",
    0
   ]
  },
  "class_type": "SaveImage",
  "_meta": {
   "title": "Save Image"
  }
 },
 "91": {
  "inputs": {
   "filename_prefix": "ComfyUI-image_8",
   "images": [
    "228:269",
    0
   ]
  },
  "class_type": "SaveImage",
  "_meta": {
   "title": "Save Image"
  }
 },
 "26": {
  "inputs": {
   "image": "brown_moisturizer_bottle.jpg"
  },
  "class_type": "LoadImage",
  "_meta": {
   "title": "Load Product Image"
  }
 },
 "30": {
  "inputs": {
   "model": "gemini-3-pro-image-preview",
   "seed": 586933274482026,
   "aspect_ratio": "9:16",
   "resolution": "4K",
   "response_modalities": "IMAGE+TEXT",
   "system_prompt": "You are an expert image-generation engine. You must ALWAYS produce an image.\nInterpret all user input\u2014regardless of format, intent, or abstraction\u2014as literal visual directives for image composition.\nIf a prompt is conversational or lacks specific visual details, you must creatively invent a concrete visual scenario that depicts the concept.\nPrioritize generating the visual representation above any text, formatting, or conversational requests.",
   "prompt": [
    "248",
    0
   ],
   "images": [
    "229",
    0
   ]
  },
  "class_type": "GeminiImage2Node",
  "_meta": {
   "title": "Nano Banana Pro (Google Gemini Image)"
  }
 },
 "62": {
  "inputs": {
   "value": "Analyze the input images and inventory all fashion-critical details: the subject(s) from image 1, exact wardrobe pieces, facial features, materials, colors, textures, accessories, hair, makeup, body proportions, environment, set geometry, light direction, and shadow quality.\nAll wardrobe, styling, hair, makeup, lighting, environment, and color grade must remain 100% unchanged across all frames. The character from image 1 is holding the product from image 2, maintain exact representation of the product, text legibility and relative size as seen in image 1.\nDo not add or remove anything (unless specified in the prompt).\nDo not generate with visible gutters/padding between grid images.\n \nYour visible output must be:\n \nOne 2\u00d72 grid (4 frames).\n \nThen a keyframe breakdown for each frame.\n \nEach frame must represent a resting point after a dramatic camera move \u2014 only describe the final camera position and what the subject is doing, never the motion itself.\n \nThe four frames must be spatially dynamic, non-linear, and visually distinct.\n \nRequired 4-Frame Shot List \n{grid_descriptions}\n \nContinuity & Technical Requirements\n \nMaintain perfect wardrobe fidelity in every frame: exact garment type, silhouette, material, color, texture, stitching, accessories, closures, jewelry, shoes, hair, and makeup.\n \nEnvironment, textures, and lighting must remain consistent.\n \nDepth of field shifts naturally with focal length (deep for distant shots, shallow for close/detail shots).\n \nPhoto real textures and physically plausible light behavior required.\n \nFrames must feel like different camera placements within the same scene, not different scenes.\n \nAll keyframes must be the exact same aspect ratio, and exactly 4 keyframes should be output. Maintain the exact visual style in all keyframes, where the image is shot on fuji velvia film with a hard flash, the light is concentrated on the subject and fades slightly toward the edges of the frame. The image is over exposed showing significant film grain and is oversaturated. The skin appears shiny (almost oily), and there are harsh white reflections on the glasses frames.\n \nOutput Format\nA) 2\u00d72 Contact Sheet Image (Mandatory)"
  },
  "class_type": "PrimitiveStringMultiline",
  "_meta": {
   "title": "Prompt Template V2"
  }
 },
 "34": {
  "inputs": {
   "value": "Analyze the input images and silently inventory all fashion-critical details: the subject(s) from image 1, exact wardrobe pieces, facial features, materials, colors, textures, accessories, hair, makeup, body proportions, environment, set geometry, light direction, and shadow quality.\nAll wardrobe, styling, hair, makeup, lighting, environment, and color grade must remain 100% unchanged across all frames. The character from image 1 is holding the product from image 2, maintain exact representation of the product, text legibility and relative size as seen in image 1.\nDo not add or remove anything (unless specified in the prompt).\nDo not generate with visible gutters/padding between grid images.\n \nYour visible output must be:\n \nOne 2\u00d72 grid image (4 frames).\n \nThen a keyframe breakdown for each frame.\n \nEach frame must represent a resting point after a dramatic camera move \u2014 only describe the final camera position and what the subject is doing, never the motion itself.\n \nThe four frames must be spatially dynamic, non-linear, and visually distinct.\n \nRequired 4-Frame Shot List \n{grid_descriptions}\n\n \nContinuity & Technical Requirements\n \nMaintain perfect wardrobe fidelity in every frame: exact garment type, silhouette, material, color, texture, stitching, accessories, closures, jewelry, shoes, hair, and makeup.\n \nEnvironment, textures, and lighting must remain consistent.\n \nDepth of field shifts naturally with focal length (deep for distant shots, shallow for close/detail shots).\n \nPhoto real textures and physically plausible light behavior required.\n \nFrames must feel like different camera placements within the same scene, not different scenes.\n \nAll keyframes must be the exact same aspect ratio, and exactly 4 keyframes should be output. Maintain the exact visual style in all keyframes, where the image is shot on fuji velvia film with a hard flash, the light is concentrated on the subject and fades slightly toward the edges of the frame. The image is over exposed showing significant film grain and is oversaturated. The skin appears shiny (almost oily), and there are harsh white reflections on the glasses frames.\n \nOutput Format\nA) 2\u00d72 Contact Sheet Image (Mandatory)"
  },
  "class_type": "PrimitiveStringMultiline",
  "_meta": {
   "title": "Prompt Template V1"
  }
 },
 "61": {
  "inputs": {
   "model": "gemini-3-pro-image-preview",
   "seed": 363592989122759,
   "aspect_ratio": "9:16",
   "resolution": "4K",
   "response_modalities": "IMAGE+TEXT",
   "system_prompt": "You are an expert image-generation engine. You must ALWAYS produce an image.\nInterpret all user input\u2014regardless of format, intent, or abstraction\u2014as literal visual directives for image composition.\nIf a prompt is conversational or lacks specific visual details, you must creatively invent a concrete visual scenario that depicts the concept.\nPrioritize generating the visual representation above any text, formatting, or conversational requests.",
   "prompt": [
    "255",
    0
   ],
   "images": [
    "230",
    0
   ]
  },
  "class_type": "GeminiImage2Node",
  "_meta": {
   "title": "Nano Banana Pro (Google Gemini Image)"
  }
 },
 "228:226": {
  "inputs": {
   "value": "a / 2",
   "b": 0.0,
   "a": [
    "228:17",
    1
   ]
  },
  "class_type": "SimpleMath+",
  "_meta": {
   "title": "HEIGHT"
  }
 },
 "228:83": {
  "inputs": {
   "value": "a / 2",
   "b": 0.0,
   "a": [
    "228:17",
    0
   ]
  },
  "class_type": "SimpleMath+",
  "_meta": {
   "title": "WIDTH"
  }
 },
 "228:17": {
  "inputs": {
   "image": [
    "61",
    0
   ]
  },
  "class_type": "GetImageSize",
  "_meta": {
   "title": "Get Image Size"
  }
 },
 "228:87": {
  "inputs": {
   "value": "a + (b/2)",
   "b": 0.0,
   "a": [
    "228:226",
    0
   ]
  },
  "class_type": "SimpleMath+",
  "_meta": {
   "title": "Row 2 - Y val"
  }
 },
 "228:264": {
  "inputs": {
   "position": "top-left",
   "x_offset": 0,
   "y_offset": 0,
   "image": [
    "61",
    0
   ],
   "width": [
    "228:83",
    0
   ],
   "height": [
    "228:226",
    0
   ]
  },
  "class_type": "ImageCrop+",
  "_meta": {
   "title": "Crop Grid 1"
  }
 },
 "228:265": {
  "inputs": {
   "position": "top-left",
   "y_offset": 0,
   "image": [
    "61",
    0
   ],
   "width": [
    "228:83",
    0
   ],
   "height": [
    "228:226",
    0
   ],
   "x_offset": [
    "228:83",
    0
   ]
  },
  "class_type": "ImageCrop+",
  "_meta": {
   "title": "Crop Grid 2"
  }
 },
 "228:268": {
  "inputs": {
   "position": "top-left",
   "x_offset": 0,
   "image": [
    "61",
    0
   ],
   "width": [
    "228:83",
    0
   ],
   "height": [
    "228:226",
    0
   ],
   "y_offset": [
    "228:87",
    0
   ]
  },
  "class_type": "ImageCrop+",
  "_meta": {
   "title": "Crop Grid 3"
  }
 },
 "228:269": {
  "inputs": {
   "position": "top-left",
   "image": [
    "61",
    0
   ],
   "width": [
    "228:83",
    0
   ],
   "height": [
    "228:226",
    0
   ],
   "x_offset": [
    "228:83",
    0
   ],
   "y_offset": [
    "228:87",
    0
   ]
  },
  "class_type": "ImageCrop+",
  "_meta": {
   "title": "Crop Grid 4"
  }
 },
 "229": {
  "inputs": {
   "images.image0": [
    "16",
    0
   ],
   "images.image1": [
    "26",
    0
   ]
  },
  "class_type": "BatchImagesNode",
  "_meta": {
   "title": "Batch Images"
  }
 },
 "230": {
  "inputs": {
   "images.image0": [
    "16",
    0
   ],
   "images.image1": [
    "26",
    0
   ]
  },
  "class_type": "BatchImagesNode",
  "_meta": {
   "title": "Batch Images"
  }
 },
 "239": {
  "inputs": {
   "filename_prefix": "ComfyUI-image_1",
   "images": [
    "278:274",
    0
   ]
  },
  "class_type": "SaveImage",
  "_meta": {
   "title": "Save Image"
  }
 },
 "240": {
  "inputs": {
   "filename_prefix": "ComfyUI-image_2",
   "images": [
    "278:275",
    0
   ]
  },
  "class_type": "SaveImage",
  "_meta": {
   "title": "Save Image"
  }
 },
 "241": {
  "inputs": {
   "filename_prefix": "ComfyUI-image_3",
   "images": [
    "278:276",
    0
   ]
  },
  "class_type": "SaveImage",
  "_meta": {
   "title": "Save Image"
  }
 },
 "242": {
  "inputs": {
   "filename_prefix": "ComfyUI-image_4",
   "images": [
    "278:277",
    0
   ]
  },
  "class_type": "SaveImage",
  "_meta": {
   "title": "Save Image"
  }
 },
 "245": {
  "inputs": {
   "value": "1. High-Fashion Beauty Portrait (Close, Editorial, Intimate)\n \nCamera positioned very close to the subject's face, slightly above or slightly below eye level, using an elegant offset angle that enhances bone structure and highlights key wardrobe elements near the neckline. Shallow depth of field, flawless texture rendering, and a sculptural fashion-forward composition.\n \n2. High-Angle Three-Quarter Frame\n \nCamera positioned overhead but off-center, capturing the subject from a diagonal downward angle.\nThis frame should create strong shape abstraction and reveal wardrobe details from above.\n \n3. Low-Angle Oblique Full-Body Frame\n \nCamera positioned low to the ground and angled obliquely toward the subject.\nThis elongates the silhouette, emphasizes footwear, and creates a dramatic perspective distinct from Frames 1 and 2.\n \n4. Side-On Compression Frame (Long Lens)\n \nCamera placed far to one side of the subject, using a tighter focal length to compress space.\nThe subject appears in clean profile or near-profile, showcasing garment structure in a flattened, editorial manner."
  },
  "class_type": "PrimitiveStringMultiline",
  "_meta": {
   "title": "Prompt Grid Images V1"
  }
 },
 "248": {
  "inputs": {
   "regex_pattern": "{grid_descriptions}\n",
   "case_insensitive": true,
   "multiline": false,
   "dotall": false,
   "count": 0,
   "string": [
    "34",
    0
   ],
   "replace": [
    "245",
    0
   ]
  },
  "class_type": "RegexReplace",
  "_meta": {
   "title": "Replace Text (Regex)"
  }
 },
 "249": {
  "inputs": {
   "value": " 1. Intimate Close Portrait From an Unexpected Height\n \nCamera positioned very close to the subject's face (or upper torso) but slightly above or below eye level.\nThe angle should feel fashion-editorial, not conventional \u2014 offset, elegant, and expressive.\n \n2. Extreme Detail Frame From a Non-Intuitive Angle\n \nCamera positioned extremely close to a wardrobe detail, accessory, or texture, but from an unusual spatial direction (e.g., from below, from behind, from the side of a neckline).\nThis must be a striking, abstract, editorial detail frame.\n\n3. Extreme depth perception of the subject holding item (INTRODUCE A NEW ITEM IF PROMPTED)\n\nA dynamic, high-energy photograph shot from an extreme low-angle worm\u2019s-eye view using forced perspective. The man is thrusting the product from image 2 toward the camera lens, making the device appear larger than life in the foreground. His free hand is raised in a casual peace sign. \n\n4. Extreme Low Angle Shot from Perspective of the Subject's Shoe.\n\nCamera positioned extremely low with main focus on the characters shoe in the immediate foreground. Extreme foreshortening makes the sneaker in the immediate foreground appear massive and highly detailed, dominating the bottom half of the frame, while the subject's body tapers upward towards a smaller head. Infer from the rest of the outfit what shoe the subject is wearing."
  },
  "class_type": "PrimitiveStringMultiline",
  "_meta": {
   "title": "Prompt Grid Images V2"
  }
 },
 "255": {
  "inputs": {
   "regex_pattern": "{grid_descriptions}\n",
   "case_insensitive": true,
   "multiline": false,
   "dotall": false,
   "count": 0,
   "string": [
    "62",
    0
   ],
   "replace": [
    "249",
    0
   ]
  },
  "class_type": "RegexReplace",
  "_meta": {
   "title": "Replace Text (Regex)"
  }
 },
 "278:270": {
  "inputs": {
   "value": "a / 2",
   "b": 0.0,
   "a": [
    "278:272",
    1
   ]
  },
  "class_type": "SimpleMath+",
  "_meta": {
   "title": "HEIGHT"
  }
 },
 "278:271": {
  "inputs": {
   "value": "a / 2",
   "b": 0.0,
   "a": [
    "278:272",
    0
   ]
  },
  "class_type": "SimpleMath+",
  "_meta": {
   "title": "WIDTH"
  }
 },
 "278:272": {
  "inputs": {
   "image": [
    "30",
    0
   ]
  },
  "class_type": "GetImageSize",
  "_meta": {
   "title": "Get Image Size"
  }
 },
 "278:273": {
  "inputs": {
   "value": "a + (b/2)",
   "b": 0.0,
   "a": [
    "278:270",
    0
   ]
  },
  "class_type": "SimpleMath+",
  "_meta": {
   "title": "Row 2 - Y val"
  }
 },
 "278:274": {
  "inputs": {
   "position": "top-left",
   "x_offset": 0,
   "y_offset": 0,
   "image": [
    "30",
    0
   ],
   "width": [
    "278:271",
    0
   ],
   "height": [
    "278:270",
    0
   ]
  },
  "class_type": "ImageCrop+",
  "_meta": {
   "title": "Crop Grid 1"
  }
 },
 "278:275": {
  "inputs": {
   "position": "top-left",
   "y_offset": 0,
   "image": [
    "30",
    0
   ],
   "width": [
    "278:271",
    0
   ],
   "height": [
    "278:270",
    0
   ],
   "x_offset": [
    "278:271",
    0
   ]
  },
  "class_type": "ImageCrop+",
  "_meta": {
   "title": "Crop Grid 2"
  }
 },
 "278:276": {
  "inputs": {
   "position": "top-left",
   "x_offset": 0,
   "image": [
    "30",
    0
   ],
   "width": [
    "278:271",
    0
   ],
   "height": [
    "278:270",
    0
   ],
   "y_offset": [
    "278:273",
    0
   ]
  },
  "class_type": "ImageCrop+",
  "_meta": {
   "title": "Crop Grid 3"
  }
 },
 "278:277": {
  "inputs": {
   "position": "top-left",
   "image": [
    "30",
    0
   ],
   "width": [
    "278:271",
    0
   ],
   "height": [
    "278:270",
    0
   ],
   "x_offset": [
    "278:271",
    0
   ],
   "y_offset": [
    "278:273",
    0
   ]
  },
  "class_type": "ImageCrop+",
  "_meta": {
   "title": "Crop Grid 4"
  }
 }
}