{"id":17440,"date":"2026-10-09T21:57:06","date_gmt":"2026-10-10T03:57:06","guid":{"rendered":"https:\/\/velaproducciones.com\/plan-de-contenido-de-30-dias\/"},"modified":"2026-10-16T14:17:30","modified_gmt":"2026-10-16T20:17:30","slug":"plan-de-contenido-de-30-dias","status":"publish","type":"page","link":"https:\/\/velaproducciones.com\/en\/plan-de-contenido-de-30-dias\/","title":{"rendered":"30-Day Content Plan"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"17440\" class=\"elementor elementor-17440 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-85bb9871 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"85bb9871\" 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-ac75fccc\" data-id=\"ac75fccc\" 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-6fbad5bc elementor-widget elementor-widget-html\" data-id=\"6fbad5bc\" 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<!-- Plan de contenido de 30 d\u00edas \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 plan de contenido \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.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\/* redes: casillas con forma de tarjeta, como en el Generador de Buyer Persona *\/\n.red{display:flex; flex-direction:column; align-items:center; justify-content:center; gap:.2rem; height:74px;\n  border:2px solid var(--slate-200); border-radius:.75rem; cursor:pointer; transition:all .2s; font-size:.82rem;\n  font-weight:600; text-align:center; padding:.4rem}\n.red:hover{border-color:#e2ddf9; transform:translateY(-2px)}\n.red .emoji{font-size:1.35rem; line-height:1}\n#c-redes input{position:absolute; opacity:0; width:0; height:0}\n#c-redes input:checked + .red{background:var(--indigo-suave); border-color:var(--indigo); color:var(--indigo-oscuro)}\n\n\/* plan: semanas y publicaciones *\/\n.semana{margin-bottom:1.5rem}\n.semana h3{display:flex; align-items:center; gap:.5rem; margin-bottom:.75rem}\n.pieza{border:1px solid var(--slate-200); border-radius:.85rem; padding:1rem; margin-bottom:.85rem; background:#fff;\n  border-left:4px solid var(--indigo)}\n.pieza .cabecera{display:flex; flex-wrap:wrap; gap:.5rem; align-items:center; justify-content:space-between; margin-bottom:.4rem}\n.pieza .titulo{font-weight:800; color:var(--slate-900); font-size:1rem; min-width:0}\n.pieza .meta{display:flex; flex-wrap:wrap; gap:.35rem}\n.pieza .campo{margin-top:.45rem; font-size:.92rem}\n.pieza .campo strong{color:var(--indigo-oscuro)}\n.pieza .etiquetas{color:var(--indigo); font-size:.82rem; margin-top:.45rem; overflow-wrap:anywhere}\n.pastilla-red{background:#f4f2ff; color:var(--indigo-oscuro); border-color:#e2ddf9}\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@media (max-width:640px){ .pieza{padding:.85rem} }\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>Tu plan de contenido, en 30 d\u00edas<\/h1>\n    <p class=\"gris\" style=\"margin:.25rem 0 1rem\">Dinos qu\u00e9 haces, a qui\u00e9n le vendes y con qu\u00e9 frecuencia\n      quieres publicar. Te devolvemos el plan del mes: qu\u00e9 publicar cada d\u00eda, con qu\u00e9 gancho, qu\u00e9 decir y\n      qu\u00e9 pedir al final. Todo pensado para grabarse con el tel\u00e9fono en menos de una hora.<\/p>\n    <p class=\"nota\" style=\"margin:0\">No publicamos nada por ti: el plan es para que lo ejecutes a tu ritmo.<\/p>\n  <\/div>\n\n  <!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 DATOS DEL NEGOCIO \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 de tu negocio<\/h2>\n    <div class=\"fila-campos dos\">\n      <div>\n        <label class=\"form-label\" for=\"c-que\">\u00bfQu\u00e9 hace tu negocio?<\/label>\n        <textarea class=\"form-textarea\" id=\"c-que\" rows=\"2\" placeholder=\"Ej: fotograf\u00edo productos para tiendas peque\u00f1as que venden por Instagram\"><\/textarea>\n      <\/div>\n      <div>\n        <label class=\"form-label\" for=\"c-quien\">\u00bfA qui\u00e9n le vendes?<\/label>\n        <textarea class=\"form-textarea\" id=\"c-quien\" rows=\"2\" placeholder=\"Ej: due\u00f1as de tiendas de ropa y cosm\u00e9ticos que atienden solas su Instagram\"><\/textarea>\n      <\/div>\n    <\/div>\n\n    <div style=\"margin-top:1.25rem\">\n      <label class=\"form-label\">\u00bfD\u00f3nde vas a publicar?<\/label>\n      <div class=\"rejilla rejilla-4\" id=\"c-redes\"><\/div>\n    <\/div>\n\n    <div class=\"fila-campos tres\" style=\"margin-top:1.25rem\">\n      <div>\n        <label class=\"form-label\" for=\"c-objetivo\">\u00bfQu\u00e9 quieres conseguir?<\/label>\n        <select class=\"form-select\" id=\"c-objetivo\">\n          <option value=\"dar a conocer el negocio\">Que me conozcan<\/option>\n          <option value=\"captar contactos\">Conseguir contactos<\/option>\n          <option value=\"vender\">Vender<\/option>\n        <\/select>\n      <\/div>\n      <div>\n        <label class=\"form-label\" for=\"c-frecuencia\">\u00bfCu\u00e1ntas publicaciones por semana?<\/label>\n        <select class=\"form-select\" id=\"c-frecuencia\">\n          <option value=\"2\">2 (8 al mes)<\/option>\n          <option value=\"3\" selected>3 (12 al mes)<\/option>\n          <option value=\"4\">4 (16 al mes)<\/option>\n          <option value=\"5\">5 (20 al mes)<\/option>\n        <\/select>\n      <\/div>\n      <div>\n        <label class=\"form-label\" for=\"c-tono\">\u00bfC\u00f3mo quieres sonar?<\/label>\n        <input class=\"form-input\" id=\"c-tono\" type=\"text\" placeholder=\"Ej: cercano y directo, sin tecnicismos\">\n      <\/div>\n    <\/div>\n\n    <div class=\"fila-campos dos\" style=\"margin-top:1.25rem\">\n      <div>\n        <label class=\"form-label\" for=\"c-temas\">\u00bfQu\u00e9 temas dominas y puedes ense\u00f1ar?<\/label>\n        <textarea class=\"form-textarea\" id=\"c-temas\" rows=\"2\" placeholder=\"Ej: iluminaci\u00f3n con luz natural, fotos con celular, cat\u00e1logos para vender\"><\/textarea>\n      <\/div>\n      <div>\n        <label class=\"form-label\" for=\"c-evitar\">\u00bfQu\u00e9 NO quieres tocar?<\/label>\n        <textarea class=\"form-textarea\" id=\"c-evitar\" rows=\"2\" placeholder=\"Ej: no hablar de precios exactos ni de pol\u00edtica\"><\/textarea>\n      <\/div>\n    <\/div>\n\n    <div class=\"acciones\" style=\"margin-top:1.25rem\">\n      <button class=\"btn btn-primario\" id=\"btn-generar\">Generar mi plan del mes<\/button>\n      <button class=\"btn btn-ejemplo\" id=\"btn-ejemplo\">Ver un ejemplo<\/button>\n    <\/div>\n  <\/div>\n\n  <div id=\"aviso-contenido\"><\/div>\n  <div id=\"plan-contenido\"><\/div>\n\n  <div class=\"acciones no-imprimir\">\n    <button class=\"btn btn-copiar\" id=\"btn-copiar\">Copiar el plan completo<\/button>\n    <button class=\"btn btn-copiar\" id=\"btn-csv\">Copiar como tabla (Excel)<\/button>\n    <button class=\"btn btn-secundario\" id=\"btn-imprimir\">Imprimir \/ Guardar en PDF<\/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 Tu plan se guarda solo en este navegador. Nada se publica ni se env\u00eda a tus redes: son ideas para que las grabes o escribas t\u00fa.\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   PLAN DE CONTENIDO DE 30 D\u00cdAS\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   Pide al motor de Vela (\/wp-json\/vela\/v1\/plan-contenido) un plan del mes: tres pilares de\n   contenido y las publicaciones repartidas en cuatro semanas, cada una con formato, gancho,\n   desarrollo, llamado a la acci\u00f3n y etiquetas.\n\n   Si el motor no responde, la herramienta arma un plan de respaldo aqu\u00ed mismo (formatos que\n   funcionan, rotados con los temas del negocio): nunca se queda en blanco.\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  const VH = window.VH;\n  const CLAVE = 'vela_plan_contenido_v1';\n  const API = '\/wp-json\/vela\/v1\/plan-contenido';\n\n  const REDES = [\n    { id: 'Instagram', emoji: '\ud83d\udcf8' }, { id: 'Facebook', emoji: '\ud83d\udc4d' },\n    { id: 'TikTok', emoji: '\ud83c\udfb5' }, { id: 'LinkedIn', emoji: '\ud83d\udcbc' },\n    { id: 'WhatsApp', emoji: '\ud83d\udcac' }, { id: 'YouTube', emoji: '\u25b6\ufe0f' }\n  ];\n  const CAMPOS = ['c-que', 'c-quien', 'c-objetivo', 'c-frecuencia', 'c-tono', 'c-temas', 'c-evitar'];\n\n  const EJEMPLO = {\n    'c-que': 'Fotograf\u00eda de producto para tiendas peque\u00f1as que venden por Instagram',\n    'c-quien': 'Due\u00f1as de tiendas de ropa y cosm\u00e9ticos que atienden solas sus redes',\n    'c-objetivo': 'captar contactos',\n    'c-frecuencia': '3',\n    'c-tono': 'cercano y directo, sin tecnicismos',\n    'c-temas': 'luz natural, fotos con celular, cat\u00e1logos que venden',\n    'c-evitar': 'no hablar de precios exactos'\n  };\n\n  const FORMATOS_RESPALDO = [\n    ['Reel', '3 errores que casi todos cometen con {tema}', 'Muestra los tres errores, uno cada 5 segundos, y cierra con el consejo que los evita.', 'Guarda este video para no repetirlos.'],\n    ['Carrusel', 'Lo que nadie te dice sobre {tema}', 'Una idea por l\u00e1mina; la \u00faltima con el resumen y tu contacto.', 'Guarda el carrusel y m\u00e1ndaselo a quien le sirva.'],\n    ['Historia', 'Pregunta r\u00e1pida sobre {tema}', 'Una encuesta de dos opciones y luego cuentas qu\u00e9 contest\u00f3 la mayor\u00eda.', 'Responde la encuesta y cu\u00e9ntame tu caso.'],\n    ['Publicaci\u00f3n de texto', 'El error que me cost\u00f3 dinero con {tema}', 'Cuenta el caso en primera persona: qu\u00e9 pas\u00f3, qu\u00e9 aprendiste y qu\u00e9 haces ahora.', 'Cu\u00e9ntame si te pas\u00f3 algo parecido.'],\n    ['Reel', 'C\u00f3mo se hace {tema} en 5 pasos', 'Los cinco pasos con texto en pantalla, sin m\u00fasica fuerte.', 'Gu\u00e1rdalo para cuando lo necesites.'],\n    ['Historia', 'Detr\u00e1s de c\u00e1mara de {tema}', 'Muestra el proceso real, sin arreglar: lo que la gente no ve.', 'Escr\u00edbeme si quieres saber m\u00e1s.'],\n    ['Carrusel', 'Antes y despu\u00e9s: {tema}', 'La situaci\u00f3n antes, lo que se hizo y el resultado con n\u00fameros reales.', 'Pide el tuyo por mensaje.'],\n    ['Publicaci\u00f3n de texto', '3 preguntas antes de contratar {tema}', 'Las tres preguntas que hacen los clientes listos y c\u00f3mo se responden.', 'M\u00e1ndame las tuyas y te contesto.'],\n    ['Reel', 'Esto me preguntan todas las semanas sobre {tema}', 'Respondes la duda m\u00e1s repetida en 30 segundos, mirando a c\u00e1mara.', 'Si tienes otra duda, escr\u00edbela abajo.'],\n    ['Historia', 'Un cliente, un resultado: {tema}', 'Muestra el caso con su permiso y el n\u00famero que consigui\u00f3.', 'Escr\u00edbeme para ver si aplica a tu caso.'],\n    ['Carrusel', 'Lo que cuesta hacerlo mal: {tema}', 'Qu\u00e9 pierde la gente cuando improvisa: tiempo, dinero, clientes.', 'Gu\u00e1rdalo y ev\u00edtate el problema.'],\n    ['Reel', 'Mi opini\u00f3n impopular sobre {tema}', 'Una postura clara con su raz\u00f3n, sin atacar a nadie.', 'Dime si est\u00e1s de acuerdo o no.']\n  ];\n  const DIAS = ['lunes', 'martes', 'mi\u00e9rcoles', 'jueves', 'viernes', 's\u00e1bado'];\n\n  const estado = { plan: null };\n\n  function valor(id) { const e = VH.$('#' + id); return e ? String(e.value || '').trim() : ''; }\n  function redesElegidas() { return VH.$$('#c-redes input:checked').map((c) => c.value); }\n\n  function pintarRedes() {\n    VH.$('#c-redes').innerHTML = REDES.map((r) =>\n      '<label><input type=\"checkbox\" value=\"' + r.id + '\"' + (r.id === 'Instagram' ? ' checked' : '') + '>' +\n      '<span class=\"red\"><span class=\"emoji\">' + r.emoji + '<\/span>' + r.id + '<\/span><\/label>').join('');\n  }\n\n  function totalPiezas() { return Number(valor('c-frecuencia') || 3) * 4; }\n\n  \/* \u2500\u2500 llamada al motor \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  async function generar() {\n    if (!valor('c-que')) {\n      VH.avisar('Cu\u00e9ntanos primero qu\u00e9 hace tu negocio.');\n      VH.$('#c-que').focus();\n      return;\n    }\n    if (!redesElegidas().length) {\n      VH.avisar('Elige al menos una red donde publicar.');\n      return;\n    }\n    const boton = VH.$('#btn-generar');\n    boton.disabled = true;\n    VH.$('#aviso-contenido').innerHTML = '';\n    VH.$('#plan-contenido').innerHTML =\n      '<div class=\"blanco\"><div class=\"cargando\"><span class=\"spinner-oscuro\"><\/span>' +\n      '<span>Armando tu plan del mes: ideas, ganchos y llamados a la acci\u00f3n. Tarda unos segundos\u2026<\/span><\/div><\/div>';\n\n    const cuerpo = {\n      total: totalPiezas(),\n      negocio: {\n        queHaces: valor('c-que'), aQuien: valor('c-quien'), redes: redesElegidas(),\n        objetivo: valor('c-objetivo'), tono: valor('c-tono'),\n        temas: valor('c-temas'), queEvitar: valor('c-evitar')\n      }\n    };\n\n    let plan = null;\n    try {\n      const r = await fetch(API, { method: 'POST', headers: { 'Content-Type': 'application\/json' }, body: JSON.stringify(cuerpo) });\n      if (r.ok) { plan = await r.json(); }\n    } catch (e) { plan = null; }\n\n    if (!plan || !plan.calendario || !plan.calendario.length) {\n      plan = planDeRespaldo(cuerpo);\n      VH.avisar('El generador no respondi\u00f3: te dejo un plan de respaldo igual de utilizable.');\n    } else {\n      VH.avisar('Plan listo: ' + plan.calendario.length + ' publicaciones.');\n    }\n    estado.plan = plan;\n    pintar(plan);\n    boton.disabled = false;\n    guardar();\n  }\n\n  \/* \u2500\u2500 pintar el plan \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 pintar(plan) {\n    const semanas = {};\n    plan.calendario.forEach((p, i) => {\n      const s = p.semana || (Math.floor(i \/ Math.max(1, Math.ceil(plan.calendario.length \/ 4))) + 1);\n      (semanas[s] = semanas[s] || []).push(p);\n    });\n    const semana = (n) => '<div class=\"semana\"><h3><span class=\"pastilla pastilla-indigo\">Semana ' + n +\n      '<\/span><span class=\"micro gris\">' + (semanas[n] || []).length + ' publicaciones<\/span><\/h3>' +\n      (semanas[n] || []).map(piezaHTML).join('') + '<\/div>';\n\n    VH.$('#aviso-contenido').innerHTML =\n      '<div class=\"aviso ok\"><strong>Tu plan est\u00e1 listo.<\/strong> Est\u00e1 pensado para grabarse o escribirse en ' +\n      'menos de una hora cada pieza. Empieza por la primera y no te saltes el llamado a la acci\u00f3n: es lo que ' +\n      'convierte una visita en un mensaje.<\/div>';\n\n    VH.$('#plan-contenido').innerHTML =\n      '<div class=\"blanco tono-lila\"><h2>Tus tres pilares de contenido<\/h2>' +\n      '<p class=\"gris chico\">Todo el mes gira sobre estos tres temas. Si un d\u00eda no sabes qu\u00e9 publicar, vuelve aqu\u00ed.<\/p>' +\n      '<div class=\"rejilla rejilla-3\">' + (plan.pilares || []).map((p) =>\n        '<div class=\"dimension\"><div class=\"nombre\">' + VH.escapar(p.nombre) + '<\/div>' +\n        '<div class=\"micro gris\" style=\"margin-top:.35rem\">' + VH.escapar(p.porQue) + '<\/div><\/div>').join('') +\n      '<\/div><\/div>' +\n      '<div class=\"blanco tono-azul\"><h2>El mes, semana por semana<\/h2>' +\n      Object.keys(semanas).sort().map(semana).join('') + '<\/div>' +\n      ((plan.consejos && plan.consejos.length) || plan.medir\n        ? '<div class=\"blanco tono-verde\"><h2>C\u00f3mo grabarlo y c\u00f3mo saber si funcion\u00f3<\/h2><ul class=\"lista\">' +\n          (plan.consejos || []).map((c) => '<li>' + VH.escapar(c) + '<\/li>').join('') +\n          (plan.medir ? '<li><strong>Lo \u00fanico que debes mirar:<\/strong> ' + VH.escapar(plan.medir) + '<\/li>' : '') +\n          '<\/ul><\/div>'\n        : '');\n  }\n\n  function piezaHTML(p) {\n    return '<div class=\"pieza\">' +\n      '<div class=\"cabecera\"><span class=\"titulo\">' + VH.escapar(p.titulo) + '<\/span>' +\n      '<span class=\"meta\">' + (p.dia ? '<span class=\"pastilla pastilla-gris micro\">' + VH.escapar(p.dia) + '<\/span>' : '') +\n      (p.red ? '<span class=\"pastilla pastilla-red micro\">' + VH.escapar(p.red) + '<\/span>' : '') +\n      (p.formato ? '<span class=\"pastilla pastilla-indigo micro\">' + VH.escapar(p.formato) + '<\/span>' : '') +\n      '<\/span><\/div>' +\n      '<div class=\"campo\"><strong>Gancho:<\/strong> ' + VH.escapar(p.gancho) + '<\/div>' +\n      '<div class=\"campo\"><strong>Qu\u00e9 dices:<\/strong> ' + VH.escapar(p.desarrollo) + '<\/div>' +\n      '<div class=\"campo\"><strong>Llamado a la acci\u00f3n:<\/strong> ' + VH.escapar(p.llamado) + '<\/div>' +\n      (p.hashtags ? '<div class=\"etiquetas\">' + VH.escapar(p.hashtags) + '<\/div>' : '') +\n      '<\/div>';\n  }\n\n  \/* \u2500\u2500 respaldo sin motor \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 planDeRespaldo(cuerpo) {\n    const n = cuerpo.negocio;\n    const total = cuerpo.total;\n    const temas = String(n.temas || '').split(\/[,;\\n]\/).map((t) => t.trim()).filter(Boolean);\n    if (!temas.length) { temas.push(String(n.queHaces || 'tu servicio').slice(0, 40)); }\n    const redes = n.redes && n.redes.length ? n.redes : ['Instagram'];\n    return {\n      pilares: [\n        { nombre: 'Ense\u00f1ar lo que sabes', porQue: 'El contenido que resuelve dudas es el que m\u00e1s se guarda y se comparte.' },\n        { nombre: 'Mostrar el proceso', porQue: 'Ver c\u00f3mo trabajas genera confianza antes de que te contraten.' },\n        { nombre: 'Resultados reales', porQue: 'Los casos con n\u00fameros son los que hacen decidir a un cliente.' }\n      ],\n      calendario: Array.from({ length: total }, (_, i) => {\n        const f = FORMATOS_RESPALDO[i % FORMATOS_RESPALDO.length];\n        const tema = temas[i % temas.length];\n        return {\n          semana: Math.floor(i \/ Math.max(1, Math.ceil(total \/ 4))) + 1,\n          dia: DIAS[i % DIAS.length], red: redes[i % redes.length],\n          formato: f[0], titulo: f[1].replace('{tema}', tema),\n          gancho: f[1].replace('{tema}', tema), desarrollo: f[2].replace('{tema}', tema),\n          llamado: f[3], hashtags: '#' + tema.replace(\/\\s+\/g, '') + ' #Guatemala #Emprendimiento'\n        };\n      }),\n      consejos: [\n        'Graba en horizontal y en vertical a la vez: el mismo minuto te sirve para dos redes.',\n        'Habla como le hablar\u00edas a un cliente en el mostrador, sin palabras de manual.',\n        'Publica a la misma hora cada d\u00eda que te toque: la constancia pesa m\u00e1s que la perfecci\u00f3n.'\n      ],\n      medir: 'Mira una sola cosa al final de la semana: cu\u00e1ntos mensajes o consultas te llegaron por lo que publicaste.'\n    };\n  }\n\n  \/* \u2500\u2500 copiar e imprimir \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 planComoTexto() {\n    if (!estado.plan) { return 'Todav\u00eda no has generado tu plan.'; }\n    const p = estado.plan;\n    const l = ['PLAN DE CONTENIDO DE 30 D\u00cdAS \u2014 Vela Producciones', new Date().toLocaleDateString('es-GT'), ''];\n    l.push('PILARES');\n    (p.pilares || []).forEach((x) => l.push('  \u00b7 ' + x.nombre + ': ' + x.porQue));\n    l.push('', 'PUBLICACIONES');\n    (p.calendario || []).forEach((c, i) => {\n      l.push((i + 1) + '. [Semana ' + (c.semana || '?') + ' \u00b7 ' + (c.dia || '') + ' \u00b7 ' + (c.red || '') +\n        ' \u00b7 ' + (c.formato || '') + '] ' + c.titulo);\n      l.push('   Gancho: ' + c.gancho);\n      l.push('   Qu\u00e9 dices: ' + c.desarrollo);\n      l.push('   Llamado: ' + c.llamado);\n      if (c.hashtags) { l.push('   Etiquetas: ' + c.hashtags); }\n      l.push('');\n    });\n    if (p.consejos) { l.push('CONSEJOS'); p.consejos.forEach((c) => l.push('  \u00b7 ' + c)); }\n    if (p.medir) { l.push('', 'C\u00d3MO MEDIRLO: ' + p.medir); }\n    l.push('', 'Herramienta gratuita de Vela Producciones \u00b7 velaproducciones.com');\n    return l.join('\\n');\n  }\n\n  function planComoCSV() {\n    if (!estado.plan) { return 'Todav\u00eda no has generado tu plan.'; }\n    const limpiar = (t) => '\"' + String(t == null ? '' : t).replace(\/\"\/g, '\"\"') + '\"';\n    const filas = [['Semana', 'D\u00eda', 'Red', 'Formato', 'T\u00edtulo', 'Gancho', 'Qu\u00e9 dices', 'Llamado', 'Etiquetas'].map(limpiar).join('\\t')];\n    (estado.plan.calendario || []).forEach((c) => filas.push([c.semana, c.dia, c.red, c.formato, c.titulo,\n      c.gancho, c.desarrollo, c.llamado, c.hashtags].map(limpiar).join('\\t')));\n    return filas.join('\\n');\n  }\n\n  function guardar() {\n    const campos = {};\n    CAMPOS.forEach((id) => { campos[id] = valor(id); });\n    VH.guardar(CLAVE, { campos: campos, redes: redesElegidas(), plan: estado.plan });\n  }\n\n  \/* \u2500\u2500 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\u2500 *\/\n  function eventos() {\n    VH.$('#btn-generar').addEventListener('click', generar);\n    CAMPOS.forEach((id) => { const e = VH.$('#' + id); if (e) { e.addEventListener('change', guardar); } });\n    VH.$('#c-redes').addEventListener('change', guardar);\n    VH.$('#btn-imprimir').addEventListener('click', () => VH.imprimir());\n    VH.$('#btn-copiar').addEventListener('click', () => VH.copiar(planComoTexto(), 'Plan copiado.'));\n    VH.$('#btn-csv').addEventListener('click', () => VH.copiar(planComoCSV(), 'Tabla copiada: p\u00e9gala en Excel o en Hojas de c\u00e1lculo.'));\n    VH.$('#btn-ejemplo').addEventListener('click', () => {\n      Object.keys(EJEMPLO).forEach((id) => { const e = VH.$('#' + id); if (e) { e.value = EJEMPLO[id]; } });\n      VH.$$('#c-redes input').forEach((c) => { c.checked = (c.value === 'Instagram' || c.value === 'TikTok'); });\n      VH.avisar('Ejemplo cargado: pulsa \u00abGenerar mi plan del mes\u00bb.');\n      guardar();\n    });\n    VH.$('#btn-reiniciar').addEventListener('click', () => {\n      if (!window.confirm('\u00bfBorrar el plan y empezar de nuevo?')) { return; }\n      CAMPOS.forEach((id) => { const e = VH.$('#' + id); if (e) { e.value = ''; } });\n      VH.$$('#c-redes input').forEach((c) => { c.checked = (c.value === 'Instagram'); });\n      estado.plan = null;\n      VH.$('#plan-contenido').innerHTML = '';\n      VH.$('#aviso-contenido').innerHTML = '';\n      VH.borrarGuardado(CLAVE);\n      VH.avisar('Listo: todo en blanco.');\n    });\n  }\n\n  function arrancar() {\n    pintarRedes();\n    const g = VH.cargar(CLAVE);\n    if (g) {\n      if (g.campos) { Object.keys(g.campos).forEach((id) => { const e = VH.$('#' + id); if (e) { e.value = g.campos[id]; } }); }\n      if (g.redes && g.redes.length) { VH.$$('#c-redes input').forEach((c) => { c.checked = g.redes.indexOf(c.value) > -1; }); }\n      if (g.plan) { estado.plan = g.plan; pintar(g.plan); }\n    }\n    eventos();\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-17440","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>Plan de contenido de 30 d\u00edas: gratis y listo para grabar | Vela Producciones<\/title>\n<meta name=\"description\" content=\"Genera gratis tu plan de contenido del mes: publicaciones con formato, gancho, desarrollo y llamado a la acci\u00f3n, repartidas en cuatro semanas. 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\/plan-de-contenido-de-30-dias\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Plan de contenido de 30 d\u00edas: gratis y listo para grabar | Vela Producciones\" \/>\n<meta property=\"og:description\" content=\"Genera gratis tu plan de contenido del mes: publicaciones con formato, gancho, desarrollo y llamado a la acci\u00f3n, repartidas en cuatro semanas. Sin registro.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/velaproducciones.com\/en\/plan-de-contenido-de-30-dias\/\" \/>\n<meta property=\"og:site_name\" content=\"Vela Producciones\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-16T20:17:30+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\\\/plan-de-contenido-de-30-dias\\\/\",\"url\":\"https:\\\/\\\/velaproducciones.com\\\/plan-de-contenido-de-30-dias\\\/\",\"name\":\"Plan de contenido de 30 d\u00edas: gratis y listo para grabar | Vela Producciones\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/velaproducciones.com\\\/#website\"},\"datePublished\":\"2026-10-10T03:57:06+00:00\",\"dateModified\":\"2026-10-16T20:17:30+00:00\",\"description\":\"Genera gratis tu plan de contenido del mes: publicaciones con formato, gancho, desarrollo y llamado a la acci\u00f3n, repartidas en cuatro semanas. Sin registro.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/velaproducciones.com\\\/plan-de-contenido-de-30-dias\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/velaproducciones.com\\\/plan-de-contenido-de-30-dias\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/velaproducciones.com\\\/plan-de-contenido-de-30-dias\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/velaproducciones.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Plan de Contenido de 30 D\u00edas\"}]},{\"@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":"Plan de contenido de 30 d\u00edas: gratis y listo para grabar | Vela Producciones","description":"Genera gratis tu plan de contenido del mes: publicaciones con formato, gancho, desarrollo y llamado a la acci\u00f3n, repartidas en cuatro semanas. 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\/plan-de-contenido-de-30-dias\/","og_locale":"en_US","og_type":"article","og_title":"Plan de contenido de 30 d\u00edas: gratis y listo para grabar | Vela Producciones","og_description":"Genera gratis tu plan de contenido del mes: publicaciones con formato, gancho, desarrollo y llamado a la acci\u00f3n, repartidas en cuatro semanas. Sin registro.","og_url":"https:\/\/velaproducciones.com\/en\/plan-de-contenido-de-30-dias\/","og_site_name":"Vela Producciones","article_modified_time":"2026-10-16T20:17:30+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\/plan-de-contenido-de-30-dias\/","url":"https:\/\/velaproducciones.com\/plan-de-contenido-de-30-dias\/","name":"Plan de contenido de 30 d\u00edas: gratis y listo para grabar | Vela Producciones","isPartOf":{"@id":"https:\/\/velaproducciones.com\/#website"},"datePublished":"2026-10-10T03:57:06+00:00","dateModified":"2026-10-16T20:17:30+00:00","description":"Genera gratis tu plan de contenido del mes: publicaciones con formato, gancho, desarrollo y llamado a la acci\u00f3n, repartidas en cuatro semanas. Sin registro.","breadcrumb":{"@id":"https:\/\/velaproducciones.com\/plan-de-contenido-de-30-dias\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/velaproducciones.com\/plan-de-contenido-de-30-dias\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/velaproducciones.com\/plan-de-contenido-de-30-dias\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/velaproducciones.com\/"},{"@type":"ListItem","position":2,"name":"Plan de Contenido de 30 D\u00edas"}]},{"@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\/17440","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=17440"}],"version-history":[{"count":1,"href":"https:\/\/velaproducciones.com\/en\/wp-json\/wp\/v2\/pages\/17440\/revisions"}],"predecessor-version":[{"id":17441,"href":"https:\/\/velaproducciones.com\/en\/wp-json\/wp\/v2\/pages\/17440\/revisions\/17441"}],"wp:attachment":[{"href":"https:\/\/velaproducciones.com\/en\/wp-json\/wp\/v2\/media?parent=17440"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}