// workflows/index.js — Dee Ferdinand Video Studio // Fixed: black frames, cutoff, timing gaps, exit animation ban, autoAlpha // Audio: no muted on video, research-backed data-volume levels // Music: ElevenLabs lo-fi upbeat (primary) → YuE (fallback) → silence const FONTS = ``; const GSAP = ``; const GRAIN = `
`; function mediaEl(m, start, dur, tIdx, vol) { if (!m) return '
'; if (m.mime?.startsWith('video/')) { // NO muted — subject voice must come through. Framework controls via data-volume. return `
`; } return `` ; } // ── TESTIMONIAL 30s 9:16 ────────────────────────────────────────────────────────── // Timing: each scene overlaps the previous by 0.35s (transition window) // Track indices: each scene on unique track, captions on unique tracks // NO exit animations (rule: transition IS the exit) const testimonial = { meta: { name: 'Corporate Testimonial', icon: '\uD83C\uDFE2', description: '30s kinetic testimonial. 9:16. ElevenLabs lo-fi music.', format: '9:16', duration: 30, music: 'lofi-upbeat' }, buildHTML(media, config, compId, w, h, dur) { const { clientName='AI Training', trainerName='Dee Ferdinand', tagline='AI Corporate Trainer', website='deeferdinand.com' } = config; const vids = media.filter(m => m.mime?.startsWith('video/')); const imgs = media.filter(m => m.mime?.startsWith('image/')); const pick = (i) => media[i % Math.max(media.length,1)] || media[0]; const img = (i) => imgs[i % Math.max(imgs.length,1)] || pick(i); const mVid = vids[0] || null; const yr = new Date().getFullYear(); // Strict scene timing: NO gaps, transitions overlap by 0.35s on DIFFERENT tracks // S1: 0-4s S2: 3.65-8s (T1 at 3.65) S3: 7.65-16.5s (T2 at 7.65) // S4a: 15.85-18.5s S4b: 18.2-21s S4c: 20.7-23.2s // S5: 22.85-28.5s (T3 at 22.85) S6: 28.2-30.5s // All captions on own tracks, gap from scene start: 0.2s return ` ${FONTS}${GSAP}
${mediaEl(img(0),0,4,1,0)}
Ini yang
terjadi
ketika tim belajar AI
${mediaEl(img(1),3.65,4,6,0)}
1,000+
profesional terlatih
sejak 2023
${clientName}
AI Training \u00b7 ${yr}
${mVid ? `
` : `${mediaEl(img(2),7.65,8.85,10,0)}`}
“Saya pikir AI susah.
Ternyata langsung bisa!”
${mediaEl(img(0),15.85,2.65,13,0)}
80%
hands-on
${mediaEl(img(1),18.2,2.8,16,0)}
Langsung
praktek
${mediaEl(img(2),20.7,2.5,19,0)}
Real
output \u2713
${mediaEl(img(0),22.85,5.65,22,0)}
Training AI
untuk tim kamu?
DM \u00b7 atau klik link di bio
${trainerName}
${tagline}
${website}
${GRAIN}
${trainerName} \u00b7 ${tagline}
`; }, }; const teaser = { meta: { name: 'Event Teaser', icon: '\u26A1', description: '30s fast-cut teaser. 9:16. ElevenLabs energetic.', format: '9:16', duration: 30, music: 'energetic' }, buildHTML(media, config, compId, w, h, dur) { return testimonial.buildHTML(media, config, compId, w, h, dur); }, }; const trailer = { meta: { name: 'Cinematic Trailer', icon: '\uD83C\uDFAC', description: '60s cinematic recap. 9:16.', format: '9:16', duration: 60, music: 'cinematic' }, buildHTML(media, config, compId, w, h, dur) { return testimonial.buildHTML(media, config, compId, w, h, dur); }, }; const community = { meta: { name: 'Community Story', icon: '\uD83E\uDD1D', description: '30s warm community story. 9:16.', format: '9:16', duration: 30, music: 'warm' }, buildHTML(media, config, compId, w, h, dur) { return testimonial.buildHTML(media, config, compId, w, h, dur); }, }; export const WORKFLOWS = { testimonial, teaser, trailer, community };