Hor / universal_prompt_builder_lite.index.html
zemi123's picture
Rename universal_prompt_builder_lite.html to universal_prompt_builder_lite.index.html
674b9dc verified
<!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();
// ortak positive
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"){
// HF Space tek alan → negatifleri göm
const withNeg = pos + " without face swap, without identity change, without distortions, without glitches.";
// Alternatif: --negative formatı
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,
// image_url: "https://... (buraya görsel linkini koy)",
// steps: 30, seed: 12345, guidance: 7.0
};
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>