{"version":3,"sources":["../src/utils/safe-env.ts","../src/core/builder-constants.ts","../src/core/preview-loader.ts","../src/core/builder-token.ts","../src/plugins/autocapture/constants.ts","../src/plugins/autocapture/selector-builder.ts","../src/utils/uuid.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/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/url-match.ts","../src/plugins/guides/guide-preview.ts","../src/plugins/builder/block-drop-target.ts","../src/plugins/builder/bridge-protocol.ts","../src/plugins/builder/builder-panel.ts","../src/plugins/builder/design-manipulator.ts","../src/plugins/builder/element-picker.ts","../src/plugins/builder/builder-mode.ts","../src/plugins/builder/builder-session.ts","../src/plugins/builder/index.ts","../src/contract/v1.ts","../src/core/api-url.ts","../src/core/builder-loader.ts","../src/index.ts","../src/plugins/plugin.ts","../src/plugins/autocapture/dom-listener.ts","../src/plugins/autocapture/element-serializer.ts","../src/plugins/autocapture/pii-guard.ts","../src/plugins/autocapture/throttle.ts","../src/plugins/autocapture/index.ts","../src/plugins/spa-router.ts","../src/core/client.ts","../src/core/queue.ts","../src/core/session.ts","../src/core/storage.ts","../src/core/transport.ts","../src/core/setup.ts","../src/plugins/guides/index.ts","../src/plugins/guides/guides-controller.ts","../src/plugins/guides/guide-frequency-cache.ts","../src/plugins/guides/guide-resolver-client.ts","../src/plugins/guides/guide-tracker-client.ts","../src/plugins/guides/guide-tracker-queue.ts","../src/plugins/guides/walkthrough-state.ts","../src/plugins/guides/preview-mode.ts"],"names":["session","classes","classPart","init_constants","rebuilt","nodes","clamp","computePosition","offset","flip","shift","arrow","active","node","ready","renderer","MIN_W","MIN_H","isInteractive","END_USER_ID_KEY","RETRY_MAX_DELAY_MS"],"mappings":"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A;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;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,EAuGb,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EA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","file":"index.cjs","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 * Nombres de los query params del puente builder. Constantes PURAS (sin DOM ni\n * `window`) para poder compartirlas entre el core (browser: `builder-token.ts`)\n * y el helper de servidor `veo-sdk/next` (`src/next.ts`), sin arrastrar código de\n * navegador al bundle de servidor.\n */\n\n/** Token de correlación del handshake. */\nexport const BUILDER_TOKEN_PARAM = 'veoBuilder';\n/** Origen del dashboard de Veo (para postMessage / frame-ancestors). */\nexport const BUILDER_ORIGIN_PARAM = 'veoBuilderOrigin';\n/** `1` → modo \"panel inyectado\": la app es top-level y el editor se inyecta encima. */\nexport const BUILDER_PANEL_PARAM = 'veoBuilderPanel';\n/** Path del panel del editor en el dashboard (default `/guides/design`). */\nexport const BUILDER_PANEL_PATH_PARAM = 'veoBuilderPanelPath';\n/** Id de la guía que se está editando (para cargar/guardar en el panel). */\nexport const BUILDER_GUIDE_PARAM = 'veoGuide';\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","/** 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","/**\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","/** 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","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","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","/**\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","/**\n * Drop-target de bloques sobre la preview (editor in-app).\n *\n * El autor arrastra un bloque de la paleta del panel (iframe del dashboard) y\n * lo suelta SOBRE la guía pintada en la app. El drag & drop HTML5 cruza\n * iframes de forma nativa, así que acá solo escuchamos `dragover`/`drop` en el\n * host de la guía, mostramos una línea de inserción entre bloques y avisamos\n * dónde cayó (el panel inserta el bloque en su estado y re-previsualiza).\n *\n * Contrato con el panel: el MIME `application/x-veo-block`. El `dragstart` de\n * la paleta lo setea con el tipo de bloque; durante `dragover` solo los TYPES\n * del dataTransfer son visibles (el valor recién se puede leer en el `drop`) —\n * alcanza para filtrar drags ajenos.\n *\n * La posición se expresa como `beforeIndex`: índice del bloque del paso ANTES\n * del cual insertar (`null` = al final). Los renderers estampan\n * `data-veo-idx` en cada elemento top-level con el índice ORIGINAL dentro de\n * `step.blocks[]` (una fila de botones agrupados lleva el del primero), así el\n * índice sobrevive a bloques filtrados u ocultos (p.ej. botones en pasos de\n * tour).\n */\n\nexport const VEO_BLOCK_MIME = 'application/x-veo-block';\n\n/** Dónde soltó el autor un bloque nuevo. */\nexport interface BlockDropPayload {\n  stepIndex: number;\n  /** Tipo de bloque arrastrado (title/text/button/image — lo valida el panel). */\n  blockType: string;\n  /** Índice del bloque ANTES del cual insertar; `null` = al final. */\n  beforeIndex: number | null;\n}\n\nexport interface BlockDropTargetHandle {\n  /**\n   * Drag por POINTER (el camino principal): el panel manda las coordenadas del\n   * puntero ya convertidas a la página de la app. Muestra/mueve la línea de\n   * inserción; devuelve `true` si el punto está sobre la guía.\n   */\n  hoverAt(x: number, y: number): boolean;\n  /**\n   * Suelta en esas coordenadas: devuelve el punto de inserción, o `null` si el\n   * puntero no estaba sobre la guía (el drop se descarta). Siempre borra la línea.\n   */\n  dropAt(x: number, y: number): { beforeIndex: number | null } | null;\n  /** Cancela el hover (borra la línea sin soltar). */\n  cancelHover(): void;\n  detach(): void;\n}\n\ninterface AttachOptions {\n  host: HTMLElement;\n  stepIndex: number;\n  onDrop: (payload: BlockDropPayload) => void;\n}\n\n/** Punto de inserción calculado bajo el cursor. */\ninterface DropSpot {\n  beforeIndex: number | null;\n  /** Coordenada Y (viewport) de la línea indicadora. */\n  y: number;\n  rect: DOMRect;\n}\n\n/**\n * Adjunta el drop-target al host de la guía en preview. Devuelve un handle\n * para desmontarlo (cambio de preview / cierre del editor).\n */\nexport function attachBlockDropTarget(options: AttachOptions): BlockDropTargetHandle {\n  const { host, stepIndex, onDrop } = options;\n  const doc = host.ownerDocument;\n  let line: HTMLElement | null = null;\n  let spot: DropSpot | null = null;\n\n  const contentEl = (): HTMLElement | null =>\n    host.shadowRoot?.querySelector<HTMLElement>('.veo-guide-content') ?? null;\n\n  /** Hijos top-level que representan bloques (estampados por los renderers). */\n  const blockChildren = (container: HTMLElement): HTMLElement[] =>\n    Array.from(container.children).filter(\n      (el): el is HTMLElement => el instanceof HTMLElement && el.dataset.veoIdx !== undefined,\n    );\n\n  const hideLine = (): void => {\n    line?.remove();\n    line = null;\n    spot = null;\n  };\n\n  const showLine = (at: DropSpot): void => {\n    if (!line) {\n      line = doc.createElement('div');\n      // Inline (no hay hoja de estilos del builder en el shadow de la guía).\n      line.style.cssText =\n        'position:fixed;height:3px;border-radius:2px;background:#FF5B35;' +\n        'box-shadow:0 0 0 1px rgba(255,255,255,0.65);pointer-events:none;z-index:2147483647;';\n      host.shadowRoot?.appendChild(line);\n    }\n    line.style.left = `${at.rect.left + 4}px`;\n    line.style.width = `${Math.max(0, at.rect.width - 8)}px`;\n    line.style.top = `${at.y - 1.5}px`;\n  };\n\n  const isBlockDrag = (event: DragEvent): boolean => {\n    const types = event.dataTransfer?.types;\n    return !!types && Array.from(types).includes(VEO_BLOCK_MIME);\n  };\n\n  /** Margen alrededor del contenido dentro del cual el drop sigue activo. */\n  const NEAR_PX = 48;\n\n  /** Boundary de inserción más cercano al cursor (por el eje Y). */\n  const locate = (clientY: number): DropSpot | null => {\n    const container = contentEl();\n    if (!container) return null;\n    const rect = container.getBoundingClientRect();\n    const kids = blockChildren(container);\n    let beforeIndex: number | null = null;\n    let y = kids.length === 0 ? rect.top + rect.height / 2 : 0;\n    for (const kid of kids) {\n      const r = kid.getBoundingClientRect();\n      if (clientY < r.top + r.height / 2) {\n        const idx = Number(kid.dataset.veoIdx);\n        beforeIndex = Number.isFinite(idx) ? idx : null;\n        y = r.top;\n        break;\n      }\n      y = r.bottom; // el cursor quedó debajo: candidato \"después del último\"\n    }\n    return { beforeIndex, y, rect };\n  };\n\n  /** ¿El punto está sobre (o cerca de) el contenido de la guía? */\n  const overContent = (x: number, y: number, rect: DOMRect): boolean =>\n    x >= rect.left - NEAR_PX &&\n    x <= rect.right + NEAR_PX &&\n    y >= rect.top - NEAR_PX &&\n    y <= rect.bottom + NEAR_PX;\n\n  const hoverAt = (x: number, y: number): boolean => {\n    const at = locate(y);\n    if (!at || !overContent(x, y, at.rect)) {\n      hideLine();\n      return false;\n    }\n    spot = at;\n    showLine(at);\n    return true;\n  };\n\n  const dropAt = (x: number, y: number): { beforeIndex: number | null } | null => {\n    const at = locate(y);\n    hideLine();\n    if (!at || !overContent(x, y, at.rect)) return null;\n    return { beforeIndex: at.beforeIndex };\n  };\n\n  const onDragOver = (event: DragEvent): void => {\n    if (!isBlockDrag(event)) return;\n    const at = locate(event.clientY);\n    if (!at) return;\n    event.preventDefault(); // habilita el drop\n    if (event.dataTransfer) event.dataTransfer.dropEffect = 'copy';\n    spot = at;\n    showLine(at);\n  };\n\n  const onDropEvent = (event: DragEvent): void => {\n    if (!isBlockDrag(event)) return;\n    event.preventDefault();\n    const blockType = event.dataTransfer?.getData(VEO_BLOCK_MIME) ?? '';\n    const at = spot ?? locate(event.clientY);\n    hideLine();\n    if (!blockType || !at) return;\n    onDrop({ stepIndex, blockType, beforeIndex: at.beforeIndex });\n  };\n\n  const onDragLeave = (event: DragEvent): void => {\n    // Solo al salir del host de verdad (los cruces internos del shadow se\n    // re-targetean al host y no llegan acá).\n    const to = event.relatedTarget;\n    if (to instanceof Node && (to === host || host.contains(to))) return;\n    hideLine();\n  };\n\n  host.addEventListener('dragover', onDragOver);\n  host.addEventListener('drop', onDropEvent);\n  host.addEventListener('dragleave', onDragLeave);\n\n  return {\n    hoverAt,\n    dropAt,\n    cancelHover: hideLine,\n    detach(): void {\n      host.removeEventListener('dragover', onDragOver);\n      host.removeEventListener('drop', onDropEvent);\n      host.removeEventListener('dragleave', onDragLeave);\n      hideLine();\n    },\n  };\n}\n","/**\n * Contrato de mensajes del puente builder (app del cliente ↔ dashboard).\n * Ambos lados validan `event.origin` y que `token` coincida antes de actuar.\n *\n * Flujo:\n *   1. El dashboard abre la app con `?veoBuilder=<token>&veoBuilderOrigin=<origen>`.\n *   2. La app (veo-builder.js) postea `ready` a la ventana que la abrió.\n *   3. El dashboard manda comandos (`start-picker`, `preview`, …).\n *   4. La app responde con eventos (`picked`, `pick-cancelled`, …).\n */\nimport type { PreviewGuideInput } from '../guides/guide-preview';\nimport type { BlockDropPayload } from './block-drop-target';\nimport type { DesignPatch } from './design-manipulator';\nimport type { PickedElement } from './element-picker';\n\nexport const VEO_BUILDER_SOURCE = 'veo-builder';\n// Los nombres de los query params viven en el core (`builder-token.ts`), única\n// fuente de verdad compartida con el loader y el gate del runtime de guías.\nexport { BUILDER_ORIGIN_PARAM, BUILDER_TOKEN_PARAM } from '../../core/builder-token';\n\n/** Eventos que la app del cliente envía al dashboard. */\nexport type BuilderEvent =\n  | { type: 'ready' }\n  | { type: 'picked'; payload: PickedElement }\n  | { type: 'pick-cancelled' }\n  // Manipulación directa: el autor arrastró/redimensionó la guía en la app;\n  // el panel mergea `payload.style` sobre el `style` del paso indicado.\n  | { type: 'design-updated'; payload: DesignPatch }\n  // Drag & drop de bloques: el autor soltó un bloque de la paleta SOBRE la\n  // guía en preview; el panel lo inserta en `step.blocks[]` en esa posición.\n  | { type: 'block-dropped'; payload: BlockDropPayload }\n  | { type: 'closed' };\n\n/** Comandos que el dashboard/panel envía a la app del cliente. */\nexport type BuilderCommand =\n  | { type: 'start-picker'; maxAncestors?: number; hint?: string }\n  | { type: 'stop-picker' }\n  // `editable: true` (editor in-app) adjunta drag/resize sobre la preview.\n  | { type: 'preview'; guide: PreviewGuideInput; editable?: boolean }\n  // Drag de un bloque de la paleta POR POINTER (el DnD HTML5 no cruza bien el\n  // iframe del panel): el panel captura el puntero y streamea sus coordenadas\n  // RELATIVAS AL IFRAME; la app las convierte con el rect del panel, mueve la\n  // línea de inserción y en `drop` responde con el evento `block-dropped`.\n  | {\n      type: 'block-drag';\n      phase: 'move' | 'drop' | 'cancel';\n      x: number;\n      y: number;\n      blockType: string;\n      label?: string;\n    }\n  | { type: 'close-preview' }\n  | { type: 'teardown' }\n  // Modo panel inyectado: el panel avisa que cargó y está listo para recibir\n  // eventos; la app responde con `ready`. Resuelve la carrera de que el iframe\n  // del panel todavía no tenga su listener cuando la app postea `ready`.\n  | { type: 'panel-ready' };\n\n/** Sobre común: todo mensaje del puente lleva `source` + `token`. */\nexport interface BuilderEnvelope {\n  source: typeof VEO_BUILDER_SOURCE;\n  token: string;\n}\n\nexport type BuilderEventMessage = BuilderEnvelope & BuilderEvent;\nexport type BuilderCommandMessage = BuilderEnvelope & BuilderCommand;\n","/**\n * Modo \"panel inyectado\" (editor en la pestaña de la app).\n *\n * La app es la pestaña top-level (login real) y el editor de Veo se inyecta\n * ENCIMA como una tarjeta flotante **arrastrable y redimensionable** (un iframe\n * al dashboard). Además se puede **sacar a una ventana independiente** del\n * navegador (\"pop-out\").\n *\n * El panel corre en el origen del dashboard (sesión de Veo para guardar guías) y\n * habla con la app (`window.parent` si está anclado, `window.opener` si está en\n * ventana aparte) por el puente postMessage. Este módulo inyecta/gestiona el\n * panel y expone su ventana destino.\n */\nimport { hasDocument, hasWindow } from '../../utils/safe-env';\n\nconst DEFAULT_PANEL_PATH = '/guides/design';\nconst PANEL_W = 400;\nconst PANEL_H = 640;\nconst MIN_W = 320;\nconst MIN_H = 320;\nconst MARGIN = 16;\n\nexport interface BuilderPanelOptions {\n  dashboardOrigin: string;\n  token: string;\n  appOrigin: string;\n  guide: string | null;\n  panelPath: string | null;\n  onClose: () => void;\n}\n\nexport interface BuilderPanelHandle {\n  /** Ventana destino de los mensajes: el iframe anclado o la ventana pop-out. */\n  target(): Window | null;\n  /**\n   * Rect del IFRAME del panel en coordenadas de la página de la app, o `null`\n   * si el editor está en pop-out (ventana aparte: no hay mapeo de coordenadas).\n   * Lo usa el drag de bloques para convertir el puntero panel → página.\n   */\n  frameRect(): DOMRect | null;\n  /** Quita el panel del DOM (y cierra la ventana pop-out si hay). */\n  teardown(): void;\n}\n\n/** Inyecta el panel del editor (arrastrable, redimensionable, pop-out). */\nexport function injectBuilderPanel(opts: BuilderPanelOptions): BuilderPanelHandle {\n  if (!hasWindow() || !hasDocument()) {\n    return { target: () => null, frameRect: () => null, teardown: () => {} };\n  }\n\n  const panelUrl = buildPanelUrl(opts);\n\n  const host = document.createElement('div');\n  host.setAttribute('data-veo-builder-panel', '');\n  const shadow = host.attachShadow({ mode: 'open' });\n\n  const style = document.createElement('style');\n  style.textContent = PANEL_CSS;\n\n  const card = document.createElement('div');\n  card.className = 'veo-panel';\n  let left = Math.max(MARGIN, window.innerWidth - PANEL_W - MARGIN);\n  let top = MARGIN;\n  card.style.left = `${left}px`;\n  card.style.top = `${top}px`;\n  card.style.width = `${PANEL_W}px`;\n  card.style.height = `${PANEL_H}px`;\n\n  // Header: título + pop-out + cerrar.\n  const header = document.createElement('div');\n  header.className = 'veo-panel-header';\n  const title = document.createElement('span');\n  title.className = 'veo-panel-title';\n  title.textContent = 'OnUser · Editor';\n  const actions = document.createElement('div');\n  actions.className = 'veo-panel-actions';\n  const popout = document.createElement('button');\n  popout.className = 'veo-panel-btn';\n  popout.type = 'button';\n  popout.title = 'Abrir en ventana aparte';\n  popout.setAttribute('aria-label', 'Abrir en ventana aparte');\n  popout.textContent = '⧉';\n  const close = document.createElement('button');\n  close.className = 'veo-panel-btn veo-panel-close';\n  close.type = 'button';\n  close.title = 'Cerrar';\n  close.setAttribute('aria-label', 'Cerrar');\n  close.textContent = '✕';\n  actions.append(popout, close);\n  header.append(title, actions);\n\n  const iframe = document.createElement('iframe');\n  iframe.className = 'veo-panel-frame';\n  iframe.title = 'Editor de Veo';\n  iframe.src = panelUrl;\n\n  const grip = document.createElement('div');\n  grip.className = 'veo-panel-resize';\n  grip.setAttribute('aria-hidden', 'true');\n\n  card.append(header, iframe, grip);\n  shadow.append(style, card);\n  document.body.appendChild(host);\n\n  // ── Pop-out: sacar el editor a una ventana independiente ────────────────\n  let popped: Window | null = null;\n  let pollTimer: ReturnType<typeof setInterval> | undefined;\n\n  const stopPoll = (): void => {\n    if (pollTimer !== undefined) {\n      clearInterval(pollTimer);\n      pollTimer = undefined;\n    }\n  };\n\n  close.addEventListener('click', () => opts.onClose());\n  popout.addEventListener('click', () => {\n    const win = window.open(\n      panelUrl,\n      'veo-editor',\n      `popup,width=${Math.round(card.offsetWidth)},height=${Math.round(card.offsetHeight) + 60}`,\n    );\n    if (!win) return; // bloqueado por el navegador\n    popped = win;\n    card.style.display = 'none'; // el editor ahora vive en la ventana aparte\n    pollTimer = setInterval(() => {\n      if (popped?.closed) {\n        stopPoll();\n        opts.onClose(); // cerrar la ventana = salir del modo editor\n      }\n    }, 600);\n  });\n\n  // ── Arrastre por el header ──────────────────────────────────────────────\n  header.addEventListener('mousedown', (e) => {\n    if ((e.target as HTMLElement)?.classList.contains('veo-panel-btn')) return;\n    e.preventDefault();\n    const sx = e.clientX;\n    const sy = e.clientY;\n    const ol = left;\n    const ot = top;\n    iframe.style.pointerEvents = 'none';\n    const move = (ev: MouseEvent): void => {\n      left = clamp(ol + (ev.clientX - sx), 0, Math.max(0, window.innerWidth - card.offsetWidth));\n      top = clamp(ot + (ev.clientY - sy), 0, Math.max(0, window.innerHeight - 40));\n      card.style.left = `${left}px`;\n      card.style.top = `${top}px`;\n    };\n    const up = (): void => {\n      window.removeEventListener('mousemove', move);\n      window.removeEventListener('mouseup', up);\n      iframe.style.pointerEvents = '';\n    };\n    window.addEventListener('mousemove', move);\n    window.addEventListener('mouseup', up);\n  });\n\n  // ── Redimensionar por el grip (esquina inferior derecha) ────────────────\n  grip.addEventListener('mousedown', (e) => {\n    e.preventDefault();\n    e.stopPropagation();\n    const sx = e.clientX;\n    const sy = e.clientY;\n    const sw = card.offsetWidth;\n    const sh = card.offsetHeight;\n    iframe.style.pointerEvents = 'none';\n    const move = (ev: MouseEvent): void => {\n      card.style.width = `${clamp(sw + (ev.clientX - sx), MIN_W, window.innerWidth)}px`;\n      card.style.height = `${clamp(sh + (ev.clientY - sy), MIN_H, window.innerHeight)}px`;\n    };\n    const up = (): void => {\n      window.removeEventListener('mousemove', move);\n      window.removeEventListener('mouseup', up);\n      iframe.style.pointerEvents = '';\n    };\n    window.addEventListener('mousemove', move);\n    window.addEventListener('mouseup', up);\n  });\n\n  return {\n    target: () => (popped && !popped.closed ? popped : iframe.contentWindow),\n    frameRect: () => (popped && !popped.closed ? null : iframe.getBoundingClientRect()),\n    teardown: () => {\n      stopPoll();\n      if (popped && !popped.closed) popped.close();\n      host.remove();\n    },\n  };\n}\n\nfunction clamp(v: number, min: number, max: number): number {\n  return Math.min(Math.max(v, min), max);\n}\n\nfunction buildPanelUrl(opts: BuilderPanelOptions): string {\n  const path = opts.panelPath ?? DEFAULT_PANEL_PATH;\n  const url = new URL(path, opts.dashboardOrigin);\n  url.searchParams.set('veoToken', opts.token);\n  url.searchParams.set('veoApp', opts.appOrigin);\n  if (opts.guide) url.searchParams.set('veoGuide', opts.guide);\n  return url.toString();\n}\n\nconst PANEL_CSS = `\n:host { all: initial; }\n.veo-panel {\n  position: fixed;\n  min-width: ${MIN_W}px; min-height: ${MIN_H}px;\n  max-width: 96vw; max-height: 94vh;\n  display: flex; flex-direction: column;\n  background: #fff;\n  border-radius: 12px;\n  box-shadow: 0 12px 40px rgba(0,0,0,0.28);\n  overflow: hidden;\n  z-index: 2147483647;\n  font-family: system-ui, -apple-system, sans-serif;\n}\n.veo-panel-header {\n  flex: 0 0 auto;\n  display: flex; align-items: center; justify-content: space-between;\n  padding: 8px 10px 8px 12px;\n  background: #1b1714; color: #f7f1eb;\n  font-size: 13px; font-weight: 600;\n  cursor: grab;\n}\n.veo-panel-header:active { cursor: grabbing; }\n.veo-panel-actions { display: flex; gap: 2px; }\n.veo-panel-btn {\n  border: 0; background: transparent; color: #fff;\n  font-size: 14px; cursor: pointer; line-height: 1;\n  padding: 4px 7px; border-radius: 6px;\n}\n.veo-panel-btn:hover { background: rgba(255,255,255,0.15); }\n.veo-panel-frame { flex: 1 1 auto; width: 100%; border: 0; background: #fff; }\n.veo-panel-resize {\n  position: absolute; right: 0; bottom: 0;\n  width: 16px; height: 16px;\n  cursor: nwse-resize;\n  background:\n    linear-gradient(135deg, transparent 50%, rgba(0,0,0,0.25) 50%, rgba(0,0,0,0.25) 60%,\n    transparent 60%, transparent 72%, rgba(0,0,0,0.25) 72%, rgba(0,0,0,0.25) 82%, transparent 82%);\n}\n`;\n","/**\n * Manipulación DIRECTA del diseño en modo editor: arrastrar la tarjeta de una\n * modal para posicionarla, redimensionarla desde bordes/esquinas, y arrastrar\n * un banner para alternar top/bottom. Vive en el bundle builder (veo-builder.js)\n * — el runtime de guías no carga nada de esto.\n *\n * Funciona como DECORATOR: se adjunta DESPUÉS del render sobre el shadow root\n * abierto del host de la guía (no toca los renderers). Durante el gesto aplica\n * las variables CSS localmente (feedback a 60fps, sin postMessage); al soltar\n * (`pointerup`) emite UN `onCommit(patch)` con los valores finales, que el\n * builder-mode postea al panel como `design-updated`. El panel actualiza su\n * estado y re-manda `preview` — que entra por el update in-place con las\n * MISMAS variables → no hay loop ni parpadeo.\n *\n * Geometría del modal (ver styles.ts): la card usa `left: posX%` +\n * `translate(-posX%)`, o sea `cardLeft = posX * (viewportW - cardW)` →\n * `posX = cardLeft / (viewportW - cardW)`. Mismo modelo que serializa el\n * dashboard (`style.posX/posY` en 0..1) y consume `applyDesignVars`.\n */\nimport type { GuideType } from '../guides/types';\n\n/** Merge superficial sobre `step.style` del paso activo (lo aplica el panel). */\nexport interface DesignPatch {\n  stepIndex: number;\n  style: {\n    posX?: number;\n    posY?: number;\n    width?: number;\n    height?: number;\n    position?: 'top' | 'bottom';\n  };\n}\n\nexport interface DesignManipulatorOptions {\n  /** Host de la guía (de `PreviewHandle.host()`), con shadow root abierto. */\n  host: HTMLElement;\n  guideType: GuideType;\n  stepIndex: number;\n  /** Se emite UNA vez por gesto, al soltar. */\n  onCommit: (patch: DesignPatch) => void;\n  /** Fin de cualquier gesto (con o sin cambios). Para aplicar previews encolados. */\n  onGestureEnd?: () => void;\n}\n\nexport interface DesignManipulatorHandle {\n  /** `true` mientras hay un gesto de drag/resize en curso. */\n  isDragging(): boolean;\n  /** Remueve handles, estilos y listeners. Idempotente. */\n  detach(): void;\n}\n\nconst MIN_W = 220;\nconst MAX_W = 720;\nconst MIN_H = 120;\nconst MAX_H = 900;\n/** Zonas de agarre de los bordes (px). */\nconst EDGE = 8;\n\ntype ResizeDir = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw';\nconst RESIZE_DIRS: ResizeDir[] = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\n\nconst MANIPULATOR_CSS = `\n.veo-mnp-card {\n  outline: 1.5px dashed rgba(255, 91, 53, 0.75);\n  outline-offset: 2px;\n}\n.veo-mnp-card:hover { cursor: move; }\n.veo-mnp-handle {\n  position: absolute;\n  z-index: 10;\n  background: transparent;\n}\n.veo-mnp-handle::after {\n  content: '';\n  position: absolute;\n  width: 8px; height: 8px;\n  background: #fff;\n  border: 1.5px solid rgba(255, 91, 53, 0.9);\n  border-radius: 2px;\n  top: 50%; left: 50%;\n  transform: translate(-50%, -50%);\n  opacity: 0;\n  transition: opacity 100ms ease;\n}\n.veo-mnp-card:hover .veo-mnp-handle::after,\n.veo-mnp-handle:hover::after { opacity: 1; }\n.veo-mnp-n  { top: -${EDGE / 2}px; left: ${EDGE}px; right: ${EDGE}px; height: ${EDGE}px; cursor: ns-resize; }\n.veo-mnp-s  { bottom: -${EDGE / 2}px; left: ${EDGE}px; right: ${EDGE}px; height: ${EDGE}px; cursor: ns-resize; }\n.veo-mnp-e  { right: -${EDGE / 2}px; top: ${EDGE}px; bottom: ${EDGE}px; width: ${EDGE}px; cursor: ew-resize; }\n.veo-mnp-w  { left: -${EDGE / 2}px; top: ${EDGE}px; bottom: ${EDGE}px; width: ${EDGE}px; cursor: ew-resize; }\n.veo-mnp-ne { top: -${EDGE / 2}px; right: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nesw-resize; }\n.veo-mnp-nw { top: -${EDGE / 2}px; left: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nwse-resize; }\n.veo-mnp-se { bottom: -${EDGE / 2}px; right: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nwse-resize; }\n.veo-mnp-sw { bottom: -${EDGE / 2}px; left: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nesw-resize; }\n.veo-mnp-banner { outline: 1.5px dashed rgba(255, 91, 53, 0.75); outline-offset: -2px; cursor: grab; }\n.veo-mnp-banner:active { cursor: grabbing; }\n`;\n\nfunction clamp(v: number, min: number, max: number): number {\n  return Math.min(Math.max(v, min), max);\n}\n\nfunction round3(v: number): number {\n  return Math.round(v * 1000) / 1000;\n}\n\n/** true si el mousedown cayó sobre algo interactivo (no iniciar drag ahí). */\nfunction isInteractive(target: EventTarget | null): boolean {\n  return Boolean(\n    target instanceof Element && target.closest('button, a, input, textarea, select, label'),\n  );\n}\n\n/**\n * Adjunta la manipulación directa al host de una guía montada. Devuelve el\n * handle, o `null` si el tipo de guía no la soporta o el DOM esperado no está.\n * Idempotente: si la card ya está decorada, no re-adjunta.\n */\nexport function attachDesignManipulator(\n  opts: DesignManipulatorOptions,\n): DesignManipulatorHandle | null {\n  const shadow = opts.host.shadowRoot;\n  if (!shadow) return null;\n\n  const card = shadow.querySelector<HTMLElement>('.veo-modal-card');\n  if (card) return attachModal(opts, shadow, card);\n\n  const banner = shadow.querySelector<HTMLElement>('.veo-banner');\n  // El banner embebido se posiciona con prepend/append en el contenedor: su\n  // top/bottom se cambia desde el panel (remonta). Solo el fijo se arrastra.\n  if (banner && !banner.classList.contains('veo-banner-embedded')) {\n    return attachBanner(opts, shadow, banner);\n  }\n\n  return null;\n}\n\n// ── Modal: drag libre + resize por 8 handles ────────────────────────────────\n\nfunction attachModal(\n  opts: DesignManipulatorOptions,\n  shadow: ShadowRoot,\n  card: HTMLElement,\n): DesignManipulatorHandle | null {\n  if (card.dataset.veoManipulated === '1') return null;\n  card.dataset.veoManipulated = '1';\n  card.classList.add('veo-mnp-card');\n\n  const doc = card.ownerDocument;\n  const style = doc.createElement('style');\n  style.textContent = MANIPULATOR_CSS;\n  shadow.appendChild(style);\n\n  const handles: HTMLElement[] = [];\n  for (const dir of RESIZE_DIRS) {\n    const h = doc.createElement('div');\n    h.className = `veo-mnp-handle veo-mnp-${dir}`;\n    h.dataset.veoDir = dir;\n    card.appendChild(h);\n    handles.push(h);\n  }\n\n  let dragging = false;\n  let detached = false;\n\n  /** Últimos valores aplicados durante el gesto (para el commit del up). */\n  let patch: DesignPatch['style'] = {};\n\n  const setVars = (v: { px?: number; py?: number; w?: number; h?: number }): void => {\n    const host = opts.host;\n    if (v.px !== undefined) host.style.setProperty('--veo-pos-x', `${v.px * 100}%`);\n    if (v.py !== undefined) host.style.setProperty('--veo-pos-y', `${v.py * 100}%`);\n    if (v.w !== undefined) host.style.setProperty('--veo-width', `${v.w}px`);\n    if (v.h !== undefined) host.style.setProperty('--veo-min-h', `${v.h}px`);\n  };\n\n  /**\n   * Un gesto genérico: guarda el rect inicial, traduce cada mousemove a\n   * variables CSS (rAF-throttled) y al soltar emite el commit acumulado.\n   */\n  const startGesture = (\n    e: MouseEvent,\n    apply: (dx: number, dy: number, start: DOMRect) => DesignPatch['style'],\n  ): void => {\n    e.preventDefault();\n    e.stopPropagation();\n    dragging = true;\n    patch = {};\n    const start = card.getBoundingClientRect();\n    const sx = e.clientX;\n    const sy = e.clientY;\n    let raf = 0;\n    let lastEv: MouseEvent | null = null;\n\n    const flush = (): void => {\n      raf = 0;\n      if (!lastEv) return;\n      const next = apply(lastEv.clientX - sx, lastEv.clientY - sy, start);\n      patch = { ...patch, ...next };\n      setVars({\n        ...(next.posX !== undefined ? { px: next.posX } : {}),\n        ...(next.posY !== undefined ? { py: next.posY } : {}),\n        ...(next.width !== undefined ? { w: next.width } : {}),\n        ...(next.height !== undefined ? { h: next.height } : {}),\n      });\n    };\n\n    const move = (ev: MouseEvent): void => {\n      lastEv = ev;\n      // rAF-throttle del feedback; fallback síncrono si el entorno no tiene rAF.\n      if (typeof window.requestAnimationFrame !== 'function') flush();\n      else if (!raf) raf = window.requestAnimationFrame(flush);\n    };\n    const up = (): void => {\n      window.removeEventListener('mousemove', move);\n      window.removeEventListener('mouseup', up);\n      if (raf) window.cancelAnimationFrame(raf);\n      flush();\n      dragging = false;\n      if (Object.keys(patch).length > 0 && !detached) {\n        opts.onCommit({ stepIndex: opts.stepIndex, style: patch });\n      }\n      opts.onGestureEnd?.();\n    };\n    window.addEventListener('mousemove', move);\n    window.addEventListener('mouseup', up);\n  };\n\n  /** posX para que el borde izquierdo quede en `left` con ancho `w`. */\n  const posXFor = (left: number, w: number): number => {\n    const span = window.innerWidth - w;\n    return span <= 0 ? 0.5 : round3(clamp(left / span, 0, 1));\n  };\n  const posYFor = (top: number, h: number): number => {\n    const span = window.innerHeight - h;\n    return span <= 0 ? 0.5 : round3(clamp(top / span, 0, 1));\n  };\n\n  const onCardDown = (e: MouseEvent): void => {\n    if (isInteractive(e.target)) return;\n    if (e.target instanceof Element && e.target.closest('.veo-mnp-handle')) return;\n    startGesture(e, (dx, dy, start) => ({\n      posX: posXFor(start.left + dx, start.width),\n      posY: posYFor(start.top + dy, start.height),\n    }));\n  };\n\n  const onHandleDown = (e: MouseEvent): void => {\n    const dir = (e.currentTarget as HTMLElement).dataset.veoDir as ResizeDir;\n    startGesture(e, (dx, dy, start) => {\n      const out: DesignPatch['style'] = {};\n      if (dir.includes('e')) out.width = Math.round(clamp(start.width + dx, MIN_W, MAX_W));\n      if (dir.includes('w')) {\n        out.width = Math.round(clamp(start.width - dx, MIN_W, MAX_W));\n        // El borde derecho queda fijo: la card se re-ancla donde corresponde.\n        out.posX = posXFor(start.right - out.width, out.width);\n      }\n      if (dir.includes('s')) out.height = Math.round(clamp(start.height + dy, MIN_H, MAX_H));\n      if (dir.includes('n')) {\n        out.height = Math.round(clamp(start.height - dy, MIN_H, MAX_H));\n        out.posY = posYFor(start.bottom - out.height, out.height);\n      }\n      return out;\n    });\n  };\n\n  card.addEventListener('mousedown', onCardDown);\n  for (const h of handles) h.addEventListener('mousedown', onHandleDown);\n\n  return {\n    isDragging: () => dragging,\n    detach: () => {\n      if (detached) return;\n      detached = true;\n      card.removeEventListener('mousedown', onCardDown);\n      for (const h of handles) h.remove();\n      style.remove();\n      card.classList.remove('veo-mnp-card');\n      delete card.dataset.veoManipulated;\n    },\n  };\n}\n\n// ── Banner fijo: drag vertical con snap top/bottom ──────────────────────────\n\nfunction attachBanner(\n  opts: DesignManipulatorOptions,\n  shadow: ShadowRoot,\n  banner: HTMLElement,\n): DesignManipulatorHandle | null {\n  if (banner.dataset.veoManipulated === '1') return null;\n  banner.dataset.veoManipulated = '1';\n  banner.classList.add('veo-mnp-banner');\n\n  const doc = banner.ownerDocument;\n  const style = doc.createElement('style');\n  style.textContent = MANIPULATOR_CSS;\n  shadow.appendChild(style);\n\n  let dragging = false;\n  let detached = false;\n\n  const positionOf = (): 'top' | 'bottom' =>\n    banner.classList.contains('veo-banner-bottom') ? 'bottom' : 'top';\n\n  const onDown = (e: MouseEvent): void => {\n    if (isInteractive(e.target)) return;\n    e.preventDefault();\n    dragging = true;\n    const startPos = positionOf();\n    let current = startPos;\n\n    const move = (ev: MouseEvent): void => {\n      // Snap: la mitad del viewport decide top/bottom, con feedback en vivo.\n      const next = ev.clientY < window.innerHeight / 2 ? 'top' : 'bottom';\n      if (next !== current) {\n        current = next;\n        banner.classList.remove('veo-banner-top', 'veo-banner-bottom');\n        banner.classList.add(`veo-banner-${next}`);\n      }\n    };\n    const up = (): void => {\n      window.removeEventListener('mousemove', move);\n      window.removeEventListener('mouseup', up);\n      dragging = false;\n      if (current !== startPos && !detached) {\n        opts.onCommit({ stepIndex: opts.stepIndex, style: { position: current } });\n      }\n      opts.onGestureEnd?.();\n    };\n    window.addEventListener('mousemove', move);\n    window.addEventListener('mouseup', up);\n  };\n\n  banner.addEventListener('mousedown', onDown);\n\n  return {\n    isDragging: () => dragging,\n    detach: () => {\n      if (detached) return;\n      detached = true;\n      banner.removeEventListener('mousedown', onDown);\n      style.remove();\n      banner.classList.remove('veo-mnp-banner');\n      delete banner.dataset.veoManipulated;\n    },\n  };\n}\n","/**\n * Element picker — el \"inspeccionar\" del navegador, pero del SDK. Corre\n * DENTRO de la app del cliente (no en el dashboard: son orígenes distintos\n * y el dashboard no puede leer el DOM de la app). Resalta el elemento bajo\n * el cursor, muestra su selector + dimensiones, y al hacer click captura un\n * selector CSS estable reutilizando `buildSelectorPath` del autocapture.\n *\n * Es la base del builder no-code: el dashboard abre la app del cliente en\n * modo builder, el usuario \"pincha\" un elemento y el selector resultante se\n * usa como ancla de un tooltip/walkthrough. El puente con el dashboard\n * (postMessage) es la fase siguiente; aquí exponemos el primitivo\n * `startElementPicker(onPick)`.\n *\n * No usa `innerHTML` — todo por `textContent`/DOM, igual que los renderers.\n */\n\nimport { hasDocument } from '../../utils/safe-env';\nimport { buildSelectorPath, filterHumanClasses } from '../autocapture/selector-builder';\n\n/** z-index por encima de las guías (2147483640) para tapar también una preview. */\nconst PICKER_Z = 2147483646;\nconst PICKER_HOST_ATTR = 'data-veo-picker';\nconst DEFAULT_MAX_ANCESTORS = 5;\n\n/** Datos del elemento elegido que se entregan al caller. */\nexport interface PickedElement {\n  /** Selector CSS estable con ancestros (lo que se guarda como ancla). */\n  selector: string;\n  /** Selector corto solo del elemento (tag + id/atributo/clases). */\n  shortSelector: string;\n  tag: string;\n  id: string | null;\n  classes: string[];\n  text: string;\n  rect: { x: number; y: number; width: number; height: number };\n}\n\nexport interface ElementPickerOptions {\n  /** Llamado al hacer click en un elemento. El picker se cierra tras esto. */\n  onPick: (picked: PickedElement) => void;\n  /** Llamado al cancelar (Esc). El picker se cierra. */\n  onCancel?: () => void;\n  /** Niveles de ancestros del selector. Default 5 (igual que autocapture). */\n  maxAncestors?: number;\n  /** Texto del banner superior. Default en español. */\n  hint?: string;\n}\n\nexport interface ElementPickerHandle {\n  /** Cierra el picker sin elegir nada. Idempotente. */\n  stop(): void;\n}\n\nconst PICKER_STYLES = `\n:host { all: initial; }\n.veo-pick-box {\n  position: fixed;\n  z-index: ${PICKER_Z};\n  pointer-events: none;\n  box-sizing: border-box;\n  background: rgba(99, 102, 241, 0.22);\n  border: 1px dashed rgba(99, 102, 241, 0.95);\n  border-radius: 2px;\n  transition: top 60ms ease-out, left 60ms ease-out, width 60ms ease-out, height 60ms ease-out;\n}\n.veo-pick-label {\n  position: fixed;\n  z-index: ${PICKER_Z};\n  pointer-events: none;\n  max-width: 360px;\n  background: #1e1b4b;\n  color: #e0e7ff;\n  font: 12px/1.45 ui-monospace, SFMono-Regular, Menlo, monospace;\n  padding: 6px 9px;\n  border-radius: 6px;\n  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.35);\n}\n.veo-pick-label .veo-pick-sel { color: #c7d2fe; word-break: break-all; }\n.veo-pick-label .veo-pick-dim { color: #a5b4fc; margin-top: 3px; }\n.veo-pick-hint {\n  position: fixed;\n  top: 12px;\n  left: 50%;\n  transform: translateX(-50%);\n  z-index: ${PICKER_Z};\n  pointer-events: none;\n  background: #4338ca;\n  color: #fff;\n  font: 13px/1 -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n  padding: 8px 14px;\n  border-radius: 999px;\n  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);\n}\n`;\n\n/**\n * Controla un picker activo. Singleton a nivel de módulo: empezar otro\n * cierra el anterior. Los listeners van en fase de captura para poder\n * cancelar el click ANTES de que la app del cliente reaccione.\n */\nclass ElementPicker {\n  private host: HTMLElement | null = null;\n  private box: HTMLElement | null = null;\n  private label: HTMLElement | null = null;\n  private current: Element | null = null;\n  private maxAncestors = DEFAULT_MAX_ANCESTORS;\n  private onPick: ((p: PickedElement) => void) | null = null;\n  private onCancel: (() => void) | null = null;\n\n  start(options: ElementPickerOptions): void {\n    this.stop(); // solo un picker a la vez\n\n    this.maxAncestors = options.maxAncestors ?? DEFAULT_MAX_ANCESTORS;\n    this.onPick = options.onPick;\n    this.onCancel = options.onCancel ?? null;\n\n    const host = document.createElement('div');\n    host.setAttribute(PICKER_HOST_ATTR, '');\n    const shadow = host.attachShadow({ mode: 'open' });\n\n    const style = document.createElement('style');\n    style.textContent = PICKER_STYLES;\n\n    this.box = document.createElement('div');\n    this.box.className = 'veo-pick-box';\n    this.box.style.display = 'none';\n\n    this.label = document.createElement('div');\n    this.label.className = 'veo-pick-label';\n    this.label.style.display = 'none';\n\n    const hint = document.createElement('div');\n    hint.className = 'veo-pick-hint';\n    hint.textContent = options.hint ?? 'Selecciona un elemento · Esc para cancelar';\n\n    shadow.append(style, this.box, this.label, hint);\n    document.body.appendChild(host);\n    this.host = host;\n\n    document.addEventListener('mousemove', this.onMove, true);\n    document.addEventListener('click', this.onClick, true);\n    document.addEventListener('mousedown', this.swallow, true);\n    document.addEventListener('mouseup', this.swallow, true);\n    document.addEventListener('keydown', this.onKey, true);\n    window.addEventListener('scroll', this.reposition, true);\n    window.addEventListener('resize', this.reposition);\n  }\n\n  stop(): void {\n    document.removeEventListener('mousemove', this.onMove, true);\n    document.removeEventListener('click', this.onClick, true);\n    document.removeEventListener('mousedown', this.swallow, true);\n    document.removeEventListener('mouseup', this.swallow, true);\n    document.removeEventListener('keydown', this.onKey, true);\n    window.removeEventListener('scroll', this.reposition, true);\n    window.removeEventListener('resize', this.reposition);\n\n    if (this.host?.parentNode) this.host.parentNode.removeChild(this.host);\n    this.host = null;\n    this.box = null;\n    this.label = null;\n    this.current = null;\n    this.onPick = null;\n    this.onCancel = null;\n  }\n\n  /** ¿Es un nodo de nuestro propio overlay? (no debe ser seleccionable). */\n  private isOwn(target: EventTarget | null): boolean {\n    return target instanceof Node && this.host !== null && this.host.contains(target);\n  }\n\n  private onMove = (event: MouseEvent): void => {\n    const target = event.target;\n    if (!(target instanceof Element) || this.isOwn(target)) return;\n    this.current = target;\n    this.draw(target);\n  };\n\n  private onClick = (event: MouseEvent): void => {\n    const target = this.current ?? (event.target instanceof Element ? event.target : null);\n    if (!target || this.isOwn(target)) return;\n\n    // Evitar que la app reaccione al click de selección.\n    event.preventDefault();\n    event.stopPropagation();\n    event.stopImmediatePropagation();\n\n    const picked = this.describe(target);\n    const cb = this.onPick;\n    this.stop();\n    cb?.(picked);\n  };\n\n  private onKey = (event: KeyboardEvent): void => {\n    if (event.key !== 'Escape') return;\n    event.preventDefault();\n    event.stopPropagation();\n    const cb = this.onCancel;\n    this.stop();\n    cb?.();\n  };\n\n  /** Traga mousedown/mouseup durante el picking (evita focus/active de la app). */\n  private swallow = (event: MouseEvent): void => {\n    if (this.isOwn(event.target)) return;\n    event.preventDefault();\n    event.stopPropagation();\n  };\n\n  private reposition = (): void => {\n    if (this.current) this.draw(this.current);\n  };\n\n  /** Dibuja el recuadro de resalte y la etiqueta sobre el elemento dado. */\n  private draw(element: Element): void {\n    if (!this.box || !this.label) return;\n    const rect = element.getBoundingClientRect();\n\n    this.box.style.display = 'block';\n    this.box.style.top = `${rect.top}px`;\n    this.box.style.left = `${rect.left}px`;\n    this.box.style.width = `${rect.width}px`;\n    this.box.style.height = `${rect.height}px`;\n\n    const shortSel = buildSelectorPath(element, 0);\n    this.label.textContent = '';\n    const sel = document.createElement('div');\n    sel.className = 'veo-pick-sel';\n    sel.textContent = shortSel;\n    const dim = document.createElement('div');\n    dim.className = 'veo-pick-dim';\n    dim.textContent = `${Math.round(rect.width)} × ${Math.round(rect.height)}`;\n    this.label.append(sel, dim);\n\n    // Etiqueta debajo del recuadro; si no hay espacio, arriba.\n    this.label.style.display = 'block';\n    const LABEL_H = 48;\n    const placeAbove = rect.bottom + 8 + LABEL_H > window.innerHeight;\n    this.label.style.top = placeAbove\n      ? `${Math.max(8, rect.top - LABEL_H - 8)}px`\n      : `${rect.bottom + 8}px`;\n    this.label.style.left = `${Math.max(8, rect.left)}px`;\n  }\n\n  private describe(element: Element): PickedElement {\n    const rect = element.getBoundingClientRect();\n    return {\n      selector: buildSelectorPath(element, this.maxAncestors),\n      shortSelector: buildSelectorPath(element, 0),\n      tag: element.tagName.toLowerCase(),\n      id: element.id || null,\n      classes: filterHumanClasses(element),\n      text: (element.textContent ?? '').trim().slice(0, 120),\n      rect: {\n        x: Math.round(rect.left),\n        y: Math.round(rect.top),\n        width: Math.round(rect.width),\n        height: Math.round(rect.height),\n      },\n    };\n  }\n}\n\nlet activePicker: ElementPicker | null = null;\n\n/**\n * Inicia el modo de selección de elementos (inspector). Resalta lo que está\n * bajo el cursor y, al hacer click, entrega un selector CSS estable.\n * Devuelve un handle con `stop()`. Iniciar otro picker cierra el anterior.\n *\n * @example\n * ```ts\n * import { startElementPicker } from '@veo/sdk';\n *\n * const picker = startElementPicker({\n *   onPick: ({ selector }) => console.log('elegido:', selector),\n *   onCancel: () => console.log('cancelado'),\n * });\n * // picker.stop() para abortar manualmente.\n * ```\n */\nexport function startElementPicker(options: ElementPickerOptions): ElementPickerHandle {\n  if (!hasDocument()) {\n    return { stop: () => {} };\n  }\n  if (!activePicker) activePicker = new ElementPicker();\n  activePicker.start(options);\n  return { stop: () => activePicker?.stop() };\n}\n\n/** Cierra el picker activo, si lo hay. Idempotente. */\nexport function stopElementPicker(): void {\n  activePicker?.stop();\n}\n","/**\n * Lado APP del puente builder. Corre dentro de la app del cliente (vía\n * veo-builder.js). Si el contexto trae `?veoBuilder=<token>`, se conecta con el\n * editor de Veo, atiende comandos y devuelve el elemento elegido.\n *\n * Dos transportes:\n *  - **iframe/popup** (`resolveTarget` = opener/parent): el dashboard es la\n *    ventana principal y embebe/abre la app; le hablamos a esa ventana.\n *  - **panel inyectado** (`ctx.panel`): la app es top-level (login real) y NOSOTROS\n *    inyectamos el panel del editor encima (iframe al dashboard); le hablamos a\n *    ese iframe. Es el modo sin adaptación por app.\n *\n * Seguridad: solo acepta mensajes cuyo `origin` coincida con el del dashboard\n * (`veoBuilderOrigin` / `document.referrer`) y cuyo `token` coincida.\n */\nimport {\n  type BuilderClientContext,\n  clearBuilderToken,\n  resolveBuilderContext,\n} from '../../core/builder-token';\nimport { hasDocument, hasWindow } from '../../utils/safe-env';\nimport { closeGuidePreview, previewGuide } from '../guides/guide-preview';\nimport type { CompositeStep } from '../guides/types';\nimport { stepMatchesPage } from '../guides/url-match';\nimport { attachBlockDropTarget, type BlockDropTargetHandle } from './block-drop-target';\nimport { type BuilderCommand, type BuilderEvent, VEO_BUILDER_SOURCE } from './bridge-protocol';\nimport { type BuilderPanelHandle, injectBuilderPanel } from './builder-panel';\nimport { attachDesignManipulator, type DesignManipulatorHandle } from './design-manipulator';\nimport { type ElementPickerHandle, startElementPicker } from './element-picker';\n\nexport interface BuilderModeHandle {\n  /** Desconecta el puente y limpia picker/preview/panel. */\n  teardown(): void;\n}\n\n/**\n * Inicializa el modo builder si hay contexto (URL o persistido). Devuelve un\n * handle, o `null` si no estamos en modo builder o no hay canal con el editor.\n * Es seguro llamarla siempre.\n */\nexport function initBuilderMode(): BuilderModeHandle | null {\n  if (!hasWindow() || !hasDocument()) return null;\n\n  // Contexto de la URL o de sessionStorage: sobrevive al redirect del guard de\n  // auth (que suele tirar el query string) y a un login en la misma pestaña.\n  const ctx = resolveBuilderContext();\n  if (!ctx) return null;\n\n  const token = ctx.token;\n  const dashboardOrigin = resolveDashboardOrigin(ctx.origin);\n  if (!dashboardOrigin) return null;\n\n  let picker: ElementPickerHandle | null = null;\n  let panel: BuilderPanelHandle | null = null;\n  let staticTarget: Window | null = null;\n  let manipulator: DesignManipulatorHandle | null = null;\n  let dropTarget: BlockDropTargetHandle | null = null;\n  /** Fantasma que sigue el cursor durante el drag de un bloque de la paleta. */\n  let dragGhost: HTMLElement | null = null;\n  /** Paso mostrado por la preview activa (destino de los drops de bloque). */\n  let previewStepIndex = 0;\n  /** Preview que llegó DURANTE un drag: se aplica al terminar el gesto. */\n  let pendingPreview: Extract<BuilderCommand, { type: 'preview' }> | null = null;\n  /** Último comando de preview: se re-evalúa al navegar (targeting por-página). */\n  let lastPreview: Extract<BuilderCommand, { type: 'preview' }> | null = null;\n  const getTarget = (): Window | null => (panel ? panel.target() : staticTarget);\n\n  const post = (event: BuilderEvent): void => {\n    getTarget()?.postMessage({ source: VEO_BUILDER_SOURCE, token, ...event }, dashboardOrigin);\n  };\n\n  /**\n   * ¿El paso que se está previsualizando aplica a la URL ACTUAL? El editor debe\n   * reflejar el targeting por-página real: si el paso apunta a otra página, la\n   * preview NO se muestra (igual que el runtime). `sitewide`/sin pageLocation →\n   * siempre true, así el editado normal no se ve afectado.\n   */\n  const previewMatchesPage = (cmd: Extract<BuilderCommand, { type: 'preview' }>): boolean => {\n    const steps = cmd.guide.guideSteps as unknown as CompositeStep[] | undefined;\n    const step = steps?.[cmd.guide.startStepIndex ?? 0];\n    return stepMatchesPage(step?.pageLocation, window.location.href);\n  };\n\n  /** Aplica la preview respetando el targeting de página; si no aplica, la cierra. */\n  const applyPreviewGated = (cmd: Extract<BuilderCommand, { type: 'preview' }>): void => {\n    lastPreview = cmd;\n    if (previewMatchesPage(cmd)) {\n      applyPreview(cmd);\n    } else {\n      manipulator?.detach();\n      manipulator = null;\n      dropTarget?.detach();\n      dropTarget = null;\n      closeGuidePreview();\n    }\n  };\n\n  const applyPreview = (cmd: Extract<BuilderCommand, { type: 'preview' }>): void => {\n    manipulator?.detach();\n    manipulator = null;\n    dropTarget?.detach();\n    dropTarget = null;\n    previewStepIndex = cmd.guide.startStepIndex ?? 0;\n    const handle = previewGuide(cmd.guide);\n    if (!cmd.editable) return;\n    void handle.ready.then((result) => {\n      if (!result.rendered) return;\n      const host = handle.host();\n      if (!host) return;\n      manipulator = attachDesignManipulator({\n        host,\n        guideType: cmd.guide.guideType,\n        stepIndex: cmd.guide.startStepIndex ?? 0,\n        onCommit: (payload) => post({ type: 'design-updated', payload }),\n        onGestureEnd: () => {\n          if (!pendingPreview) return;\n          const queued = pendingPreview;\n          pendingPreview = null;\n          applyPreviewGated(queued);\n        },\n      });\n      // Paleta → guía: soltar un bloque del panel sobre la preview lo inserta.\n      dropTarget = attachBlockDropTarget({\n        host,\n        stepIndex: cmd.guide.startStepIndex ?? 0,\n        onDrop: (payload) => post({ type: 'block-dropped', payload }),\n      });\n    });\n  };\n\n  const hideDragGhost = (): void => {\n    dragGhost?.remove();\n    dragGhost = null;\n  };\n\n  const moveDragGhost = (x: number, y: number, label: string): void => {\n    if (!dragGhost) {\n      dragGhost = document.createElement('div');\n      dragGhost.style.cssText =\n        'position:fixed;padding:4px 10px;border-radius:999px;background:#1c1917;color:#fff;' +\n        'font:12px/1.4 system-ui,sans-serif;box-shadow:0 4px 14px rgba(0,0,0,0.35);' +\n        'border:1px solid rgba(255,255,255,0.25);pointer-events:none;z-index:2147483647;';\n      document.body.appendChild(dragGhost);\n    }\n    dragGhost.textContent = label;\n    dragGhost.style.left = `${x + 14}px`;\n    dragGhost.style.top = `${y + 12}px`;\n  };\n\n  /**\n   * Drag de bloque por pointer: coords relativas al iframe del panel → página.\n   * En pop-out no hay mapeo (otra ventana) — se ignora.\n   */\n  const handleBlockDrag = (cmd: Extract<BuilderCommand, { type: 'block-drag' }>): void => {\n    const rect = panel?.frameRect();\n    if (!rect || !dropTarget) {\n      if (cmd.phase !== 'move') hideDragGhost();\n      dropTarget?.cancelHover();\n      return;\n    }\n    const x = rect.left + cmd.x;\n    const y = rect.top + cmd.y;\n    if (cmd.phase === 'move') {\n      moveDragGhost(x, y, cmd.label || cmd.blockType);\n      dropTarget.hoverAt(x, y);\n      return;\n    }\n    hideDragGhost();\n    if (cmd.phase === 'cancel') {\n      dropTarget.cancelHover();\n      return;\n    }\n    const spotAt = dropTarget.dropAt(x, y);\n    if (spotAt) {\n      post({\n        type: 'block-dropped',\n        payload: { stepIndex: previewStepIndex, blockType: cmd.blockType, ...spotAt },\n      });\n    }\n  };\n\n  const handleCommand = (cmd: BuilderCommand): void => {\n    switch (cmd.type) {\n      case 'panel-ready':\n        // El panel cargó y ya escucha → recién ahora le mandamos `ready`.\n        post({ type: 'ready' });\n        break;\n      case 'start-picker':\n        picker?.stop();\n        picker = startElementPicker({\n          onPick: (payload) => {\n            picker = null;\n            post({ type: 'picked', payload });\n          },\n          onCancel: () => {\n            picker = null;\n            post({ type: 'pick-cancelled' });\n          },\n          ...(cmd.maxAncestors !== undefined ? { maxAncestors: cmd.maxAncestors } : {}),\n          ...(cmd.hint !== undefined ? { hint: cmd.hint } : {}),\n        });\n        break;\n      case 'stop-picker':\n        picker?.stop();\n        picker = null;\n        break;\n      case 'preview':\n        if (!cmd.guide) break;\n        // Mientras hay un drag en curso, no remontar la preview debajo del\n        // mouse del autor: se encola el ÚLTIMO comando y se aplica al soltar.\n        if (manipulator?.isDragging()) pendingPreview = cmd;\n        else applyPreviewGated(cmd);\n        break;\n      case 'block-drag':\n        handleBlockDrag(cmd);\n        break;\n      case 'close-preview':\n        manipulator?.detach();\n        manipulator = null;\n        dropTarget?.detach();\n        dropTarget = null;\n        hideDragGhost();\n        pendingPreview = null;\n        lastPreview = null;\n        closeGuidePreview();\n        break;\n      case 'teardown':\n        teardown();\n        break;\n    }\n  };\n\n  const onMessage = (event: MessageEvent): void => {\n    if (event.origin !== dashboardOrigin) return;\n    const data = event.data as { source?: unknown; token?: unknown } | null;\n    if (!data || data.source !== VEO_BUILDER_SOURCE || data.token !== token) return;\n    handleCommand(data as BuilderCommand);\n  };\n\n  const onPageHide = (): void => post({ type: 'closed' });\n\n  // ── Watcher de navegación (SPA): al cambiar de página, re-evalúa la preview\n  // contra su targeting por-página (aparece/desaparece como en el runtime). ──\n  const onNav = (): void => {\n    if (lastPreview && !manipulator?.isDragging()) applyPreviewGated(lastPreview);\n  };\n  const origPush = window.history.pushState;\n  const origReplace = window.history.replaceState;\n  const installNavWatcher = (): void => {\n    window.history.pushState = function pushState(this: History, ...args) {\n      const r = origPush.apply(this, args as Parameters<History['pushState']>);\n      onNav();\n      return r;\n    };\n    window.history.replaceState = function replaceState(this: History, ...args) {\n      const r = origReplace.apply(this, args as Parameters<History['replaceState']>);\n      onNav();\n      return r;\n    };\n    window.addEventListener('popstate', onNav);\n    window.addEventListener('hashchange', onNav);\n  };\n  const removeNavWatcher = (): void => {\n    window.history.pushState = origPush;\n    window.history.replaceState = origReplace;\n    window.removeEventListener('popstate', onNav);\n    window.removeEventListener('hashchange', onNav);\n  };\n\n  const teardown = (): void => {\n    window.removeEventListener('message', onMessage);\n    window.removeEventListener('pagehide', onPageHide);\n    removeNavWatcher();\n    picker?.stop();\n    picker = null;\n    manipulator?.detach();\n    manipulator = null;\n    dropTarget?.detach();\n    dropTarget = null;\n    hideDragGhost();\n    pendingPreview = null;\n    closeGuidePreview();\n    post({ type: 'closed' }); // avisar al editor ANTES de sacar el panel\n    panel?.teardown();\n    panel = null;\n    clearBuilderToken(); // salir del modo builder: no re-activar en la próxima carga\n  };\n\n  // Transporte: panel inyectado (app top-level) o iframe/popup (embebida).\n  if (ctx.panel) {\n    panel = injectBuilderPanel({\n      dashboardOrigin,\n      token,\n      appOrigin: window.location.origin,\n      guide: ctx.guide,\n      panelPath: ctx.panelPath,\n      onClose: () => teardown(),\n    });\n  } else {\n    staticTarget = resolveTarget();\n    if (!staticTarget) return null;\n  }\n\n  const activate = (): void => {\n    window.addEventListener('message', onMessage);\n    window.addEventListener('pagehide', onPageHide);\n    installNavWatcher();\n    // Panel: esperamos el `panel-ready` del iframe para postear `ready` (todavía\n    // puede no tener su listener). iframe/popup: el opener ya escucha → posteamos ya.\n    if (!ctx.panel) post({ type: 'ready' });\n  };\n\n  // Modo panel inyectado: la seguridad ya la da la sesión AUTENTICADA del\n  // dashboard (el panel es un iframe del dashboard con Clerk) — el token es solo\n  // correlación. Activamos directo, SIN verify: el verify contra el backend\n  // podría fallar por expiración del token durante el login (que tarda), dejando\n  // el panel para siempre en \"conectando…\".\n  //\n  // Modo iframe/popup (embebido): verificamos el token firmado antes de activar\n  // (si `init()` dejó la config). Solo bloquea si el backend dice {valid:false}.\n  const cfg = (window as unknown as { __veoBuilder?: { apiKey?: string; apiUrl?: string } })\n    .__veoBuilder;\n  if (!ctx.panel && cfg?.apiKey && cfg?.apiUrl) {\n    void verifyBuilderToken(cfg.apiUrl, cfg.apiKey, token).then((ok) => {\n      if (ok) activate();\n      else if (window.console) console.warn('[veo] token de builder inválido — modo no activado');\n    });\n  } else {\n    activate();\n  }\n\n  return { teardown };\n}\n\n/**\n * Verifica el token con el backend. Solo devuelve `false` (no activar) cuando el\n * backend responde explícitamente `{valid:false}` (token forjado/expirado/de\n * otro workspace). Ante 404/red caída/errores transitorios devuelve `true`\n * (best-effort) para no brickear el modo builder.\n */\nasync function verifyBuilderToken(apiUrl: string, apiKey: string, token: string): Promise<boolean> {\n  try {\n    const url = `${apiUrl.replace(/\\/+$/, '')}/v1/builder/verify`;\n    const res = await fetch(url, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'X-Api-Key': apiKey },\n      body: JSON.stringify({ token }),\n    });\n    if (!res.ok) return true; // no pudimos verificar → best-effort\n    const data = (await res.json().catch(() => null)) as { valid?: unknown } | null;\n    return data?.valid !== false;\n  } catch {\n    return true; // red caída / sin backend → best-effort\n  }\n}\n\n/** Ventana con la que hablar en modo iframe/popup: el opener o el parent. */\nfunction resolveTarget(): Window | null {\n  if (window.opener && window.opener !== window) return window.opener as Window;\n  if (window.parent && window.parent !== window) return window.parent;\n  return null;\n}\n\nfunction resolveDashboardOrigin(originHint: string | null): string | null {\n  // Origen de la URL o persistido en el primer arranque (antes del redirect).\n  if (originHint) {\n    try {\n      return new URL(originHint).origin;\n    } catch {\n      return null;\n    }\n  }\n  // Fallback: el referrer. Poco fiable tras un redirect same-origin (apunta a la\n  // propia app), por eso el origen persistido va primero.\n  if (hasDocument() && document.referrer) {\n    try {\n      return new URL(document.referrer).origin;\n    } catch {\n      return null;\n    }\n  }\n  return null;\n}\n\n// Tipo re-exportado para consumidores que tipan el contexto.\nexport type { BuilderClientContext };\n","/**\n * Lado DASHBOARD del puente builder. Abre la app del cliente en un popup,\n * en modo builder, y expone una API para pedirle que seleccione un elemento\n * o previsualice una guía. Pensado para importarse en el dashboard\n * (`import { createBuilderSession } from '@veo/sdk/builder'`).\n *\n * Seguridad: solo procesa mensajes cuyo `origin` sea el de la app y cuyo\n * `token` coincida con el de esta sesión.\n */\nimport { hasWindow } from '../../utils/safe-env';\nimport type { PreviewGuideInput } from '../guides/guide-preview';\nimport {\n  BUILDER_ORIGIN_PARAM,\n  BUILDER_TOKEN_PARAM,\n  type BuilderCommand,\n  VEO_BUILDER_SOURCE,\n} from './bridge-protocol';\nimport type { PickedElement } from './element-picker';\n\nexport interface BuilderSessionOptions {\n  /** URL de la app del cliente a abrir en modo builder. */\n  appUrl: string;\n  /** Token de la sesión (idealmente emitido/firmado por el backend). */\n  token: string;\n  /** Origen al que la app debe responder. Default: `location.origin`. */\n  dashboardOrigin?: string;\n  /** La app está lista y escuchando comandos. */\n  onReady?: () => void;\n  /** El usuario eligió un elemento. */\n  onPicked?: (picked: PickedElement) => void;\n  /** El usuario canceló la selección (Esc). */\n  onCancelled?: () => void;\n  /** La app cerró el modo builder (o el popup se cerró). */\n  onClosed?: () => void;\n  /**\n   * Si se pasa, la app se embebe en este `<iframe>` (modo estudio in-app) en\n   * lugar de abrirse en un popup. El lado app ya habla con `window.parent`,\n   * así que el puente funciona igual. La sesión setea el `src` del iframe.\n   */\n  frame?: HTMLIFrameElement;\n  /** Nombre de la ventana popup. Default: `veo-builder`. */\n  windowName?: string;\n  /** Features del popup. Default: ventana de ~1280×860. */\n  windowFeatures?: string;\n}\n\nexport interface BuilderSession {\n  /** Pide a la app que entre en modo selección de elemento. */\n  startPicker(options?: { maxAncestors?: number; hint?: string }): void;\n  /** Cancela la selección en curso. */\n  stopPicker(): void;\n  /** Pide a la app que previsualice una guía. */\n  preview(guide: PreviewGuideInput): void;\n  /** Cierra la preview activa en la app. */\n  closePreview(): void;\n  /** Cierra el popup y desconecta el puente. */\n  close(): void;\n}\n\nconst DEFAULT_FEATURES = 'popup,width=1280,height=860';\nconst POPUP_POLL_MS = 600;\n\nexport function createBuilderSession(options: BuilderSessionOptions): BuilderSession {\n  if (!hasWindow()) return noopSession();\n\n  const dashboardOrigin = options.dashboardOrigin ?? window.location.origin;\n  const appOrigin = safeOrigin(options.appUrl);\n  const url = buildAppUrl(options.appUrl, options.token, dashboardOrigin);\n\n  const frame = options.frame ?? null;\n  const useFrame = frame !== null;\n\n  let popup: Window | null = null;\n  if (useFrame) {\n    // biome-ignore lint/style/noNonNullAssertion: useFrame garantiza frame\n    frame!.src = url;\n  } else {\n    popup = window.open(\n      url,\n      options.windowName ?? 'veo-builder',\n      options.windowFeatures ?? DEFAULT_FEATURES,\n    );\n  }\n\n  /** Ventana destino de los comandos: el popup o el contentWindow del iframe. */\n  const targetWindow = (): Window | null => (useFrame ? (frame?.contentWindow ?? null) : popup);\n\n  const post = (command: BuilderCommand): void => {\n    const w = targetWindow();\n    if (!w) return;\n    if (!useFrame && popup?.closed) return;\n    w.postMessage(\n      { source: VEO_BUILDER_SOURCE, token: options.token, ...command },\n      appOrigin ?? '*',\n    );\n  };\n\n  let pollTimer: ReturnType<typeof setInterval> | undefined;\n\n  const cleanup = (): void => {\n    window.removeEventListener('message', onMessage);\n    if (pollTimer !== undefined) {\n      clearInterval(pollTimer);\n      pollTimer = undefined;\n    }\n  };\n\n  const onMessage = (event: MessageEvent): void => {\n    if (appOrigin && event.origin !== appOrigin) return;\n    const data = event.data as {\n      source?: unknown;\n      token?: unknown;\n      type?: unknown;\n      payload?: unknown;\n    } | null;\n    if (!data || data.source !== VEO_BUILDER_SOURCE || data.token !== options.token) return;\n\n    switch (data.type) {\n      case 'ready':\n        options.onReady?.();\n        break;\n      case 'picked':\n        if (data.payload) options.onPicked?.(data.payload as PickedElement);\n        break;\n      case 'pick-cancelled':\n        options.onCancelled?.();\n        break;\n      case 'closed':\n        cleanup();\n        options.onClosed?.();\n        break;\n    }\n  };\n\n  window.addEventListener('message', onMessage);\n\n  // Detectar cierre manual del popup (el usuario cierra la ventana). En modo\n  // iframe el ciclo de vida lo controla el dashboard (no hay nada que pollear).\n  if (!useFrame) {\n    pollTimer = setInterval(() => {\n      if (popup?.closed) {\n        cleanup();\n        options.onClosed?.();\n      }\n    }, POPUP_POLL_MS);\n  }\n\n  return {\n    startPicker: (o) =>\n      post({\n        type: 'start-picker',\n        ...(o?.maxAncestors !== undefined ? { maxAncestors: o.maxAncestors } : {}),\n        ...(o?.hint !== undefined ? { hint: o.hint } : {}),\n      }),\n    stopPicker: () => post({ type: 'stop-picker' }),\n    preview: (guide) => post({ type: 'preview', guide }),\n    closePreview: () => post({ type: 'close-preview' }),\n    close: () => {\n      post({ type: 'teardown' });\n      if (useFrame) {\n        if (frame) frame.src = 'about:blank';\n      } else if (popup && !popup.closed) {\n        popup.close();\n      }\n      cleanup();\n    },\n  };\n}\n\nfunction buildAppUrl(appUrl: string, token: string, dashboardOrigin: string): string {\n  try {\n    const u = new URL(appUrl, window.location.href);\n    u.searchParams.set(BUILDER_TOKEN_PARAM, token);\n    u.searchParams.set(BUILDER_ORIGIN_PARAM, dashboardOrigin);\n    return u.toString();\n  } catch {\n    return appUrl;\n  }\n}\n\nfunction safeOrigin(url: string): string | null {\n  try {\n    return new URL(url, window.location.href).origin;\n  } catch {\n    return null;\n  }\n}\n\nfunction noopSession(): BuilderSession {\n  return {\n    startPicker: () => {},\n    stopPicker: () => {},\n    preview: () => {},\n    closePreview: () => {},\n    close: () => {},\n  };\n}\n","/**\n * Plugin builder — herramientas no-code que corren DENTRO de la app del\n * cliente (no en el dashboard). Hoy: el element picker (inspector) para\n * elegir el ancla de una guía. Próximo: el puente postMessage con el\n * dashboard y la activación segura por `?veoBuilder=<token>`.\n */\n\nexport type {\n  BlockDropPayload,\n  BlockDropTargetHandle,\n} from './block-drop-target';\nexport { attachBlockDropTarget, VEO_BLOCK_MIME } from './block-drop-target';\nexport type {\n  BuilderCommand,\n  BuilderEvent,\n} from './bridge-protocol';\nexport type { BuilderModeHandle } from './builder-mode';\nexport { initBuilderMode } from './builder-mode';\nexport type { BuilderSession, BuilderSessionOptions } from './builder-session';\nexport { createBuilderSession } from './builder-session';\nexport type {\n  DesignManipulatorHandle,\n  DesignManipulatorOptions,\n  DesignPatch,\n} from './design-manipulator';\nexport { attachDesignManipulator } from './design-manipulator';\nexport type { ElementPickerHandle, ElementPickerOptions, PickedElement } from './element-picker';\nexport { startElementPicker, stopElementPicker } from './element-picker';\n","/**\n * Tipos del contrato HTTP entre el SDK y el backend.\n * Versión 1.\n *\n * IMPORTANTE: Si cambias algo aquí, debes actualizar también:\n * - veo-backend/src/modules/identity/dto/*.dto.ts\n * - veo-backend/src/modules/ingest/dto/*.dto.ts\n * - CONTRACT.md\n */\n\nexport const SDK_VERSION = '0.0.1';\nexport const MAX_BATCH_SIZE = 100;\nexport const DEFAULT_FLUSH_INTERVAL_MS = 5000;\nexport const DEFAULT_FLUSH_BATCH_SIZE = 20;\n\n/**\n * Backend de Veo, horneado en el bundle. El consumidor NO configura la URL.\n * El valor se inyecta en build-time desde `VEO_API_URL` (ver tsup.config.ts);\n * el literal de aquí es solo el fallback para tests / builds sin esa env.\n * NO es secreta: va al bundle del navegador, igual que la `pk_`.\n */\nexport const DEFAULT_API_URL =\n  process.env.VEO_API_URL || 'https://veo-backend-production-8c78.up.railway.app';\n\n/**\n * Tipos de eventos que el SDK envía.\n * Debe coincidir con el CHECK constraint de veo_user_actions.action_type.\n */\nexport type ActionType = 'pageview' | 'track' | 'identify' | 'guide';\n\n/**\n * Payload de un evento individual enviado al endpoint POST /v1/events.\n */\nexport interface ActionPayload {\n  actionId: string; // UUID v7 generado en cliente\n  endUserId: string;\n  organizationId?: string;\n  sessionId: string;\n  actionType: ActionType;\n  actionName?: string;\n  occurredAt: string; // ISO 8601\n  pageUrl?: string;\n  pagePath?: string;\n  pageTitle?: string;\n  pageReferrer?: string;\n  actionProperties?: Record<string, unknown>;\n}\n\n/**\n * Request del endpoint POST /v1/events.\n */\nexport interface IngestEventsRequest {\n  events: ActionPayload[]; // máx 100\n}\n\n/**\n * Response del endpoint POST /v1/events.\n */\nexport interface IngestEventsResponse {\n  accepted: number;\n  deduped: number;\n}\n\n/**\n * Request del endpoint POST /v1/identify.\n */\nexport interface IdentifyRequest {\n  endUser: {\n    id: string;\n    anonymousId?: string;\n    traits?: Record<string, unknown>;\n  };\n  organization?: {\n    id: string;\n    attributes?: Record<string, unknown>;\n  };\n}\n\n/**\n * Response del endpoint POST /v1/identify.\n */\nexport interface IdentifyResponse {\n  endUserId: string;\n  organizationId: string | null;\n  workspaceId: string;\n}\n\n/**\n * Response de error estándar del backend.\n */\nexport interface ErrorResponse {\n  error: string;\n  details?: unknown;\n  statusCode: number;\n}\n","import { DEFAULT_API_URL } from '../contract/v1';\n\n/**\n * Resuelve la URL del backend de Veo. NO es parte de la API pública: el\n * consumidor solo pasa `apiKey` y la URL va quemada en `DEFAULT_API_URL`.\n *\n * Orden de resolución (para desarrollo local / self-host, sin recompilar):\n *   1. `config.apiUrl` si viene (override interno, no tipado en `VeoConfig`).\n *   2. `window.__VEO_API_URL__` si está seteado ANTES de `init()`.\n *   3. `DEFAULT_API_URL` (el backend gestionado).\n */\nexport function resolveApiUrl(config?: unknown): string {\n  const fromConfig = (config as { apiUrl?: unknown } | undefined)?.apiUrl;\n  if (typeof fromConfig === 'string' && fromConfig.trim()) return fromConfig;\n\n  const fromGlobal = (globalThis as { __VEO_API_URL__?: unknown }).__VEO_API_URL__;\n  if (typeof fromGlobal === 'string' && fromGlobal.trim()) return fromGlobal;\n\n  return DEFAULT_API_URL;\n}\n","/**\n * Carga perezosa del bundle del builder. El SDK de producción (`veo.js`) es\n * lo único que el cliente integra; cuando el dashboard abre la app con\n * `?veoBuilder=<token>`, este loader inyecta `veo-builder.js` (que se\n * auto-conecta). Así el modo no-code \"simplemente funciona\" sin que el\n * cliente tenga que instalar nada extra.\n *\n * No importa nada del plugin builder para no arrastrar su código al bundle\n * de producción (ver budget en CLAUDE.md). El nombre del query param debe\n * coincidir con `BUILDER_TOKEN_PARAM` de `plugins/builder/bridge-protocol`.\n */\nimport { hasDocument, hasWindow } from '../utils/safe-env';\nimport { resolveBuilderToken } from './builder-token';\n\n/**\n * `true` cuando la app corre en modo builder (URL con `?veoBuilder=<token>`, o\n * el token persistido en sessionStorage tras un redirect de auth). En ese modo\n * el editor pinta las guías vía PREVIEW; el runtime NO debe resolver/renderizar\n * las guías `live` o se duplicarían (la live del runtime + la preview del editor).\n */\nexport { isBuilderMode } from './builder-token';\n\nexport function maybeLoadBuilder(opts: {\n  builderUrl?: string;\n  debug?: boolean;\n  apiKey?: string;\n  apiUrl?: string;\n  /**\n   * Fallback para integraciones por bundler (sin `<script>` de dónde derivar la\n   * URL): carga el builder con un `import()` dinámico. Lo pasa SOLO el entry\n   * ESM/CJS (`index.ts`), así el bundler lo code-splitea (cero costo en prod, se\n   * descarga solo en modo builder). El IIFE NO lo pasa (usa el `<script>`).\n   */\n  loadBuilder?: () => Promise<unknown>;\n}): void {\n  if (!hasWindow() || !hasDocument()) return;\n\n  // Lee el token de la URL o de sessionStorage (sobrevive al redirect que tira\n  // el query string) y persiste el de la URL apenas lo ve. Sin token → no-op.\n  if (resolveBuilderToken() === null) return;\n\n  // Dejamos apiKey/apiUrl en un global para que el modo builder VERIFIQUE el\n  // token contra el backend (`/v1/builder/verify`) antes de activarse. Solo se\n  // setea cuando el builder se carga desde `init()` (integración real); en\n  // demos que cargan veo-builder.js a mano no existe → verificación best-effort.\n  if (opts.apiKey && opts.apiUrl) {\n    (window as unknown as { __veoBuilder?: unknown }).__veoBuilder = {\n      apiKey: opts.apiKey,\n      apiUrl: opts.apiUrl,\n    };\n  }\n\n  // Ya cargado (el IIFE expone window.veoBuilder).\n  if ((window as unknown as { veoBuilder?: unknown }).veoBuilder) return;\n\n  const url = opts.builderUrl ?? deriveBuilderUrl();\n  if (url) {\n    if (document.querySelector(`script[src=\"${url}\"]`)) return;\n    const script = document.createElement('script');\n    script.src = url;\n    script.async = true;\n    if (opts.debug) {\n      script.addEventListener('error', () => console.error('[veo] no pude cargar', url));\n    }\n    document.head.appendChild(script);\n    return;\n  }\n\n  // Integración por bundler: no hay `<script>` que derivar. Cargamos el builder\n  // con el `import()` dinámico que pasó el entry ESM/CJS. El consumidor NO tiene\n  // que copiar `veo-builder.js` ni setear `builderUrl`: \"simplemente funciona\".\n  if (opts.loadBuilder) {\n    void opts.loadBuilder().catch((err) => {\n      if (opts.debug) console.error('[veo] no pude cargar el builder (import dinámico)', err);\n    });\n    return;\n  }\n\n  if (opts.debug) {\n    console.warn('[veo] builder mode pedido pero no pude resolver la URL de veo-builder.js');\n  }\n}\n\n/** Deriva `veo-builder.js` del `<script>` que cargó `veo.js`. */\nfunction deriveBuilderUrl(): string | null {\n  const scripts = document.querySelectorAll<HTMLScriptElement>('script[src]');\n  for (const script of Array.from(scripts)) {\n    if (/\\bveo(\\.min)?\\.js(\\?.*)?$/.test(script.src)) {\n      return script.src.replace(/\\bveo(\\.min)?\\.js/, 'veo-builder$1.js');\n    }\n  }\n  return null;\n}\n","/**\n * @veo/sdk - SDK oficial de Veo para web (entry ESM/CJS para bundlers).\n *\n * Aquí las guías se importan ESTÁTICAMENTE (el bundler las incluye/treeshake).\n * El entry IIFE (`veo.ts` → `veo.js`) las carga PEREZOSAMENTE para quedar chico.\n */\nimport { resolveApiUrl } from './core/api-url';\nimport { isBuilderMode } from './core/builder-loader';\nimport { getPreviewToken } from './core/preview-loader';\nimport { setupClient } from './core/setup';\nimport { closeGuidePreview, guidesPlugin, previewGuide, runPreviewMode } from './plugins/guides';\nimport type { VeoClient, VeoConfig } from './types';\n\nexport { SDK_VERSION } from './contract/v1';\nexport { Client } from './core/client';\nexport { autocapturePlugin } from './plugins/autocapture';\nexport type { PreviewGuideInput, PreviewHandle, PreviewResult } from './plugins/guides';\nexport { closeGuidePreview, guidesPlugin, previewGuide } from './plugins/guides';\nexport { definePlugin } from './plugins/plugin';\n// El element picker (inspector) vive en un bundle aparte para no inflar el SDK\n// de producción: `import { startElementPicker } from '@veo/sdk/builder'`.\nexport { spaRouterPlugin } from './plugins/spa-router';\nexport type {\n  VeoAutocaptureConfig,\n  VeoClient,\n  VeoConfig,\n  VeoOrganization,\n  VeoPlugin,\n  VeoVisitor,\n} from './types';\n\n/**\n * Inicializa el SDK de Veo. Instala por defecto el plugin de SPA router\n * (auto-pageview) y, en browser, expone la instancia en `window.veo` drenando\n * la cola del snippet stub si existe.\n *\n * @example\n * ```ts\n * import { init } from '@veo/sdk';\n *\n * // apiUrl es opcional: por defecto apunta al backend gestionado de Veo.\n * const veo = init({ apiKey: 'pk_xxx' });\n *\n * veo.identify({ visitor: { id: 'user_123' } });\n * veo.track('button_clicked');\n * ```\n */\nexport function init(config: VeoConfig): VeoClient {\n  const apiUrl = resolveApiUrl(config);\n  return setupClient(\n    config,\n    (client) => {\n      // Renderer de guías: opt-in. Reusa apiUrl/apiKey/debug del client.\n      // En modo builder o preview-por-link NO se instala (ahí pinta la preview;\n      // el runtime duplicaría/taparía con las guías live).\n      const previewToken = getPreviewToken();\n      if (config.guides === true && !isBuilderMode() && previewToken === null) {\n        client.use(\n          guidesPlugin({\n            apiUrl,\n            apiKey: config.apiKey,\n            ...(config.debug !== undefined ? { debug: config.debug } : {}),\n          }),\n        );\n      }\n\n      // Modo preview-por-link (`?veoPreview=<token>`): renderiza la guía del\n      // token como vista previa sobre la app real.\n      if (previewToken !== null) {\n        void runPreviewMode({\n          apiKey: config.apiKey,\n          apiUrl,\n          token: previewToken,\n          ...(config.debug !== undefined ? { debug: config.debug } : {}),\n        });\n      }\n\n      // Conveniencia: `veo.preview(def)` / `veo.closePreview()` en la instancia.\n      (client as unknown as Record<string, unknown>).preview = previewGuide;\n      (client as unknown as Record<string, unknown>).closePreview = closeGuidePreview;\n    },\n    // Fallback de carga del builder para bundlers: `import()` dinámico → el bundler\n    // lo code-splitea (solo se descarga en modo builder). Así el consumidor por\n    // bundler NO necesita copiar `veo-builder.js` ni setear `builderUrl`.\n    () => import('./plugins/builder').then((m) => m.initBuilderMode()),\n  );\n}\n","import type { VeoPlugin } from '../types';\n\n/**\n * Helper de identidad para definir un plugin con inferencia de tipos.\n * No transforma nada; mejora la ergonomía y deja un punto de extensión futuro.\n */\nexport function definePlugin(plugin: VeoPlugin): VeoPlugin {\n  return plugin;\n}\n","import type { VeoAutocaptureConfig, VeoClient } from '../../types';\nimport { hasDocument } from '../../utils/safe-env';\nimport { DEFAULT_AUTOCAPTURE_CONFIG, MAX_ANCESTORS } from './constants';\nimport { buildAutocapturePayload } from './element-serializer';\nimport { isElementBlocked } from './pii-guard';\nimport { ElementThrottle } from './throttle';\n\ntype AutocaptureEvent = 'click' | 'submit' | 'change';\n\n/**\n * Instala listeners delegados en `document` y traduce las interacciones del\n * usuario en eventos `$autocapture`. Nunca lanza hacia la app del cliente:\n * cada handler está envuelto en try/catch.\n */\nexport class DomListener {\n  private readonly throttle: ElementThrottle;\n  private readonly config: Required<VeoAutocaptureConfig>;\n  private cleanups: Array<() => void> = [];\n\n  constructor(\n    private readonly client: VeoClient,\n    config: VeoAutocaptureConfig,\n  ) {\n    const d = DEFAULT_AUTOCAPTURE_CONFIG;\n    // Resolver el config de forma explícita: el merge por spread reintroduce\n    // `| undefined` y no satisface `Required<VeoAutocaptureConfig>`.\n    this.config = {\n      enabled: config.enabled ?? d.enabled,\n      captureClicks: config.captureClicks ?? d.captureClicks,\n      captureSubmits: config.captureSubmits ?? d.captureSubmits,\n      captureChanges: config.captureChanges ?? d.captureChanges,\n      maskAllInputs: config.maskAllInputs ?? d.maskAllInputs,\n      maskAllText: config.maskAllText ?? d.maskAllText,\n      blockSelectors: config.blockSelectors ?? [],\n      throttleMs: config.throttleMs ?? d.throttleMs,\n      maxTextLength: config.maxTextLength ?? d.maxTextLength,\n      captureElementMetadata: config.captureElementMetadata ?? d.captureElementMetadata,\n      captureAncestors: Math.min(config.captureAncestors ?? d.captureAncestors, MAX_ANCESTORS),\n    };\n    this.throttle = new ElementThrottle(this.config.throttleMs);\n  }\n\n  install(): void {\n    if (!hasDocument() || !this.config.enabled) return;\n\n    if (this.config.captureClicks) this.attach('click', (e) => this.handleClick(e));\n    if (this.config.captureSubmits) this.attach('submit', (e) => this.handleSubmit(e), true);\n    if (this.config.captureChanges) this.attach('change', (e) => this.handleChange(e), true);\n  }\n\n  destroy(): void {\n    for (const cleanup of this.cleanups) cleanup();\n    this.cleanups = [];\n  }\n\n  private attach(\n    eventName: AutocaptureEvent,\n    handler: (e: Event) => void,\n    useCapture = false,\n  ): void {\n    const listener = (e: Event) => {\n      // Solo eventos reales del usuario (los sintéticos tienen isTrusted=false).\n      if (!e.isTrusted) return;\n      try {\n        handler(e);\n      } catch {\n        // Nunca romper la app del cliente; descartamos el evento silenciosamente.\n      }\n    };\n    document.addEventListener(eventName, listener, useCapture);\n    this.cleanups.push(() => document.removeEventListener(eventName, listener, useCapture));\n  }\n\n  private handleClick(event: Event): void {\n    const target = event.target;\n    if (!(target instanceof Element)) return;\n\n    // Subir hasta el elemento \"interesante\" (botón, link, [role], etc.).\n    // Si NO hay ninguno (click en zona vacía/no interactiva, p. ej. <html>),\n    // no emitimos: evita ruido y volumen innecesario de eventos.\n    const meaningful = this.findMeaningfulAncestor(target);\n    if (!meaningful) return;\n    if (isElementBlocked(meaningful, this.config.blockSelectors)) return;\n    if (!this.throttle.shouldFire(meaningful)) return;\n\n    this.emit('click', meaningful);\n  }\n\n  private handleSubmit(event: Event): void {\n    const target = event.target;\n    if (!(target instanceof Element) || target.tagName.toLowerCase() !== 'form') return;\n    if (isElementBlocked(target, this.config.blockSelectors)) return;\n    if (!this.throttle.shouldFire(target)) return;\n\n    this.emit('submit', target);\n  }\n\n  private handleChange(event: Event): void {\n    const target = event.target;\n    if (!(target instanceof Element)) return;\n\n    const tag = target.tagName.toLowerCase();\n    if (tag !== 'select' && tag !== 'input' && tag !== 'textarea') return;\n\n    // Para text inputs el change sería spam/PII; solo checkbox/radio (y selects).\n    if (\n      target instanceof HTMLInputElement &&\n      target.type !== 'checkbox' &&\n      target.type !== 'radio'\n    ) {\n      return;\n    }\n    if (isElementBlocked(target, this.config.blockSelectors)) return;\n    if (!this.throttle.shouldFire(target)) return;\n\n    this.emit('change', target);\n  }\n\n  /** Busca hacia arriba un ancestro \"interactivo\". Devuelve null si no hay ninguno. */\n  private findMeaningfulAncestor(element: Element): Element | null {\n    let current: Element | null = element;\n    let depth = 0;\n\n    while (current && current !== document.documentElement && depth < 5) {\n      const tag = current.tagName.toLowerCase();\n      const isInteractive =\n        tag === 'button' ||\n        tag === 'a' ||\n        tag === 'input' ||\n        tag === 'select' ||\n        tag === 'textarea' ||\n        current.hasAttribute('data-veo-tag') ||\n        current.hasAttribute('role') ||\n        current.hasAttribute('onclick') ||\n        (current instanceof HTMLElement && current.style.cursor === 'pointer');\n\n      if (isInteractive) return current;\n      current = current.parentElement;\n      depth++;\n    }\n\n    return null;\n  }\n\n  private emit(eventType: AutocaptureEvent, element: Element): void {\n    const payload = buildAutocapturePayload(eventType, element, this.config);\n    this.client.track('$autocapture', payload as unknown as Record<string, unknown>);\n  }\n}\n","import { PRIORITY_ATTRIBUTES } from './constants';\nimport { isSensitiveAttribute, safeGetText } from './pii-guard';\nimport { buildSelectorPath, filterHumanClasses } from './selector-builder';\n\nexport interface SerializedElement {\n  tag: string;\n  id: string | null;\n  classes: string[];\n  text: string;\n  attributes: Record<string, string>;\n  position: { x: number; y: number; w: number; h: number };\n}\n\nexport interface SerializedAncestor {\n  tag: string;\n  id: string | null;\n  classes: string[];\n  veoTag: string | null;\n}\n\nexport interface AutocapturePayload {\n  $event_type: 'click' | 'submit' | 'change';\n  $element: SerializedElement;\n  $ancestors: SerializedAncestor[];\n  $selector_path: string;\n  $page_url: string;\n  $page_path: string;\n}\n\ninterface SerializeConfig {\n  maxTextLength: number;\n  maskAllText: boolean;\n  captureElementMetadata: boolean;\n}\n\n/** Extrae los atributos relevantes del elemento, filtrando los sensibles. */\nfunction extractPriorityAttributes(element: Element): Record<string, string> {\n  const result: Record<string, string> = {};\n\n  for (const attrName of PRIORITY_ATTRIBUTES) {\n    const value = element.getAttribute(attrName);\n    if (value !== null && !isSensitiveAttribute(attrName) && value.length < 256) {\n      result[attrName] = value;\n    }\n  }\n\n  return result;\n}\n\n/** Serializa un elemento DOM a un objeto plano para enviar al backend. */\nexport function serializeElement(element: Element, config: SerializeConfig): SerializedElement {\n  const rect = element.getBoundingClientRect();\n\n  return {\n    tag: element.tagName.toLowerCase(),\n    id: element.id || null,\n    classes: filterHumanClasses(element),\n    text: safeGetText(element, config.maxTextLength, config.maskAllText),\n    attributes: config.captureElementMetadata ? extractPriorityAttributes(element) : {},\n    position: {\n      x: Math.round(rect.left + window.scrollX),\n      y: Math.round(rect.top + window.scrollY),\n      w: Math.round(rect.width),\n      h: Math.round(rect.height),\n    },\n  };\n}\n\n/** Captura los ancestros del elemento (para tagging contextual en el dashboard). */\nexport function serializeAncestors(element: Element, maxDepth: number): SerializedAncestor[] {\n  const ancestors: SerializedAncestor[] = [];\n  let current: Element | null = element.parentElement;\n  let depth = 0;\n\n  while (current && current !== document.documentElement && depth < maxDepth) {\n    ancestors.push({\n      tag: current.tagName.toLowerCase(),\n      id: current.id || null,\n      classes: filterHumanClasses(current),\n      veoTag: current.getAttribute('data-veo-tag') || null,\n    });\n    current = current.parentElement;\n    depth++;\n  }\n\n  return ancestors;\n}\n\n/** Construye el payload completo para el evento `$autocapture`. */\nexport function buildAutocapturePayload(\n  eventType: 'click' | 'submit' | 'change',\n  element: Element,\n  config: SerializeConfig & { captureAncestors: number },\n): AutocapturePayload {\n  return {\n    $event_type: eventType,\n    $element: serializeElement(element, config),\n    $ancestors: serializeAncestors(element, config.captureAncestors),\n    $selector_path: buildSelectorPath(element, config.captureAncestors),\n    $page_url: window.location.href,\n    $page_path: window.location.pathname,\n  };\n}\n","import { ALWAYS_BLOCK_SELECTORS, SENSITIVE_ATTRIBUTES } from './constants';\n\n/**\n * Verifica si un elemento o ALGUNO de sus ancestros está en la blacklist.\n * Recorre hacia arriba para que bloquear un contenedor bloquee su subárbol.\n */\nexport function isElementBlocked(element: Element, extraBlockSelectors: string[] = []): boolean {\n  const allBlockers = [...ALWAYS_BLOCK_SELECTORS, ...extraBlockSelectors];\n  let current: Element | null = element;\n\n  while (current && current !== document.documentElement) {\n    for (const selector of allBlockers) {\n      try {\n        if (current.matches(selector)) return true;\n      } catch {\n        // Selector inválido o no soportado por el motor: ignorar y seguir.\n      }\n    }\n    current = current.parentElement;\n  }\n\n  return false;\n}\n\n/** Verifica si un atributo es sensible y debe omitirse. */\nexport function isSensitiveAttribute(attrName: string): boolean {\n  const lower = attrName.toLowerCase();\n  return SENSITIVE_ATTRIBUTES.includes(lower) || /password|secret|token|ssn|credit/i.test(attrName);\n}\n\n/** Obtiene el texto visible de un elemento, respetando privacidad. */\nexport function safeGetText(element: Element, maxLength: number, mask: boolean): string {\n  if (mask) return '';\n\n  // Nunca capturar texto de campos de entrada (puede contener lo que el usuario escribe).\n  const tagName = element.tagName.toLowerCase();\n  if (tagName === 'input' || tagName === 'textarea') return '';\n\n  // `innerText` no existe en jsdom; el fallback a `textContent` lo cubre.\n  const raw =\n    (element instanceof HTMLElement ? element.innerText : '') || element.textContent || '';\n  const trimmed = raw.trim().replace(/\\s+/g, ' ');\n\n  return trimmed.length > maxLength ? `${trimmed.slice(0, maxLength)}…` : trimmed;\n}\n","/**\n * Throttle por elemento: evita duplicar eventos del mismo target dentro de una\n * ventana de N ms. Usa un WeakMap para no retener elementos en memoria.\n */\nexport class ElementThrottle {\n  private lastFired = new WeakMap<Element, number>();\n\n  constructor(private readonly windowMs: number) {}\n\n  /** Devuelve true si el elemento puede emitir ahora (y registra el disparo). */\n  shouldFire(element: Element): boolean {\n    const now = Date.now();\n    const last = this.lastFired.get(element) ?? 0;\n\n    if (now - last < this.windowMs) return false;\n\n    this.lastFired.set(element, now);\n    return true;\n  }\n}\n","import type { VeoAutocaptureConfig, VeoPlugin } from '../../types';\nimport { definePlugin } from '../plugin';\nimport { DomListener } from './dom-listener';\n\n/**\n * Plugin de autocaptura de eventos del DOM.\n * Captura clicks, submits y changes automáticamente y los emite como\n * eventos `track('$autocapture', …)` por la Queue del cliente.\n */\nexport function autocapturePlugin(config: VeoAutocaptureConfig = {}): VeoPlugin {\n  let listener: DomListener | null = null;\n\n  return definePlugin({\n    name: 'autocapture',\n    install(client) {\n      listener = new DomListener(client, config);\n      listener.install();\n    },\n    destroy() {\n      listener?.destroy();\n      listener = null;\n    },\n  });\n}\n\nexport { DomListener } from './dom-listener';\nexport type { AutocapturePayload } from './element-serializer';\n","import type { VeoPlugin } from '../types';\nimport { hasWindow } from '../utils/safe-env';\nimport { definePlugin } from './plugin';\n\n/**\n * Plugin que auto-emite `pageview` en cambios de ruta de una SPA.\n * Cubre `history.pushState`, `history.replaceState`, `popstate` y `hashchange`.\n */\nexport function spaRouterPlugin(): VeoPlugin {\n  return definePlugin({\n    name: 'spa-router',\n    install(client) {\n      if (!hasWindow()) return;\n\n      // Pageview inicial.\n      client.pageview();\n\n      const fire = () => {\n        // Diferir para que el router del host actualice location.pathname primero.\n        queueMicrotask(() => client.pageview());\n      };\n\n      const origPushState = window.history.pushState;\n      const origReplaceState = window.history.replaceState;\n\n      window.history.pushState = function (\n        this: History,\n        ...args: Parameters<History['pushState']>\n      ): void {\n        origPushState.apply(this, args);\n        fire();\n      };\n\n      window.history.replaceState = function (\n        this: History,\n        ...args: Parameters<History['replaceState']>\n      ): void {\n        origReplaceState.apply(this, args);\n        fire();\n      };\n\n      window.addEventListener('popstate', fire);\n      window.addEventListener('hashchange', fire);\n    },\n  });\n}\n","import type { ActionPayload, ActionType, IdentifyRequest } from '../contract/v1';\nimport { DEFAULT_FLUSH_BATCH_SIZE, DEFAULT_FLUSH_INTERVAL_MS, SDK_VERSION } from '../contract/v1';\nimport type {\n  VeoClient,\n  VeoClientEventListener,\n  VeoClientEventName,\n  VeoClientEvents,\n  VeoConfig,\n  VeoOrganization,\n  VeoPlugin,\n  VeoVisitor,\n} from '../types';\nimport { hasDocument, hasWindow } from '../utils/safe-env';\nimport { uuidv7 } from '../utils/uuid';\nimport { resolveApiUrl } from './api-url';\nimport { Queue } from './queue';\nimport { Session } from './session';\nimport { createStorage, type StorageAdapter } from './storage';\nimport { Transport } from './transport';\n\nconst ORGANIZATION_ID_KEY = 'organization_id';\nconst END_USER_ID_KEY = 'end_user_id';\nconst IDENTIFY_SIG_KEY = 'identify_signature';\n\n/**\n * `JSON.stringify` con claves ordenadas (recursivo) para que la firma de\n * identidad sea estable sin importar el orden en que la app arme el objeto\n * de traits/attributes. Sin esto, `{a,b}` y `{b,a}` darían firmas distintas\n * y el identify se reenviaría sin que nada haya cambiado.\n */\nfunction stableStringify(value: unknown): string {\n  if (value === null || typeof value !== 'object') return JSON.stringify(value) ?? 'null';\n  if (Array.isArray(value)) return `[${value.map(stableStringify).join(',')}]`;\n  const entries = Object.keys(value as Record<string, unknown>)\n    .sort()\n    .map((k) => `${JSON.stringify(k)}:${stableStringify((value as Record<string, unknown>)[k])}`);\n  return `{${entries.join(',')}}`;\n}\n\n/** Campos opcionales que cada API pública aporta al construir el evento. */\ninterface EnqueueInput {\n  actionType: ActionType;\n  actionName?: string;\n  pageUrl?: string;\n  pagePath?: string;\n  pageTitle?: string;\n  pageReferrer?: string;\n  actionProperties?: Record<string, unknown>;\n}\n\n/**\n * Cliente principal del SDK. Expone la API pública (`identify`, `track`,\n * `pageview`, `reset`, `flush`, `use`). Toda la API salvo `flush()` es síncrona:\n * los eventos se encolan y la llamada retorna de inmediato.\n */\nexport class Client implements VeoClient {\n  private readonly transport: Transport;\n  private readonly storage: StorageAdapter;\n  private readonly session: Session;\n  private readonly queue: Queue<ActionPayload>;\n  private readonly plugins: VeoPlugin[] = [];\n  private currentOrganizationId: string | null = null;\n  private readonly listeners: {\n    [E in VeoClientEventName]: Set<VeoClientEventListener<E>>;\n  } = {\n    pageview: new Set(),\n    identify: new Set(),\n  };\n\n  constructor(private readonly config: VeoConfig) {\n    if (!config.apiKey) throw new Error('apiKey is required');\n\n    this.storage = createStorage(config.storage ?? 'localStorage');\n    this.session = new Session(this.storage);\n\n    this.transport = new Transport({\n      apiKey: config.apiKey,\n      apiUrl: resolveApiUrl(config).replace(/\\/$/, ''),\n      sdkVersion: SDK_VERSION,\n    });\n\n    this.queue = new Queue<ActionPayload>({\n      transport: this.transport,\n      flushIntervalMs: config.flushInterval ?? DEFAULT_FLUSH_INTERVAL_MS,\n      batchSize: config.flushBatchSize ?? DEFAULT_FLUSH_BATCH_SIZE,\n      onError: (err) => {\n        if (config.debug) console.error('[veo] flush error:', err);\n      },\n    });\n\n    // Rehidratar identidad persistida.\n    const persistedUserId = this.storage.get(END_USER_ID_KEY);\n    if (persistedUserId) this.session.setEndUserId(persistedUserId);\n\n    const persistedOrgId = this.storage.get(ORGANIZATION_ID_KEY);\n    if (persistedOrgId) this.currentOrganizationId = persistedOrgId;\n\n    this.setupUnloadHandlers();\n\n    if (config.debug) {\n      console.log('[veo] initialized', {\n        anonymousId: this.session.anonymousId,\n        sessionId: this.session.sessionId,\n        endUserId: this.session.endUserId,\n      });\n    }\n  }\n\n  identify(payload: { visitor: VeoVisitor; organization?: VeoOrganization }): void {\n    const { visitor, organization } = payload;\n\n    // Idempotencia: si ya estamos identificados como este visitor y ni los\n    // traits ni la organización cambiaron, no reenviamos. Esto evita el spam\n    // de identify cuando la app lo llama en cada carga/navegación (un patrón\n    // común y recomendado): el SDK absorbe la repetición en vez de generar un\n    // evento `identify` y un POST /v1/identify por cada render.\n    const signature = stableStringify({\n      id: visitor.id,\n      traits: visitor.traits ?? {},\n      org: organization ? { id: organization.id, attributes: organization.attributes ?? {} } : null,\n    });\n    if (this.session.endUserId === visitor.id && this.storage.get(IDENTIFY_SIG_KEY) === signature) {\n      if (this.config.debug) console.debug('[veo] identify: sin cambios, omitido');\n      return;\n    }\n\n    // Capturar el anonymous previo ANTES de mutar la identidad, para el merge en backend.\n    const previousAnonymousId =\n      this.session.endUserId === null ? this.session.anonymousId : undefined;\n\n    this.session.setEndUserId(visitor.id);\n    if (organization) {\n      this.currentOrganizationId = organization.id;\n      this.storage.set(ORGANIZATION_ID_KEY, organization.id);\n    }\n\n    // 1. Upsert de traits/attributes en /v1/identify (fire-and-forget).\n    const endUser: IdentifyRequest['endUser'] = {\n      id: visitor.id,\n      traits: visitor.traits ?? {},\n      ...(previousAnonymousId !== undefined ? { anonymousId: previousAnonymousId } : {}),\n    };\n    const body: IdentifyRequest = {\n      endUser,\n      ...(organization\n        ? { organization: { id: organization.id, attributes: organization.attributes ?? {} } }\n        : {}),\n    };\n    void this.transport.send('/v1/identify', body).catch((err) => {\n      if (this.config.debug) console.error('[veo] identify failed:', err);\n    });\n\n    // 2. Registrar el evento \"identify\" en el log de acciones.\n    this.enqueue({\n      actionType: 'identify',\n      actionProperties: {\n        traits: visitor.traits,\n        organizationAttributes: organization?.attributes,\n      },\n    });\n\n    this.storage.set(IDENTIFY_SIG_KEY, signature);\n\n    this.emit('identify', { endUserId: visitor.id, sessionId: this.session.sessionId });\n  }\n\n  track(name: string, properties?: Record<string, unknown>): void {\n    if (!name || typeof name !== 'string') {\n      if (this.config.debug) console.error('[veo] track: name is required');\n      return;\n    }\n    this.enqueue({\n      actionType: 'track',\n      actionName: name,\n      ...(properties !== undefined ? { actionProperties: properties } : {}),\n    });\n  }\n\n  pageview(path?: string): void {\n    if (!hasDocument()) return;\n\n    const url = window.location.href;\n    const pagePath = path ?? window.location.pathname;\n\n    this.enqueue({\n      actionType: 'pageview',\n      pageUrl: url,\n      pagePath,\n      pageTitle: document.title,\n      pageReferrer: document.referrer,\n    });\n\n    this.emit('pageview', {\n      url,\n      path: pagePath,\n      sessionId: this.session.sessionId,\n      endUserId: this.session.endUserId,\n    });\n  }\n\n  reset(): void {\n    this.session.reset();\n    this.currentOrganizationId = null;\n    this.storage.remove(ORGANIZATION_ID_KEY);\n    this.storage.remove(END_USER_ID_KEY);\n    this.storage.remove(IDENTIFY_SIG_KEY);\n  }\n\n  flush(): Promise<void> {\n    return this.queue.flush();\n  }\n\n  use(plugin: VeoPlugin): VeoClient {\n    this.plugins.push(plugin);\n    plugin.install(this);\n    return this;\n  }\n\n  getEndUserId(): string | null {\n    return this.session.endUserId;\n  }\n\n  getAnonymousId(): string {\n    return this.session.anonymousId;\n  }\n\n  getSessionId(): string {\n    return this.session.sessionId;\n  }\n\n  /**\n   * Suscribe `listener` a `event`. Devuelve una función para desuscribir.\n   * Los errores en listeners se logean en debug mode pero NO se propagan\n   * (un plugin no debe poder romper a otro).\n   */\n  on<E extends VeoClientEventName>(event: E, listener: VeoClientEventListener<E>): () => void {\n    this.listeners[event].add(listener);\n    return () => {\n      this.listeners[event].delete(listener);\n    };\n  }\n\n  private emit<E extends VeoClientEventName>(event: E, payload: VeoClientEvents[E]): void {\n    for (const listener of this.listeners[event]) {\n      try {\n        listener(payload);\n      } catch (err) {\n        if (this.config.debug) console.error(`[veo] listener for '${event}' failed:`, err);\n      }\n    }\n  }\n\n  /**\n   * Construye el evento completo y lo agrega a la queue. Omite los campos\n   * opcionales no definidos (exigido por `exactOptionalPropertyTypes`).\n   * @internal\n   */\n  private enqueue(input: EnqueueInput): void {\n    this.session.touch();\n\n    const organizationId = this.currentOrganizationId ?? undefined;\n    const pageUrl = input.pageUrl ?? (hasWindow() ? window.location.href : undefined);\n    const pagePath = input.pagePath ?? (hasWindow() ? window.location.pathname : undefined);\n    const pageTitle = input.pageTitle ?? (hasDocument() ? document.title : undefined);\n    const pageReferrer = input.pageReferrer ?? (hasDocument() ? document.referrer : undefined);\n\n    const event: ActionPayload = {\n      actionId: uuidv7(),\n      endUserId: this.session.effectiveUserId,\n      sessionId: this.session.sessionId,\n      actionType: input.actionType,\n      occurredAt: new Date().toISOString(),\n      ...(organizationId !== undefined ? { organizationId } : {}),\n      ...(input.actionName !== undefined ? { actionName: input.actionName } : {}),\n      ...(pageUrl !== undefined ? { pageUrl } : {}),\n      ...(pagePath !== undefined ? { pagePath } : {}),\n      ...(pageTitle !== undefined ? { pageTitle } : {}),\n      ...(pageReferrer !== undefined ? { pageReferrer } : {}),\n      ...(input.actionProperties !== undefined ? { actionProperties: input.actionProperties } : {}),\n    };\n\n    this.queue.add(event);\n  }\n\n  private setupUnloadHandlers(): void {\n    if (!hasWindow()) return;\n\n    window.addEventListener('pagehide', () => this.queue.flushBeacon());\n    window.addEventListener('visibilitychange', () => {\n      if (document.visibilityState === 'hidden') {\n        this.queue.flushBeacon();\n      }\n    });\n  }\n}\n","import type { Transport } from './transport';\n\nexport interface QueueConfig {\n  transport: Transport;\n  flushIntervalMs: number;\n  batchSize: number;\n  maxRetries?: number;\n  onError?: (error: Error) => void;\n}\n\nconst RETRY_MAX_DELAY_MS = 30000;\n\n/**\n * Buffer de eventos con envío en batch, flush por intervalo o por tamaño, y\n * reintentos con backoff exponencial ante fallos de red. Los eventos que fallan\n * se re-encolan al inicio para preservar el orden.\n */\nexport class Queue<T = unknown> {\n  private buffer: T[] = [];\n  private timer: ReturnType<typeof setInterval> | null = null;\n  private flushing = false;\n  private retryCount = 0;\n  private retryTimer: ReturnType<typeof setTimeout> | null = null;\n\n  constructor(private readonly config: QueueConfig) {\n    this.startTimer();\n  }\n\n  /** Encola un evento; dispara flush si se alcanza `batchSize`. */\n  add(item: T): void {\n    this.buffer.push(item);\n    if (this.buffer.length >= this.config.batchSize) {\n      void this.flush();\n    }\n  }\n\n  /** Flush manual vía `fetch`. Resuelve cuando termina (los retries son diferidos). */\n  async flush(): Promise<void> {\n    if (this.flushing || this.buffer.length === 0) return;\n\n    this.flushing = true;\n    const batch = this.buffer.splice(0, this.buffer.length);\n\n    try {\n      await this.config.transport.send('/v1/events', { events: batch });\n      this.retryCount = 0;\n    } catch (error) {\n      // Re-encolar al INICIO para preservar el orden cronológico.\n      this.buffer.unshift(...batch);\n      this.scheduleRetry();\n      this.config.onError?.(error as Error);\n    } finally {\n      this.flushing = false;\n    }\n  }\n\n  /** Flush síncrono vía `sendBeacon`, para `pagehide`/`visibilitychange`. */\n  flushBeacon(): void {\n    if (this.buffer.length === 0) return;\n    const batch = this.buffer.splice(0, this.buffer.length);\n    const success = this.config.transport.sendBeacon('/v1/events', { events: batch });\n    if (!success) {\n      // La página se está cerrando; re-encolar es poco útil pero evita pérdida si no se cierra.\n      this.buffer.unshift(...batch);\n    }\n  }\n\n  /** Detiene timers internos. Llamar al destruir el cliente. */\n  destroy(): void {\n    if (this.timer) clearInterval(this.timer);\n    if (this.retryTimer) clearTimeout(this.retryTimer);\n    this.timer = null;\n    this.retryTimer = null;\n  }\n\n  private startTimer(): void {\n    this.timer = setInterval(() => {\n      void this.flush();\n    }, this.config.flushIntervalMs);\n  }\n\n  private scheduleRetry(): void {\n    const maxRetries = this.config.maxRetries ?? 3;\n    if (this.retryCount >= maxRetries) {\n      this.retryCount = 0;\n      return;\n    }\n\n    this.retryCount++;\n    // Backoff exponencial: 1s, 2s, 4s, 8s... con tope de 30s, MÁS jitter.\n    // Sin jitter, ante un 5xx del backend TODOS los clientes reintentan en\n    // lockstep (1s, 2s, 4s…) y amplifican el pico justo cuando está degradado.\n    // Equal jitter: mitad fija + mitad aleatoria → desincroniza la horda.\n    const base = Math.min(1000 * 2 ** (this.retryCount - 1), RETRY_MAX_DELAY_MS);\n    const delayMs = base / 2 + Math.random() * (base / 2);\n\n    if (this.retryTimer) clearTimeout(this.retryTimer);\n    this.retryTimer = setTimeout(() => {\n      void this.flush();\n    }, delayMs);\n  }\n}\n","import { uuidv7 } from '../utils/uuid';\nimport type { StorageAdapter } from './storage';\n\nconst ANONYMOUS_ID_KEY = 'anonymous_user_id';\nconst END_USER_ID_KEY = 'end_user_id';\nconst SESSION_ID_KEY = 'session_id';\nconst SESSION_LAST_ACTIVE_KEY = 'session_last_active';\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutos\n\n/**\n * Gestiona la identidad triple del SDK:\n * - `anonymousId`: persiste indefinidamente (≥ 1 año).\n * - `endUserId`: presente tras `identify()`.\n * - `sessionId`: se renueva tras 30 min de inactividad.\n */\nexport class Session {\n  private _anonymousId: string;\n  private _sessionId: string;\n  private _endUserId: string | null = null;\n\n  constructor(private readonly storage: StorageAdapter) {\n    this._anonymousId = this.loadOrCreateAnonymousId();\n    this._sessionId = this.loadOrCreateSession();\n    // Restaurar la identidad persistida: sin esto el SDK \"olvida\" al usuario\n    // en cada recarga y los eventos posteriores caen al anonymous_id hasta\n    // que la app vuelva a llamar identify(). Persistimos end_user_id en\n    // setEndUserId(), así que también hay que rehidratarlo aquí.\n    this._endUserId = this.storage.get(END_USER_ID_KEY);\n  }\n\n  get anonymousId(): string {\n    return this._anonymousId;\n  }\n\n  get sessionId(): string {\n    return this._sessionId;\n  }\n\n  get endUserId(): string | null {\n    return this._endUserId;\n  }\n\n  /** ID a usar como visitor en eventos (end_user_id si está identificado, si no anonymous). */\n  get effectiveUserId(): string {\n    return this._endUserId ?? this._anonymousId;\n  }\n\n  setEndUserId(id: string): void {\n    this._endUserId = id;\n    this.storage.set(END_USER_ID_KEY, id);\n  }\n\n  /** Renueva el timestamp de actividad. Si pasaron > 30 min, genera nueva sesión. */\n  touch(): void {\n    const lastActive = this.storage.get(SESSION_LAST_ACTIVE_KEY);\n    const now = Date.now();\n\n    if (lastActive && now - Number.parseInt(lastActive, 10) > SESSION_TIMEOUT_MS) {\n      this._sessionId = uuidv7();\n      this.storage.set(SESSION_ID_KEY, this._sessionId);\n    }\n\n    this.storage.set(SESSION_LAST_ACTIVE_KEY, String(now));\n  }\n\n  /** Limpia la identidad (reset) pero conserva el anonymous_id. */\n  reset(): void {\n    this._endUserId = null;\n    this.storage.remove(END_USER_ID_KEY);\n    // Regenerar sesión.\n    this._sessionId = uuidv7();\n    this.storage.set(SESSION_ID_KEY, this._sessionId);\n    this.storage.set(SESSION_LAST_ACTIVE_KEY, String(Date.now()));\n  }\n\n  private loadOrCreateAnonymousId(): string {\n    let id = this.storage.get(ANONYMOUS_ID_KEY);\n    if (!id) {\n      id = uuidv7();\n      this.storage.set(ANONYMOUS_ID_KEY, id);\n    }\n    return id;\n  }\n\n  private loadOrCreateSession(): string {\n    const existing = this.storage.get(SESSION_ID_KEY);\n    const lastActive = this.storage.get(SESSION_LAST_ACTIVE_KEY);\n\n    if (existing && lastActive) {\n      const elapsed = Date.now() - Number.parseInt(lastActive, 10);\n      if (elapsed < SESSION_TIMEOUT_MS) {\n        return existing;\n      }\n    }\n\n    const newId = uuidv7();\n    this.storage.set(SESSION_ID_KEY, newId);\n    this.storage.set(SESSION_LAST_ACTIVE_KEY, String(Date.now()));\n    return newId;\n  }\n}\n","import { hasDocument, hasLocalStorage } from '../utils/safe-env';\n\n/**\n * Contrato común de todos los backends de almacenamiento persistente.\n * Las claves se guardan internamente con el prefijo `veo:`.\n */\nexport interface StorageAdapter {\n  get(key: string): string | null;\n  set(key: string, value: string, options?: { ttlMs?: number }): void;\n  remove(key: string): void;\n  /** Borra únicamente las claves del SDK (prefijo `veo:`). */\n  clear(): void;\n}\n\nconst STORAGE_PREFIX = 'veo:';\n/** TTL por defecto para cookies (1 año), satisface la persistencia del anonymous id. */\nconst ONE_YEAR_MS = 365 * 24 * 60 * 60 * 1000;\n\n/** Backend basado en `localStorage`. Persistencia indefinida (ignora `ttlMs`). */\nclass LocalStorageAdapter implements StorageAdapter {\n  get(key: string): string | null {\n    return localStorage.getItem(STORAGE_PREFIX + key);\n  }\n\n  set(key: string, value: string): void {\n    try {\n      localStorage.setItem(STORAGE_PREFIX + key, value);\n    } catch {\n      // Cuota llena o storage bloqueado: ignorar silenciosamente.\n    }\n  }\n\n  remove(key: string): void {\n    localStorage.removeItem(STORAGE_PREFIX + key);\n  }\n\n  clear(): void {\n    const toRemove: string[] = [];\n    for (let i = 0; i < localStorage.length; i++) {\n      const key = localStorage.key(i);\n      if (key?.startsWith(STORAGE_PREFIX)) toRemove.push(key);\n    }\n    for (const key of toRemove) localStorage.removeItem(key);\n  }\n}\n\n/** Lee y trocea `document.cookie`. Solo se invoca cuando hay `document`. */\nfunction readCookies(): string[] {\n  const raw = document.cookie;\n  return raw === '' ? [] : raw.split('; ');\n}\n\n/** Backend basado en cookies de primer nivel. Usa `ttlMs` (default 1 año). */\nclass CookieAdapter implements StorageAdapter {\n  get(key: string): string | null {\n    const name = `${STORAGE_PREFIX}${key}=`;\n    for (const cookie of readCookies()) {\n      if (cookie.startsWith(name)) {\n        return decodeURIComponent(cookie.slice(name.length));\n      }\n    }\n    return null;\n  }\n\n  set(key: string, value: string, options?: { ttlMs?: number }): void {\n    const maxAgeSec = Math.floor((options?.ttlMs ?? ONE_YEAR_MS) / 1000);\n    const secure =\n      typeof location !== 'undefined' && location.protocol === 'https:' ? '; Secure' : '';\n    // biome-ignore lint/suspicious/noDocumentCookie: necesitamos escritura síncrona y cero deps; la Cookie Store API es async y no universal.\n    document.cookie = `${STORAGE_PREFIX}${key}=${encodeURIComponent(\n      value,\n    )}; Path=/; Max-Age=${maxAgeSec}; SameSite=Lax${secure}`;\n  }\n\n  remove(key: string): void {\n    // biome-ignore lint/suspicious/noDocumentCookie: ver set(); expiramos la cookie con Max-Age=0.\n    document.cookie = `${STORAGE_PREFIX}${key}=; Path=/; Max-Age=0; SameSite=Lax`;\n  }\n\n  clear(): void {\n    for (const cookie of readCookies()) {\n      const eq = cookie.indexOf('=');\n      const name = eq === -1 ? cookie : cookie.slice(0, eq);\n      if (name.startsWith(STORAGE_PREFIX)) {\n        this.remove(name.slice(STORAGE_PREFIX.length));\n      }\n    }\n  }\n}\n\n/** Backend en memoria. Fallback cuando no hay browser storage (SSR, incógnito). */\nclass MemoryAdapter implements StorageAdapter {\n  private store = new Map<string, string>();\n\n  get(key: string): string | null {\n    return this.store.get(key) ?? null;\n  }\n\n  set(key: string, value: string): void {\n    this.store.set(key, value);\n  }\n\n  remove(key: string): void {\n    this.store.delete(key);\n  }\n\n  clear(): void {\n    this.store.clear();\n  }\n}\n\n/**\n * Crea el adapter de almacenamiento, respetando la preferencia del usuario y\n * cayendo a la mejor alternativa disponible si la preferida no existe.\n */\nexport function createStorage(\n  preferred: 'localStorage' | 'cookie' | 'memory' = 'localStorage',\n): StorageAdapter {\n  if (preferred === 'localStorage' && hasLocalStorage()) return new LocalStorageAdapter();\n  if (preferred === 'cookie' && hasDocument()) return new CookieAdapter();\n  if (preferred === 'memory') return new MemoryAdapter();\n\n  // Cadena de fallback.\n  if (hasLocalStorage()) return new LocalStorageAdapter();\n  if (hasDocument()) return new CookieAdapter();\n  return new MemoryAdapter();\n}\n","import { hasNavigatorSendBeacon } from '../utils/safe-env';\n\nexport interface TransportConfig {\n  apiUrl: string;\n  apiKey: string;\n  sdkVersion: string;\n  timeoutMs?: number;\n}\n\n/** Error de transporte con el código HTTP asociado (0 si fue un fallo de red). */\nexport class TransportError extends Error {\n  constructor(\n    message: string,\n    public readonly statusCode: number,\n  ) {\n    super(message);\n    this.name = 'TransportError';\n  }\n}\n\n/**\n * Capa de red del SDK. Envía JSON al backend vía `fetch` (con timeout) y\n * ofrece `sendBeacon` para descargas fiables al cerrar la página.\n */\nexport class Transport {\n  constructor(private readonly config: TransportConfig) {}\n\n  /** Envío normal con `fetch`. Lanza `TransportError` si la respuesta no es OK. */\n  async send<T = unknown>(path: string, body: unknown): Promise<T> {\n    const url = `${this.config.apiUrl}${path}`;\n    const controller = new AbortController();\n    const timeoutMs = this.config.timeoutMs ?? 10000;\n    // Abortamos con un motivo explícito para que el log sea claro\n    // (`TimeoutError`) en vez del confuso \"signal is aborted without reason\".\n    const timeoutId = setTimeout(\n      () =>\n        controller.abort(new DOMException(`Veo request timeout (${timeoutMs}ms)`, 'TimeoutError')),\n      timeoutMs,\n    );\n\n    try {\n      const response = await fetch(url, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-Api-Key': this.config.apiKey,\n          'X-Sdk-Version': this.config.sdkVersion,\n        },\n        body: JSON.stringify(body),\n        // NO usar `keepalive: true` en los flushes normales: tiene límites\n        // estrictos del navegador (cuota de requests/64KB) y produce abortos\n        // espurios cuando hay varios envíos seguidos. El envío fiable al cerrar\n        // la página ya lo cubre `sendBeacon()` (ver Queue.flushBeacon).\n        signal: controller.signal,\n      });\n\n      if (!response.ok) {\n        throw new TransportError(`HTTP ${response.status}`, response.status);\n      }\n\n      return (await response.json()) as T;\n    } finally {\n      clearTimeout(timeoutId);\n    }\n  }\n\n  /**\n   * Envío con `navigator.sendBeacon`. Fire-and-forget, pensado para `pagehide`.\n   * Como sendBeacon no admite headers, la API key viaja por query string.\n   */\n  sendBeacon(path: string, body: unknown): boolean {\n    if (!hasNavigatorSendBeacon()) return false;\n\n    const url = new URL(`${this.config.apiUrl}${path}`);\n    url.searchParams.set('key', this.config.apiKey);\n    url.searchParams.set('v', this.config.sdkVersion);\n\n    const blob = new Blob([JSON.stringify(body)], { type: 'application/json' });\n    return navigator.sendBeacon(url.toString(), blob);\n  }\n}\n","import { autocapturePlugin } from '../plugins/autocapture';\nimport { spaRouterPlugin } from '../plugins/spa-router';\nimport type { VeoClient, VeoConfig } from '../types';\nimport { resolveApiUrl } from './api-url';\nimport { maybeLoadBuilder } from './builder-loader';\nimport { Client } from './client';\n\n/**\n * Setup común del cliente, compartido por el entry ESM/CJS (`index.ts`, guías\n * estáticas) y el IIFE (`veo.ts`, guías perezosas). NO importa el plugin de\n * guías: la instalación va por el callback `onGuides`, así el bundle IIFE puede\n * quedar sin los renderers.\n *\n * Hace: client + spa-router + autocapture, instala guías vía callback, asigna\n * `window.veo` drenando la cola del snippet, y dispara el loader del builder.\n */\nexport function setupClient(\n  config: VeoConfig,\n  onGuides: (client: VeoClient) => void,\n  loadBuilder?: () => Promise<unknown>,\n): VeoClient {\n  const client = new Client(config);\n\n  client.use(spaRouterPlugin());\n\n  if (config.autocapture !== false) {\n    const autocaptureConfig = typeof config.autocapture === 'object' ? config.autocapture : {};\n    client.use(autocapturePlugin(autocaptureConfig));\n  }\n\n  // Guías (opt-in): el caller decide instalarlas sync (bundler) o lazy (IIFE).\n  onGuides(client);\n\n  if (typeof window !== 'undefined') {\n    const stub = (window as unknown as { veo?: { _q?: unknown[][] } }).veo;\n    const pending = stub?._q ?? [];\n\n    (window as unknown as { veo: VeoClient }).veo = client;\n\n    for (const entry of pending) {\n      const [method, args] = entry;\n      if (method === 'init') continue; // ya inicializado\n      const fn = (client as unknown as Record<string, (...a: unknown[]) => unknown>)[\n        method as string\n      ];\n      if (typeof fn === 'function') {\n        try {\n          fn.apply(client, Array.from(args as ArrayLike<unknown>));\n        } catch (err) {\n          if (config.debug) console.error('[veo] drain error:', err);\n        }\n      }\n    }\n\n    maybeLoadBuilder({\n      ...(config.builderUrl !== undefined ? { builderUrl: config.builderUrl } : {}),\n      ...(config.debug !== undefined ? { debug: config.debug } : {}),\n      ...(config.apiKey !== undefined ? { apiKey: config.apiKey } : {}),\n      apiUrl: resolveApiUrl(config),\n      ...(loadBuilder ? { loadBuilder } : {}),\n    });\n  }\n\n  return client;\n}\n","import type { VeoPlugin } from '../../types';\nimport { hasWindow } from '../../utils/safe-env';\nimport { definePlugin } from '../plugin';\nimport { GuidesController } from './guides-controller';\n\nexport interface GuidesPluginConfig {\n  apiUrl: string;\n  apiKey: string;\n  debug?: boolean;\n}\n\n/** Resultado del install — expone el controller para debugging desde el demo. */\nexport interface GuidesPluginHandle {\n  controller: GuidesController;\n}\n\n/**\n * Plugin que renderiza guías in-app (modal/banner/tooltip) consultando\n * `GET /v1/guides/resolve` y registra las interacciones en\n * `POST /v1/guides/:id/interactions` vía queue dedicada con retry y\n * sendBeacon en pagehide.\n *\n * Opt-in: `init({ ..., guides: true })`. El plugin escucha\n * `pageview` e `identify` del client; el payload del evento ya trae\n * `sessionId` y `endUserId` para que no necesitemos consultar al\n * client en cada disparo.\n *\n * Frequency híbrida: el backend filtra autoritariamente; el cache\n * local (`GuideFrequencyCache`) solo previene el flash visual cuando\n * la interaction aún no se persistió.\n */\nexport function guidesPlugin(config: GuidesPluginConfig): VeoPlugin {\n  return definePlugin({\n    name: 'guides',\n    install(client) {\n      if (!hasWindow()) return;\n      const controller = new GuidesController(client, config);\n\n      // Exponer el controller en window para que el demo y tests E2E\n      // puedan inspeccionar el cache y la queue.\n      (window as unknown as { __veoGuides?: GuidesPluginHandle }).__veoGuides = { controller };\n\n      client.on('identify', ({ sessionId }) => {\n        void controller.checkGuides(window.location.href, sessionId);\n      });\n\n      client.on('pageview', ({ url, sessionId }) => {\n        void controller.checkGuides(url, sessionId);\n      });\n\n      // Como el bundle de guías se carga PEREZOSAMENTE, el plugin puede\n      // instalarse DESPUÉS del pageview/identify inicial — esos eventos ya\n      // pasaron. Chequeamos la página actual ahora mismo para que la guía\n      // aparezca apenas se entra (sin necesitar una 2ª acción). Si todavía no\n      // hay endUserId, checkGuides no hace nada y el listener de `identify` la\n      // mostrará; el dedupe por guideId evita un doble render.\n      void controller.checkGuides(window.location.href, client.getSessionId());\n    },\n  });\n}\n\nexport type { PreviewGuideInput, PreviewHandle, PreviewResult } from './guide-preview';\nexport { closeGuidePreview, previewGuide } from './guide-preview';\nexport type { PreviewModeHandle, PreviewModeOptions } from './preview-mode';\nexport { runPreviewMode } from './preview-mode';\nexport type { GuideInteractionEvent, GuideStep, ResolvedGuide } from './types';\n","import type { VeoClient } from '../../types';\nimport {\n  DEFAULT_TRACKER_BATCH_SIZE,\n  DEFAULT_TRACKER_FLUSH_INTERVAL_MS,\n  DEFAULT_TRACKER_MAX_RETRIES,\n} from './constants';\nimport { GuideFrequencyCache, namespaceFromApiKey } from './guide-frequency-cache';\nimport { GuideResolverClient } from './guide-resolver-client';\nimport { GuideTrackerClient } from './guide-tracker-client';\nimport { GuideTrackerQueue } from './guide-tracker-queue';\nimport { BadgeRenderer } from './renderers/badge-renderer';\nimport { BannerRenderer } from './renderers/banner-renderer';\nimport type { 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  CompositeStep,\n  FrequencyStatus,\n  GuideInteractionAction,\n  GuideInteractionEvent,\n  GuideType,\n  ResolvedGuide,\n  WalkthroughCallbacks,\n} from './types';\nimport { stepMatchesPage } from './url-match';\nimport { WalkthroughStateManager } from './walkthrough-state';\n\nexport interface GuidesControllerConfig {\n  apiUrl: string;\n  apiKey: string;\n  debug?: boolean;\n  /** Override del resolver (tests). */\n  resolver?: GuideResolverClient;\n  /** Override del tracker queue (tests). */\n  trackerQueue?: GuideTrackerQueue;\n  /** Override del cache (tests). */\n  frequencyCache?: GuideFrequencyCache;\n  /** Override del walkthrough state manager (tests). */\n  walkthroughState?: WalkthroughStateManager;\n}\n\n/**\n * Ventana durante la cual un `resolve` de la MISMA `(endUserId, url)` se sirve\n * de memoria sin pegarle al backend. Corta el doble disparo identify+pageview\n * en la carga y los pageviews repetidos de una SPA (mismo URL re-montado). Las\n * guías no son tiempo-real: 30 s de staleness es imperceptible y baja el\n * volumen de `/v1/guides/resolve` drásticamente con muchos usuarios.\n */\nconst RESOLVE_CACHE_TTL_MS = 30_000;\n\n/** Mapeo `action → cache status`. Solo acciones terminales mutan el cache. */\nconst STATUS_BY_ACTION: Record<GuideInteractionAction, FrequencyStatus | null> = {\n  shown: 'shown',\n  dismissed: 'dismissed',\n  cta_clicked: null,\n  step_advanced: null,\n  step_back: null,\n  completed: 'completed',\n};\n\n/**\n * Orquesta el ciclo de vida de las guías:\n *\n *   1. `pageview`/`identify` → `checkGuides(url, sessionId)`.\n *   2. Si hay un walkthrough activo (estado persistido en localStorage),\n *      tiene prioridad: se intenta resumir en la página actual antes de\n *      consultar nuevas guías. Si el selector del step actual aparece,\n *      se pinta; si no, se cancela el walkthrough limpiamente.\n *   3. Si no hay walkthrough activo, se consulta `/v1/guides/resolve` y\n *      se procesa cada guía:\n *        - `walkthrough` con varios steps → arranca un walkthrough\n *          (uno a la vez; el resto se ignora si ya hay uno).\n *        - single-step → modal/banner/tooltip como antes.\n *   4. Cada interaction actualiza el cache local Y se encola para\n *      `POST /v1/guides/:id/interactions`.\n *\n * Dedupe: `dispatched` guarda `${guideId}:${action}` ya encolados en la\n * sesión actual del SDK. Las acciones por-step de walkthroughs no\n * usan dedupe — cada `step_advanced` puede repetirse y representa una\n * navegación distinta.\n */\nexport class GuidesController {\n  private readonly resolver: GuideResolverClient;\n  private readonly trackerQueue: GuideTrackerQueue;\n  private readonly frequencyCache: GuideFrequencyCache;\n  private readonly walkthroughState: WalkthroughStateManager;\n  private readonly debug: boolean;\n  /** Para `POST /v1/guides/:id/form-response` (respuestas de guías form). */\n  private readonly apiUrl: string;\n  private readonly apiKey: string;\n  private readonly activeRenderers = new Set<BaseRenderer>();\n  /**\n   * Guías single-step actualmente en pantalla, por `guideId`. Evita repintar/\n   * duplicar la misma guía en cada pageview de una SPA (p.ej. una guía inline\n   * anclada a un elemento persistente). Se libera al cerrarse la guía.\n   */\n  private readonly activeByGuideId = new Map<string, BaseRenderer>();\n  private readonly dispatched = new Set<string>();\n  /**\n   * Renderer del paso de walkthrough activo. Puede ser el `WalkthroughRenderer`\n   * (tooltip anclado) o un Modal/Banner con navegación (walkthrough heterogéneo);\n   * tipamos por `destroy()`, lo único que el controller necesita.\n   */\n  private activeWalkthroughRenderer: { destroy(): void } | null = null;\n  private activeWalkthroughGuide: ResolvedGuide | null = null;\n  /** Última resolución cacheada (mismo `(endUserId, url)` → sin red). */\n  private resolveCache: { key: string; at: number; guides: ResolvedGuide[] } | null = null;\n  /** Resolución idéntica en vuelo, para coalescer llamadas concurrentes. */\n  private inflightResolve: { key: string; promise: Promise<ResolvedGuide[]> } | null = null;\n  /**\n   * Disparadores por interacción armados (`on_click`/`on_hover`): guideId →\n   * desarme del listener. Se re-arman desde cero en cada `checkGuides` (el\n   * resolve fresco manda) y se limpian en `destroy()`.\n   */\n  private readonly armedTriggers = new Map<string, () => void>();\n  /**\n   * Tour composite ESPERANDO navegación: el usuario avanzó a un paso cuya\n   * `pageLocation` apunta a otra página. Se resume en `checkGuides` cuando llega\n   * a esa página (tours multi-página estilo Pendo).\n   */\n  private pendingComposite: { guide: ResolvedGuide; stepIndex: number } | null = null;\n  /**\n   * Guías composite EN PANTALLA con el paso mostrado, por `guideId`. En una SPA,\n   * al navegar a una página que ya NO matchea la `pageLocation` del paso, hay que\n   * DESTRUIR la guía (si no, queda pegada y \"se muestra en todo lado\"). Se poda\n   * en cada `checkGuides` con {@link pruneComposite}.\n   */\n  private readonly activeComposite = new Map<\n    string,\n    { guide: ResolvedGuide; stepIndex: number; cleanup: () => void }\n  >();\n\n  constructor(\n    private readonly client: VeoClient,\n    config: GuidesControllerConfig,\n  ) {\n    this.debug = config.debug === true;\n    this.apiUrl = config.apiUrl;\n    this.apiKey = config.apiKey;\n    this.resolver =\n      config.resolver ?? new GuideResolverClient(config.apiUrl, config.apiKey, this.debug);\n\n    if (config.trackerQueue) {\n      this.trackerQueue = config.trackerQueue;\n    } else {\n      const httpClient = new GuideTrackerClient(config.apiUrl, config.apiKey);\n      this.trackerQueue = new GuideTrackerQueue({\n        client: httpClient,\n        flushIntervalMs: DEFAULT_TRACKER_FLUSH_INTERVAL_MS,\n        batchSize: DEFAULT_TRACKER_BATCH_SIZE,\n        maxRetries: DEFAULT_TRACKER_MAX_RETRIES,\n        onError: (err, item) => {\n          if (this.debug) {\n            console.warn(\n              `[veo] dropped guide interaction after retries: guideId=${item.guideId} action=${item.payload.action}`,\n              err,\n            );\n          }\n        },\n      });\n    }\n\n    const namespace = namespaceFromApiKey(config.apiKey);\n    this.frequencyCache = config.frequencyCache ?? new GuideFrequencyCache(namespace);\n    this.walkthroughState = config.walkthroughState ?? new WalkthroughStateManager(namespace);\n  }\n\n  /** Cuántas interactions hay pendientes de envío. Útil para debug en demo. */\n  get pendingInteractions(): number {\n    return this.trackerQueue.size;\n  }\n\n  /** Limpia el cache local (botón \"reset\" del demo, tests). */\n  clearFrequencyCache(): void {\n    this.frequencyCache.clear();\n  }\n\n  /** Limpia el walkthrough activo (debug del demo). */\n  clearWalkthroughState(): void {\n    this.tearDownWalkthrough();\n  }\n\n  /** Punto de entrada principal. Llamado en cada pageview/identify. */\n  async checkGuides(pageUrl: string, sessionId: string): Promise<void> {\n    const endUserId = this.client.getEndUserId();\n    if (!endUserId) {\n      if (this.debug) console.log('[veo] guides: skipped, no endUserId yet');\n      return;\n    }\n\n    // Poda las guías composite en pantalla cuyo paso ya NO aplica a esta URL\n    // (navegación en SPA): sin esto quedan pegadas y \"se muestran en todo lado\".\n    this.pruneComposite(pageUrl);\n\n    if (await this.tryResumeWalkthrough(endUserId, sessionId, pageUrl)) {\n      return;\n    }\n\n    // Tour composite multi-página: si hay un paso pendiente que aplica a ESTA\n    // página, resúmelo. No corta el resto del flujo (otras guías pueden mostrarse).\n    this.tryResumeComposite(sessionId, pageUrl);\n\n    let guides: ResolvedGuide[];\n    try {\n      guides = await this.resolveGuides(endUserId, pageUrl);\n    } catch (err) {\n      if (this.debug) console.error('[veo] guides resolver threw:', err);\n      return;\n    }\n    if (this.debug) console.log(`[veo] guides: ${guides.length} eligible at ${pageUrl}`);\n\n    // Los disparadores por interacción se re-arman desde el resolve fresco:\n    // desarmar todo primero es idempotente y maneja las SPAs (la guía que ya\n    // no aplica a esta URL no queda armada de una navegación anterior).\n    this.disarmTriggers();\n\n    for (const guide of guides) {\n      const trigger = guide.activationRules.trigger;\n      if ((trigger === 'on_click' || trigger === 'on_hover') && guide.activationRules.selector) {\n        this.armInteractionTrigger(guide, endUserId, sessionId, pageUrl);\n        continue;\n      }\n      await this.showGuide(guide, endUserId, sessionId, pageUrl);\n    }\n  }\n\n  /**\n   * Muestra una guía elegible (filtro de frecuencia + dedupe + dispatch por\n   * tipo). Cuerpo original del loop de `checkGuides`, extraído para que los\n   * disparadores por interacción pasen por LOS MISMOS chequeos al disparar.\n   */\n  private async showGuide(\n    guide: ResolvedGuide,\n    endUserId: string,\n    sessionId: string,\n    pageUrl: string,\n  ): Promise<void> {\n    if (this.frequencyCache.shouldFilter(guide.guideId, guide.displayFrequency)) {\n      if (this.debug) console.log(`[veo] guides: filtered locally guideId=${guide.guideId}`);\n      return;\n    }\n\n    // Ya está en pantalla → no repintar/duplicar (clave en SPAs: cada\n    // navegación dispara un pageview, pero la guía sigue montada).\n    if (this.activeByGuideId.has(guide.guideId)) {\n      if (this.debug) console.log(`[veo] guides: already shown guideId=${guide.guideId}`);\n      return;\n    }\n\n    if (guide.guideType === 'walkthrough' && guide.guideSteps.length > 1) {\n      if (this.walkthroughState.hasActive()) {\n        if (this.debug)\n          console.log(`[veo] guides: walkthrough ${guide.guideId} skipped (another active)`);\n        return;\n      }\n      await this.startWalkthrough(guide, endUserId, sessionId, pageUrl);\n      // Las guías single-step pueden seguir mostrándose en paralelo. Solo se\n      // bloquean OTROS walkthroughs vía hasActive().\n      return;\n    }\n\n    // Modelo unificado: targeting de página POR-PASO + navegación multi-paso.\n    if (guide.guideType === 'composite') {\n      this.startComposite(guide, sessionId, pageUrl);\n      return;\n    }\n\n    this.runSingleStepRender(guide, sessionId, pageUrl);\n  }\n\n  /**\n   * Arma un disparador por interacción: la guía NO se muestra al cargar, sino\n   * cuando el usuario hace click / pasa el mouse sobre `activationRules.selector`.\n   * Listener DELEGADO en `document` (fase captura, sin preventDefault — el click\n   * original de la app sigue funcionando). Al disparar se desarma y la guía pasa\n   * por `showGuide` (mismos chequeos de frecuencia/dedupe). Tras cerrarse, el\n   * próximo pageview/identify la re-arma — hover/click vuelve a mostrarla\n   * mientras la frecuencia lo permita.\n   */\n  private armInteractionTrigger(\n    guide: ResolvedGuide,\n    endUserId: string,\n    sessionId: string,\n    pageUrl: string,\n  ): void {\n    // Armar solo lo que tiene sentido mostrar: si la frecuencia ya la filtra o\n    // ya está en pantalla, no escuchamos de más.\n    if (this.frequencyCache.shouldFilter(guide.guideId, guide.displayFrequency)) return;\n    if (this.activeByGuideId.has(guide.guideId)) return;\n    if (this.armedTriggers.has(guide.guideId)) return;\n\n    const selector = guide.activationRules.selector as string;\n    const eventName = guide.activationRules.trigger === 'on_hover' ? 'mouseover' : 'click';\n\n    const onFire = (e: Event): void => {\n      const target = e.target;\n      if (!(target instanceof Element)) return;\n      try {\n        if (!target.closest(selector)) return;\n      } catch {\n        return; // selector inválido en la DB: no romper la app\n      }\n      disarm();\n      void this.showGuide(guide, endUserId, sessionId, pageUrl);\n    };\n    const disarm = (): void => {\n      document.removeEventListener(eventName, onFire, true);\n      this.armedTriggers.delete(guide.guideId);\n    };\n\n    document.addEventListener(eventName, onFire, true);\n    this.armedTriggers.set(guide.guideId, disarm);\n    if (this.debug)\n      console.log(`[veo] guides: armed ${eventName} trigger for ${guide.guideId} on ${selector}`);\n  }\n\n  /** Desarma todos los disparadores por interacción pendientes. */\n  private disarmTriggers(): void {\n    for (const disarm of this.armedTriggers.values()) disarm();\n    this.armedTriggers.clear();\n  }\n\n  /**\n   * `resolve` con cache de corta duración + coalescing:\n   *   - Mismo `(endUserId, url)` resuelto hace < {@link RESOLVE_CACHE_TTL_MS} →\n   *     se reusa sin red. Colapsa el doble disparo identify+pageview y los\n   *     pageviews repetidos de una SPA hacia la misma URL.\n   *   - Si ya hay un resolve idéntico en vuelo, se espera ESE (no se abre otro).\n   * El re-render sigue siendo idempotente (dedupe por `activeByGuideId` +\n   * `frequencyCache`), así que reusar el resultado no duplica guías.\n   */\n  private async resolveGuides(endUserId: string, pageUrl: string): Promise<ResolvedGuide[]> {\n    const key = `${endUserId}\\n${pageUrl}`;\n    const now = Date.now();\n\n    if (this.resolveCache?.key === key && now - this.resolveCache.at < RESOLVE_CACHE_TTL_MS) {\n      if (this.debug) console.log('[veo] guides: resolve cache hit');\n      return this.resolveCache.guides;\n    }\n\n    if (this.inflightResolve?.key === key) {\n      return this.inflightResolve.promise;\n    }\n\n    const promise = this.resolver.resolve(endUserId, pageUrl);\n    this.inflightResolve = { key, promise };\n    try {\n      const guides = await promise;\n      this.resolveCache = { key, at: Date.now(), guides };\n      return guides;\n    } finally {\n      if (this.inflightResolve?.key === key) this.inflightResolve = null;\n    }\n  }\n\n  /** Cierra todas las guías activas, limpia cache de dispatch y para timers. */\n  destroy(): void {\n    for (const renderer of this.activeRenderers) {\n      try {\n        renderer.destroy();\n      } catch (err) {\n        if (this.debug) console.error('[veo] renderer destroy failed:', err);\n      }\n    }\n    this.activeRenderers.clear();\n    this.activeByGuideId.clear();\n    this.activeComposite.clear();\n    if (this.activeWalkthroughRenderer) {\n      try {\n        this.activeWalkthroughRenderer.destroy();\n      } catch {\n        // swallow — el cleanup no debe propagar\n      }\n      this.activeWalkthroughRenderer = null;\n      this.activeWalkthroughGuide = null;\n    }\n    this.disarmTriggers();\n    this.dispatched.clear();\n    this.resolveCache = null;\n    this.inflightResolve = null;\n    this.trackerQueue.destroy();\n  }\n\n  private runSingleStepRender(guide: ResolvedGuide, sessionId: string, pageUrl: string): void {\n    const renderer = this.createSingleStepRenderer(guide.guideType);\n    if (!renderer) return;\n\n    // Reservar el slot YA (antes del delay) para que pageviews rápidos no\n    // disparen dos renders de la misma guía.\n    this.activeByGuideId.set(guide.guideId, renderer);\n\n    const delayMs = guide.activationRules.delayMs ?? 0;\n    window.setTimeout(\n      () => this.mountSingleStepRenderer(guide, renderer, sessionId, pageUrl),\n      delayMs,\n    );\n  }\n\n  /**\n   * Camino del modelo unificado (`composite`). Elige el PRIMER paso cuya\n   * `pageLocation` matchea la URL actual (targeting por-paso) y lo pinta con el\n   * `CompositeRenderer`. Si ningún paso aplica a esta página, no muestra nada.\n   */\n  private startComposite(guide: ResolvedGuide, sessionId: string, pageUrl: string): void {\n    // Ya hay un tour de esta guía a mitad de camino (esperando navegación) → no\n    // reiniciar desde el paso 0; el resume lo maneja `tryResumeComposite`.\n    if (this.pendingComposite?.guide.guideId === guide.guideId) return;\n    const steps = guide.guideSteps as unknown as CompositeStep[];\n    const start = steps.findIndex((s) => stepMatchesPage(s.pageLocation, pageUrl));\n    if (start === -1) return; // ningún paso aplica a esta URL\n    this.renderCompositeStep(guide, start, sessionId, pageUrl);\n  }\n\n  /**\n   * Destruye las guías composite en pantalla cuyo paso mostrado ya no matchea la\n   * URL actual (el usuario navegó fuera de su `pageLocation` en una SPA). Sin\n   * esto la guía queda montada en el DOM y aparece en páginas que no debía.\n   */\n  private pruneComposite(pageUrl: string): void {\n    for (const entry of this.activeComposite.values()) {\n      const steps = entry.guide.guideSteps as unknown as CompositeStep[];\n      const step = steps[entry.stepIndex];\n      if (!step || !stepMatchesPage(step.pageLocation, pageUrl)) {\n        entry.cleanup(); // borra de activeComposite/activeByGuideId y destruye\n      }\n    }\n  }\n\n  /**\n   * Resume un tour composite que quedó esperando navegación: si el paso\n   * pendiente aplica a la página actual, lo pinta. Devuelve `true` si resumió.\n   */\n  private tryResumeComposite(sessionId: string, pageUrl: string): boolean {\n    const pending = this.pendingComposite;\n    if (!pending) return false;\n    const steps = pending.guide.guideSteps as unknown as CompositeStep[];\n    const step = steps[pending.stepIndex];\n    if (!step) {\n      this.pendingComposite = null;\n      return false;\n    }\n    if (!stepMatchesPage(step.pageLocation, pageUrl)) return false; // aún no llegó\n    this.pendingComposite = null;\n    this.renderCompositeStep(pending.guide, pending.stepIndex, sessionId, pageUrl);\n    return true;\n  }\n\n  /**\n   * Pinta UN paso composite. En guías multi-paso pasa `nav` al renderer para\n   * que los botones next/prev avancen (misma página); en single-step los\n   * botones cierran. Cada avance destruye el paso anterior y monta el siguiente.\n   */\n  private renderCompositeStep(\n    guide: ResolvedGuide,\n    idx: number,\n    sessionId: string,\n    pageUrl: string,\n  ): void {\n    const steps = guide.guideSteps as unknown as CompositeStep[];\n    const renderer = new CompositeRenderer();\n    this.activeRenderers.add(renderer);\n    this.activeByGuideId.set(guide.guideId, renderer);\n\n    const cleanup = (): void => {\n      renderer.destroy();\n      this.activeRenderers.delete(renderer);\n      if (this.activeByGuideId.get(guide.guideId) === renderer) {\n        this.activeByGuideId.delete(guide.guideId);\n      }\n      this.activeComposite.delete(guide.guideId);\n    };\n    // Registrar el paso mostrado para poder podarlo si el usuario navega a una\n    // página que ya no lo matchea (targeting por-paso en SPAs).\n    this.activeComposite.set(guide.guideId, { guide, stepIndex: idx, cleanup });\n\n    // Avanza a `target`: si ese paso aplica a la página ACTUAL lo pinta ya\n    // (tour misma-página); si apunta a OTRA página, guarda el pendiente y espera\n    // a que el usuario navegue (tour multi-página, se resume en `checkGuides`).\n    const goToStep = (target: number): void => {\n      cleanup();\n      if (target < 0 || target >= steps.length) return; // fuera de rango → fin\n      const step = steps[target];\n      if (step && stepMatchesPage(step.pageLocation, pageUrl)) {\n        this.renderCompositeStep(guide, target, sessionId, pageUrl);\n      } else {\n        this.pendingComposite = { guide, stepIndex: target };\n      }\n    };\n\n    const nav =\n      steps.length > 1\n        ? {\n            stepIndex: idx,\n            totalSteps: steps.length,\n            callbacks: {\n              onNext: (): void => goToStep(idx + 1),\n              onBack: (): void => goToStep(idx - 1),\n              onGoto: (target: number): void => goToStep(target),\n              onSkip: cleanup,\n              onComplete: cleanup,\n            },\n          }\n        : undefined;\n\n    try {\n      void renderer.render({\n        guide,\n        onInteraction: (e) => this.handleInteraction(guide, sessionId, pageUrl, e),\n        onClose: cleanup,\n        onTrack: (name, props) => this.client.track(name, props),\n        onFormSubmit: (answers) => this.submitFormResponse(guide.guideId, answers),\n        onOpenGuide: (targetGuideId) => {\n          void this.openGuideById(targetGuideId, sessionId, pageUrl);\n        },\n        ...(nav ? { nav } : {}),\n      });\n    } catch (err) {\n      if (this.debug) console.error('[veo] composite renderer threw:', err);\n      cleanup();\n    }\n  }\n\n  private mountSingleStepRenderer(\n    guide: ResolvedGuide,\n    renderer: BaseRenderer,\n    sessionId: string,\n    pageUrl: string,\n  ): void {\n    this.activeRenderers.add(renderer);\n    this.activeByGuideId.set(guide.guideId, renderer);\n\n    const onClose = (): void => {\n      renderer.destroy();\n      this.activeRenderers.delete(renderer);\n      if (this.activeByGuideId.get(guide.guideId) === renderer) {\n        this.activeByGuideId.delete(guide.guideId);\n      }\n    };\n\n    const onInteraction = (event: GuideInteractionEvent): void => {\n      this.handleInteraction(guide, sessionId, pageUrl, event);\n    };\n\n    const onTrack = (eventName: string, properties?: Record<string, unknown>): void => {\n      this.client.track(eventName, properties);\n    };\n\n    const onFormSubmit = (answers: Record<string, unknown>): Promise<boolean> =>\n      this.submitFormResponse(guide.guideId, answers);\n\n    // Encadenado: un botón `action:'guide'` abre otra guía por id.\n    const onOpenGuide = (targetGuideId: string): void => {\n      void this.openGuideById(targetGuideId, sessionId, pageUrl);\n    };\n\n    try {\n      void renderer.render({ guide, onInteraction, onClose, onTrack, onFormSubmit, onOpenGuide });\n    } catch (err) {\n      if (this.debug) console.error('[veo] renderer.render threw:', err);\n      this.activeRenderers.delete(renderer);\n      if (this.activeByGuideId.get(guide.guideId) === renderer) {\n        this.activeByGuideId.delete(guide.guideId);\n      }\n    }\n  }\n\n  /**\n   * Abre una guía POR ID, disparada desde el botón de otra guía (encadenado).\n   * Ignora las URL rules y el trigger (el autor lo pidió explícitamente desde\n   * un botón); respeta el dedupe de guías activas y el flujo normal de\n   * tracking. 404/red → no-op (la guía destino pudo borrarse).\n   */\n  private async openGuideById(guideId: string, sessionId: string, pageUrl: string): Promise<void> {\n    if (this.activeByGuideId.has(guideId)) return;\n    const guide = await this.resolver.fetchById(guideId);\n    if (!guide) {\n      if (this.debug) console.warn(`[veo] guides: chained guide ${guideId} not found`);\n      return;\n    }\n    const endUserId = this.client.getEndUserId() ?? this.client.getAnonymousId();\n    if (guide.guideType === 'walkthrough' && guide.guideSteps.length > 1) {\n      if (!this.walkthroughState.hasActive()) {\n        await this.startWalkthrough(guide, endUserId, sessionId, pageUrl);\n      }\n      return;\n    }\n    this.runSingleStepRender(guide, sessionId, pageUrl);\n  }\n\n  /**\n   * Si hay un walkthrough persistido, intenta pintar el step actual en\n   * la página actual. Retorna `true` si lo intentó (sea éxito o cancel),\n   * `false` si no había walkthrough activo.\n   *\n   * Cancela limpiamente (sin enviar `dismissed` falso) cuando:\n   *   - La guía fue eliminada en el backend (404 → `fetchById` devuelve null).\n   *   - La guía cambió de tipo y ya no es walkthrough.\n   *   - El selector del step actual no aparece dentro del timeout.\n   */\n  private async tryResumeWalkthrough(\n    endUserId: string,\n    sessionId: string,\n    pageUrl: string,\n  ): Promise<boolean> {\n    const state = this.walkthroughState.current();\n    if (!state) return false;\n\n    const guide = await this.resolver.fetchById(state.guideId);\n    if (!guide || guide.guideType !== 'walkthrough') {\n      if (this.debug)\n        console.log(`[veo] guides: walkthrough ${state.guideId} no longer available, cleaning up`);\n      this.tearDownWalkthrough();\n      return true;\n    }\n\n    // El cache local podría tener una versión más vieja del total; usamos\n    // siempre el del backend.\n    const stepIndex = Math.min(state.currentStepIndex, guide.guideSteps.length - 1);\n    await this.renderWalkthroughStep(guide, stepIndex, endUserId, sessionId, pageUrl);\n    return true;\n  }\n\n  private async startWalkthrough(\n    guide: ResolvedGuide,\n    endUserId: string,\n    sessionId: string,\n    pageUrl: string,\n  ): Promise<void> {\n    this.walkthroughState.start(guide.guideId, guide.guideSteps.length);\n    const rendered = await this.renderWalkthroughStep(guide, 0, endUserId, sessionId, pageUrl);\n    if (!rendered) return; // teardown ya corrió, no reportamos shown.\n    // Reportamos `shown` SOLO al arrancar (step 0). Steps siguientes\n    // se cubren con `step_advanced`/`step_back`. Marcamos cache local\n    // también para que `displayFrequency='once'` filtre en la próxima\n    // pageview aunque la interaction aún esté en la queue.\n    this.enqueueInteractionOnce(guide.guideId, endUserId, sessionId, pageUrl, 'shown', 0);\n    this.frequencyCache.record(guide.guideId, 'shown');\n  }\n\n  /**\n   * Pinta el step indicado. Reusa la guía (no fetcha): el caller debe\n   * traerla. Retorna `true` si el render fue exitoso. En caso contrario\n   * ya disparó el teardown — el caller no debe seguir reportando.\n   */\n  private async renderWalkthroughStep(\n    guide: ResolvedGuide,\n    stepIndex: number,\n    endUserId: string,\n    sessionId: string,\n    pageUrl: string,\n  ): Promise<boolean> {\n    if (this.activeWalkthroughRenderer) {\n      this.activeWalkthroughRenderer.destroy();\n      this.activeWalkthroughRenderer = null;\n    }\n\n    this.activeWalkthroughGuide = guide;\n\n    const callbacks: WalkthroughCallbacks = {\n      onNext: () => this.handleWalkthroughNext(endUserId, sessionId, pageUrl),\n      onBack: () => this.handleWalkthroughBack(endUserId, sessionId, pageUrl),\n      onSkip: () => this.handleWalkthroughSkip(endUserId, sessionId, pageUrl),\n      onComplete: () => this.handleWalkthroughComplete(endUserId, sessionId, pageUrl),\n    };\n\n    // Walkthrough HETEROGÉNEO: un paso puede pedir renderizarse como modal o\n    // banner (via `step.style.render`). Esos renderers siempre montan (no\n    // dependen de un ancla), así que reportamos éxito directo. El resto\n    // (tooltip/default) usa el WalkthroughRenderer anclado.\n    const step = guide.guideSteps[stepIndex];\n    const render = readStepRender(step);\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: () => {},\n          nav: { stepIndex, totalSteps: guide.guideSteps.length, callbacks },\n        });\n      } catch (err) {\n        if (this.debug) console.error('[veo] sequence renderer threw:', err);\n        this.tearDownWalkthrough();\n        return false;\n      }\n      this.activeWalkthroughRenderer = renderer;\n      return true;\n    }\n\n    const renderer = new WalkthroughRenderer();\n    let success = false;\n    try {\n      success = await renderer.render({ guide, currentStepIndex: stepIndex, callbacks });\n    } catch (err) {\n      if (this.debug) console.error('[veo] walkthrough renderer threw:', err);\n    }\n\n    if (!success) {\n      if (this.debug)\n        console.warn(\n          `[veo] walkthrough ${guide.guideId} step ${stepIndex} could not render, cancelling`,\n        );\n      this.tearDownWalkthrough();\n      return false;\n    }\n\n    this.activeWalkthroughRenderer = renderer;\n    return true;\n  }\n\n  private handleWalkthroughNext(endUserId: string, sessionId: string, pageUrl: string): void {\n    const guide = this.activeWalkthroughGuide;\n    if (!guide) return;\n\n    const newState = this.walkthroughState.advance();\n    if (!newState) {\n      // Ya estábamos en el último step. No debería pasar (el botón\n      // dispara onComplete en ese caso), pero por defensa lo manejamos.\n      this.handleWalkthroughComplete(endUserId, sessionId, pageUrl);\n      return;\n    }\n\n    this.enqueueInteraction(\n      guide.guideId,\n      endUserId,\n      sessionId,\n      pageUrl,\n      'step_advanced',\n      newState.currentStepIndex,\n    );\n    void this.renderWalkthroughStep(\n      guide,\n      newState.currentStepIndex,\n      endUserId,\n      sessionId,\n      pageUrl,\n    );\n  }\n\n  private handleWalkthroughBack(endUserId: string, sessionId: string, pageUrl: string): void {\n    const guide = this.activeWalkthroughGuide;\n    if (!guide) return;\n\n    const state = this.walkthroughState.current();\n    if (!state || state.currentStepIndex === 0) return;\n\n    const newState = this.walkthroughState.back();\n    if (!newState) return;\n\n    this.enqueueInteraction(\n      guide.guideId,\n      endUserId,\n      sessionId,\n      pageUrl,\n      'step_back',\n      newState.currentStepIndex,\n    );\n    void this.renderWalkthroughStep(\n      guide,\n      newState.currentStepIndex,\n      endUserId,\n      sessionId,\n      pageUrl,\n    );\n  }\n\n  private handleWalkthroughSkip(endUserId: string, sessionId: string, pageUrl: string): void {\n    const guide = this.activeWalkthroughGuide;\n    const state = this.walkthroughState.current();\n    if (!guide || !state) return;\n\n    this.enqueueInteraction(\n      guide.guideId,\n      endUserId,\n      sessionId,\n      pageUrl,\n      'dismissed',\n      state.currentStepIndex,\n    );\n    this.frequencyCache.record(guide.guideId, 'dismissed');\n    this.tearDownWalkthrough();\n  }\n\n  private handleWalkthroughComplete(endUserId: string, sessionId: string, pageUrl: string): void {\n    const guide = this.activeWalkthroughGuide;\n    const state = this.walkthroughState.current();\n    if (!guide || !state) return;\n\n    this.enqueueInteraction(\n      guide.guideId,\n      endUserId,\n      sessionId,\n      pageUrl,\n      'completed',\n      state.currentStepIndex,\n    );\n    this.frequencyCache.record(guide.guideId, 'completed');\n    this.tearDownWalkthrough();\n  }\n\n  private tearDownWalkthrough(): void {\n    if (this.activeWalkthroughRenderer) {\n      try {\n        this.activeWalkthroughRenderer.destroy();\n      } catch {\n        // swallow\n      }\n    }\n    this.activeWalkthroughRenderer = null;\n    this.activeWalkthroughGuide = null;\n    this.walkthroughState.clear();\n  }\n\n  /**\n   * Tras cada interaction single-step:\n   *   1. dedupe (no enviar 2× la misma `(guideId, action)` por sesión)\n   *   2. actualizar el cache local si corresponde\n   *   3. encolar el POST\n   *\n   * El endUserId se lee del client EN ESTE MOMENTO (no en el render),\n   * por si el usuario se identificó después de que la guía apareció.\n   */\n  private handleInteraction(\n    guide: ResolvedGuide,\n    sessionId: string,\n    pageUrl: string,\n    event: GuideInteractionEvent,\n  ): void {\n    // Con varios botones por paso, cada botón cuenta aparte: el buttonId entra\n    // a la key (si no, el segundo botón clickeado se perdería por dedup).\n    const buttonKey = event.metadata?.buttonId ? `:${event.metadata.buttonId}` : '';\n    const dedupKey = `${guide.guideId}:${event.action}${buttonKey}`;\n    if (this.dispatched.has(dedupKey)) {\n      if (this.debug) console.log(`[veo] guides: dedup hit ${dedupKey}`);\n      return;\n    }\n    this.dispatched.add(dedupKey);\n\n    const cacheStatus = STATUS_BY_ACTION[event.action];\n    if (cacheStatus) this.frequencyCache.record(guide.guideId, cacheStatus);\n\n    const endUserId = this.client.getEndUserId();\n    if (!endUserId) {\n      if (this.debug)\n        console.warn('[veo] guides: interaction without endUserId — skipping enqueue');\n      return;\n    }\n\n    this.trackerQueue.enqueue({\n      guideId: guide.guideId,\n      payload: {\n        endUserId,\n        sessionId,\n        action: event.action,\n        stepIndex: event.stepIndex,\n        pageUrl,\n        pagePath: extractPath(pageUrl),\n        ...(event.metadata ? { metadata: event.metadata } : {}),\n      },\n    });\n  }\n\n  /**\n   * Encola una interacción de walkthrough SIN pasar por el dedup set.\n   * Acciones como `step_advanced` se repiten naturalmente (cada next es\n   * una navegación distinta) y deduplicarlas perdería datos.\n   */\n  private enqueueInteraction(\n    guideId: string,\n    endUserId: string,\n    sessionId: string,\n    pageUrl: string,\n    action: GuideInteractionAction,\n    stepIndex: number,\n  ): void {\n    this.trackerQueue.enqueue({\n      guideId,\n      payload: {\n        endUserId,\n        sessionId,\n        action,\n        stepIndex,\n        pageUrl,\n        pagePath: extractPath(pageUrl),\n      },\n    });\n  }\n\n  /**\n   * Encola con dedup por sesión del SDK. Para `shown` del primer step:\n   * no queremos re-emitirlo si el usuario navega entre dos páginas que\n   * matchean el mismo step.\n   */\n  private enqueueInteractionOnce(\n    guideId: string,\n    endUserId: string,\n    sessionId: string,\n    pageUrl: string,\n    action: GuideInteractionAction,\n    stepIndex: number,\n  ): void {\n    const dedupKey = `${guideId}:${action}:${stepIndex}`;\n    if (this.dispatched.has(dedupKey)) return;\n    this.dispatched.add(dedupKey);\n    this.enqueueInteraction(guideId, endUserId, sessionId, pageUrl, action, stepIndex);\n  }\n\n  private 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\n  /**\n   * Envía las respuestas de una guía `form` al backend, que las mergea como\n   * propiedades del usuario. Usa el endUserId actual (o el anónimo si aún no\n   * hubo identify — el backend pre-crea la fila igual que identify).\n   */\n  private async submitFormResponse(\n    guideId: string,\n    answers: Record<string, unknown>,\n  ): Promise<boolean> {\n    const endUserId = this.client.getEndUserId() ?? this.client.getAnonymousId();\n    try {\n      const res = await fetch(`${this.apiUrl}/v1/guides/${guideId}/form-response`, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', 'X-Api-Key': this.apiKey },\n        body: JSON.stringify({ endUserId, answers }),\n      });\n      if (!res.ok && this.debug) {\n        console.warn('[veo] form-response respondió', res.status);\n      }\n      return res.ok;\n    } catch (err) {\n      if (this.debug) console.warn('[veo] form-response falló:', err);\n      return false;\n    }\n  }\n}\n\nfunction extractPath(url: string): string {\n  try {\n    return new URL(url).pathname;\n  } catch {\n    return '/';\n  }\n}\n\n/**\n * Cómo se presenta un paso dentro de un walkthrough. `style.render` ∈\n * `modal`/`banner` usa esos renderers (con navegación); cualquier otro valor\n * (incluido ausente o `tooltip`) usa el WalkthroughRenderer anclado.\n */\nfunction readStepRender(step: ResolvedGuide['guideSteps'][number] | undefined): string {\n  const r = (step?.style as Record<string, unknown> | null | undefined)?.render;\n  return typeof r === 'string' ? r : 'walkthrough';\n}\n","import {\n  FREQUENCY_CACHE_KEY_PREFIX,\n  FREQUENCY_CACHE_MAX_ENTRIES,\n  FREQUENCY_CACHE_TTL_MS,\n} from './constants';\nimport type { DisplayFrequency, FrequencyCacheEntry, FrequencyStatus } from './types';\n\n/** Prioridad de status para no degradar shown→dismissed→… */\nconst STATUS_PRIORITY: Record<FrequencyStatus, number> = {\n  shown: 1,\n  dismissed: 2,\n  completed: 2,\n};\n\n/**\n * Namespace short y estable derivado del apiKey. NO es cripto: solo evita\n * que dos apps que comparten el navegador pisen sus caches. El apiKey\n * público (`pk_*`) ya es workspace-único, así que usar sus últimos 16\n * caracteres alcanza para diferenciar.\n */\nexport function namespaceFromApiKey(apiKey: string): string {\n  return apiKey.slice(-16) || 'default';\n}\n\n/**\n * Cache persistente de \"qué guías ya vio/cerró este usuario\". Vive en\n * `localStorage` con key namespaceada para evitar colisión entre\n * workspaces que corren en el mismo navegador.\n *\n * No es source of truth — el backend siempre manda. Esta cache solo\n * evita el flash visual de re-pintar una guía que el usuario ya cerró\n * antes de que el roundtrip al backend termine.\n */\nexport class GuideFrequencyCache {\n  private readonly storageKey: string;\n  private cache: Map<string, FrequencyCacheEntry>;\n\n  constructor(namespace: string) {\n    this.storageKey = `${FREQUENCY_CACHE_KEY_PREFIX}${namespace}`;\n    this.cache = this.load();\n    this.prune();\n  }\n\n  /**\n   * Decide si una guía debe filtrarse localmente antes de pintarla.\n   *\n   *   - `every_visit` / `always` → nunca filtra (siempre re-pinta).\n   *   - `once` → cualquier entry registrada filtra (verla ya cuenta).\n   *   - `until_dismissed` → si fue descartada O COMPLETADA (responder un\n   *     form / terminar un walkthrough es más fuerte que descartar — sin\n   *     esto, una encuesta seguiría preguntando después de respondida).\n   */\n  shouldFilter(guideId: string, displayFrequency: DisplayFrequency): boolean {\n    if (displayFrequency === 'every_visit' || displayFrequency === 'always') return false;\n\n    const entry = this.cache.get(guideId);\n    if (!entry) return false;\n\n    if (displayFrequency === 'once') return true;\n    if (displayFrequency === 'until_dismissed') {\n      return entry.status === 'dismissed' || entry.status === 'completed';\n    }\n    // `until_answered` (forms): solo COMPLETAR filtra localmente. El descarte\n    // no la silencia — y si las props ya tienen valor por otro medio, es el\n    // BACKEND quien la excluye del resolve (aquí no conocemos los traits).\n    if (displayFrequency === 'until_answered') return entry.status === 'completed';\n    return false;\n  }\n\n  /**\n   * Registra/actualiza la entry de una guía. Nunca degrada un estado más\n   * fuerte (no convierte `dismissed` en `shown` por un re-render). Persiste\n   * cada llamada — escribir a localStorage es lo bastante barato.\n   */\n  record(guideId: string, status: FrequencyStatus): void {\n    const existing = this.cache.get(guideId);\n    if (existing && STATUS_PRIORITY[status] < STATUS_PRIORITY[existing.status]) {\n      return;\n    }\n    this.cache.set(guideId, {\n      guideId,\n      status,\n      lastInteractionAt: Date.now(),\n    });\n    this.persist();\n  }\n\n  /** Limpia el cache (botón \"reset\" del demo, tests). */\n  clear(): void {\n    this.cache.clear();\n    this.persist();\n  }\n\n  /** Útil para debugging — devuelve un snapshot. */\n  snapshot(): FrequencyCacheEntry[] {\n    return Array.from(this.cache.values());\n  }\n\n  /**\n   * Limpia entries expiradas por TTL y, si aún excede el límite, descarta\n   * las más viejas hasta caber. Se ejecuta una vez en el constructor; no\n   * vale la pena correrlo a cada lectura.\n   */\n  private prune(): void {\n    const now = Date.now();\n    let mutated = false;\n\n    for (const [id, entry] of this.cache) {\n      if (now - entry.lastInteractionAt > FREQUENCY_CACHE_TTL_MS) {\n        this.cache.delete(id);\n        mutated = true;\n      }\n    }\n\n    if (this.cache.size > FREQUENCY_CACHE_MAX_ENTRIES) {\n      const sorted = Array.from(this.cache.entries()).sort(\n        (a, b) => a[1].lastInteractionAt - b[1].lastInteractionAt,\n      );\n      const excess = this.cache.size - FREQUENCY_CACHE_MAX_ENTRIES;\n      for (let i = 0; i < excess; i++) {\n        const tuple = sorted[i];\n        if (tuple) this.cache.delete(tuple[0]);\n      }\n      mutated = true;\n    }\n\n    if (mutated) this.persist();\n  }\n\n  private load(): Map<string, FrequencyCacheEntry> {\n    if (typeof localStorage === 'undefined') return new Map();\n    try {\n      const raw = localStorage.getItem(this.storageKey);\n      if (!raw) return new Map();\n      const parsed = JSON.parse(raw) as unknown;\n      if (!Array.isArray(parsed)) return new Map();\n      const entries: Array<[string, FrequencyCacheEntry]> = [];\n      for (const item of parsed) {\n        if (\n          item &&\n          typeof item === 'object' &&\n          typeof (item as FrequencyCacheEntry).guideId === 'string' &&\n          typeof (item as FrequencyCacheEntry).lastInteractionAt === 'number' &&\n          ['shown', 'dismissed', 'completed'].includes((item as FrequencyCacheEntry).status)\n        ) {\n          const e = item as FrequencyCacheEntry;\n          entries.push([e.guideId, e]);\n        }\n      }\n      return new Map(entries);\n    } catch {\n      return new Map();\n    }\n  }\n\n  private persist(): void {\n    if (typeof localStorage === 'undefined') return;\n    try {\n      const serialized = JSON.stringify(Array.from(this.cache.values()));\n      localStorage.setItem(this.storageKey, serialized);\n    } catch {\n      // QuotaExceeded o similar — el cache es opcional, no rompemos la app.\n    }\n  }\n}\n","import type { ResolvedGuide, ResolveGuidesResponse } from './types';\n\n/**\n * Wrapper sobre `GET /v1/guides/resolve`. Nunca lanza: cualquier error de\n * red o de parsing devuelve un array vacío, para que el plugin no rompa\n * la app del cliente.\n *\n * Importante: el endpoint usa `?pageUrl=...` (no `?url=...`) — el backend\n * valida con class-validator `IsUrl({ require_protocol: true })`.\n */\nexport class GuideResolverClient {\n  constructor(\n    private readonly apiUrl: string,\n    private readonly apiKey: string,\n    private readonly debug = false,\n  ) {}\n\n  async resolve(endUserId: string, pageUrl: string): Promise<ResolvedGuide[]> {\n    const params = new URLSearchParams({ endUserId, pageUrl });\n    let response: Response;\n    try {\n      response = await fetch(`${this.apiUrl}/v1/guides/resolve?${params.toString()}`, {\n        method: 'GET',\n        headers: { 'X-Api-Key': this.apiKey },\n        credentials: 'omit',\n      });\n    } catch (err) {\n      if (this.debug) console.error('[veo] guides resolve fetch failed:', err);\n      return [];\n    }\n\n    if (!response.ok) {\n      if (this.debug) console.warn('[veo] guides resolve HTTP', response.status);\n      return [];\n    }\n\n    try {\n      const data = (await response.json()) as ResolveGuidesResponse;\n      return Array.isArray(data.guides) ? data.guides : [];\n    } catch (err) {\n      if (this.debug) console.error('[veo] guides resolve parse failed:', err);\n      return [];\n    }\n  }\n\n  /**\n   * Trae una guía específica por ID, sin pasar por la lógica de\n   * activación. La usa el controller para resumir un walkthrough entre\n   * páginas: el `resolve` no devuelve la guía si la URL actual no\n   * matchea, pero el walkthrough activo debe poder consultarla igual.\n   *\n   * El endpoint backend (`GET /v1/guides/:guideId`) devuelve `GuideResponse`,\n   * un superset de `ResolvedGuide` con campos de audit. Aquí descartamos los\n   * extra y nos quedamos con el shape que el resto del SDK ya consume.\n   *\n   * Devuelve `null` en cualquier error (404, red, parse) — el caller debe\n   * tratarlo como \"guía ya no existe\" y cancelar el walkthrough limpiamente.\n   */\n  async fetchById(guideId: string): Promise<ResolvedGuide | null> {\n    let response: Response;\n    try {\n      response = await fetch(`${this.apiUrl}/v1/guides/${encodeURIComponent(guideId)}`, {\n        method: 'GET',\n        headers: { 'X-Api-Key': this.apiKey },\n        credentials: 'omit',\n      });\n    } catch (err) {\n      if (this.debug) console.error('[veo] guides fetchById network failed:', err);\n      return null;\n    }\n\n    if (!response.ok) {\n      if (this.debug) console.warn('[veo] guides fetchById HTTP', response.status);\n      return null;\n    }\n\n    try {\n      const data = (await response.json()) as Partial<ResolvedGuide>;\n      if (\n        typeof data.guideId !== 'string' ||\n        typeof data.guideName !== 'string' ||\n        typeof data.guideType !== 'string' ||\n        !Array.isArray(data.guideSteps) ||\n        !data.activationRules ||\n        typeof data.displayFrequency !== 'string' ||\n        typeof data.displayPriority !== 'number'\n      ) {\n        if (this.debug) console.warn('[veo] guides fetchById: unexpected shape');\n        return null;\n      }\n      return {\n        guideId: data.guideId,\n        guideName: data.guideName,\n        guideType: data.guideType,\n        guideSteps: data.guideSteps,\n        activationRules: data.activationRules,\n        displayFrequency: data.displayFrequency,\n        displayPriority: data.displayPriority,\n      };\n    } catch (err) {\n      if (this.debug) console.error('[veo] guides fetchById parse failed:', err);\n      return null;\n    }\n  }\n}\n","import type { GuideInteractionMetadata, GuideInteractionPayload } from './types';\n\nexport interface InteractionRequest {\n  guideId: string;\n  payload: GuideInteractionPayload;\n}\n\n/**\n * Wire shape esperada por `POST /v1/guides/:id/interactions` en el backend.\n * Nuestro tipo interno (`GuideInteractionPayload`) usa `action`/`stepIndex`;\n * el backend exige `interactionType`/`stepPosition`. Esta función centraliza\n * la traducción.\n */\ninterface WireInteraction {\n  endUserId: string;\n  sessionId?: string;\n  interactionType: GuideInteractionPayload['action'];\n  stepPosition?: number;\n  pageUrl?: string;\n  pagePath?: string;\n  metadata?: GuideInteractionMetadata;\n}\n\nfunction toWire(payload: GuideInteractionPayload): WireInteraction {\n  const wire: WireInteraction = {\n    endUserId: payload.endUserId,\n    interactionType: payload.action,\n  };\n  if (payload.sessionId) wire.sessionId = payload.sessionId;\n  if (typeof payload.stepIndex === 'number') wire.stepPosition = payload.stepIndex;\n  if (payload.pageUrl) wire.pageUrl = payload.pageUrl;\n  if (payload.pagePath) wire.pagePath = payload.pagePath;\n  if (payload.metadata) wire.metadata = payload.metadata;\n  return wire;\n}\n\n/**\n * Cliente HTTP puro para registrar interacciones de guías. No hace retry\n * ni queue — esa responsabilidad vive en `GuideTrackerQueue`.\n *\n * `send` lanza en error (queue puede reintentar). `sendBeacon` es síncrono,\n * \"best effort\", para el cierre de página: usa `navigator.sendBeacon` con\n * el apiKey como query param `?key=` (la única forma de autenticar con\n * sendBeacon, ya que no permite headers custom — el backend lo soporta\n * desde el ApiKeyGuard).\n */\nexport class GuideTrackerClient {\n  constructor(\n    private readonly apiUrl: string,\n    private readonly apiKey: string,\n  ) {}\n\n  async send(request: InteractionRequest): Promise<void> {\n    const url = this.buildUrl(request.guideId);\n    const response = await fetch(url, {\n      method: 'POST',\n      headers: {\n        'X-Api-Key': this.apiKey,\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify(toWire(request.payload)),\n      credentials: 'omit',\n    });\n\n    if (!response.ok) {\n      throw new Error(`guide interaction send failed: HTTP ${response.status}`);\n    }\n  }\n\n  /**\n   * Envío \"fire-and-forget\" en pagehide. Devuelve `false` si el navegador\n   * no acepta el beacon (cola llena, no soportado) — en ese caso la queue\n   * sabrá que perdió el envío.\n   */\n  sendBeacon(request: InteractionRequest): boolean {\n    if (typeof navigator === 'undefined' || typeof navigator.sendBeacon !== 'function') {\n      return false;\n    }\n    const url = `${this.buildUrl(request.guideId)}?key=${encodeURIComponent(this.apiKey)}`;\n    const blob = new Blob([JSON.stringify(toWire(request.payload))], {\n      type: 'application/json',\n    });\n    try {\n      return navigator.sendBeacon(url, blob);\n    } catch {\n      return false;\n    }\n  }\n\n  private buildUrl(guideId: string): string {\n    return `${this.apiUrl}/v1/guides/${encodeURIComponent(guideId)}/interactions`;\n  }\n}\n","import type { GuideTrackerClient, InteractionRequest } from './guide-tracker-client';\nimport type { QueuedInteraction } from './types';\n\n/** Base del backoff de reintento (ms); crece exponencial hasta el tope. */\nconst RETRY_BASE_MS = 3000;\nconst RETRY_MAX_DELAY_MS = 30_000;\n\nexport interface GuideTrackerQueueConfig {\n  client: GuideTrackerClient;\n  flushIntervalMs: number;\n  batchSize: number;\n  maxRetries: number;\n  /**\n   * Llamado cuando un item se descarta tras agotar `maxRetries`. El\n   * plugin puede usarlo para `console.warn` en debug mode. Nunca debe\n   * lanzar — si lo hace, se ignora silenciosamente.\n   */\n  onError?: (error: Error, item: QueuedInteraction) => void;\n}\n\n/**\n * Queue dedicada para `POST /v1/guides/:id/interactions`.\n *\n * Cada item es independiente (URL distinto por `guideId`), así que el\n * \"batch\" en realidad dispara N requests en paralelo. El `batchSize` es\n * el umbral para forzar un flush — no agrupa requests en uno solo.\n *\n * Retry:\n *   - Si `send()` lanza, el item se devuelve al buffer con `attempts++`.\n *   - El timer regular vuelve a intentar en el próximo tick.\n *   - Al alcanzar `maxRetries`, se descarta llamando `onError`.\n *\n * En `pagehide`/`visibilitychange` (hidden) drena el buffer vía\n * `navigator.sendBeacon`. Best effort — no re-encola lo que el beacon\n * rechace porque la página ya se va.\n */\nexport class GuideTrackerQueue {\n  private buffer: QueuedInteraction[] = [];\n  private timer: ReturnType<typeof setInterval> | null = null;\n  private flushing = false;\n  private unloadCleanup: (() => void) | null = null;\n\n  constructor(private readonly config: GuideTrackerQueueConfig) {\n    this.startTimer();\n    this.installUnloadHandler();\n  }\n\n  /** Tamaño actual del buffer (útil para debug/stats en el demo). */\n  get size(): number {\n    return this.buffer.length;\n  }\n\n  /**\n   * Encola una interaction. Si el buffer alcanza `batchSize`, dispara\n   * `flush()` inmediato.\n   */\n  enqueue(request: InteractionRequest): void {\n    this.buffer.push({\n      guideId: request.guideId,\n      payload: request.payload,\n      attempts: 0,\n      enqueuedAt: Date.now(),\n    });\n    if (this.buffer.length >= this.config.batchSize) {\n      void this.flush();\n    }\n  }\n\n  /**\n   * Envía todo el buffer en paralelo. Items que fallan vuelven al buffer\n   * si todavía tienen reintentos disponibles. Idempotente con respecto a\n   * flushes concurrentes (el segundo es un no-op).\n   */\n  async flush(): Promise<void> {\n    if (this.flushing || this.buffer.length === 0) return;\n\n    // Solo enviamos los items VENCIDOS (nextRetryAt en el pasado). Los que\n    // esperan su backoff+jitter tras un fallo quedan en el buffer para un\n    // tick futuro — así los reintentos de distintos clientes no se sincronizan.\n    const now = Date.now();\n    const due = this.buffer.filter((item) => (item.nextRetryAt ?? 0) <= now);\n    if (due.length === 0) return;\n    this.flushing = true;\n\n    const dueSet = new Set(due);\n    this.buffer = this.buffer.filter((item) => !dueSet.has(item));\n\n    const results = await Promise.allSettled(\n      due.map((item) => this.config.client.send({ guideId: item.guideId, payload: item.payload })),\n    );\n\n    for (let i = 0; i < results.length; i++) {\n      const result = results[i];\n      const item = due[i];\n      if (!result || !item) continue;\n      if (result.status === 'fulfilled') continue;\n\n      item.attempts += 1;\n      if (item.attempts < this.config.maxRetries) {\n        item.nextRetryAt = Date.now() + this.retryDelayMs(item.attempts);\n        this.buffer.push(item);\n      } else {\n        this.safeOnError(result.reason, item);\n      }\n    }\n\n    this.flushing = false;\n  }\n\n  /**\n   * Backoff exponencial (base = intervalo de flush) con equal-jitter: mitad\n   * fija + mitad aleatoria. Desincroniza los reintentos entre clientes ante\n   * una caída del backend.\n   */\n  private retryDelayMs(attempts: number): number {\n    const base = Math.min(RETRY_BASE_MS * 2 ** (attempts - 1), RETRY_MAX_DELAY_MS);\n    return base / 2 + Math.random() * (base / 2);\n  }\n\n  /**\n   * Drena el buffer vía `sendBeacon`. Síncrono, sin retry. Para pagehide.\n   */\n  flushBeacon(): void {\n    if (this.buffer.length === 0) return;\n    const batch = this.buffer.splice(0, this.buffer.length);\n    for (const item of batch) {\n      this.config.client.sendBeacon({ guideId: item.guideId, payload: item.payload });\n    }\n  }\n\n  destroy(): void {\n    if (this.timer) clearInterval(this.timer);\n    this.timer = null;\n    this.unloadCleanup?.();\n    this.unloadCleanup = null;\n  }\n\n  private startTimer(): void {\n    if (typeof window === 'undefined') return;\n    this.timer = setInterval(() => {\n      void this.flush();\n    }, this.config.flushIntervalMs);\n  }\n\n  private installUnloadHandler(): void {\n    if (typeof window === 'undefined') return;\n    const onPagehide = (): void => this.flushBeacon();\n    const onVisibility = (): void => {\n      if (document.visibilityState === 'hidden') this.flushBeacon();\n    };\n    window.addEventListener('pagehide', onPagehide);\n    window.addEventListener('visibilitychange', onVisibility);\n    this.unloadCleanup = () => {\n      window.removeEventListener('pagehide', onPagehide);\n      window.removeEventListener('visibilitychange', onVisibility);\n    };\n  }\n\n  private safeOnError(reason: unknown, item: QueuedInteraction): void {\n    if (!this.config.onError) return;\n    const error = reason instanceof Error ? reason : new Error(String(reason));\n    try {\n      this.config.onError(error, item);\n    } catch {\n      // Un onError roto no debe afectar al resto del flush.\n    }\n  }\n}\n","import { WALKTHROUGH_ABANDONMENT_TIMEOUT_MS, WALKTHROUGH_STATE_KEY_PREFIX } from './constants';\nimport type { WalkthroughState } from './types';\n\n/**\n * Estado persistente del walkthrough activo. Solo permite UNO por\n * workspace (namespace de apiKey). Vive en `localStorage` para sobrevivir\n * recargas de página: el step actual + el guideId alcanzan para resumir\n * desde donde quedó el usuario.\n *\n * Si pasan más de `WALKTHROUGH_ABANDONMENT_TIMEOUT_MS` sin progreso, se\n * considera abandonado: la próxima llamada a `current()` lo limpia\n * silenciosamente. NO se reporta `dismissed` al backend en ese caso —\n * abandonarse no es un acto del usuario.\n */\nexport class WalkthroughStateManager {\n  private readonly storageKey: string;\n  private state: WalkthroughState | null = null;\n\n  constructor(namespace: string) {\n    this.storageKey = `${WALKTHROUGH_STATE_KEY_PREFIX}${namespace}`;\n    this.state = this.load();\n    if (this.state && this.isAbandoned(this.state)) {\n      this.clear();\n    }\n  }\n\n  /**\n   * Estado del walkthrough activo. Devuelve `null` si no hay ninguno o si\n   * el último progreso fue hace más del timeout (en ese caso también\n   * limpia el storage como side-effect).\n   */\n  current(): WalkthroughState | null {\n    if (!this.state) return null;\n    if (this.isAbandoned(this.state)) {\n      this.clear();\n      return null;\n    }\n    return this.state;\n  }\n\n  /** Atajo legible para el controller. */\n  hasActive(): boolean {\n    return this.current() !== null;\n  }\n\n  /**\n   * Inicia un nuevo walkthrough en step 0. Sobreescribe cualquier estado\n   * previo — los callers (controller) son responsables de verificar\n   * `hasActive()` antes si necesitan exclusividad.\n   */\n  start(guideId: string, totalSteps: number): WalkthroughState {\n    const now = Date.now();\n    this.state = {\n      guideId,\n      totalSteps,\n      currentStepIndex: 0,\n      startedAt: now,\n      lastProgressAt: now,\n    };\n    this.persist();\n    return this.state;\n  }\n\n  /**\n   * Avanza al siguiente step. Si el step resultante excede `totalSteps`,\n   * devuelve `null` y NO toca el estado — el controller debe interpretar\n   * eso como \"ya estamos en el último, no hay próximo\" y disparar\n   * `complete` vía el handler del botón \"Finalizar\".\n   */\n  advance(): WalkthroughState | null {\n    if (!this.state) return null;\n\n    const next = this.state.currentStepIndex + 1;\n    if (next >= this.state.totalSteps) return null;\n\n    this.state = {\n      ...this.state,\n      currentStepIndex: next,\n      lastProgressAt: Date.now(),\n    };\n    this.persist();\n    return this.state;\n  }\n\n  /**\n   * Retrocede al step anterior. En step 0 no hace nada y devuelve el\n   * estado tal cual (el botón \"Atrás\" no debería estar visible en el\n   * primer step, pero por defensa el manager también lo guard-ea).\n   */\n  back(): WalkthroughState | null {\n    if (!this.state) return null;\n    if (this.state.currentStepIndex === 0) return this.state;\n\n    this.state = {\n      ...this.state,\n      currentStepIndex: this.state.currentStepIndex - 1,\n      lastProgressAt: Date.now(),\n    };\n    this.persist();\n    return this.state;\n  }\n\n  /** Limpia el estado activo (skip, complete, abandono, guía borrada). */\n  clear(): void {\n    this.state = null;\n    if (typeof localStorage === 'undefined') return;\n    try {\n      localStorage.removeItem(this.storageKey);\n    } catch {\n      // Storage bloqueado — no rompemos la app.\n    }\n  }\n\n  private isAbandoned(state: WalkthroughState): boolean {\n    return Date.now() - state.lastProgressAt > WALKTHROUGH_ABANDONMENT_TIMEOUT_MS;\n  }\n\n  private load(): WalkthroughState | null {\n    if (typeof localStorage === 'undefined') return null;\n    try {\n      const raw = localStorage.getItem(this.storageKey);\n      if (!raw) return null;\n      const parsed = JSON.parse(raw) as unknown;\n      if (!parsed || typeof parsed !== 'object') return null;\n      const candidate = parsed as Partial<WalkthroughState>;\n      if (\n        typeof candidate.guideId !== 'string' ||\n        typeof candidate.totalSteps !== 'number' ||\n        typeof candidate.currentStepIndex !== 'number' ||\n        typeof candidate.startedAt !== 'number' ||\n        typeof candidate.lastProgressAt !== 'number'\n      ) {\n        return null;\n      }\n      return candidate as WalkthroughState;\n    } catch {\n      return null;\n    }\n  }\n\n  private persist(): void {\n    if (typeof localStorage === 'undefined' || !this.state) return;\n    try {\n      localStorage.setItem(this.storageKey, JSON.stringify(this.state));\n    } catch {\n      // Quota exceeded — silently fail. El walkthrough en memoria sigue.\n    }\n  }\n}\n","/**\n * Modo PREVIEW POR LINK: la app del cliente se abre con\n * `?veoPreview=<token>` (link generado desde el dashboard) y el SDK canjea\n * el token contra `POST /v1/guides/preview-resolve` para renderizar ESA\n * guía como vista previa — aunque esté en draft — sobre la app real.\n *\n * A diferencia del modo builder no hay puente postMessage ni dashboard\n * abierto: es un link compartible para que el equipo pruebe la guía sin\n * publicarla. Reusa `previewGuide` (sin tracking/frecuencia/resolver) y\n * monta un chip flotante con \"volver a mostrar\" y \"cerrar\".\n *\n * Vive en el bundle de guías (`veo-guides.js`), NO en el `veo.js` core —\n * el core solo detecta el query param y dispara la carga del bundle.\n */\nimport { clearPreviewToken } from '../../core/preview-loader';\nimport { hasDocument } from '../../utils/safe-env';\nimport { previewGuide } from './guide-preview';\nimport type { ResolvedGuide } from './types';\n\nexport interface PreviewModeOptions {\n  apiKey: string;\n  apiUrl: string;\n  /** Token firmado del link (`?veoPreview=<token>`). */\n  token: string;\n  debug?: boolean;\n}\n\nexport interface PreviewModeHandle {\n  /** Cierra la preview y quita el chip. Idempotente. */\n  teardown(): void;\n}\n\nlet active: PreviewModeHandle | null = null;\n\n/**\n * Canjea el token y renderiza la guía como vista previa + chip de control.\n * Si el token es inválido/expirado, el chip lo informa (solo quien tiene el\n * link lo ve). Solo una sesión de preview activa a la vez.\n */\nexport async function runPreviewMode(opts: PreviewModeOptions): Promise<PreviewModeHandle | null> {\n  if (!hasDocument()) return null;\n  active?.teardown();\n\n  let guide: ResolvedGuide | null = null;\n  try {\n    const res = await fetch(`${opts.apiUrl}/v1/guides/preview-resolve`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'X-Api-Key': opts.apiKey },\n      body: JSON.stringify({ token: opts.token }),\n    });\n    if (res.ok) {\n      const data = (await res.json()) as { guide?: ResolvedGuide };\n      guide = data.guide ?? null;\n    } else if (opts.debug) {\n      console.warn('[veo] preview-resolve respondió', res.status);\n    }\n  } catch (err) {\n    if (opts.debug) console.warn('[veo] preview-resolve falló:', err);\n  }\n\n  /**\n   * En el link de preview el envío de forms es REAL: corre sobre la app del\n   * cliente con el SDK inicializado, así que la respuesta se guarda en el\n   * usuario que está probando (su propia identidad) — permite verificar el\n   * flujo completo props→segmentos sin tocar a nadie más.\n   */\n  const submitToBackend = async (answers: Record<string, unknown>): Promise<boolean> => {\n    if (!guide) return false;\n    const veo = (\n      window as unknown as {\n        veo?: { getEndUserId?: () => string | null; getAnonymousId?: () => string };\n      }\n    ).veo;\n    const endUserId = veo?.getEndUserId?.() ?? veo?.getAnonymousId?.() ?? null;\n    if (!endUserId) return false;\n    try {\n      const res = await fetch(`${opts.apiUrl}/v1/guides/${guide.guideId}/form-response`, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', 'X-Api-Key': opts.apiKey },\n        body: JSON.stringify({ endUserId, answers }),\n      });\n      return res.ok;\n    } catch {\n      return false;\n    }\n  };\n\n  let preview: { close(): void } | null = null;\n  const show = (): void => {\n    if (!guide) return;\n    preview?.close();\n    preview = previewGuide({\n      guideType: guide.guideType,\n      guideSteps: guide.guideSteps,\n      activationRules: guide.activationRules,\n      guideName: guide.guideName,\n      formSubmit: submitToBackend,\n      formSubmitNote: 'Vista previa: guardado en TU usuario para probar el flujo.',\n    });\n  };\n\n  const chip = mountChip({\n    label: guide ? `Vista previa: ${guide.guideName}` : 'Link de preview inválido o vencido',\n    error: !guide,\n    onReshow: guide ? show : null,\n    onClose: () => handle.teardown(),\n  });\n\n  const handle: PreviewModeHandle = {\n    teardown() {\n      preview?.close();\n      preview = null;\n      chip.remove();\n      // Salir de verdad: borra el token persistido para que NO reaparezca al\n      // navegar (si no, sessionStorage lo reviviría en la próxima página).\n      clearPreviewToken();\n      if (active === handle) active = null;\n    },\n  };\n  active = handle;\n  show();\n  return handle;\n}\n\ninterface ChipOptions {\n  label: string;\n  error: boolean;\n  onReshow: (() => void) | null;\n  onClose: () => void;\n}\n\n/** Chip flotante (Shadow DOM, abajo-derecha) con re-mostrar y cerrar. */\nfunction mountChip(opts: ChipOptions): { remove(): void } {\n  const host = document.createElement('div');\n  host.setAttribute('data-veo-preview-chip', '');\n  const root = host.attachShadow({ mode: 'open' });\n\n  const style = document.createElement('style');\n  style.textContent = `\n    .chip { position: fixed; bottom: 16px; right: 16px; z-index: 2147483647;\n      display: flex; align-items: center; gap: 8px; padding: 8px 12px;\n      background: #111827; color: #f9fafb; border-radius: 9999px;\n      font: 500 12px/1.2 system-ui, sans-serif; box-shadow: 0 4px 12px rgba(0,0,0,.25); }\n    .chip.error { background: #7f1d1d; }\n    .label { max-width: 240px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n    button { all: unset; cursor: pointer; padding: 2px 6px; border-radius: 9999px;\n      font-size: 12px; line-height: 1; }\n    button:hover { background: rgba(255,255,255,.15); }\n  `;\n  root.appendChild(style);\n\n  const chip = document.createElement('div');\n  chip.className = opts.error ? 'chip error' : 'chip';\n\n  const label = document.createElement('span');\n  label.className = 'label';\n  label.textContent = opts.label;\n  chip.appendChild(label);\n\n  if (opts.onReshow) {\n    const reshow = document.createElement('button');\n    reshow.textContent = '↻';\n    reshow.title = 'Volver a mostrar la guía';\n    reshow.addEventListener('click', opts.onReshow);\n    chip.appendChild(reshow);\n  }\n\n  const close = document.createElement('button');\n  close.textContent = '✕';\n  close.title = 'Salir de la vista previa';\n  close.addEventListener('click', opts.onClose);\n  chip.appendChild(close);\n\n  root.appendChild(chip);\n  document.body.appendChild(host);\n  return { remove: () => host.remove() };\n}\n"]}