{"id":501,"date":"2026-05-17T22:20:26","date_gmt":"2026-05-17T22:20:26","guid":{"rendered":"https:\/\/focus360hub.com\/?page_id=501"},"modified":"2026-05-17T22:59:28","modified_gmt":"2026-05-17T22:59:28","slug":"promnt-generator","status":"publish","type":"page","link":"https:\/\/focus360hub.com\/es\/promnt-generator\/","title":{"rendered":"promnt generator"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"501\" class=\"elementor elementor-501\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-298e102 e-flex e-con-boxed e-con e-parent\" data-id=\"298e102\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e7343a3 elementor-widget elementor-widget-html\" data-id=\"e7343a3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"es\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n<title>PromptCraft \u2014 Focus360Hub<\/title>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Montserrat:wght@300;400;600;700;900&family=DM+Mono:wght@300;400&display=swap\" rel=\"stylesheet\">\r\n<style>\r\n:root{\r\n  --ink:#ffffff;\r\n  --paper:#0a0a0a;\r\n  --accent:#f5c518;\r\n  --accent2:#ffd700;\r\n  --muted:#888888;\r\n  --border:#2a2a2a;\r\n  --card:#111111;\r\n  --dark:#050505;\r\n  --code:#f5c518;\r\n  --header-bg:#0d0d0d;\r\n}\r\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\r\nbody{font-family:'Montserrat',sans-serif;background:var(--paper);color:var(--ink);min-height:100vh}\r\nbody::before{content:'';position:fixed;inset:0;background:radial-gradient(ellipse at 20% 50%, rgba(230,48,48,0.04) 0%, transparent 60%), radial-gradient(ellipse at 80% 20%, rgba(255,107,53,0.03) 0%, transparent 50%);pointer-events:none;z-index:0}\r\n\r\nheader{border-bottom:1px solid var(--border);padding:1.2rem 3rem;display:flex;align-items:center;gap:1.5rem;background:var(--header-bg);position:sticky;top:0;z-index:100}\r\n.logo{font-family:'Montserrat',sans-serif;font-size:1.6rem;letter-spacing:.08em;color:#fff;line-height:1;font-weight:900;text-transform:uppercase}\r\n.logo span{color:var(--accent)}\r\n.tagline{font-family:'DM Mono',monospace;font-size:.58rem;color:var(--muted);letter-spacing:.15em;text-transform:uppercase;border-left:1px solid var(--border);padding-left:1.5rem}\r\n.by-line{font-family:'DM Mono',monospace;font-size:.58rem;color:var(--accent);letter-spacing:.1em;text-transform:uppercase;margin-left:auto;white-space:nowrap}\r\n\r\nmain{max-width:1100px;margin:0 auto;padding:3rem 2rem 5rem;position:relative;z-index:1}\r\n\r\n.hero{text-align:center;padding:2.5rem 0 3rem;border-bottom:1px solid var(--border);margin-bottom:2.5rem}\r\n.hero h1{font-size:clamp(2rem,5vw,3.5rem);font-weight:900;line-height:1.05;margin-bottom:.8rem;text-transform:uppercase;letter-spacing:-.01em}\r\n.hero h1 em{font-style:normal;color:var(--accent)}\r\n.hero p{font-size:1rem;color:var(--muted);max-width:480px;margin:0 auto;line-height:1.7;font-weight:300}\r\n\r\n\/* API KEY BANNER *\/\r\n\r\n\r\n\/* UPLOAD *\/\r\n.sec-head{margin-bottom:1.2rem}\r\n.sec-head-title{font-size:1.1rem;font-weight:700;margin-bottom:.2rem;text-transform:uppercase;letter-spacing:.05em}\r\n.sec-head-sub{font-family:'DM Mono',monospace;font-size:.6rem;color:var(--muted);letter-spacing:.08em}\r\n\r\n.upload-grid{display:grid;grid-template-columns:1fr 1fr;gap:1.5rem;margin-bottom:1.2rem}\r\n\r\n.uzone{border:1.5px dashed var(--border);background:var(--card);min-height:210px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.65rem;cursor:pointer;transition:border-color .2s,background .2s;position:relative;text-align:center;padding:2rem 1.5rem;overflow:hidden}\r\n.uzone:hover,.uzone.drag-over{border-color:var(--accent);background:rgba(230,48,48,.04)}\r\n.uzone.has-img{border-style:solid;border-color:var(--accent);padding:0}\r\n.uzone input[type=file]{position:absolute;inset:0;opacity:0;cursor:pointer;z-index:2}\r\n\r\n.ubadge{font-family:'DM Mono',monospace;font-size:.52rem;letter-spacing:.15em;text-transform:uppercase;padding:.22rem .65rem;border:1px solid;position:absolute;top:.7rem;left:.7rem;z-index:3;pointer-events:none}\r\n.ubadge.p1{background:var(--accent);color:#000;border-color:var(--accent)}\r\n.ubadge.p2{background:#1a1a1a;color:var(--accent);border-color:var(--accent)}\r\n\r\n.uico{font-size:1.8rem;opacity:.2}\r\n.utitle{font-family:'Montserrat',sans-serif;font-size:.85rem;letter-spacing:.1em;color:#fff;font-weight:700;text-transform:uppercase}\r\n.usub{font-family:'DM Mono',monospace;font-size:.55rem;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}\r\n\r\n.uprev{width:100%;height:100%;min-height:210px;object-fit:cover;display:block}\r\n.uremove{position:absolute;top:.55rem;right:.55rem;z-index:5;background:rgba(0,0,0,.85);color:#fff;border:none;width:26px;height:26px;cursor:pointer;font-size:.8rem;display:flex;align-items:center;justify-content:center;transition:background .15s}\r\n.uremove:hover{background:var(--accent)}\r\n\r\n\/* ANALYZE BTN *\/\r\n.btn-analyze{width:100%;padding:.85rem 1.5rem;background:transparent;border:1px solid var(--accent);color:var(--accent);font-family:'DM Mono',monospace;font-size:.68rem;letter-spacing:.15em;text-transform:uppercase;cursor:pointer;transition:all .2s;margin-bottom:1.2rem;display:flex;align-items:center;justify-content:center;gap:.6rem;font-weight:600}\r\n.btn-analyze:hover:not(:disabled){background:var(--accent);color:#000}\r\n.btn-analyze:disabled{opacity:.25;cursor:not-allowed}\r\n.btn-analyze.busy{opacity:.6;cursor:wait}\r\n.spin{display:inline-block}\r\n.btn-analyze.busy .spin{animation:spin .8s linear infinite}\r\n@keyframes spin{to{transform:rotate(360deg)}}\r\n\r\n.statusbar{font-family:'DM Mono',monospace;font-size:.63rem;letter-spacing:.08em;text-align:center;padding:.6rem 1rem;margin-bottom:1.5rem;display:none}\r\n.statusbar.working{display:block;color:var(--accent2);background:rgba(255,107,53,.08);border:1px solid rgba(255,107,53,.25)}\r\n.statusbar.ok{display:block;color:#5cb85c;background:rgba(92,184,92,.08);border:1px solid rgba(92,184,92,.25)}\r\n.statusbar.err{display:block;color:var(--accent);background:rgba(230,48,48,.08);border:1px solid rgba(230,48,48,.3)}\r\n\r\n\/* FORM *\/\r\n.fgrid{display:grid;grid-template-columns:1fr 1fr;gap:1.5rem;margin-bottom:2rem}\r\n.card{background:var(--card);border:1px solid var(--border);padding:1.8rem;position:relative}\r\n.card::before{content:'';position:absolute;top:0;left:0;width:3px;height:100%;background:linear-gradient(to bottom,var(--accent),transparent)}\r\n.clabel{font-family:'DM Mono',monospace;font-size:.58rem;letter-spacing:.2em;text-transform:uppercase;color:var(--accent);margin-bottom:.55rem;display:flex;align-items:center;gap:.5rem}\r\n.clabel::after{content:'';flex:1;height:1px;background:var(--border)}\r\n.ctitle{font-size:1.1rem;font-weight:700;margin-bottom:1.3rem;text-transform:uppercase;letter-spacing:.04em}\r\n\r\nlabel{display:block;font-family:'DM Mono',monospace;font-size:.62rem;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);margin-bottom:.4rem;margin-top:1rem}\r\nlabel:first-of-type{margin-top:0}\r\n\r\ninput[type=text],textarea,select{width:100%;background:#1a1a1a;border:1px solid var(--border);color:#ddd;font-family:'Montserrat',sans-serif;font-size:.9rem;padding:.6rem .85rem;outline:none;transition:border-color .2s,box-shadow .2s;appearance:none}\r\ninput:focus,textarea:focus,select:focus{border-color:var(--accent);box-shadow:0 0 0 2px rgba(230,48,48,.12)}\r\ntextarea{resize:vertical;min-height:78px;line-height:1.6}\r\nselect{background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23888'\/%3E%3C\/svg%3E\");background-repeat:no-repeat;background-position:right .85rem center;padding-right:2rem;cursor:pointer;background-color:#1a1a1a}\r\ninput::placeholder,textarea::placeholder{color:#444}\r\n\r\n.chips{display:flex;flex-wrap:wrap;gap:.45rem;margin-top:.4rem}\r\n.chip{font-family:'DM Mono',monospace;font-size:.6rem;letter-spacing:.07em;padding:.32rem .8rem;border:1px solid var(--border);background:transparent;color:var(--muted);cursor:pointer;transition:all .15s;user-select:none}\r\n.chip:hover{border-color:var(--accent);color:var(--accent)}\r\n.chip.on{background:var(--accent);border-color:var(--accent);color:#000;font-weight:700}\r\n\r\n.full{grid-column:1\/-1}\r\n.tip{font-size:.8rem;color:var(--muted);font-style:italic;line-height:1.6;margin-top:.8rem;padding-left:.75rem;border-left:2px solid var(--border)}\r\n\r\n\/* GENERATE *\/\r\n.btn-gen{width:100%;padding:1.1rem 2rem;background:var(--accent);color:#000;font-family:'Montserrat',sans-serif;font-size:1.1rem;letter-spacing:.2em;border:none;cursor:pointer;transition:all .25s;display:flex;align-items:center;justify-content:center;gap:.8rem;position:relative;overflow:hidden;font-weight:900;text-transform:uppercase}\r\n.btn-gen::before{content:'';position:absolute;inset:0;background:linear-gradient(135deg,rgba(255,255,255,.2) 0%,transparent 60%);opacity:0;transition:opacity .3s}\r\n.btn-gen:hover::before{opacity:1}\r\n.btn-gen:hover{transform:translateY(-2px);box-shadow:0 8px 30px rgba(245,197,24,.35)}\r\n.gico{font-size:1.1rem}\r\n.btn-gen.busy .gico{animation:spin .8s linear infinite}\r\n\r\n\/* OUTPUT *\/\r\n.output{margin-top:2.5rem;opacity:0;transform:translateY(14px);transition:all .45s cubic-bezier(.22,1,.36,1);pointer-events:none}\r\n.output.show{opacity:1;transform:translateY(0);pointer-events:all}\r\n.ornament{text-align:center;color:var(--accent);font-size:1.1rem;letter-spacing:.8em;margin:2.5rem 0;opacity:.4}\r\n.out-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1rem;padding-bottom:.75rem;border-bottom:1px solid var(--border);flex-wrap:wrap;gap:.5rem}\r\n.out-title{font-family:'DM Mono',monospace;font-size:.68rem;letter-spacing:.15em;text-transform:uppercase;color:var(--muted)}\r\n.copy-row{display:flex;gap:.5rem;flex-wrap:wrap}\r\n.btn-copy{font-family:'DM Mono',monospace;font-size:.6rem;letter-spacing:.1em;text-transform:uppercase;padding:.38rem .9rem;border:1px solid var(--border);background:transparent;color:var(--muted);cursor:pointer;transition:all .15s}\r\n.btn-copy:hover{border-color:var(--accent);color:var(--accent)}\r\n.btn-copy.copied{border-color:#5cb85c;color:#5cb85c}\r\n.prompt-box{background:var(--dark);padding:1.8rem;border-left:3px solid var(--accent)}\r\n.prompt-text{font-family:'DM Mono',monospace;font-size:.76rem;line-height:1.9;color:var(--code);white-space:pre-wrap;word-break:break-word}\r\n.neg-box{background:var(--dark);border-left:3px solid #444;padding:1.1rem 1.8rem;margin-top:1rem}\r\n.neg-label{font-family:'DM Mono',monospace;font-size:.58rem;letter-spacing:.15em;color:#666;text-transform:uppercase;margin-bottom:.45rem}\r\n.neg-text{font-family:'DM Mono',monospace;font-size:.7rem;color:#666;line-height:1.7;word-break:break-word}\r\n.params{display:flex;flex-wrap:wrap;gap:.45rem;margin-top:1rem;padding:1rem 1.3rem;background:var(--card);border:1px solid var(--border)}\r\n.ptag{font-family:'DM Mono',monospace;font-size:.6rem;color:var(--muted);background:#1a1a1a;border:1px solid var(--border);padding:.22rem .65rem}\r\n.ptag strong{color:#ccc}\r\n\r\n@media(max-width:720px){\r\n  header{padding:1rem;flex-wrap:wrap;gap:.8rem}\r\n  .by-line{margin-left:0;width:100%}\r\n  main{padding:1.5rem 1rem 4rem}\r\n  .upload-grid,.fgrid{grid-template-columns:1fr}\r\n  .out-header{flex-direction:column;align-items:flex-start}\r\n}\r\n<\/style>\r\n<\/head>\r\n<body>\r\n\r\n<header>\r\n  <div class=\"logo\">Prompt<span>Craft<\/span><\/div>\r\n  <div class=\"tagline\">Generador de prompts hiperrealistas \u00b7 IA de imagen<\/div>\r\n  <div class=\"by-line\">By Ing. Fredy Landa &nbsp;\u00b7&nbsp; @focus360hub<\/div>\r\n<\/header>\r\n\r\n<main>\r\n\r\n  <div class=\"hero\">\r\n    <h1>Recrea personas con<br><em>fidelidad absoluta<\/em><\/h1>\r\n    <p>Sube las fotos de referencia, la IA analiza los rasgos y genera el prompt perfecto para Midjourney, Stable Diffusion y m\u00e1s.<\/p>\r\n  <\/div>\r\n\r\n\r\n\r\n  <!-- \u2550\u2550 UPLOAD \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n  <div class=\"sec-head\">\r\n    <div class=\"sec-head-title\">Im\u00e1genes de referencia<\/div>\r\n    <div class=\"sec-head-sub\">Carga una o ambas \u00b7 La IA lee las fotos y rellena los campos autom\u00e1ticamente<\/div>\r\n  <\/div>\r\n\r\n  <div class=\"upload-grid\">\r\n    <div class=\"uzone\" id=\"zone-persona\"\r\n         ondragover=\"onDrag(event,'persona')\" ondragleave=\"offDrag(event,'persona')\" ondrop=\"onDrop(event,'persona')\">\r\n      <div class=\"ubadge p1\">01 \u00b7 Persona de referencia<\/div>\r\n      <input type=\"file\" id=\"file-persona\" accept=\"image\/*\" onchange=\"onFile(event,'persona')\">\r\n      <div class=\"uico\">\u25c8<\/div>\r\n      <div class=\"utitle\">Foto de la persona<\/div>\r\n      <div class=\"usub\">Rostro y cuerpo a preservar \u00b7 JPG PNG WEBP<\/div>\r\n    <\/div>\r\n    <div class=\"uzone\" id=\"zone-pose\"\r\n         ondragover=\"onDrag(event,'pose')\" ondragleave=\"offDrag(event,'pose')\" ondrop=\"onDrop(event,'pose')\">\r\n      <div class=\"ubadge p2\">02 \u00b7 Pose \/ Estilo<\/div>\r\n      <input type=\"file\" id=\"file-pose\" accept=\"image\/*\" onchange=\"onFile(event,'pose')\">\r\n      <div class=\"uico\">\u25c7<\/div>\r\n      <div class=\"utitle\">Foto de pose o estilo<\/div>\r\n      <div class=\"usub\">Posici\u00f3n, vestimenta o ambiente \u00b7 JPG PNG WEBP<\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <button class=\"btn-analyze\" id=\"btn-analyze\" onclick=\"analyzeImages()\" disabled>\r\n    <span class=\"spin\">\u2726<\/span>\r\n    Analizar im\u00e1genes con IA y rellenar campos autom\u00e1ticamente\r\n  <\/button>\r\n  <div class=\"statusbar\" id=\"statusbar\"><\/div>\r\n\r\n  <!-- \u2550\u2550 FORM \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n  <div class=\"fgrid\">\r\n\r\n    <div class=\"card\">\r\n      <div class=\"clabel\">01 \u00b7 Persona<\/div>\r\n      <div class=\"ctitle\">Rasgos de la persona<\/div>\r\n      <label>Rasgos faciales<\/label>\r\n      <textarea id=\"face-traits\" placeholder=\"Ojos almendrados color miel, p\u00f3mulos altos, nariz peque\u00f1a recta, labios carnosos, cejas arqueadas gruesas...\"><\/textarea>\r\n      <label>Rasgos corporales \/ complexi\u00f3n<\/label>\r\n      <textarea id=\"body-traits\" placeholder=\"Complexi\u00f3n atl\u00e9tica, hombros anchos, piel morena dorada, cabello largo negro lacio...\"><\/textarea>\r\n      <label>Edad aproximada<\/label>\r\n      <input type=\"text\" id=\"age\" placeholder=\"Ej: 28 a\u00f1os, adulto joven\">\r\n      <label>Etnia \/ tono de piel<\/label>\r\n      <input type=\"text\" id=\"ethnicity\" placeholder=\"Latina, mediterr\u00e1neo, afrodescendiente...\">\r\n    <\/div>\r\n\r\n    <div class=\"card\">\r\n      <div class=\"clabel\">02 \u00b7 Pose y escena<\/div>\r\n      <div class=\"ctitle\">Composici\u00f3n y ambiente<\/div>\r\n      <label>Pose o acci\u00f3n<\/label>\r\n      <textarea id=\"pose\" placeholder=\"De pie con manos en bolsillos mirando a c\u00e1mara, sentada con expresi\u00f3n seria...\"><\/textarea>\r\n      <label>Locaci\u00f3n \/ entorno<\/label>\r\n      <input type=\"text\" id=\"location\" placeholder=\"Azotea urbana al atardecer, caf\u00e9 parisino...\">\r\n      <label>Encuadre de c\u00e1mara<\/label>\r\n      <select id=\"framing\">\r\n        <option value=\"\">\u2014 seleccionar \u2014<\/option>\r\n        <option value=\"portrait, face close-up, extreme facial detail\">Primer plano (rostro)<\/option>\r\n        <option value=\"half-body shot, waist up\">Plano medio<\/option>\r\n        <option value=\"three-quarter shot\">Tres cuartos<\/option>\r\n        <option value=\"full body shot, head to toe\">Cuerpo completo<\/option>\r\n        <option value=\"editorial full body, environmental portrait\">Editorial cuerpo completo<\/option>\r\n      <\/select>\r\n      <label>Vestimenta<\/label>\r\n      <input type=\"text\" id=\"outfit\" placeholder=\"Vestido negro elegante, jeans y camisa blanca...\">\r\n      <label>Accesorios \/ detalles<\/label>\r\n      <input type=\"text\" id=\"extras\" placeholder=\"Aretes dorados, gafas de sol, tatuaje en brazo...\">\r\n    <\/div>\r\n\r\n    <div class=\"card\">\r\n      <div class=\"clabel\">03 \u00b7 Estilo visual<\/div>\r\n      <div class=\"ctitle\">Fotograf\u00eda y acabado<\/div>\r\n      <label>Estilo fotogr\u00e1fico<\/label>\r\n      <div class=\"chips\" id=\"photo-style\">\r\n        <div class=\"chip\" data-val=\"editorial fashion photography\">Editorial fashion<\/div>\r\n        <div class=\"chip\" data-val=\"documentary street photography\">Street \/ documental<\/div>\r\n        <div class=\"chip\" data-val=\"high-fashion luxury campaign\">High fashion<\/div>\r\n        <div class=\"chip\" data-val=\"cinematic film still\">Cinematogr\u00e1fico<\/div>\r\n        <div class=\"chip\" data-val=\"sports photography dynamic\">Deportivo<\/div>\r\n        <div class=\"chip\" data-val=\"boudoir intimate portrait\">Boudoir \/ \u00edntimo<\/div>\r\n        <div class=\"chip\" data-val=\"commercial advertising photography\">Publicitario<\/div>\r\n        <div class=\"chip\" data-val=\"fine art portrait\">Fine art<\/div>\r\n      <\/div>\r\n      <label>Iluminaci\u00f3n<\/label>\r\n      <div class=\"chips\" id=\"lighting\">\r\n        <div class=\"chip\" data-val=\"natural golden hour sunlight, soft warm backlight\">Hora dorada<\/div>\r\n        <div class=\"chip\" data-val=\"professional studio lighting, Rembrandt setup\">Estudio Rembrandt<\/div>\r\n        <div class=\"chip\" data-val=\"hard dramatic chiaroscuro lighting, deep shadows\">Chiaroscuro<\/div>\r\n        <div class=\"chip\" data-val=\"soft diffused overcast natural light\">Luz natural difusa<\/div>\r\n        <div class=\"chip\" data-val=\"neon colored ambient light, night scene\">Ne\u00f3n nocturno<\/div>\r\n        <div class=\"chip\" data-val=\"high key bright even lighting\">High key<\/div>\r\n        <div class=\"chip\" data-val=\"moody low key cinematic light\">Low key mood<\/div>\r\n      <\/div>\r\n      <label>Paleta de color<\/label>\r\n      <div class=\"chips\" id=\"palette\">\r\n        <div class=\"chip\" data-val=\"warm golden tones, amber and sienna\">C\u00e1lida dorada<\/div>\r\n        <div class=\"chip\" data-val=\"cool desaturated tones, silver and slate\">Fr\u00eda desaturada<\/div>\r\n        <div class=\"chip\" data-val=\"high contrast black and white\">B&amp;N<\/div>\r\n        <div class=\"chip\" data-val=\"rich vivid saturated colors\">Saturada v\u00edvida<\/div>\r\n        <div class=\"chip\" data-val=\"muted earthy tones, film grain\">Muted terrosa<\/div>\r\n        <div class=\"chip\" data-val=\"monochromatic sepia vintage\">Sepia vintage<\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"card\">\r\n      <div class=\"clabel\">04 \u00b7 T\u00e9cnica<\/div>\r\n      <div class=\"ctitle\">C\u00e1mara y par\u00e1metros<\/div>\r\n      <label>C\u00e1mara \/ lente<\/label>\r\n      <div class=\"chips\" id=\"camera\">\r\n        <div class=\"chip on\" data-val=\"shot on Sony A7R V, 85mm f\/1.4 lens\">Sony A7R V \u00b7 85mm<\/div>\r\n        <div class=\"chip\" data-val=\"shot on Hasselblad H6D, 80mm f\/2.8\">Hasselblad H6D<\/div>\r\n        <div class=\"chip\" data-val=\"shot on Canon EOS R5, 135mm f\/2L\">Canon R5 \u00b7 135mm<\/div>\r\n        <div class=\"chip\" data-val=\"shot on Nikon Z9, 70-200mm telephoto\">Nikon Z9 \u00b7 200mm<\/div>\r\n        <div class=\"chip\" data-val=\"shot on Leica M11, 50mm Summilux f\/1.4\">Leica M11 \u00b7 50mm<\/div>\r\n        <div class=\"chip\" data-val=\"shot on Phase One XF, 110mm f\/2.8\">Phase One XF<\/div>\r\n      <\/div>\r\n      <label>Profundidad de campo<\/label>\r\n      <div class=\"chips\" id=\"dof\">\r\n        <div class=\"chip on\" data-val=\"extremely shallow depth of field, creamy bokeh, subject razor sharp\">Bokeh extremo<\/div>\r\n        <div class=\"chip\" data-val=\"medium depth of field, slightly blurred background\">Bokeh moderado<\/div>\r\n        <div class=\"chip\" data-val=\"deep focus, sharp foreground and background\">Todo enfocado<\/div>\r\n      <\/div>\r\n      <label>Calidad \/ postproceso<\/label>\r\n      <div class=\"chips\" id=\"quality\">\r\n        <div class=\"chip on\" data-val=\"ultra-high resolution, 8K detail\">8K ultra-res<\/div>\r\n        <div class=\"chip\" data-val=\"medium format film grain, analog texture\">Film grain anal\u00f3gico<\/div>\r\n        <div class=\"chip\" data-val=\"RAW unedited natural look\">RAW natural<\/div>\r\n        <div class=\"chip\" data-val=\"high-end retouching, magazine ready\">Retoque editorial<\/div>\r\n        <div class=\"chip\" data-val=\"HDR, extreme dynamic range\">HDR extremo<\/div>\r\n      <\/div>\r\n      <p class=\"tip\">Cuantos m\u00e1s rasgos espec\u00edficos, mayor fidelidad al resultado.<\/p>\r\n    <\/div>\r\n\r\n    <div class=\"card full\">\r\n      <div class=\"clabel\">05 \u00b7 Plataforma<\/div>\r\n      <div class=\"ctitle\">\u00bfPara qu\u00e9 herramienta AI?<\/div>\r\n      <div class=\"chips\" id=\"platform\">\r\n        <div class=\"chip on\" data-val=\"midjourney\">Midjourney<\/div>\r\n        <div class=\"chip\" data-val=\"stable-diffusion\">Stable Diffusion<\/div>\r\n        <div class=\"chip\" data-val=\"dalle3\">DALL\u00b7E 3<\/div>\r\n        <div class=\"chip\" data-val=\"flux\">Flux<\/div>\r\n        <div class=\"chip\" data-val=\"firefly\">Adobe Firefly<\/div>\r\n        <div class=\"chip\" data-val=\"ideogram\">Ideogram<\/div>\r\n        <div class=\"chip\" data-val=\"nano-banana-2\">\ud83c\udf4c Nano Banana 2<\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n  <\/div>\r\n\r\n  <button class=\"btn-gen\" id=\"btn-gen\" onclick=\"generatePrompt()\">\r\n    <span class=\"gico\">\u2726<\/span>\r\n    Generar Prompt\r\n  <\/button>\r\n\r\n  <!-- \u2550\u2550 OUTPUT \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n  <div class=\"output\" id=\"output\">\r\n    <div class=\"ornament\">\u00b7 \u00b7 \u00b7<\/div>\r\n    <div class=\"out-header\">\r\n      <div class=\"out-title\">\u2726 Prompt generado<\/div>\r\n      <div class=\"copy-row\">\r\n        <button class=\"btn-copy\" id=\"cp1\" onclick=\"doCopy('prompt-text','cp1','Copiar prompt')\">Copiar prompt<\/button>\r\n        <button class=\"btn-copy\" id=\"cp2\" onclick=\"doCopy('neg-text','cp2','Copiar negativo')\">Copiar negativo<\/button>\r\n        <button class=\"btn-copy\" id=\"cp3\" onclick=\"copyAll()\">Copiar todo<\/button>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"prompt-box\"><div class=\"prompt-text\" id=\"prompt-text\"><\/div><\/div>\r\n    <div class=\"neg-box\">\r\n      <div class=\"neg-label\">\u2296 Prompt negativo<\/div>\r\n      <div class=\"neg-text\" id=\"neg-text\"><\/div>\r\n    <\/div>\r\n    <div class=\"params\" id=\"params\"><\/div>\r\n  <\/div>\r\n\r\n<\/main>\r\n\r\n<script>\r\n\/\/ \u2500\u2500 Estado \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nconst imgs = { persona: null, pose: null };\r\nconst apiKey = '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';\r\n\r\n\/\/ \u2500\u2500 Inicio \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nwindow.addEventListener('DOMContentLoaded', () => {\r\n  \/\/ Chips toggle\r\n  document.querySelectorAll('.chips').forEach(group => {\r\n    const multi = ['photo-style', 'quality'].includes(group.id);\r\n    group.querySelectorAll('.chip').forEach(chip => {\r\n      chip.addEventListener('click', () => {\r\n        if (!multi) group.querySelectorAll('.chip').forEach(c => c.classList.remove('on'));\r\n        chip.classList.toggle('on');\r\n      });\r\n    });\r\n  });\r\n});\r\n\r\n\/\/ \u2500\u2500 Upload \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction onDrag(e, t)  { e.preventDefault(); document.getElementById('zone-'+t).classList.add('drag-over'); }\r\nfunction offDrag(e, t) { document.getElementById('zone-'+t).classList.remove('drag-over'); }\r\nfunction onDrop(e, t)  { e.preventDefault(); offDrag(e,t); const f=e.dataTransfer.files[0]; if(f&&f.type.startsWith('image\/')) readImg(f,t); }\r\nfunction onFile(e, t)  { const f=e.target.files[0]; if(f) readImg(f,t); }\r\n\r\nfunction readImg(file, type) {\r\n  const reader = new FileReader();\r\n  reader.onload = ev => {\r\n    const original = ev.target.result;\r\n    \/\/ Compress to stay under 4MB (API limit is 5MB, we target 4MB to be safe)\r\n    compressImage(original, 4 * 1024 * 1024, (compressed) => {\r\n      imgs[type] = compressed;\r\n      showPreview(type, compressed);\r\n      checkBtn();\r\n    });\r\n  };\r\n  reader.readAsDataURL(file);\r\n}\r\n\r\nfunction compressImage(dataUrl, maxBytes, callback) {\r\n  const img = new Image();\r\n  img.onload = () => {\r\n    let quality = 0.92;\r\n    let scale   = 1.0;\r\n    \/\/ If image is very large, scale down first\r\n    const MAX_DIM = 1920;\r\n    if (img.width > MAX_DIM || img.height > MAX_DIM) {\r\n      scale = Math.min(MAX_DIM \/ img.width, MAX_DIM \/ img.height);\r\n    }\r\n    const canvas = document.createElement('canvas');\r\n    canvas.width  = Math.round(img.width  * scale);\r\n    canvas.height = Math.round(img.height * scale);\r\n    const ctx = canvas.getContext('2d');\r\n\r\n    function tryCompress() {\r\n      ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n      ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\r\n      const result = canvas.toDataURL('image\/jpeg', quality);\r\n      \/\/ Estimate byte size of base64 payload\r\n      const b64 = result.split(',')[1];\r\n      const bytes = Math.ceil(b64.length * 0.75);\r\n      if (bytes <= maxBytes || quality <= 0.3) {\r\n        callback(result);\r\n      } else {\r\n        \/\/ Reduce quality or scale and retry\r\n        if (quality > 0.5) {\r\n          quality -= 0.1;\r\n        } else {\r\n          scale *= 0.8;\r\n          canvas.width  = Math.round(img.width  * scale);\r\n          canvas.height = Math.round(img.height * scale);\r\n          quality = 0.7;\r\n        }\r\n        tryCompress();\r\n      }\r\n    }\r\n    tryCompress();\r\n  };\r\n  img.src = dataUrl;\r\n}\r\n\r\nfunction showPreview(type, src) {\r\n  const z = document.getElementById('zone-'+type);\r\n  z.classList.add('has-img');\r\n  z.querySelectorAll('.uico,.utitle,.usub').forEach(el => el.style.display='none');\r\n  z.querySelector('.uprev')?.remove();\r\n  z.querySelector('.uremove')?.remove();\r\n  const img = document.createElement('img'); img.className='uprev'; img.src=src; z.appendChild(img);\r\n  const btn = document.createElement('button'); btn.className='uremove'; btn.innerHTML='\u2715';\r\n  btn.onclick = e => { e.stopPropagation(); removeImg(type); }; z.appendChild(btn);\r\n  z.querySelector('input[type=file]').style.zIndex='1';\r\n}\r\n\r\nfunction removeImg(type) {\r\n  imgs[type] = null;\r\n  const z = document.getElementById('zone-'+type);\r\n  z.classList.remove('has-img');\r\n  z.querySelector('.uprev')?.remove();\r\n  z.querySelector('.uremove')?.remove();\r\n  z.querySelectorAll('.uico,.utitle,.usub').forEach(el => el.style.display='');\r\n  const inp = z.querySelector('input[type=file]'); inp.value=''; inp.style.zIndex='2';\r\n  checkBtn(); setStatus('','');\r\n}\r\n\r\nfunction checkBtn() {\r\n  document.getElementById('btn-analyze').disabled = !imgs.persona && !imgs.pose;\r\n}\r\n\r\n\/\/ \u2500\u2500 Status \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction setStatus(msg, type) {\r\n  const el = document.getElementById('statusbar');\r\n  el.textContent = msg;\r\n  el.className = 'statusbar' + (type ? ' '+type : '');\r\n}\r\n\r\n\/\/ \u2500\u2500 Analizar con IA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nasync function analyzeImages() {\r\n  const btn = document.getElementById('btn-analyze');\r\n  btn.disabled=true; btn.classList.add('busy');\r\n  btn.querySelector('.spin').textContent='\u27f3';\r\n  setStatus('\u27f3  Analizando im\u00e1genes con IA\u2026', 'working');\r\n\r\n  try {\r\n    const content = [];\r\n\r\n    if (imgs.persona) {\r\n      const [hdr,b64] = imgs.persona.split(',');\r\n      content.push({ type:'image', source:{ type:'base64', media_type:hdr.match(\/:(.*?);\/)[1], data:b64 }});\r\n      content.push({ type:'text', text:'IMAGEN 1: Persona de referencia. Describe sus rasgos para preservarlos exactamente.' });\r\n    }\r\n    if (imgs.pose) {\r\n      const [hdr,b64] = imgs.pose.split(',');\r\n      content.push({ type:'image', source:{ type:'base64', media_type:hdr.match(\/:(.*?);\/)[1], data:b64 }});\r\n      content.push({ type:'text', text:'IMAGEN 2: Referencia de pose y estilo a recrear.' });\r\n    }\r\n\r\n    content.push({ type:'text', text:`Analiza las im\u00e1genes y extrae informaci\u00f3n detallada.\r\nResponde \u00daNICAMENTE con un objeto JSON v\u00e1lido. Sin backticks, sin texto extra. Esquema exacto:\r\n{\"faceTraits\":\"...\",\"bodyTraits\":\"...\",\"age\":\"...\",\"ethnicity\":\"...\",\"pose\":\"...\",\"location\":\"...\",\"outfit\":\"...\",\"extras\":\"...\"}\r\nValores descriptivos en ingl\u00e9s. Si no aplica o no es visible, usa \"\".` });\r\n\r\n    const res = await fetch('https:\/\/hidden-frog-e116.miami360party.workers.dev\/', {\r\n      method:'POST',\r\n      headers:{\r\n        'Content-Type':'application\/json'\r\n      },\r\n      body: JSON.stringify({\r\n        model:'claude-sonnet-4-5',\r\n        max_tokens:1000,\r\n        messages:[{ role:'user', content }]\r\n      })\r\n    });\r\n\r\n    if (!res.ok) {\r\n      const e = await res.json().catch(()=>({}));\r\n      const code = res.status;\r\n      if (code === 401) throw new Error('API Key inv\u00e1lida. Verifica la clave en console.anthropic.com\/keys');\r\n      if (code === 429) throw new Error('L\u00edmite de uso alcanzado. Espera un momento e intenta de nuevo.');\r\n      throw new Error(e?.error?.message || `Error HTTP ${code}`);\r\n    }\r\n\r\n    const data   = await res.json();\r\n    const raw    = data.content.map(b=>b.text||'').join('');\r\n    const clean  = raw.replace(\/```json|```\/g,'').trim();\r\n    const parsed = JSON.parse(clean);\r\n\r\n    const map = { faceTraits:'face-traits', bodyTraits:'body-traits', age:'age', ethnicity:'ethnicity', pose:'pose', location:'location', outfit:'outfit', extras:'extras' };\r\n    Object.entries(map).forEach(([k,id]) => { if(parsed[k]) fillField(id, parsed[k]); });\r\n\r\n    setStatus('\u2713  An\u00e1lisis completado. Los campos han sido rellenados \u2014 revisa y ajusta si es necesario.', 'ok');\r\n    document.querySelector('.fgrid').scrollIntoView({ behavior:'smooth', block:'start' });\r\n\r\n  } catch(err) {\r\n    console.error(err);\r\n    setStatus('\u2715  ' + (err.message || 'Error desconocido. Intenta de nuevo.'), 'err');\r\n  } finally {\r\n    btn.classList.remove('busy');\r\n    btn.querySelector('.spin').textContent='\u2726';\r\n    btn.disabled=false; checkBtn();\r\n  }\r\n}\r\n\r\nfunction fillField(id, value) {\r\n  const el = document.getElementById(id);\r\n  if (!el || !value) return;\r\n  el.value = value;\r\n  el.style.transition='background .4s';\r\n  el.style.background='rgba(201,168,76,.14)';\r\n  setTimeout(()=>{ el.style.background=''; }, 1500);\r\n}\r\n\r\n\/\/ \u2500\u2500 Generar Prompt \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction chips(id) { return [...document.querySelectorAll(`#${id} .chip.on`)].map(c=>c.dataset.val).filter(Boolean); }\r\n\r\nfunction generatePrompt() {\r\n  const btn = document.getElementById('btn-gen');\r\n  btn.classList.add('busy'); btn.querySelector('.gico').textContent='\u27f3';\r\n  setTimeout(() => {\r\n    buildPrompt();\r\n    btn.classList.remove('busy'); btn.querySelector('.gico').textContent='\u2726';\r\n    const out = document.getElementById('output');\r\n    out.classList.add('show');\r\n    out.scrollIntoView({ behavior:'smooth', block:'start' });\r\n  }, 600);\r\n}\r\n\r\nfunction buildPrompt() {\r\n  const face      = document.getElementById('face-traits').value.trim();\r\n  const body      = document.getElementById('body-traits').value.trim();\r\n  const age       = document.getElementById('age').value.trim();\r\n  const ethn      = document.getElementById('ethnicity').value.trim();\r\n  const pose      = document.getElementById('pose').value.trim();\r\n  const loc       = document.getElementById('location').value.trim();\r\n  const frame     = document.getElementById('framing').value;\r\n  const outfit    = document.getElementById('outfit').value.trim();\r\n  const extras    = document.getElementById('extras').value.trim();\r\n  const platform  = chips('platform')[0] || 'midjourney';\r\n  const styles    = chips('photo-style');\r\n  const lights    = chips('lighting');\r\n  const palettes  = chips('palette');\r\n  const cameras   = chips('camera');\r\n  const dofs      = chips('dof');\r\n  const qualities = chips('quality');\r\n\r\n  const parts = ['Hyperrealistic professional photograph of a real human being'];\r\n  const who = [age, ethn].filter(Boolean);\r\n  if (who.length) parts.push(who.join(', ') + ' person');\r\n  if (face) {\r\n    parts.push(`with exact facial features: ${face}`);\r\n    parts.push('face reproduced with maximum fidelity \u2014 same bone structure, eye shape, nose, lips, skin texture and pores');\r\n  } else {\r\n    parts.push('with realistic distinctive facial features in extreme photographic detail');\r\n  }\r\n  if (body) { parts.push(`body type: ${body}`); parts.push('body proportions preserved with anatomical accuracy'); }\r\n  if (pose) parts.push(`pose: ${pose}`);\r\n  if (frame) parts.push(frame);\r\n  if (outfit) parts.push(`wearing ${outfit}`);\r\n  if (extras) parts.push(`with ${extras}`);\r\n  if (loc) parts.push(`photographed at ${loc}`);\r\n  if (styles.length)   parts.push(styles.join(', '));\r\n  if (lights.length)   parts.push(lights.join(', '));\r\n  if (palettes.length) parts.push(palettes.join(', '));\r\n  if (cameras.length)  parts.push(cameras.join(', '));\r\n  if (dofs.length)     parts.push(dofs.join(', '));\r\n  if (qualities.length) parts.push(qualities.join(', '));\r\n  parts.push(\r\n    'photorealistic, not AI-generated looking',\r\n    'photo taken by world-class professional photographer',\r\n    'real human skin texture with natural imperfections',\r\n    'authentic expression and body language',\r\n    'lifelike, no plastic skin, no doll-like features',\r\n    'award-winning photography',\r\n    'exact likeness preservation, identity-consistent'\r\n  );\r\n\r\n  const sfx = { midjourney:' --ar 4:5 --v 6.1 --style raw --iw 2', 'stable-diffusion':'', dalle3:'', flux:', flux realistic, photorealistic', firefly:', Adobe Firefly photorealistic', ideogram:', photorealism mode', 'nano-banana-2':'' };\r\n  let positive = parts.join(', ') + (sfx[platform]||'');\r\n\r\n  const neg = platform === 'stable-diffusion'\r\n    ? '(worst quality:2), (low quality:2), lowres, bad anatomy, bad hands, extra fingers, missing fingers, jpeg artifacts, painting, cartoon, anime, render, CGI, plastic skin, doll, deformed face, blurry, watermark, text'\r\n    : platform === 'nano-banana-2'\r\n    ? 'painting, illustration, cartoon, anime, CGI, plastic skin, doll, deformed face, blurry, watermark, wrong anatomy, different person, altered features'\r\n    : 'painting, illustration, cartoon, anime, render, CGI, 3D model, plastic skin, doll, mannequin, wax figure, AI-looking, unrealistic, wrong anatomy, distorted face, deformed, extra limbs, blurry face, low quality, pixelated, watermark, text, different person, changed face, wrong skin tone, bad proportions';\r\n\r\n  document.getElementById('prompt-text').textContent = positive;\r\n  document.getElementById('neg-text').textContent    = neg;\r\n  document.getElementById('params').innerHTML = [\r\n    {k:'Plataforma', v:platform.toUpperCase()},\r\n    {k:'Estilo',     v:styles.join(' + ')||'\u2014'},\r\n    {k:'Luz',        v:lights[0]?.split(',')[0]||'\u2014'},\r\n    {k:'C\u00e1mara',     v:cameras[0]?.replace('shot on ','').split(',')[0]||'\u2014'},\r\n    {k:'Tokens',     v:positive.split(' ').length}\r\n  ].map(p=>`<div class=\"ptag\"><strong>${p.k}:<\/strong> ${p.v}<\/div>`).join('');\r\n}\r\n\r\n\/\/ \u2500\u2500 Copiar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction doCopy(elId, btnId, label) {\r\n  navigator.clipboard.writeText(document.getElementById(elId).textContent).then(() => {\r\n    const b = document.getElementById(btnId);\r\n    b.textContent='\u2713 Copiado'; b.classList.add('copied');\r\n    setTimeout(()=>{ b.textContent=label; b.classList.remove('copied'); }, 2000);\r\n  });\r\n}\r\nfunction copyAll() {\r\n  const pos = document.getElementById('prompt-text').textContent;\r\n  const neg = document.getElementById('neg-text').textContent;\r\n  navigator.clipboard.writeText(`PROMPT POSITIVO:\\n${pos}\\n\\nPROMPT NEGATIVO:\\n${neg}`).then(() => {\r\n    const b = document.getElementById('cp3');\r\n    b.textContent='\u2713 Copiado'; b.classList.add('copied');\r\n    setTimeout(()=>{ b.textContent='Copiar todo'; b.classList.remove('copied'); }, 2000);\r\n  });\r\n}\r\n<\/script>\r\n\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>PromptCraft \u2014 Focus360Hub PromptCraft Generador de prompts hiperrealistas \u00b7 IA de imagen By Ing. Fredy Landa &nbsp;\u00b7&nbsp; @focus360hub Recrea personas confidelidad absoluta Sube las fotos de referencia, la IA analiza los rasgos y genera el prompt perfecto para Midjourney, Stable Diffusion y m\u00e1s. Im\u00e1genes de referencia Carga una o ambas \u00b7 La IA lee las [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-501","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/focus360hub.com\/es\/wp-json\/wp\/v2\/pages\/501"}],"collection":[{"href":"https:\/\/focus360hub.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/focus360hub.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/focus360hub.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/focus360hub.com\/es\/wp-json\/wp\/v2\/comments?post=501"}],"version-history":[{"count":16,"href":"https:\/\/focus360hub.com\/es\/wp-json\/wp\/v2\/pages\/501\/revisions"}],"predecessor-version":[{"id":519,"href":"https:\/\/focus360hub.com\/es\/wp-json\/wp\/v2\/pages\/501\/revisions\/519"}],"wp:attachment":[{"href":"https:\/\/focus360hub.com\/es\/wp-json\/wp\/v2\/media?parent=501"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}