1<!DOCTYPE html><html lang="es"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Crear contenido con IA: ideas, guiones, imágenes y video | Sodana</title><meta name="description" content="Convierte datos y tendencias en ideas, guiones, imágenes y videos con IA. Analiza y mejora cada pieza con el contexto real de tu marca en Sodana."><meta name="robots" content="index,follow"><meta name="theme-color" content="#000042"><link rel="canonical" href="https://sodana.ai/ia-contenido/"><link rel="alternate" hreflang="es" href="https://sodana.ai/ia-contenido/"><link rel="alternate" hreflang="en" href="https://sodana.ai/en/ai-content/"><link rel="alternate" hreflang="x-default" href="https://sodana.ai/ia-contenido/"><meta property="og:type" content="website"><meta property="og:site_name" content="Sodana"><meta property="og:locale" content="es_ES"><meta property="og:locale:alternate" content="en_US"><meta property="og:title" content="Crear contenido con IA: ideas, guiones, imágenes y video | Sodana"><meta property="og:description" content="Convierte datos y tendencias en ideas, guiones, imágenes y videos con IA. Analiza y mejora cada pieza con el contexto real de tu marca en Sodana."><meta property="og:image" content="https://sodana.ai/miniatura-website.png"><meta property="og:image:width" content="1672"><meta property="og:image:height" content="941"><meta property="og:image:alt" content="Crear contenido con IA en Sodana"><meta property="og:url" content="https://sodana.ai/ia-contenido/"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Crear contenido con IA: ideas, guiones, imágenes y video | Sodana"><meta name="twitter:description" content="Convierte datos y tendencias en ideas, guiones, imágenes y videos con IA. Analiza y mejora cada pieza con el contexto real de tu marca en Sodana."><meta name="twitter:image" content="https://sodana.ai/miniatura-website.png"><meta name="twitter:image:alt" content="Crear contenido con IA en Sodana"><link rel="icon" type="image/png" sizes="32x32" href="/favicon.png"><link rel="icon" type="image/png" sizes="192x192" href="/favicon.png"><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Josefin+Sans:wght@500;600;700&family=Jost:wght@400;500;600;700&display=swap" rel="stylesheet">
1<script type="application/ld+json">[{"@context":"https://schema.org","@type":"Organization","@id":"https://sodana.ai/#organization","name":"BICODE SAS","legalName":"BICODE SAS","url":"https://bicode.co/","address":{"@type":"PostalAddress","addressCountry":"CO"},"identifier":{"@type":"PropertyValue","propertyID":"NIT","value":"901081283"},"brand":{"@id":"https://sodana.ai/#brand"},"contactPoint":{"@type":"ContactPoint","contactType":"customer support","email":"[email protected]","availableLanguage":["es","en"]}},{"@context":"https://schema.org","@type":"Brand","@id":"https://sodana.ai/#brand","name":"Sodana","url":"https://sodana.ai","logo":"https://sodana.ai/brand/sodana-logo-main.png"},{"@context":"https://schema.org","@type":"WebSite","@id":"https://sodana.ai/#website","name":"Sodana","url":"https://sodana.ai","inLanguage":["es","en"],"publisher":{"@id":"https://sodana.ai/#organization"}},{"@context":"https://schema.org","@type":"WebPage","@id":"https://sodana.ai/ia-contenido/#webpage","name":"Crear contenido con IA: ideas, guiones, imágenes y video | Sodana","description":"Convierte datos y tendencias en ideas, guiones, imágenes y videos con IA. Analiza y mejora cada pieza con el contexto real de tu marca en Sodana.","url":"https://sodana.ai/ia-contenido/","inLanguage":"es","isPartOf":{"@id":"https://sodana.ai/#website"},"about":{"@id":"https://sodana.ai/#software"}}]</script>
1<script>(function(){var K="sodana-theme";var A="data-theme-pref";function p(v){if(v==="light"||v==="dark")return v;return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";}var pref;try{pref=localStorage.getItem(K);}catch(e){}if(pref!=="light"&&pref!=="dark"&&pref!=="system")pref="system";var resolved=p(pref);document.documentElement.setAttribute("data-theme",resolved);document.documentElement.setAttribute(A,pref);var m=document.querySelector('meta[name="theme-color"]');if(m){m.setAttribute("content",resolved==="dark"?"#000017":"#fef7e6");}})();</script>
1<style>.hero-platform-strip[data-astro-cid-25chmtg5]{display:flex;flex-wrap:wrap;align-items:center;gap:.7rem}.page-hero .hero-platform-strip[data-astro-cid-25chmtg5]{margin-top:1.7rem}.hero-platform-strip[data-astro-cid-25chmtg5] small[data-astro-cid-25chmtg5]{flex-basis:100%;margin-top:.15rem;color:var(--text-soft);font-size:.82rem}.hero-social[data-astro-cid-25chmtg5]{display:inline-flex;width:3rem;height:3rem;align-items:center;justify-content:center;border:1px solid rgba(0,0,66,.08);border-radius:.78rem;background:#fff;box-shadow:0 14px 30px -22px #00004299}.sr-only[data-astro-cid-25chmtg5]{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.hero-social[data-astro-cid-25chmtg5] svg[data-astro-cid-25chmtg5]{width:1.6rem;height:1.6rem;fill:currentColor}.hero-social-tt[data-astro-cid-25chmtg5]{color:#111126}.hero-social-yt[data-astro-cid-25chmtg5]{color:red}.hero-social-fb[data-astro-cid-25chmtg5]{color:#1877f2}.hero-social-x[data-astro-cid-25chmtg5]{color:#111126}.hero-social-x[data-astro-cid-25chmtg5] strong[data-astro-cid-25chmtg5]{font-size:1.25rem;line-height:1}.hero-platform-note[data-astro-cid-25chmtg5]{max-width:6rem;margin-left:.35rem;padding-left:1rem;border-left:1px solid rgba(0,0,66,.14);color:var(--text-muted);font-size:.82rem;line-height:1.25}[data-theme=dark] .hero-social[data-astro-cid-25chmtg5]{border-color:#f9f9f91f;background:#f9f9f9f0}@media(prefers-color-scheme:dark){[data-theme=system] .hero-social[data-astro-cid-25chmtg5]{border-color:#f9f9f91f;background:#f9f9f9f0}}@media(max-width:720px){.hero-platform-strip[data-astro-cid-25chmtg5]{flex-wrap:nowrap;gap:.45rem}.hero-social[data-astro-cid-25chmtg5]{width:2.8rem;height:2.8rem;flex:0 0 2.8rem}.hero-platform-note[data-astro-cid-25chmtg5]{margin-left:.15rem;padding-left:.65rem}.hero-platform-strip[data-astro-cid-25chmtg5] small[data-astro-cid-25chmtg5]{display:none}} 2</style> 3<link rel="stylesheet" href="/_astro/engagement.DUb-OL2K.css"></head> <body> <div class="site-shell"> <header class="site-header" data-clerk-publishable-key="pk_live_xxxxx"> <div class="container header-inner"> <div class="header-brand-shell"> <a class="brand" href="/" aria-label="Ir al inicio de Sodana"> <img src="/brand/sodana-logo-main.png" alt="Sodana" class="brand-logo brand-logo-light"> <img src="/brand/sodana-logo-dark.png" alt="Sodana" class="brand-logo brand-logo-dark"> </a> </div> <nav class="desktop-nav" aria-label="Navegación principal"> <a href="/"> Inicio </a><a href="/plataforma/"> Plataforma </a><a href="/ia-contenido/" aria-current="page"> Crear con IA </a><a href="/interacciones/"> Interacciones </a><a href="/framework/"> Framework </a><a href="/planes/"> Planes </a> </nav> <div class="header-actions"> <div class="header-settings"><button type="button" class="header-settings-btn" data-settings-toggle aria-label="Ajustes" aria-expanded="false" aria-haspopup="true"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M12 15.5a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7Z" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"></path><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09a1.65 1.65 0 0 0-1-1.51 1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09a1.65 1.65 0 0 0 1.51-1 1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9c.26.604.852.997 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1Z" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"></path></svg></button><div class="header-settings-panel" data-settings-panel hidden><div class="settings-section"><span class="settings-section-label">Tema</span><div class="settings-options" role="group" aria-label="Tema"><button type="button" class="settings-option" data-theme-switch data-theme-value="light" aria-label="Modo claro" aria-pressed="false"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" aria-hidden="true"><circle cx="12" cy="12" r="4.5" stroke="currentColor" stroke-width="1.8"></circle><path d="M12 2.5v2.2M12 19.3v2.2M4.7 4.7l1.6 1.6M17.7 17.7l1.6 1.6M2.5 12h2.2M19.3 12h2.2M4.7 19.3l1.6-1.6M17.7 6.3l1.6-1.6" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path></svg><span>Modo claro</span></button><button type="button" class="settings-option" data-theme-switch data-theme-value="dark" aria-label="Modo oscuro" aria-pressed="false"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M20 14.5A8.5 8.5 0 0 1 9.5 4 7 7 0 1 0 20 14.5Z" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round"></path></svg><span>Modo oscuro</span></button><button type="button" class="settings-option" data-theme-switch data-theme-value="system" aria-label="Usar tema del sistema" aria-pressed="false"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" aria-hidden="true"><rect x="3.5" y="4.5" width="17" height="11.5" rx="2" stroke="currentColor" stroke-width="1.8"></rect><path d="M9.5 20.5h5" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path></svg><span>Usar tema del sistema</span></button></div></div><div class="settings-section"><span class="settings-section-label">Idioma</span><div class="settings-options settings-options-lang" role="group" aria-label="Idioma"><a href="/ia-contenido/" class="settings-option is-active" data-locale-switch data-locale="es" hreflang="es"> 4ES 5</a><a href="/en/ai-content/" class="settings-option" data-locale-switch data-locale="en" hreflang="en"> 6EN 7</a></div></div></div></div> <div class="header-auth" data-clerk-auth-root> <div class="header-auth-guest" data-auth-guest> <a class="button button-ghost" href="https://app.sodana.ai/sign-in"> Iniciar sesión </a> <a class="button button-primary button-compact" href="https://app.sodana.ai/sign-up">Crear cuenta</a> </div> <div class="header-auth-user" data-auth-user hidden> <span class="header-auth-name" data-auth-name></span> <a class="button button-primary button-compact" data-auth-app href="https://app.sodana.ai/dashboard"> Ir a la app </a> </div> </div> </div> <button class="mobile-nav-toggle" aria-label="Abrir menú" aria-expanded="false"> <span class="hamburger-line"></span> <span class="hamburger-line"></span> <span class="hamburger-line"></span> </button> </div> <nav class="mobile-nav container" aria-label="Menú móvil" hidden> <a href="/"> Inicio </a><a href="/plataforma/"> Plataforma </a><a href="/ia-contenido/" aria-current="page"> Crear con IA </a><a href="/interacciones/"> Interacciones </a><a href="/framework/"> Framework </a><a href="/planes/"> Planes </a> <div class="mobile-nav-settings"><div class="settings-section"><span class="settings-section-label">Tema</span><div class="settings-options" role="group" aria-label="Tema"><button type="button" class="settings-option" data-theme-switch data-theme-value="light" aria-label="Modo claro" aria-pressed="false">Modo claro</button><button type="button" class="settings-option" data-theme-switch data-theme-value="dark" aria-label="Modo oscuro" aria-pressed="false">Modo oscuro</button><button type="button" class="settings-option" data-theme-switch data-theme-value="system" aria-label="Usar tema del sistema" aria-pressed="false">Usar tema del sistema</button></div></div><div class="settings-section"><span class="settings-section-label">Idioma</span><div class="settings-options settings-options-lang" role="group" aria-label="Idioma"><a href="/ia-contenido/" class="settings-option is-active" data-locale-switch data-locale="es" hreflang="es"> 8ES 9</a><a href="/en/ai-content/" class="settings-option" data-locale-switch data-locale="en" hreflang="en"> 10EN 11</a></div></div></div> <div class="mobile-nav-actions"> <div class="header-auth" data-clerk-auth-root> <div class="header-auth-guest" data-auth-guest> <a class="button button-ghost" href="https://app.sodana.ai/sign-in"> Iniciar sesión </a> <a class="button button-primary button-compact" href="https://app.sodana.ai/sign-up">Crear cuenta</a> </div> <div class="header-auth-user" data-auth-user hidden> <span class="header-auth-name" data-auth-name></span> <a class="button button-primary button-compact" data-auth-app href="https://app.sodana.ai/dashboard"> Ir a la app </a> </div> </div> </div> </nav> </header>
11<script>(function(){var K="sodana-public-auth";var MAX=2592000000;try{var raw=localStorage.getItem(K);if(!raw)return;var d=JSON.parse(raw);if(!d||d.status!=="signed_in"||!d.name)return;if(d.updatedAt&&Date.now()-d.updatedAt>MAX){localStorage.removeItem(K);return;}document.querySelectorAll("[data-clerk-auth-root]").forEach(function(root){var guest=root.querySelector("[data-auth-guest]");var user=root.querySelector("[data-auth-user]");var nameEl=root.querySelector("[data-auth-name]");if(!guest||!user||!nameEl)return;nameEl.textContent=d.name;guest.hidden=true;user.hidden=false;root.classList.add("is-auth-cached","is-auth-ready");});}catch(e){}})();</script>
11
11<script type="module" src="/_astro/SiteHeader.astro_astro_type_script_index_0_lang.cOFS88q3.js"></script>
11 <main id="top"> <section class="page-hero section ia-hero"> <div class="container page-hero-grid"> <div> <span class="eyebrow ia-reveal">Crear con IA</span> <h1 class="ia-reveal" style="--d:1"> De una señal a una pieza lista para producir. </h1> <p class="ia-reveal" style="--d:2"> Encuentra la idea, escribe y mejora el guion, genera los elementos multimedia y organiza la publicación. Sodana conecta cada paso con lo que sà funciona en tu marca. </p> <div class="hero-actions ia-reveal" style="--d:3"> <a class="button button-primary" href="https://app.sodana.ai/sign-up">Empezar gratis</a> <a class="button button-secondary" href="/framework/">Ver plataforma</a> </div> <div class="hero-platform-strip ia-reveal" style="--d:4" aria-label="Plataformas soportadas" data-astro-cid-25chmtg5> <span class="hero-social hero-social-ig" title="Instagram" data-astro-cid-25chmtg5> <svg aria-hidden="true" viewBox="0 0 24 24" data-astro-cid-25chmtg5> <rect x="3" y="3" width="18" height="18" rx="5" fill="url(#hero-ig-gradient)" data-astro-cid-25chmtg5></rect> <circle cx="12" cy="12" r="4" fill="none" stroke="#fff" stroke-width="1.9" data-astro-cid-25chmtg5></circle> <circle cx="17.1" cy="6.9" r="1.15" fill="#fff" data-astro-cid-25chmtg5></circle> <defs data-astro-cid-25chmtg5> <linearGradient id="hero-ig-gradient" x1="3" y1="21" x2="21" y2="3" gradientUnits="userSpaceOnUse" data-astro-cid-25chmtg5> <stop offset="0" stop-color="#feda75" data-astro-cid-25chmtg5></stop> <stop offset="0.35" stop-color="#fa7e1e" data-astro-cid-25chmtg5></stop> <stop offset="0.65" stop-color="#d62976" data-astro-cid-25chmtg5></stop> <stop offset="1" stop-color="#4f5bd5" data-astro-cid-25chmtg5></stop> </linearGradient> </defs> </svg> <span class="sr-only" data-astro-cid-25chmtg5>Instagram</span> </span> <span class="hero-social hero-social-tt" title="TikTok" data-astro-cid-25chmtg5> <svg aria-hidden="true" viewBox="0 0 24 24" data-astro-cid-25chmtg5> <path d="M16.6 3c.3 2.4 1.7 3.9 4.1 4.1v3.3c-1.5 0-2.9-.5-4.1-1.3v6.2c0 3.1-2.5 5.7-5.7 5.7S5.2 18.4 5.2 15.3c0-3.1 2.5-5.7 5.7-5.7.3 0 .6 0 .9.1v3.4a2.4 2.4 0 1 0 1.5 2.2V3h3.3z" data-astro-cid-25chmtg5></path> </svg> <span class="sr-only" data-astro-cid-25chmtg5>TikTok</span> </span> <span class="hero-social hero-social-yt" title="YouTube" data-astro-cid-25chmtg5> <svg aria-hidden="true" viewBox="0 0 24 24" data-astro-cid-25chmtg5> <path d="M22.1 7.2c-.2-1-.9-1.7-1.9-1.9C18.7 5 12 5 12 5s-6.7 0-8.2.3c-1 .2-1.7 1-1.9 1.9C1.6 8.7 1.6 12 1.6 12s0 3.3.3 4.8c.2 1 .9 1.7 1.9 1.9C5.3 19 12 19 12 19s6.7 0 8.2-.3c1-.2 1.7-1 1.9-1.9.3-1.5.3-4.8.3-4.8s0-3.3-.3-4.8z" data-astro-cid-25chmtg5></path> <path d="M9.9 15V9l5.5 3-5.5 3z" fill="#fff" data-astro-cid-25chmtg5></path> </svg> <span class="sr-only" data-astro-cid-25chmtg5>YouTube</span> </span> <span class="hero-social hero-social-fb" title="Facebook" data-astro-cid-25chmtg5> <svg aria-hidden="true" viewBox="0 0 24 24" data-astro-cid-25chmtg5> <circle cx="12" cy="12" r="10" data-astro-cid-25chmtg5></circle> <path d="M13.3 21v-6.8h2.3l.4-2.7h-2.7V9.8c0-.8.4-1.4 1.5-1.4h1.3V6c-.3 0-1.1-.1-2-.1-2.1 0-3.5 1.3-3.5 3.6v2.1H8.3v2.7h2.3V21z" fill="#fff" data-astro-cid-25chmtg5></path> </svg> <span class="sr-only" data-astro-cid-25chmtg5>Facebook</span> </span> <span class="hero-social hero-social-x" title="X · planes pagos" data-astro-cid-25chmtg5> <strong aria-hidden="true" data-astro-cid-25chmtg5>ð</strong> <span class="sr-only" data-astro-cid-25chmtg5>X, planes pagos</span> </span> <span class="hero-platform-note" data-astro-cid-25chmtg5>Free · hasta 2 perfiles</span> <small data-astro-cid-25chmtg5>Sin tarjeta · OAuth seguro · X en planes pagos.</small> </div> </div> <div class="plat-hero-visual ia-reveal" style="--d:3"> <figure class="screenshot-frame screenshot-frame-light plat-shot"> <div class="window-bar"> <span class="window-dot"></span> <span class="window-dot"></span> <span class="window-dot"></span> <span class="window-address">app.sodana.ai/ideas-scripts</span> </div> <div class="screenshot-media"> <img src="/showcase/ia-generator/ia-generator-es-light.webp" alt="Ideas y guiones con contexto de marca. Brief, conceptos puntuados y guiones listos para producir." loading="eager" fetchpriority="high" decoding="async" class="screenshot-image-light has-theme-variant"> <img src="/showcase/ia-generator/ia-generator-es-dark.webp" alt="" aria-hidden="true" loading="eager" fetchpriority="high" decoding="async" class="screenshot-image-dark"> </div> <figcaption> <strong>Ideas y guiones con contexto de marca</strong> <span>Brief, conceptos puntuados y guiones listos para producir.</span>
11 </figcaption> </figure> <article class="plat-float plat-float-a" aria-hidden="true"> <span>Ideas generadas</span> <strong data-count data-count-to="3">3</strong> <em>puntuadas por marca</em> </article> <article class="plat-float plat-float-b ia-float-fix" aria-hidden="true"> <span class="ia-float-badge">Guion listo</span> <strong>Hook + valor + CTA</strong> <em>editable y exportable</em> </article> </div> </div> </section> <section class="section ia-analysis-section"> <div class="container section-heading centered-section-heading ia-reveal"> <span class="eyebrow">Análisis con IA</span> <h2>Entiende por qué funcionó <mark>y, sobre todo, por qué no.</mark></h2> <p> Análisis multimodal por pieza: la IA no solo celebra los aciertos, también diagnostica las debilidades y te dice exactamente qué cambiar. </p> </div> <div class="container split-grid ia-analysis-grid"> <div class="plat-analytics-visual ia-reveal"> <figure class="screenshot-frame screenshot-frame-dark plat-shot"> <div class="window-bar"> <span class="window-dot"></span> <span class="window-dot"></span> <span class="window-dot"></span> <span class="window-address">app.sodana.ai/analytics</span> </div> <div class="screenshot-media"> <img src="/showcase/ia-analysis-detail/ia-analysis-detail-es-light.webp" alt="Detalle de análisis de video. Drivers de debilidad y mejoras priorizadas." loading="lazy" fetchpriority="auto" decoding="async" class="screenshot-image-light has-theme-variant"> <img src="/showcase/ia-analysis-detail/ia-analysis-detail-es-dark.webp" alt="" aria-hidden="true" loading="lazy" fetchpriority="auto" decoding="async" class="screenshot-image-dark"> </div> <figcaption> <strong>Detalle de análisis de video</strong> <span>Drivers de debilidad y mejoras priorizadas.</span> </figcaption> </figure> <article class="plat-float ia-float-weak" aria-hidden="true"> <span class="ia-float-badge ia-badge-weak">Punto débil</span> <strong>CTA tardÃo</strong> <em>aparece en seg. 26</em> </article> </div> <div class="ia-reveal" style="--d:1"> <span class="eyebrow">Por qué no funcionó + cómo mejorarlo</span> <h2>De la crÃtica honesta a la pieza corregida.</h2> <p> Cada video se analiza por hook, valor y CTA. Si una pieza rindió por debajo de tu lÃnea base, la IA explica la causa y propone una versión mejor, anclada en lo que sà te funciona. </p> <div class="ia-outputs"> <article class="ia-output ia-output-verdict"> <span class="ia-output-icon" aria-hidden="true"></span> <div> <strong>Veredicto honesto</strong> <p>La IA dice si la pieza funcionó o no y contra qué lÃnea base se mide, sin adornos.</p> </div> </article><article class="ia-output ia-output-weak"> <span class="ia-output-icon" aria-hidden="true"></span> <div> <strong>Por qué no funcionó</strong> <p>Identifica los drivers de debilidad: hook flojo, valor difuso, CTA tardÃo o ritmo que pierde a la audiencia.</p> </div> </article><article class="ia-output ia-output-fix"> <span class="ia-output-icon" aria-hidden="true"></span> <div> <strong>Mejoras priorizadas</strong> <p>Propone cambios concretos y ordenados por impacto para reescribir la pieza con más probabilidad de funcionar.</p> </div> </article><article class="ia-output ia-output-pattern"> <span class="ia-output-icon" aria-hidden="true"></span> <div> <strong>Patrón reutilizable</strong> <p>Extrae la fórmula de hook, contexto y CTA, más señales de playbook: duración, segundo de hook y ubicación del CTA.</p> </div> </article> </div> </div> </div> <!-- SUB-BLOQUE: RETENCIÃN INSTAGRAM --> <div class="container ia-retention ia-reveal"> <div class="ia-retention-head"> <span class="v3-chip v3-chip-ig ia-retention-chip"> <svg aria-hidden="true" viewBox="0 0 24 24"><rect x="4" y="4" width="16" height="16" rx="5"></rect><circle cx="12" cy="12" r="3.5"></circle><circle cx="17" cy="7" r="1"></circle></svg> Instagram · Reels </span> <h3>Sube tu Reel y lee la curva de retención.</h3> <p>Carga el insight de un Reel, deja que Sodana reconstruya la curva y recibe un diagnóstico de retención con recomendaciones.</p> </div> <div class="ia-retention-grid"> <div class="ia-retention-steps"> <div class="ia-retention-line" aria-hidden="true"><i data-loop-line></i></div> <article class="ia-retention-step" style="--d:0"> <span>1</span> <strong>Sube el insight del Reel</strong> <p>Carga la captura de insights de un Reel de Instagram desde un asistente guiado.</p> </article><article class="ia-retention-step" style="--d:1"> <span>
112</span> <strong>Sodana extrae la curva</strong> <p>Reconstruye la curva de retención del video listo para analizar, segundo a segundo.</p> </article><article class="ia-retention-step" style="--d:2"> <span>3</span> <strong>La IA diagnostica</strong> <p>Efectividad de hook, valor y CTA, zonas de caÃda, señales de rewatch y recomendaciones accionables.</p> </article> </div> <div class="ia-retention-visual"> <figure class="screenshot-frame screenshot-frame-light plat-shot"> <div class="window-bar"> <span class="window-dot"></span> <span class="window-dot"></span> <span class="window-dot"></span> <span class="window-address">app.sodana.ai/analytics</span> </div> <div class="screenshot-media"> <img src="/showcase/ia-retention-curve/ia-retention-curve-es-light.webp" alt="Gráfica de retención del video. Curva del video corto + diagnóstico de la IA." loading="lazy" fetchpriority="auto" decoding="async" class="screenshot-image-light has-theme-variant"> <img src="/showcase/ia-retention-curve/ia-retention-curve-es-dark.webp" alt="" aria-hidden="true" loading="lazy" fetchpriority="auto" decoding="async" class="screenshot-image-dark"> </div> <figcaption> <strong>Gráfica de retención del video</strong> <span>Curva del video corto + diagnóstico de la IA.</span> </figcaption> </figure> <div class="ia-retention-curve" aria-hidden="true"> <svg viewBox="0 0 240 90" preserveAspectRatio="none"> <path class="ia-curve-fill" d="M0 14 L40 22 L80 30 L120 52 L160 60 L200 66 L240 72 L240 90 L0 90 Z"></path> <polyline class="ia-curve-line" data-draw points="0,14 40,22 80,30 120,52 160,60 200,66 240,72"></polyline> </svg> <span class="ia-curve-drop" aria-hidden="true">CaÃda · seg. 7</span> </div> </div> </div> </div> </section> <section class="section ia-make-section"> <div class="container section-heading centered-section-heading ia-reveal"> <span class="eyebrow">IA que crea</span> <h2>Pregunta desde la evidencia <mark>y genera tu próxima pieza.</mark></h2> </div> <div class="container ia-bento-grid"> <article class="ia-bento-card ia-bento-large ia-reveal"> <span class="v3-chip">Chat semántico · Ask AI</span> <h3>Pregunta sobre tus propios posts.</h3> <p>Búsqueda semántica sobre tu workspace. Si no hay evidencia, no inventa: te lo dice.</p> <div class="v3-chat" aria-hidden="true" data-chat> <div class="v3-chat-stream" data-chat-stream> <div class="v3-chat-turn" data-turn> <div class="v3-chat-q">¿Por qué cayó el alcance de mis Reels este mes?</div> <div class="v3-chat-a"> <span class="v3-typing"><i></i><i></i><i></i></span> <span class="v3-chat-text">Tus Reels > 35s perdieron retención antes del seg. 8. Tus mejores piezas resuelven el hook en el seg. 1.</span> </div> </div><div class="v3-chat-turn" data-turn> <div class="v3-chat-q">¿Qué tema repito esta semana?</div> <div class="v3-chat-a"> <span class="v3-typing"><i></i><i></i><i></i></span> <span class="v3-chat-text">Repite comparativas rápidas: tuvieron +27% de guardados y más comentarios que tus posts informativos largos.</span> </div> </div><div class="v3-chat-turn" data-turn> <div class="v3-chat-q">¿Hay evidencia para hablar de precio?</div> <div class="v3-chat-a"> <span class="v3-typing"><i></i><i></i><i></i></span> <span class="v3-chat-text">SÃ: 4 de tus 6 posts con mejor conversión mencionan ahorro o retorno antes del segundo 5.</span> </div> </div><div class="v3-chat-turn" data-turn> <div class="v3-chat-q">¿Qué idea convierto en script?</div> <div class="v3-chat-a"> <span class="v3-typing"><i></i><i></i><i></i></span> <span class="v3-chat-text">Convierte la objeción âno tengo tiempoâ en un Reel de 22s con demostración directa y CTA temprano.</span> </div> </div><div class="v3-chat-turn" data-turn> <div class="v3-chat-q">¿Qué formato visual uso?</div> <div class="v3-chat-a"> <span class="v3-typing"><i></i><i></i><i></i></span> <span class="v3-chat-text">Usa pantalla dividida: problema a la izquierda, resultado a la derecha. Ese patrón elevó tu retención media.</span> </div> </div> </div> </div> </article> <article class="ia-bento-card ia-reveal" style="--d:1"> <span class="v3-chip">Ideas · Scripts</span> <h3>Crea desde tu contexto de marca</h3> <p>Parte de un objetivo, formato y plataforma para generar conceptos puntuados y guiones editables.</p> </article><article class="ia-bento-card ia-reveal" style="--d:2"> <span class="v3-chip">Guiones · Diagnóstico PEP</span> <h3>
11Analiza y mejora antes de grabar</h3> <p>Evalúa hook, valor y CTA; recibe variantes, una versión mejorada y un plan de rodaje accionable.</p> </article><article class="ia-bento-card ia-reveal" style="--d:3"> <span class="v3-chip">Assets · Acceso anticipado</span> <h3>Genera imagen y video</h3> <p>Produce assets desde texto o referencias y organiza los resultados en una biblioteca visual integrada.</p> </article><article class="ia-bento-card ia-reveal" style="--d:4"> <span class="v3-chip">Métricas · Multi-agente</span> <h3>Análisis de métricas con agentes</h3> <p>Cuenta, posts y comentarios analizados por agentes especializados que detectan patrones de contenido ganador.</p> </article><article class="ia-bento-card ia-reveal" style="--d:5"> <span class="v3-chip">Dashboard</span> <h3>Insights de IA en el dashboard</h3> <p>Resumen ejecutivo, lectura por sección y acciones recomendadas sobre tus propios datos.</p> </article><article class="ia-bento-card ia-reveal" style="--d:6"> <span class="v3-chip">Trends · Signal desk</span> <h3>Genera ideas desde tendencias</h3> <p>Señales del dÃa por paÃs, con sentimiento y relevancia, conectadas directo al generador de contenido.</p> </article> </div> <div class="container ia-pipeline-head ia-reveal"> <span class="eyebrow">Flujo creativo conectado</span> <h2>Idea, guion, producción y activación en un solo lugar.</h2> <p>Cada herramienta comparte el contexto de tu marca para que el trabajo avance sin volver a empezar en cada paso.</p> </div> <div class="container v3-pipeline-grid ia-pipeline-grid"> <article class="v3-pipeline-card ia-reveal" style="--d:0"> <span class="v3-pipeline-step">Idea</span> <h3>3 ideas por ejecución</h3> <p>Por objetivo, formato y plataforma, con hook, estructura, CTA y por qué funciona.</p> <span class="v3-pipeline-arrow" aria-hidden="true">â</span> </article><article class="v3-pipeline-card ia-reveal" style="--d:1"> <span class="v3-pipeline-step">Guion</span> <h3>Guion analizado y mejorado</h3> <p>Diagnóstico PEP, variantes de hook y CTA, propuesta mejorada y plan de rodaje.</p> <span class="v3-pipeline-arrow" aria-hidden="true">â</span> </article><article class="v3-pipeline-card ia-reveal" style="--d:2"> <span class="v3-pipeline-step">Produce</span> <h3>Imagen y video con IA</h3> <p>Genera assets desde texto o referencias y consérvalos en tu biblioteca creativa.</p> <span class="v3-pipeline-arrow" aria-hidden="true">â</span> </article><article class="v3-pipeline-card ia-reveal" style="--d:3"> <span class="v3-pipeline-step">Activa</span> <h3>Tendencias y calendario</h3> <p>Convierte señales relevantes en oportunidades y lleva la pieza a tu agenda de contenido.</p> </article> </div> <div class="container ia-generator-shot ia-reveal"> <figure class="screenshot-frame screenshot-frame-yellow plat-shot"> <div class="window-bar"> <span class="window-dot"></span> <span class="window-dot"></span> <span class="window-dot"></span> <span class="window-address">app.sodana.ai/ideas-scripts</span> </div> <div class="screenshot-media"> <img src="/showcase/ia-generator/ia-generator-es-light.webp" alt="Generador de ideas y scripts. Brief, 3 ideas con score y zona de guion." loading="lazy" fetchpriority="auto" decoding="async" class="screenshot-image-light has-theme-variant"> <img src="/showcase/ia-generator/ia-generator-es-dark.webp" alt="" aria-hidden="true" loading="lazy" fetchpriority="auto" decoding="async" class="screenshot-image-dark"> </div> <figcaption> <strong>Generador de ideas y scripts</strong> <span>Brief, 3 ideas con score y zona de guion.</span> </figcaption> </figure> <article class="plat-float ia-float-gen" aria-hidden="true"> <span class="ia-float-badge">Listo para producir</span> <strong><i data-count data-count-to="3">3</i> ideas</strong> <em>con score por marca y método</em> </article> </div> <div class="container ia-make-strip ia-reveal" aria-hidden="true"> <span>Insights del dashboard</span> <figure class="screenshot-frame screenshot-frame-light plat-shot ia-strip-shot"> <div class="window-bar"> <span class="window-dot"></span> <span class="window-dot"></span> <span class="window-dot"></span> <span class="window-address">app.sodana.ai/dashboard</span> </div> <div class="screenshot-media"> <img src="/showcase/ia-dashboard-insights/ia-dashboard-insights-es-light.webp" alt="Insights del dashboard. Resumen ejecutivo + lectura de IA por sección." loading="lazy" fetchpriority="auto" decoding="async" class="screenshot-image-light has-theme-variant"> <img src="/showcase/ia-dashboard-insights/ia-dashboard-insights-es-dark.webp" alt="" aria-hidden="true" loading="lazy" fetchpriority="auto" decoding="async" class="screenshot-image-dark"> </div> <figcaption> <strong>Insights del dashboard</strong> <span>Resumen ejecutivo + lectura de IA por sección.</span>
11 </figcaption> </figure> </div> </section> <section class="section cta-section"> <div class="container cta-panel"> <div> <span class="eyebrow">Tu estudio creativo</span> <h2>Convierte tus mejores señales en contenido listo para producir.</h2> <p>Crea una cuenta para recorrer el flujo completo: idea, guion, mejora, producción y publicación.</p> </div> <div class="cta-actions"> <a class="button button-primary" href="https://app.sodana.ai/sign-up">Crear cuenta</a> <a class="button button-secondary" href="/planes/">Comparar planes</a> </div> </div> </section> </main> <footer class="site-footer"> <div class="container footer-grid"> <div class="footer-brand"> <img src="/brand/sodana-logo-main.png" alt="Sodana" class="footer-logo footer-logo-light"> <img src="/brand/sodana-logo-dark.png" alt="Sodana" class="footer-logo footer-logo-dark"> <p>Sodana convierte el rendimiento social de múltiples cuentas en decisiones claras y contenido personalizado para marcas, creadores y equipos.</p> <a class="footer-contact" href="mailto:[email protected]">[email protected]</a> </div> <div class="footer-navigation"> <nav class="footer-links" aria-label="Producto"> <h2>Producto</h2> <a href="/">Inicio</a><a href="/plataforma/">AnalÃticas</a><a href="/ia-contenido/">Crear con IA</a><a href="/interacciones/">Interacciones</a><a href="/planes/">Planes</a><a href="/framework/">Framework</a><a href="/recursos/">
11Recursos</a> </nav> <nav class="footer-links" aria-label="Legal"> <h2>Legal</h2> <a href="/legal/privacy/">Privacidad</a><a href="/legal/terms/">Términos</a> </nav> </div> </div> <div class="container footer-bottom"> <small>© 2026 Sodana. Todos los derechos reservados.</small> <span class="footer-credit" aria-hidden="true">·</span> <a class="footer-credit" href="https://bicode.co" target="_blank" rel="noreferrer">Powered by BICODE</a> </div> </footer> </div> <button type="button" class="back-to-top" data-back-to-top aria-label="Volver arriba" title="Volver arriba" hidden> <svg viewBox="0 0 24 24" width="20" height="20" fill="none" aria-hidden="true"> <path d="M12 19V5m0 0-6 6m6-6 6 6" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"></path> </svg> </button>
11<script> 12 (() => { 13 const button = document.querySelector("[data-back-to-top]"); 14 if (!button) return; 15 16 const THRESHOLD = 480; 17 let visible = false; 18 19 const update = () => { 20 const shouldShow = window.scrollY > THRESHOLD; 21 if (shouldShow === visible) return; 22 visible = shouldShow; 23 button.hidden = false; 24 button.classList.toggle("is-visible", shouldShow); 25 }; 26 27 update(); 28 window.addEventListener("scroll", update, { passive: true }); 29 30 button.addEventListener("click", () => { 31 window.scrollTo({ top: 0, behavior: "smooth" }); 32 }); 33 })(); 34</script>
34 <aside class="language-suggestion" data-language-suggestion data-current-locale="es" data-cookie-name="sodana-public-lang" hidden aria-label="Your browser is set to English. Would you like to view this page in English?"> <p>Your browser is set to English. Would you like to view this page in English?</p> <div class="language-suggestion__actions"> <a class="button button-primary" href="/en/ai-content/" data-locale-switch data-locale="en" hreflang="en"> View in English </a> <button type="button" class="button button-secondary" data-language-stay>Continue in Spanish</button> </div> <button type="button" class="language-suggestion__close" data-language-stay aria-label="Close language suggestion">Ã</button> </aside>
34<script> 35 (() => { 36 const banner = document.querySelector("[data-language-suggestion]"); 37 if (!banner) return; 38 const cookieName = banner.getAttribute("data-cookie-name"); 39 const currentLocale = banner.getAttribute("data-current-locale"); 40 const preferredLocale = (navigator.language || "").slice(0, 2).toLowerCase(); 41 const hasPreference = cookieName && document.cookie.split("; ").some((item) => item.startsWith(`${cookieName}=`)); 42 43 if (!hasPreference && ["es", "en"].includes(preferredLocale) && preferredLocale !== currentLocale) { 44 banner.hidden = false; 45 } 46 47 banner.querySelectorAll("[data-language-stay]").forEach((button) => { 48 button.addEventListener("click", () => { 49 if (cookieName && currentLocale) { 50 document.cookie = `${cookieName}=${currentLocale};path=/;max-age=31536000;samesite=lax`; 51 } 52 banner.hidden = true; 53 }); 54 }); 55 })(); 56</script>
56
56<script>(function(){const posthogKey = "phc_osCfB4qGrvKAkUqu5VLyxgRPzvkgV5Gke7mcVSDp9KZ8"; 57const posthogHost = "https://us.i.posthog.com"; 58 59 !(function (t, e) { 60 var o, n, p, r; 61 e.__SV || 62 ((window.posthog = e), 63 (e._i = []), 64 (e.init = function (i, s, a) { 65 function g(t, e) { 66 var o = e.split("."); 67 2 == o.length && ((t = t[o[0]]), (e = o[1])), 68 (t[e] = function () { 69 t.push([e].concat(Array.prototype.slice.call(arguments, 0))); 70 }); 71 } 72 ((p = t.createElement("script")).type = "text/javascript"), 73 (p.crossOrigin = "anonymous"), 74 (p.async = !0), 75 (p.src = 76 s.api_host.replace(".i.posthog.com", "-assets.i.posthog.com") + "/static/array.js"), 77 (r = t.getElementsByTagName("script")[0]).parentNode.insertBefore(p, r); 78 var u = e; 79 for (void 0 !== a ? (u = e[a] = []) : (a = "posthog"), u.people = u.people || [], u.toString = function ( 80 t 81 ) { 82 var e = "posthog"; 83 return "posthog" !== a && (e += "." + a), t || (e += " (stub)"), e; 84 }, u.people.toString = function () { 85 return u.toString(1) + ".people (stub)"; 86 }, o = 87 "init capture register register_once register_for_session unregister unregister_for_session getFeatureFlag getFeatureFlagPayload isFeatureEnabled reloadFeatureFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSessionId getSurveys getActiveMatchingSurveys renderSurvey canRenderSurvey getNextSurveyStep identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException loadToolbar get_property getSessionProperty createPersonProfile opt_out_capturing has_opted_out_capturing opt_in_capturing clear_opt_in_out_capturing debug".split( 88 " " 89 ), n = 0; n < o.length; n++) 90 g(u, o[n]);
91 e._i.push([i, s, a]); 92 }), 93 (e.__SV = 1)); 94 })(document, window.posthog || []); 95 const CONSENT_KEY = "sodana-analytics-consent"; 96 const readConsent = () => window.localStorage.getItem(CONSENT_KEY); 97 const getAcquisition = () => { 98 const params = new URLSearchParams(window.location.search); 99 const stored = readConsent() === "granted" ? (() => { 100 try { return JSON.parse(window.localStorage.getItem("sodana-acquisition") || "{}"); } catch { return {}; } 101 })() : {}; 102 const safeReferrer = (() => { 103 try { 104 const url = document.referrer ? new URL(document.referrer) : null; 105 return url ? `${url.origin}${url.pathname}` : "direct"; 106 } catch { return "direct"; } 107 })(); 108 const values = { 109 initial_path: stored.initial_path || window.location.pathname, 110 initial_referrer: stored.initial_referrer || safeReferrer, 111 utm_source: params.get("utm_source") || undefined, 112 utm_medium: params.get("utm_medium") || undefined, 113 utm_campaign: params.get("utm_campaign") || undefined, 114 utm_content: params.get("utm_content") || undefined, 115 utm_term: params.get("utm_term") || undefined, 116 }; 117 const result = Object.fromEntries(Object.entries({ ...stored, ...values }).filter(([, value]) => value)); 118 if (readConsent() === "granted") window.localStorage.setItem("sodana-acquisition", JSON.stringify(result)); 119 return result; 120 }; 121 const decorateAppLinks = () => { 122 const acquisition = getAcquisition(); 123 const keys = ["utm_source", "utm_medium", "utm_campaign", "utm_content", "utm_term", "initial_path", "initial_referrer"]; 124 document.querySelectorAll('a[href^="https://app.sodana.ai"]').forEach((anchor) => { 125 try { 126 const url = new URL(anchor.href); 127 keys.forEach((key) => { if (acquisition[key] && !url.searchParams.has(key)) url.searchParams.set(key, acquisition[key]); }); 128 anchor.href = url.toString(); 129 } catch { /* Ignore malformed third-party links. */ } 130 }); 131 }; 132 const boot = () => { 133 if (readConsent() !== "granted") return; 134 if (window.posthog?.__sodanaBooted) { 135 window.posthog.opt_in_capturing?.(); 136 window.posthog.startSessionRecording?.(); 137 return; 138 } 139 window.posthog?.init?.(posthogKey, { 140 api_host: posthogHost, 141 defaults: "2026-05-30", 142 capture_pageview: true, 143 capture_pageleave: true, 144 autocapture: false, 145 persistence: "localStorage+cookie", 146 session_recording: { 147 sampleRate: 0.1, 148 maskAllInputs: true, 149 maskAllText: true, 150 blockAllMedia: true, 151 }, 152 }); 153 window.posthog?.register?.(getAcquisition()); 154 window.posthog.__sodanaBooted = true; 155 for (const item of window.__sodanaAnalyticsQueue ?? []) { 156 window.posthog.capture(item.name, item.properties); 157 } 158 window.__sodanaAnalyticsQueue = []; 159 }; 160 window.addEventListener("sodana:analytics-consent", () => { boot(); decorateAppLinks(); }); 161 if (readConsent() === "granted") boot(); 162 decorateAppLinks(); 163 window.addEventListener("DOMContentLoaded", decorateAppLinks, { once: true }); 164 })();</script>
164<div class="sodana-consent" data-sodana-consent hidden><div class="sodana-consent__card" role="dialog" aria-modal="false" aria-labelledby="sodana-consent-title"><div class="sodana-consent__eyebrow">SODANA · <span>PRIVACIDAD</span></div><h2 id="sodana-consent-title">Ayúdanos a mejorar Sodana</h2><p>Usamos analÃtica anónima para entender qué funciona, mejorar la experiencia y detectar errores. Nunca enviamos prompts, contenido, tokens ni datos de tus redes.</p><div class="sodana-consent__details" data-consent-details hidden>AnalÃtica de navegación y funciones, más replay con muestreo del 10%. Texto, campos, multimedia y pantallas sensibles quedan enmascarados.</div><div class="sodana-consent__actions"><button type="button" data-consent-accept>Aceptar analÃtica</button><button type="button" data-consent-deny>Solo necesarias</button><button type="button" class="sodana-consent__more" data-consent-more>Ver detalles</button></div></div></div>
164<script> 165 (() => { 166 const key = "sodana-analytics-consent"; 167 const banner = document.querySelector("[data-sodana-consent]"); 168 const accept = document.querySelector("[data-consent-accept]"); 169 const deny = document.querySelector("[data-consent-deny]"); 170 const more = document.querySelector("[data-consent-more]"); 171 const details = document.querySelector("[data-consent-details]"); 172 const open = () => { banner.hidden = false; }; 173 const close = () => { banner.hidden = true; }; 174 const select = (value) => { 175 window.localStorage.setItem(key, value); 176 if (value === "denied") { 177 window.posthog?.opt_out_capturing?.(); 178 window.posthog?.stopSessionRecording?.(); 179 } 180 window.dispatchEvent(new CustomEvent("sodana:analytics-consent", { detail: { consent: value } })); 181 close(); 182 }; 183 accept.addEventListener("click", () => select("granted")); 184 deny.addEventListener("click", () => select("denied")); 185 more.addEventListener("click", () => { details.hidden = !details.hidden; }); 186 if (window.localStorage.getItem(key)) close(); else open(); 187 })(); 188 </script>
188
188<script>(function(){var K="sodana-theme";var A="data-theme-pref";function resolve(pref){if(pref==="light"||pref==="dark")return pref;return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";}function syncButtons(pref){document.querySelectorAll("[data-theme-switch]").forEach(function(btn){var v=btn.getAttribute("data-theme-value");var active=v===pref;btn.classList.toggle("is-active",active);btn.setAttribute("aria-pressed",active?"true":"false");});}function apply(pref){var resolved=resolve(pref);document.documentElement.setAttribute("data-theme",resolved);document.documentElement.setAttribute(A,pref);try{localStorage.setItem(K,pref);}catch(e){}var m=document.querySelector('meta[name="theme-color"]');if(m){m.setAttribute("content",resolved==="dark"?"#000017":"#fef7e6");}syncButtons(pref);}var pref=document.documentElement.getAttribute(A);if(pref!=="light"&&pref!=="dark"&&pref!=="system"){try{pref=localStorage.getItem(K);}catch(e){}}if(pref!=="light"&&pref!=="dark"&&pref!=="system")pref="system";apply(pref);document.querySelectorAll("[data-theme-switch]").forEach(function(btn){btn.addEventListener("click",function(){var t=btn.getAttribute("data-theme-value");if(t)apply(t);});});window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",function(){var current=document.documentElement.getAttribute(A)||"system";if(current==="system")apply("system");});})();</script>
188
188<script>(function(){var K="sodana-public-lang";document.querySelectorAll("[data-locale-switch]").forEach(function(btn){btn.addEventListener("click",function(e){e.preventDefault();var loc=btn.getAttribute("data-locale");var href=btn.getAttribute("href");if(loc){document.cookie=K+"="+loc+";path=/;max-age=31536000;samesite=lax";}if(href)location.href=href;});});})();</script>
188
188<script>(function(){ 189 var btn=document.querySelector("[data-settings-toggle]"); 190 var panel=document.querySelector("[data-settings-panel]"); 191 if(!btn||!panel)return; 192 function close(){ 193 btn.setAttribute("aria-expanded","false"); 194 panel.hidden=true; 195 } 196 function open(){ 197 btn.setAttribute("aria-expanded","true"); 198 panel.hidden=false; 199 } 200 btn.addEventListener("click",function(e){ 201 e.stopPropagation(); 202 var isOpen=btn.getAttribute("aria-expanded")==="true"; 203 if(isOpen)close();else open(); 204 }); 205 document.addEventListener("click",function(e){ 206 if(!panel.hidden&&!panel.contains(e.target)&&e.target!==btn&&!btn.contains(e.target))close(); 207 }); 208 document.addEventListener("keydown",function(e){ 209 if(e.key==="Escape"&&!panel.hidden)close(); 210 }); 211 panel.querySelectorAll("[data-theme-switch],[data-locale-switch]").forEach(function(el){ 212 el.addEventListener("click",function(){close();}); 213 }); 214})();</script>
214
214<script> 215 const header = document.querySelector(".site-header"); 216 const navToggle = document.querySelector(".mobile-nav-toggle"); 217 const mobileNav = document.querySelector(".mobile-nav"); 218 219 const updateHeader = () => { 220 header?.classList.toggle("is-scrolled", window.scrollY > 10); 221 }; 222 223 updateHeader(); 224 window.addEventListener("scroll", updateHeader, { passive: true }); 225 226 navToggle?.addEventListener("click", () => { 227 const isOpen = navToggle.getAttribute("aria-expanded") === "true"; 228 navToggle.setAttribute("aria-expanded", String(!isOpen)); 229 navToggle.classList.toggle("is-open", !isOpen); 230 if (mobileNav) { 231 mobileNav.hidden = isOpen; 232 } 233 }); 234 235 mobileNav?.querySelectorAll("a").forEach((link) => { 236 link.addEventListener("click", () => { 237 navToggle?.setAttribute("aria-expanded", "false"); 238 navToggle?.classList.remove("is-open"); 239 if (mobileNav) { 240 mobileNav.hidden = true; 241 } 242 }); 243 }); 244 </script>
244 </body> </html>
244<script> 245 const revealEls = document.querySelectorAll(".ia-reveal"); 246 if ("IntersectionObserver" in window && !window.matchMedia("(prefers-reduced-motion: reduce)").matches) { 247 const io = new IntersectionObserver( 248 (entries) => { 249 entries.forEach((entry) => { 250 if (!entry.isIntersecting) return; 251 const el = entry.target; 252 el.classList.add("is-visible"); 253 el.querySelectorAll("[data-count]").forEach((node) => { 254 const to = Number(node.getAttribute("data-count-to") || "0"); 255 const dur = 1100; 256 const start = performance.now(); 257 const tick = (now) => { 258 const p = Math.min((now - start) / dur, 1); 259 const eased = 1 - Math.pow(1 - p, 3); 260 node.textContent = String(Math.round(to * eased)); 261 if (p < 1) requestAnimationFrame(tick); 262 }; 263 requestAnimationFrame(tick); 264 }); 265 io.unobserve(el); 266 }); 267 }, 268 { threshold: 0.15, rootMargin: "0px 0px -6% 0px" } 269 ); 270 revealEls.forEach((el) => io.observe(el)); 271 } else { 272 revealEls.forEach((el) => { 273 el.classList.add("is-visible"); 274 el.querySelectorAll("[data-count]").forEach((node) => { 275 node.textContent = node.getAttribute("data-count-to") || "0"; 276 }); 277 }); 278 } 279 280 // ---- Chat IA simulado (loop compacto) ---- 281 (function () { 282 const stream = document.querySelector("[data-chat-stream]"); 283 if (!stream) return; 284 const turns = Array.from(stream.querySelectorAll("[data-turn]")); 285 if (!turns.length) return; 286 const reduce = window.matchMedia("(prefers-reduced-motion: reduce)").matches; 287 const WINDOW_SIZE = Math.min(3, turns.length); 288 289 if (reduce) { 290 turns.forEach((turn, index) => { 291 turn.classList.toggle("is-visible", index < WINDOW_SIZE); 292 turn.querySelector(".v3-chat-q")?.classList.add("is-in"); 293 turn.querySelector(".v3-chat-a")?.classList.add("is-in", "show-text"); 294 }); 295 return; 296 } 297 298 const TYPING = 1200; 299 const READ = 2600; 300 const STEP = 700; 301 const LEAVE = 320; 302 303 let running = false; 304 let timers = []; 305 let resolvers = []; 306 const wait = (ms) => new Promise((res) => { 307 const timer = setTimeout(() => { 308 timers = timers.filter((t) => t !== timer); 309 resolvers = resolvers.filter((r) => r !== res); 310 res(); 311 }, ms); 312 timers.push(timer); 313 resolvers.push(res); 314 }); 315 const clearTimers = () => { 316 timers.forEach(clearTimeout); 317 timers = []; 318 resolvers.forEach((res) => res()); 319 resolvers = []; 320 }; 321 322 const resetTurn = (turn) => { 323 turn.classList.remove("is-visible", "is-leaving"); 324 turn.querySelector(".v3-chat-q")?.classList.remove("is-in"); 325 turn.querySelector(".v3-chat-a")?.classList.remove("is-in", "show-text"); 326 return turn; 327 }; 328 329 const revealTurn = async (turn) => { 330 resetTurn(turn); 331 stream.appendChild(turn); 332 turn.classList.add("is-visible"); 333 await wait(STEP); 334 if (!running) return; 335 turn.querySelector(".v3-chat-q")?.classList.add("is-in"); 336 await wait(STEP); 337 if (!running) return; 338 const answer = turn.querySelector(".v3-chat-a"); 339 answer?.classList.add("is-in"); 340 await wait(TYPING); 341 if (!running) return; 342 answer?.classList.add("show-text"); 343 }; 344 345 const showCompleteTurn = (turn) => { 346 resetTurn(turn); 347 stream.appendChild(turn); 348 turn.classList.add("is-visible"); 349 turn.querySelector(".v3-chat-q")?.classList.add("is-in"); 350 turn.querySelector(".v3-chat-a")?.classList.add("is-in", "show-text"); 351 }; 352 353 const hideTurn = async (turn) => { 354 turn.classList.add("is-leaving"); 355 await wait(LEAVE); 356 resetTurn(turn); 357 }; 358 359 const prime = () => { 360 turns.forEach(resetTurn); 361 const visibleTurns = []; 362 for (let i = 0; i < WINDOW_SIZE; i++) { 363 showCompleteTurn(turns[i]); 364 visibleTurns.push(turns[i]); 365 } 366 return visibleTurns; 367 }; 368 369 async function play() { 370 let visibleTurns = prime(); 371 let nextIndex = WINDOW_SIZE; 372 while (running) { 373 await wait(READ); 374 if (!running) return; 375 const oldestTurn = visibleTurns.shift(); 376 if (oldestTurn) await hideTurn(oldestTurn); 377 if (!running) return; 378 const nextTurn = turns[nextIndex % turns.length]; 379 await revealTurn(nextTurn); 380 visibleTurns.push(nextTurn); 381 nextIndex = (nextIndex + 1) % turns.length; 382 } 383 } 384 385 const start = () => { if (running) return; running = true; play(); }; 386 const stop = () => { running = false; clearTimers(); }; 387 388 if ("IntersectionObserver" in window) { 389 const io = new IntersectionObserver( 390 (entries) =>
390 entries.forEach((e) => (e.isIntersecting ? start() : stop())), 391 { threshold: 0.25 } 392 ); 393 io.observe(stream); 394 } else { 395 start(); 396 } 397 })(); 398</script>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.