| <!doctype html> |
| <html lang="tr"> |
| <head> |
| <meta charset="utf-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| <title>Universal AI Video Prompt Builder (Lite – iPhone)</title> |
| <style> |
| body{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;max-width:920px;margin:24px auto;padding:0 14px;line-height:1.45} |
| h1{font-size:1.35rem;margin:0 0 10px} |
| .pill{display:inline-block;background:#eef2ff;color:#1e3a8a;border-radius:999px;padding:2px 8px;font-size:.8rem;margin-left:6px} |
| .card{border:1px solid #ddd;border-radius:12px;padding:14px;margin:12px 0;background:#fff} |
| label{display:block;font-weight:600;margin:10px 0 6px} |
| textarea,input,select,button{width:100%;font-size:16px;padding:10px;border:1px solid #cfcfcf;border-radius:10px;box-sizing:border-box} |
| textarea{min-height:90px} |
| .row{display:flex;gap:10px;flex-wrap:wrap} |
| .row>*{flex:1 1 280px} |
| .btn{background:#0b5cff;color:#fff;border:none;border-radius:10px;padding:12px 14px;font-weight:700;margin-top:10px} |
| .btn:active{opacity:.88} |
| .out{white-space:pre-wrap;background:#0b1220;color:#e9f0ff;border-radius:10px;padding:12px;font-family:ui-monospace, SFMono-Regular, Menlo, Consolas, monospace} |
| .copyWrap{position:relative} |
| .copyWrap button{position:absolute;right:8px;top:8px;width:auto;padding:6px 10px;border-radius:8px} |
| small{color:#666} |
| </style> |
| </head> |
| <body> |
| <h1>Universal AI Video Prompt Builder <span class="pill">iPhone – offline</span></h1> |
| <div class="card"> |
| Bu araç **herhangi bir AI video jeneratörü** için hızlı prompt paketleri üretir. Foto açıklamasını (Joy‑Caption/CLIP vb.) ve sahneni yaz; hedef platformu seç; tek dokunuşla **uyumlu** çıktı al. |
| </div> |
|
|
| <div class="card"> |
| <div class="row"> |
| <div> |
| <label>🎯 Hedef Platform</label> |
| <select id="target"> |
| <option value="litvideo">LitVideo 4.5 (Positive + Negative)</option> |
| <option value="wan_hf">WAN 2.1 – HuggingFace Space (tek alan)</option> |
| <option value="wan_api">WAN 2.1 – API JSON (prompt + negative_prompt)</option> |
| <option value="sdxl">Generic SD/SDXL Video (Positive + Negative)</option> |
| <option value="single">Tek‑prompt isteyen platformlar (Pika/Dream‑style)</option> |
| </select> |
| </div> |
| <div> |
| <label>Kalite</label> |
| <select id="quality"> |
| <option>High</option> |
| <option>Standard</option> |
| <option>Cinematic</option> |
| </select> |
| </div> |
| <div> |
| <label>Yüz Kilidi</label> |
| <select id="keep"> |
| <option selected>On</option> |
| <option>Off</option> |
| </select> |
| </div> |
| </div> |
|
|
| <label>📷 Fotoğraf Açıklaması (Joy‑Caption/CLIP çıktısı)</label> |
| <textarea id="caption" placeholder="a blonde woman in a black dress sitting at a wooden table, soft lighting, detailed face"></textarea> |
|
|
| <label>🎬 Sahne (ne olsun?)</label> |
| <textarea id="scene" placeholder="She stands up from the table and starts to dance with a lustful expression, fixed front camera"></textarea> |
|
|
| <button class="btn" id="build">PROMPT OLUŞTUR</button> |
| <small>İpucu: Yazmasan da kamera/ışık/motion otomatik tamamlanır.</small> |
| </div> |
|
|
| <div id="outputs"></div> |
|
|
| <script> |
| function hasAny(t, ws){t=(t||'').toLowerCase();return ws.some(w=>t.includes(w));} |
| function expandScene(t){ |
| t=(t||'').trim(); |
| if(!hasAny(t,["camera","shot","fixed","close-up","wide shot","zoom"])) t+=(t?', ':'')+"fixed front camera"; |
| if(!hasAny(t,["walk","dance","turn","look","stand","sit","run","pose","move"])) t+=", makes a subtle pose and gentle movement"; |
| if(!hasAny(t,["expression","mood","happy","sad","angry","lustful","romantic","playful","confident"])) t+=", with a natural, confident expression"; |
| if(!hasAny(t,["lighting","light","cinematic","ambient","noon","sunset","warm","low light"])) t+=", cinematic lighting"; |
| if(!t.toLowerCase().includes("smooth")) t+=", smooth natural motion"; |
| return t; |
| } |
| function qMap(q){return {Standard:"realistic", High:"highly detailed, realistic", Cinematic:"cinematic, highly detailed, realistic"}[q]||"realistic";} |
| function negList(){ |
| return "face swap, identity change, morphing, double face, misaligned face, deformed face, distorted eyes, bad anatomy, lowres, blurry, artifacts, glitch, extra limbs, duplicate heads, cartoon style"; |
| } |
| function copy(id){const el=document.getElementById(id);const r=document.createRange();r.selectNode(el);const s=window.getSelection();s.removeAllRanges();s.addRange(r);try{document.execCommand('copy');}catch(e){}s.removeAllRanges();} |
| |
| function renderBlock(title, id, content){ |
| return `<div class="card copyWrap"><label>${title}</label><button class="btn" onclick="copy('${id}')">Kopyala</button><div id="${id}" class="out">${content}</div></div>`; |
| } |
| |
| document.getElementById('build').addEventListener('click', () => { |
| const target = document.getElementById('target').value; |
| const quality = document.getElementById('quality').value; |
| const keep = document.getElementById('keep').value === 'On'; |
| const caption = (document.getElementById('caption').value || '').trim(); |
| const sceneRaw = (document.getElementById('scene').value || '').trim(); |
| const scene = expandScene(sceneRaw); |
| const q = qMap(quality); |
| const neg = negList(); |
| |
| |
| let pos = `${q}. From the given photo: ${caption}. Scene: ${scene}.`; |
| if(keep) pos += " keep original identity, keep original face, do not change face."; |
| pos += " stable composition, smooth animation."; |
| |
| let html = ""; |
| |
| if(target === "litvideo" || target === "sdxl"){ |
| html += renderBlock("✅ Positive Prompt", "out_pos", pos); |
| html += renderBlock("❌ Negative Prompt", "out_neg", neg); |
| } else if(target === "wan_hf"){ |
| |
| const withNeg = pos + " without face swap, without identity change, without distortions, without glitches."; |
| |
| const alt = pos + " --negative " + neg; |
| html += renderBlock("WAN 2.1 (HF Space) – Tek Prompt", "out_pos", withNeg); |
| html += renderBlock("Alternatif Söz Dizimi (bazı sürümler)", "out_alt", alt); |
| } else if(target === "wan_api"){ |
| const json = { |
| prompt: pos, |
| negative_prompt: neg, |
| |
| |
| }; |
| html += renderBlock("WAN 2.1 API – JSON Gövdesi", "out_json", JSON.stringify(json, null, 2)); |
| } else if(target === "single"){ |
| html += renderBlock("Tek Prompt (Pika/Dream‑style)", "out_single", pos); |
| } |
| |
| document.getElementById('outputs').innerHTML = html; |
| }); |
| </script> |
| </body> |
| </html> |
|
|