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