{"id":17437,"date":"2026-10-09T21:54:52","date_gmt":"2026-10-10T03:54:52","guid":{"rendered":"https:\/\/velaproducciones.com\/validador-de-idea-de-negocio\/"},"modified":"2026-10-16T14:17:27","modified_gmt":"2026-10-16T20:17:27","slug":"validador-de-idea-de-negocio","status":"publish","type":"page","link":"https:\/\/velaproducciones.com\/en\/validador-de-idea-de-negocio\/","title":{"rendered":"Business Idea Validator"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"17437\" class=\"elementor elementor-17437 elementor-bc-flex-widget\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-214ad425 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"214ad425\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1c3bb7c1\" data-id=\"1c3bb7c1\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-bbac9158 elementor-widget elementor-widget-html\" data-id=\"bbac9158\" 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<!-- Validador de idea de negocio \u00b7 Vela Producciones \u00b7 generado por generar.py (editar las piezas de la carpeta, no este archivo) -->\n<!-- Tipograf\u00eda Inter, la misma del Generador de Buyer Persona. -->\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap\" rel=\"stylesheet\">\n<style>\n\/* \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\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\n   SISTEMA DE DISE\u00d1O DE LAS HERRAMIENTAS DE VELA PRODUCCIONES\n   \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   Es el mismo lenguaje visual del Generador de Buyer Persona y del test\n   \u00abArquitectura del Emprendedor\u00bb: Inter, fondo #f9f8ff, tarjetas blancas con\n   sombra profunda, degradados \u00edndigo (#6254e7 \u2192 #9289f1) y esmeralda\n   (#10b981 \u2192 #34d399), notas post-it.\n\n   Este archivo es la \u00daNICA fuente del dise\u00f1o: cada herramienta lo toma y a\u00f1ade\n   lo suyo al final en su propio `<style>`. As\u00ed las tres (y las que vengan) se\n   ven iguales sin copiar el CSS tres veces.\n\n   Todo va bajo el contenedor `.vh` \u2026 hmm, no: el contenedor es `.vh` (vela\n   herramientas) para no chocar con la clase de la herramienta de Arquitectura,\n   que ya est\u00e1 publicada.\n   \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\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 *\/\n\n\/* \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   ARQUITECTURA DEL EMPRENDEDOR \u00b7 Vela Producciones\n   Mismo lenguaje visual que el Generador de Buyer Persona:\n   Inter \u00b7 fondo #f9f8ff \u00b7 tarjetas blancas con sombra profunda \u00b7 degradados\n   \u00edndigo (#6254e7 \u2192 #9289f1) y esmeralda (#10b981 \u2192 #34d399) \u00b7 notas post-it.\n   Sin Tailwind ni librer\u00edas: todo el CSS va aqu\u00ed, as\u00ed la herramienta no depende\n   de ninguna CDN para verse bien.\n   \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n:root{\n  --indigo:#6254e7; --indigo-claro:#9289f1; --indigo-oscuro:#4a3ccb; --indigo-suave:#f4f2ff;\n  --esmeralda:#10b981; --esmeralda-claro:#34d399;\n  --ambar:#f59e0b; --rojo:#e11d48;\n  --slate-900:#0f172a; --slate-700:#334155; --slate-500:#696687; --slate-300:#cbd5e1; --slate-200:#e2ddf9;\n  --fondo:#f9f8ff; --blanco:#fff;\n  --sombra:0 20px 25px -5px rgb(0 0 0 \/ .1), 0 8px 10px -6px rgb(0 0 0 \/ .1);\n  --sombra-suave:0 4px 14px 0 rgb(0 0 0 \/ .1);\n}\n*{box-sizing:border-box}\n.vh{\n  margin:0; padding:0; font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;\n  background:var(--fondo); color:var(--slate-700); line-height:1.6; -webkit-font-smoothing:antialiased;\n}\n\/* El tema del sitio (ewebot) impone su tipograf\u00eda a los t\u00edtulos con reglas m\u00e1s espec\u00edficas\n   (`.elementor-widget-heading h1.elementor-heading-title {font-family:Nunito}`), as\u00ed que aqu\u00ed\n   Inter va con !important: la herramienta tiene que verse igual que el Generador de Buyer Persona\n   aunque el tema cambie sus fuentes. Es el \u00fanico !important del archivo y est\u00e1 acotado a .vh. *\/\n.vh, .vh *{font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif !important}\n.vh-contenedor{max-width:1100px; margin:0 auto; padding:2rem 1rem 4rem}\n.vh h1,.vh h2,.vh h3,.vh h4{color:var(--slate-900); line-height:1.25; margin:0 0 .75rem}\n.vh h1{font-size:clamp(1.75rem,4vw,2.5rem); font-weight:800; letter-spacing:-.02em}\n.vh h2{font-size:clamp(1.35rem,3vw,1.75rem); font-weight:800; letter-spacing:-.01em}\n.vh h3{font-size:1.125rem; font-weight:700}\n.vh h4{font-size:1rem; font-weight:700}\n.vh p{margin:0 0 1rem}\n.vh a{color:var(--indigo-oscuro)}\n.vh .gris{color:var(--slate-500)}\n.vh .chico{font-size:.875rem}\n.vh .micro{font-size:.8rem}\n.vh .oculto{display:none !important}\n\n\/* \u2500\u2500 tarjetas \u2500\u2500 *\/\n.blanco{background:var(--blanco); border-radius:1rem; padding:2rem; box-shadow:var(--sombra); margin-bottom:1.5rem}\n.blanco.ajustado{padding:1.25rem}\n.post-it{box-shadow:10px 10px 25px rgba(0,0,0,.1); transition:transform .3s ease, box-shadow .3s ease;\n  padding:1.5rem; border-radius:.75rem; margin-bottom:1.5rem}\n.post-it:hover{transform:rotate(0deg) translateY(-3px) !important; box-shadow:14px 14px 30px rgba(0,0,0,.14)}\n.post-it-amarillo{background:#fef9c3; transform:rotate(-1.2deg)}\n.post-it-rosa{background:#fce7f3; transform:rotate(1deg)}\n.post-it-azul{background:#dbeafe; transform:rotate(-.8deg)}\n.post-it-verde{background:#dcfce7; transform:rotate(1.1deg)}\n.post-it-morado{background:#e2ddf9; transform:rotate(-.5deg)}\n\n\/* \u2500\u2500 encabezado \u2500\u2500 *\/\n.cabecera{display:flex; flex-wrap:wrap; gap:1.5rem; align-items:center; justify-content:space-between;\n  border-bottom:1px solid var(--slate-200); padding-bottom:1.5rem; margin-bottom:1.5rem}\n.cabecera .titulos{flex:1 1 320px}\n.etiqueta{display:inline-block; font-size:.75rem; font-weight:700; letter-spacing:.06em; text-transform:uppercase;\n  color:var(--indigo-oscuro); background:var(--indigo-suave); padding:.35rem .75rem; border-radius:999px; margin-bottom:.75rem}\n.marcador{text-align:center; min-width:190px}\n.marcador .numero{font-size:2.75rem; font-weight:900; color:var(--slate-900); line-height:1}\n.marcador .de{font-size:.9rem; color:var(--slate-500); font-weight:600}\n.barra{height:.75rem; background:var(--slate-200); border-radius:999px; overflow:hidden; margin:.75rem 0 .5rem}\n.barra > span{display:block; height:100%; width:0; border-radius:999px; transition:width .4s ease, background-color .3s}\n.barra-indigo > span{background:linear-gradient(to right,var(--indigo),var(--indigo-claro))}\n.barra-verde > span{background:linear-gradient(to right,var(--esmeralda),var(--esmeralda-claro))}\n.barra-ambar > span{background:linear-gradient(to right,#f59e0b,#fbbf24)}\n.barra-rojo > span{background:linear-gradient(to right,#e11d48,#fb7185)}\n.pastilla{display:inline-block; font-size:.75rem; font-weight:700; padding:.25rem .75rem; border-radius:999px; border:1px solid}\n.pastilla-verde{background:#d1fae5; color:#065f46; border-color:#6ee7b7}\n.pastilla-ambar{background:#fef3c7; color:#92400e; border-color:#fcd34d}\n.pastilla-rojo{background:#ffe4e6; color:#9f1239; border-color:#fda4af}\n.pastilla-indigo{background:var(--indigo-suave); color:var(--indigo-oscuro); border-color:#e2ddf9}\n.pastilla-gris{background:#f1f5f9; color:var(--slate-500); border-color:var(--slate-300)}\n\n\/* \u2500\u2500 pesta\u00f1as \u2500\u2500 *\/\n.pestanas{display:flex; flex-wrap:wrap; gap:.5rem; margin-bottom:1.5rem}\n.pestana{background:var(--blanco); border:1px solid var(--slate-200); color:var(--slate-700); font-weight:700;\n  font-size:.9rem; padding:.7rem 1.1rem; border-radius:.75rem; cursor:pointer; transition:all .2s; box-shadow:var(--sombra-suave)}\n.pestana:hover{border-color:#e2ddf9; transform:translateY(-2px)}\n.pestana.activa{background-image:linear-gradient(to right,var(--indigo),var(--indigo-claro)); color:#fff; border-color:transparent}\n.pestana .num{display:inline-block; background:rgba(255,255,255,.25); border-radius:.4rem; padding:0 .4rem; margin-right:.4rem; font-weight:800}\n.pestana:not(.activa) .num{background:var(--indigo-suave); color:var(--indigo-oscuro)}\n\n\/* \u2500\u2500 formulario \u2500\u2500 *\/\n.form-label{font-weight:600; color:var(--slate-700); margin-bottom:.75rem; display:block}\n.form-input,.form-select,.form-textarea{width:100%; border:1px solid #d1d5db; border-radius:.75rem; padding:.75rem 1rem;\n  color:var(--slate-700); transition:all .2s ease-in-out; background-color:#f9fafb; font-family:inherit; font-size:1rem}\n.form-input:focus,.form-select:focus,.form-textarea:focus{outline:none; border-color:#4f46e5; box-shadow:0 0 0 3px rgba(79,70,229,.2); background:#fff}\n\n\/* \u2500\u2500 preguntas \u2500\u2500 *\/\n.pregunta{border:1px solid var(--slate-200); border-radius:1rem; padding:1.5rem; margin-bottom:1.5rem; background:var(--blanco);\n  transition:border-color .2s, box-shadow .2s}\n.pregunta.respondida{border-color:#e2ddf9; box-shadow:0 8px 20px -12px rgba(79,70,229,.45)}\n.pregunta-cabecera{display:flex; flex-wrap:wrap; gap:.75rem; align-items:center; justify-content:space-between; margin-bottom:.75rem}\n.pregunta-numero{display:flex; align-items:center; justify-content:center; width:2.25rem; height:2.25rem; border-radius:.75rem;\n  background-image:linear-gradient(to right,var(--indigo),var(--indigo-claro)); color:#fff; font-weight:800; flex:0 0 auto}\n.pregunta-titulo{display:flex; gap:.85rem; align-items:flex-start; flex:1 1 260px}\n.pregunta-titulo h3{margin:0}\n.dilema{font-weight:600; color:var(--slate-900); margin:.25rem 0 1rem}\n.realidad{background:#fff7ed; border-left:4px solid #fb923c; border-radius:.5rem; padding:.85rem 1rem; margin-bottom:1.25rem; font-size:.9rem; color:#7c2d12}\n.realidad strong{color:#9a3412}\n.opciones{display:grid; gap:.6rem}\n.opcion{display:flex; gap:.75rem; align-items:flex-start; border:2px solid var(--slate-200); border-radius:.75rem;\n  padding:.85rem 1rem; cursor:pointer; transition:all .2s ease-in-out; background:var(--blanco); text-align:left; font:inherit; color:inherit; width:100%}\n.opcion:hover{border-color:#e2ddf9; transform:translateY(-2px)}\n.opcion .nivel{flex:0 0 auto; width:1.75rem; height:1.75rem; border-radius:.5rem; background:#f1f5f9; color:var(--slate-500);\n  display:flex; align-items:center; justify-content:center; font-weight:800; font-size:.85rem}\n.opcion .texto{font-size:.925rem}\n.opcion[aria-pressed=\"true\"]{background:var(--indigo-suave); border-color:var(--indigo); color:var(--indigo-oscuro); font-weight:600}\n.opcion[aria-pressed=\"true\"] .nivel{background:var(--indigo); color:#fff}\n.opcion:focus-visible{outline:3px solid rgba(99,102,241,.4); outline-offset:2px}\n.consejo{background:var(--indigo-suave); border-radius:.75rem; padding:1rem 1.25rem; margin-top:1rem; font-size:.9rem}\n.consejo strong{color:var(--indigo-oscuro)}\n.primer-paso{background:#ecfdf5; border-left:4px solid var(--esmeralda); border-radius:.5rem; padding:.75rem 1rem; margin-top:.75rem; font-size:.9rem; color:#065f46}\n\n\/* \u2500\u2500 botones \u2500\u2500 *\/\n.btn{font-weight:700; padding:1rem 2rem; border-radius:.75rem; transition:all .2s; border:none; cursor:pointer;\n  box-shadow:var(--sombra-suave); display:inline-flex; align-items:center; justify-content:center; gap:.6rem; font-family:inherit; font-size:1rem}\n.btn:disabled{opacity:.7; cursor:not-allowed}\n.btn-primario{background-image:linear-gradient(to right,var(--indigo),var(--indigo-claro)); color:#fff}\n.btn-primario:hover:not(:disabled){transform:translateY(-2px); box-shadow:0 10px 20px -5px rgba(99,102,241,.4)}\n.btn-secundario{background-image:linear-gradient(to right,var(--esmeralda),var(--esmeralda-claro)); color:#fff}\n.btn-secundario:hover:not(:disabled){transform:translateY(-2px); box-shadow:0 10px 20px -5px rgba(16,185,129,.4)}\n.btn-neutro{background:var(--blanco); color:var(--slate-700); border:1px solid var(--slate-200)}\n.btn-neutro:hover:not(:disabled){border-color:#e2ddf9; color:var(--indigo-oscuro); transform:translateY(-2px)}\n.btn-bloque{width:100%}\n.acciones{display:flex; flex-wrap:wrap; gap:.75rem; margin-top:1.5rem}\n.acciones .btn{flex:1 1 200px}\n.spinner{border:3px solid rgba(255,255,255,.3); width:20px; height:20px; border-radius:50%; border-left-color:#fff; animation:girar 1s linear infinite}\n@keyframes girar{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}\n\n\/* \u2500\u2500 resultados \u2500\u2500 *\/\n.rejilla{display:grid; gap:1.25rem}\n@media(min-width:760px){.rejilla-2{grid-template-columns:1fr 1fr}.rejilla-4{grid-template-columns:repeat(4,1fr)}}\n.dimension{border:1px solid var(--slate-200); border-radius:.85rem; padding:1rem; background:var(--blanco)}\n.dimension .encabezado{display:flex; justify-content:space-between; align-items:baseline; gap:.5rem; margin-bottom:.35rem}\n.dimension .nombre{font-weight:700; font-size:.9rem; color:var(--slate-900)}\n.dimension .valor{font-weight:800; color:var(--slate-900)}\n.fortaleza,.alerta{border-radius:.75rem; padding:.9rem 1rem; font-size:.9rem; margin-bottom:.6rem}\n.fortaleza{background:#ecfdf5; border-left:4px solid var(--esmeralda); color:#065f46}\n.alerta{background:#fff1f2; border-left:4px solid var(--rojo); color:#9f1239}\n.prioridad{display:flex; gap:.85rem; align-items:flex-start; padding:.85rem 0; border-bottom:1px dashed var(--slate-200)}\n.prioridad:last-child{border-bottom:none}\n.prioridad .orden{flex:0 0 auto; width:1.9rem; height:1.9rem; border-radius:.6rem; background-image:linear-gradient(to right,var(--indigo),var(--indigo-claro));\n  color:#fff; font-weight:800; display:flex; align-items:center; justify-content:center; font-size:.85rem}\n.lista{list-style:none; padding:0; margin:0}\n.lista li{position:relative; padding-left:1.6rem; margin-bottom:.6rem}\n.lista li:before{content:'\u25b8'; position:absolute; left:.35rem; color:var(--indigo); font-weight:800}\n.pasos{list-style:none; padding:0; margin:0}\n.pasos li{display:flex; gap:.85rem; margin-bottom:.85rem}\n.pasos .cuando{flex:0 0 auto; font-weight:800; color:var(--indigo-oscuro); background:var(--indigo-suave); border-radius:.5rem; padding:.15rem .6rem; font-size:.8rem; height:fit-content}\n.tarjeta-modulo{border:1px solid var(--slate-200); border-radius:1rem; padding:1.5rem; background:var(--blanco); margin-bottom:1.25rem}\n.numero-modulo{display:inline-flex; align-items:center; justify-content:center; width:2.5rem; height:2.5rem; border-radius:.85rem;\n  background-image:linear-gradient(to right,var(--esmeralda),var(--esmeralda-claro)); color:#fff; font-weight:900; font-size:1.1rem; margin-bottom:.75rem}\n.tarea{display:flex; gap:.75rem; align-items:flex-start; padding:.6rem .75rem; border:1px solid var(--slate-200); border-radius:.6rem; margin-bottom:.5rem; cursor:pointer; transition:all .2s}\n.tarea:hover{border-color:#a7f3d0; background:#f0fdf4}\n.tarea input{margin-top:.3rem; accent-color:var(--esmeralda); width:1.1rem; height:1.1rem}\n.tarea.hecha{opacity:.65; text-decoration:line-through}\n.kpi{display:flex; justify-content:space-between; gap:1rem; padding:.6rem 0; border-bottom:1px dashed var(--slate-200); font-size:.9rem}\n.kpi:last-child{border-bottom:none}\n.nota{font-size:.85rem; color:var(--slate-500); background:#f9f8ff; border:1px dashed var(--slate-300); border-radius:.75rem; padding:.85rem 1rem}\n.aviso{background:#fffbeb; border-left:4px solid #f59e0b; border-radius:.5rem; padding:.85rem 1rem; font-size:.9rem; color:#78350f; margin-bottom:1rem}\n.aviso.ok{background:#ecfdf5; border-left-color:var(--esmeralda); color:#065f46}\n\n\/* \u2500\u2500 aviso flotante (toast) \u2500\u2500 *\/\n.brindis{position:fixed; left:50%; bottom:1.5rem; transform:translateX(-50%) translateY(150%);\n  background:var(--slate-900); color:#fff; padding:.85rem 1.4rem; border-radius:.75rem; font-weight:600; font-size:.9rem;\n  box-shadow:0 12px 30px rgba(0,0,0,.35); transition:transform .35s ease; z-index:9999; max-width:90vw}\n.brindis.visible{transform:translateX(-50%) translateY(0)}\n\n\/* \u2500\u2500 impresi\u00f3n \/ PDF \u2500\u2500 *\/\n@media print{\n  .vh{background:#fff}\n  .pestanas,.acciones,.no-imprimir{display:none !important}\n  .blanco,.post-it,.pregunta,.tarjeta-modulo{box-shadow:none !important; border:1px solid #e2ddf9; transform:none !important; page-break-inside:avoid}\n  .vh-contenedor{max-width:100%; padding:0}\n  a[href]:after{content:''}\n}\n@media (prefers-reduced-motion:reduce){*{animation:none !important; transition:none !important}}\n\n\/* \u2500\u2500 anti-desborde \u2500\u2500 *\/\n\/* \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\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\n   ANTI-DESBORDE \u2014 texto que no cabe dentro de su cuadro\n   \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   POR QU\u00c9 EXISTE (medido el 2026-10-10, reportado por Carla): en la ficha del Buyer\n   Persona las etiquetas del perfil llevan `w-24` (ancho fijo de 96 px) y textos como\n   \u00abCanales de Contacto Preferidos:\u00bb miden m\u00e1s del doble: se sal\u00edan del cuadro y se\n   montaban encima del valor. En m\u00f3vil, adem\u00e1s, la lista no pod\u00eda partirse en dos\n   l\u00edneas porque el <li> era `flex` sin `wrap`.\n\n   Las cuatro reglas que resuelven el 90% de estos casos:\n     1. `min-width: 0` en los hijos de flex y grid: sin esto, un hijo nunca se encoge\n        por debajo del tama\u00f1o de su contenido (el desborde cl\u00e1sico de flexbox).\n     2. `flex-wrap: wrap` para que el valor baje a la l\u00ednea siguiente.\n     3. `overflow-wrap: anywhere` para palabras largu\u00edsimas (correos, URLs, nombres).\n     4. Anchos fijos fuera: `width: auto` con `min-width`, en lugar de un ancho cerrado.\n   \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\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 *\/\n\n\/* 1 \u00b7 los hijos de flex y grid pueden encogerse *\/\n.rejilla > *, .fila-campos > *, .grid > *, .flex > * { min-width: 0; }\n.rejilla, .fila-campos { grid-auto-columns: minmax(0, 1fr); }\n\n\/* 2 \u00b7 el texto largo se parte en vez de salirse *\/\n.aemp, .vh, .aemp p, .vh p, .aemp li, .vh li, .aemp td, .vh td,\n.aemp .dato, .vh .dato, .aemp .titulo, .vh .titulo {\n  overflow-wrap: anywhere;\n  word-break: normal;\n}\n\n\/* 3 \u00b7 etiquetas y valores que se acomodan solos (fichas de datos) *\/\n.pareja { display: flex; flex-wrap: wrap; align-items: flex-start; gap: .15rem .45rem; }\n.pareja .rotulo { flex: 0 1 auto; min-width: 5.5rem; font-weight: 700; }\n.pareja .valor { flex: 1 1 8rem; min-width: 0; }\n\n\/* 4 \u00b7 t\u00edtulos con espacio para las letras que bajan (g, j, p, y) *\/\n.aemp h1, .vh h1, .aemp h2, .vh h2, .aemp h3, .vh h3 { line-height: 1.25; padding-bottom: .1em; }\n\n\/* 5 \u00b7 pastillas y botones: nunca cortan su texto *\/\n.pastilla, .btn, .pestana { overflow-wrap: anywhere; }\n.btn { white-space: normal; }\n\n\/* 6 \u00b7 tablas anchas: se desplazan en horizontal, no se salen de la pantalla *\/\n.tabla-contenedor { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n\n\/* 7 \u00b7 en pantallas peque\u00f1as, menos relleno y todo a una columna *\/\n@media (max-width: 640px) {\n  .blanco { padding: 1.25rem; }\n  .post-it { padding: 1.15rem; }\n  .acciones .btn, .acciones-resultado .btn { flex: 1 1 100%; }\n  .metric .dato, .metrica .dato { font-size: 1.35rem; }\n}\n\n\/* \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\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\n   8 \u00b7 BOTONES: el tema del sitio les pone altura fija\n   \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   MEDIDO el 2026-10-10 (la causa del \u00abtexto cortado por la mitad\u00bb que report\u00f3 Carla):\n   el tema ewebot trae en su hoja de estilos\n\n       button, input[type=\"submit\"] { height: 50px; }\n\n   Con eso, cada bot\u00f3n de nuestras herramientas quedaba clavado en 50 px de alto.\n   Las opciones del test \u2014que llevan una frase entera\u2014 necesitaban entre 85 y 132 px,\n   as\u00ed que se ve\u00edan cortadas a la mitad. Lo mismo val\u00eda para cualquier bot\u00f3n con dos\n   l\u00edneas de texto.\n\n   Estas reglas devuelven la altura autom\u00e1tica a TODO lo que sea nuestro, sin tocar el\n   tema ni los botones del resto del sitio.\n   \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\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 *\/\n.aemp button, .aemp .btn, .aemp .opcion, .aemp .pestana, .aemp .tarea,\n.vh button, .vh .btn, .vh .opcion, .vh .pestana, .vh .tarea {\n  height: auto !important;\n  min-height: 0;\n  max-height: none;\n  overflow: visible;\n}\n\/* El tema tambi\u00e9n pone los botones en MAY\u00daSCULAS: aqu\u00ed manda la tipograf\u00eda de la\n   herramienta, que es la misma del Generador de Buyer Persona. *\/\n.aemp button, .aemp .btn, .aemp .opcion, .aemp .pestana,\n.vh button, .vh .btn, .vh .opcion, .vh .pestana { text-transform: none; }\n\/* Y los botones no parten su texto en dos l\u00edneas raras: se acomodan y crecen. *\/\n.aemp .btn, .vh .btn { white-space: normal; }\n\n\/* \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\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\n   9 \u00b7 CAMPOS Y BOTONES: el tema tambi\u00e9n les pisa el relleno y el ancho\n   \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   MEDIDO el 2026-10-10 (reportado por Carla): en la hoja del tema hay reglas como\n\n       input[type=\"text\"], select { height: 41px; padding: 8px 0; }\n\n   que ganan por especificidad a nuestras clases. Resultado: los campos perd\u00edan el\n   relleno lateral \u2014el texto quedaba pegado al borde, como si se saliera de la caja\u2014 y\n   la altura se fijaba en 41 px aunque el contenido pidiera m\u00e1s.\n\n   Y en las filas de botones, cada bot\u00f3n se estiraba a un ancho fijo y el texto se\n   apretaba dentro (en la calculadora, \u00abCopiar enlace con mis n\u00fameros\u00bb ocupaba todo el\n   bot\u00f3n). Ahora cada bot\u00f3n toma el ancho que su texto necesita y, si no cabe, baja a la\n   l\u00ednea siguiente.\n   \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\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 *\/\n\n\/* Campos: altura autom\u00e1tica, relleno de verdad y nada de recortes. *\/\n.aemp .form-input, .aemp .form-select, .aemp .form-textarea, .aemp input[type=\"text\"],\n.vh .form-input, .vh .form-select, .vh .form-textarea, .vh input[type=\"text\"], .vh input[type=\"number\"] {\n  height: auto !important;\n  min-height: 3rem !important;\n  max-height: none !important;\n  padding: .8rem 1rem !important;\n  line-height: 1.45 !important;\n  box-sizing: border-box !important;\n  overflow: visible !important;\n}\/* Los desplegables necesitan adem\u00e1s que el texto no se corte por abajo. *\/\n.aemp select, .vh select { text-overflow: ellipsis; overflow: visible !important; }\n.aemp textarea, .vh textarea { min-height: 4.5rem !important; }\n\n\/* Filas de botones: el ancho lo pone el texto, no el dise\u00f1o. *\/\n.acciones, .acciones-superiores { display: flex; flex-wrap: wrap; gap: .75rem; align-items: center; }\n.acciones > *, .acciones-superiores > * { min-width: 0; }\n.acciones .btn, .acciones-superiores .btn {\n  flex: 0 1 auto;            \/* el bot\u00f3n crece con su texto y nunca se aprieta *\/\n  width: auto;\n  max-width: 100%;\n  padding: .9rem 1.35rem;\n  white-space: normal;\n  overflow-wrap: anywhere;\n  text-align: center;\n}\n@media (max-width: 640px) {\n  .acciones .btn, .acciones-superiores .btn { flex: 1 1 100%; }\n}\n\n\/* \u2500\u2500 paleta pastel y color por funci\u00f3n \u2500\u2500 *\/\n\/* \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\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\n   PALETA PASTEL Y COLOR POR FUNCI\u00d3N \u00b7 Herramientas de Vela Producciones\n   \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   Pedido de Carla (2026-10-10): \u00abasignar colores espec\u00edficos a todos los botones y\n   tarjetas de cada herramienta, asegurando coherencia visual entre ellas\u2026 y aplicar\n   sombras tanto a las tarjetas como a los botones para aportar profundidad\u00bb.\n   Referencia de color: las tarjetas (post-it) del Generador de Buyer Persona, que ya\n   usaban esta paleta suave:\n       amarillo #fef9c3 \u00b7 rosa #fce7f3 \u00b7 azul #dbeafe \u00b7 verde #dcfce7 \u00b7 lila #e2ddf9\n   (m\u00e1s el lila clar\u00edsimo #f4f2ff que la ficha ya usaba en la cita y el avatar).\n\n   ESTE ARCHIVO ES LA \u00daNICA FUENTE DE LA PALETA. Se inyecta, tal cual, en las cinco\n   herramientas:\n     \u00b7 las tres nuevas (Calculadora, Validador, Plan de contenido) \u2014 v\u00eda `generar.py`,\n       que ya pega `diseno.css` + `anti-desborde.css`;\n     \u00b7 \u00abArquitectura del Emprendedor\u00bb \u2014 v\u00eda `generar-snippet.py`;\n     \u00b7 el Generador de Buyer Persona \u2014 v\u00eda `parche-buyer-persona.py`.\n   Cambiar un color aqu\u00ed lo cambia en las cinco. Nada de copias.\n\n   \u2500\u2500 REGLA DE COLOR DE LOS BOTONES (una funci\u00f3n = un color) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     \u00edndigo   .btn-primario    producir el resultado: Generar, Calcular, Analizar, Armar plan\n     esmeralda .btn-secundario  sacar el documento: Imprimir, Descargar \/ Guardar en PDF\n     rosa     .btn-reiniciar    empezar de nuevo: Reiniciar, Borrar, Crear otro perfil\n     amarillo .btn-ejemplo      ver un ejemplo \/ cargar datos de muestra\n     azul     .btn-copiar       copiar al portapapeles (resumen, enlace, tabla)\n     lila     .btn-neutro       todo lo dem\u00e1s (volver, cerrar, ayuda, seg\u00fan)\n\n   \u2500\u2500 REGLA DE COLOR DE LAS TARJETAS (un significado = un color) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     lila     .tono-lila        el resultado: lo que la persona se lleva\n     azul     .tono-azul        n\u00fameros, c\u00e1lculos, datos duros\n     verde    .tono-verde       lo que est\u00e1 bien, lo validado, el plan a seguir\n     amarillo .tono-amarillo    aviso, riesgo, cuidado, lo que hay que vigilar\n     rosa     .tono-rosa        pasos, proceso, personas\n     \u00edndigo   .tono-indigo      dato de entrada, nota neutral\n\n   Las sombras van en dos escalas (reposo y elevada) para que todo tenga la misma\n   profundidad: `--sombra-tarjeta` \/ `--sombra-tarjeta-alto` y `--sombra-boton` \/\n   `--sombra-boton-alto`.\n   \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\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 *\/\n\n:root{\n  \/* \u2500\u2500 paleta pastel (referencia: las tarjetas del Buyer Persona) \u2500\u2500 *\/\n  --p-lila:#e2ddf9;      --p-lila-borde:#ddd6fe;      --p-lila-texto:#5b21b6;\n  --p-azul:#dbeafe;      --p-azul-borde:#bfdbfe;      --p-azul-texto:#1e40af;\n  --p-verde:#dcfce7;     --p-verde-borde:#bbf7d0;     --p-verde-texto:#166534;\n  --p-amarillo:#fef9c3;  --p-amarillo-borde:#fde68a;  --p-amarillo-texto:#854d0e;\n  --p-rosa:#fce7f3;      --p-rosa-borde:#fbcfe8;      --p-rosa-texto:#9d174d;\n  --p-indigo:#f4f2ff;    --p-indigo-borde:#e2ddf9;    --p-indigo-texto:#3730a3;\n\n  \/* \u2500\u2500 sombras: la misma profundidad en todas las herramientas \u2500\u2500 *\/\n  --sombra-tarjeta:0 12px 28px -14px rgba(15,23,42,.30), 0 2px 6px -2px rgba(15,23,42,.06);\n  --sombra-tarjeta-alto:0 22px 40px -18px rgba(15,23,42,.34), 0 3px 8px -2px rgba(15,23,42,.07);\n  --sombra-post-it:10px 10px 25px rgba(0,0,0,.10);\n  --sombra-post-it-alto:14px 14px 30px rgba(0,0,0,.14);\n  --sombra-boton:0 4px 12px -2px rgba(15,23,42,.18);\n  --sombra-boton-alto:0 12px 22px -8px rgba(15,23,42,.34);\n}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 TARJETAS: una sola profundidad \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   Todas las tarjetas de las cinco herramientas comparten radio y sombra. Los post-it del\n   Buyer Persona conservan su sombra desplazada y su inclinaci\u00f3n: es su se\u00f1o de identidad. *\/\n.blanco,.tarjeta-modulo,.pregunta,.dimension,.metrica,.consejo,.nota,.aviso,.realidad,\n.pasos-vacio,.resultado-caja,\n\/* las tarjetas de la ficha del Buyer Persona: misma profundidad que las dem\u00e1s *\/\n.whiteboard,.infographic-section,.strategy-item,.infographic-quote{\n  box-shadow:var(--sombra-tarjeta);\n  transition:transform .25s ease, box-shadow .25s ease;\n}\n.blanco:hover,.tarjeta-modulo:hover,.dimension:hover,.metrica:hover{\n  box-shadow:var(--sombra-tarjeta-alto);\n  transform:translateY(-2px);\n}\n.post-it{box-shadow:var(--sombra-post-it)}\n.post-it:hover{box-shadow:var(--sombra-post-it-alto)}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 TONOS PASTEL DE TARJETA \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   Se pone la clase en la tarjeta (`.blanco.tono-azul`) y el color viene de aqu\u00ed. *\/\n.tono-lila{background:var(--p-lila); border:1px solid var(--p-lila-borde)}\n.tono-azul{background:var(--p-azul); border:1px solid var(--p-azul-borde)}\n.tono-verde{background:var(--p-verde); border:1px solid var(--p-verde-borde)}\n.tono-amarillo{background:var(--p-amarillo); border:1px solid var(--p-amarillo-borde)}\n.tono-rosa{background:var(--p-rosa); border:1px solid var(--p-rosa-borde)}\n.tono-indigo{background:var(--p-indigo); border:1px solid var(--p-indigo-borde)}\n\n\/* El texto de una tarjeta pastel pide m\u00e1s contraste que el gris pizarra normal. *\/\n.tono-lila h2,.tono-lila h3,.tono-lila h4,.tono-lila .rotulo,.tono-lila .nombre{color:var(--p-lila-texto)}\n.tono-azul h2,.tono-azul h3,.tono-azul h4,.tono-azul .rotulo,.tono-azul .nombre{color:var(--p-azul-texto)}\n.tono-verde h2,.tono-verde h3,.tono-verde h4,.tono-verde .rotulo,.tono-verde .nombre{color:var(--p-verde-texto)}\n.tono-amarillo h2,.tono-amarillo h3,.tono-amarillo h4,.tono-amarillo .rotulo,.tono-amarillo .nombre{color:var(--p-amarillo-texto)}\n.tono-rosa h2,.tono-rosa h3,.tono-rosa h4,.tono-rosa .rotulo,.tono-rosa .nombre{color:var(--p-rosa-texto)}\n.tono-indigo h2,.tono-indigo h3,.tono-indigo h4,.tono-indigo .rotulo,.tono-indigo .nombre{color:var(--p-indigo-texto)}\n.tono-lila .gris,.tono-azul .gris,.tono-verde .gris,.tono-amarillo .gris,.tono-rosa .gris,\n.tono-indigo .gris{color:#475569}\n\n\/* Los recuadros de dentro de una tarjeta pastel se quedan claros para que se distingan. *\/\n.tono-lila .consejo,.tono-azul .consejo,.tono-verde .consejo,.tono-amarillo .consejo,\n.tono-rosa .consejo,.tono-indigo .consejo{background:rgba(255,255,255,.65)}\n.tono-lila .nota,.tono-azul .nota,.tono-verde .nota,.tono-amarillo .nota,\n.tono-rosa .nota,.tono-indigo .nota{background:rgba(255,255,255,.65)}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 BOTONES: un color por funci\u00f3n, con sombra \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n.btn{box-shadow:var(--sombra-boton)}\n\/* El relleno se declara DOS veces a prop\u00f3sito: el tema del sitio pinta los <button> con un gris\n   (#efefef) y, si el degradado tardara en pintarse, se ver\u00eda el gris por debajo. Con\n   `background-color` del mismo tono, el bot\u00f3n nunca aparece gris. *\/\n.btn-primario{background-color:#6254e7; background-image:linear-gradient(to right,#6254e7,#9289f1); color:#fff}\n.btn-primario:hover:not(:disabled){transform:translateY(-2px);\n  box-shadow:0 14px 26px -10px rgba(99,102,241,.65)}\n.btn-secundario{background-color:#10b981; background-image:linear-gradient(to right,#10b981,#34d399); color:#fff}\n.btn-secundario:hover:not(:disabled){transform:translateY(-2px);\n  box-shadow:0 14px 26px -10px rgba(16,185,129,.65)}\n.btn-reiniciar{background:var(--p-rosa); border:1px solid var(--p-rosa-borde); color:var(--p-rosa-texto);\n  box-shadow:0 8px 18px -8px rgba(236,72,153,.55)}\n.btn-reiniciar:hover:not(:disabled){transform:translateY(-2px); border-color:#f9a8d4;\n  box-shadow:0 14px 26px -10px rgba(236,72,153,.6)}\n.btn-ejemplo{background:var(--p-amarillo); border:1px solid var(--p-amarillo-borde); color:var(--p-amarillo-texto);\n  box-shadow:0 8px 18px -8px rgba(245,158,11,.55)}\n.btn-ejemplo:hover:not(:disabled){transform:translateY(-2px); border-color:#fcd34d;\n  box-shadow:0 14px 26px -10px rgba(245,158,11,.6)}\n.btn-copiar{background:var(--p-azul); border:1px solid var(--p-azul-borde); color:var(--p-azul-texto);\n  box-shadow:0 8px 18px -8px rgba(59,130,246,.55)}\n.btn-copiar:hover:not(:disabled){transform:translateY(-2px); border-color:#93c5fd;\n  box-shadow:0 14px 26px -10px rgba(59,130,246,.6)}\n.btn-neutro{background:var(--p-indigo); border:1px solid var(--p-indigo-borde); color:var(--p-indigo-texto);\n  box-shadow:0 8px 18px -8px rgba(99,102,241,.45)}\n.btn-neutro:hover:not(:disabled){transform:translateY(-2px); border-color:#a5b4fc; color:#312e81;\n  box-shadow:0 14px 26px -10px rgba(99,102,241,.5)}\n\n\/* Al pulsar, el bot\u00f3n se hunde: da sensaci\u00f3n de que respondi\u00f3. *\/\n.btn:active:not(:disabled){transform:translateY(0); box-shadow:var(--sombra-boton)}\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 PESTA\u00d1AS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   La pesta\u00f1a activa va en \u00edndigo (es la que produce), las dem\u00e1s en blanco con sombra. *\/\n.pestana{box-shadow:var(--sombra-boton)}\n.pestana.activa{box-shadow:0 10px 20px -8px rgba(99,102,241,.6)}\n\n\/* En impresi\u00f3n, nada de sombras ni elevaciones: el papel no las tiene. *\/\n@media print{\n  .blanco,.tarjeta-modulo,.pregunta,.dimension,.metrica,.consejo,.nota,.aviso,.post-it,.pestana,.btn{\n    box-shadow:none !important; transform:none !important;\n  }\n}\n@media (prefers-reduced-motion:reduce){\n  .blanco,.tarjeta-modulo,.dimension,.metrica,.post-it,.btn,.pestana{transition:none !important}\n}\n\n\/* \u2500\u2500 CSS propio de esta herramienta \u2500\u2500 *\/\n\/* \u2500\u2500 Piezas propias del validador de idea \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 *\/\n\n.numero-paso{display:inline-flex; align-items:center; justify-content:center; width:1.9rem; height:1.9rem;\n  border-radius:.6rem; background-image:linear-gradient(to right,var(--indigo),var(--indigo-claro)); color:#fff;\n  font-weight:800; font-size:.95rem; margin-right:.6rem; vertical-align:middle}\n\n.fila-campos{display:grid; gap:1rem}\n@media(min-width:760px){.fila-campos.dos{grid-template-columns:1fr 1fr}.fila-campos.tres{grid-template-columns:repeat(3,1fr)}}\n.form-textarea{width:100%; border:1px solid #d1d5db; border-radius:.5rem; padding:.75rem 1rem; color:var(--slate-700);\n  background:#f9fafb; font-family:inherit; font-size:1rem; resize:vertical; line-height:1.5}\n.form-textarea:focus{outline:none; border-color:#4f46e5; box-shadow:0 0 0 3px rgba(79,70,229,.2); background:#fff}\n\n\/* bloque de afirmaciones *\/\n.bloque-validador{border:1px solid var(--slate-200); border-radius:.85rem; padding:1rem; margin-bottom:1rem; background:#fff}\n.bloque-validador h3{display:flex; align-items:center; gap:.5rem; margin-bottom:.75rem; font-size:1rem}\n.bloque-validador .icono{font-size:1.15rem}\n.afirmacion{display:flex; flex-wrap:wrap; gap:.6rem; align-items:center; justify-content:space-between;\n  padding:.7rem 0; border-top:1px dashed var(--slate-200)}\n.afirmacion:first-of-type{border-top:none}\n.afirmacion .texto{flex:1 1 260px; min-width:0; font-size:.92rem}\n.respuestas{display:flex; gap:.4rem; flex:0 0 auto}\n.respuesta{border:2px solid var(--slate-200); background:#fff; color:var(--slate-500); font-weight:700; font-size:.82rem;\n  padding:.45rem .8rem; border-radius:.6rem; cursor:pointer; transition:all .18s; font-family:inherit; white-space:nowrap}\n.respuesta:hover{border-color:#e2ddf9; transform:translateY(-1px)}\n.respuesta[aria-pressed=\"true\"]{color:#fff; border-color:transparent}\n.respuesta[data-valor=\"2\"][aria-pressed=\"true\"]{background-image:linear-gradient(to right,var(--esmeralda),var(--esmeralda-claro))}\n.respuesta[data-valor=\"1\"][aria-pressed=\"true\"]{background-image:linear-gradient(to right,#f59e0b,#fbbf24)}\n.respuesta[data-valor=\"0\"][aria-pressed=\"true\"]{background-image:linear-gradient(to right,#e11d48,#fb7185)}\n.respuesta:focus-visible{outline:3px solid rgba(99,102,241,.4); outline-offset:2px}\n\n\/* bloques por \u00e1rea, con su nota *\/\n.puntaje-bloque{font-size:.75rem; font-weight:800; color:var(--indigo-oscuro); background:var(--indigo-suave);\n  border-radius:.5rem; padding:.15rem .5rem}\n\n\/* resultado del an\u00e1lisis *\/\n.analisis-seccion{border-top:1px solid var(--slate-200); padding-top:1rem; margin-top:1rem}\n.analisis-seccion h3{margin-bottom:.5rem}\n.experimento{border:1px solid var(--slate-200); border-left:4px solid var(--indigo); border-radius:.75rem;\n  padding:1rem; margin-bottom:.85rem; background:#fff}\n.experimento .titulo{display:flex; flex-wrap:wrap; gap:.5rem; align-items:center; justify-content:space-between}\n.experimento .cuando{font-size:.75rem; font-weight:800; color:var(--esmeralda); background:#ecfdf5;\n  border-radius:.5rem; padding:.15rem .55rem}\n.experimento .campo{margin-top:.5rem; font-size:.9rem}\n.experimento .campo strong{color:var(--indigo-oscuro)}\n.cargando{display:flex; align-items:center; gap:.75rem; color:var(--slate-500); font-size:.95rem}\n.spinner-oscuro{border:3px solid rgba(99,102,241,.25); width:22px; height:22px; border-radius:50%;\n  border-left-color:var(--indigo); animation:girar 1s linear infinite}\n<\/style>\n<div class=\"vh\">\n<div class=\"vh-contenedor\">\n<!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 CABECERA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n  <div class=\"blanco\">\n    <span class=\"etiqueta\">Herramienta gratuita \u00b7 Vela Producciones<\/span>\n    <h1>\u00bfTu idea aguanta?<\/h1>\n    <p class=\"gris\" style=\"margin:.25rem 0 1rem\">Doce preguntas para saber si tu idea se puede\n      <strong>probar esta semana<\/strong> o si antes hay que aclarar algo. Al final te damos qu\u00e9 riesgo\n      corre, qu\u00e9 experimento hacer primero, c\u00f3mo medirlo y cu\u00e1ndo conviene cambiar de idea.<\/p>\n    <p class=\"nota\" style=\"margin:0\">No hay respuestas correctas: hay respuestas honestas. Si contestas\n      \u00abs\u00ed\u00bb a todo, el resultado no sirve para nada.<\/p>\n  <\/div>\n\n  <!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 1. LA IDEA EN TUS PALABRAS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n  <div class=\"blanco tono-indigo\">\n    <h2><span class=\"numero-paso\">1<\/span>Cu\u00e9ntanos tu idea<\/h2>\n    <p class=\"gris chico\">Con dos frases por campo es suficiente. Cuanto m\u00e1s concreto, mejor sale el an\u00e1lisis.<\/p>\n\n    <div class=\"fila-campos dos\">\n      <div>\n        <label class=\"form-label\" for=\"v-que\">\u00bfQu\u00e9 vendes?<\/label>\n        <textarea class=\"form-textarea\" id=\"v-que\" rows=\"2\" placeholder=\"Ej: cajas de desayuno sorpresa a domicilio\"><\/textarea>\n      <\/div>\n      <div>\n        <label class=\"form-label\" for=\"v-quien\">\u00bfA qui\u00e9n se lo vendes?<\/label>\n        <textarea class=\"form-textarea\" id=\"v-quien\" rows=\"2\" placeholder=\"Ej: parejas j\u00f3venes de la ciudad que celebran aniversarios\"><\/textarea>\n      <\/div>\n    <\/div>\n\n    <div class=\"fila-campos dos\" style=\"margin-top:1rem\">\n      <div>\n        <label class=\"form-label\" for=\"v-problema\">\u00bfQu\u00e9 problema o deseo le resuelves?<\/label>\n        <textarea class=\"form-textarea\" id=\"v-problema\" rows=\"2\" placeholder=\"Ej: no tienen tiempo ni ideas para sorprender a su pareja\"><\/textarea>\n      <\/div>\n      <div>\n        <label class=\"form-label\" for=\"v-hoy\">\u00bfC\u00f3mo lo resuelve hoy esa persona?<\/label>\n        <textarea class=\"form-textarea\" id=\"v-hoy\" rows=\"2\" placeholder=\"Ej: pide en un restaurante, o compra algo de \u00faltima hora en el supermercado\"><\/textarea>\n      <\/div>\n    <\/div>\n\n    <div class=\"fila-campos dos\" style=\"margin-top:1rem\">\n      <div>\n        <label class=\"form-label\" for=\"v-precio\">\u00bfCu\u00e1nto piensas cobrar y cu\u00e1nto te cuesta?<\/label>\n        <textarea class=\"form-textarea\" id=\"v-precio\" rows=\"2\" placeholder=\"Ej: Q180 por caja, me cuesta Q95 entre ingredientes y empaque\"><\/textarea>\n      <\/div>\n      <div>\n        <label class=\"form-label\" for=\"v-competencia\">\u00bfQui\u00e9n m\u00e1s lo hace?<\/label>\n        <textarea class=\"form-textarea\" id=\"v-competencia\" rows=\"2\" placeholder=\"Ej: dos panader\u00edas del barrio y una cuenta de Instagram con 4.000 seguidores\"><\/textarea>\n      <\/div>\n    <\/div>\n\n    <div class=\"fila-campos dos\" style=\"margin-top:1rem\">\n      <div>\n        <label class=\"form-label\" for=\"v-porque\">\u00bfPor qu\u00e9 te elegir\u00edan a ti?<\/label>\n        <textarea class=\"form-textarea\" id=\"v-porque\" rows=\"2\" placeholder=\"Ej: entrego el mismo d\u00eda y armo cada caja a mano seg\u00fan lo que le gusta a la pareja\"><\/textarea>\n      <\/div>\n      <div>\n        <label class=\"form-label\" for=\"v-recursos\">\u00bfCon qu\u00e9 cuentas para empezar?<\/label>\n        <textarea class=\"form-textarea\" id=\"v-recursos\" rows=\"2\" placeholder=\"Ej: 10 horas por semana y Q3.000 de ahorro\"><\/textarea>\n      <\/div>\n    <\/div>\n\n    <div class=\"fila-campos\" style=\"margin-top:1rem\">\n      <div>\n        <label class=\"form-label\" for=\"v-falta\">\u00bfQu\u00e9 sientes que te falta?<\/label>\n        <textarea class=\"form-textarea\" id=\"v-falta\" rows=\"2\" placeholder=\"Ej: no s\u00e9 si la gente pagar\u00eda por adelantado ni c\u00f3mo conseguir los primeros clientes\"><\/textarea>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 2. LA PRUEBA DE REALIDAD \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n  <div class=\"blanco tono-rosa\">\n    <h2><span class=\"numero-paso\">2<\/span>La prueba de realidad<\/h2>\n    <p class=\"gris chico\">Marca lo que hoy es verdad. <strong>No<\/strong> = todav\u00eda no \u00b7 <strong>A medias<\/strong> =\n      m\u00e1s o menos \u00b7 <strong>S\u00ed<\/strong> = hecho y comprobado.<\/p>\n    <div class=\"barra barra-indigo\"><span id=\"barra-validador\" style=\"width:0%\"><\/span><\/div>\n    <div class=\"micro gris\" id=\"progreso-validador\">0 de 12 respondidas<\/div>\n    <div id=\"bloques-validador\" style=\"margin-top:1.25rem\"><\/div>\n  <\/div>\n\n  <div id=\"veredicto-validador\"><\/div>\n\n  <!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 3. AN\u00c1LISIS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n  <div class=\"blanco tono-lila\">\n    <h2><span class=\"numero-paso\">3<\/span>An\u00e1lisis de tu idea<\/h2>\n    <p class=\"gris chico\">Se escribe con tus respuestas de arriba: el riesgo que m\u00e1s puede frenarte y los tres\n      experimentos para comprobarla en dos semanas, sin gastar casi nada.<\/p>\n    <div class=\"acciones\" style=\"margin-top:0\">\n      <button class=\"btn btn-primario\" id=\"btn-analizar\">Analizar mi idea<\/button>\n    <\/div>\n    <div id=\"resultado-validador\" style=\"margin-top:1.5rem\"><\/div>\n  <\/div>\n\n  <div class=\"acciones no-imprimir\">\n    <button class=\"btn btn-copiar\" id=\"btn-copiar\">Copiar el an\u00e1lisis<\/button>\n    <button class=\"btn btn-secundario\" id=\"btn-imprimir\">Imprimir \/ Guardar en PDF<\/button>\n    <button class=\"btn btn-ejemplo\" id=\"btn-ejemplo\">Ver un ejemplo<\/button>\n    <button class=\"btn btn-reiniciar\" id=\"btn-reiniciar\">Empezar de nuevo<\/button>\n  <\/div>\n  <p class=\"micro gris\" style=\"text-align:center; margin-top:2rem\">\n    Herramienta de <strong>Vela Producciones<\/strong> \u00b7 Tus respuestas no se guardan en ning\u00fan servidor: el an\u00e1lisis se pide en el momento y no queda registro. Orientativo, no sustituye asesor\u00eda legal, fiscal ni financiera.\n  <\/p>\n<\/div>\n<\/div>\n<div class=\"brindis\" id=\"brindis\" role=\"status\" aria-live=\"polite\"><\/div>\n<script>\n\/* \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\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\n   UTILIDADES COMPARTIDAS DE LAS HERRAMIENTAS DE VELA\n   \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   Lo que TODAS necesitan y no vale la pena escribir tres veces: avisos flotantes,\n   escapar texto, copiar al portapapeles, guardar en el navegador, leer y escribir el\n   enlace compartible, y dar formato a los n\u00fameros en quetzales.\n\n   Se expone como `window.VH`. Cada herramienta la usa as\u00ed:\n       VH.avisar('Listo');\n       VH.moneda(1234.5)   \u2192  'Q1,234.50'\n   \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\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 *\/\nwindow.VH = (function () {\n  'use strict';\n\n  function $(sel, raiz) { return (raiz || document).querySelector(sel); }\n  function $$(sel, raiz) { return Array.prototype.slice.call((raiz || document).querySelectorAll(sel)); }\n\n  \/** Texto seguro para insertar en el HTML. *\/\n  function escapar(s) {\n    return String(s == null ? '' : s)\n      .replace(\/&\/g, '&amp;').replace(\/<\/g, '&lt;').replace(\/>\/g, '&gt;')\n      .replace(\/\"\/g, '&quot;').replace(\/'\/g, '&#39;');\n  }\n\n  \/** Aviso flotante abajo en el centro. *\/\n  function avisar(texto) {\n    const t = $('#brindis');\n    if (!t) { return; }\n    t.textContent = texto;\n    t.classList.add('visible');\n    clearTimeout(avisar._t);\n    avisar._t = setTimeout(() => t.classList.remove('visible'), 2800);\n  }\n\n  \/** Copia al portapapeles, con respaldo para navegadores viejos. *\/\n  function copiar(texto, mensaje) {\n    const listo = () => avisar(mensaje || 'Copiado.');\n    const viejo = () => {\n      const ta = document.createElement('textarea');\n      ta.value = texto;\n      ta.setAttribute('readonly', '');\n      ta.style.position = 'absolute';\n      ta.style.left = '-9999px';\n      document.body.appendChild(ta);\n      ta.select();\n      try { document.execCommand('copy'); listo(); }\n      catch (e) { avisar('No se pudo copiar: selecciona el texto a mano.'); }\n      document.body.removeChild(ta);\n    };\n    if (navigator.clipboard && navigator.clipboard.writeText) {\n      navigator.clipboard.writeText(texto).then(listo, viejo);\n    } else {\n      viejo();\n    }\n  }\n\n  \/* \u2500\u2500 guardado en el navegador (nada sale del equipo del visitante) \u2500\u2500 *\/\n  function guardar(clave, datos) {\n    try { localStorage.setItem(clave, JSON.stringify(datos)); } catch (e) { \/* modo privado *\/ }\n  }\n  function cargar(clave) {\n    try {\n      const crudo = localStorage.getItem(clave);\n      return crudo ? (JSON.parse(crudo) || null) : null;\n    } catch (e) { return null; }\n  }\n  function borrarGuardado(clave) {\n    try { localStorage.removeItem(clave); } catch (e) { \/* nada *\/ }\n  }\n\n  \/* \u2500\u2500 enlace compartible: #d=campo-1,campo2-3 \u2026 \u2500\u2500 *\/\n  function enlaceConHash(prefijo, pares) {\n    const base = window.location.href.split('#')[0];\n    const partes = Object.keys(pares)\n      .filter((k) => pares[k] !== '' && pares[k] != null)\n      .map((k) => k + '-' + encodeURIComponent(pares[k]));\n    return partes.length ? base + '#' + prefijo + '=' + partes.join(',') : base;\n  }\n  function leerHash(prefijo) {\n    try {\n      const m = decodeURIComponent(window.location.hash || '').match(new RegExp(prefijo + '=([^&]+)'));\n      if (!m) { return null; }\n      const salida = {};\n      m[1].split(',').forEach((par) => {\n        const i = par.indexOf('-');\n        if (i > 0) { salida[par.slice(0, i)] = decodeURIComponent(par.slice(i + 1)); }\n      });\n      return Object.keys(salida).length ? salida : null;\n    } catch (e) { return null; }\n  }\n  function limpiarHash() {\n    try { window.history.replaceState(null, '', window.location.href.split('#')[0]); } catch (e) { \/* nada *\/ }\n  }\n\n  \/* \u2500\u2500 n\u00fameros \u2500\u2500 *\/\n  \/** Lee un n\u00famero escrito por una persona: acepta \u00ab1.234,56\u00bb, \u00ab1,234.56\u00bb y vac\u00edos. *\/\n  function numero(valor) {\n    if (typeof valor === 'number') { return isFinite(valor) ? valor : 0; }\n    let s = String(valor == null ? '' : valor).trim().replace(\/\\s\/g, '').replace(\/Q\/gi, '');\n    if (!s) { return 0; }\n    if (s.indexOf(',') > -1 && s.indexOf('.') > -1) {\n      \/\/ el \u00faltimo separador que aparece es el decimal\n      s = (s.lastIndexOf(',') > s.lastIndexOf('.')) ? s.replace(\/\\.\/g, '').replace(',', '.') : s.replace(\/,\/g, '');\n    } else if (s.indexOf(',') > -1) {\n      s = (s.split(',').pop().length === 3) ? s.replace(\/,\/g, '') : s.replace(',', '.');\n    }\n    const n = parseFloat(s.replace(\/[^0-9.\\-]\/g, ''));\n    return isFinite(n) ? n : 0;\n  }\n\n  \/** Da formato de quetzales: 1234.5 \u2192 \u00abQ1,234.50\u00bb. *\/\n  function moneda(n, decimales) {\n    const d = (decimales === undefined) ? 2 : decimales;\n    const v = isFinite(n) ? n : 0;\n    const neg = v < 0;\n    const partes = Math.abs(v).toFixed(d).split('.');\n    partes[0] = partes[0].replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, ',');\n    return (neg ? '-Q' : 'Q') + partes.join('.');\n  }\n\n  \/** Da formato a un n\u00famero normal (sin quetzales). *\/\n  function cifra(n, decimales) {\n    const d = (decimales === undefined) ? 0 : decimales;\n    const v = isFinite(n) ? n : 0;\n    const partes = v.toFixed(d).split('.');\n    partes[0] = partes[0].replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, ',');\n    return partes.join('.');\n  }\n\n  function porcentaje(parte, total) {\n    if (!total) { return 0; }\n    return Math.round((parte \/ total) * 100);\n  }\n\n  function limitar(n, minimo, maximo) {\n    return Math.min(maximo, Math.max(minimo, n));\n  }\n\n  \/** Imprime (el CSS de impresi\u00f3n ya oculta pesta\u00f1as y botones). *\/\n  function imprimir() { window.print(); }\n\n  return {\n    $: $, $$: $$, escapar: escapar, avisar: avisar, copiar: copiar,\n    guardar: guardar, cargar: cargar, borrarGuardado: borrarGuardado,\n    enlaceConHash: enlaceConHash, leerHash: leerHash, limpiarHash: limpiarHash,\n    numero: numero, moneda: moneda, cifra: cifra, porcentaje: porcentaje,\n    limitar: limitar, imprimir: imprimir\n  };\n})();\n<\/script>\n<script>\n\/* \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\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\n   VALIDADOR DE IDEA DE NEGOCIO\n   \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   Dos partes bien separadas:\n\n   1. LA PRUEBA DE REALIDAD (12 afirmaciones, 4 \u00e1reas): se calcula en el navegador, al\n      instante y sin gastar nada. Da un puntaje y un sem\u00e1foro.\n\n   2. EL AN\u00c1LISIS (el riesgo principal y los tres experimentos): lo escribe el motor de Vela\n      (el mismo del Generador de Buyer Persona) SOLO cuando se pulsa el bot\u00f3n. Se le mandan\n      las respuestas y tambi\u00e9n el puntaje, para que apunte los experimentos a lo que est\u00e1\n      flojo en lugar de dar consejos gen\u00e9ricos.\n\n   Si el motor no est\u00e1 disponible, la herramienta NO se queda en blanco: ense\u00f1a el sem\u00e1foro,\n   el \u00e1rea m\u00e1s floja y tres experimentos de respaldo escritos aqu\u00ed mismo.\n   \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\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 *\/\n(function () {\n  'use strict';\n\n  const VH = window.VH;\n  const CLAVE = 'vela_validador_idea_v1';\n  const API = '\/wp-json\/vela\/v1\/validar-idea';\n\n  \/* \u2500\u2500 1. Las cuatro \u00e1reas y sus doce afirmaciones \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 *\/\n  const BLOQUES = [\n    {\n      id: 'cliente', nombre: 'El problema y el cliente', icono: '\ud83c\udfaf',\n      afirmaciones: [\n        'Puedo nombrar diez personas concretas que tienen este problema.',\n        'S\u00e9 c\u00f3mo resuelven hoy ese problema, aunque lo hagan mal.',\n        'Ese problema les cuesta dinero o tiempo de forma evidente.'\n      ]\n    },\n    {\n      id: 'oferta', nombre: 'Tu oferta', icono: '\ud83d\udce6',\n      afirmaciones: [\n        'Puedo explicar en una frase qu\u00e9 vendo y para qui\u00e9n.',\n        'S\u00e9 por qu\u00e9 me elegir\u00edan a m\u00ed y no a otro.',\n        'Conozco al menos dos competidores y lo que cobran.'\n      ]\n    },\n    {\n      id: 'dinero', nombre: 'Los n\u00fameros', icono: '\ud83d\udcb0',\n      afirmaciones: [\n        'S\u00e9 cu\u00e1nto me cuesta entregar una unidad o un servicio.',\n        'El precio que pienso cobrar cubre esos costos y me deja margen.',\n        'S\u00e9 cu\u00e1ntos clientes necesito al mes para que valga la pena.'\n      ]\n    },\n    {\n      id: 'arranque', nombre: 'El arranque', icono: '\ud83d\ude80',\n      afirmaciones: [\n        'Tengo el tiempo para atender a los primeros clientes.',\n        'Tengo el dinero para empezar sin endeudarme de m\u00e1s.',\n        'S\u00e9 qu\u00e9 har\u00eda primero esta semana si alguien me comprara hoy.'\n      ]\n    }\n  ];\n\n  const OPCIONES = [\n    { valor: 0, texto: 'No' },\n    { valor: 1, texto: 'A medias' },\n    { valor: 2, texto: 'S\u00ed' }\n  ];\n\n  const CAMPOS = ['v-que', 'v-quien', 'v-problema', 'v-hoy', 'v-precio', 'v-competencia',\n                  'v-porque', 'v-recursos', 'v-falta'];\n\n  const EJEMPLO = {\n    'v-que': 'Cajas de desayuno sorpresa a domicilio',\n    'v-quien': 'Parejas j\u00f3venes de la ciudad de Guatemala que celebran aniversarios y cumplea\u00f1os',\n    'v-problema': 'No tienen tiempo ni ideas para sorprender a su pareja en una fecha especial',\n    'v-hoy': 'Piden en un restaurante, compran algo de \u00faltima hora en el supermercado o lo dejan pasar',\n    'v-precio': 'Q180 por caja; me cuesta Q95 entre ingredientes, empaque y moto',\n    'v-competencia': 'Dos panader\u00edas del barrio y una cuenta de Instagram con 4.000 seguidores',\n    'v-porque': 'Entrego el mismo d\u00eda y armo cada caja seg\u00fan lo que le gusta a la pareja',\n    'v-recursos': '10 horas por semana y Q3.000 de ahorro',\n    'v-falta': 'No s\u00e9 si pagar\u00edan por adelantado ni c\u00f3mo conseguir los primeros clientes'\n  };\n\n  const estado = { respuestas: {}, analisis: null };\n\n  \/* \u2500\u2500 2. Pintar las afirmaciones \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 *\/\n  function pintarBloques() {\n    VH.$('#bloques-validador').innerHTML = BLOQUES.map((b) => `\n      <div class=\"bloque-validador\" id=\"bloque-${b.id}\">\n        <h3><span class=\"icono\">${b.icono}<\/span>${VH.escapar(b.nombre)}\n          <span class=\"puntaje-bloque\" id=\"puntaje-${b.id}\">0 de 6<\/span><\/h3>\n        ${b.afirmaciones.map((texto, i) => {\n          const clave = b.id + '-' + i;\n          return `<div class=\"afirmacion\">\n            <span class=\"texto\">${VH.escapar(texto)}<\/span>\n            <span class=\"respuestas\" role=\"group\" aria-label=\"${VH.escapar(texto)}\">\n              ${OPCIONES.map((o) => `<button type=\"button\" class=\"respuesta\" data-afirmacion=\"${clave}\"\n                 data-valor=\"${o.valor}\" aria-pressed=\"false\">${o.texto}<\/button>`).join('')}\n            <\/span>\n          <\/div>`;\n        }).join('')}\n      <\/div>`).join('');\n  }\n\n  \/* \u2500\u2500 3. Puntaje \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\u2500\u2500\u2500\u2500 *\/\n  function puntajeBloque(id) {\n    return BLOQUES.find((b) => b.id === id).afirmaciones\n      .reduce((suma, _, i) => suma + (estado.respuestas[id + '-' + i] || 0), 0);\n  }\n  function respondidas() {\n    return Object.keys(estado.respuestas).filter((k) => estado.respuestas[k] !== undefined).length;\n  }\n  function puntajeTotal() {\n    return BLOQUES.reduce((suma, b) => suma + puntajeBloque(b.id), 0);\n  }\n  function nivel(total) {\n    const pct = Math.round((total \/ 24) * 100);\n    if (pct >= 71) return { clave: 'listo', nombre: 'Lista para probar en peque\u00f1o', pct, pastilla: 'pastilla-verde', estilo: 'post-it-verde' };\n    if (pct >= 42) return { clave: 'pruebas', nombre: 'Necesita pruebas antes de invertir', pct, pastilla: 'pastilla-ambar', estilo: 'post-it-amarillo' };\n    return { clave: 'panales', nombre: 'Todav\u00eda muy verde', pct, pastilla: 'pastilla-rojo', estilo: 'post-it-rosa' };\n  }\n  function areasFlojas() {\n    return BLOQUES.map((b) => ({ id: b.id, nombre: b.nombre, puntos: puntajeBloque(b.id) }))\n      .sort((a, b) => a.puntos - b.puntos).filter((b) => b.puntos < 6)\n      .slice(0, 2).map((b) => b.nombre.toLowerCase());\n  }\n\n  \/* \u2500\u2500 4. Refrescar la pantalla \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 *\/\n  function refrescar() {\n    const n = respondidas();\n    VH.$('#barra-validador').style.width = Math.round((n \/ 12) * 100) + '%';\n    VH.$('#progreso-validador').textContent = n === 12 ? 'Listo: las doce respondidas.'\n      : (n + ' de 12 respondidas' + (n > 0 ? ' \u00b7 ya puedes analizar' : ''));\n\n    BLOQUES.forEach((b) => {\n      const puntos = puntajeBloque(b.id);\n      VH.$('#puntaje-' + b.id).textContent = puntos + ' de 6';\n    });\n    VH.$$('.respuesta').forEach((boton) => {\n      const clave = boton.dataset.afirmacion;\n      boton.setAttribute('aria-pressed', String(estado.respuestas[clave] === Number(boton.dataset.valor)));\n    });\n\n    const total = puntajeTotal();\n    const nl = nivel(total);\n    VH.$('#veredicto-validador').innerHTML =\n      '<div class=\"post-it ' + nl.estilo + '\"><h3 style=\"margin-bottom:.35rem\">' +\n      VH.escapar(nl.nombre) + ' \u00b7 ' + total + ' de 24 puntos<\/h3>' +\n      '<p style=\"margin:0\">' + VH.escapar(lectura(nl, total)) + '<\/p><\/div>';\n\n    guardar();\n  }\n\n  function lectura(nl, total) {\n    const flojas = areasFlojas();\n    if (respondidas() === 0) {\n      return 'Responde las doce afirmaciones y ver\u00e1s aqu\u00ed tu sem\u00e1foro, m\u00e1s el an\u00e1lisis con los tres experimentos.';\n    }\n    const cola = flojas.length\n      ? ' Lo m\u00e1s flojo ahora mismo: ' + flojas.join(' y ') + '. Por ah\u00ed conviene empezar.'\n      : ' No hay \u00e1reas flojas: tus respuestas est\u00e1n completas.';\n    const segun = {\n      listo: 'Tienes lo b\u00e1sico claro. Antes de meter dinero, comprueba con personas reales que pagan: eso es lo que hace el an\u00e1lisis de abajo.',\n      pruebas: 'Hay ideas buenas pero huecos por comprobar. No inviertas todav\u00eda: primero los experimentos de abajo, que cuestan dos semanas y casi nada.',\n      panales: 'Todav\u00eda es una intuici\u00f3n, y eso est\u00e1 bien: significa que puedes averiguar mucho antes de gastar. Empieza por hablar con diez personas de tu lista.'\n    };\n    return segun[nl.clave] + cola;\n  }\n\n  \/* \u2500\u2500 5. El an\u00e1lisis (motor de Vela) \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 *\/\n  function ideaComoTexto() {\n    return {\n      queVendes: valor('v-que'), aQuien: valor('v-quien'), problema: valor('v-problema'),\n      hoyComoLoResuelven: valor('v-hoy'), precio: valor('v-precio'), competencia: valor('v-competencia'),\n      porQueTu: valor('v-porque'), tiempoDinero: valor('v-recursos'), queTeFalta: valor('v-falta')\n    };\n  }\n  function valor(id) { const e = VH.$('#' + id); return e ? String(e.value || '').trim() : ''; }\n\n  async function analizar() {\n    const idea = ideaComoTexto();\n    if (!idea.queVendes && !idea.problema) {\n      VH.avisar('Escribe primero qu\u00e9 vendes o qu\u00e9 problema resuelves.');\n      VH.$('#v-que').focus();\n      return;\n    }\n    const boton = VH.$('#btn-analizar');\n    boton.disabled = true;\n    VH.$('#resultado-validador').innerHTML =\n      '<div class=\"cargando\"><span class=\"spinner-oscuro\"><\/span><span>Analizando tu idea: riesgo, ' +\n      'experimentos y c\u00f3mo medirlos. Tarda unos segundos\u2026<\/span><\/div>';\n    guardar();\n\n    const cuerpo = {\n      idea: idea,\n      evaluacion: {\n        total: puntajeTotal(), maximo: 24,\n        porcentaje: Math.round((puntajeTotal() \/ 24) * 100),\n        nivel: nivel(puntajeTotal()).nombre,\n        flojos: areasFlojas(),\n        respuestas: estado.respuestas\n      }\n    };\n\n    let datos = null;\n    try {\n      const respuesta = await fetch(API, {\n        method: 'POST', headers: { 'Content-Type': 'application\/json' },\n        body: JSON.stringify(cuerpo)\n      });\n      if (respuesta.ok) { datos = await respuesta.json(); }\n    } catch (e) { datos = null; }\n\n    if (!datos || !datos.experimentos || !datos.experimentos.length) {\n      datos = analisisDeRespaldo(cuerpo);\n      VH.avisar('El analizador no respondi\u00f3: te dejo un plan de pruebas igual de \u00fatil.');\n    } else {\n      VH.avisar('An\u00e1lisis listo.');\n    }\n    estado.analisis = datos;\n    pintarAnalisis(datos);\n    boton.disabled = false;\n    guardar();\n  }\n\n  function pintarAnalisis(d) {\n    const lista = (items) => items.map((t) => '<div class=\"alerta\">' + VH.escapar(t) + '<\/div>').join('');\n    VH.$('#resultado-validador').innerHTML =\n      '<div class=\"post-it post-it-azul\"><h3 style=\"margin-bottom:.35rem\">Veredicto<\/h3>' +\n      '<p style=\"margin:0\">' + VH.escapar(d.veredicto) + '<\/p><\/div>' +\n      '<div class=\"analisis-seccion\"><h3>El riesgo que m\u00e1s te puede frenar<\/h3>' +\n      '<div class=\"alerta\"><strong>' + VH.escapar(d.riesgoPrincipal) + '<\/strong><\/div>' +\n      (d.riesgos && d.riesgos.length ? '<h4 style=\"margin-top:1rem\">Otros riesgos a mirar<\/h4>' + lista(d.riesgos) : '') +\n      '<\/div>' +\n      '<div class=\"analisis-seccion\"><h3>Tus tres experimentos de dos semanas<\/h3>' +\n      (d.experimentos || []).map((e, i) => '<div class=\"experimento\">' +\n        '<div class=\"titulo\"><strong>' + (i + 1) + '. ' + VH.escapar(e.titulo) + '<\/strong>' +\n        (e.cuando ? '<span class=\"cuando\">' + VH.escapar(e.cuando) + '<\/span>' : '') + '<\/div>' +\n        '<div class=\"campo\"><strong>Qu\u00e9 hacer:<\/strong> ' + VH.escapar(e.queHacer) + '<\/div>' +\n        '<div class=\"campo\"><strong>C\u00f3mo saber si funcion\u00f3:<\/strong> ' + VH.escapar(e.comoMedir) + '<\/div>' +\n        '<\/div>').join('') + '<\/div>' +\n      '<div class=\"analisis-seccion\"><h3>Tu primer paso<\/h3>' +\n      '<div class=\"primer-paso\"><strong>Hoy mismo:<\/strong> ' + VH.escapar(d.primerPaso) + '<\/div><\/div>' +\n      '<div class=\"analisis-seccion\"><h3>Cu\u00e1ndo conviene cambiar de idea<\/h3>' +\n      '<div class=\"aviso\">' + VH.escapar(d.senalDeParada) + '<\/div><\/div>' +\n      (d.preguntas && d.preguntas.length\n        ? '<div class=\"analisis-seccion\"><h3>Responde esto antes de invertir<\/h3><ul class=\"lista\">' +\n          d.preguntas.map((p) => '<li>' + VH.escapar(p) + '<\/li>').join('') + '<\/ul><\/div>'\n        : '');\n  }\n\n  \/** Respaldo: si el motor no contesta, tres experimentos escritos aqu\u00ed mismo. *\/\n  function analisisDeRespaldo(cuerpo) {\n    const idea = cuerpo.idea;\n    const aQuien = idea.aQuien || 'tus posibles clientes';\n    const problema = idea.problema || 'lo que hoy les cuesta';\n    return {\n      veredicto: 'Con lo que escribiste, tu idea se puede probar sin gastar casi nada. Antes de invertir, ' +\n        'habla con diez personas de tu lista y trata de cobrar por adelantado: lo que te contesten vale m\u00e1s ' +\n        'que cualquier plan.',\n      riesgoPrincipal: 'Dar por hecho que ' + aQuien + ' tiene el problema que imaginas, sin comprobarlo con ellos.',\n      riesgos: [\n        'Que el problema no sea urgente: si hoy nadie paga por resolverlo de alguna forma, no es prioridad.',\n        'Que el precio no cubra tus costos ni tu tiempo.',\n        'Que consigas clientes solo uno por uno, sin un canal que se repita.'\n      ],\n      experimentos: [\n        { titulo: 'Diez conversaciones', cuando: 'Esta semana',\n          queHacer: 'Habla con diez personas de tu lista y preg\u00fantales c\u00f3mo resuelven hoy ' + problema +\n            '. No vendas: escucha y anota sus palabras exactas.',\n          comoMedir: 'Cu\u00e1ntas de las diez describen el problema sin que t\u00fa lo menciones (busca cinco o m\u00e1s).' },\n        { titulo: 'Preventa de prueba', cuando: 'D\u00edas 8 a 12',\n          queHacer: 'Ofrece el producto o servicio a tres de esas personas con el precio real y pide una se\u00f1al o el pago completo.',\n          comoMedir: 'Cu\u00e1ntos pagan algo. Una venta real vale m\u00e1s que veinte \u00abme interesa\u00bb.' },\n        { titulo: 'Piloto peque\u00f1o', cuando: 'D\u00edas 13 y 14',\n          queHacer: 'Entrega a esos primeros clientes con lo m\u00ednimo que funcione y cronometra el tiempo y el dinero que te cuesta cada entrega.',\n          comoMedir: 'Tu margen real por venta despu\u00e9s de contar tu tiempo.' }\n      ],\n      primerPaso: 'Escribe hoy la lista de diez personas a las que les puedes preguntar y agenda la primera conversaci\u00f3n para ma\u00f1ana.',\n      senalDeParada: 'Si tras diez conversaciones nadie describe el problema como urgente y nadie paga una prueba, cambia el cliente o el problema.',\n      preguntas: ['\u00bfQui\u00e9n paga hoy por resolver esto y cu\u00e1nto paga?',\n                  '\u00bfPuedo llegar a diez clientes sin gastar en publicidad?',\n                  '\u00bfCu\u00e1nto necesito vender al mes para que valga la pena?']\n    };\n  }\n\n  \/* \u2500\u2500 6. Guardar, compartir, 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 *\/\n  function guardar() {\n    const campos = {};\n    CAMPOS.forEach((id) => { campos[id] = valor(id); });\n    VH.guardar(CLAVE, { campos: campos, respuestas: estado.respuestas, analisis: estado.analisis });\n  }\n\n  function resumen() {\n    const total = puntajeTotal();\n    const nl = nivel(total);\n    const l = [];\n    l.push('VALIDACI\u00d3N DE IDEA DE NEGOCIO \u2014 Vela Producciones');\n    l.push(new Date().toLocaleDateString('es-GT'));\n    l.push('');\n    l.push('MI IDEA');\n    CAMPOS.forEach((id) => {\n      const etiqueta = (VH.$('label[for=\"' + id + '\"]') || {}).innerText || id;\n      if (valor(id)) { l.push('  ' + etiqueta + ': ' + valor(id)); }\n    });\n    l.push('');\n    l.push('PRUEBA DE REALIDAD: ' + total + ' de 24 puntos (' + nl.pct + '%) \u2014 ' + nl.nombre);\n    BLOQUES.forEach((b) => { l.push('  \u00b7 ' + b.nombre + ': ' + puntajeBloque(b.id) + ' de 6'); });\n    l.push('');\n    if (estado.analisis) {\n      const d = estado.analisis;\n      l.push('VEREDICTO: ' + d.veredicto);\n      l.push('');\n      l.push('RIESGO PRINCIPAL: ' + d.riesgoPrincipal);\n      (d.riesgos || []).forEach((r) => l.push('  \u00b7 ' + r));\n      l.push('');\n      l.push('EXPERIMENTOS DE DOS SEMANAS');\n      (d.experimentos || []).forEach((e, i) => {\n        l.push('  ' + (i + 1) + '. ' + e.titulo + (e.cuando ? ' (' + e.cuando + ')' : ''));\n        l.push('     Qu\u00e9 hacer: ' + e.queHacer);\n        l.push('     C\u00f3mo medirlo: ' + e.comoMedir);\n      });\n      l.push('');\n      l.push('PRIMER PASO: ' + d.primerPaso);\n      l.push('SE\u00d1AL PARA CAMBIAR DE IDEA: ' + d.senalDeParada);\n    } else {\n      l.push('(Pulsa \u00abAnalizar mi idea\u00bb para completar el informe.)');\n    }\n    l.push('');\n    l.push('Herramienta gratuita de Vela Producciones \u00b7 velaproducciones.com');\n    return l.join('\\n');\n  }\n\n  \/* \u2500\u2500 7. Eventos \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\u2500\u2500\u2500\u2500 *\/\n  function eventos() {\n    \/\/ respuestas (delegado: sirve igual si se repinta el bloque)\n    VH.$('#bloques-validador').addEventListener('click', (e) => {\n      const boton = e.target.closest('.respuesta');\n      if (!boton) { return; }\n      const clave = boton.dataset.afirmacion;\n      const val = Number(boton.dataset.valor);\n      estado.respuestas[clave] = (estado.respuestas[clave] === val) ? undefined : val;\n      refrescar();\n    });\n    CAMPOS.forEach((id) => {\n      const el = VH.$('#' + id);\n      if (el) { el.addEventListener('input', guardar); }\n    });\n\n    VH.$('#btn-analizar').addEventListener('click', analizar);\n    VH.$('#btn-imprimir').addEventListener('click', () => VH.imprimir());\n    VH.$('#btn-copiar').addEventListener('click', () => VH.copiar(resumen(), 'An\u00e1lisis copiado.'));\n    VH.$('#btn-ejemplo').addEventListener('click', () => {\n      Object.keys(EJEMPLO).forEach((id) => { const el = VH.$('#' + id); if (el) { el.value = EJEMPLO[id]; } });\n      estado.respuestas = {\n        'cliente-0': 2, 'cliente-1': 2, 'cliente-2': 1,\n        'oferta-0': 2, 'oferta-1': 1, 'oferta-2': 2,\n        'dinero-0': 2, 'dinero-1': 1, 'dinero-2': 0,\n        'arranque-0': 2, 'arranque-1': 1, 'arranque-2': 2\n      };\n      estado.analisis = null;\n      VH.$('#resultado-validador').innerHTML = '';\n      refrescar();\n      VH.avisar('Ejemplo cargado: pulsa \u00abAnalizar mi idea\u00bb para ver el informe.');\n    });\n    VH.$('#btn-reiniciar').addEventListener('click', () => {\n      if (!window.confirm('\u00bfBorrar tus respuestas y empezar de nuevo?')) { return; }\n      CAMPOS.forEach((id) => { const el = VH.$('#' + id); if (el) { el.value = ''; } });\n      estado.respuestas = {};\n      estado.analisis = null;\n      VH.$('#resultado-validador').innerHTML = '';\n      VH.borrarGuardado(CLAVE);\n      VH.limpiarHash();\n      refrescar();\n      VH.avisar('Listo: todo en blanco.');\n    });\n  }\n\n  \/* \u2500\u2500 8. Arranque \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\u2500\u2500\u2500 *\/\n  function arrancar() {\n    pintarBloques();\n    const guardado = VH.cargar(CLAVE);\n    if (guardado) {\n      if (guardado.campos) {\n        Object.keys(guardado.campos).forEach((id) => { const el = VH.$('#' + id); if (el) { el.value = guardado.campos[id]; } });\n      }\n      if (guardado.respuestas) { estado.respuestas = guardado.respuestas; }\n      if (guardado.analisis) { estado.analisis = guardado.analisis; }\n    }\n    eventos();\n    refrescar();\n    if (estado.analisis) { pintarAnalisis(estado.analisis); }\n  }\n\n  arrancar();\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":5,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-17437","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Validador de idea de negocio: \u00bfse puede probar ya? | Vela Producciones<\/title>\n<meta name=\"description\" content=\"Comprueba en 12 preguntas si tu idea de negocio se puede probar ya, qu\u00e9 riesgo corre y qu\u00e9 tres experimentos hacer en dos semanas. Gratis y sin registro.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/velaproducciones.com\/en\/validador-de-idea-de-negocio\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Validador de idea de negocio: \u00bfse puede probar ya? | Vela Producciones\" \/>\n<meta property=\"og:description\" content=\"Comprueba en 12 preguntas si tu idea de negocio se puede probar ya, qu\u00e9 riesgo corre y qu\u00e9 tres experimentos hacer en dos semanas. Gratis y sin registro.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/velaproducciones.com\/en\/validador-de-idea-de-negocio\/\" \/>\n<meta property=\"og:site_name\" content=\"Vela Producciones\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-16T20:17:27+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/velaproducciones.com\/wp-content\/uploads\/2024\/11\/vela-producciones.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1080\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/velaproducciones.com\\\/validador-de-idea-de-negocio\\\/\",\"url\":\"https:\\\/\\\/velaproducciones.com\\\/validador-de-idea-de-negocio\\\/\",\"name\":\"Validador de idea de negocio: \u00bfse puede probar ya? | Vela Producciones\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/velaproducciones.com\\\/#website\"},\"datePublished\":\"2026-10-10T03:54:52+00:00\",\"dateModified\":\"2026-10-16T20:17:27+00:00\",\"description\":\"Comprueba en 12 preguntas si tu idea de negocio se puede probar ya, qu\u00e9 riesgo corre y qu\u00e9 tres experimentos hacer en dos semanas. Gratis y sin registro.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/velaproducciones.com\\\/validador-de-idea-de-negocio\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/velaproducciones.com\\\/validador-de-idea-de-negocio\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/velaproducciones.com\\\/validador-de-idea-de-negocio\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/velaproducciones.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Validador de Idea de Negocio\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/velaproducciones.com\\\/#website\",\"url\":\"https:\\\/\\\/velaproducciones.com\\\/\",\"name\":\"Vela Producciones\",\"description\":\"Creaci\u00f3n y Manejo de P\u00e1ginas WEB, Optimizaci\u00f3n SEO y de Estrategias de Marketing Digital\",\"publisher\":{\"@id\":\"https:\\\/\\\/velaproducciones.com\\\/#organization\"},\"alternateName\":\"VelaWeb\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/velaproducciones.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Organization\",\"LocalBusiness\",\"ProfessionalService\"],\"@id\":\"https:\\\/\\\/velaproducciones.com\\\/#organization\",\"name\":\"Vela Producciones\",\"alternateName\":[\"Grupo Vela S.A.\",\"Vela Producciones Guatemala\"],\"url\":\"https:\\\/\\\/velaproducciones.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/velaproducciones.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/velaproducciones.com\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/Logo_Vela_Producciones-500x500-1.png\",\"contentUrl\":\"https:\\\/\\\/velaproducciones.com\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/Logo_Vela_Producciones-500x500-1.png\",\"width\":540,\"height\":540,\"caption\":\"Grupo Vela S.A.\"},\"image\":{\"@id\":\"https:\\\/\\\/velaproducciones.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/company\\\/velaproducciones\",\"https:\\\/\\\/www.instagram.com\\\/velawebproducciones\\\/\",\"https:\\\/\\\/www.facebook.com\\\/VelaWebProducciones\"],\"legalName\":\"Grupo Vela S.A.\",\"description\":\"Vela Producciones es la divisi\u00f3n comercial de Grupo Vela S.A. para marketing digital, producci\u00f3n audiovisual y eventos, en Ciudad de Guatemala. Estrategia, contenido, posicionamiento (SEO y visibilidad en asistentes de IA), pauta y producci\u00f3n, con medici\u00f3n.\",\"address\":{\"@type\":\"PostalAddress\",\"streetAddress\":\"Edificio 01010, oficina 702\",\"addressLocality\":\"Ciudad de Guatemala\",\"addressRegion\":\"Guatemala\",\"postalCode\":\"01010\",\"addressCountry\":\"GT\"},\"telephone\":\"+502 2220-9556\",\"contactPoint\":[{\"@type\":\"ContactPoint\",\"contactType\":\"customer service\",\"telephone\":\"+502 2220-9556\",\"areaServed\":\"GT\",\"availableLanguage\":[\"es\"]},{\"@type\":\"ContactPoint\",\"contactType\":\"sales\",\"telephone\":\"+1 305 447-7124\",\"areaServed\":\"US\",\"availableLanguage\":[\"es\",\"en\"]}],\"areaServed\":[{\"@type\":\"Country\",\"name\":\"Guatemala\"},{\"@type\":\"Country\",\"name\":\"Estados Unidos\"}],\"openingHoursSpecification\":[{\"@type\":\"OpeningHoursSpecification\",\"dayOfWeek\":[\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\"],\"opens\":\"09:00\",\"closes\":\"17:00\"}],\"knowsAbout\":[\"Marketing digital\",\"Posicionamiento en buscadores (SEO)\",\"Visibilidad en asistentes de IA (GEO y AEO)\",\"Comercio electr\u00f3nico y WooCommerce\",\"Redes sociales\",\"Google Ads y Meta Ads\",\"Producci\u00f3n audiovisual\",\"Transmisi\u00f3n de eventos\",\"Fotograf\u00eda comercial\",\"Anal\u00edtica y medici\u00f3n\"],\"hasOfferCatalog\":{\"@type\":\"OfferCatalog\",\"name\":\"Servicios de Vela Producciones\",\"itemListElement\":[{\"@type\":\"Offer\",\"itemOffered\":{\"@type\":\"Service\",\"name\":\"Desarrollo web y ecommerce\",\"description\":\"Sitios web, tiendas en l\u00ednea, optimizaci\u00f3n de velocidad y estructura t\u00e9cnica.\"}},{\"@type\":\"Offer\",\"itemOffered\":{\"@type\":\"Service\",\"name\":\"Posicionamiento SEO\",\"description\":\"Optimizaci\u00f3n org\u00e1nica: investigaci\u00f3n de palabras clave, contenido, enlazado interno y t\u00e9cnico.\"}},{\"@type\":\"Offer\",\"itemOffered\":{\"@type\":\"Service\",\"name\":\"GEO y AEO (visibilidad en asistentes de IA)\",\"description\":\"Optimizaci\u00f3n para que ChatGPT, Gemini y Perplexity citen y recomienden la marca: datos estructurados, entidad consistente y medici\u00f3n.\"}},{\"@type\":\"Offer\",\"itemOffered\":{\"@type\":\"Service\",\"name\":\"Redes sociales\",\"description\":\"Estrategia, producci\u00f3n de contenido y calendarizaci\u00f3n para Instagram, Facebook, TikTok y LinkedIn.\"}},{\"@type\":\"Offer\",\"itemOffered\":{\"@type\":\"Service\",\"name\":\"Campa\u00f1as SEM y pauta digital\",\"description\":\"Google Ads, Meta Ads y TikTok Ads, con seguimiento de conversiones.\"}},{\"@type\":\"Offer\",\"itemOffered\":{\"@type\":\"Service\",\"name\":\"Producci\u00f3n de video corporativo\",\"description\":\"Spots publicitarios, videos institucionales, reels y piezas narrativas para marca.\"}},{\"@type\":\"Offer\",\"itemOffered\":{\"@type\":\"Service\",\"name\":\"Transmisiones y cobertura de eventos\",\"description\":\"Producci\u00f3n multic\u00e1mara, streaming en vivo y cobertura para eventos corporativos.\"}},{\"@type\":\"Offer\",\"itemOffered\":{\"@type\":\"Service\",\"name\":\"Fotograf\u00eda comercial\",\"description\":\"Producto, corporativa y de eventos.\"}},{\"@type\":\"Offer\",\"itemOffered\":{\"@type\":\"Service\",\"name\":\"Dise\u00f1o de marca e identidad visual\",\"description\":\"Logotipo, manual de marca y aplicaciones.\"}},{\"@type\":\"Offer\",\"itemOffered\":{\"@type\":\"Service\",\"name\":\"Anal\u00edtica y reportes\",\"description\":\"Configuraci\u00f3n de medici\u00f3n y reportes de resultados por canal.\"}}]}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Validador de idea de negocio: \u00bfse puede probar ya? | Vela Producciones","description":"Comprueba en 12 preguntas si tu idea de negocio se puede probar ya, qu\u00e9 riesgo corre y qu\u00e9 tres experimentos hacer en dos semanas. Gratis y sin registro.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/velaproducciones.com\/en\/validador-de-idea-de-negocio\/","og_locale":"en_US","og_type":"article","og_title":"Validador de idea de negocio: \u00bfse puede probar ya? | Vela Producciones","og_description":"Comprueba en 12 preguntas si tu idea de negocio se puede probar ya, qu\u00e9 riesgo corre y qu\u00e9 tres experimentos hacer en dos semanas. Gratis y sin registro.","og_url":"https:\/\/velaproducciones.com\/en\/validador-de-idea-de-negocio\/","og_site_name":"Vela Producciones","article_modified_time":"2026-10-16T20:17:27+00:00","og_image":[{"width":1080,"height":1080,"url":"https:\/\/velaproducciones.com\/wp-content\/uploads\/2024\/11\/vela-producciones.png","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/velaproducciones.com\/validador-de-idea-de-negocio\/","url":"https:\/\/velaproducciones.com\/validador-de-idea-de-negocio\/","name":"Validador de idea de negocio: \u00bfse puede probar ya? | Vela Producciones","isPartOf":{"@id":"https:\/\/velaproducciones.com\/#website"},"datePublished":"2026-10-10T03:54:52+00:00","dateModified":"2026-10-16T20:17:27+00:00","description":"Comprueba en 12 preguntas si tu idea de negocio se puede probar ya, qu\u00e9 riesgo corre y qu\u00e9 tres experimentos hacer en dos semanas. Gratis y sin registro.","breadcrumb":{"@id":"https:\/\/velaproducciones.com\/validador-de-idea-de-negocio\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/velaproducciones.com\/validador-de-idea-de-negocio\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/velaproducciones.com\/validador-de-idea-de-negocio\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/velaproducciones.com\/"},{"@type":"ListItem","position":2,"name":"Validador de Idea de Negocio"}]},{"@type":"WebSite","@id":"https:\/\/velaproducciones.com\/#website","url":"https:\/\/velaproducciones.com\/","name":"Vela Producciones","description":"Creaci\u00f3n y Manejo de P\u00e1ginas WEB, Optimizaci\u00f3n SEO y de Estrategias de Marketing Digital","publisher":{"@id":"https:\/\/velaproducciones.com\/#organization"},"alternateName":"VelaWeb","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/velaproducciones.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Organization","LocalBusiness","ProfessionalService"],"@id":"https:\/\/velaproducciones.com\/#organization","name":"Vela Producciones","alternateName":["Grupo Vela S.A.","Vela Producciones Guatemala"],"url":"https:\/\/velaproducciones.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/velaproducciones.com\/#\/schema\/logo\/image\/","url":"https:\/\/velaproducciones.com\/wp-content\/uploads\/2024\/11\/Logo_Vela_Producciones-500x500-1.png","contentUrl":"https:\/\/velaproducciones.com\/wp-content\/uploads\/2024\/11\/Logo_Vela_Producciones-500x500-1.png","width":540,"height":540,"caption":"Grupo Vela S.A."},"image":{"@id":"https:\/\/velaproducciones.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/velaproducciones","https:\/\/www.instagram.com\/velawebproducciones\/","https:\/\/www.facebook.com\/VelaWebProducciones"],"legalName":"Grupo Vela S.A.","description":"Vela Producciones es la divisi\u00f3n comercial de Grupo Vela S.A. para marketing digital, producci\u00f3n audiovisual y eventos, en Ciudad de Guatemala. Estrategia, contenido, posicionamiento (SEO y visibilidad en asistentes de IA), pauta y producci\u00f3n, con medici\u00f3n.","address":{"@type":"PostalAddress","streetAddress":"Edificio 01010, oficina 702","addressLocality":"Ciudad de Guatemala","addressRegion":"Guatemala","postalCode":"01010","addressCountry":"GT"},"telephone":"+502 2220-9556","contactPoint":[{"@type":"ContactPoint","contactType":"customer service","telephone":"+502 2220-9556","areaServed":"GT","availableLanguage":["es"]},{"@type":"ContactPoint","contactType":"sales","telephone":"+1 305 447-7124","areaServed":"US","availableLanguage":["es","en"]}],"areaServed":[{"@type":"Country","name":"Guatemala"},{"@type":"Country","name":"Estados Unidos"}],"openingHoursSpecification":[{"@type":"OpeningHoursSpecification","dayOfWeek":["Monday","Tuesday","Wednesday","Thursday","Friday"],"opens":"09:00","closes":"17:00"}],"knowsAbout":["Marketing digital","Posicionamiento en buscadores (SEO)","Visibilidad en asistentes de IA (GEO y AEO)","Comercio electr\u00f3nico y WooCommerce","Redes sociales","Google Ads y Meta Ads","Producci\u00f3n audiovisual","Transmisi\u00f3n de eventos","Fotograf\u00eda comercial","Anal\u00edtica y medici\u00f3n"],"hasOfferCatalog":{"@type":"OfferCatalog","name":"Servicios de Vela Producciones","itemListElement":[{"@type":"Offer","itemOffered":{"@type":"Service","name":"Desarrollo web y ecommerce","description":"Sitios web, tiendas en l\u00ednea, optimizaci\u00f3n de velocidad y estructura t\u00e9cnica."}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Posicionamiento SEO","description":"Optimizaci\u00f3n org\u00e1nica: investigaci\u00f3n de palabras clave, contenido, enlazado interno y t\u00e9cnico."}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"GEO y AEO (visibilidad en asistentes de IA)","description":"Optimizaci\u00f3n para que ChatGPT, Gemini y Perplexity citen y recomienden la marca: datos estructurados, entidad consistente y medici\u00f3n."}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Redes sociales","description":"Estrategia, producci\u00f3n de contenido y calendarizaci\u00f3n para Instagram, Facebook, TikTok y LinkedIn."}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Campa\u00f1as SEM y pauta digital","description":"Google Ads, Meta Ads y TikTok Ads, con seguimiento de conversiones."}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Producci\u00f3n de video corporativo","description":"Spots publicitarios, videos institucionales, reels y piezas narrativas para marca."}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Transmisiones y cobertura de eventos","description":"Producci\u00f3n multic\u00e1mara, streaming en vivo y cobertura para eventos corporativos."}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Fotograf\u00eda comercial","description":"Producto, corporativa y de eventos."}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Dise\u00f1o de marca e identidad visual","description":"Logotipo, manual de marca y aplicaciones."}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Anal\u00edtica y reportes","description":"Configuraci\u00f3n de medici\u00f3n y reportes de resultados por canal."}}]}}]}},"_links":{"self":[{"href":"https:\/\/velaproducciones.com\/en\/wp-json\/wp\/v2\/pages\/17437","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/velaproducciones.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/velaproducciones.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/velaproducciones.com\/en\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/velaproducciones.com\/en\/wp-json\/wp\/v2\/comments?post=17437"}],"version-history":[{"count":1,"href":"https:\/\/velaproducciones.com\/en\/wp-json\/wp\/v2\/pages\/17437\/revisions"}],"predecessor-version":[{"id":17438,"href":"https:\/\/velaproducciones.com\/en\/wp-json\/wp\/v2\/pages\/17437\/revisions\/17438"}],"wp:attachment":[{"href":"https:\/\/velaproducciones.com\/en\/wp-json\/wp\/v2\/media?parent=17437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}