{"version":3,"sources":["../src/utils/safe-env.ts","../src/core/preview-loader.ts","../src/core/builder-token.ts","../src/plugins/guides/constants.ts","../src/plugins/guides/rich-text.ts","../src/plugins/guides/block-builder.ts","../src/plugins/guides/guide-design.ts","../src/plugins/guides/inline-host.ts","../src/plugins/guides/wait-for-element.ts","../src/plugins/guides/styles.ts","../src/plugins/guides/renderers/base-renderer.ts","../src/plugins/guides/renderers/floating-arrow.ts","../src/plugins/guides/renderers/badge-renderer.ts","../src/plugins/guides/walkthrough-block-builder.ts","../src/plugins/guides/renderers/banner-renderer.ts","../src/utils/uuid.ts","../src/plugins/guides/renderers/custom-frame.ts","../src/plugins/guides/code-block.ts","../src/plugins/guides/form-content.ts","../src/plugins/guides/renderers/composite-renderer.ts","../src/plugins/guides/renderers/custom-renderer.ts","../src/plugins/guides/renderers/form-renderer.ts","../src/plugins/guides/renderers/inline-custom-renderer.ts","../src/plugins/guides/renderers/inline-form-renderer.ts","../src/plugins/guides/renderers/inline-renderer.ts","../src/plugins/guides/renderers/modal-renderer.ts","../src/plugins/guides/renderers/tooltip-renderer.ts","../src/plugins/guides/renderers/walkthrough-renderer.ts","../src/plugins/guides/guide-preview.ts","../src/plugins/guides/url-match.ts","../src/plugins/autocapture/constants.ts","../src/plugins/autocapture/selector-builder.ts"],"names":["session","rebuilt","nodes","clamp","node","computePosition","offset","flip","shift","arrow","ready","renderer","classes","classPart"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAsBb,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,WAAA,EA6Bb,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAUb,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EA6Kb,aAAa,CAAA;AAAA;AAA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","file":"chunk-X27GD7IT.mjs","sourcesContent":["/**\n * Helpers para detectar el entorno de ejecución (browser vs SSR/Node) y la\n * disponibilidad de APIs del navegador. El SDK debe poder importarse en Node\n * sin romperse, por eso todo acceso a globals del browser pasa por aquí.\n */\n\n/** ¿Existe el objeto global `window`? */\nexport function hasWindow(): boolean {\n  return typeof window !== 'undefined';\n}\n\n/** ¿Existe el objeto global `document`? */\nexport function hasDocument(): boolean {\n  return typeof document !== 'undefined';\n}\n\n/** ¿`localStorage` está disponible y es escribible? (puede fallar en modo incógnito) */\nexport function hasLocalStorage(): boolean {\n  try {\n    if (typeof localStorage === 'undefined') return false;\n    const testKey = '__veo_test__';\n    localStorage.setItem(testKey, '1');\n    localStorage.removeItem(testKey);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/** ¿`navigator.sendBeacon` está disponible? */\nexport function hasNavigatorSendBeacon(): boolean {\n  return typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function';\n}\n","/**\n * Detección del modo PREVIEW POR LINK (`?veoPreview=<token>`). El core solo\n * detecta el param — el canje del token y el render viven en el bundle de\n * guías (`plugins/guides/preview-mode.ts`), que el caller carga\n * (estático en `index.ts`, lazy en `veo.ts`).\n *\n * El nombre del query param es parte del contrato con el dashboard (el link\n * generado por «Previsualizar en mi app»).\n */\nimport { hasWindow } from '../utils/safe-env';\n\nexport const PREVIEW_TOKEN_PARAM = 'veoPreview';\n/**\n * El token se PERSISTE en sessionStorage: al navegar entre páginas de la app la\n * URL pierde `?veoPreview`, y sin esto el modo preview (y su chip de control) se\n * apagaba al saltar de página. sessionStorage sobrevive la navegación de la\n * pestaña y muere al cerrarla — justo el alcance de una sesión de preview.\n */\nconst PREVIEW_TOKEN_KEY = 'veo:preview_token';\n\nfunction session(): Storage | null {\n  try {\n    return window.sessionStorage;\n  } catch {\n    return null; // modo privado / sandbox: seguimos solo con la URL\n  }\n}\n\n/**\n * Token del link de preview. Lo toma de la URL (`?veoPreview`) y lo persiste; si\n * la URL no lo trae (navegó a otra página), lo recupera de sessionStorage.\n * `null` si no hay ninguno. Se limpia con {@link clearPreviewToken}.\n */\nexport function getPreviewToken(): string | null {\n  if (!hasWindow()) return null;\n  let fromUrl: string | null = null;\n  try {\n    const value = new URLSearchParams(window.location.search).get(PREVIEW_TOKEN_PARAM);\n    fromUrl = value ? value : null;\n  } catch {\n    fromUrl = null;\n  }\n  const store = session();\n  if (fromUrl) {\n    try {\n      store?.setItem(PREVIEW_TOKEN_KEY, fromUrl);\n    } catch {\n      // no-op: sin storage seguimos con el token de la URL\n    }\n    return fromUrl;\n  }\n  try {\n    return store?.getItem(PREVIEW_TOKEN_KEY) || null;\n  } catch {\n    return null;\n  }\n}\n\n/** Sale del modo preview: borra el token persistido (lo llama el chip al cerrar). */\nexport function clearPreviewToken(): void {\n  try {\n    session()?.removeItem(PREVIEW_TOKEN_KEY);\n  } catch {\n    // no-op\n  }\n}\n\n/**\n * `true` cuando la app corre en modo preview-por-link. Igual que en modo\n * builder, el runtime NO debe instalar el plugin de guías: las guías live\n * taparían/duplicarían la guía que se está previsualizando.\n */\nexport function isPreviewMode(): boolean {\n  return getPreviewToken() !== null;\n}\n","/**\n * Resolución + persistencia del CONTEXTO de builder.\n *\n * El contexto viaja en la URL (`?veoBuilder=<token>&veoBuilderOrigin=<origen>…`),\n * pero los guards de auth de la app suelen **redirigir y tirar el query string**\n * (p.ej. `/dashboard/home` → `/` para loguearte). Si dependiéramos solo de la URL,\n * el modo builder moriría en ese redirect y nunca podrías diseñar sobre una página\n * detrás de login.\n *\n * Solución (igual que el \"designer mode\" de Pendo): apenas vemos el token en la\n * URL guardamos el contexto en `sessionStorage` y de ahí en más lo leemos como\n * fallback. Así el modo builder **sobrevive a redirects y a un login** dentro de la\n * misma pestaña (incluido el ida-y-vuelta de OAuth). Persiste hasta el teardown o\n * hasta que se cierra la pestaña.\n *\n * Vive en el core (bundle de producción) porque tanto el loader del builder como\n * el gate del runtime de guías necesitan saber si estamos en modo builder. Es\n * mínimo a propósito (ver budget en CLAUDE.md).\n */\nimport { hasWindow } from '../utils/safe-env';\nimport {\n  BUILDER_GUIDE_PARAM,\n  BUILDER_ORIGIN_PARAM,\n  BUILDER_PANEL_PARAM,\n  BUILDER_PANEL_PATH_PARAM,\n  BUILDER_TOKEN_PARAM,\n} from './builder-constants';\nimport { isPreviewMode } from './preview-loader';\n\n// Re-export para no romper a quien los importa desde aquí (bridge-protocol, etc.).\nexport { BUILDER_ORIGIN_PARAM, BUILDER_TOKEN_PARAM } from './builder-constants';\n\n/** Contexto de la sesión de builder activa en la app. */\nexport interface BuilderClientContext {\n  /** Token de correlación del handshake. */\n  token: string;\n  /** Origen del dashboard de Veo (para postMessage). */\n  origin: string | null;\n  /** `true` → modo panel inyectado (app top-level, editor encima). */\n  panel: boolean;\n  /** Id de la guía en edición (para el panel). */\n  guide: string | null;\n  /** Path del panel del editor en el dashboard (override; default `/guides/design`). */\n  panelPath: string | null;\n}\n\nconst CTX_KEY = 'veo:builder_ctx';\n/**\n * Respaldo en localStorage, KEYED POR GUÍA. sessionStorage muere al cerrar la\n * pestaña; para que la sesión del editor \"perdure\" al abrir varias guías o\n * reabrir la misma, además persistimos por guía en localStorage con un TTL.\n * Keyed por guía → dos guías abiertas en pestañas distintas no se pisan.\n */\nconst LS_PREFIX = 'veo:builder_ctx:';\n/**\n * TTL del respaldo. Antes era 12 h y producía \"sesiones fantasma\": cerrabas la\n * pestaña del editor sin teardown y CUALQUIER visita a la app durante 12 h\n * restauraba un contexto viejo (token/plantilla stale) o re-abría el panel.\n * 30 min alcanza para su propósito real — sobrevivir el ida-y-vuelta del login\n * y recuperar un cierre accidental — sin arrastrar sesiones de ayer.\n */\nconst PERSIST_TTL_MS = 30 * 60 * 1000; // 30 min\n\ninterface StoredCtx extends BuilderClientContext {\n  savedAt: number;\n}\n\nfunction session(): Storage | null {\n  try {\n    return window.sessionStorage;\n  } catch {\n    return null; // sessionStorage puede tirar (modo privado, sandbox)\n  }\n}\n\nfunction local(): Storage | null {\n  try {\n    return window.localStorage;\n  } catch {\n    return null;\n  }\n}\n\nfunction lsKey(guide: string | null): string {\n  return LS_PREFIX + (guide || 'default');\n}\n\n/** Persiste el contexto en sessionStorage (pestaña) + localStorage por guía (TTL). */\nfunction persist(ctx: BuilderClientContext): void {\n  try {\n    session()?.setItem(CTX_KEY, JSON.stringify(ctx));\n  } catch {\n    // no-op: sin sessionStorage seguimos con el contexto de la URL\n  }\n  try {\n    const stored: StoredCtx = { ...ctx, savedAt: Date.now() };\n    local()?.setItem(lsKey(ctx.guide), JSON.stringify(stored));\n  } catch {\n    // no-op\n  }\n}\n\n/** Contexto más reciente no vencido en localStorage (limpia los vencidos de paso). */\nfunction readFreshFromLocal(): BuilderClientContext | null {\n  const store = local();\n  if (!store) return null;\n  let best: StoredCtx | null = null;\n  try {\n    for (let i = 0; i < store.length; i++) {\n      const key = store.key(i);\n      if (!key?.startsWith(LS_PREFIX)) continue;\n      const raw = store.getItem(key);\n      if (!raw) continue;\n      let parsed: StoredCtx | null = null;\n      try {\n        parsed = JSON.parse(raw) as StoredCtx;\n      } catch {\n        continue;\n      }\n      if (typeof parsed?.savedAt !== 'number' || Date.now() - parsed.savedAt > PERSIST_TTL_MS) {\n        try {\n          store.removeItem(key);\n        } catch {\n          // no-op\n        }\n        continue;\n      }\n      if (!best || parsed.savedAt > best.savedAt) best = parsed;\n    }\n  } catch {\n    return null;\n  }\n  if (!best) return null;\n  const { savedAt: _savedAt, ...ctx } = best;\n  return ctx;\n}\n\nfunction urlParams(): URLSearchParams | null {\n  try {\n    const search = new URLSearchParams(window.location.search);\n    if (search.get(BUILDER_TOKEN_PARAM)) return search;\n    // Fallback: FRAGMENTO (#veoBuilder=…). El dashboard duplica los params en el\n    // hash porque, con sesión iniciada en la app, el guard de auth suele\n    // redirigir la raíz y el redirect tira el query string — pero los\n    // navegadores preservan el fragmento a través de los 3xx. Sin esto, el\n    // editor solo abría con el usuario deslogueado.\n    const hash = window.location.hash.replace(/^#/, '');\n    if (hash.includes(`${BUILDER_TOKEN_PARAM}=`)) return new URLSearchParams(hash);\n    return search;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Contexto de builder activo: el de la URL (que además se persiste) o, si el\n * query string se perdió en un redirect, el guardado en sessionStorage. `null`\n * si no estamos en modo builder.\n */\nexport function resolveBuilderContext(): BuilderClientContext | null {\n  if (!hasWindow()) return null;\n  const params = urlParams();\n  const fromUrl = params?.get(BUILDER_TOKEN_PARAM);\n  if (fromUrl) {\n    const ctx: BuilderClientContext = {\n      token: fromUrl,\n      origin: params?.get(BUILDER_ORIGIN_PARAM) ?? null,\n      panel: params?.get(BUILDER_PANEL_PARAM) === '1',\n      guide: params?.get(BUILDER_GUIDE_PARAM) ?? null,\n      panelPath: params?.get(BUILDER_PANEL_PATH_PARAM) ?? null,\n    };\n    persist(ctx);\n    return ctx;\n  }\n  // Preview-por-link (`?veoPreview`) es un modo EXCLUYENTE del builder: si la app\n  // corre en preview NO revivimos una sesión de builder desde la persistencia.\n  // Sin esto, abrir un link de preview dentro de los 30 min de haber editado\n  // resucitaba el contexto de localStorage y RE-INYECTABA el editor ENCIMA del\n  // preview — y ese remonte podía tirar el trabajo sin guardar. Un `?veoBuilder`\n  // explícito en la URL sí gana (se resolvió arriba, antes de este chequeo).\n  if (isPreviewMode()) return null;\n  // Sin token en la URL: primero la pestaña (sessionStorage), y si murió (pestaña\n  // nueva / restaurada) caemos al respaldo persistido más reciente y lo\n  // re-hidratamos en la sesión para que el resto de la carga sea consistente.\n  try {\n    const raw = session()?.getItem(CTX_KEY);\n    if (raw) return JSON.parse(raw) as BuilderClientContext;\n  } catch {\n    // sigue al fallback de localStorage\n  }\n  const fromLocal = readFreshFromLocal();\n  if (fromLocal) {\n    try {\n      session()?.setItem(CTX_KEY, JSON.stringify(fromLocal));\n    } catch {\n      // no-op\n    }\n  }\n  return fromLocal;\n}\n\n/** Token de builder activo (URL o persistido). */\nexport function resolveBuilderToken(): string | null {\n  return resolveBuilderContext()?.token ?? null;\n}\n\n/** Origen del dashboard (URL o persistido). */\nexport function resolveBuilderOrigin(): string | null {\n  return resolveBuilderContext()?.origin ?? null;\n}\n\n/** `true` si hay un contexto de builder activo (URL o persistido). */\nexport function isBuilderMode(): boolean {\n  return resolveBuilderContext() !== null;\n}\n\n/**\n * Borra el modo builder persistido (al hacer teardown / salir del editor).\n * Limpia la pestaña (sessionStorage) y el respaldo de ESTA guía (localStorage);\n * los respaldos de otras guías siguen (no se pisan al cerrar una).\n */\nexport function clearBuilderToken(): void {\n  if (!hasWindow()) return;\n  let guide: string | null = null;\n  try {\n    const raw = session()?.getItem(CTX_KEY);\n    if (raw) guide = (JSON.parse(raw) as BuilderClientContext).guide ?? null;\n  } catch {\n    // no-op\n  }\n  try {\n    session()?.removeItem(CTX_KEY);\n  } catch {\n    // no-op\n  }\n  try {\n    local()?.removeItem(lsKey(guide));\n  } catch {\n    // no-op\n  }\n}\n","/** z-index muy alto para flotar sobre cualquier UI del cliente sin tapar dev tools. */\nexport const GUIDE_Z_INDEX = 2147483640;\n\n/** Tiempo máximo esperando que aparezca el elemento ancla de un tooltip. */\nexport const DEFAULT_ANCHOR_WAIT_MS = 5000;\n\n/** Protocolos permitidos en `imageUrl` y `style.ctaUrl`. */\nexport const SAFE_URL_PROTOCOLS: ReadonlyArray<string> = ['http:', 'https:'];\n\n/** Atributo data-* que marca un host de guía en el DOM (útil para tests). */\nexport const GUIDE_HOST_ATTR = 'data-veo-guide';\n\n/**\n * Prefijo del key de localStorage donde vive el cache de frequency.\n * Se completa con un identificador derivado del apiKey para evitar\n * contaminación cuando el mismo navegador corre varios workspaces.\n */\nexport const FREQUENCY_CACHE_KEY_PREFIX = 'veo:freq:';\n\n/** Tiempo entre flushes automáticos del tracker (ms). */\nexport const DEFAULT_TRACKER_FLUSH_INTERVAL_MS = 3000;\n\n/** Cuántas interactions se acumulan antes de un flush forzado. */\nexport const DEFAULT_TRACKER_BATCH_SIZE = 5;\n\n/** Reintentos por item antes de descartar (se aplica con backoff implícito por el timer). */\nexport const DEFAULT_TRACKER_MAX_RETRIES = 3;\n\n/** Límite de entradas en el cache local — protege contra bloat de localStorage. */\nexport const FREQUENCY_CACHE_MAX_ENTRIES = 500;\n\n/** TTL para entradas del cache. Tras esto se vuelven a re-evaluar contra el backend. */\nexport const FREQUENCY_CACHE_TTL_MS = 90 * 24 * 60 * 60 * 1000;\n\n/**\n * Prefijo del key de localStorage donde vive el estado del walkthrough\n * activo. Se completa con el mismo `namespaceFromApiKey` que el frequency\n * cache para que dos workspaces en el mismo navegador no se pisen.\n */\nexport const WALKTHROUGH_STATE_KEY_PREFIX = 'veo:walkthrough_state:';\n\n/**\n * Si pasan 30 min sin progreso (`advance`/`back`), el walkthrough se\n * considera abandonado. El estado se limpia de localStorage al detectarlo\n * y NO se envía `completed` al backend (porque no se completó).\n */\nexport const WALKTHROUGH_ABANDONMENT_TIMEOUT_MS = 30 * 60 * 1000;\n\n/**\n * Tiempo máximo esperando que aparezca el selector del step actual en el\n * DOM. Más restrictivo que `DEFAULT_ANCHOR_WAIT_MS` porque en walkthroughs\n * la página correcta debería estar ya cargada al resumir.\n */\nexport const WALKTHROUGH_STEP_SELECTOR_TIMEOUT_MS = 5000;\n","import { isSafeUrl } from './block-builder';\n\n/**\n * Render SEGURO del rich text de bloques `text` (negrita/cursiva/subrayado/\n * links/listas). El backend guarda `block.html` ya sanitizado con la misma\n * whitelist, pero acá NO confiamos en eso: re-validamos al renderizar.\n *\n * Cómo mantiene la garantía \"sin innerHTML\" del renderer (regla 8 del\n * CLAUDE.md): el string se parsea con `DOMParser.parseFromString`, que produce\n * un documento INERTE — sus scripts no ejecutan y nada toca el DOM vivo —, y\n * el árbol resultante se RECONSTRUYE a mano: cada nodo cuyo tag está en la\n * whitelist se re-crea con `createElement`/`createTextNode`; los atributos NO\n * se copian (salvo `href` validado con `isSafeUrl`); los tags desconocidos se\n * \"unwrappean\" (se descarta el elemento, se conservan sus hijos de texto).\n * Nunca se inserta HTML crudo en el documento real.\n */\n\n/** Tags permitidos → tag con el que se re-crean (b/i se normalizan). */\nconst ALLOWED_TAGS: Record<string, string> = {\n  P: 'p',\n  BR: 'br',\n  STRONG: 'strong',\n  B: 'strong',\n  EM: 'em',\n  I: 'em',\n  U: 'u',\n  S: 's',\n  UL: 'ul',\n  OL: 'ol',\n  LI: 'li',\n  A: 'a',\n};\n\n/**\n * Tags que se descartan CON su contenido (a diferencia del unwrap): su texto\n * interno es código/markup, no copy — dejarlo visible sería basura (\"window.x\n * = 1;\" pintado en la guía).\n */\nconst DROP_TAGS = new Set([\n  'SCRIPT',\n  'STYLE',\n  'TEMPLATE',\n  'IFRAME',\n  'OBJECT',\n  'EMBED',\n  'NOSCRIPT',\n  'TITLE',\n  'TEXTAREA',\n  'SELECT',\n  'SVG',\n  'MATH',\n]);\n\nconst MAX_INPUT_LEN = 16 * 1024;\nconst MAX_DEPTH = 20;\nconst MAX_NODES = 1000;\n\n/**\n * Convierte un string de rich text whitelisted en un `DocumentFragment` seguro\n * construido nodo a nodo. Si el input excede las guardas (tamaño/nodos), cae a\n * un nodo de texto con el contenido plano — nunca falla ni lanza.\n */\nexport function renderRichText(html: string, doc: Document): DocumentFragment {\n  const fragment = doc.createDocumentFragment();\n  if (typeof html !== 'string' || html.length === 0) return fragment;\n\n  let parsed: Document;\n  try {\n    parsed = new DOMParser().parseFromString(\n      html.length > MAX_INPUT_LEN ? html.slice(0, MAX_INPUT_LEN) : html,\n      'text/html',\n    );\n  } catch {\n    fragment.appendChild(doc.createTextNode(html));\n    return fragment;\n  }\n\n  const budget = { nodes: 0, exceeded: false };\n  for (const child of Array.from(parsed.body.childNodes)) {\n    const rebuilt = rebuildNode(child, doc, 0, budget);\n    if (rebuilt) fragment.appendChild(rebuilt);\n  }\n\n  // Presupuesto excedido: descartar el árbol parcial y caer a texto plano.\n  if (budget.exceeded) {\n    const plain = doc.createDocumentFragment();\n    plain.appendChild(doc.createTextNode(parsed.body.textContent ?? ''));\n    return plain;\n  }\n  return fragment;\n}\n\nfunction rebuildNode(\n  node: Node,\n  doc: Document,\n  depth: number,\n  budget: { nodes: number; exceeded: boolean },\n): Node | null {\n  if (budget.exceeded) return null;\n  if (++budget.nodes > MAX_NODES || depth > MAX_DEPTH) {\n    budget.exceeded = true;\n    return null;\n  }\n\n  if (node.nodeType === Node.TEXT_NODE) {\n    return doc.createTextNode(node.textContent ?? '');\n  }\n  if (node.nodeType !== Node.ELEMENT_NODE) return null; // comentarios, etc.\n\n  const el = node as Element;\n  if (DROP_TAGS.has(el.tagName)) return null; // fuera con contenido y todo\n  const mapped = ALLOWED_TAGS[el.tagName];\n\n  // Tag desconocido → unwrap: se conservan los hijos, sin el elemento.\n  if (!mapped) {\n    const frag = doc.createDocumentFragment();\n    for (const child of Array.from(el.childNodes)) {\n      const rebuilt = rebuildNode(child, doc, depth + 1, budget);\n      if (rebuilt) frag.appendChild(rebuilt);\n    }\n    return frag;\n  }\n\n  // Links: solo con href http(s); si el href no pasa, se unwrappea a texto.\n  if (mapped === 'a') {\n    const href = el.getAttribute('href') ?? '';\n    if (!isSafeUrl(href)) {\n      const frag = doc.createDocumentFragment();\n      for (const child of Array.from(el.childNodes)) {\n        const rebuilt = rebuildNode(child, doc, depth + 1, budget);\n        if (rebuilt) frag.appendChild(rebuilt);\n      }\n      return frag;\n    }\n    const a = doc.createElement('a');\n    a.setAttribute('href', href);\n    a.setAttribute('target', '_blank');\n    a.setAttribute('rel', 'noopener noreferrer nofollow');\n    for (const child of Array.from(el.childNodes)) {\n      const rebuilt = rebuildNode(child, doc, depth + 1, budget);\n      if (rebuilt) a.appendChild(rebuilt);\n    }\n    return a;\n  }\n\n  // Elemento permitido: re-crear SIN copiar atributos.\n  const rebuilt = doc.createElement(mapped);\n  for (const child of Array.from(el.childNodes)) {\n    const childNode = rebuildNode(child, doc, depth + 1, budget);\n    if (childNode) rebuilt.appendChild(childNode);\n  }\n  return rebuilt;\n}\n","import { SAFE_URL_PROTOCOLS } from './constants';\nimport { renderRichText } from './rich-text';\nimport type { CtaAction, GuideInteractionMetadata, GuideStep, StepBlock } from './types';\n\ninterface StepCallbacks {\n  /** `meta` identifica QUÉ botón se clickeó (analytics por botón). */\n  onCtaClick: (action: CtaAction, url?: string, meta?: GuideInteractionMetadata) => void;\n  onDismiss: () => void;\n}\n\n/**\n * Construye el subtree DOM de un step (título, contenido, imagen, CTA,\n * botón de cerrar) de forma segura.\n *\n * Reglas inmutables:\n *   - **Nunca** usa `innerHTML` ni `insertAdjacentHTML`.\n *   - Todo texto se asigna por `textContent` (escape HTML automático).\n *   - URLs (`imageUrl`, `style.ctaUrl`) pasan por `isSafeUrl` — solo\n *     `http(s):` permitido, rechaza `javascript:`, `data:`, etc.\n *   - Campos opcionales ausentes simplemente no pintan su nodo. Si una\n *     guía no trae `ctaText` no se pinta botón.\n *\n * El `doc` se inyecta para soportar tests con jsdom u otros documentos.\n */\nexport function buildStepContent(\n  step: GuideStep,\n  doc: Document,\n  callbacks: StepCallbacks,\n): HTMLElement {\n  const container = doc.createElement('div');\n  container.className = 'veo-guide-content';\n\n  const blocks = normalizeBlocks(step);\n  if (blocks) {\n    renderBlocks(container, blocks, doc, callbacks);\n  } else {\n    renderLegacyStep(container, step, doc, callbacks);\n  }\n\n  // Botón \"✕\" siempre presente (esquina superior derecha).\n  container.appendChild(createCloseButton(doc, () => callbacks.onDismiss()));\n\n  return container;\n}\n\n/**\n * Nodos de CONTENIDO de un paso (títulos/textos/imágenes — SIN botones ni ✕):\n * respeta `blocks[]` (con rich text y full-bleed) o cae a los escalares\n * legacy. Lo usa el walkthrough, cuya navegación es propia — los bloques\n * `button` del paso se omiten porque atrás/siguiente/omitir los pinta el\n * chrome del tour.\n */\nexport function buildContentNodes(step: GuideStep, doc: Document): HTMLElement[] {\n  const blocks = normalizeBlocks(step);\n  if (blocks) {\n    const nodes: HTMLElement[] = [];\n    for (const { block, idx } of blocks) {\n      if (block.type === 'button') continue;\n      const node = buildContentBlock(block, doc);\n      if (!node) continue;\n      node.dataset.veoIdx = String(idx);\n      nodes.push(node);\n    }\n    return nodes;\n  }\n  const nodes: HTMLElement[] = [];\n  if (typeof step.imageUrl === 'string' && step.imageUrl && isSafeUrl(step.imageUrl)) {\n    const img = doc.createElement('img');\n    img.className = 'veo-guide-image';\n    img.src = step.imageUrl;\n    img.alt = typeof step.title === 'string' ? step.title : '';\n    nodes.push(img);\n  }\n  if (typeof step.title === 'string' && step.title) {\n    const heading = doc.createElement('h2');\n    heading.className = 'veo-guide-title';\n    heading.textContent = step.title;\n    nodes.push(heading);\n  }\n  if (typeof step.content === 'string' && step.content) {\n    const paragraph = doc.createElement('p');\n    paragraph.className = 'veo-guide-text';\n    paragraph.textContent = step.content;\n    nodes.push(paragraph);\n  }\n  return nodes;\n}\n\n/** Render clásico: imagen + un título + un texto + un CTA (campos escalares). */\nfunction renderLegacyStep(\n  container: HTMLElement,\n  step: GuideStep,\n  doc: Document,\n  callbacks: StepCallbacks,\n): void {\n  if (typeof step.imageUrl === 'string' && step.imageUrl && isSafeUrl(step.imageUrl)) {\n    const img = doc.createElement('img');\n    img.className = 'veo-guide-image';\n    img.src = step.imageUrl;\n    img.alt = typeof step.title === 'string' ? step.title : '';\n    container.appendChild(img);\n  }\n\n  if (typeof step.title === 'string' && step.title) {\n    const heading = doc.createElement('h2');\n    heading.className = 'veo-guide-title';\n    heading.textContent = step.title;\n    container.appendChild(heading);\n  }\n\n  if (typeof step.content === 'string' && step.content) {\n    const paragraph = doc.createElement('p');\n    paragraph.className = 'veo-guide-text';\n    paragraph.textContent = step.content;\n    container.appendChild(paragraph);\n  }\n\n  const actions = doc.createElement('div');\n  actions.className = 'veo-guide-actions';\n\n  if (typeof step.ctaText === 'string' && step.ctaText) {\n    const cta = doc.createElement('button');\n    cta.type = 'button';\n    cta.className = 'veo-guide-cta';\n    cta.textContent = step.ctaText;\n    cta.addEventListener('click', () => {\n      const action: CtaAction = step.ctaAction ?? 'dismiss';\n      const ctaUrl = readCtaUrl(step);\n      callbacks.onCtaClick(action, ctaUrl);\n    });\n    actions.appendChild(cta);\n  }\n\n  container.appendChild(actions);\n}\n\n/**\n * Devuelve los bloques válidos del paso CON su índice original en\n * `step.blocks[]` (el drop-target del editor lo necesita: los bloques\n * filtrados u omitidos corren los índices del DOM, no los del modelo), o\n * `null` si no hay ninguno (usa el legacy).\n */\nfunction normalizeBlocks(step: GuideStep): Array<{ block: StepBlock; idx: number }> | null {\n  if (!Array.isArray(step.blocks) || step.blocks.length === 0) return null;\n  const valid = step.blocks\n    .map((block, idx) => ({ block, idx }))\n    .filter((entry): entry is { block: StepBlock; idx: number } => {\n      const b = entry.block;\n      if (!b || typeof b !== 'object') return false;\n      if (b.type === 'image') return typeof b.url === 'string' && isSafeUrl(b.url);\n      return b.type === 'title' || b.type === 'text' || b.type === 'button';\n    });\n  return valid.length > 0 ? valid : null;\n}\n\n/**\n * Render por bloques: recorre en orden. Los botones consecutivos se agrupan en\n * una misma fila de acciones (para que queden lado a lado). Todo texto por\n * `textContent`; las imágenes por `isSafeUrl`.\n */\nfunction renderBlocks(\n  container: HTMLElement,\n  blocks: Array<{ block: StepBlock; idx: number }>,\n  doc: Document,\n  callbacks: StepCallbacks,\n): void {\n  let i = 0;\n  while (i < blocks.length) {\n    const entry = blocks[i];\n    if (entry?.block.type === 'button') {\n      const actions = doc.createElement('div');\n      actions.className = 'veo-guide-actions';\n      // La fila agrupada lleva el índice del PRIMER botón.\n      actions.dataset.veoIdx = String(entry.idx);\n      // La alineación de un botón mueve la FILA (justify-content), no el botón\n      // dentro de ella (align-self sería el eje vertical y no haría nada).\n      let rowAlign: string | undefined;\n      while (i < blocks.length && blocks[i]?.block.type === 'button') {\n        const btnBlock = (blocks[i] as { block: StepBlock }).block;\n        if (!rowAlign) {\n          const a = (btnBlock.style as Record<string, unknown> | null | undefined)?.align;\n          if (a === 'left' || a === 'center' || a === 'right') rowAlign = a;\n        }\n        actions.appendChild(buildButtonBlock(btnBlock, doc, callbacks));\n        i++;\n      }\n      if (rowAlign) actions.style.justifyContent = BLOCK_ALIGN_SELF[rowAlign] as string;\n      container.appendChild(actions);\n      continue;\n    }\n    const node = entry ? buildContentBlock(entry.block, doc) : null;\n    if (node && entry) {\n      node.dataset.veoIdx = String(entry.idx);\n      container.appendChild(node);\n    }\n    i++;\n  }\n}\n\nexport function buildContentBlock(block: StepBlock, doc: Document): HTMLElement | null {\n  switch (block.type) {\n    case 'title': {\n      const el = doc.createElement('h2');\n      el.className = 'veo-guide-title';\n      el.textContent = typeof block.text === 'string' ? block.text : '';\n      applyBlockStyle(el, block.style, 'text');\n      return el;\n    }\n    case 'text': {\n      // `div` (no `p`): el rich text puede contener sus propios <p>/<ul>.\n      const el = doc.createElement('div');\n      el.className = 'veo-guide-text';\n      if (typeof block.html === 'string' && block.html) {\n        el.appendChild(renderRichText(block.html, doc));\n      } else {\n        el.textContent = typeof block.text === 'string' ? block.text : '';\n      }\n      applyBlockStyle(el, block.style, 'text');\n      return el;\n    }\n    case 'image': {\n      if (typeof block.url !== 'string' || !isSafeUrl(block.url)) return null;\n      const el = doc.createElement('img');\n      el.className = 'veo-guide-image';\n      el.src = block.url;\n      el.alt = '';\n      applyBlockStyle(el, block.style, 'image');\n      return el;\n    }\n    default:\n      return null;\n  }\n}\n\nfunction buildButtonBlock(\n  block: StepBlock,\n  doc: Document,\n  callbacks: StepCallbacks,\n): HTMLButtonElement {\n  const btn = doc.createElement('button');\n  btn.type = 'button';\n  btn.className = 'veo-guide-cta';\n  btn.textContent = typeof block.text === 'string' && block.text ? block.text : 'OK';\n  applyBlockStyle(btn, block.style, 'button');\n  btn.addEventListener('click', () => {\n    // Camino viejo (renderer clásico): solo maneja CtaAction. Las acciones\n    // nuevas del modelo unificado (prev/submit-forms*) las maneja el renderer\n    // unificado; acá degradan a `dismiss` (no aparecen en guías viejas).\n    const raw = block.action ?? 'dismiss';\n    const action: CtaAction = raw === 'next' || raw === 'url' || raw === 'guide' ? raw : 'dismiss';\n    // El 2º argumento es \"el destino\" de la acción: la URL para `url`, el\n    // guideId para `guide` (encadenado). Para el resto, undefined.\n    const target =\n      action === 'url' && typeof block.url === 'string' && isSafeUrl(block.url)\n        ? block.url\n        : action === 'guide' && typeof block.targetGuideId === 'string' && block.targetGuideId\n          ? block.targetGuideId\n          : undefined;\n    const meta: GuideInteractionMetadata = {\n      ...(typeof block.id === 'string' && block.id ? { buttonId: block.id } : {}),\n      ...(typeof block.text === 'string' && block.text ? { buttonText: block.text } : {}),\n    };\n    callbacks.onCtaClick(action, target, Object.keys(meta).length ? meta : undefined);\n  });\n  return btn;\n}\n\nconst BLOCK_ALIGN_SELF: Record<string, string> = {\n  left: 'flex-start',\n  center: 'center',\n  right: 'flex-end',\n};\n\nfunction clampNum(n: number, min: number, max: number): number {\n  return Math.min(max, Math.max(min, n));\n}\n\n/**\n * Aplica el estilo por-bloque como estilos INLINE (cada bloque es único, no\n * puede usar las CSS vars compartidas del host). Setear `el.style.*` es seguro:\n * el browser descarta valores inválidos (no hay inyección de CSS crudo).\n */\nexport function applyBlockStyle(\n  el: HTMLElement,\n  style: StepBlock['style'],\n  kind: 'text' | 'image' | 'button',\n): void {\n  if (!style || typeof style !== 'object') return;\n  const s = style as Record<string, unknown>;\n  // Imagen \"a sangre\": ocupa todo el ancho de la tarjeta ignorando el padding\n  // (hero image estilo anuncio). El CSS de la clase manda — se saltan las\n  // props inline de tamaño/alineación que la contradirían.\n  if (kind === 'image' && s.bleed === true) {\n    el.classList.add('veo-guide-image--bleed');\n    return;\n  }\n  const align = typeof s.align === 'string' ? s.align : null;\n  if (align && (align === 'left' || align === 'center' || align === 'right')) {\n    // text → text-align; image → align-self (se encoge y se ubica);\n    // button → NO aquí (la fila de acciones maneja su justify-content).\n    if (kind === 'text') el.style.textAlign = align;\n    else if (kind === 'image') el.style.alignSelf = BLOCK_ALIGN_SELF[align] as string;\n  }\n  if (kind !== 'image' && typeof s.color === 'string') el.style.color = s.color;\n  if (kind === 'text' && typeof s.fontSize === 'number' && Number.isFinite(s.fontSize)) {\n    el.style.fontSize = `${clampNum(s.fontSize, 8, 72)}px`;\n  }\n  if (kind === 'image' && typeof s.width === 'number' && Number.isFinite(s.width)) {\n    el.style.width = `${clampNum(s.width, 10, 100)}%`;\n  }\n  if (kind === 'image' && typeof s.radius === 'number' && Number.isFinite(s.radius)) {\n    el.style.borderRadius = `${clampNum(s.radius, 0, 48)}px`;\n  }\n  if (typeof s.marginTop === 'number' && Number.isFinite(s.marginTop)) {\n    el.style.marginTop = `${clampNum(s.marginTop, 0, 64)}px`;\n  }\n  if (typeof s.marginBottom === 'number' && Number.isFinite(s.marginBottom)) {\n    el.style.marginBottom = `${clampNum(s.marginBottom, 0, 64)}px`;\n  }\n\n  // ── Estilos por-bloque extendidos (panel de estilos del editor) ──\n  // Tipografía (texto/título/botón; no imagen).\n  if (kind !== 'image') {\n    if (typeof s.fontSize === 'number' && Number.isFinite(s.fontSize)) {\n      el.style.fontSize = `${clampNum(s.fontSize, 8, 96)}px`;\n    }\n    if (typeof s.fontFamily === 'string' && s.fontFamily && s.fontFamily !== 'inherit') {\n      el.style.fontFamily = s.fontFamily;\n    }\n    if (typeof s.fontWeight === 'string' && s.fontWeight) el.style.fontWeight = s.fontWeight;\n    if (typeof s.textTransform === 'string' && s.textTransform && s.textTransform !== 'none') {\n      el.style.textTransform = s.textTransform;\n    }\n    if (typeof s.lineHeight === 'number' && Number.isFinite(s.lineHeight)) {\n      el.style.lineHeight = `${clampNum(s.lineHeight, 50, 300)}%`;\n    }\n    if (typeof s.letterSpacing === 'number' && Number.isFinite(s.letterSpacing)) {\n      el.style.letterSpacing = `${clampNum(s.letterSpacing, -5, 20)}px`;\n    }\n  }\n  // Fondo, borde, radio (todos los tipos).\n  if (typeof s.background === 'string' && s.background) el.style.background = s.background;\n  if (typeof s.borderWidth === 'number' && s.borderWidth > 0) {\n    const bc = typeof s.borderColor === 'string' && s.borderColor ? s.borderColor : '#bbbbbb';\n    el.style.border = `${clampNum(s.borderWidth, 0, 20)}px solid ${bc}`;\n  }\n  if (kind !== 'image' && typeof s.radius === 'number' && Number.isFinite(s.radius)) {\n    el.style.borderRadius = `${clampNum(s.radius, 0, 64)}px`;\n  }\n  // Dimensiones explícitas (panel de estilos): ALTO para todos los tipos; ANCHO\n  // en px solo para no-imagen — la imagen usa `width` como % (arriba), para no\n  // romper guías existentes con hero images. Números → px, clamp 1..2000.\n  if (typeof s.height === 'number' && Number.isFinite(s.height) && s.height > 0) {\n    el.style.height = `${clampNum(s.height, 1, 2000)}px`;\n  }\n  if (kind !== 'image' && typeof s.width === 'number' && Number.isFinite(s.width) && s.width > 0) {\n    el.style.width = `${clampNum(s.width, 1, 2000)}px`;\n  }\n  // Padding y margen — los 4 lados.\n  for (const side of ['Top', 'Right', 'Bottom', 'Left'] as const) {\n    const p = s[`padding${side}`];\n    if (typeof p === 'number' && Number.isFinite(p)) {\n      el.style.setProperty(`padding-${side.toLowerCase()}`, `${clampNum(p, 0, 128)}px`);\n    }\n    const m = s[`margin${side}`];\n    if (typeof m === 'number' && Number.isFinite(m)) {\n      el.style.setProperty(`margin-${side.toLowerCase()}`, `${clampNum(m, 0, 128)}px`);\n    }\n  }\n}\n\n/**\n * Botón \"✕\" de cerrar reutilizable. Universal: modal/banner/tooltip/inline (vía\n * `buildStepContent`), walkthrough, forms y guías custom lo usan, para que toda\n * guía tenga siempre una salida en la esquina superior derecha.\n *\n * `className` permite un estilo distinto por chrome (las custom usan\n * `veo-custom-close`, un botón visible sobre HTML arbitrario del cliente).\n */\nexport function createCloseButton(\n  doc: Document,\n  onClose: () => void,\n  className = 'veo-guide-close',\n): HTMLButtonElement {\n  const closeBtn = doc.createElement('button');\n  closeBtn.type = 'button';\n  closeBtn.className = className;\n  closeBtn.setAttribute('aria-label', 'Cerrar');\n  closeBtn.textContent = '×';\n  closeBtn.addEventListener('click', onClose);\n  return closeBtn;\n}\n\n/**\n * Acepta solo `http:` y `https:`. Resuelve relativas contra la página\n * actual cuando hay `window`; en SSR (sin window) toma la URL como\n * absoluta. Rechaza cualquier protocolo no listado y URLs malformadas.\n */\nexport function isSafeUrl(url: string): boolean {\n  if (typeof url !== 'string' || url.length === 0) return false;\n  try {\n    const base = typeof window !== 'undefined' ? window.location.href : 'http://localhost/';\n    const parsed = new URL(url, base);\n    return SAFE_URL_PROTOCOLS.includes(parsed.protocol);\n  } catch {\n    return false;\n  }\n}\n\n/**\n * El backend no tiene aún un campo `ctaUrl` en el GuideStep — la URL\n * destino para `ctaAction === 'url'` se guarda como convención en\n * `style.ctaUrl`. Esta función la extrae validando que sea una URL\n * segura. Devuelve `undefined` si falta o no pasa el chequeo.\n */\nfunction readCtaUrl(step: GuideStep): string | undefined {\n  const candidate = step.style?.ctaUrl;\n  if (typeof candidate !== 'string') return undefined;\n  return isSafeUrl(candidate) ? candidate : undefined;\n}\n","import type { GuideStep } from './types';\n\n/**\n * Tematización de guías dirigida por datos. El autor (dashboard no-code)\n * guarda props de diseño en `step.style`; aquí las traducimos a las\n * variables CSS `--veo-*` que ya define `GUIDE_STYLES`.\n *\n * Seguridad: solo asignamos *custom properties* sobre el host (valores,\n * nunca selectores ni código). Validamos cada valor; lo inválido se ignora\n * y queda el default del stylesheet. Ningún valor llega a `innerHTML` ni a\n * `eval` — coherente con las reglas del renderer.\n */\n\n/** Overrides del tema oscuro (claro = defaults del stylesheet). */\nconst DARK_THEME: Record<string, string> = {\n  '--veo-bg': '#1f2937',\n  '--veo-text': '#f9fafb',\n  '--veo-text-secondary': '#d1d5db',\n  '--veo-shadow': '0 20px 60px rgba(0, 0, 0, 0.55)',\n};\n\nconst ALIGN_JUSTIFY: Record<string, string> = {\n  left: 'flex-start',\n  center: 'center',\n  right: 'flex-end',\n};\n\n/** `align-self` en el contenedor flex del step (para elementos tipo imagen). */\nconst ALIGN_SELF: Record<string, string> = {\n  left: 'flex-start',\n  center: 'center',\n  right: 'flex-end',\n};\n\n/** Elementos con estilo propio + qué usan para alinear (text-align vs align-self). */\nconst ELEMENT_ALIGN_MODE: Record<string, 'text' | 'self'> = {\n  title: 'text',\n  text: 'text',\n  image: 'self',\n};\n\n/** Presets de sombra → box-shadow. */\nconst SHADOW: Record<string, string> = {\n  none: 'none',\n  soft: '0 4px 14px rgba(0, 0, 0, 0.10)',\n  medium: '0 8px 30px rgba(0, 0, 0, 0.18)',\n  strong: '0 24px 60px rgba(0, 0, 0, 0.32)',\n};\n\n/** Presets de posición del modal → fracción [x, y] del overlay (0..1). */\nconst PRESET_POS: Record<string, [number, number]> = {\n  center: [0.5, 0.5],\n  top: [0.5, 0],\n  bottom: [0.5, 1],\n  left: [0, 0.5],\n  right: [1, 0.5],\n  'top-left': [0, 0],\n  'top-right': [1, 0],\n  'bottom-left': [0, 1],\n  'bottom-right': [1, 1],\n};\n\n/**\n * Acepta colores CSS razonables: hex (#rgb..#rrggbbaa), funcional\n * (rgb/rgba/hsl/hsla) o keyword simple. No interpola en CSS arbitrario:\n * el valor solo se usa como valor de una custom property.\n */\nexport const COLOR_RE = /^#[0-9a-f]{3,8}$|^(rgb|rgba|hsl|hsla)\\([\\d.,%/\\sdeg]+\\)$|^[a-z]{3,20}$/i;\n\nfunction clamp(n: number, min: number, max: number): number {\n  return Math.min(max, Math.max(min, n));\n}\n\n/**\n * Aplica las props de diseño de `step.style` como variables CSS sobre el\n * host del shadow root. No-op si no hay style. Idempotente.\n */\nexport function applyDesignVars(host: HTMLElement, style: GuideStep['style']): void {\n  if (!style || typeof style !== 'object') return;\n  const s = style as Record<string, unknown>;\n\n  if (typeof s.accentColor === 'string' && COLOR_RE.test(s.accentColor.trim())) {\n    host.style.setProperty('--veo-primary', s.accentColor.trim());\n  }\n\n  // Fuente (del design system del workspace). Sin `<>{}` para no romper el CSS.\n  if (\n    typeof s.fontFamily === 'string' &&\n    s.fontFamily.length <= 200 &&\n    !/[<>{}]/.test(s.fontFamily)\n  ) {\n    host.style.setProperty('--veo-font', s.fontFamily.trim());\n  }\n\n  if (s.theme === 'dark') {\n    for (const [key, value] of Object.entries(DARK_THEME)) {\n      host.style.setProperty(key, value);\n    }\n  }\n\n  // Colores del tema PERSONALIZADOS (design system): pisan el preset claro/oscuro.\n  if (typeof s.background === 'string' && COLOR_RE.test(s.background.trim())) {\n    host.style.setProperty('--veo-bg', s.background.trim());\n  }\n  if (typeof s.textColor === 'string' && COLOR_RE.test(s.textColor.trim())) {\n    host.style.setProperty('--veo-text', s.textColor.trim());\n  }\n  if (typeof s.textSecondaryColor === 'string' && COLOR_RE.test(s.textSecondaryColor.trim())) {\n    host.style.setProperty('--veo-text-secondary', s.textSecondaryColor.trim());\n  }\n\n  if (typeof s.radius === 'number' && Number.isFinite(s.radius)) {\n    host.style.setProperty('--veo-radius', `${clamp(s.radius, 0, 48)}px`);\n  }\n\n  if (typeof s.width === 'number' && Number.isFinite(s.width)) {\n    host.style.setProperty('--veo-width', `${clamp(s.width, 220, 720)}px`);\n  }\n\n  // Alto mínimo de la tarjeta (modal). min-height y no height: el contenido\n  // nunca se recorta. Lo setea el resize por arrastre del editor.\n  if (typeof s.height === 'number' && Number.isFinite(s.height)) {\n    host.style.setProperty('--veo-min-h', `${clamp(s.height, 120, 900)}px`);\n  }\n\n  if (s.align === 'left' || s.align === 'center' || s.align === 'right') {\n    host.style.setProperty('--veo-actions-justify', ALIGN_JUSTIFY[s.align] as string);\n  }\n\n  if (typeof s.padding === 'number' && Number.isFinite(s.padding)) {\n    host.style.setProperty('--veo-pad', `${clamp(s.padding, 0, 64)}px`);\n  }\n\n  if (typeof s.margin === 'number' && Number.isFinite(s.margin)) {\n    host.style.setProperty('--veo-margin', `${clamp(s.margin, 0, 64)}px`);\n  }\n\n  if (typeof s.borderWidth === 'number' && Number.isFinite(s.borderWidth)) {\n    host.style.setProperty('--veo-border-width', `${clamp(s.borderWidth, 0, 16)}px`);\n  }\n\n  if (typeof s.borderColor === 'string' && COLOR_RE.test(s.borderColor.trim())) {\n    host.style.setProperty('--veo-border-color', s.borderColor.trim());\n  }\n\n  if (typeof s.shadow === 'string' && SHADOW[s.shadow]) {\n    host.style.setProperty('--veo-shadow', SHADOW[s.shadow] as string);\n  }\n\n  // Posición del modal: libre (posX/posY en 0..1) tiene prioridad sobre el preset.\n  let px: number | undefined;\n  let py: number | undefined;\n  if (typeof s.posX === 'number' && typeof s.posY === 'number') {\n    px = clamp(s.posX, 0, 1);\n    py = clamp(s.posY, 0, 1);\n  } else if (typeof s.overlayPosition === 'string' && PRESET_POS[s.overlayPosition]) {\n    [px, py] = PRESET_POS[s.overlayPosition] as [number, number];\n  }\n  if (px !== undefined && py !== undefined) {\n    host.style.setProperty('--veo-pos-x', `${px * 100}%`);\n    host.style.setProperty('--veo-pos-y', `${py * 100}%`);\n  }\n\n  // Estilo POR ELEMENTO (title/text/image/cta): cada bloque puede sobrescribir\n  // alineación, color, tamaño y márgenes de forma independiente del step.\n  if (s.elements && typeof s.elements === 'object') {\n    const el = s.elements as Record<string, unknown>;\n    applyElementVars(host, 'title', el.title);\n    applyElementVars(host, 'text', el.text);\n    applyElementVars(host, 'image', el.image);\n    applyCtaVars(host, el.cta);\n  }\n}\n\n/**\n * Estilo del BOTÓN (cta): fondo (default = --veo-primary), color del texto,\n * tamaño, redondeo y alineación de la fila de acciones. Personalizable desde\n * el design system del workspace (\"Botones\") o por guía.\n */\nfunction applyCtaVars(host: HTMLElement, raw: unknown): void {\n  if (!raw || typeof raw !== 'object') return;\n  const cta = raw as Record<string, unknown>;\n  if (typeof cta.align === 'string' && ALIGN_JUSTIFY[cta.align]) {\n    host.style.setProperty('--veo-actions-justify', ALIGN_JUSTIFY[cta.align] as string);\n  }\n  if (typeof cta.background === 'string' && COLOR_RE.test(cta.background.trim())) {\n    host.style.setProperty('--veo-cta-bg', cta.background.trim());\n  }\n  if (typeof cta.color === 'string' && COLOR_RE.test(cta.color.trim())) {\n    host.style.setProperty('--veo-cta-color', cta.color.trim());\n  }\n  if (typeof cta.fontSize === 'number' && Number.isFinite(cta.fontSize)) {\n    host.style.setProperty('--veo-cta-size', `${clamp(cta.fontSize, 10, 24)}px`);\n  }\n  if (typeof cta.radius === 'number' && Number.isFinite(cta.radius)) {\n    host.style.setProperty('--veo-cta-radius', `${clamp(cta.radius, 0, 48)}px`);\n  }\n}\n\n/**\n * Emite las variables CSS de un elemento (`--veo-{prefix}-*`). Cada prop es\n * opcional y se valida; lo inválido se ignora y queda el default del stylesheet.\n */\nfunction applyElementVars(host: HTMLElement, prefix: string, raw: unknown): void {\n  if (!raw || typeof raw !== 'object') return;\n  const el = raw as Record<string, unknown>;\n\n  if (\n    typeof el.align === 'string' &&\n    (el.align === 'left' || el.align === 'center' || el.align === 'right')\n  ) {\n    const mode = ELEMENT_ALIGN_MODE[prefix] ?? 'text';\n    const value = mode === 'self' ? (ALIGN_SELF[el.align] as string) : el.align;\n    host.style.setProperty(`--veo-${prefix}-align`, value);\n  }\n  if (typeof el.color === 'string' && COLOR_RE.test(el.color.trim())) {\n    host.style.setProperty(`--veo-${prefix}-color`, el.color.trim());\n  }\n  if (typeof el.fontSize === 'number' && Number.isFinite(el.fontSize)) {\n    host.style.setProperty(`--veo-${prefix}-size`, `${clamp(el.fontSize, 8, 72)}px`);\n  }\n  if (typeof el.width === 'number' && Number.isFinite(el.width)) {\n    host.style.setProperty(`--veo-${prefix}-width`, `${clamp(el.width, 10, 100)}%`);\n  }\n  if (typeof el.radius === 'number' && Number.isFinite(el.radius)) {\n    host.style.setProperty(`--veo-${prefix}-radius`, `${clamp(el.radius, 0, 48)}px`);\n  }\n  if (typeof el.marginTop === 'number' && Number.isFinite(el.marginTop)) {\n    host.style.setProperty(`--veo-${prefix}-mt`, `${clamp(el.marginTop, 0, 64)}px`);\n  }\n  if (typeof el.marginBottom === 'number' && Number.isFinite(el.marginBottom)) {\n    host.style.setProperty(`--veo-${prefix}-mb`, `${clamp(el.marginBottom, 0, 64)}px`);\n  }\n}\n","import type { GuideStep } from './types';\n\n/** Dónde insertar la guía respecto al elemento ancla. Default `after`. */\nexport type InlinePosition = 'before' | 'after' | 'prepend' | 'append';\n\nexport function readInlinePosition(style: GuideStep['style']): InlinePosition {\n  const p = (style as Record<string, unknown> | null | undefined)?.inlinePosition;\n  return p === 'before' || p === 'prepend' || p === 'append' ? p : 'after';\n}\n\n/** Inserta el host en el flujo del DOM relativo al ancla. */\nexport function insertHost(anchor: Element, host: HTMLElement, position: InlinePosition): void {\n  switch (position) {\n    case 'before':\n      anchor.before(host);\n      break;\n    case 'after':\n      anchor.after(host);\n      break;\n    case 'prepend':\n      anchor.prepend(host);\n      break;\n    case 'append':\n      anchor.append(host);\n      break;\n  }\n}\n\n/**\n * Mantiene el host PEGADO al DOM. Los frameworks del host (React/Next)\n * reconcilian sus contenedores al hidratar/re-renderizar y BORRAN nodos que\n * no reconocen — la guía inline aparecía durante la carga y desaparecía al\n * montar el contenido real. Chequea cada 1s: si el host quedó desconectado,\n * re-busca el ancla y se re-inserta. Devuelve el stop() (registrarlo como\n * cleanup del renderer para que el dismiss/destroy lo corte).\n */\nexport function keepHostAttached(\n  host: HTMLElement,\n  selector: string,\n  position: InlinePosition,\n): () => void {\n  const id = window.setInterval(() => {\n    if (host.isConnected) return;\n    const anchor = document.querySelector(selector);\n    if (anchor) insertHost(anchor, host, position);\n  }, 1000);\n  return () => window.clearInterval(id);\n}\n","import { DEFAULT_ANCHOR_WAIT_MS } from './constants';\n\n/**\n * Resuelve un selector CSS de forma robusta para SPAs: chequea inmediato\n * y, si no existe, observa el DOM con MutationObserver hasta `timeoutMs`.\n * Devuelve `null` si no apareció antes del timeout.\n *\n * Esta función nunca lanza. Si el selector es inválido devuelve `null`\n * silenciosamente — un selector roto en la DB no debe romper la app.\n */\nexport function waitForElement(\n  selector: string,\n  timeoutMs: number = DEFAULT_ANCHOR_WAIT_MS,\n): Promise<Element | null> {\n  return new Promise((resolve) => {\n    const safeQuery = (): Element | null => {\n      try {\n        return document.querySelector(selector);\n      } catch {\n        return null;\n      }\n    };\n\n    const existing = safeQuery();\n    if (existing) {\n      resolve(existing);\n      return;\n    }\n\n    let resolved = false;\n    const finish = (el: Element | null) => {\n      if (resolved) return;\n      resolved = true;\n      observer.disconnect();\n      clearTimeout(timer);\n      resolve(el);\n    };\n\n    const observer = new MutationObserver(() => {\n      const el = safeQuery();\n      if (el) finish(el);\n    });\n\n    observer.observe(document.body, { childList: true, subtree: true });\n\n    const timer = setTimeout(() => finish(null), timeoutMs);\n  });\n}\n","import { GUIDE_Z_INDEX } from './constants';\n\n/**\n * CSS inyectado en cada shadow DOM. Como `:host { all: initial }` rompe\n * con la herencia del host, todos los estilos viven aquí. Las variables\n * CSS (`--veo-*`) son los puntos de extensión para tematización futura.\n */\nexport const GUIDE_STYLES = `\n:host {\n  --veo-primary: #FF5B35;\n  --veo-text: #1f2937;\n  --veo-text-secondary: #4b5563;\n  --veo-bg: #ffffff;\n  --veo-radius: 12px;\n  --veo-shadow: 0 20px 60px rgba(0, 0, 0, 0.25);\n  --veo-width: 420px;\n  --veo-actions-justify: flex-end;\n  all: initial;\n}\n* { box-sizing: border-box; font-family: var(--veo-font, -apple-system, system-ui, \"Segoe UI\", Roboto, sans-serif); }\n\n.veo-modal-overlay {\n  position: fixed; inset: 0;\n  background: rgba(15, 15, 30, 0.45);\n  z-index: ${GUIDE_Z_INDEX};\n  animation: veo-fade-in 180ms ease-out;\n}\n/* Sin backdrop (style.backdrop === false): la app queda usable detrás; solo la\n   tarjeta captura el mouse. El click-en-backdrop deja de cerrar (no hay backdrop). */\n.veo-modal-overlay--none {\n  background: transparent;\n  pointer-events: none;\n}\n.veo-modal-overlay--none .veo-modal-card { pointer-events: auto; }\n/*\n * Posición libre/preset: --veo-pos-x/y son porcentajes (default 50% = centro).\n * El truco translate(-pos) alinea la MISMA fracción de la tarjeta con esa\n * fracción del overlay, así la tarjeta nunca se sale (0% = pegada izquierda,\n * 100% = pegada derecha, 50% = centrada) sea cual sea su ancho.\n */\n.veo-modal-card {\n  position: absolute;\n  left: var(--veo-pos-x, 50%);\n  top: var(--veo-pos-y, 50%);\n  transform: translate(calc(var(--veo-pos-x, 50%) * -1), calc(var(--veo-pos-y, 50%) * -1));\n  background: var(--veo-bg);\n  border-radius: var(--veo-radius);\n  border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n  padding: var(--veo-pad, 24px);\n  max-width: var(--veo-width); width: 90%;\n  min-height: var(--veo-min-h, auto);\n  box-shadow: var(--veo-shadow);\n  animation: veo-fade-in 180ms ease-out;\n}\n\n.veo-banner {\n  position: fixed; left: 0; right: 0;\n  background: var(--veo-bg);\n  border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n  padding: var(--veo-pad, 16px);\n  z-index: ${GUIDE_Z_INDEX};\n  box-shadow: var(--veo-shadow, 0 2px 12px rgba(0, 0, 0, 0.12));\n  animation: veo-slide-down 200ms ease-out;\n}\n.veo-banner-top { top: 0; }\n.veo-banner-bottom { bottom: 0; }\n/* Banner EMBEBIDO en un contenedor (step.selector): fluye dentro del contenedor\n   y empuja su contenido, en vez de flotar fijo sobre la pantalla. */\n.veo-banner-embedded {\n  position: static;\n  left: auto; right: auto;\n  width: 100%;\n  border-radius: var(--veo-radius, 0);\n}\n\n.veo-tooltip {\n  position: absolute;\n  background: var(--veo-bg);\n  border-radius: var(--veo-radius);\n  border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n  padding: var(--veo-pad, 15px);\n  max-width: 300px;\n  z-index: ${GUIDE_Z_INDEX};\n  box-shadow: var(--veo-shadow, 0 8px 30px rgba(0, 0, 0, 0.18));\n  animation: veo-fade-in 150ms ease-out;\n}\n.veo-tooltip-arrow {\n  position: absolute;\n  width: 12px;\n  height: 12px;\n  background: var(--veo-bg);\n  border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n  transform: rotate(45deg);\n  pointer-events: none;\n}\n\n.veo-inline {\n  background: var(--veo-bg);\n  border-radius: var(--veo-radius);\n  border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n  padding: var(--veo-pad, 20px);\n  max-width: var(--veo-width);\n  margin: var(--veo-margin, 12px) 0;\n  position: relative;\n  box-shadow: var(--veo-shadow);\n  animation: veo-fade-in 160ms ease-out;\n}\n\n/* ── Modelo unificado (composite) ── */\n.veo-composite-overlay {\n  position: fixed; inset: 0;\n  z-index: ${GUIDE_Z_INDEX};\n  pointer-events: none;\n}\n/* Backdrop atenuado (cualquier posición flotante con backdrop activo). */\n.veo-composite-overlay--dim {\n  background: rgba(0, 0, 0, 0.5);\n  pointer-events: auto;\n}\n.veo-composite-anchored {\n  position: fixed;\n  z-index: ${GUIDE_Z_INDEX};\n}\n/* Card genérica del modelo unificado. El diseño (bg/borde/padding/…) lo aplica\n   el renderer como estilos inline desde step.design; acá van los defaults. */\n.veo-card {\n  pointer-events: auto;\n  background: var(--veo-bg, #ffffff);\n  color: var(--veo-text, #1f2937);\n  border-radius: var(--veo-radius, 12px);\n  padding: 20px;\n  max-width: 90vw;\n  box-shadow: var(--veo-shadow, 0 12px 40px rgba(0, 0, 0, 0.18));\n  animation: veo-fade-in 160ms ease-out;\n}\n.veo-composite-anchored .veo-card, .veo-composite-overlay .veo-card { position: relative; }\n\n.veo-guide-content {\n  position: relative;\n  display: flex; flex-direction: column;\n}\n/* Reserva espacio para la ✕ (esquina sup. derecha) SOLO en el primer bloque:\n   así el texto alineado a la derecha no queda tapado por el botón de cerrar. */\n.veo-guide-content > .veo-guide-title:first-child,\n.veo-guide-content > .veo-guide-text:first-child {\n  padding-right: 20px;\n}\n.veo-guide-image {\n  display: block;\n  width: var(--veo-image-width, 100%);\n  max-height: 180px;\n  object-fit: cover;\n  align-self: var(--veo-image-align, stretch);\n  border-radius: var(--veo-image-radius, 8px);\n  margin: var(--veo-image-mt, 0) 0 var(--veo-image-mb, 12px);\n}\n/* Imagen A SANGRE: rompe el padding de la tarjeta y ocupa el ancho completo\n   (hero estilo anuncio). Como primer bloque, hereda el redondeo superior. */\n.veo-guide-image--bleed {\n  width: calc(100% + var(--veo-pad, 24px) * 2);\n  max-width: none;\n  max-height: 280px;\n  align-self: auto;\n  border-radius: 0;\n  margin: 0 calc(var(--veo-pad, 24px) * -1) 12px;\n}\n.veo-guide-content > .veo-guide-image--bleed:first-child {\n  margin-top: calc(var(--veo-pad, 24px) * -1);\n  border-radius: calc(var(--veo-radius, 12px) - var(--veo-border-width, 0px))\n    calc(var(--veo-radius, 12px) - var(--veo-border-width, 0px)) 0 0;\n}\n.veo-guide-title {\n  font-size: var(--veo-title-size, 18px); font-weight: 600; line-height: 1.3;\n  text-align: var(--veo-title-align, left);\n  margin: var(--veo-title-mt, 0) 0 var(--veo-title-mb, 6px);\n  color: var(--veo-title-color, var(--veo-text));\n}\n.veo-guide-text {\n  font-size: var(--veo-text-size, 14px); line-height: 1.5;\n  text-align: var(--veo-text-align, left);\n  margin: var(--veo-text-mt, 0) 0 var(--veo-text-mb, 16px);\n  color: var(--veo-text-color, var(--veo-text-secondary));\n}\n/* Rich text dentro de un bloque de texto (p/listas/links/énfasis). */\n.veo-guide-text p { margin: 0 0 8px; }\n.veo-guide-text p:last-child { margin-bottom: 0; }\n.veo-guide-text ul, .veo-guide-text ol { margin: 0 0 8px; padding-left: 20px; }\n.veo-guide-text ul { list-style: disc; }\n.veo-guide-text ol { list-style: decimal; }\n.veo-guide-text li { margin: 2px 0; display: list-item; }\n.veo-guide-text a { color: var(--veo-primary); text-decoration: underline; cursor: pointer; }\n.veo-guide-text strong { font-weight: 600; }\n.veo-guide-text em { font-style: italic; }\n.veo-guide-text u { text-decoration: underline; }\n.veo-guide-text s { text-decoration: line-through; }\n/*\n * El ÚLTIMO bloque de contenido no deja su margin-bottom colgando: ese margen\n * existe para separar del bloque SIGUIENTE, y sin siguiente se suma al padding\n * de la tarjeta y parece un \"hueco fantasma\" (p.ej. quitar el botón de un\n * tooltip dejaba el espacio como si siguiera ahí). El penúltimo hijo es el\n * último bloque real (el ✕ de cerrar siempre va último y es absoluto). La\n * mayor especificidad le gana a las reglas por clase, pero NO a un margen\n * inline elegido explícitamente por el autor (block.style.marginBottom).\n */\n.veo-guide-content > :nth-last-child(2) {\n  margin-bottom: 0;\n}\n.veo-guide-actions {\n  display: flex; gap: 8px; justify-content: var(--veo-actions-justify);\n}\n.veo-guide-cta {\n  background: var(--veo-cta-bg, var(--veo-primary));\n  color: var(--veo-cta-color, #fff); border: none;\n  padding: 9px 18px; border-radius: var(--veo-cta-radius, 8px);\n  font-size: var(--veo-cta-size, 14px); font-weight: 500; cursor: pointer;\n  transition: opacity 120ms ease;\n}\n.veo-guide-cta:hover { opacity: 0.9; }\n.veo-guide-cta:active { transform: translateY(1px); }\n.veo-guide-close {\n  position: absolute; top: -6px; right: -6px;\n  width: 24px; height: 24px;\n  background: none; border: none;\n  font-size: 22px; line-height: 1;\n  cursor: pointer; color: #9ca3af; padding: 0;\n}\n.veo-guide-close:hover { color: var(--veo-text); }\n/*\n * Si el PRIMER bloque es una imagen, la ✕ quedaría sobre la esquina de la foto\n * (invisible según el color). En ese caso pasa a ser una pastilla flotante con\n * fondo propio, legible sobre cualquier imagen. (Sin soporte de :has() queda el\n * estilo base — mismo comportamiento de antes, sin regresión.)\n */\n.veo-guide-content:has(> .veo-guide-image:first-child) > .veo-guide-close {\n  top: 2px; right: 2px;\n  display: flex; align-items: center; justify-content: center;\n  font-size: 16px; color: #374151;\n  background: rgba(255, 255, 255, 0.92);\n  border: 1px solid rgba(0, 0, 0, 0.08);\n  border-radius: 50%;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.18);\n}\n.veo-guide-content:has(> .veo-guide-image:first-child) > .veo-guide-close:hover {\n  color: #111827;\n}\n\n.veo-form { display: flex; flex-direction: column; gap: 14px; margin-bottom: 16px; }\n.veo-form-field { display: flex; flex-direction: column; gap: 6px; }\n.veo-form-label { font-size: 13px; font-weight: 500; color: var(--veo-text); }\n.veo-form-input {\n  font-size: 14px; color: var(--veo-text);\n  background: var(--veo-bg);\n  border: 1px solid #d1d5db; border-radius: 8px;\n  padding: 8px 10px; width: 100%;\n}\n.veo-form-input:focus { outline: 2px solid var(--veo-primary); outline-offset: -1px; border-color: transparent; }\n.veo-form-options { display: flex; flex-direction: column; gap: 6px; }\n.veo-form-option {\n  display: flex; align-items: center; gap: 8px;\n  font-size: 14px; color: var(--veo-text); cursor: pointer;\n}\n.veo-form-option input { accent-color: var(--veo-primary); margin: 0; cursor: pointer; }\n.veo-form-scale { display: flex; gap: 4px; flex-wrap: wrap; }\n.veo-nps-btn {\n  min-width: 30px; height: 30px; padding: 0 4px;\n  font-size: 13px; font-weight: 500; color: var(--veo-text);\n  background: var(--veo-bg); border: 1px solid #d1d5db; border-radius: 6px;\n  cursor: pointer; transition: all 100ms ease;\n}\n.veo-nps-btn:hover { border-color: var(--veo-primary); }\n.veo-rating-btn {\n  background: none; border: none; padding: 0 2px;\n  font-size: 26px; line-height: 1; color: #d1d5db;\n  cursor: pointer; transition: color 100ms ease;\n}\n.veo-scale-active.veo-nps-btn { background: var(--veo-primary); color: #fff; border-color: var(--veo-primary); }\n.veo-scale-active.veo-rating-btn { color: #f59e0b; }\n.veo-form-error { font-size: 13px; color: #dc2626; margin: 0; }\n.veo-form-thanks {\n  text-align: center; padding: 24px 8px;\n  font-size: 16px; font-weight: 600; color: var(--veo-text);\n}\n.veo-form-preview-note {\n  text-align: center; margin: 0 0 12px;\n  font-size: 12px; color: #b45309;\n}\n\n.veo-walkthrough {\n  position: absolute;\n  background: var(--veo-bg);\n  border-radius: var(--veo-radius);\n  border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n  padding: var(--veo-pad, 16px);\n  max-width: 340px;\n  z-index: ${GUIDE_Z_INDEX};\n  box-shadow: var(--veo-shadow, 0 8px 30px rgba(0, 0, 0, 0.2));\n  animation: veo-fade-in 150ms ease-out;\n}\n.veo-walkthrough-arrow {\n  position: absolute;\n  width: 12px;\n  height: 12px;\n  background: var(--veo-bg);\n  transform: rotate(45deg);\n  pointer-events: none;\n}\n.veo-walkthrough-counter {\n  font-size: 11px; color: #9ca3af;\n  margin-bottom: 8px; letter-spacing: 0.02em;\n}\n.veo-walkthrough-progress {\n  display: flex; gap: 4px;\n  margin-bottom: 12px;\n}\n.veo-walkthrough-progress-dot {\n  width: 8px; height: 8px;\n  border-radius: 50%;\n  background: #e5e7eb;\n  transition: background 200ms ease;\n}\n.veo-walkthrough-progress-dot.active { background: var(--veo-primary); }\n.veo-walkthrough-progress-dot.completed { background: var(--veo-primary); opacity: 0.5; }\n.veo-walkthrough-actions {\n  display: flex; align-items: center;\n  margin-top: 16px; gap: 8px;\n}\n.veo-walkthrough-actions-right {\n  display: flex; gap: 8px;\n  margin-left: auto;\n}\n.veo-walkthrough-btn-secondary {\n  background: transparent; color: #6b7280;\n  border: 1px solid #e5e7eb;\n  padding: 8px 16px; border-radius: 8px;\n  font-size: 13px; cursor: pointer;\n  transition: background 120ms ease;\n}\n.veo-walkthrough-btn-secondary:hover { background: #f9fafb; }\n.veo-walkthrough-skip {\n  background: transparent; color: #9ca3af;\n  border: none; padding: 4px 8px;\n  font-size: 12px; cursor: pointer;\n}\n.veo-walkthrough-skip:hover { color: var(--veo-text); }\n\n/* ── Badge (elemento inyectado junto al ancla que abre un tooltip) ── */\n.veo-badge {\n  display: inline-flex; align-items: center; justify-content: center;\n  border: none; padding: 0; margin: 0 4px;\n  background: none; cursor: pointer;\n  line-height: 1; vertical-align: middle;\n  font-family: inherit;\n}\n.veo-badge:focus-visible { outline: 2px solid var(--veo-primary); outline-offset: 2px; }\n.veo-badge--icon {\n  border-radius: 50%;\n  background: color-mix(in srgb, var(--veo-primary) 14%, transparent);\n  color: var(--veo-primary);\n  font-weight: 600;\n}\n.veo-badge--dot {\n  border-radius: 50%;\n  background: var(--veo-primary);\n  animation: veo-badge-pulse 2s ease-out infinite;\n}\n.veo-badge--pill {\n  border-radius: 999px;\n  background: var(--veo-primary);\n  color: #fff;\n  font-weight: 600;\n  padding: 3px 9px;\n  white-space: nowrap;\n}\n.veo-badge--text {\n  color: var(--veo-primary);\n  font-weight: 600;\n  white-space: nowrap;\n  text-decoration: underline dotted;\n  text-underline-offset: 3px;\n}\n.veo-badge--image img { display: block; border-radius: 4px; object-fit: cover; }\n/* El tooltip del badge usa strategy fixed (el host vive dentro del flujo del\n   cliente; un absoluto se recortaría con overflow de ancestros). Su ancho es\n   personalizable vía var dedicada (--veo-width no sirve: el :host la define\n   en 420px siempre y pisaría el default de 300px de los tooltips). */\n.veo-badge-tooltip {\n  position: fixed;\n  max-width: var(--veo-badge-tip-width, 300px);\n}\n@keyframes veo-badge-pulse {\n  0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--veo-primary) 45%, transparent); }\n  70% { box-shadow: 0 0 0 7px transparent; }\n  100% { box-shadow: 0 0 0 0 transparent; }\n}\n\n.veo-custom-floating {\n  position: fixed;\n  z-index: ${GUIDE_Z_INDEX};\n  max-width: calc(100vw - 16px);\n  max-height: calc(100vh - 16px);\n  animation: veo-fade-in 160ms ease;\n}\n.veo-custom-anchored {\n  position: fixed;\n  top: 0; left: 0;\n  z-index: ${GUIDE_Z_INDEX};\n  max-width: calc(100vw - 16px);\n  animation: veo-fade-in 160ms ease;\n}\n.veo-custom-inline {\n  display: block;\n  position: relative;\n  margin: 12px 0;\n}\n.veo-custom-frame {\n  display: block;\n  border: 0;\n  width: 360px;\n  background: transparent;\n  color-scheme: normal;\n}\n\n@keyframes veo-fade-in { from { opacity: 0; } to { opacity: 1; } }\n@keyframes veo-slide-up {\n  from { transform: translateY(10px); opacity: 0; }\n  to { transform: translateY(0); opacity: 1; }\n}\n@keyframes veo-slide-down {\n  from { transform: translateY(-10px); opacity: 0; }\n  to { transform: translateY(0); opacity: 1; }\n}\n`;\n","import { GUIDE_HOST_ATTR } from '../constants';\nimport { applyDesignVars } from '../guide-design';\nimport { GUIDE_STYLES } from '../styles';\nimport type { GuideRenderContext, GuideStep } from '../types';\n\n/**\n * Base de los renderers de guías. Encapsula:\n *   - creación del host con Shadow DOM (aislamiento de estilos)\n *   - inyección del CSS común\n *   - limpieza del DOM y de listeners en `destroy()`\n *\n * Cada subclase implementa `render(context)`. La subclase puede registrar\n * cleanup adicional con `registerCleanup` para que se ejecute en destroy.\n *\n * Tipos genéricos:\n *   - `TContext` (default `GuideRenderContext`): el shape que recibe la\n *     subclase. WalkthroughRenderer usa uno propio con step + callbacks.\n *   - `TResult` (default `void`): lo que `render` devuelve. El walkthrough\n *     usa `boolean` para señalar éxito al controller cuando el ancla no\n *     aparece. El resto sigue devolviendo `void`/`Promise<void>`.\n */\nexport abstract class BaseRenderer<TContext = GuideRenderContext, TResult = void> {\n  protected host: HTMLElement | null = null;\n  protected shadow: ShadowRoot | null = null;\n  private cleanups: Array<() => void> = [];\n\n  // ── Update in-place (preview en vivo del editor) ──\n  // La subclase setea estas piezas en render() para habilitarlo: el contenedor\n  // del contenido, el nodo de contenido actual y cómo reconstruirlo.\n  protected liveContainer: HTMLElement | null = null;\n  protected liveContent: HTMLElement | null = null;\n  protected liveBuild: ((step: GuideStep) => HTMLElement) | null = null;\n  /** Clave de anclaje/estructura fijada en render(); si cambia → remontar. */\n  protected liveKey = '';\n\n  /** Clave de anclaje derivada del step (override por subclase). */\n  protected liveKeyOf(_step: GuideStep): string {\n    return '';\n  }\n\n  /** Hook post-swap (reposicionar tooltip, actualizar clase del banner…). */\n  protected onLiveUpdate(_step: GuideStep): void {}\n\n  /**\n   * Actualiza el contenido del step SIN remontar el host — así el preview del\n   * editor no parpadea en cada tecla. Devuelve `false` cuando el renderer no\n   * lo soporta o el cambio requiere remontar (cambió el ancla/estructura);\n   * en ese caso el caller hace el re-render completo.\n   */\n  updateStep(step: GuideStep): boolean {\n    if (!this.host || !this.liveContainer || !this.liveContent || !this.liveBuild) return false;\n    if (this.liveKeyOf(step) !== this.liveKey) return false;\n    const next = this.liveBuild(step);\n    this.liveContainer.replaceChild(next, this.liveContent);\n    this.liveContent = next;\n    this.applyDesign(step.style);\n    this.onLiveUpdate(step);\n    return true;\n  }\n\n  /**\n   * Crea un `<div data-veo-guide>` adjunto a `document.body`, le adjunta\n   * un ShadowRoot abierto e inyecta los estilos. Retorna el nodo raíz\n   * donde la subclase puede insertar el contenido específico.\n   */\n  protected createHost(): { host: HTMLElement; shadow: ShadowRoot; root: HTMLElement } {\n    const host = document.createElement('div');\n    host.setAttribute(GUIDE_HOST_ATTR, '');\n    const shadow = host.attachShadow({ mode: 'open' });\n\n    const style = document.createElement('style');\n    style.textContent = GUIDE_STYLES;\n    shadow.appendChild(style);\n\n    const root = document.createElement('div');\n    shadow.appendChild(root);\n\n    document.body.appendChild(host);\n\n    this.host = host;\n    this.shadow = shadow;\n    return { host, shadow, root };\n  }\n\n  /**\n   * Aplica la tematización por datos del step (`step.style`) como variables\n   * CSS sobre el host. Llamar tras `createHost()`. No-op si no hay host o\n   * style. Ver `guide-design.ts`.\n   */\n  protected applyDesign(style: GuideStep['style']): void {\n    if (this.host) applyDesignVars(this.host, style);\n  }\n\n  /**\n   * Registra una función a ejecutar en `destroy()`. Útil para limpiar\n   * listeners globales (scroll, resize) o intervalos.\n   */\n  protected registerCleanup(fn: () => void): void {\n    this.cleanups.push(fn);\n  }\n\n  /**\n   * Host de la guía montada (o `null` si aún no se montó / ya se destruyó).\n   * Lo usa el modo builder para adjuntar manipulación directa (drag/resize)\n   * sobre el shadow root abierto sin tocar los renderers.\n   */\n  hostElement(): HTMLElement | null {\n    return this.host;\n  }\n\n  /** Remueve el host del DOM y corre todas las funciones de cleanup. */\n  destroy(): void {\n    for (const fn of this.cleanups) {\n      try {\n        fn();\n      } catch {\n        // No propagar: un cleanup roto no debe romper el resto.\n      }\n    }\n    this.cleanups = [];\n\n    if (this.host?.parentNode) {\n      this.host.parentNode.removeChild(this.host);\n    }\n    this.host = null;\n    this.shadow = null;\n  }\n\n  abstract render(context: TContext): TResult | Promise<TResult>;\n}\n","/**\n * Posicionamiento del caret (flecha) que apunta al elemento anclado, compartido\n * por el tooltip y el walkthrough. Floating UI (middleware `arrow`) da el\n * desplazamiento a lo largo del borde; aquí lo aplicamos y \"pegamos\" el caret al\n * lado del tooltip enfrentado al ancla.\n */\n\n/** Lado del tooltip donde se \"pega\" el caret, opuesto al placement resuelto. */\nconst STATIC_SIDE: Record<string, 'top' | 'bottom' | 'left' | 'right'> = {\n  top: 'bottom',\n  bottom: 'top',\n  left: 'right',\n  right: 'left',\n};\n\n/**\n * Ubica el caret sobre el borde del tooltip enfrentado al ancla. Floating UI\n * da el desplazamiento a lo largo del borde (`x` o `y`); el otro eje se fija a\n * `-6px` (mitad del caret) para que sobresalga.\n */\nexport function positionArrow(\n  arrowEl: HTMLElement,\n  placement: string,\n  data: { x?: number; y?: number } | undefined,\n): void {\n  const side = STATIC_SIDE[placement.split('-')[0] ?? 'bottom'] ?? 'top';\n  for (const prop of ['top', 'bottom', 'left', 'right'] as const) {\n    arrowEl.style.setProperty(prop, '');\n  }\n  if (data?.x != null) arrowEl.style.setProperty('left', `${data.x}px`);\n  if (data?.y != null) arrowEl.style.setProperty('top', `${data.y}px`);\n  arrowEl.style.setProperty(side, '-6px');\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { buildStepContent, isSafeUrl } from '../block-builder';\nimport { COLOR_RE } from '../guide-design';\nimport { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type {\n  BadgeConfig,\n  BadgeTrigger,\n  GuideInteractionMetadata,\n  GuideRenderContext,\n  GuideStep,\n} from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { positionArrow } from './floating-arrow';\n\n/** Retardo de gracia del hover: permite mover el mouse del badge al tooltip. */\nconst HOVER_CLOSE_DELAY_MS = 150;\n\n/**\n * Renderiza una guía tipo `badge` (estilo Pendo): un elemento CHICO —\n * icono/punto/cápsula/imagen — inyectado EN EL FLUJO del DOM junto al ancla\n * (`step.selector` + `style.inlinePosition`), que al hover o click\n * (`style.badgeTrigger`) abre un tooltip con el contenido del paso.\n *\n * Composición (no herencia): reusa `insertHost`/`keepHostAttached` del inline\n * (watchdog contra re-renders de React), `buildStepContent` (bloques) y el\n * posicionamiento Floating UI + caret del tooltip — con `strategy: 'fixed'`\n * porque el host vive DENTRO del flujo del cliente y un ancestro con\n * `overflow: hidden` recortaría un tooltip absoluto.\n *\n * EL BADGE ES PERMANENTE (como en Pendo): nada de lo que haga el usuario lo\n * quita — lo único que se abre y se cierra es el TOOLTIP. La ✕ del tooltip, el\n * hover-out, el click afuera, Esc y los CTA solo cierran el tooltip; el badge\n * queda para volver a consultarlo cuando quiera. Por eso el badge nunca emite\n * `dismissed` (no hay forma de descartarlo) y su frecuencia natural es `always`.\n *\n * Analytics (deliberado):\n *   - `shown` la PRIMERA vez que se ABRE el tooltip (no al inyectar el badge):\n *     mide cuánta gente abrió la ayuda, no en cuántas páginas existía el icono.\n *   - `cta_clicked` en los botones del tooltip (con buttonId si lo tienen).\n */\nexport class BadgeRenderer extends BaseRenderer {\n  private tooltip: HTMLElement | null = null;\n  private arrowEl: HTMLElement | null = null;\n  private badgeBtn: HTMLButtonElement | null = null;\n  private open = false;\n  private shownEmitted = false;\n  private trigger: BadgeTrigger = 'hover';\n  private side: 'top' | 'bottom' | 'left' | 'right' = 'top';\n  private closeTimer: number | null = null;\n  private stopFloat: (() => void) | null = null;\n\n  async render(context: GuideRenderContext): Promise<void> {\n    const step = context.guide.guideSteps[0];\n    if (!step) return;\n\n    const selector = step.selector ?? context.guide.activationRules.selector;\n    if (typeof selector !== 'string' || selector.length === 0) return;\n\n    const anchor = await waitForElement(selector);\n    if (!anchor) return;\n\n    const { host, root } = this.createHost();\n    const ownerDocument = root.ownerDocument ?? document;\n    this.applyDesign(step.style);\n    // Ancho del tooltip personalizable (slider «Ancho» del editor). Var\n    // dedicada: --veo-width no distingue \"no seteado\" (el :host la define).\n    const tipWidth = step.style?.width;\n    if (typeof tipWidth === 'number' && Number.isFinite(tipWidth)) {\n      host.style.setProperty(\n        '--veo-badge-tip-width',\n        `${Math.min(720, Math.max(220, tipWidth))}px`,\n      );\n    }\n    this.trigger = step.style?.badgeTrigger === 'click' ? 'click' : 'hover';\n    const rawSide = step.style?.tooltipPlacement;\n    this.side = rawSide === 'bottom' || rawSide === 'left' || rawSide === 'right' ? rawSide : 'top';\n\n    // ── Badge en el flujo del DOM, pegado al ancla ──\n    const position = readInlinePosition(step.style);\n    host.style.display = 'inline-flex';\n    host.style.verticalAlign = 'middle';\n    const badge = buildBadgeElement(readBadgeConfig(step), ownerDocument);\n    root.appendChild(badge);\n    this.badgeBtn = badge;\n    insertHost(anchor, host, position);\n    this.registerCleanup(keepHostAttached(host, selector, position));\n\n    // ── Tooltip (cerrado hasta el trigger) ──\n    const tooltip = ownerDocument.createElement('div');\n    tooltip.className = 'veo-tooltip veo-badge-tooltip';\n    tooltip.style.display = 'none';\n\n    const emit = (action: 'shown' | 'cta_clicked', meta?: GuideInteractionMetadata): void => {\n      context.onInteraction({\n        guideId: context.guide.guideId,\n        stepIndex: 0,\n        action,\n        ...(meta ? { metadata: meta } : {}),\n      });\n    };\n\n    const buildTooltipContent = (s: GuideStep): HTMLElement =>\n      buildStepContent(s, ownerDocument, {\n        onCtaClick: (action, target, meta) => {\n          emit('cta_clicked', meta);\n          if (action === 'url' && target) window.open(target, '_blank', 'noopener,noreferrer');\n          // TODO cierra solo el TOOLTIP — el badge es permanente.\n          this.closeTooltip();\n          // Encadenado: además abre la otra guía.\n          if (action === 'guide' && target) context.onOpenGuide?.(target);\n        },\n        // La ✕ también cierra solo el tooltip (nunca el badge, nunca dismissed).\n        onDismiss: () => this.closeTooltip(),\n      });\n\n    const content = buildTooltipContent(step);\n    tooltip.appendChild(content);\n\n    const arrowEl = ownerDocument.createElement('div');\n    arrowEl.className = 'veo-tooltip-arrow';\n    tooltip.appendChild(arrowEl);\n    root.appendChild(tooltip);\n    this.tooltip = tooltip;\n    this.arrowEl = arrowEl;\n\n    // Update in-place (preview del editor).\n    this.liveContainer = tooltip;\n    this.liveContent = content;\n    this.liveKey = this.liveKeyOf(step);\n    this.liveBuild = buildTooltipContent;\n\n    // ── Trigger ──\n    const openNow = (): void => {\n      this.cancelClose();\n      if (!this.open) {\n        this.openTooltip(badge);\n        if (!this.shownEmitted) {\n          this.shownEmitted = true;\n          emit('shown');\n        }\n      }\n    };\n    if (this.trigger === 'hover') {\n      const scheduleClose = (): void => {\n        this.cancelClose();\n        this.closeTimer = window.setTimeout(() => this.closeTooltip(), HOVER_CLOSE_DELAY_MS);\n      };\n      badge.addEventListener('mouseenter', openNow);\n      badge.addEventListener('focus', openNow);\n      badge.addEventListener('mouseleave', scheduleClose);\n      badge.addEventListener('blur', scheduleClose);\n      tooltip.addEventListener('mouseenter', () => this.cancelClose());\n      tooltip.addEventListener('mouseleave', scheduleClose);\n    } else {\n      badge.addEventListener('click', () => {\n        if (this.open) this.closeTooltip();\n        else openNow();\n      });\n      const onDocClick = (e: MouseEvent): void => {\n        if (!this.open) return;\n        // El shadow host encapsula badge y tooltip: un click cuyo path no pasa\n        // por el host es \"afuera\".\n        if (e.composedPath().includes(host)) return;\n        this.closeTooltip();\n      };\n      document.addEventListener('click', onDocClick, true);\n      this.registerCleanup(() => document.removeEventListener('click', onDocClick, true));\n    }\n    const onKey = (e: KeyboardEvent): void => {\n      if (e.key === 'Escape' && this.open) this.closeTooltip();\n    };\n    document.addEventListener('keydown', onKey);\n    this.registerCleanup(() => document.removeEventListener('keydown', onKey));\n\n    // En el editor, el autor edita el CONTENIDO del tooltip: abrirlo de entrada\n    // (si no, se edita a ciegas). No emite shown (isPreview no trackea igual).\n    if (context.isPreview) openNow();\n  }\n\n  /** Cambiar de ancla/posición/trigger requiere re-montar y re-cablear. */\n  protected override liveKeyOf(step: GuideStep): string {\n    const selector = step.selector ?? '';\n    const position = readInlinePosition(step.style);\n    const trigger = step.style?.badgeTrigger === 'click' ? 'click' : 'hover';\n    return `${selector}|${position}|${trigger}`;\n  }\n\n  protected override onLiveUpdate(step: GuideStep): void {\n    // Re-pintar el badge (kind/color/size) y reposicionar si está abierto.\n    if (this.badgeBtn) {\n      const doc = this.badgeBtn.ownerDocument;\n      const next = buildBadgeElement(readBadgeConfig(step), doc);\n      // Conservar listeners del botón: solo se actualiza el interior + clases.\n      this.badgeBtn.className = next.className;\n      this.badgeBtn.setAttribute('style', next.getAttribute('style') ?? '');\n      this.badgeBtn.replaceChildren(...Array.from(next.childNodes));\n    }\n    const rawSide = step.style?.tooltipPlacement;\n    this.side = rawSide === 'bottom' || rawSide === 'left' || rawSide === 'right' ? rawSide : 'top';\n    if (this.open && this.badgeBtn) this.position(this.badgeBtn);\n  }\n\n  override destroy(): void {\n    this.cancelClose();\n    this.stopFloat?.();\n    this.stopFloat = null;\n    this.tooltip = null;\n    this.arrowEl = null;\n    this.badgeBtn = null;\n    this.open = false;\n    super.destroy();\n  }\n\n  private openTooltip(badge: HTMLElement): void {\n    if (!this.tooltip) return;\n    this.tooltip.style.display = 'block';\n    this.open = true;\n    void this.position(badge);\n    const reposition = (): void => {\n      void this.position(badge);\n    };\n    window.addEventListener('scroll', reposition, true);\n    window.addEventListener('resize', reposition);\n    this.stopFloat = () => {\n      window.removeEventListener('scroll', reposition, true);\n      window.removeEventListener('resize', reposition);\n    };\n  }\n\n  private closeTooltip(): void {\n    this.cancelClose();\n    if (!this.tooltip || !this.open) return;\n    this.tooltip.style.display = 'none';\n    this.open = false;\n    this.stopFloat?.();\n    this.stopFloat = null;\n  }\n\n  private cancelClose(): void {\n    if (this.closeTimer !== null) {\n      window.clearTimeout(this.closeTimer);\n      this.closeTimer = null;\n    }\n  }\n\n  private async position(badge: HTMLElement): Promise<void> {\n    const tooltip = this.tooltip;\n    const arrowEl = this.arrowEl;\n    if (!tooltip || !arrowEl) return;\n    const { x, y, placement, middlewareData } = await computePosition(badge, tooltip, {\n      strategy: 'fixed',\n      placement: this.side,\n      middleware: [offset(8), flip(), shift({ padding: 8 }), arrow({ element: arrowEl })],\n    });\n    tooltip.style.left = `${x}px`;\n    tooltip.style.top = `${y}px`;\n    positionArrow(arrowEl, placement, middlewareData.arrow);\n  }\n}\n\n/** Lee y normaliza `style.badge` (defaults seguros). */\nfunction readBadgeConfig(step: GuideStep): BadgeConfig {\n  const raw = step.style?.badge;\n  if (!raw || typeof raw !== 'object') return { kind: 'icon' };\n  const b = raw as Record<string, unknown>;\n  const kind =\n    b.kind === 'dot' ||\n    b.kind === 'pill' ||\n    b.kind === 'text' ||\n    b.kind === 'image' ||\n    b.kind === 'icon'\n      ? b.kind\n      : 'icon';\n  return {\n    kind,\n    icon: typeof b.icon === 'string' ? b.icon : null,\n    text: typeof b.text === 'string' ? b.text : null,\n    imageUrl: typeof b.imageUrl === 'string' ? b.imageUrl : null,\n    color: typeof b.color === 'string' && COLOR_RE.test(b.color.trim()) ? b.color.trim() : null,\n    size: typeof b.size === 'number' && Number.isFinite(b.size) ? b.size : null,\n  };\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n  return Math.min(max, Math.max(min, n));\n}\n\n/**\n * Construye el elemento visual del badge. `<button>` por accesibilidad\n * (focus/teclado). Texto por `textContent`; imagen por `isSafeUrl`.\n */\nfunction buildBadgeElement(config: BadgeConfig, doc: Document): HTMLButtonElement {\n  const btn = doc.createElement('button');\n  btn.type = 'button';\n  btn.className = `veo-badge veo-badge--${config.kind}`;\n  btn.setAttribute('aria-label', 'Más información');\n  const size = clamp(config.size ?? 18, 8, 48);\n\n  switch (config.kind) {\n    case 'dot':\n      btn.style.width = `${size}px`;\n      btn.style.height = `${size}px`;\n      if (config.color) btn.style.background = config.color;\n      break;\n    case 'pill': {\n      btn.textContent = config.text?.slice(0, 24) || 'Nuevo';\n      btn.style.fontSize = `${clamp(Math.round(size * 0.62), 8, 24)}px`;\n      if (config.color) btn.style.background = config.color;\n      break;\n    }\n    case 'text': {\n      // Texto plano, sin cápsula: hereda el color de acento (o el custom).\n      btn.textContent = config.text?.slice(0, 32) || 'Nuevo';\n      btn.style.fontSize = `${clamp(Math.round(size * 0.7), 9, 28)}px`;\n      if (config.color) btn.style.color = config.color;\n      break;\n    }\n    case 'image': {\n      if (config.imageUrl && isSafeUrl(config.imageUrl)) {\n        const img = doc.createElement('img');\n        img.src = config.imageUrl;\n        img.alt = '';\n        img.style.width = `${size}px`;\n        img.style.height = `${size}px`;\n        btn.appendChild(img);\n      } else {\n        // Sin imagen válida degrada a icono para que el badge no sea invisible.\n        btn.className = 'veo-badge veo-badge--icon';\n        btn.textContent = '?';\n        btn.style.width = `${size}px`;\n        btn.style.height = `${size}px`;\n        btn.style.fontSize = `${clamp(Math.round(size * 0.62), 8, 32)}px`;\n      }\n      break;\n    }\n    default: {\n      // icon: carácter/emoji dentro de un circulito.\n      btn.textContent = (config.icon || 'ℹ️').slice(0, 4);\n      btn.style.width = `${size}px`;\n      btn.style.height = `${size}px`;\n      btn.style.fontSize = `${clamp(Math.round(size * 0.62), 8, 32)}px`;\n      if (config.color) btn.style.color = config.color;\n      break;\n    }\n  }\n  return btn;\n}\n","import { buildContentNodes, createCloseButton } from './block-builder';\nimport type { GuideStep, WalkthroughCallbacks } from './types';\n\n/**\n * Construye el subtree DOM de un step de walkthrough con navegación\n * (counter, dots, contenido, botones atrás/siguiente/finalizar/omitir).\n *\n * Aplica las mismas reglas de seguridad que `buildStepContent`:\n *   - `textContent` para todo string del backend (cero `innerHTML`).\n *   - `imageUrl` validada con `isSafeUrl`.\n *\n * El botón primario cambia su label según el step:\n *   - último step → \"Finalizar\" → llama `onComplete`\n *   - otro       → `step.ctaText` o \"Siguiente\" → llama `onNext`\n *\n * El botón \"Atrás\" solo se pinta a partir del segundo step. El botón\n * \"Omitir\" siempre se pinta — el usuario debe poder salir en cualquier\n * momento.\n */\nexport function buildWalkthroughStepContent(\n  step: GuideStep,\n  stepIndex: number,\n  totalSteps: number,\n  doc: Document,\n  callbacks: WalkthroughCallbacks,\n): HTMLElement {\n  const container = doc.createElement('div');\n  container.className = 'veo-guide-content';\n\n  const counter = doc.createElement('div');\n  counter.className = 'veo-walkthrough-counter';\n  counter.textContent = `Paso ${stepIndex + 1} de ${totalSteps}`;\n  container.appendChild(counter);\n\n  const progress = doc.createElement('div');\n  progress.className = 'veo-walkthrough-progress';\n  for (let i = 0; i < totalSteps; i++) {\n    const dot = doc.createElement('span');\n    dot.className = 'veo-walkthrough-progress-dot';\n    if (i < stepIndex) dot.classList.add('completed');\n    if (i === stepIndex) dot.classList.add('active');\n    progress.appendChild(dot);\n  }\n  container.appendChild(progress);\n\n  // Contenido del paso: respeta blocks[] (imágenes, rich text, full-bleed) o\n  // cae a los escalares. Los bloques `button` se omiten — la navegación\n  // (atrás/siguiente/omitir) es del chrome del tour, abajo.\n  for (const node of buildContentNodes(step, doc)) {\n    container.appendChild(node);\n  }\n\n  const actions = doc.createElement('div');\n  actions.className = 'veo-walkthrough-actions';\n\n  const skipBtn = doc.createElement('button');\n  skipBtn.type = 'button';\n  skipBtn.className = 'veo-walkthrough-skip';\n  skipBtn.textContent = 'Omitir';\n  skipBtn.addEventListener('click', () => callbacks.onSkip());\n  actions.appendChild(skipBtn);\n\n  const rightGroup = doc.createElement('div');\n  rightGroup.className = 'veo-walkthrough-actions-right';\n\n  if (stepIndex > 0) {\n    const backBtn = doc.createElement('button');\n    backBtn.type = 'button';\n    backBtn.className = 'veo-walkthrough-btn-secondary';\n    backBtn.textContent = 'Atrás';\n    backBtn.addEventListener('click', () => callbacks.onBack());\n    rightGroup.appendChild(backBtn);\n  }\n\n  const isLastStep = stepIndex === totalSteps - 1;\n  const primaryBtn = doc.createElement('button');\n  primaryBtn.type = 'button';\n  primaryBtn.className = 'veo-guide-cta';\n  const defaultLabel = isLastStep ? 'Finalizar' : 'Siguiente';\n  primaryBtn.textContent =\n    typeof step.ctaText === 'string' && step.ctaText ? step.ctaText : defaultLabel;\n  primaryBtn.addEventListener('click', () => {\n    if (isLastStep) callbacks.onComplete();\n    else callbacks.onNext();\n  });\n  rightGroup.appendChild(primaryBtn);\n\n  actions.appendChild(rightGroup);\n  container.appendChild(actions);\n\n  // \"✕\" universal (esquina superior derecha): salir en cualquier momento.\n  // Mismo efecto que \"Omitir\" → reporta `dismissed`.\n  container.appendChild(createCloseButton(doc, () => callbacks.onSkip()));\n\n  return container;\n}\n","import { buildStepContent } from '../block-builder';\nimport { insertHost, keepHostAttached } from '../inline-host';\nimport type { GuideInteractionMetadata, GuideRenderContext, GuideStep } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { buildWalkthroughStepContent } from '../walkthrough-block-builder';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía tipo `banner`. Dos modos:\n *\n *  - **Pantalla completa** (default): barra fija arriba o abajo del viewport.\n *    La posición se lee de `step.style.position` (`top` | `bottom`).\n *  - **Embebido en un contenedor** (`step.selector` presente): el banner se\n *    inserta DENTRO del contenedor elegido (prepend con `top`, append con\n *    `bottom`) y empuja su contenido — como los \"element banners\" de Pendo.\n *    Reusa el watchdog inline (`keepHostAttached`) porque los frameworks del\n *    host borran nodos ajenos al re-renderizar.\n *\n * No tiene backdrop ni atrapa el foco. Con `context.nav` (paso de un\n * walkthrough heterogéneo) muestra botones de navegación y delega\n * tracking/avance al controller — solo en modo pantalla completa.\n */\nexport class BannerRenderer extends BaseRenderer {\n  async render(context: GuideRenderContext): Promise<void> {\n    const idx = context.nav?.stepIndex ?? 0;\n    const step = context.guide.guideSteps[idx];\n    if (!step) return;\n\n    const position = step.style?.position === 'bottom' ? 'bottom' : 'top';\n    // Con selector el banner se EMBEBE en ese contenedor — también en pasos de\n    // secuencia (el chrome de navegación viaja adentro). En un paso-tooltip el\n    // selector es el ancla; en un paso-banner es el contenedor: no colisionan\n    // porque cada paso tiene UNA presentación.\n    const selector = step.selector?.trim() || null;\n\n    let anchor: Element | null = null;\n    if (selector) {\n      anchor = await waitForElement(selector);\n      if (!anchor) return; // contenedor ausente → no pintar (como tooltip/inline)\n    }\n\n    const { host, root } = this.createHost();\n    this.applyDesign(step.style);\n    const ownerDocument = root.ownerDocument ?? document;\n\n    const banner = ownerDocument.createElement('div');\n    banner.className = bannerClassOf(position, Boolean(anchor));\n\n    const dismiss = (\n      action: 'dismissed' | 'cta_clicked',\n      ctaUrl?: string,\n      meta?: GuideInteractionMetadata,\n    ) => {\n      context.onInteraction({\n        guideId: context.guide.guideId,\n        stepIndex: idx,\n        action,\n        ...(meta ? { metadata: meta } : {}),\n      });\n      if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n      context.onClose();\n    };\n\n    const content = context.nav\n      ? buildWalkthroughStepContent(\n          step,\n          context.nav.stepIndex,\n          context.nav.totalSteps,\n          ownerDocument,\n          context.nav.callbacks,\n        )\n      : buildStepContent(step, ownerDocument, {\n          onCtaClick: (action, target, meta) => {\n            dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n            if (action === 'guide' && target) context.onOpenGuide?.(target);\n          },\n          onDismiss: () => dismiss('dismissed'),\n        });\n\n    banner.appendChild(content);\n    root.appendChild(banner);\n\n    if (selector && anchor) {\n      host.style.display = 'block';\n      const insertAt = position === 'top' ? 'prepend' : 'append';\n      insertHost(anchor, host, insertAt);\n      this.registerCleanup(keepHostAttached(host, selector, insertAt));\n    }\n\n    if (!context.nav) {\n      this.liveContainer = banner;\n      this.liveContent = content;\n      this.liveBuild = (s) =>\n        buildStepContent(s, ownerDocument, {\n          onCtaClick: (action, target, meta) => {\n            dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n            if (action === 'guide' && target) context.onOpenGuide?.(target);\n          },\n          onDismiss: () => dismiss('dismissed'),\n        });\n      this.liveKey = this.liveKeyOf(step);\n      context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n    }\n  }\n\n  /** Cambiar de contenedor o de top/bottom embebido requiere re-insertar → remontar. */\n  protected override liveKeyOf(step: GuideStep): string {\n    const selector = step.selector?.trim() ?? '';\n    if (!selector) return '';\n    const position = step.style?.position === 'bottom' ? 'bottom' : 'top';\n    return `${selector}|${position}`;\n  }\n\n  protected override onLiveUpdate(step: GuideStep): void {\n    // La posición del banner de pantalla completa (top/bottom) es solo una\n    // clase del wrapper — se actualiza en vivo. (El embebido remonta vía liveKey.)\n    if (this.liveContainer) {\n      const position = step.style?.position === 'bottom' ? 'bottom' : 'top';\n      const embedded = Boolean(step.selector?.trim());\n      this.liveContainer.className = bannerClassOf(position, embedded);\n    }\n  }\n}\n\nfunction bannerClassOf(position: 'top' | 'bottom', embedded: boolean): string {\n  return embedded ? 'veo-banner veo-banner-embedded' : `veo-banner veo-banner-${position}`;\n}\n","/**\n * Genera un UUID v7 (timestamp-based, ordenable cronológicamente).\n * Spec: RFC 9562.\n *\n * Formato: tttttttt-tttt-7xxx-yxxx-xxxxxxxxxxxx\n *   - 48 bits de timestamp (ms desde epoch)\n *   - 4 bits de versión (7)\n *   - 2 bits de variante (10)\n *   - 74 bits aleatorios\n */\nexport function uuidv7(): string {\n  const timestamp = Date.now();\n  const timeHex = timestamp.toString(16).padStart(12, '0');\n\n  // 10 bytes aleatorios para los 74 bits de entropía (+ bits de versión/variante).\n  const random = new Uint8Array(10);\n  if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {\n    crypto.getRandomValues(random);\n  } else {\n    // Fallback inseguro pero funcional (no debería ocurrir en browsers modernos).\n    for (let i = 0; i < random.length; i++) {\n      random[i] = Math.floor(Math.random() * 256);\n    }\n  }\n\n  // Set version (7) en el primer nibble del 3er grupo.\n  random[0] = ((random[0] ?? 0) & 0x0f) | 0x70;\n  // Set variant (10) en los 2 bits altos del 4to grupo.\n  random[2] = ((random[2] ?? 0) & 0x3f) | 0x80;\n\n  const hex = Array.from(random, (b) => b.toString(16).padStart(2, '0')).join('');\n\n  return [\n    timeHex.slice(0, 8),\n    timeHex.slice(8, 12),\n    hex.slice(0, 4),\n    hex.slice(4, 8),\n    hex.slice(8, 20),\n  ].join('-');\n}\n","import { uuidv7 } from '../../../utils/uuid';\nimport { isSafeUrl } from '../block-builder';\nimport type { GuideRenderContext, GuideStep } from '../types';\n\ninterface VeoBridgeMessage {\n  __veo?: unknown;\n  type?: unknown;\n  url?: unknown;\n  name?: unknown;\n  props?: unknown;\n  height?: unknown;\n  close?: unknown;\n}\n\n/**\n * Monta el `<iframe sandbox>` con el HTML/CSS/JS del cliente (origen `null`,\n * sin acceso al host) y cablea el puente postMessage (`dismiss`/`cta`/`track`/\n * `navigate`/`resize`) validando `source` + token. Compartido por las guías\n * `custom` (flotante/anclada) e `inline-custom` (embebida en el flujo).\n *\n * El caller crea el wrapper y posiciona/inserta el iframe; aquí sólo va la\n * lógica del documento + el bridge. Devuelve el iframe y un cleanup.\n */\nexport function mountCustomFrame(\n  doc: Document,\n  step: GuideStep,\n  context: GuideRenderContext,\n  opts: { width: string; fixedHeight?: number | string | null },\n): { iframe: HTMLIFrameElement; cleanup: () => void } {\n  const iframe = doc.createElement('iframe');\n  iframe.className = 'veo-custom-frame';\n  // allow-scripts SIN allow-same-origin → origen null, sin acceso al host.\n  iframe.setAttribute('sandbox', 'allow-scripts');\n  iframe.setAttribute('title', context.guide.guideName || 'OnUser');\n  iframe.style.width = opts.width;\n\n  const hasFixedHeight = opts.fixedHeight !== undefined && opts.fixedHeight !== null;\n  if (hasFixedHeight) iframe.style.height = toCssSize(opts.fixedHeight as number | string);\n\n  const token = uuidv7();\n  // fix: las apps modernas usan design tokens/Tailwind. Reenviamos las custom\n  // properties del host (`:root`) al iframe para que el CSS del cliente pueda\n  // usar `var(--su-token)`; y opcionalmente inyectamos Tailwind (Play CDN) si el\n  // autor lo pidió en `style.tailwind` (sujeto al CSP de la app — ver más abajo).\n  const wantsTailwind = (step.style as Record<string, unknown> | undefined)?.tailwind === true;\n  iframe.srcdoc = buildSrcdoc(step.html ?? '', step.css ?? '', step.js ?? '', token, {\n    hostCss: collectHostStyles(),\n    htmlAttrs: hostHtmlAttrs(),\n    tailwind: wantsTailwind,\n  });\n\n  const close = (): void => context.onClose();\n\n  const onMessage = (event: MessageEvent): void => {\n    if (event.source !== iframe.contentWindow) return;\n    const data = event.data as VeoBridgeMessage | null;\n    if (!data || typeof data !== 'object' || data.__veo !== token) return;\n\n    switch (data.type) {\n      case 'dismiss':\n        context.onInteraction({\n          guideId: context.guide.guideId,\n          stepIndex: 0,\n          action: 'dismissed',\n        });\n        close();\n        break;\n      case 'cta':\n        context.onInteraction({\n          guideId: context.guide.guideId,\n          stepIndex: 0,\n          action: 'cta_clicked',\n        });\n        if (typeof data.url === 'string' && isSafeUrl(data.url)) {\n          window.open(data.url, '_blank', 'noopener,noreferrer');\n        }\n        if (data.close !== false) close();\n        break;\n      case 'navigate':\n        if (typeof data.url === 'string' && isSafeUrl(data.url)) {\n          window.location.assign(data.url);\n        }\n        break;\n      case 'track':\n        if (typeof data.name === 'string' && context.onTrack) {\n          context.onTrack(data.name, isRecord(data.props) ? data.props : undefined);\n        }\n        break;\n      case 'resize':\n        if (!hasFixedHeight && typeof data.height === 'number' && data.height > 0) {\n          iframe.style.height = `${Math.ceil(data.height)}px`;\n        }\n        break;\n    }\n  };\n  window.addEventListener('message', onMessage);\n\n  return { iframe, cleanup: () => window.removeEventListener('message', onMessage) };\n}\n\nexport function toCssSize(value: number | string): string {\n  return typeof value === 'number' ? `${value}px` : value;\n}\n\n/** Tope del CSS del host que inyectamos (evita un srcdoc gigante). */\nconst MAX_HOST_CSS = 800 * 1024;\n\n/**\n * Recolecta TODO el CSS legible del host (stylesheets + `<style>`) para\n * inyectarlo en el iframe de una guía custom. Así un HTML copiado desde la app\n * se ve IDÉNTICO: toma las utilidades de Tailwind COMPILADAS por la app (con su\n * config real — colores/radios custom como `text-brand`, `rounded-control`…) Y\n * las clases CSS propias (no-Tailwind), además de las variables de `:root`.\n *\n * Las hojas cross-origin (CDN de fuentes, etc.) lanzan `SecurityError` al leer\n * sus reglas y se saltan — no podemos copiarlas. Acotado a ~800KB.\n */\nfunction collectHostStyles(): string {\n  if (typeof document === 'undefined') return '';\n  let out = '';\n  try {\n    for (const sheet of Array.from(document.styleSheets)) {\n      let rules: CSSRuleList | null = null;\n      try {\n        rules = sheet.cssRules;\n      } catch {\n        continue; // hoja de otro origen: no legible\n      }\n      if (!rules) continue;\n      for (const rule of Array.from(rules)) {\n        out += `${rule.cssText}\\n`;\n        if (out.length > MAX_HOST_CSS) return out;\n      }\n    }\n  } catch {\n    return out;\n  }\n  return out;\n}\n\n/**\n * Copia atributos \"de tema\" del `<html>` del host al iframe: `class` (estrategia\n * de dark-mode por clase de Tailwind, p. ej. `dark`), `style` (variables CSS\n * seteadas inline en `:root`) y `data-theme`/`data-mode`. Sin esto, una guía\n * copiada de una app oscura renderizaría en claro (los tokens cambian según el\n * tema). Se sanitiza (sin `\"`/`<`/`>`) porque va dentro de la etiqueta `<html>`.\n */\nfunction hostHtmlAttrs(): string {\n  if (typeof document === 'undefined') return '';\n  try {\n    const el = document.documentElement;\n    const attrs: string[] = [];\n    for (const name of ['class', 'style', 'data-theme', 'data-mode', 'data-color-mode']) {\n      const v = el.getAttribute(name);\n      if (v && v.length <= 1000 && !/[\"<>]/.test(v)) attrs.push(`${name}=\"${v}\"`);\n    }\n    return attrs.join(' ');\n  } catch {\n    return '';\n  }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Arma el documento del iframe. El JS del cliente puede llamar a `window.veo`\n * (bridge inyectado). `</script>`/`</style>` dentro del código se neutralizan\n * para que no corten sus bloques.\n *\n * `opts.hostCss` = CSS compilado del host (utilidades Tailwind reales + clases\n * propias + `:root`), para que el HTML copiado de la app se vea idéntico.\n * `opts.tailwind` inyecta ADEMÁS el Play CDN de Tailwind (para utilidades que la\n * app no usa y por ende no están en su CSS compilado) — sujeto al CSP de la app.\n */\nfunction buildSrcdoc(\n  html: string,\n  css: string,\n  js: string,\n  token: string,\n  opts: { hostCss: string; htmlAttrs: string; tailwind: boolean },\n): string {\n  const bridge =\n    `(function(){var T=${JSON.stringify(token)};` +\n    `function P(m){m.__veo=T;parent.postMessage(m,'*');}` +\n    `window.veo={` +\n    `dismiss:function(){P({type:'dismiss'});},` +\n    `cta:function(u){P({type:'cta',url:u});},` +\n    `track:function(n,p){P({type:'track',name:n,props:p||{}});},` +\n    `navigate:function(u){P({type:'navigate',url:u});}};` +\n    // Los <a href> dentro del iframe sandbox navegarían el iframe (la cajita),\n    // no la app del host. Interceptamos el click y reenviamos la navegación al\n    // host: links normales → navigate (misma pestaña); target=_blank → nueva\n    // pestaña. Así los links de una guía custom \"simplemente funcionan\".\n    `document.addEventListener('click',function(e){` +\n    `var a=e.target&&e.target.closest?e.target.closest('a[href]'):null;` +\n    `if(!a)return;` +\n    `var h=a.getAttribute('href');` +\n    `if(!h||h.charAt(0)==='#'||/^(javascript|mailto|tel):/i.test(h))return;` +\n    `e.preventDefault();` +\n    `if(a.target==='_blank'){P({type:'cta',url:a.href,close:false});}` +\n    `else{P({type:'navigate',url:h});}` +\n    `},true);` +\n    // Medimos el alto del CONTENEDOR del contenido (`#__veo_root`), no el del\n    // documento: el CSS de la app puede poner `body{min-height:100vh}` y estirar\n    // el <html> a toda la pantalla (caja negra). El contenedor mide solo el\n    // contenido real, así el iframe embebido se ajusta a lo que el autor definió.\n    `function H(){var r=document.getElementById('__veo_root');` +\n    `var h=r?r.getBoundingClientRect().height:document.documentElement.scrollHeight;` +\n    `P({type:'resize',height:Math.ceil(h)});}` +\n    `window.addEventListener('load',H);` +\n    `try{if(typeof ResizeObserver!=='undefined'){var _r=document.getElementById('__veo_root');` +\n    `new ResizeObserver(H).observe(_r||document.documentElement);}}catch(e){}` +\n    `})();`;\n\n  // CSS del host (todas las hojas de la app) para que el HTML se vea idéntico.\n  const hostStyle = opts.hostCss ? `<style>${escapeClosing(opts.hostCss, 'style')}</style>` : '';\n  // Tailwind Play CDN (opt-in). El src remoto depende del CSP de la app.\n  const tailwind = opts.tailwind ? '<script src=\"https://cdn.tailwindcss.com\"></script>' : '';\n\n  return (\n    // Orden: base → CSS del host (utilidades+clases propias+:root) → reset\n    // flotante (fondo transparente, sin márgenes) → Tailwind → CSS del autor (gana).\n    `<!DOCTYPE html><html ${opts.htmlAttrs}><head><meta charset=\"utf-8\">` +\n    '<style>html,body{margin:0;padding:0;}body{font-family:system-ui,-apple-system,sans-serif;}</style>' +\n    hostStyle +\n    // Reset flotante: el CSS de la app trae reglas de PÁGINA (body{min-height:100vh},\n    // html{height:100%}, fondo del layout…) que en un iframe embebido lo estirarían a\n    // toda la pantalla (caja negra) en vez de ajustarse al contenido. Neutralizamos\n    // tamaño/fondo/overflow (mantenemos color y fuente heredados de la app).\n    // `color-scheme:normal` es CLAVE para la transparencia: si el CSS de la app\n    // declara `:root{color-scheme:dark}` y no coincide con el del elemento iframe\n    // del host (normal), el navegador pinta el canvas OPACO (negro) en vez de\n    // transparente — igualamos ambos lados para conservar el fondo transparente.\n    '<style>html,body{margin:0!important;padding:0!important;background:transparent!important;' +\n    'height:auto!important;min-height:0!important;max-height:none!important;' +\n    'width:auto!important;min-width:0!important;overflow:visible!important;' +\n    'color-scheme:normal!important;}</style>' +\n    tailwind +\n    // Inline en <body>: gana incluso sobre reglas `!important` de la app (p. ej.\n    // `.dark body{background:#000!important}`) porque el estilo inline tiene la\n    // mayor especificidad dentro de la capa important-author.\n    `<style>${escapeClosing(css, 'style')}</style></head>` +\n    '<body style=\"margin:0!important;background:transparent!important;min-height:0!important;height:auto!important;\">' +\n    // Contenedor del contenido: el iframe se dimensiona por SU alto (no el del\n    // documento), así el layout de página de la app no lo estira.\n    `<div id=\"__veo_root\">${html}</div>` +\n    `<script>${bridge}</script>` +\n    (js ? `<script>${escapeClosing(js, 'script')}</script>` : '') +\n    '</body></html>'\n  );\n}\n\nfunction escapeClosing(code: string, tag: 'script' | 'style'): string {\n  const rx = tag === 'script' ? /<\\/script/gi : /<\\/style/gi;\n  return code.replace(rx, `<\\\\/${tag}`);\n}\n","import { mountCustomFrame } from './renderers/custom-frame';\nimport type { GuideRenderContext, GuideStep, InlinePosition, StepBlock } from './types';\n\n/** Destino de una inyección CRUDA: junto a `anchor`, en la posición `pos`. */\nexport interface RawInlineTarget {\n  anchor: Element;\n  pos: InlinePosition;\n}\n\n/** Inserta nodos CRUDOS (sin wrapper) junto al ancla, preservando el orden. */\nfunction insertRawNodes(anchor: Element, nodes: ChildNode[], pos: InlinePosition): void {\n  const parent = anchor.parentNode;\n  if (pos === 'prepend') {\n    const first = anchor.firstChild;\n    for (const n of nodes) anchor.insertBefore(n, first);\n  } else if (pos === 'append') {\n    for (const n of nodes) anchor.appendChild(n);\n  } else if (pos === 'before') {\n    for (const n of nodes) parent?.insertBefore(n, anchor);\n  } else {\n    // after: insertar cada uno tras el anterior para no invertir el orden.\n    let ref: ChildNode = anchor;\n    for (const n of nodes) {\n      parent?.insertBefore(n, ref.nextSibling);\n      ref = n;\n    }\n  }\n}\n\n/**\n * Ejecutor de un bloque `code`.\n *\n * ⚠️ **Excepción sancionada #3 a la regla no-eval/no-innerHTML del SDK**\n * (ver CLAUDE.md regla 8). El bloque `code` es un escape hatch DELIBERADO tipo\n * Google Tag Manager: corre código del autor con acceso a la página host. El\n * usuario lo aprobó explícitamente asumiendo el riesgo (es SU app).\n *\n * Dos modos:\n *  - `sandboxed: true` → iframe aislado (origen null, sin acceso al host). Es\n *    el comportamiento viejo de las guías `custom`; reusa `custom-frame.ts`.\n *  - `sandboxed: false` (default) → modo HOST: el CSS/JS se inyecta en la página\n *    real (el JS con acceso total al DOM host, tipo GTM). La HTML va al LIGHT DOM\n *    (hijo del host de la guía) y se PROYECTA en la tarjeta con un `<slot>`, así\n *    la estiliza el CSS de la PLATAFORMA de forma nativa (clases + icon fonts).\n *    Los `<script>` del HTML se re-crean en el host para que ejecuten. Todo lo\n *    inyectado se limpia al desmontar el paso.\n */\nexport interface MountedCode {\n  /** Nodo visible a insertar en la card (o `null` en modo host sin HTML). */\n  node: HTMLElement | null;\n  cleanup: () => void;\n}\n\n/** Secuencia para nombres de slot únicos por bloque code. */\nlet codeSlotSeq = 0;\n\nexport function mountCodeBlock(\n  block: StepBlock,\n  doc: Document,\n  context: GuideRenderContext,\n  /** Host (light DOM) de la guía: la HTML host se proyecta ahí vía `<slot>` para\n   *  que el CSS de la plataforma aplique nativo. */\n  host?: HTMLElement,\n  /** Inyección CRUDA: inserta la HTML directo en el DOM real junto al ancla (sin\n   *  wrappers/shadow) para DUPLICAR un elemento nativo tal cual — contexto,\n   *  layout e iconos incluidos. Lo usa una guía inline de un solo bloque code. */\n  rawInline?: RawInlineTarget,\n): MountedCode {\n  if (block.sandboxed) {\n    const step = { html: block.html ?? '', css: block.css, js: block.js } as GuideStep;\n    const { iframe, cleanup } = mountCustomFrame(doc, step, context, { width: '100%' });\n    const wrapper = doc.createElement('div');\n    wrapper.className = 'veo-code-sandbox';\n    wrapper.appendChild(iframe);\n    return { node: wrapper, cleanup };\n  }\n\n  // ── Modo host: acceso total al DOM real ──\n  // Se ejecuta SIEMPRE en la página real, SIN iframe — en runtime, en el link de\n  // preview y también en el editor. Es un pedido explícito del usuario: quiere\n  // ver el código correr de verdad al previsualizar. (Al re-renderizar la preview\n  // el cleanup remueve la inyección previa, así no se acumula.)\n  const hostDoc = doc; // el ownerDocument del shadow root ES el documento host\n  const injected: ChildNode[] = [];\n\n  if (typeof block.css === 'string' && block.css.trim()) {\n    const style = hostDoc.createElement('style');\n    style.textContent = block.css;\n    hostDoc.head.appendChild(style);\n    injected.push(style);\n  }\n\n  let node: HTMLElement | null = null;\n  if (typeof block.html === 'string' && block.html.trim()) {\n    // EXCEPCIÓN #3: innerHTML sobre un nodo DETACHED (inerte: no ejecuta scripts).\n    // Los `<script>` se re-crean en el host para que corran (tipo GTM).\n    const holder = doc.createElement('div');\n    holder.className = 'veo-code-html';\n    holder.innerHTML = block.html;\n    for (const old of Array.from(holder.querySelectorAll('script'))) {\n      injected.push(runScript(old, hostDoc));\n      old.remove();\n    }\n    if (rawInline) {\n      // DUPLICAR un elemento nativo: los nodos van CRUDOS al DOM real junto al\n      // ancla (sin el holder ni el host de la guía), así toman el contexto/layout\n      // de la plataforma tal cual (selectores `>`, flex, etc.).\n      const rawNodes = Array.from(holder.childNodes);\n      insertRawNodes(rawInline.anchor, rawNodes, rawInline.pos);\n      injected.push(...rawNodes);\n      // `node` queda null: no hay tarjeta.\n    } else if (host) {\n      // La HTML debe verse TAL CUAL la web (clases nativas + icon fonts). Va al\n      // LIGHT DOM (hijo del host de la guía) donde el CSS de la plataforma aplica\n      // de forma NATIVA, y se PROYECTA dentro de la tarjeta con un `<slot>`. Sin\n      // clonar hojas de estilo (evita el async/parpadeo del enfoque anterior).\n      // Nota: selectores que dependen de un ancestro (`.sidebar .side-nav-item`)\n      // no matchean acá (el ancestro es el host, no `.sidebar`); los de clase sí.\n      const slotName = `veo-code-${++codeSlotSeq}`;\n      holder.slot = slotName;\n      host.appendChild(holder);\n      injected.push(holder);\n      const slot = doc.createElement('slot');\n      slot.setAttribute('name', slotName);\n      node = slot;\n    } else {\n      // Fallback sin host: render directo (dentro del shadow, sin estilos de la\n      // plataforma). No debería pasar en el runtime/preview reales.\n      node = holder;\n    }\n  }\n\n  if (typeof block.js === 'string' && block.js.trim()) {\n    const s = hostDoc.createElement('script');\n    s.textContent = block.js;\n    hostDoc.body.appendChild(s);\n    injected.push(s);\n  }\n\n  return {\n    node,\n    cleanup: () => {\n      for (const n of injected) n.parentNode?.removeChild(n);\n    },\n  };\n}\n\n/** Re-crea un `<script>` (inerte al venir de innerHTML) para que EJECUTE en el host. */\nfunction runScript(old: HTMLScriptElement, hostDoc: Document): HTMLScriptElement {\n  const s = hostDoc.createElement('script');\n  for (const attr of Array.from(old.attributes)) s.setAttribute(attr.name, attr.value);\n  if (!old.src) s.textContent = old.textContent;\n  hostDoc.body.appendChild(s);\n  return s;\n}\n","import { createCloseButton } from './block-builder';\nimport type { FormField, GuideRenderContext } from './types';\n\n/**\n * Construcción COMPARTIDA del contenido de una guía `form` (overlay) e\n * `inline-form` (embebida): título/texto, campos, validación de requeridos,\n * envío vía `context.onFormSubmit`, estado \"¡Gracias!\" y cierre diferido.\n * El caller pone el chrome (modal-card u tarjeta inline) y pasa la `card`\n * donde se reemplaza el contenido por el agradecimiento.\n *\n * Mismas reglas de seguridad que block-builder: cero `innerHTML`, todo texto\n * por `textContent`.\n */\nexport function mountFormContent(\n  card: HTMLElement,\n  context: GuideRenderContext,\n  doc: Document,\n): void {\n  const step = context.guide.guideSteps[0];\n  if (!step) return;\n  const fields = step.fields ?? [];\n\n  const dismiss = (): void => {\n    context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'dismissed' });\n    context.onClose();\n  };\n\n  const content = doc.createElement('div');\n  content.className = 'veo-guide-content';\n\n  if (step.title) {\n    const heading = doc.createElement('h2');\n    heading.className = 'veo-guide-title';\n    heading.textContent = step.title;\n    content.appendChild(heading);\n  }\n  if (step.content) {\n    const paragraph = doc.createElement('p');\n    paragraph.className = 'veo-guide-text';\n    paragraph.textContent = step.content;\n    content.appendChild(paragraph);\n  }\n\n  const readers: Array<{ field: FormField; read: () => unknown }> = [];\n  const form = doc.createElement('form');\n  form.className = 'veo-form';\n  form.noValidate = true;\n  for (const field of fields) {\n    const { wrapper, read } = buildField(field, doc);\n    readers.push({ field, read });\n    form.appendChild(wrapper);\n  }\n\n  const error = doc.createElement('p');\n  error.className = 'veo-form-error';\n  error.style.display = 'none';\n  form.appendChild(error);\n\n  const actions = doc.createElement('div');\n  actions.className = 'veo-guide-actions';\n  const submit = doc.createElement('button');\n  submit.type = 'submit';\n  submit.className = 'veo-guide-cta';\n  submit.textContent = step.ctaText || 'Enviar';\n  actions.appendChild(submit);\n  form.appendChild(actions);\n\n  form.addEventListener('submit', (e) => {\n    e.preventDefault();\n    error.style.display = 'none';\n\n    const answers: Record<string, unknown> = {};\n    for (const { field, read } of readers) {\n      const value = read();\n      const empty = value === undefined || value === null || value === '';\n      if (empty) {\n        if (field.required) {\n          error.textContent = `Completa \"${field.label}\"`;\n          error.style.display = 'block';\n          return;\n        }\n        continue;\n      }\n      answers[field.key] = value;\n    }\n    if (Object.keys(answers).length === 0) {\n      error.textContent = 'Responde al menos un campo';\n      error.style.display = 'block';\n      return;\n    }\n\n    submit.disabled = true;\n    const submitFn = context.onFormSubmit ?? (() => Promise.resolve(true));\n    void submitFn(answers).then((ok) => {\n      if (!ok) {\n        submit.disabled = false;\n        error.textContent = 'No se pudo enviar. Prueba de nuevo.';\n        error.style.display = 'block';\n        return;\n      }\n      context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'completed' });\n      const note = context.isPreview\n        ? (context.previewNote ?? 'Vista previa: la respuesta NO se guardó.')\n        : null;\n      showThanks(card, doc, note);\n      window.setTimeout(() => context.onClose(), note ? 2200 : 1400);\n    });\n  });\n\n  content.appendChild(form);\n  content.appendChild(createCloseButton(doc, dismiss));\n\n  card.appendChild(content);\n}\n\n/** Reemplaza el contenido de la tarjeta por un \"¡Gracias!\" breve. */\nfunction showThanks(card: HTMLElement, doc: Document, note: string | null): void {\n  while (card.firstChild) card.removeChild(card.firstChild);\n  const thanks = doc.createElement('div');\n  thanks.className = 'veo-form-thanks';\n  thanks.textContent = '✓ ¡Gracias por tu respuesta!';\n  card.appendChild(thanks);\n  if (note) {\n    const noteEl = doc.createElement('p');\n    noteEl.className = 'veo-form-preview-note';\n    noteEl.textContent = note;\n    card.appendChild(noteEl);\n  }\n}\n\n/** Construye el DOM de un campo y devuelve su lector de valor. */\nexport function buildField(\n  field: FormField,\n  doc: Document,\n): { wrapper: HTMLElement; read: () => unknown } {\n  const wrapper = doc.createElement('div');\n  wrapper.className = 'veo-form-field';\n\n  const label = doc.createElement('label');\n  label.className = 'veo-form-label';\n  label.textContent = field.required ? `${field.label} *` : field.label;\n  wrapper.appendChild(label);\n\n  switch (field.type) {\n    case 'textarea': {\n      const input = doc.createElement('textarea');\n      input.className = 'veo-form-input';\n      input.rows = 3;\n      if (field.placeholder) input.placeholder = field.placeholder;\n      wrapper.appendChild(input);\n      return { wrapper, read: () => input.value.trim() };\n    }\n    case 'number': {\n      const input = doc.createElement('input');\n      input.type = 'number';\n      input.className = 'veo-form-input';\n      if (field.placeholder) input.placeholder = field.placeholder;\n      wrapper.appendChild(input);\n      return {\n        wrapper,\n        read: () => (input.value.trim() === '' ? undefined : Number(input.value)),\n      };\n    }\n    case 'select': {\n      const select = doc.createElement('select');\n      select.className = 'veo-form-input';\n      const blank = doc.createElement('option');\n      blank.value = '';\n      blank.textContent = field.placeholder || 'Elige una opción…';\n      select.appendChild(blank);\n      for (const opt of field.options ?? []) {\n        const option = doc.createElement('option');\n        option.value = opt;\n        option.textContent = opt;\n        select.appendChild(option);\n      }\n      wrapper.appendChild(select);\n      return { wrapper, read: () => select.value || undefined };\n    }\n    case 'radio': {\n      const group = doc.createElement('div');\n      group.className = 'veo-form-options';\n      const name = `veo-${field.key}`;\n      const inputs: HTMLInputElement[] = [];\n      for (const opt of field.options ?? []) {\n        const optionLabel = doc.createElement('label');\n        optionLabel.className = 'veo-form-option';\n        const radio = doc.createElement('input');\n        radio.type = 'radio';\n        radio.name = name;\n        radio.value = opt;\n        inputs.push(radio);\n        const text = doc.createElement('span');\n        text.textContent = opt;\n        optionLabel.appendChild(radio);\n        optionLabel.appendChild(text);\n        group.appendChild(optionLabel);\n      }\n      wrapper.appendChild(group);\n      return { wrapper, read: () => inputs.find((i) => i.checked)?.value };\n    }\n    case 'multiselect': {\n      // Grupo de checkboxes: la respuesta es un ARRAY con las opciones marcadas.\n      const group = doc.createElement('div');\n      group.className = 'veo-form-options';\n      const inputs: HTMLInputElement[] = [];\n      for (const opt of field.options ?? []) {\n        const optionLabel = doc.createElement('label');\n        optionLabel.className = 'veo-form-option';\n        const checkbox = doc.createElement('input');\n        checkbox.type = 'checkbox';\n        checkbox.value = opt;\n        inputs.push(checkbox);\n        const text = doc.createElement('span');\n        text.textContent = opt;\n        optionLabel.appendChild(checkbox);\n        optionLabel.appendChild(text);\n        group.appendChild(optionLabel);\n      }\n      wrapper.appendChild(group);\n      return {\n        wrapper,\n        read: () => {\n          const values = inputs.filter((i) => i.checked).map((i) => i.value);\n          return values.length > 0 ? values : undefined;\n        },\n      };\n    }\n    case 'checkbox': {\n      const optionLabel = doc.createElement('label');\n      optionLabel.className = 'veo-form-option';\n      const checkbox = doc.createElement('input');\n      checkbox.type = 'checkbox';\n      const text = doc.createElement('span');\n      text.textContent = field.placeholder || 'Sí';\n      optionLabel.appendChild(checkbox);\n      optionLabel.appendChild(text);\n      wrapper.appendChild(optionLabel);\n      // Checkbox siempre responde true/false (no “vacío”): required pide marcarlo.\n      return { wrapper, read: () => (checkbox.checked ? true : field.required ? '' : false) };\n    }\n    case 'yesno': {\n      // Radio Sí/No: dos opciones visibles, pero la respuesta es BOOLEANA\n      // (true/false) — el widget \"amigable\" para props de tipo sí/no.\n      const group = doc.createElement('div');\n      group.className = 'veo-form-options';\n      const name = `veo-${field.key}`;\n      const [yesLabel, noLabel] =\n        field.options?.length === 2 ? (field.options as [string, string]) : ['Sí', 'No'];\n      const inputs: Array<{ input: HTMLInputElement; value: boolean }> = [];\n      for (const { label: optText, value } of [\n        { label: yesLabel, value: true },\n        { label: noLabel, value: false },\n      ]) {\n        const optionLabel = doc.createElement('label');\n        optionLabel.className = 'veo-form-option';\n        const radio = doc.createElement('input');\n        radio.type = 'radio';\n        radio.name = name;\n        inputs.push({ input: radio, value });\n        const text = doc.createElement('span');\n        text.textContent = optText;\n        optionLabel.appendChild(radio);\n        optionLabel.appendChild(text);\n        group.appendChild(optionLabel);\n      }\n      wrapper.appendChild(group);\n      return { wrapper, read: () => inputs.find((i) => i.input.checked)?.value };\n    }\n    case 'nps':\n      return buildScale(wrapper, doc, 0, 10, 'veo-nps-btn');\n    case 'rating':\n      return buildScale(wrapper, doc, 1, 5, 'veo-rating-btn', '★');\n    default: {\n      const input = doc.createElement('input');\n      input.type = 'text';\n      input.className = 'veo-form-input';\n      if (field.placeholder) input.placeholder = field.placeholder;\n      wrapper.appendChild(input);\n      return { wrapper, read: () => input.value.trim() };\n    }\n  }\n}\n\n/** Fila de botones numerados (NPS 0-10) o de estrellas (rating 1-5). */\nfunction buildScale(\n  wrapper: HTMLElement,\n  doc: Document,\n  min: number,\n  max: number,\n  btnClass: string,\n  symbol?: string,\n): { wrapper: HTMLElement; read: () => unknown } {\n  const row = doc.createElement('div');\n  row.className = 'veo-form-scale';\n  let selected: number | undefined;\n  const buttons: HTMLButtonElement[] = [];\n  for (let n = min; n <= max; n++) {\n    const btn = doc.createElement('button');\n    btn.type = 'button';\n    btn.className = btnClass;\n    btn.textContent = symbol ?? String(n);\n    btn.setAttribute('aria-label', String(n));\n    btn.addEventListener('click', () => {\n      selected = n;\n      buttons.forEach((b, i) => {\n        // Rating pinta acumulado (★★★☆☆); NPS solo el elegido.\n        const active = symbol ? i + min <= n : i + min === n;\n        b.classList.toggle('veo-scale-active', active);\n      });\n    });\n    buttons.push(btn);\n    row.appendChild(btn);\n  }\n  wrapper.appendChild(row);\n  return { wrapper, read: () => selected };\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { applyBlockStyle, buildContentBlock, createCloseButton, isSafeUrl } from '../block-builder';\nimport { mountCodeBlock } from '../code-block';\nimport { buildField } from '../form-content';\nimport { insertHost, keepHostAttached } from '../inline-host';\nimport type {\n  CompositeStep,\n  FormField,\n  GuideRenderContext,\n  InlinePosition,\n  StepBlock,\n  StepPosition,\n} from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { positionArrow } from './floating-arrow';\n\n/** Lector de un campo de formulario (para los botones submit-forms). */\ninterface FormReader {\n  field: FormField;\n  read: () => unknown;\n}\n\n/** align de un botón → justify-content de su fila de acciones. */\nconst ROW_ALIGN: Record<string, string> = {\n  left: 'flex-start',\n  center: 'center',\n  right: 'flex-end',\n};\n\n/**\n * Renderer UNIFICADO del modelo `composite`. Renderiza UN paso componiendo\n * presentación (floating/inline) × posición (9 esquinas / centro /\n * relative-to-element) + diseño + bloques. Reemplaza los 10 renderers por-tipo.\n *\n * El SDK normaliza toda guía a `composite` (`normalizeGuide`) antes de llegar\n * acá, así que este renderer no conoce los tipos viejos.\n *\n * Multi-paso: si `context.nav` está, los botones next/prev/dismiss delegan en\n * las callbacks de navegación (el controller orquesta el avance, igual que en\n * los walkthroughs heterogéneos).\n */\nexport class CompositeRenderer extends BaseRenderer {\n  async render(context: GuideRenderContext): Promise<void> {\n    const idx = context.nav?.stepIndex ?? 0;\n    const step = context.guide.guideSteps[idx] as unknown as CompositeStep | undefined;\n    if (!step) return;\n\n    // Ancla (relative-to-element, inline o BADGE) — sin ella no pintamos.\n    const badgeMode = step.badge?.enabled === true;\n    const anchorSelector =\n      step.position === 'relative-to-element' || step.presentation === 'inline' || badgeMode\n        ? step.anchorSelector?.trim() || undefined\n        : undefined;\n    let anchor: Element | null = null;\n    if (anchorSelector) {\n      anchor = await waitForElement(anchorSelector);\n      if (!anchor) return;\n    }\n\n    // DUPLICAR un elemento nativo: una guía INLINE cuyo ÚNICO bloque es un code\n    // host se inserta CRUDA en el DOM real (sin shadow ni wrappers), junto al\n    // ancla. Así se ve idéntica al elemento de la plataforma (contexto, layout,\n    // iconos) — el usuario solo pega el HTML, sin JS.\n    const blocks = step.blocks ?? [];\n    const soleCode = blocks.length === 1 && blocks[0]?.type === 'code' ? blocks[0] : undefined;\n    if (step.presentation === 'inline' && anchor && soleCode && !soleCode.sandboxed) {\n      const rawDoc = anchor.ownerDocument ?? document;\n      const { cleanup } = mountCodeBlock(soleCode, rawDoc, context, undefined, {\n        anchor,\n        pos: inlinePosOf(step.inlinePosition),\n      });\n      this.registerCleanup(cleanup);\n      context.onInteraction({ guideId: context.guide.guideId, stepIndex: idx, action: 'shown' });\n      return;\n    }\n\n    const { host, root } = this.createHost();\n    const doc = root.ownerDocument ?? document;\n    const design = (step.design ?? {}) as Record<string, unknown>;\n\n    // Z-index del host (contenedor de la guía) desde el diseño.\n    if (typeof design.zIndex === 'number') host.style.zIndex = String(design.zIndex);\n\n    // ── Card + diseño ──\n    const card = doc.createElement('div');\n    card.className = 'veo-card';\n    applyCompositeDesign(card, design);\n\n    const dismiss = (action: 'dismissed' | 'cta_clicked', meta?: StepBlock): void => {\n      context.onInteraction({\n        guideId: context.guide.guideId,\n        stepIndex: idx,\n        action,\n        ...(meta?.id ? { metadata: { buttonId: meta.id } } : {}),\n      });\n    };\n\n    // ── Contenido: recorre los bloques EN ORDEN (title/text/image/code/form\n    // intercalados con filas de botones). Los form-blocks registran readers que\n    // los botones submit-forms recogen. ──\n    const readers: FormReader[] = [];\n    this.buildContent(card, step.blocks ?? [], doc, context, idx, readers, host);\n    // El último bloque en flujo NO debe dejar su margin-bottom colgando (title/\n    // text/image traen uno por defecto para separar del siguiente; en el último\n    // sobra y deja un hueco abajo). El ✕ todavía no se agregó, así que\n    // `lastElementChild` es el último bloque real. Respeta un margen puesto a\n    // mano (solo pisa el default del CSS, no un `style.marginBottom` explícito).\n    const lastBlock = card.lastElementChild as HTMLElement | null;\n    if (lastBlock && !lastBlock.style.marginBottom) lastBlock.style.marginBottom = '0';\n    // En modo badge el ✕ solo cierra el TOOLTIP (el marcador es permanente). Se\n    // asigna en `renderBadgeMode`; hasta entonces null (comportamiento normal).\n    let closeTooltip: (() => void) | null = null;\n    // ✕ de cierre (a menos que el diseño lo desactive), con color configurable.\n    if (design.closeButton !== false) {\n      const closeBtn = createCloseButton(doc, () => {\n        if (closeTooltip) {\n          closeTooltip();\n          return;\n        }\n        dismiss('dismissed');\n        this.closeOrSkip(context);\n      });\n      const closeColor = typeof design.closeColor === 'string' ? design.closeColor : null;\n      const hoverColor = typeof design.closeHoverColor === 'string' ? design.closeHoverColor : null;\n      if (closeColor) closeBtn.style.color = closeColor;\n      // Posición del ✕: por defecto arriba-derecha, DENTRO de la tarjeta (el CSS\n      // base lo deja a -6px, medio afuera y clavado en esa esquina). El usuario\n      // lo puede mover a cualquiera de las 4 esquinas.\n      const closePos =\n        typeof design.closePosition === 'string' ? design.closePosition : 'top-right';\n      applyClosePosition(closeBtn, closePos);\n      // El hover del ✕ no se puede con inline CSS (:hover) → listeners que\n      // intercambian el color (base ↔ hover).\n      if (hoverColor) {\n        closeBtn.addEventListener('mouseenter', () => {\n          closeBtn.style.color = hoverColor;\n        });\n        closeBtn.addEventListener('mouseleave', () => {\n          closeBtn.style.color = closeColor ?? '';\n        });\n      }\n      card.appendChild(closeBtn);\n    }\n\n    // ── Modo BADGE: marcador permanente (bloques) anclado + tooltip (la card) ──\n    if (badgeMode && anchor) {\n      closeTooltip = this.renderBadgeMode(\n        step,\n        card,\n        anchor,\n        anchorSelector as string,\n        host,\n        root,\n        doc,\n        context,\n        idx,\n        design,\n      );\n      // El `shown` se emite al ABRIR el tooltip por primera vez (dentro del modo).\n      return;\n    }\n\n    // ── Posicionamiento ──\n    if (step.presentation === 'inline' && anchor) {\n      host.style.display = 'block';\n      const pos = inlinePosOf(step.inlinePosition);\n      root.appendChild(card);\n      insertHost(anchor, host, pos);\n      this.registerCleanup(keepHostAttached(host, anchorSelector as string, pos));\n    } else if (step.position === 'relative-to-element' && anchor) {\n      // Backdrop opcional para el anclado (spotlight): oscurece la página y,\n      // con targetAbove, eleva el elemento objetivo por encima del oscurecido.\n      if (design.backdrop === true) {\n        const bg = doc.createElement('div');\n        bg.className = 'veo-composite-overlay veo-composite-overlay--dim';\n        if (typeof design.backdropColor === 'string') bg.style.background = design.backdropColor;\n        const bz = typeof design.backdropZIndex === 'number' ? design.backdropZIndex : 200000;\n        bg.style.zIndex = String(bz);\n        root.appendChild(bg);\n        if (design.targetAbove === true) this.registerCleanup(liftTarget(anchor, bz + 1));\n      }\n      const wrapper = doc.createElement('div');\n      wrapper.className = 'veo-composite-anchored';\n      // Flecha (caret) que apunta al ancla, salvo que el diseño la desactive.\n      const caretEl = design.caret === false ? null : makeCaret(doc, design);\n      if (caretEl) wrapper.appendChild(caretEl);\n      wrapper.appendChild(card);\n      root.appendChild(wrapper);\n      this.registerCleanup(await anchorPosition(anchor, wrapper, caretEl));\n    } else {\n      // Flotante en el viewport (centro o esquina). El fondo oscuro (backdrop)\n      // se aplica según el toggle del usuario, INDEPENDIENTE de la posición:\n      // una guía en una esquina también puede comportarse como modal (fondo\n      // oscuro + click-fuera cierra). Antes solo se pintaba en 'center', así que\n      // al mover la guía fuera del centro se perdía el backdrop.\n      const overlay = doc.createElement('div');\n      overlay.className = 'veo-composite-overlay';\n      if (design.backdrop !== false) {\n        overlay.classList.add('veo-composite-overlay--dim');\n        if (typeof design.backdropColor === 'string') {\n          overlay.style.background = design.backdropColor;\n        }\n        if (typeof design.backdropZIndex === 'number') {\n          overlay.style.zIndex = String(design.backdropZIndex);\n        }\n        overlay.addEventListener('click', (e) => {\n          if (e.target === overlay) {\n            dismiss('dismissed');\n            this.closeOrSkip(context);\n          }\n        });\n      }\n      applyViewportPosition(card, step.position, design);\n      overlay.appendChild(card);\n      root.appendChild(overlay);\n    }\n\n    context.onInteraction({ guideId: context.guide.guideId, stepIndex: idx, action: 'shown' });\n  }\n\n  /** Recorre los bloques en orden y los pinta en la card. */\n  private buildContent(\n    card: HTMLElement,\n    blocks: StepBlock[],\n    doc: Document,\n    context: GuideRenderContext,\n    idx: number,\n    readers: FormReader[],\n    host: HTMLElement,\n  ): void {\n    const emit = (block: StepBlock): void => {\n      context.onInteraction({\n        guideId: context.guide.guideId,\n        stepIndex: idx,\n        action: 'cta_clicked',\n        ...(block.id ? { metadata: { buttonId: block.id } } : {}),\n      });\n    };\n    let i = 0;\n    while (i < blocks.length) {\n      const b = blocks[i];\n      if (!b) {\n        i++;\n        continue;\n      }\n      if (b.type === 'button') {\n        const row = doc.createElement('div');\n        row.className = 'veo-guide-actions';\n        // La alineación de un botón mueve la FILA (justify-content), no el botón\n        // dentro. La toma del PRIMER botón del grupo.\n        let rowAlign: string | undefined;\n        while (i < blocks.length && blocks[i]?.type === 'button') {\n          const bb = blocks[i] as StepBlock;\n          if (!rowAlign) {\n            const a = (bb.style as Record<string, unknown> | null | undefined)?.align;\n            if (a === 'left' || a === 'center' || a === 'right') rowAlign = a;\n          }\n          row.appendChild(this.buildButton(bb, doc, context, idx, readers, emit));\n          i++;\n        }\n        if (rowAlign) row.style.justifyContent = ROW_ALIGN[rowAlign] ?? 'flex-end';\n        card.appendChild(row);\n        continue;\n      }\n      if (b.type === 'code') {\n        const { node, cleanup } = mountCodeBlock(b, doc, context, host);\n        if (node) card.appendChild(node);\n        this.registerCleanup(cleanup);\n        i++;\n        continue;\n      }\n      if (b.type === 'form') {\n        const form = doc.createElement('div');\n        form.className = 'veo-form';\n        for (const field of b.fields ?? []) {\n          const { wrapper, read } = buildField(field, doc);\n          readers.push({ field, read });\n          form.appendChild(wrapper);\n        }\n        card.appendChild(form);\n        i++;\n        continue;\n      }\n      const node = buildContentBlock(b, doc);\n      if (node) card.appendChild(node);\n      i++;\n    }\n  }\n\n  /** Botón con enrutado de acción (navegación / cierre / url / guía / envío de forms). */\n  private buildButton(\n    block: StepBlock,\n    doc: Document,\n    context: GuideRenderContext,\n    idx: number,\n    readers: FormReader[],\n    emit: (block: StepBlock) => void,\n  ): HTMLButtonElement {\n    const btn = doc.createElement('button');\n    btn.type = 'button';\n    btn.className = 'veo-guide-cta';\n    btn.textContent = block.text?.trim() || 'OK';\n    // Estilos por-bloque del botón (color/fondo/borde/tamaño/tipografía/…).\n    applyBlockStyle(btn, block.style, 'button');\n    const nav = context.nav?.callbacks;\n    btn.addEventListener('click', () => {\n      switch (block.action) {\n        case 'next':\n          emit(block);\n          if (nav) nav.onNext();\n          else context.onClose();\n          break;\n        case 'prev':\n          emit(block);\n          nav?.onBack();\n          break;\n        case 'url':\n          emit(block);\n          if (typeof block.url === 'string' && isSafeUrl(block.url)) {\n            window.open(block.url, '_blank', 'noopener,noreferrer');\n          }\n          break;\n        case 'guide':\n          emit(block);\n          if (block.targetGuideId) context.onOpenGuide?.(block.targetGuideId);\n          this.closeOrSkip(context);\n          break;\n        case 'submit-forms':\n        case 'submit-forms-advance':\n        case 'submit-forms-goto':\n          this.submitForms(readers, context, idx, btn, () => {\n            emit(block);\n            if (block.action === 'submit-forms' || !nav) {\n              context.onClose();\n            } else if (\n              block.action === 'submit-forms-goto' &&\n              typeof block.targetStep === 'number' &&\n              nav.onGoto\n            ) {\n              nav.onGoto(block.targetStep);\n            } else {\n              nav.onNext();\n            }\n          });\n          break;\n        default:\n          emit(block);\n          this.closeOrSkip(context);\n      }\n    });\n    return btn;\n  }\n\n  /** Recoge respuestas de todos los form-blocks del paso, valida y envía. */\n  private submitForms(\n    readers: FormReader[],\n    context: GuideRenderContext,\n    idx: number,\n    btn: HTMLButtonElement,\n    onDone: () => void,\n  ): void {\n    const answers: Record<string, unknown> = {};\n    for (const { field, read } of readers) {\n      const value = read();\n      const empty = value === undefined || value === null || value === '';\n      if (empty) {\n        if (field.required) {\n          btn.textContent = `Completa \"${field.label}\"`;\n          return;\n        }\n        continue;\n      }\n      answers[field.key] = value;\n    }\n    if (readers.length > 0 && Object.keys(answers).length === 0) return;\n    btn.disabled = true;\n    const submitFn = context.onFormSubmit ?? (() => Promise.resolve(true));\n    void submitFn(answers).then((ok) => {\n      btn.disabled = false;\n      if (!ok) return;\n      context.onInteraction({\n        guideId: context.guide.guideId,\n        stepIndex: idx,\n        action: 'completed',\n      });\n      onDone();\n    });\n  }\n\n  private closeOrSkip(context: GuideRenderContext): void {\n    if (context.nav?.callbacks) context.nav.callbacks.onSkip();\n    else context.onClose();\n  }\n\n  /**\n   * Modo BADGE: inserta un MARCADOR permanente (compuesto con `step.badge.blocks`)\n   * junto al ancla, en el flujo del DOM. Al hover/click abre la `card` (los\n   * bloques del paso) como TOOLTIP anclado al marcador. Devuelve una función que\n   * cierra el tooltip (para el ✕). El marcador nunca se descarta.\n   */\n  private renderBadgeMode(\n    step: CompositeStep,\n    card: HTMLElement,\n    anchor: Element,\n    anchorSelector: string,\n    host: HTMLElement,\n    root: HTMLElement,\n    doc: Document,\n    context: GuideRenderContext,\n    idx: number,\n    design: Record<string, unknown>,\n  ): () => void {\n    const trigger = step.badge?.trigger === 'click' ? 'click' : 'hover';\n    const placement =\n      step.badge?.placement === 'top' ||\n      step.badge?.placement === 'left' ||\n      step.badge?.placement === 'right'\n        ? step.badge.placement\n        : 'bottom';\n\n    // Marcador (badge): los bloques del usuario. Clickeable/hovereable.\n    const badge = doc.createElement('div');\n    badge.className = 'veo-composite-badge';\n    badge.setAttribute('role', 'button');\n    badge.tabIndex = 0;\n    badge.style.cursor = 'pointer';\n    badge.style.display = 'inline-flex';\n    badge.style.alignItems = 'center';\n    this.buildContent(badge, step.badge?.blocks ?? [], doc, context, idx, [], host);\n    root.appendChild(badge);\n\n    // Tooltip: la card (bloques del paso), oculta hasta el trigger, anclada al badge.\n    // Un tooltip NO es ancho-completo (eso es para modales) → acotamos el ancho\n    // para que se vea como un tooltip y la flecha pueda apuntar bien.\n    if (design.fullWidth === true) {\n      card.style.width = 'auto';\n      card.style.maxWidth = '320px';\n    } else if (!card.style.width && !card.style.maxWidth) {\n      card.style.maxWidth = '320px';\n    }\n    const wrapper = doc.createElement('div');\n    wrapper.className = 'veo-composite-anchored';\n    wrapper.style.display = 'none';\n    const caretEl = design.caret === false ? null : makeCaret(doc, design);\n    if (caretEl) wrapper.appendChild(caretEl);\n    wrapper.appendChild(card);\n    root.appendChild(wrapper);\n\n    // El host va al flujo, junto al ancla → el marcador queda permanente.\n    host.style.display = 'inline-block';\n    const pos = inlinePosOf(step.inlinePosition);\n    insertHost(anchor, host, pos);\n    this.registerCleanup(keepHostAttached(host, anchorSelector, pos));\n\n    let open = false;\n    let stopFloat: (() => void) | null = null;\n    let closeTimer: number | null = null;\n    let shownEmitted = false;\n\n    const openTip = (): void => {\n      if (open) return;\n      open = true;\n      wrapper.style.display = 'block';\n      void anchorPosition(badge, wrapper, caretEl, placement).then((stop) => {\n        if (open) stopFloat = stop;\n        else stop(); // se cerró mientras posicionaba\n      });\n      if (!shownEmitted) {\n        shownEmitted = true;\n        context.onInteraction({ guideId: context.guide.guideId, stepIndex: idx, action: 'shown' });\n      }\n    };\n    const closeTip = (): void => {\n      open = false;\n      wrapper.style.display = 'none';\n      stopFloat?.();\n      stopFloat = null;\n    };\n\n    if (trigger === 'hover') {\n      const cancelClose = (): void => {\n        if (closeTimer !== null) {\n          clearTimeout(closeTimer);\n          closeTimer = null;\n        }\n      };\n      const scheduleClose = (): void => {\n        cancelClose();\n        closeTimer = window.setTimeout(closeTip, 150);\n      };\n      badge.addEventListener('mouseenter', () => {\n        cancelClose();\n        openTip();\n      });\n      badge.addEventListener('mouseleave', scheduleClose);\n      badge.addEventListener('focus', openTip);\n      wrapper.addEventListener('mouseenter', cancelClose);\n      wrapper.addEventListener('mouseleave', scheduleClose);\n    } else {\n      badge.addEventListener('click', () => {\n        if (open) closeTip();\n        else openTip();\n      });\n    }\n\n    this.registerCleanup(() => {\n      stopFloat?.();\n      if (closeTimer !== null) clearTimeout(closeTimer);\n    });\n\n    return closeTip;\n  }\n}\n\nfunction inlinePosOf(p: InlinePosition | null | undefined): InlinePosition {\n  return p === 'before' || p === 'prepend' || p === 'append' ? p : 'after';\n}\n\n/** Fija la card en una esquina/centro del viewport. `hAlign` fuerza izq/der. */\nfunction applyViewportPosition(\n  card: HTMLElement,\n  position: StepPosition,\n  design: Record<string, unknown>,\n): void {\n  const s = card.style;\n  s.position = 'fixed';\n  const M = '16px';\n  const hAlign = design.hAlign === 'left' ? 'left' : design.hAlign === 'right' ? 'right' : null;\n  const v = position.includes('top') ? 'top' : position.includes('bottom') ? 'bottom' : 'middle';\n  // hAlign (Alineación > Horizontal) gana sobre el eje horizontal de la posición.\n  const h =\n    hAlign ??\n    (position.includes('left') ? 'left' : position.includes('right') ? 'right' : 'middle');\n\n  if (v === 'top') s.top = M;\n  else if (v === 'bottom') s.bottom = M;\n  else s.top = '50%';\n\n  if (h === 'left') s.left = M;\n  else if (h === 'right') s.right = M;\n  else s.left = '50%';\n\n  // Transform para centrar el/los ejes que quedaron en 50%.\n  const tx = h === 'middle' ? '-50%' : '0';\n  const ty = v === 'middle' ? '-50%' : '0';\n  s.transform = tx === '0' && ty === '0' ? '' : `translate(${tx}, ${ty})`;\n}\n\n/** Caret (flecha) que apunta al ancla, con el fondo/borde de la card. */\n/** Espacio del ✕ respecto a la esquina elegida (dentro de la tarjeta). */\nconst CLOSE_INSET = '10px';\n\n/**\n * Ubica el ✕ de cierre en una de las 4 esquinas, DENTRO de la tarjeta. Limpia\n * los `top/right` negativos del CSS base (que lo dejaban medio afuera).\n */\nfunction applyClosePosition(btn: HTMLElement, position: string): void {\n  const s = btn.style;\n  s.top = 'auto';\n  s.right = 'auto';\n  s.bottom = 'auto';\n  s.left = 'auto';\n  const vertical = position.includes('bottom') ? 'bottom' : 'top';\n  const horizontal = position.includes('left') ? 'left' : 'right';\n  s.setProperty(vertical, CLOSE_INSET);\n  s.setProperty(horizontal, CLOSE_INSET);\n}\n\nfunction makeCaret(doc: Document, design: Record<string, unknown>): HTMLElement {\n  const caret = doc.createElement('div');\n  caret.className = 'veo-composite-caret';\n  const w = typeof design.caretWidth === 'number' ? design.caretWidth : 12;\n  const h = typeof design.caretHeight === 'number' ? design.caretHeight : 12;\n  const s = caret.style;\n  s.position = 'absolute';\n  s.width = `${w}px`;\n  s.height = `${h}px`;\n  s.transform = 'rotate(45deg)';\n  s.background = typeof design.background === 'string' ? design.background : '#ffffff';\n  if (typeof design.borderWidth === 'number' && design.borderWidth > 0) {\n    const bc = typeof design.borderColor === 'string' ? design.borderColor : '#bbbbbb';\n    s.border = `${design.borderWidth}px solid ${bc}`;\n  }\n  return caret;\n}\n\n/**\n * Eleva el elemento objetivo por encima del backdrop (targetAbove): lo resalta\n * dejándolo visible/clickeable sobre el oscurecido. Devuelve un restore.\n */\nfunction liftTarget(anchor: Element, zIndex: number): () => void {\n  const el = anchor as HTMLElement;\n  const prevPosition = el.style.position;\n  const prevZ = el.style.zIndex;\n  if (getComputedStyle(el).position === 'static') el.style.position = 'relative';\n  el.style.zIndex = String(zIndex);\n  return () => {\n    el.style.position = prevPosition;\n    el.style.zIndex = prevZ;\n  };\n}\n\n/** Ancla la card a un elemento con Floating UI + reposiciona en scroll/resize. */\nasync function anchorPosition(\n  anchor: Element,\n  wrapper: HTMLElement,\n  caret: HTMLElement | null,\n  preferred: 'top' | 'bottom' | 'left' | 'right' = 'bottom',\n): Promise<() => void> {\n  const update = async (): Promise<void> => {\n    const { x, y, placement, middlewareData } = await computePosition(anchor, wrapper, {\n      placement: preferred,\n      strategy: 'fixed',\n      middleware: [\n        offset(caret ? 10 : 8),\n        flip(),\n        shift({ padding: 8 }),\n        ...(caret ? [arrow({ element: caret })] : []),\n      ],\n    });\n    wrapper.style.left = `${x}px`;\n    wrapper.style.top = `${y}px`;\n    if (caret) positionArrow(caret, placement, middlewareData.arrow);\n  };\n  await update();\n  const reposition = (): void => void update();\n  window.addEventListener('scroll', reposition, true);\n  window.addEventListener('resize', reposition);\n  return () => {\n    window.removeEventListener('scroll', reposition, true);\n    window.removeEventListener('resize', reposition);\n  };\n}\n\n/** Aplica el objeto `design` (font/border/bg/padding/margin) como estilos inline. */\nfunction applyCompositeDesign(card: HTMLElement, design: Record<string, unknown>): void {\n  const s = card.style;\n  const px = (v: unknown): string | null =>\n    typeof v === 'number' && Number.isFinite(v) ? `${v}px` : null;\n  const strv = (v: unknown): string | null => (typeof v === 'string' && v ? v : null);\n\n  if (strv(design.background)) s.background = design.background as string;\n  // `color` (panel de estilos nuevo) con fallback `textColor` (guías viejas).\n  const textColor = strv(design.color) ?? strv(design.textColor);\n  if (textColor) s.color = textColor;\n  if (px(design.fontSize)) s.fontSize = px(design.fontSize) as string;\n  if (strv(design.fontWeight)) s.fontWeight = design.fontWeight as string;\n  if (strv(design.fontFamily) && design.fontFamily !== 'inherit') {\n    s.fontFamily = design.fontFamily as string;\n  }\n  if (strv(design.textTransform) && design.textTransform !== 'none') {\n    s.textTransform = design.textTransform as string;\n  }\n  if (typeof design.letterSpacing === 'number') s.letterSpacing = `${design.letterSpacing}px`;\n  if (strv(design.align)) s.textAlign = design.align as string;\n  if (typeof design.lineHeight === 'number') s.lineHeight = `${design.lineHeight}%`;\n  if (px(design.radius)) s.borderRadius = px(design.radius) as string;\n  const bw = px(design.borderWidth);\n  if (bw) s.border = `${bw} solid ${strv(design.borderColor) ?? '#e5e5e5'}`;\n  // Sombra (X Y Blur Spread Color).\n  if (strv(design.shadowColor) || typeof design.shadowBlur === 'number') {\n    const n = (k: string) => (typeof design[k] === 'number' ? (design[k] as number) : 0);\n    s.boxShadow = `${n('shadowX')}px ${n('shadowY')}px ${n('shadowBlur')}px ${n('shadowSpread')}px ${strv(design.shadowColor) ?? 'rgba(0,0,0,0.2)'}`;\n  }\n  // Dimensiones: ancho completo / fijo / fluido.\n  if (design.fullWidth === true) {\n    s.width = '100%';\n  } else if (design.widthType === 'fluid') {\n    s.width = 'auto';\n    if (px(design.width)) s.maxWidth = px(design.width) as string;\n  } else if (px(design.width)) {\n    s.width = px(design.width) as string;\n  }\n  for (const side of ['Top', 'Right', 'Bottom', 'Left'] as const) {\n    const p = px(design[`padding${side}`]);\n    if (p) s.setProperty(`padding-${side.toLowerCase()}`, p);\n    const m = px(design[`margin${side}`]);\n    if (m) s.setProperty(`margin-${side.toLowerCase()}`, m);\n  }\n}\n","import { computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport type { CustomPlacement, GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { mountCustomFrame, toCssSize } from './custom-frame';\n\nconst DEFAULT_PLACEMENT: CustomPlacement = { mode: 'floating', position: 'bottom-right' };\nconst DEFAULT_OFFSET = 16;\nconst DEFAULT_WIDTH = 360;\n\n/**\n * Renderiza una guía `custom` montando el HTML/CSS/JS del cliente en un\n * **iframe sandbox** (ver `custom-frame.ts`). Ubicación: `floating`\n * (esquina/centro del viewport) o `anchored` (Floating UI contra un selector\n * del host). La variante embebida en el flujo es `inline-custom`.\n */\nexport class CustomRenderer extends BaseRenderer {\n  async render(context: GuideRenderContext): Promise<void> {\n    const step = context.guide.guideSteps[0];\n    if (!step || typeof step.html !== 'string' || step.html.length === 0) return;\n\n    const placement: CustomPlacement = step.placement ?? DEFAULT_PLACEMENT;\n\n    let anchor: Element | null = null;\n    if (placement.mode === 'anchored') {\n      const selector =\n        placement.selector ?? step.selector ?? context.guide.activationRules.selector;\n      if (typeof selector !== 'string' || selector.length === 0) return;\n      anchor = await waitForElement(selector);\n      if (!anchor) return; // sin ancla no mostramos (guía fantasma = peor UX)\n    }\n\n    const { root } = this.createHost();\n    const doc = root.ownerDocument ?? document;\n\n    const wrapper = doc.createElement('div');\n    wrapper.className =\n      placement.mode === 'anchored' ? 'veo-custom-anchored' : 'veo-custom-floating';\n\n    const { iframe, cleanup } = mountCustomFrame(doc, step, context, {\n      width: toCssSize(placement.width ?? DEFAULT_WIDTH),\n      fixedHeight: placement.height ?? null,\n    });\n    this.registerCleanup(cleanup);\n\n    wrapper.appendChild(iframe);\n    // Sin ✕ del host: las guías custom controlan su propio cierre desde su HTML\n    // (`window.veo.dismiss()`). Un botón inyectado no encaja con su diseño.\n    root.appendChild(wrapper);\n\n    if (placement.mode === 'floating') {\n      applyFloatingPosition(wrapper, placement);\n    } else if (anchor) {\n      this.registerCleanup(await this.setupAnchoredPosition(anchor, wrapper, placement));\n    }\n\n    context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n  }\n\n  private async setupAnchoredPosition(\n    anchor: Element,\n    wrapper: HTMLElement,\n    placement: CustomPlacement,\n  ): Promise<() => void> {\n    const side = placement.side ?? 'bottom';\n    const update = async (): Promise<void> => {\n      const { x, y } = await computePosition(anchor, wrapper, {\n        placement: side,\n        strategy: 'fixed',\n        middleware: [offset(placement.offsetY ?? 8), flip(), shift({ padding: 8 })],\n      });\n      wrapper.style.left = `${x}px`;\n      wrapper.style.top = `${y}px`;\n    };\n    await update();\n\n    const reposition = (): void => {\n      void update();\n    };\n    window.addEventListener('scroll', reposition, true);\n    window.addEventListener('resize', reposition);\n    return () => {\n      window.removeEventListener('scroll', reposition, true);\n      window.removeEventListener('resize', reposition);\n    };\n  }\n}\n\n/** Fija el wrapper en una esquina/centro del viewport según `position`. */\nfunction applyFloatingPosition(wrapper: HTMLElement, placement: CustomPlacement): void {\n  const position = placement.position ?? 'bottom-right';\n  const ox = `${placement.offsetX ?? DEFAULT_OFFSET}px`;\n  const oy = `${placement.offsetY ?? DEFAULT_OFFSET}px`;\n  const s = wrapper.style;\n\n  if (position === 'center') {\n    s.top = '50%';\n    s.left = '50%';\n    s.transform = 'translate(-50%, -50%)';\n    return;\n  }\n\n  const [vertical, horizontal] = position.split('-');\n  if (vertical === 'top') s.top = oy;\n  else s.bottom = oy;\n\n  if (horizontal === 'left') {\n    s.left = ox;\n  } else if (horizontal === 'right') {\n    s.right = ox;\n  } else {\n    s.left = '50%';\n    s.transform = 'translateX(-50%)';\n  }\n}\n","import { mountFormContent } from '../form-content';\nimport type { GuideRenderContext } from '../types';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía `form` (encuesta/NPS estilo Pendo): backdrop + tarjeta\n * centrada (mismo chrome que el modal) con los campos de `step.fields`.\n * Al enviar, las respuestas viajan vía `context.onFormSubmit` y el backend\n * las mergea como PROPIEDADES (`user_traits`) del usuario que respondió.\n *\n * El contenido (campos/envío/gracias) es compartido con `inline-form`\n * (ver `form-content.ts`); aquí solo va el chrome flotante.\n */\nexport class FormRenderer extends BaseRenderer {\n  render(context: GuideRenderContext): void {\n    const step = context.guide.guideSteps[0];\n    if (!step || (step.fields ?? []).length === 0) return;\n\n    const { root } = this.createHost();\n    this.applyDesign(step.style);\n    const doc = root.ownerDocument ?? document;\n\n    const overlay = doc.createElement('div');\n    overlay.className = 'veo-modal-overlay';\n    const card = doc.createElement('div');\n    card.className = 'veo-modal-card';\n\n    mountFormContent(card, context, doc);\n    overlay.appendChild(card);\n    root.appendChild(overlay);\n\n    const dismiss = (): void => {\n      context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'dismissed' });\n      context.onClose();\n    };\n    overlay.addEventListener('click', (e) => {\n      if (e.target === overlay) dismiss();\n    });\n    const onKey = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') dismiss();\n    };\n    document.addEventListener('keydown', onKey);\n    this.registerCleanup(() => document.removeEventListener('keydown', onKey));\n\n    context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n  }\n}\n","import { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type { GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { mountCustomFrame } from './custom-frame';\n\n/**\n * Guía `inline-custom`: HTML/CSS/JS del cliente (iframe sandbox, ver\n * `custom-frame.ts`) EMBEBIDO en el flujo del DOM, junto a un elemento ancla\n * (`step.selector` + `step.style.inlinePosition`). Como el inline estándar pero\n * con código propio en vez de bloques.\n */\nexport class InlineCustomRenderer extends BaseRenderer {\n  async render(context: GuideRenderContext): Promise<void> {\n    const step = context.guide.guideSteps[0];\n    if (!step || typeof step.html !== 'string' || step.html.length === 0) return;\n\n    const selector = step.selector ?? context.guide.activationRules.selector;\n    if (typeof selector !== 'string' || selector.length === 0) return;\n\n    const anchor = await waitForElement(selector);\n    if (!anchor) return;\n\n    const { host, root } = this.createHost();\n    host.style.display = 'block';\n    const position = readInlinePosition(step.style);\n    insertHost(anchor, host, position);\n    // El framework del host puede borrar el nodo al re-renderizar → watchdog.\n    this.registerCleanup(keepHostAttached(host, selector, position));\n    const doc = root.ownerDocument ?? document;\n\n    const wrapper = doc.createElement('div');\n    wrapper.className = 'veo-custom-inline';\n\n    const { iframe, cleanup } = mountCustomFrame(doc, step, context, { width: '100%' });\n    this.registerCleanup(cleanup);\n\n    wrapper.appendChild(iframe);\n    // Sin ✕ del host: las guías inline-custom cierran desde su propio HTML.\n    root.appendChild(wrapper);\n\n    context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n  }\n}\n","import { mountFormContent } from '../form-content';\nimport { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type { GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía `inline-form`: el MISMO formulario que `form` (campos →\n * props del usuario) pero EMBEBIDO en el flujo del DOM junto a un elemento\n * ancla, como `inline`. `step.selector` = ancla; `step.style.inlinePosition`\n * = dónde insertarse. El contenido compartido vive en `form-content.ts`.\n */\nexport class InlineFormRenderer extends BaseRenderer {\n  async render(context: GuideRenderContext): Promise<void> {\n    const step = context.guide.guideSteps[0];\n    if (!step || (step.fields ?? []).length === 0) return;\n\n    const selector = step.selector ?? context.guide.activationRules.selector;\n    if (typeof selector !== 'string' || selector.length === 0) return;\n\n    const anchor = await waitForElement(selector);\n    if (!anchor) return;\n\n    const { host, root } = this.createHost();\n    // createHost adjuntó el host a <body>; lo movemos al flujo del DOM, junto\n    // al ancla. `display:block` vence el `:host{all:initial}` (que sería inline).\n    host.style.display = 'block';\n    const position = readInlinePosition(step.style);\n    insertHost(anchor, host, position);\n    // El framework del host puede borrar el nodo al re-renderizar → watchdog.\n    this.registerCleanup(keepHostAttached(host, selector, position));\n\n    this.applyDesign(step.style);\n    const doc = root.ownerDocument ?? document;\n\n    const card = doc.createElement('div');\n    card.className = 'veo-inline';\n    mountFormContent(card, context, doc);\n    root.appendChild(card);\n\n    context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n  }\n}\n","import { buildStepContent } from '../block-builder';\nimport { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type { GuideInteractionMetadata, GuideRenderContext, GuideStep } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía `inline`: EMBEBIDA en el flujo del DOM, junto a un\n * elemento ancla (no flota como overlay). A diferencia de modal/banner/tooltip\n * (host fijo/absoluto sobre `body`), aquí el host se mueve al flujo del\n * documento — ocupa su propio espacio en el layout.\n *\n * `step.selector` = elemento ancla; `step.style.inlinePosition`\n * (`before`|`after`|`prepend`|`append`) = dónde insertarse. Single-step.\n */\nexport class InlineRenderer extends BaseRenderer {\n  async render(context: GuideRenderContext): Promise<void> {\n    const step = context.guide.guideSteps[0];\n    if (!step) return;\n\n    const selector = step.selector ?? context.guide.activationRules.selector;\n    if (typeof selector !== 'string' || selector.length === 0) return;\n\n    const anchor = await waitForElement(selector);\n    if (!anchor) return;\n\n    const { host, root } = this.createHost();\n    // createHost adjuntó el host a <body>; lo movemos al flujo del DOM, junto\n    // al ancla. `display:block` vence el `:host{all:initial}` (que sería inline).\n    host.style.display = 'block';\n    const position = readInlinePosition(step.style);\n    insertHost(anchor, host, position);\n    // El framework del host puede borrar el nodo al re-renderizar → watchdog.\n    this.registerCleanup(keepHostAttached(host, selector, position));\n\n    this.applyDesign(step.style);\n    const ownerDocument = root.ownerDocument ?? document;\n\n    const card = ownerDocument.createElement('div');\n    card.className = 'veo-inline';\n\n    const dismiss = (\n      action: 'dismissed' | 'cta_clicked',\n      ctaUrl?: string,\n      meta?: GuideInteractionMetadata,\n    ) => {\n      context.onInteraction({\n        guideId: context.guide.guideId,\n        stepIndex: 0,\n        action,\n        ...(meta ? { metadata: meta } : {}),\n      });\n      if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n      context.onClose();\n    };\n\n    const content = buildStepContent(step, ownerDocument, {\n      onCtaClick: (action, target, meta) => {\n        dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n        if (action === 'guide' && target) context.onOpenGuide?.(target);\n      },\n      onDismiss: () => dismiss('dismissed'),\n    });\n\n    card.appendChild(content);\n    root.appendChild(card);\n\n    // Update in-place (preview): misma ancla/posición → solo cambia contenido.\n    this.liveContainer = card;\n    this.liveContent = content;\n    this.liveKey = `${selector}|${position}`;\n    this.liveBuild = (s) =>\n      buildStepContent(s, ownerDocument, {\n        onCtaClick: (action, target, meta) => {\n          dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n          if (action === 'guide' && target) context.onOpenGuide?.(target);\n        },\n        onDismiss: () => dismiss('dismissed'),\n      });\n\n    context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n  }\n\n  protected override liveKeyOf(step: GuideStep): string {\n    return `${step.selector ?? ''}|${readInlinePosition(step.style)}`;\n  }\n}\n","import { buildStepContent } from '../block-builder';\nimport type { GuideInteractionMetadata, GuideRenderContext, GuideStep } from '../types';\nimport { buildWalkthroughStepContent } from '../walkthrough-block-builder';\nimport { BaseRenderer } from './base-renderer';\n\n/** `style.backdrop === false` = modal sin fondo oscuro (la app queda usable). */\nfunction overlayClassOf(step: GuideStep): string {\n  return step.style?.backdrop === false\n    ? 'veo-modal-overlay veo-modal-overlay--none'\n    : 'veo-modal-overlay';\n}\n\n/**\n * Renderiza una guía de tipo `modal`: backdrop oscuro + tarjeta centrada.\n * Cierra al clickear el backdrop o presionar Escape.\n *\n * Con `style.backdrop === false` no hay fondo: el overlay es transparente y\n * deja pasar el mouse (solo la tarjeta es interactiva) — la modal se comporta\n * como una tarjeta flotante posicionable (posX/posY/width/height).\n *\n * Single-step normal: consume `guideSteps[0]`. Si el contexto trae `nav`\n * (paso de un walkthrough heterogéneo modal→banner→tooltip), consume\n * `guideSteps[nav.stepIndex]`, muestra botones de navegación y delega\n * tracking/avance al controller (backdrop/Esc → `nav.callbacks.onSkip`).\n */\nexport class ModalRenderer extends BaseRenderer {\n  private overlay: HTMLElement | null = null;\n\n  render(context: GuideRenderContext): void {\n    const idx = context.nav?.stepIndex ?? 0;\n    const step = context.guide.guideSteps[idx];\n    if (!step) return;\n\n    const { root } = this.createHost();\n    this.applyDesign(step.style);\n    const ownerDocument = root.ownerDocument ?? document;\n\n    const overlay = ownerDocument.createElement('div');\n    overlay.className = overlayClassOf(step);\n    this.overlay = overlay;\n\n    const card = ownerDocument.createElement('div');\n    card.className = 'veo-modal-card';\n\n    const dismiss = (\n      action: 'dismissed' | 'cta_clicked',\n      ctaUrl?: string,\n      meta?: GuideInteractionMetadata,\n    ) => {\n      context.onInteraction({\n        guideId: context.guide.guideId,\n        stepIndex: idx,\n        action,\n        ...(meta ? { metadata: meta } : {}),\n      });\n      if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n      context.onClose();\n    };\n    // En modo navegación el cierre lo maneja el controller vía onSkip.\n    const onBackdropOrEsc = (): void => {\n      if (context.nav) context.nav.callbacks.onSkip();\n      else dismiss('dismissed');\n    };\n\n    const content = context.nav\n      ? buildWalkthroughStepContent(\n          step,\n          context.nav.stepIndex,\n          context.nav.totalSteps,\n          ownerDocument,\n          context.nav.callbacks,\n        )\n      : buildStepContent(step, ownerDocument, {\n          onCtaClick: (action, target, meta) => {\n            dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n            if (action === 'guide' && target) context.onOpenGuide?.(target);\n          },\n          onDismiss: () => dismiss('dismissed'),\n        });\n\n    card.appendChild(content);\n    overlay.appendChild(card);\n    root.appendChild(overlay);\n\n    // Update in-place (preview del editor) — solo en modo single-step.\n    if (!context.nav) {\n      this.liveContainer = card;\n      this.liveContent = content;\n      this.liveBuild = (s) =>\n        buildStepContent(s, ownerDocument, {\n          onCtaClick: (action, target, meta) => {\n            dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n            if (action === 'guide' && target) context.onOpenGuide?.(target);\n          },\n          onDismiss: () => dismiss('dismissed'),\n        });\n    }\n\n    overlay.addEventListener('click', (e) => {\n      if (e.target === overlay) onBackdropOrEsc();\n    });\n\n    const onKey = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') onBackdropOrEsc();\n    };\n    document.addEventListener('keydown', onKey);\n    this.registerCleanup(() => document.removeEventListener('keydown', onKey));\n\n    // El `shown` de un walkthrough lo emite el controller (step 0) / step_advanced.\n    if (!context.nav) {\n      context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n    }\n  }\n\n  protected override onLiveUpdate(step: GuideStep): void {\n    // El toggle de backdrop desde el editor aplica en vivo, sin remontar.\n    if (this.overlay) this.overlay.className = overlayClassOf(step);\n  }\n\n  override destroy(): void {\n    this.overlay = null;\n    super.destroy();\n  }\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { buildStepContent } from '../block-builder';\nimport type { GuideInteractionMetadata, GuideRenderContext, GuideStep } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { positionArrow } from './floating-arrow';\n\n/**\n * Renderiza una guía tipo `tooltip` anclada a un elemento del host.\n * Espera el ancla con MutationObserver (selector puede no existir aún\n * en SPAs), la posiciona con Floating UI y la re-posiciona en scroll\n * y resize.\n *\n * Si el ancla no aparece dentro del timeout, no muestra nada. Esto es\n * deliberado: las guías \"fantasma\" sin destino son peor UX que no\n * mostrar.\n */\nexport class TooltipRenderer extends BaseRenderer {\n  /** Lado preferido (mutable: el update in-place puede cambiarlo). */\n  private side: 'top' | 'bottom' | 'left' | 'right' = 'bottom';\n  private reposition: (() => void) | null = null;\n\n  async render(context: GuideRenderContext): Promise<void> {\n    const step = context.guide.guideSteps[0];\n    if (!step) return;\n\n    const selector = step.selector ?? context.guide.activationRules.selector;\n    if (typeof selector !== 'string' || selector.length === 0) return;\n\n    const anchor = await waitForElement(selector);\n    if (!anchor) return;\n\n    // Lado preferido del tooltip respecto al ancla (arriba/abajo/izq/der).\n    // `flip()` igual lo reubica si no entra; default `bottom`.\n    const rawSide = (step.style as Record<string, unknown> | null | undefined)?.tooltipPlacement;\n    this.side = rawSide === 'top' || rawSide === 'left' || rawSide === 'right' ? rawSide : 'bottom';\n\n    const { root } = this.createHost();\n    this.applyDesign(step.style);\n    const ownerDocument = root.ownerDocument ?? document;\n\n    const tooltip = ownerDocument.createElement('div');\n    tooltip.className = 'veo-tooltip';\n\n    const dismiss = (\n      action: 'dismissed' | 'cta_clicked',\n      ctaUrl?: string,\n      meta?: GuideInteractionMetadata,\n    ) => {\n      context.onInteraction({\n        guideId: context.guide.guideId,\n        stepIndex: 0,\n        action,\n        ...(meta ? { metadata: meta } : {}),\n      });\n      if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n      context.onClose();\n    };\n\n    const content = buildStepContent(step, ownerDocument, {\n      onCtaClick: (action, target, meta) => {\n        dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n        if (action === 'guide' && target) context.onOpenGuide?.(target);\n      },\n      onDismiss: () => dismiss('dismissed'),\n    });\n\n    tooltip.appendChild(content);\n\n    // Caret que apunta al elemento anclado (se reposiciona junto al tooltip).\n    const arrowEl = ownerDocument.createElement('div');\n    arrowEl.className = 'veo-tooltip-arrow';\n    tooltip.appendChild(arrowEl);\n\n    root.appendChild(tooltip);\n\n    const updatePosition = async (): Promise<void> => {\n      const { x, y, placement, middlewareData } = await computePosition(anchor, tooltip, {\n        placement: this.side,\n        middleware: [offset(10), flip(), shift({ padding: 8 }), arrow({ element: arrowEl })],\n      });\n      tooltip.style.left = `${x}px`;\n      tooltip.style.top = `${y}px`;\n      positionArrow(arrowEl, placement, middlewareData.arrow);\n    };\n\n    await updatePosition();\n\n    const reposition = (): void => {\n      void updatePosition();\n    };\n    this.reposition = reposition;\n    window.addEventListener('scroll', reposition, true);\n    window.addEventListener('resize', reposition);\n    this.registerCleanup(() => {\n      window.removeEventListener('scroll', reposition, true);\n      window.removeEventListener('resize', reposition);\n    });\n\n    // Update in-place (preview del editor): mismo ancla → solo cambia contenido.\n    this.liveContainer = tooltip;\n    this.liveContent = content;\n    this.liveKey = selector;\n    this.liveBuild = (s) =>\n      buildStepContent(s, ownerDocument, {\n        onCtaClick: (action, target, meta) => {\n          dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n          if (action === 'guide' && target) context.onOpenGuide?.(target);\n        },\n        onDismiss: () => dismiss('dismissed'),\n      });\n\n    context.onInteraction({\n      guideId: context.guide.guideId,\n      stepIndex: 0,\n      action: 'shown',\n    });\n  }\n\n  protected override liveKeyOf(step: GuideStep): string {\n    return step.selector ?? '';\n  }\n\n  protected override onLiveUpdate(step: GuideStep): void {\n    const raw = (step.style as Record<string, unknown> | null | undefined)?.tooltipPlacement;\n    this.side = raw === 'top' || raw === 'left' || raw === 'right' ? raw : 'bottom';\n    this.reposition?.();\n  }\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { WALKTHROUGH_STEP_SELECTOR_TIMEOUT_MS } from '../constants';\nimport type { ResolvedGuide, WalkthroughCallbacks } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { buildWalkthroughStepContent } from '../walkthrough-block-builder';\nimport { BaseRenderer } from './base-renderer';\nimport { positionArrow } from './floating-arrow';\n\nexport interface WalkthroughRenderContext {\n  guide: ResolvedGuide;\n  currentStepIndex: number;\n  callbacks: WalkthroughCallbacks;\n}\n\n/**\n * Renderiza UN step de un walkthrough — variante de tooltip con\n * navegación. Se destruye y re-crea por step en lugar de actualizar el\n * DOM en sitio: como cada step puede anclarse a un selector distinto,\n * recomputar todo es más simple y barato que tracking diffs.\n *\n * `render` retorna `boolean` (a diferencia de los demás renderers) para\n * señalar al controller si el ancla apareció a tiempo. Si devuelve\n * `false`, el controller cancela el walkthrough limpiamente.\n */\nexport class WalkthroughRenderer extends BaseRenderer<WalkthroughRenderContext, boolean> {\n  async render(context: WalkthroughRenderContext): Promise<boolean> {\n    const step = context.guide.guideSteps[context.currentStepIndex];\n    if (!step) return false;\n\n    const selector = step.selector ?? context.guide.activationRules.selector;\n    if (typeof selector !== 'string' || selector.length === 0) return false;\n\n    const anchor = await waitForElement(selector, WALKTHROUGH_STEP_SELECTOR_TIMEOUT_MS);\n    if (!anchor) return false;\n\n    const rawSide = (step.style as Record<string, unknown> | null | undefined)?.tooltipPlacement;\n    const side: 'top' | 'bottom' | 'left' | 'right' =\n      rawSide === 'top' || rawSide === 'left' || rawSide === 'right' ? rawSide : 'bottom';\n\n    const { root } = this.createHost();\n    this.applyDesign(step.style);\n    const ownerDocument = root.ownerDocument ?? document;\n\n    const tooltip = ownerDocument.createElement('div');\n    tooltip.className = 'veo-walkthrough';\n\n    const content = buildWalkthroughStepContent(\n      step,\n      context.currentStepIndex,\n      context.guide.guideSteps.length,\n      ownerDocument,\n      context.callbacks,\n    );\n    tooltip.appendChild(content);\n\n    // Caret que apunta al elemento anclado (se reposiciona junto al tooltip).\n    const arrowEl = ownerDocument.createElement('div');\n    arrowEl.className = 'veo-walkthrough-arrow';\n    tooltip.appendChild(arrowEl);\n\n    root.appendChild(tooltip);\n\n    const updatePosition = async (): Promise<void> => {\n      const { x, y, placement, middlewareData } = await computePosition(anchor, tooltip, {\n        placement: side,\n        middleware: [offset(10), flip(), shift({ padding: 8 }), arrow({ element: arrowEl })],\n      });\n      tooltip.style.left = `${x}px`;\n      tooltip.style.top = `${y}px`;\n      positionArrow(arrowEl, placement, middlewareData.arrow);\n    };\n\n    await updatePosition();\n\n    const reposition = (): void => {\n      void updatePosition();\n    };\n    window.addEventListener('scroll', reposition, true);\n    window.addEventListener('resize', reposition);\n    this.registerCleanup(() => {\n      window.removeEventListener('scroll', reposition, true);\n      window.removeEventListener('resize', reposition);\n    });\n\n    return true;\n  }\n}\n","/**\n * Modo preview de guías. Pinta una guía con los MISMOS renderers que el\n * runtime real, pero SIN resolver, cache de frecuencia, estado de\n * walkthrough ni tracking de interacciones. Pensado para el builder\n * no-code del dashboard: ver cómo queda una guía antes de publicarla.\n *\n * No requiere un `VeoClient` ni apiKey — es una función pura sobre el DOM.\n * Solo puede haber UNA preview activa a la vez; abrir otra cierra la\n * anterior (igual que el dashboard al cambiar de guía o de step).\n *\n * Diferencias de comportamiento vs. runtime real (deliberadas):\n *   - Las interacciones NO se reportan al backend.\n *   - `displayFrequency`/`activationRules` (url/trigger/delay) se ignoran:\n *     la preview siempre pinta de inmediato. Solo se respeta el `selector`\n *     del step (o el `activationRules.selector` como fallback) para anclar\n *     tooltips/walkthroughs.\n *   - CTA con `ctaAction: 'url'` sigue abriendo la URL en una pestaña nueva\n *     (igual que en producción) para poder probar el enlace.\n */\nimport { hasDocument } from '../../utils/safe-env';\nimport { BadgeRenderer } from './renderers/badge-renderer';\nimport { BannerRenderer } from './renderers/banner-renderer';\nimport { BaseRenderer } from './renderers/base-renderer';\nimport { CompositeRenderer } from './renderers/composite-renderer';\nimport { CustomRenderer } from './renderers/custom-renderer';\nimport { FormRenderer } from './renderers/form-renderer';\nimport { InlineCustomRenderer } from './renderers/inline-custom-renderer';\nimport { InlineFormRenderer } from './renderers/inline-form-renderer';\nimport { InlineRenderer } from './renderers/inline-renderer';\nimport { ModalRenderer } from './renderers/modal-renderer';\nimport { TooltipRenderer } from './renderers/tooltip-renderer';\nimport { WalkthroughRenderer } from './renderers/walkthrough-renderer';\nimport type {\n  ActivationRules,\n  GuideInteractionEvent,\n  GuideStep,\n  GuideType,\n  ResolvedGuide,\n  WalkthroughCallbacks,\n} from './types';\n\n/** Entrada mínima para previsualizar una guía. */\nexport interface PreviewGuideInput {\n  guideType: GuideType;\n  guideSteps: GuideStep[];\n  /**\n   * Opcional. Solo se usa `activationRules.selector` como fallback del\n   * ancla para tooltip/walkthrough cuando el step no trae su propio\n   * `selector`. El resto de reglas (url/trigger/delay) se ignoran.\n   */\n  activationRules?: Partial<ActivationRules>;\n  /** Nombre mostrado (p.ej. en el `title` del iframe de guías `custom`). */\n  guideName?: string;\n  /**\n   * Solo walkthrough: paso inicial a mostrar (default 0). Lo usa el editor del\n   * dashboard para que la preview salte al paso que se está editando.\n   */\n  startStepIndex?: number;\n  /**\n   * Solo guías form: envío REAL de respuestas. Sin esto, el submit en preview\n   * es un no-op (no escribe props). Lo usa el modo preview-por-link, que sí\n   * guarda en el usuario que responde.\n   */\n  formSubmit?: (answers: Record<string, unknown>) => Promise<boolean>;\n  /** Nota bajo el \"¡Gracias!\" cuando hay `formSubmit` propio. */\n  formSubmitNote?: string;\n}\n\n/** Resultado del primer render de una preview. */\nexport interface PreviewResult {\n  /**\n   * `false` cuando la guía no pudo pintarse — típicamente un\n   * tooltip/walkthrough cuyo `selector` no existe en la página de preview.\n   */\n  rendered: boolean;\n}\n\n/** Handle de una preview activa. */\nexport interface PreviewHandle {\n  /** Cierra y limpia la preview. Idempotente. */\n  close(): void;\n  /** Resuelve cuando el primer render terminó. */\n  ready: Promise<PreviewResult>;\n  /**\n   * Host de la guía activa (o `null` si no hay nada montado). Lo usa el modo\n   * builder para adjuntar la manipulación directa (drag/resize) del editor.\n   */\n  host(): HTMLElement | null;\n}\n\nconst PREVIEW_GUIDE_ID = '__veo_preview__';\n\n/**\n * Orquesta una única preview activa. A diferencia del `GuidesController`,\n * no toca queue, cache ni estado persistido: instancia el renderer y lo\n * monta directo, y maneja localmente la navegación de walkthroughs.\n */\nclass GuidePreviewController {\n  private singleStep: BaseRenderer | null = null;\n  /** Renderer del paso de walkthrough activo (walkthrough tooltip o modal/banner). */\n  private walkthrough: { destroy(): void } | null = null;\n  private walkthroughGuide: ResolvedGuide | null = null;\n  private walkthroughIndex = 0;\n  /** Input de la preview ACTIVA (para formSubmit/nota de forms). */\n  private input: PreviewGuideInput | null = null;\n\n  preview(input: PreviewGuideInput): PreviewHandle {\n    // Update IN-PLACE: si el tipo no cambió y el renderer activo puede\n    // actualizar su contenido (mismo ancla), evitamos remontar — el preview\n    // del editor deja de parpadear en cada tecla.\n    const nextStep = input.guideSteps[0];\n    if (\n      this.singleStep &&\n      this.input &&\n      input.guideType === this.input.guideType &&\n      input.guideType !== 'walkthrough' &&\n      nextStep &&\n      this.singleStep.updateStep(nextStep)\n    ) {\n      this.input = input;\n      return {\n        close: () => this.close(),\n        ready: Promise.resolve({ rendered: true }),\n        host: () => this.activeHost(),\n      };\n    }\n\n    this.close(); // solo una preview a la vez\n    this.input = input;\n\n    const guide = normalize(input);\n    const start = typeof input.startStepIndex === 'number' ? input.startStepIndex : 0;\n    // Composite: la preview muestra el PASO ACTIVO (el que se edita) como paso\n    // único; el CompositeRenderer lee guideSteps[0].\n    if (guide.guideType === 'composite') {\n      const s = Math.min(Math.max(0, start), guide.guideSteps.length - 1);\n      const active = guide.guideSteps[s];\n      if (active) guide.guideSteps = [active];\n      const ready = this.renderSingleStep(guide);\n      return { close: () => this.close(), ready, host: () => this.activeHost() };\n    }\n    const ready =\n      guide.guideType === 'walkthrough'\n        ? this.startWalkthrough(guide, start)\n        : this.renderSingleStep(guide);\n\n    return { close: () => this.close(), ready, host: () => this.activeHost() };\n  }\n\n  /** Host de la guía montada (single-step o paso de walkthrough activo). */\n  activeHost(): HTMLElement | null {\n    if (this.singleStep) return this.singleStep.hostElement();\n    if (this.walkthrough instanceof BaseRenderer) {\n      return this.walkthrough.hostElement();\n    }\n    return null;\n  }\n\n  close(): void {\n    if (this.singleStep) {\n      safeDestroy(this.singleStep);\n      this.singleStep = null;\n    }\n    if (this.walkthrough) {\n      safeDestroy(this.walkthrough);\n      this.walkthrough = null;\n    }\n    this.walkthroughGuide = null;\n    this.walkthroughIndex = 0;\n    this.input = null;\n  }\n\n  private async renderSingleStep(guide: ResolvedGuide): Promise<PreviewResult> {\n    const renderer = createSingleStepRenderer(guide.guideType);\n    if (!renderer) return { rendered: false };\n    this.singleStep = renderer;\n\n    // Los renderers single-step solo emiten `shown` tras montar con éxito\n    // (tooltip/custom esperan a su ancla). Lo usamos como señal de render.\n    let shown = false;\n    try {\n      await renderer.render({\n        guide,\n        onInteraction: (event: GuideInteractionEvent) => {\n          if (event.action === 'shown') shown = true;\n        },\n        onClose: () => this.close(),\n        onTrack: () => {},\n        // Encadenado en preview: no-op — el editor no puede montar otra guía\n        // guardada; el click igual cierra la preview actual (vía onCtaClick).\n        onOpenGuide: () => {},\n        // Preview de forms: por defecto simula el envío SIN escribir props;\n        // el caller puede pasar `formSubmit` real (link de preview).\n        onFormSubmit: this.input?.formSubmit ?? (() => Promise.resolve(true)),\n        isPreview: true,\n        ...(this.input?.formSubmit && this.input.formSubmitNote !== undefined\n          ? { previewNote: this.input.formSubmitNote }\n          : {}),\n      });\n    } catch {\n      this.close();\n      return { rendered: false };\n    }\n\n    // El usuario pudo haber cerrado/reemplazado la preview mientras el render\n    // esperaba el ancla (los renderers async como inline/inline-custom hacen\n    // `await waitForElement` ANTES de insertar su host). En ese caso este\n    // renderer quedó HUÉRFANO: su host ya entró al DOM pero `singleStep` apunta\n    // a otro, así que el `close()` que lo reemplazó no lo borró. Lo destruimos\n    // aquí para no apilar copias fantasma (causa de la guía duplicada).\n    if (this.singleStep !== renderer) {\n      safeDestroy(renderer);\n      return { rendered: false };\n    }\n\n    return { rendered: shown };\n  }\n\n  private async startWalkthrough(guide: ResolvedGuide, startIndex = 0): Promise<PreviewResult> {\n    if (guide.guideSteps.length === 0) return { rendered: false };\n    this.walkthroughGuide = guide;\n    const idx = Math.min(Math.max(0, Math.floor(startIndex)), guide.guideSteps.length - 1);\n    this.walkthroughIndex = idx;\n    const rendered = await this.renderWalkthroughStep(idx);\n    return { rendered };\n  }\n\n  private async renderWalkthroughStep(index: number): Promise<boolean> {\n    const guide = this.walkthroughGuide;\n    if (!guide) return false;\n\n    if (this.walkthrough) {\n      safeDestroy(this.walkthrough);\n      this.walkthrough = null;\n    }\n\n    const callbacks: WalkthroughCallbacks = {\n      onNext: () => {\n        const next = this.walkthroughIndex + 1;\n        if (next >= guide.guideSteps.length) {\n          this.close();\n          return;\n        }\n        this.walkthroughIndex = next;\n        void this.renderWalkthroughStep(next);\n      },\n      onBack: () => {\n        const prev = this.walkthroughIndex - 1;\n        if (prev < 0) return;\n        this.walkthroughIndex = prev;\n        void this.renderWalkthroughStep(prev);\n      },\n      onSkip: () => this.close(),\n      onComplete: () => this.close(),\n    };\n\n    // Walkthrough heterogéneo: el paso puede pedir modal/banner (con navegación).\n    const step = guide.guideSteps[index];\n    const render = (step?.style as Record<string, unknown> | null | undefined)?.render;\n    if (render === 'modal' || render === 'banner') {\n      const renderer = render === 'modal' ? new ModalRenderer() : new BannerRenderer();\n      try {\n        renderer.render({\n          guide,\n          onInteraction: () => {},\n          onClose: () => this.close(),\n          nav: { stepIndex: index, totalSteps: guide.guideSteps.length, callbacks },\n        });\n      } catch {\n        safeDestroy(renderer);\n        return false;\n      }\n      if (this.walkthroughGuide !== guide) {\n        safeDestroy(renderer);\n        return false;\n      }\n      this.walkthrough = renderer;\n      return true;\n    }\n\n    const renderer = new WalkthroughRenderer();\n    let success = false;\n    try {\n      success = await renderer.render({ guide, currentStepIndex: index, callbacks });\n    } catch {\n      success = false;\n    }\n\n    // Misma carrera que en single-step: si otra preview reemplazó esta\n    // mientras esperábamos, no adoptamos el renderer (sería huérfano).\n    if (!success || this.walkthroughGuide !== guide) {\n      safeDestroy(renderer);\n      return false;\n    }\n    this.walkthrough = renderer;\n    return true;\n  }\n}\n\nlet activeController: GuidePreviewController | null = null;\n\n/**\n * Previsualiza una guía en la página actual usando los renderers reales\n * del SDK. Devuelve un handle con `close()` y una promesa `ready`.\n *\n * Pensado para el builder no-code: no necesita `init()` ni apiKey. Abrir\n * una nueva preview cierra automáticamente la anterior.\n *\n * @example\n * ```ts\n * import { previewGuide } from '@veo/sdk';\n *\n * const preview = previewGuide({\n *   guideType: 'modal',\n *   guideSteps: [{ title: 'Hola', content: 'Esto es una preview' }],\n * });\n * const { rendered } = await preview.ready;\n * // ...más tarde:\n * preview.close();\n * ```\n */\nexport function previewGuide(input: PreviewGuideInput): PreviewHandle {\n  if (!hasDocument()) {\n    return { close: () => {}, ready: Promise.resolve({ rendered: false }), host: () => null };\n  }\n  if (!activeController) activeController = new GuidePreviewController();\n  return activeController.preview(input);\n}\n\n/** Cierra la preview activa, si la hay. Idempotente. */\nexport function closeGuidePreview(): void {\n  activeController?.close();\n}\n\n/** Construye un `ResolvedGuide` sintético con defaults inocuos para preview. */\nfunction normalize(input: PreviewGuideInput): ResolvedGuide {\n  const selector = input.activationRules?.selector;\n  const activationRules: ActivationRules = {\n    url: input.activationRules?.url ?? { type: 'prefix', pattern: '/' },\n    trigger: 'immediate',\n    ...(selector !== undefined ? { selector } : {}),\n  };\n\n  return {\n    guideId: PREVIEW_GUIDE_ID,\n    guideName: input.guideName ?? 'Preview',\n    guideType: input.guideType,\n    guideSteps: input.guideSteps,\n    activationRules,\n    displayFrequency: 'always',\n    displayPriority: 0,\n  };\n}\n\nfunction createSingleStepRenderer(type: GuideType): BaseRenderer | null {\n  switch (type) {\n    case 'modal':\n      return new ModalRenderer();\n    case 'banner':\n      return new BannerRenderer();\n    case 'tooltip':\n      return new TooltipRenderer();\n    case 'custom':\n      return new CustomRenderer();\n    case 'inline':\n      return new InlineRenderer();\n    case 'inline-custom':\n      return new InlineCustomRenderer();\n    case 'form':\n      return new FormRenderer();\n    case 'inline-form':\n      return new InlineFormRenderer();\n    case 'badge':\n      return new BadgeRenderer();\n    case 'composite':\n      return new CompositeRenderer();\n    case 'walkthrough':\n      return null;\n    default:\n      return null;\n  }\n}\n\nfunction safeDestroy(renderer: { destroy(): void }): void {\n  try {\n    renderer.destroy();\n  } catch {\n    // swallow — un cleanup roto no debe romper la preview.\n  }\n}\n","import type { StepPageLocation, UrlMatcher } from './types';\n\n/**\n * Matching de URL en CLIENTE (portado del backend `url-matcher.ts`). Lo usa el\n * motor composite para el targeting de página POR-PASO: como cada paso puede\n * apuntar a una página distinta (tours multi-página estilo Pendo), el SDK evalúa\n * la coincidencia en el navegador en cada navegación, no solo el backend.\n *\n * Errores de regex → `false` (no lanza): el patrón se validó al crear, pero una\n * fila corrupta no debe romper el render de una guía ajena.\n */\nexport function matchesUrl(matcher: UrlMatcher, pageUrl: string): boolean {\n  switch (matcher.type) {\n    case 'exact':\n      return matcher.pattern === pageUrl;\n    case 'prefix':\n      return pageUrl.startsWith(matcher.pattern);\n    case 'regex':\n      try {\n        return new RegExp(matcher.pattern).test(pageUrl);\n      } catch {\n        return false;\n      }\n  }\n}\n\n/** ¿El paso composite debe mostrarse en esta URL? Sitewide siempre; page → patrón. */\nexport function stepMatchesPage(\n  loc: StepPageLocation | null | undefined,\n  pageUrl: string,\n): boolean {\n  if (!loc || loc.scope === 'sitewide' || !loc.pattern) return true;\n  return matchesUrl({ type: loc.matchType ?? 'prefix', pattern: loc.pattern }, pageUrl);\n}\n","/** Configuración default de autocaptura. */\nexport const DEFAULT_AUTOCAPTURE_CONFIG = {\n  enabled: true,\n  captureClicks: true,\n  captureSubmits: true,\n  captureChanges: true,\n  maskAllInputs: true,\n  maskAllText: false,\n  throttleMs: 100,\n  maxTextLength: 200,\n  captureElementMetadata: true,\n  captureAncestors: 5,\n} as const;\n\n/** Máximo de niveles de ancestros que se permiten capturar. */\nexport const MAX_ANCESTORS = 10;\n\n/** Selectores que SIEMPRE se ignoran (incluso si el cliente no configura blockSelectors). */\nexport const ALWAYS_BLOCK_SELECTORS = [\n  '[data-veo-ignore]',\n  '.veo-ignore',\n  // Inputs sensibles\n  'input[type=\"password\"]',\n  'input[type=\"email\"]',\n  'input[type=\"tel\"]',\n  'input[type=\"hidden\"]',\n  // Datos de tarjeta\n  '[autocomplete=\"cc-number\"]',\n  '[autocomplete=\"cc-csc\"]',\n  '[autocomplete=\"cc-exp\"]',\n  '[autocomplete=\"cc-name\"]',\n  // Otros campos sensibles típicos\n  '[name*=\"password\" i]',\n  '[name*=\"ssn\" i]',\n  '[name*=\"credit\" i]',\n  '[name*=\"card\" i]',\n  '[id*=\"password\" i]',\n  '[id*=\"ssn\" i]',\n];\n\n/** Atributos sensibles que NUNCA se capturan. */\nexport const SENSITIVE_ATTRIBUTES = ['value', 'data-credit-card', 'data-ssn', 'data-password'];\n\n/** Atributos útiles que SIEMPRE se intentan capturar si existen. */\nexport const PRIORITY_ATTRIBUTES = [\n  'id',\n  'name',\n  'type',\n  'role',\n  'href',\n  'data-action',\n  'data-veo-tag',\n  'data-testid',\n  'aria-label',\n  'aria-labelledby',\n];\n\n/** Regex para detectar clases generadas dinámicamente. Se descartan del selector. */\nexport const HASHED_CLASS_PATTERNS = [\n  /^css-[a-z0-9]{4,}$/i, // emotion, styled-components nuevas\n  /^_[a-z0-9]+_[a-z0-9]{4,}_\\d+$/, // CSS Modules con hash\n  /^[a-z]{2,4}-[a-z0-9]{6,}$/i, // Tailwind JIT (a veces)\n  /^[a-f0-9]{6,}$/i, // hashes hex puros\n  /^sc-[a-z0-9]+$/i, // styled-components legacy\n];\n\n/** Eventos sintéticos/internos que ignoramos. */\nexport const IGNORED_EVENT_PROPERTIES = ['$autocapture', 'pageview'];\n","import { HASHED_CLASS_PATTERNS } from './constants';\n\n/** Determina si una clase parece generada dinámicamente (hash de CSS-in-JS, etc.). */\nexport function isHashedClass(className: string): boolean {\n  return HASHED_CLASS_PATTERNS.some((pattern) => pattern.test(className));\n}\n\n/** Filtra las clases de un elemento para quedarse solo con las \"humanas\" (estables). */\nexport function filterHumanClasses(element: Element): string[] {\n  return Array.from(element.classList).filter((c) => !isHashedClass(c) && c.length < 64);\n}\n\n/**\n * Atributos estables y semánticos que identifican un elemento mejor que sus\n * clases utilitarias (que cambian con el styling). Orden = prioridad. Producen\n * selectores legibles tipo `button[aria-label=\"Abrir menú\"]` que el usuario\n * puede escribir/reconocer en el editor de segmentos.\n */\nconst STABLE_ATTRIBUTES = [\n  'data-testid',\n  'data-test',\n  'data-cy',\n  'name',\n  'aria-label',\n  'placeholder',\n  'alt',\n  'title',\n  // `href` identifica muy bien a los links (`<a>`), un target frecuente de\n  // autocapture; va después de los atributos semánticos pero antes de los\n  // genéricos. Valores largos (URLs absolutas con query) se descartan por\n  // MAX_ATTR_VALUE_LENGTH.\n  'href',\n  'role',\n  'type',\n] as const;\n\n/** Valores de atributo más largos que esto se descartan (no son buenos selectores). */\nconst MAX_ATTR_VALUE_LENGTH = 100;\n\n/** Escape básico de caracteres especiales en CSS (usa CSS.escape si está disponible). */\nfunction cssEscape(value: string): string {\n  if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\n    return CSS.escape(value);\n  }\n  return value.replace(/[!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~]/g, '\\\\$&');\n}\n\n/**\n * Escape para un valor que va DENTRO de comillas en `[attr=\"...\"]`. A diferencia\n * de `cssEscape`, no escapa espacios ni acentos (las comillas ya los cubren):\n * solo `\\` y `\"`. Así el valor queda igual al texto real y el match por substring\n * del backend funciona con lo que el usuario escribe.\n */\nfunction escapeAttrValue(value: string): string {\n  return value.replace(/[\\\\\"]/g, '\\\\$&');\n}\n\n/** Devuelve un selector por atributo estable si el elemento tiene alguno. */\nfunction stableAttributeSelector(element: Element, tag: string): string | null {\n  for (const attr of STABLE_ATTRIBUTES) {\n    const value = element.getAttribute(attr);\n    if (value && value.length > 0 && value.length <= MAX_ATTR_VALUE_LENGTH) {\n      return `${tag}[${attr}=\"${escapeAttrValue(value)}\"]`;\n    }\n  }\n  return null;\n}\n\n/** Construye un selector simple y estable para UN elemento. */\nfunction buildElementSelector(element: Element): string {\n  const tag = element.tagName.toLowerCase();\n\n  // 1. `data-veo-tag`: el nombre semántico que da el cliente. Máxima prioridad.\n  const veoTag = element.getAttribute('data-veo-tag');\n  if (veoTag) {\n    return `${tag}[data-veo-tag=\"${escapeAttrValue(veoTag)}\"]`;\n  }\n\n  // 2. `id`: único y estable. Lo combinamos con clases humanas (como antes).\n  if (element.id) {\n    const classes = filterHumanClasses(element);\n    const classPart = classes.length > 0 ? `.${classes.map(cssEscape).join('.')}` : '';\n    return `${tag}#${cssEscape(element.id)}${classPart}`;\n  }\n\n  // 3. Atributo estable (aria-label, name, type, role…): más robusto que clases.\n  const attrSelector = stableAttributeSelector(element, tag);\n  if (attrSelector) return attrSelector;\n\n  // 4. Fallback: clases humanas.\n  const classes = filterHumanClasses(element);\n  const classPart = classes.length > 0 ? `.${classes.map(cssEscape).join('.')}` : '';\n  return `${tag}${classPart}`;\n}\n\n/** Construye un selector CSS legible y razonablemente estable para el elemento. */\nexport function buildSelectorPath(element: Element, maxAncestors = 5): string {\n  const parts: string[] = [];\n  let current: Element | null = element;\n  let depth = 0;\n\n  while (current && current !== document.documentElement && depth <= maxAncestors) {\n    parts.unshift(buildElementSelector(current));\n    current = current.parentElement;\n    depth++;\n  }\n\n  return parts.join(' > ');\n}\n"]}