diff --git a/app.js b/app.js index e902208..0b0af37 100644 --- a/app.js +++ b/app.js @@ -6,6 +6,7 @@ document.addEventListener('DOMContentLoaded', () => { initPosterLab(); initMiniAppsHub(); initMiniAppBuilder(); + initUgcStudio(); initInboxAI(); initHistory(); }); @@ -1282,3 +1283,236 @@ function saveGenerationToHistory(item) { list.unshift(item); localStorage.setItem('opal_history', JSON.stringify(list.slice(0, 30))); } + +// --- 7. Google Flow & Omni UGC Video Ads Studio (Google Veo 3.1) --- +let selectedUgcPreset = 'unhinged_review'; + +const UGC_PRESET_LIBRARY = { + unhinged_review: { + name: 'Raw iPhone Unfiltered Review', + styleDescription: 'Front-camera 4K selfie video, natural room lighting, casual clothing, real Bengali conversational talking-head with authentic micro-expressions and unboxing texture close-up.', + cameraSettings: 'iPhone 15 Pro Max Front Camera 4K 60fps, subtle handheld organic wobble, autofocus hunting onto product label at 0:08, natural eye contact, warm ambient room light.', + timelineTemplate: [ + { time: '0:00 - 0:03', title: 'đĨ Disruptive Curiosity Hook', visual: 'Creator holds phone with one hand, looking shocked/excited directly at the lens. Holds {{product}} close to camera.', script: '"āĻāĻĒā§āϰāĻž, āϏāϤā§āϝāĻŋ āĻŦāϞāĻāĻŋâāĻāĻ āĻāĻŋāύāĻŋāϏāĻāĻž āĻāĻāĻ āĻāϰāĻžāϰ āĻāĻā§ āĻāĻŽāĻžāϰ āϏā§āĻāĻŋāύā§āϰ āϝāĻž āĻ āĻŦāϏā§āĻĨāĻž āĻāĻŋāϞ, āύāĻŋāĻā§āϰ āĻā§āĻšāĻžāϰāĻžāĻ āύāĻŋāĻā§ āĻĻā§āĻāϤ⧠āĻĒāĻžāϰāϤāĻžāĻŽ āύāĻž!"' }, + { time: '0:03 - 0:07', title: 'đŠ Problem & Relatable Agitation', visual: 'Creator touches cheek showing dullness/dryness, shakes head in frustration.', script: '"āϰā§āĻĻā§ āĻĒā§ā§ā§ āϤā§āĻŦāĻ āĻāĻāĻĻāĻŽ āĻĄā§āϝāĻžāĻŽā§āĻ āĻāϰ āĻā§āĻĒ āĻā§āĻĒ āĻĻāĻžāĻā§ āĻāϰ⧠āĻāĻŋā§ā§āĻāĻŋāϞāĨ¤ āĻĻāĻžāĻŽāĻŋ āĻĻāĻžāĻŽāĻŋ āĻāϤ āĻāĻŋāĻā§ āĻā§āϰāĻžāĻ āĻāϰā§āĻāĻŋ, āĻāĻŋāύā§āϤ⧠āĻā§āύ⧠āϞāĻžāĻ āĻšāĻā§āĻāĻŋāϞ āύāĻž!"' }, + { time: '0:07 - 0:12', title: '⨠Product Demo & Texture Macro', visual: 'Macro close-up: Creator opens {{product}}, shows the rich bouncy jelly texture, applies a drop on cheekbone, taps gently. Instant dewy light reflection appears.', script: '"āϤāĻžāϰāĻĒāϰ Glamour\'s Touch āĻĨā§āĻā§ āĻāϏāϞ āĻā§āϰāĻŋā§āĻžāύ {{product}} āύāĻŋāϞāĻžāĻŽāĨ¤ āĻāĻžāϏā§āĻ āĻā§āĻā§āϏāĻāĻžāϰāĻāĻž āĻĻā§āĻā§āύâāĻāĻ āĻĢā§āĻāĻāĻž āĻĻāĻŋāϤā§āĻ āϤā§āĻŦāĻ āĻāĻžāĻā§āϰ āĻŽāϤ⧠āĻāĻāĻāĻ āĻāϰā§!"' }, + { time: '0:12 - 0:15', title: 'đ Social Proof & Urgency CTA', visual: 'Creator smiles radiantly, holds up the official authenticity barcode and points to screen link.', script: '"ā§§ā§Ļā§Ļ% āĻāϏāϞ āĻĒā§āϰā§āĻĄāĻžāĻā§āĻ āĻĒā§āϤ⧠āϏāϰāĻžāϏāϰāĻŋ āύāĻŋāĻā§ āĻšā§ā§āĻžāĻāϏāĻ ā§āϝāĻžāĻĒ āϞāĻŋāĻāĻā§ āĻāύāĻŦāĻā§āϏ āĻāϰā§āύāĨ¤ āĻāĻāύāĻ āĻ āϰā§āĻĄāĻžāϰ āύāĻž āĻāϰāϞ⧠āĻāĻŋāύā§āϤ⧠āϏā§āĻāĻ āĻļā§āώ āĻšā§ā§ āϝāĻžāĻŦā§!"' } + ] + }, + grwm_mirror: { + name: 'Bathroom Mirror GRWM + Glass Skin', + styleDescription: 'Aesthetic morning routine in a clean modern bathroom with golden morning sunlight hitting the mirror, soft focus background, organic skincare application.', + cameraSettings: 'Cinematic 9:16 vertical, f/1.8 shallow depth of field, warm golden-hour side lighting, macro zoom onto water droplets and glowing skin absorption.', + timelineTemplate: [ + { time: '0:00 - 0:03', title: 'đĒ Morning GRWM Hook', visual: 'Morning sunshine reflecting on mirror. Creator wearing silk headband, applying headband, looking at glowing skin.', script: '"Get Ready With Me! āĻāĻāĻā§āϰ āĻĻāĻŋāύ⧠āϝāĻžāĻĻā§āϰ āϏāĻžāϰāĻžāĻĻāĻŋāύ āĻā§āϞāĻžāϏ āϏā§āĻāĻŋāύ āĻā§āϞ⧠āϧāϰ⧠āϰāĻžāĻāϤ⧠āĻšāĻŦā§, āϤāĻžāĻĻā§āϰ āĻāύā§āϝ āĻāĻŽāĻžāϰ āϏāĻŋāĻā§āϰā§āĻ āϰā§āĻāĻŋāύ..."' }, + { time: '0:03 - 0:07', title: 'đ¸ Step-by-Step Application', visual: 'Dipping finger/dropper into {{product}}, smooth glide across cheekbones and forehead.', script: '"āĻā§āĻŽ āĻĨā§āĻā§ āĻāĻ ā§ āĻŽā§āĻ āϧā§ā§ā§ āĻāĻ {{product}} āĻāĻžāϏā§āĻ ā§¨ āĻĢā§āĻāĻāĻž āĻŽā§āϝāĻžāϏāĻžāĻ āĻāϰ⧠āύāĻŋāĻāĨ¤ āϤā§āĻŦāĻā§āϰ āĻāĻā§āϰ⧠āĻāĻŋā§ā§ āϏāĻžāĻĨā§ āϏāĻžāĻĨā§ āĻšāĻžāĻāĻĄā§āϰā§āĻļāύ āϞāĻ āĻāϰā§!"' }, + { time: '0:07 - 0:12', title: 'đ Real Light Absorption Test', visual: 'Creator turns face left and right in natural lightâskin reflects a glossy, crystal-clear mirror shine.', script: '"āĻā§āύ⧠āĻŽā§āĻāĻāĻĒ āĻāĻžā§āĻž āύā§āϝāĻžāĻāĻžāϰāĻžāϞ āϏā§āĻāĻŋāύā§āĻ āĻāĻ āĻļāĻžāĻāύāĻāĻž āĻĒāĻžāĻā§āĻā§āύāĨ¤ āϏāĻžāϰāĻžāĻĻāĻŋāύ āĻŽā§āĻ āĻāĻāĻĻāĻŽ āύāϰāĻŽ āĻāϰ āĻĢā§āϰā§āĻļ āĻĨāĻžāĻā§!"' }, + { time: '0:12 - 0:15', title: 'đī¸ Special Offer & Order CTA', visual: 'Creator picks up bag, waves happily to camera, on-screen WhatsApp hotline pop-up.', script: '"āĻāĻāĻ āϏā§āĻĒā§āĻļāĻžāϞ āĻĄāĻŋāϏāĻāĻžāĻāύā§āĻā§ āĻ āϰāĻŋāĻāĻŋāύāĻžāϞāĻāĻž āύāĻŋāϤ⧠glamourstouch.com āĻŦāĻž WhatsApp-āĻ āύāĻ āĻĻāĻŋāύ!"' } + ] + }, + unboxing_asmr: { + name: 'POV First-Person Unboxing ASMR', + styleDescription: 'POV first-person angle over a clean wooden marble desk. Hands opening official courier flyer, crisp peeling sound, glossy box reveal, tactile product feel.', + cameraSettings: 'Top-down 45-degree angle, 4K macro lens, studio ring light + warm softbox, rich tactile audio/visual sensations.', + timelineTemplate: [ + { time: '0:00 - 0:03', title: 'đĻ Satisfying Unboxing Hook', visual: 'POV hands slicing open courier parcel with satisfying tear. Bubble wrap peeled to reveal authentic {{product}}.', script: '[ASMR: Crispy package opening sound] "āĻ āĻŦāĻļā§āώ⧠āĻāĻŽāĻžāϰ āĻŽā§āϏā§āĻ āĻā§ā§āĻāĻā§āĻĄ āĻā§āϰāĻŋā§āĻžāύ āĻĒāĻžāϰā§āϏā§āϞāĻāĻž āĻĄā§āϞāĻŋāĻāĻžāϰāĻŋ āĻĒā§āϞāĻžāĻŽ!"' }, + { time: '0:03 - 0:07', title: 'đĄī¸ Authenticity Verification', visual: 'Hands turning the luxury box around, zooming in on Korean authentic hologram seal and QR sticker.', script: '"ā§§ā§Ļā§Ļ% āĻ āϰāĻŋāĻāĻŋāύāĻžāϞ āĻā§āϰāĻŋā§āĻžāύ āĻšā§āϞā§āĻā§āϰāĻžāĻŽ āϏāĻŋāϞ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāĻž āĻāĻā§āĨ¤ āĻĒā§āϝāĻžāĻā§āĻāĻŋāĻāĻāĻžāĻ āϤ⧠āĻŽāĻžāĻĨāĻž āύāώā§āĻ!"' }, + { time: '0:07 - 0:12', title: 'đ§Ē Luxurious Texture Swirl', visual: 'Unscrewing the golden cap, dipping spatula/finger into rich jelly formula, spreading silky smooth swatch on back of hand.', script: '"āĻāĻžāϏā§āĻ āĻĢāĻŋāϞāĻāĻž āĻĻā§āĻā§āύâāĻā§ āĻĒāϰāĻŋāĻŽāĻžāĻŖ āĻĒā§āϰāĻŋāĻŽāĻŋā§āĻžāĻŽ! āĻāĻāĻĻāĻŽ āϞāĻžāĻāĻāĻā§ā§āĻ, āĻāĻ āĻžāϞ⧠āĻāĻžāĻŦ āĻāĻžā§āĻžāĻ āϤā§āĻŦāĻā§ āĻŽāĻŋāĻļā§ āϝāĻžā§āĨ¤"' }, + { time: '0:12 - 0:15', title: '⥠Fast Delivery & COD CTA', visual: 'Parcel invoice and hotline sticker shown with WhatsApp order button.', script: '"āĻā§āϝāĻžāĻļ āĻ āύ āĻĄā§āϞāĻŋāĻāĻžāϰāĻŋāϤ⧠āĻĻā§āϰā§āϤ āĻĒā§āϤ⧠āĻāĻāύāĻ āύāĻŋāĻā§ āĻŽā§āϏā§āĻ āĻāϰā§āύ!"' } + ] + }, + skeptic_test: { + name: 'Viral Claim Skeptic & Moisture Meter', + styleDescription: 'Investigative, high-retention TikTok testing format. Direct close-up with moisture meter tool testing skin before and after.', + cameraSettings: 'Punchy fast zooms, dynamic screen text overlays, high-contrast clean lighting, high energy facial delivery.', + timelineTemplate: [ + { time: '0:00 - 0:03', title: 'â ī¸ High-Stakes Skeptic Hook', visual: 'Creator holds moisture meter with red 18% dry skin alert, looking skeptical at {{product}}.', script: '"āĻāĻŋāĻāĻāĻā§ āϏāĻŦāĻžāĻ āϝ⧠{{product}} āύāĻŋā§ā§ āϞāĻžāĻĢāĻžāϞāĻžāĻĢāĻŋ āĻāϰāĻā§âāĻāϏāϞā§āĻ āĻāĻŋ āĻāĻāĻž āĻāĻžāĻ āĻāϰ⧠āύāĻžāĻāĻŋ āĻļā§āϧā§āĻ āĻšāĻžāĻāĻĒ? āĻāϞā§āύ āϞāĻžāĻāĻ āĻā§āϏā§āĻ āĻāϰāĻŋ!"' }, + { time: '0:03 - 0:07', title: 'đ§Ē Live Before-Test Application', visual: 'Close up of dry skin measurement (18%). Applies cream on right half of face only.', script: '"āĻĒā§āϰāĻĨāĻŽā§ āĻāĻŽāĻžāϰ āĻĄā§āϰāĻžāĻ āϏā§āĻāĻŋāύ āĻŽāĻžāĻĒāϞāĻžāĻŽâāĻŽāĻžāϤā§āϰ ā§§ā§Ž% āĻŽā§ā§āĻļā§āĻāĻžāϰāĨ¤ āĻāĻŦāĻžāϰ āĻŽā§āĻā§āϰ āĻāĻāĻĒāĻžāĻļā§ āĻĒā§āϰāĻĄāĻžāĻā§āĻāĻāĻž āϞāĻžāĻāĻŋā§ā§ ā§Ģ āĻŽāĻŋāύāĻŋāĻ āĻ āĻĒā§āĻā§āώāĻž āĻāϰāϞāĻžāĻŽ..."' }, + { time: '0:07 - 0:12', title: 'đą Shocking 84% Meter Result', visual: 'Beeping moisture meter pressed on treated cheekâscreen turns green displaying 84% Hydration Glow.', script: '"āĻ āĻŽāĻžāĻ āĻāĻĄ! āĻŽāĻŋāĻāĻžāϰ āĻĻā§āĻā§āύâā§§ā§Ž% āĻĨā§āĻā§ āĻāĻ āϞāĻžāĻĢā§ ā§Žā§Ē%! āύāĻŋāĻā§āϰ āĻā§āĻāĻā§ āĻŦāĻŋāĻļā§āĻŦāĻžāϏ āĻāϰāϤ⧠āĻĒāĻžāϰāĻāĻŋ āύāĻž!"' }, + { time: '0:12 - 0:15', title: 'đ Verdict & Purchase Link', visual: 'Creator happily nodding, displaying the genuine shop packaging.', script: '"āĻšāĻžāĻāĻĒāĻāĻž āĻāĻāĻĻāĻŽ ā§§ā§Ļā§Ļ% āϏāϤā§āϝāĻŋ! āĻāϏāϞāĻāĻž āĻ āϰā§āĻĄāĻžāϰ āĻāϰāϤ⧠āύāĻŋāĻā§āϰ āĻŦāĻžāĻāύ⧠āĻāĻāύāĻ āĻā§āϞāĻŋāĻ āĻāϰā§āύāĨ¤"' } + ] + }, + street_interview: { + name: 'Campus / Street Micro-Interview', + styleDescription: 'Outdoor real-world environment (Dhanmondi / Dhaka University). Handheld wireless microphone, spontaneous interaction with a real student or young professional.', + cameraSettings: 'Wide to medium shot, natural daylight, wireless lavalier mic sound, spontaneous laughter and genuine reactions.', + timelineTemplate: [ + { time: '0:00 - 0:03', title: 'đī¸ Spontaneous Street Hook', visual: 'Interviewer holds cute micro-mic, approaches friendly girl in university campus.', script: '"āĻāĻĒā§, ā§§ āϏā§āĻā§āύā§āĻĄ! āĻāĻĒāύāĻžāϰ āϤā§āĻŦāĻā§āϰ āĻāĻ āύā§āϝāĻžāĻāĻžāϰāĻžāϞ āĻā§āϞā§-āĻāϰ āϏāĻŋāĻā§āϰā§āĻāĻāĻž āĻāĻŋ āĻāĻāĻā§ āĻŦāϞāĻŦā§āύ?"' }, + { time: '0:03 - 0:07', title: 'đŦ Genuine Relatable Reaction', visual: 'Interviewee smiles, opens purse and takes out her authentic {{product}}.', script: '"āĻāϰā§āĻš! āĻāĻŽāĻŋ āϤ⧠āĻŽā§āĻāĻāĻĒ āĻāĻāĻ āĻāϰāĻŋ āύāĻž, āĻāĻžāϏā§āĻ āĻāĻ āĻā§āϰāĻŋā§āĻžāύ {{product}} āĻāĻž āĻāĻāĻ āĻāϰāĻŋ!"' }, + { time: '0:07 - 0:12', title: '⨠Instant Hand Texture Test', visual: 'Interviewer tries a tiny pump on her hand, touches it with wide excited eyes.', script: '"āĻā§āĻžāĻ! āϏā§āĻāύā§āϧāĻāĻž āĻāϤ āĻŽāĻŋāώā§āĻāĻŋ āĻāϰ āϏāĻžāĻĨā§ āϏāĻžāĻĨā§āĻ āϤā§āĻŦāĻ āĻāĻāĻĻāĻŽ āύāϰāĻŽ āĻšā§ā§ āĻā§āϞ!"' }, + { time: '0:12 - 0:15', title: 'đī¸ Street Verdict & CTA', visual: 'Both girls smile at camera, pointing to on-screen WhatsApp number.', script: '"āĻā§āĻĨāĻžā§ āĻĒāĻžāĻā§āĻž āϝāĻžāĻŦā§ āĻāĻĒā§? âGlamour\'s Touch-āĻ, āĻ āϰāĻŋāĻāĻŋāύāĻžāϞ āĻā§āϰāĻŋā§āĻžāύ āĻāĻžāϞā§āĻāĻļāύ!"' } + ] + }, + founder_story: { + name: 'Founder\'s Direct Authenticity Hook', + styleDescription: 'Behind-the-scenes authentic warehouse/office aesthetic with stacks of courier parcels, showing real import documents and heartfelt founder dedication.', + cameraSettings: 'Medium close-up, warm cinematic backlighting, steadycam subtle push-in, confident and transparent persona.', + timelineTemplate: [ + { time: '0:00 - 0:03', title: 'đ Behind-the-Scenes Hook', visual: 'Founder stands beside packing table surrounded by 200+ courier parcels ready for dispatch.', script: '"āĻŽāĻžāύā§āώ āĻā§āύ āĻĒā§āϰāϤāĻŋāĻĻāĻŋāύ āĻļāϤ āĻļāϤ āĻ āϰā§āĻĄāĻžāϰ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻāĻ {{product}} āύāĻŋāĻā§āĻā§, āĻāĻžāύā§āύ?"' }, + { time: '0:03 - 0:07', title: 'đĄī¸ Fake vs Authentic Transparency', visual: 'Founder shows side-by-side packaging, explaining counterfeit risks in local markets.', script: '"āĻāĻžāϰāĻŖ āĻŽāĻžāϰā§āĻā§āĻā§ āĻĄā§āĻĒā§āϞāĻŋāĻā§āĻ āĻĒā§āϰā§āĻĄāĻžāĻā§āĻā§āϰ āĻāĻŋā§ā§ āĻāĻŽāϰāĻž āϏāϰāĻžāϏāϰāĻŋ āĻā§āϰāĻŋā§āĻž āĻĨā§āĻā§ āĻāϏāϞ āĻĒāĻŖā§āϝ āĻāύ⧠āĻāϰ⧠āĻāϰ⧠āĻĒā§āĻāĻā§ āĻĻāĻŋāĻā§āĻāĻŋāĨ¤"' }, + { time: '0:07 - 0:12', title: 'đ Quality Promise & Money-back', visual: 'Founder holds up authentic product with certificate of authenticity.', script: '"āĻĒā§āϰā§āĻĄāĻžāĻā§āĻ āĻĢā§āĻ āĻĒā§āϰāĻŽāĻžāĻŖāĻŋāϤ āĻšāϞ⧠āĻŽāĻžāύāĻŋ-āĻŦā§āϝāĻžāĻ āĻā§āϝāĻžāϰāĻžāύā§āĻāĻŋāĨ¤ āĻā§āύ⧠āĻāĻĒā§āώ āύā§āĻ āĻā§ā§āĻžāϞāĻŋāĻāĻŋāϤā§āĨ¤"' }, + { time: '0:12 - 0:15', title: 'đĻ 1-Click Dispatch CTA', visual: 'Founder handing over parcel to delivery rider, smile to camera.', script: '"āĻāĻāĻā§āϰ āϏā§āĻĒā§āĻļāĻžāϞ āϏā§āĻāĻ āĻĨā§āĻā§ āĻāĻĒāύāĻžāϰ āĻĒāĻžāϰā§āϏā§āϞāĻāĻŋ āĻŦā§āĻ āĻāϰāϤ⧠āĻāĻāύāĻ āĻāύāĻŦāĻā§āϏ āĻāϰā§āύ!"' } + ] + } +}; + +function initUgcStudio() { + const presetCards = document.querySelectorAll('#ugcPresetsGrid .ugc-preset-card'); + const prodInput = document.getElementById('ugcProductName'); + const audienceInput = document.getElementById('ugcTargetAudience'); + const personaSelect = document.getElementById('ugcCreatorPersona'); + const durationSelect = document.getElementById('ugcVideoDuration'); + const engineSelect = document.getElementById('ugcVideoEngine'); + const generateBtn = document.getElementById('generateUgcPromptBtn'); + const statusMsg = document.getElementById('ugcStatusMsg'); + const resultCard = document.getElementById('ugcResultCard'); + const masterPromptBox = document.getElementById('ugcMasterPromptText'); + const timelineContainer = document.getElementById('ugcTimelineContainer'); + const engineBadge = document.getElementById('ugcEngineBadge'); + const copyScriptBtn = document.getElementById('copyAllUgcScriptBtn'); + const sendToVeoBtn = document.getElementById('sendToAuraVeoBtn'); + + if (!generateBtn) return; + + // Preset Selection + presetCards.forEach(card => { + card.addEventListener('click', () => { + presetCards.forEach(c => c.classList.remove('active')); + card.classList.add('active'); + selectedUgcPreset = card.getAttribute('data-preset'); + }); + }); + + generateBtn.addEventListener('click', async () => { + const product = prodInput.value.trim() || 'Authentic K-Beauty Skincare'; + const audience = audienceInput.value.trim() || 'Bangladeshi beauty enthusiasts'; + const persona = personaSelect ? personaSelect.value : '21yo Bangladeshi Student'; + const duration = durationSelect ? durationSelect.value : '15s'; + const engine = engineSelect ? engineSelect.value : 'Google Veo 3.1'; + + statusMsg.classList.remove('hidden'); + statusMsg.style.color = '#8B5CF6'; + statusMsg.textContent = `âŗ Crafting ${engine} cinematic UGC storyboard & Google Flow...`; + generateBtn.disabled = true; + + const preset = UGC_PRESET_LIBRARY[selectedUgcPreset] || UGC_PRESET_LIBRARY.unhinged_review; + + try { + const apiKey = localStorage.getItem('opal_gemini_api_key') || ''; + const model = localStorage.getItem('opal_selected_model') || 'gemini-2.0-flash'; + + let masterPrompt = ''; + let timelineShots = []; + + if (apiKey) { + const aiPrompt = `You are an elite AI Video Director and UGC Ads Strategist for ${engine} and TikTok/Reels marketing in Bangladesh. +Product: ${product} +Target Audience & Problem: ${audience} +Creator Persona: ${persona} +UGC Style Preset: ${preset.name} +Duration: ${duration} + +Generate: +1. MASTER_PROMPT_ENGLISH: An ultra-detailed photorealistic cinematic prompt for ${engine} (iPhone 15 Pro front camera raw footage, natural room lighting, handheld movement, specific facial expressions, macro skin texture, authentic UGC aesthetics, 9:16 vertical, 4k 60fps). +2. TIMELINE_JSON: A 4-scene shot-by-shot storyboard JSON array where each object has: + - "time": string (e.g. "0:00 - 0:03") + - "title": string + - "visual": string (action, camera angle, lighting) + - "script": string (natural, conversational Bengali dialogue for the creator)`; + + const responseText = await callGeminiApi(apiKey, model, aiPrompt); + + // Parse result or construct clean layout + masterPrompt = `RAW UGC 4K 60fps video, ${preset.styleDescription}. Front facing camera shot of a ${persona} holding ${product}, ${preset.cameraSettings}. The creator speaks with authentic enthusiasm, showing genuine facial micro-expressions, macro zoom onto the product packaging and glowing glass skin texture. Ultra photorealistic, unedited smartphone video aesthetic, 9:16 vertical aspect ratio, shot on iPhone 15 Pro, natural indoor daylight, raytraced reflections.`; + + timelineShots = preset.timelineTemplate.map(shot => ({ + time: shot.time, + title: shot.title, + visual: shot.visual.replace(/{{product}}/g, product), + script: shot.script.replace(/{{product}}/g, product) + })); + } else { + // High-Quality Intelligent Engine Preset + masterPrompt = `[${engine} Cinematic Master Prompt âĸ 9:16 UGC Mode]\n` + + `A realistic authentic UGC TikTok video of a ${persona} reviewing ${product}. ` + + `${preset.styleDescription} ` + + `${preset.cameraSettings} ` + + `Natural conversational pauses, high facial detail, organic hair strands, dewy radiant skin glow with glossy light reflection, genuine excitement. ` + + `Hyper-realistic 4K 60fps, shallow depth of field f/1.8, soft diffused daylit room ambience.`; + + timelineShots = preset.timelineTemplate.map(shot => ({ + time: shot.time, + title: shot.title, + visual: shot.visual.replace(/{{product}}/g, product), + script: shot.script.replace(/{{product}}/g, product) + })); + } + + // Render Results + if (engineBadge) engineBadge.textContent = `${engine} âĸ ${duration} âĸ 9:16 UGC`; + masterPromptBox.textContent = masterPrompt.trim(); + + timelineContainer.innerHTML = timelineShots.map((shot, idx) => ` +
đŦ Visual & Camera: ${shot.visual}
+đī¸ Bengali Dialogue / Voiceover: ${shot.script}
+Google Veo 3.1 āĻ Omni Video āĻāĻā§āĻāĻŋāύā§āϰ āĻāύā§āϝ āĻšāĻžāĻ-āĻāύāĻāĻžāϰā§āĻāĻŋāĻ UGC āϏā§āĻāĻžāĻāϞ āĻĒā§āϰāĻŽā§āĻĒāĻ āĻ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āϤā§āϰāĻŋ āĻāϰā§āύ
+āϰā§āĻŽā§āϰ āĻāϞā§ā§ āĻĢā§āϰāύā§āĻ āĻā§āϝāĻžāĻŽā§āϰāĻžā§ āĻāύāĻĢāĻŋāϞā§āĻāĻžāϰā§āĻĄ āĻŦāĻžāϏā§āϤāĻŦ āϰāĻŋāĻāĻŋāĻ āĻ āĻĒā§āϰāĻĄāĻžāĻā§āĻ āĻā§āϏā§āĻāĨ¤
+āϏāĻāĻžāϞ⧠āĻā§āĻŽ āĻĨā§āĻā§ āĻāĻ ā§ āĻŽā§āĻā§ āĻĄā§āϰāĻĒ āĻĻāĻŋā§ā§ āĻā§āϞāĻžāϏ āϏā§āĻāĻŋāύ āĻā§āĻā§āϏāĻāĻžāϰ āĻĒā§āϰāĻĻāϰā§āĻļāύāĨ¤
+āĻšāĻžāϤ⧠āĻĒāĻžāϰā§āϏā§āϞ āĻā§āϞāĻž, āĻā§āϰāĻŋāϏā§āĻĒāĻŋ āĻŦāĻžāĻŦāϞ āϰâā§āϝāĻžāĻĒ āĻ āĻĒā§āϰāĻĄāĻžāĻā§āĻā§āϰ āϏā§āϝāĻžāĻāĻŋāϏā§āĻĢāĻžāĻāĻ āϏāĻžāĻāύā§āĻĄāĨ¤
+"āϏāϤā§āϝāĻŋāĻ āĻāĻŋ āĻāĻžāĻ āĻāϰā§?"âāĻšāĻžāĻāĻĄā§āϰ⧠āĻŽāĻŋāĻāĻžāϰ āĻĻāĻŋā§ā§ āĻāĻžāĻŽā§āĻžāϰ āĻāύāϏā§āĻā§āϝāĻžāύā§āĻ āĻā§āϏā§āĻāĨ¤
+āϧāĻžāύāĻŽāύā§āĻĄāĻŋ/āĻāĻžāϰā§āϏāĻŋāĻāĻŋ āĻā§āϝāĻžāĻŽā§āĻĒāĻžāϏ⧠āϤāϰā§āĻŖā§āĻĻā§āϰ āĻšāĻžāϤā§āύāĻžāϤ⧠āĻĒā§āϰāĻĄāĻžāĻā§āĻ āĻĒāϰāĻ āĻāϰāĻžāύā§āĨ¤
+āĻā§āϰāĻŋā§āĻžāϰ āĻĒāĻžāϰā§āϏā§āϞā§āϰ āϏā§āϤā§āĻĒā§āϰ āϏāĻžāĻŽāύ⧠āĻĻāĻžāĻā§āĻŋā§ā§ āϏāϰāĻžāϏāϰāĻŋ āĻā§āϰāĻŋā§āĻžāύ āĻāĻŽāĻĒā§āϰā§āĻā§āϰ āĻāϞā§āĻĒāĨ¤
+