veo-sdk 0.6.3 → 0.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{builder-PPLIAUCM.mjs → builder-5F2EFT4X.mjs} +4 -4
- package/dist/{builder-PPLIAUCM.mjs.map → builder-5F2EFT4X.mjs.map} +1 -1
- package/dist/builder.cjs +42 -11
- package/dist/builder.cjs.map +1 -1
- package/dist/builder.mjs +4 -4
- package/dist/{chunk-3JEAPZ6A.mjs → chunk-72YH2GXC.mjs} +3 -3
- package/dist/{chunk-3JEAPZ6A.mjs.map → chunk-72YH2GXC.mjs.map} +1 -1
- package/dist/{chunk-SZCIXA5X.mjs → chunk-CMPOHTUM.mjs} +44 -13
- package/dist/chunk-CMPOHTUM.mjs.map +1 -0
- package/dist/{chunk-DU6I4ZU2.mjs → chunk-YEKCBVNJ.mjs} +3 -3
- package/dist/{chunk-DU6I4ZU2.mjs.map → chunk-YEKCBVNJ.mjs.map} +1 -1
- package/dist/index.cjs +52 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.mjs +7 -6
- package/dist/index.mjs.map +1 -1
- package/dist/veo-builder.js +18 -18
- package/dist/veo-builder.js.map +1 -1
- package/dist/veo-guides.js +6 -6
- package/dist/veo-guides.js.map +1 -1
- package/dist/veo.js +2 -2
- package/dist/veo.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-SZCIXA5X.mjs.map +0 -1
package/dist/builder.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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/autocapture/constants.ts","../src/plugins/autocapture/selector-builder.ts","../src/plugins/guides/activation-devices.ts","../src/plugins/guides/activation-rules.ts","../src/plugins/guides/constants.ts","../src/plugins/guides/rich-text.ts","../src/plugins/guides/video-block.ts","../src/plugins/guides/block-builder.ts","../src/utils/uuid.ts","../src/plugins/guides/renderers/custom-frame.ts","../src/plugins/guides/code-block.ts","../src/plugins/guides/guide-design.ts","../src/plugins/guides/inline-host.ts","../src/plugins/guides/wait-for-element.ts","../src/plugins/guides/styles.ts","../src/plugins/guides/renderers/base-renderer.ts","../src/plugins/guides/renderers/floating-arrow.ts","../src/plugins/guides/renderers/badge-renderer.ts","../src/plugins/guides/walkthrough-block-builder.ts","../src/plugins/guides/renderers/banner-renderer.ts","../src/plugins/guides/checklist-block.ts","../src/plugins/guides/form-content.ts","../src/plugins/guides/guide-theme.ts","../src/plugins/guides/layout.ts","../src/plugins/guides/scroll-lock.ts","../src/plugins/guides/snooze.ts","../src/plugins/guides/renderers/badge-marker.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-chrome.ts","../src/plugins/builder/builder-panel.ts","../src/plugins/builder/design-manipulator.ts","../src/plugins/builder/interactive-elements.ts","../src/plugins/builder/element-picker.ts","../src/plugins/builder/builder-mode.ts","../src/plugins/builder/builder-session.ts","../src/builder.ts"],"names":["el","session","classes","classPart","rebuilt","nodes","computePosition","offset","flip","shift","arrow","clamp","num","svg","update","stop","autoUpdate","node","ready","renderer","MIN_W","MIN_H","blocksRect","rect","EDGE"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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,EAucb,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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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","/** 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 captureClickQuality: true,\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 * «Mostrar la guía en» (Ajustes de activación): todos los dispositivos, solo\n * escritorio y tablets, o solo móvil. Se decide en el cliente por el ancho del\n * viewport (móvil = < 768px, el corte habitual). Función pura para testear.\n */\nimport type { ActivationDevices } from './types';\n\nexport const MOBILE_MAX_WIDTH = 767;\n\nexport function isDeviceAllowed(\n devices: ActivationDevices | null | undefined,\n viewportWidth: number = typeof window === 'undefined' ? 1024 : window.innerWidth,\n): boolean {\n if (!devices || devices === 'all') return true;\n const mobile = viewportWidth <= MOBILE_MAX_WIDTH;\n return devices === 'mobile' ? mobile : !mobile;\n}\n","import type { ActivationRules } from './types';\n\n/**\n * ¿La guía ARRANCA SOLA al cargar la página?\n * - `immediate` / `delayed`: sí (con `delayMs` en el segundo caso).\n * - `on_click` / `on_hover` + `autoShow`: sí, y además el elemento objetivo\n * la vuelve a abrir (Automático + Elemento objetivo, no excluyentes).\n * - `manual`: no; solo el badge del paso (o abrirla por id) la muestran.\n * Se usa para decidir el retraso y si el tooltip del badge se abre solo.\n */\nexport function isAutomaticActivation(rules: Partial<ActivationRules> | null | undefined): boolean {\n const trigger = rules?.trigger ?? 'immediate';\n if (trigger === 'immediate' || trigger === 'delayed') return true;\n if (trigger === 'on_click' || trigger === 'on_hover') return rules?.autoShow === true;\n return false;\n}\n\n/** Retraso efectivo en ms de una guía automática (0 si no aplica). */\nexport function activationDelayMs(rules: Partial<ActivationRules> | null | undefined): number {\n if (!isAutomaticActivation(rules)) return 0;\n const ms = rules?.delayMs ?? 0;\n return Number.isFinite(ms) && ms > 0 ? ms : 0;\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 type { StepBlock, VideoProvider } from './types';\n\n/**\n * Bloque `video`: embed del proveedor en un iframe. Solo se aceptan URLs de\n * los proveedores soportados, y el iframe apunta SIEMPRE al dominio de embed\n * conocido (nunca a la URL tal cual): así no se puede incrustar cualquier\n * sitio desde una guía.\n */\nexport function videoEmbedUrl(\n provider: VideoProvider | null | undefined,\n url: string,\n): string | null {\n let u: URL;\n try {\n u = new URL(url);\n } catch {\n return null;\n }\n if (u.protocol !== 'https:' && u.protocol !== 'http:') return null;\n const host = u.hostname.replace(/^www\\./, '').replace(/^m\\./, '');\n const id = (re: RegExp, from: string): string | null => {\n const m = from.match(re);\n return m?.[1] ?? null;\n };\n switch (provider) {\n case 'youtube': {\n let v: string | null = null;\n if (host === 'youtube.com' || host === 'youtube-nocookie.com') {\n v =\n u.searchParams.get('v') ??\n id(/^\\/(?:embed|shorts|live)\\/([A-Za-z0-9_-]{6,})/, u.pathname);\n } else if (host === 'youtu.be') {\n v = id(/^\\/([A-Za-z0-9_-]{6,})/, u.pathname);\n }\n if (!v || !/^[A-Za-z0-9_-]{6,}$/.test(v)) return null;\n return `https://www.youtube-nocookie.com/embed/${v}`;\n }\n case 'vimeo': {\n if (host !== 'vimeo.com' && host !== 'player.vimeo.com') return null;\n const v = id(/(\\d{6,})/, u.pathname);\n return v ? `https://player.vimeo.com/video/${v}` : null;\n }\n case 'loom': {\n if (host !== 'loom.com') return null;\n const v = id(/^\\/(?:share|embed)\\/([A-Za-z0-9]{16,})/, u.pathname);\n return v ? `https://www.loom.com/embed/${v}` : null;\n }\n case 'wistia': {\n // https://<cuenta>.wistia.com/medias/<id> | https://fast.wistia.net/embed/iframe/<id>\n if (!under(host, 'wistia.com') && !under(host, 'wistia.net')) return null;\n const v = id(/\\/(?:medias|embed\\/iframe)\\/([A-Za-z0-9]{6,})/, u.pathname);\n return v ? `https://fast.wistia.net/embed/iframe/${v}` : null;\n }\n case 'msstream': {\n // Stream clásico: https://web.microsoftstream.com/video/<guid>\n if (!under(host, 'microsoftstream.com')) return null;\n const v = id(/\\/(?:embed\\/)?video\\/([0-9a-f-]{36})/i, u.pathname);\n return v\n ? `https://web.microsoftstream.com/embed/video/${v}?autoplay=false&showinfo=true`\n : null;\n }\n case 'vidyard': {\n // https://share.vidyard.com/watch/<id> | https://play.vidyard.com/<id>\n if (!under(host, 'vidyard.com')) return null;\n const v =\n id(/\\/watch\\/([A-Za-z0-9_-]{8,})/, u.pathname) ??\n (host === 'play.vidyard.com' ? id(/^\\/([A-Za-z0-9_-]{8,})/, u.pathname) : null);\n return v ? `https://play.vidyard.com/${v}` : null;\n }\n case 'sharepoint':\n // Stream (SharePoint): el autor pega la URL de inserción que genera\n // SharePoint («Insertar»); no hay id derivable, se incrusta esa URL del\n // tenant (solo https y solo *.sharepoint.com).\n return u.protocol === 'https:' && under(host, 'sharepoint.com') ? u.href : null;\n case 'brightcove':\n // https://players.brightcove.net/<cuenta>/<player>_default/index.html?videoId=<id>\n return u.protocol === 'https:' &&\n host === 'players.brightcove.net' &&\n u.searchParams.get('videoId')\n ? u.href\n : null;\n case 'kaltura':\n // URL de inserción del reproductor: https://cdnapisec.kaltura.com/p/<partner>/…\n return u.protocol === 'https:' && under(host, 'kaltura.com') && u.pathname.startsWith('/p/')\n ? u.href\n : null;\n default:\n return null;\n }\n}\n\n/** `host` es `domain` o un subdominio suyo. */\nfunction under(host: string, domain: string): boolean {\n return host === domain || host.endsWith(`.${domain}`);\n}\n\n/** URL http(s) directa a un archivo de video (mp4/webm/mov). */\nexport function fileVideoUrl(url: string): string | null {\n try {\n const u = new URL(url);\n if (u.protocol !== 'https:' && u.protocol !== 'http:') return null;\n return /\\.(mp4|webm|mov)$/i.test(u.pathname) ? u.href : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Nodo del bloque video: wrapper con ancho (fijo en px o al contenedor) y\n * relación de aspecto, e iframe del proveedor. En edición (`editing`) se\n * quita pantalla completa (el estudio tapa la app) y el iframe no captura\n * el mouse (para poder seleccionarlo).\n */\nexport function buildVideoBlock(\n block: StepBlock,\n doc: Document,\n opts: { editing?: boolean } = {},\n): HTMLElement | null {\n const isFile = block.provider === 'file';\n const src =\n typeof block.url === 'string'\n ? isFile\n ? fileVideoUrl(block.url)\n : videoEmbedUrl(block.provider, block.url)\n : null;\n if (!src) return null;\n const s = (block.style ?? {}) as Record<string, unknown>;\n const wrap = doc.createElement('div');\n wrap.className = 'veo-guide-video';\n const ratio = s.aspect === '4:3' ? '4 / 3' : '16 / 9';\n wrap.style.aspectRatio = ratio;\n if (s.widthMode === 'fill') {\n wrap.style.width = '100%';\n } else {\n const w = typeof s.width === 'number' && Number.isFinite(s.width) ? s.width : 400;\n wrap.style.width = `${Math.max(120, Math.min(1600, w))}px`;\n wrap.style.maxWidth = '100%';\n }\n const align = s.align === 'center' ? 'center' : s.align === 'right' ? 'flex-end' : 'flex-start';\n wrap.style.alignSelf = align;\n if (isFile) {\n // Archivo propio: reproductor nativo (sin iframe).\n const video = doc.createElement('video');\n video.src = src;\n video.controls = true;\n video.setAttribute('playsinline', '');\n video.preload = 'metadata';\n video.setAttribute(\n 'aria-label',\n typeof block.alt === 'string' && block.alt.trim() ? block.alt.trim() : 'Video',\n );\n if (opts.editing) video.style.pointerEvents = 'none';\n wrap.appendChild(video);\n return wrap;\n }\n const frame = doc.createElement('iframe');\n frame.src = src;\n frame.title = typeof block.alt === 'string' && block.alt.trim() ? block.alt.trim() : 'Video';\n frame.setAttribute('loading', 'lazy');\n frame.setAttribute('referrerpolicy', 'strict-origin-when-cross-origin');\n frame.setAttribute(\n 'allow',\n `accelerometer; autoplay; clipboard-write; encrypted-media; picture-in-picture${opts.editing ? '' : '; fullscreen'}`,\n );\n if (!opts.editing) frame.setAttribute('allowfullscreen', '');\n if (opts.editing) frame.style.pointerEvents = 'none';\n wrap.appendChild(frame);\n return wrap;\n}\n","import { SAFE_URL_PROTOCOLS } from './constants';\nimport { renderRichText } from './rich-text';\nimport type { CtaAction, GuideInteractionMetadata, GuideStep, StepBlock } from './types';\nimport { buildVideoBlock } from './video-block';\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(\n block: StepBlock,\n doc: Document,\n opts: { editing?: boolean } = {},\n): HTMLElement | null {\n switch (block.type) {\n case 'video':\n return buildVideoBlock(block, doc, opts);\n case 'divider':\n return buildDividerBlock(block, doc);\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 = typeof block.alt === 'string' ? block.alt : '';\n applyBlockStyle(el, block.style, 'image');\n return el;\n }\n default:\n return null;\n }\n}\n\nconst DIVIDER_LINE_STYLES = new Set(['solid', 'dotted', 'dashed']);\n\n/**\n * Bloque `divider` (línea horizontal): wrapper de ancho completo con una\n * franja de 6px arriba/abajo (zona clickeable en el editor) y un `<hr>` cuyo\n * borde superior es la línea. `style`: `preset` theme|custom (custom habilita\n * color/grosor), `lineStyle` solid|dotted|dashed, `colorMode` (oscuro = línea\n * clara por defecto) y márgenes.\n */\nexport function buildDividerBlock(block: StepBlock, doc: Document): HTMLElement {\n const s = (block.style ?? {}) as Record<string, unknown>;\n const wrap = doc.createElement('div');\n wrap.className = 'veo-guide-divider';\n wrap.setAttribute('role', 'separator');\n const hr = doc.createElement('hr');\n const custom = s.preset === 'custom';\n const color =\n custom && typeof s.color === 'string' && s.color\n ? s.color\n : s.colorMode === 'dark'\n ? 'rgba(255, 255, 255, 0.35)'\n : '#e5e7eb';\n const thickness =\n custom && typeof s.thickness === 'number' && Number.isFinite(s.thickness)\n ? clampNum(Math.round(s.thickness), 1, 12)\n : 1;\n const lineStyle =\n typeof s.lineStyle === 'string' && DIVIDER_LINE_STYLES.has(s.lineStyle) ? s.lineStyle : 'solid';\n hr.style.borderTop = `${thickness}px ${lineStyle} ${color}`;\n wrap.appendChild(hr);\n for (const [k, prop] of [\n ['marginTop', 'marginTop'],\n ['marginRight', 'marginRight'],\n ['marginBottom', 'marginBottom'],\n ['marginLeft', 'marginLeft'],\n ] as const) {\n const v = s[k];\n if (typeof v === 'number' && Number.isFinite(v)) {\n wrap.style[prop] = `${clampNum(v, 0, 64)}px`;\n }\n }\n return wrap;\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 */\n/** Presets tipográficos del bloque de texto («Estilo del tema»). */\nexport const TEXT_PRESETS = {\n title: { size: 18, weight: 600, lineHeight: 1.3 },\n subtitle: { size: 16, weight: 600, lineHeight: 1.35 },\n paragraph: { size: 14, weight: 400, lineHeight: 1.5 },\n small: { size: 12, weight: 400, lineHeight: 1.5 },\n} as const;\n\nexport function applyBlockStyle(\n el: HTMLElement,\n style: StepBlock['style'],\n kind: 'text' | 'image' | 'button',\n): void {\n // Preset del texto como atributo: con el tema del workspace, las reglas\n // `.veo-card--themed [data-veo-preset]` le dan color/fuente/tamaño del design\n // system. Un bloque sin estilo es un Párrafo (o Título si es un `title` viejo).\n if (kind === 'text') {\n const explicit =\n style && typeof style === 'object' ? (style as Record<string, unknown>).preset : undefined;\n el.dataset.veoPreset =\n typeof explicit === 'string'\n ? explicit\n : el.classList.contains('veo-guide-title')\n ? 'title'\n : 'paragraph';\n }\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') {\n el.style.textAlign = align;\n // La card/columna es una columna flex y cada bloque mide su contenido:\n // la alineación también ubica el bloque dentro de la fila.\n el.style.alignSelf = BLOCK_ALIGN_SELF[align] as string;\n } else if (kind === 'image') el.style.alignSelf = BLOCK_ALIGN_SELF[align] as string;\n }\n // «Estilo del tema» del bloque de texto (editor): un preset define tamaño y\n // peso; `custom` deja los valores a mano (fontSize/fontWeight de abajo).\n if (kind === 'text' && typeof s.preset === 'string' && s.preset in TEXT_PRESETS) {\n const preset = TEXT_PRESETS[s.preset as keyof typeof TEXT_PRESETS];\n if (preset) {\n // El tema del workspace (si el paso lo usa) define tamaño y peso del\n // preset; sin tema las variables no existen y valen los del SDK.\n const token = s.preset === 'small' ? null : `--veo-t-${s.preset}`;\n el.style.fontSize = token ? `var(${token}-size, ${preset.size}px)` : `${preset.size}px`;\n el.style.fontWeight = token\n ? `var(${token}-weight, ${preset.weight})`\n : String(preset.weight);\n el.style.lineHeight = String(preset.lineHeight);\n }\n }\n // Modo de color del bloque: «oscuro» = franja oscura con texto claro (el\n // color explícito de abajo lo pisa).\n if (kind !== 'image' && s.colorMode === 'dark') {\n el.style.background = '#1f1d1b';\n el.style.color = '#f5f0eb';\n el.style.borderRadius = el.style.borderRadius || '8px';\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 // «Usar el tamaño real de la imagen»: sin escalar ni recortar (hasta el\n // ancho disponible). Si no, el ancho es un % del contenedor.\n if (kind === 'image' && s.naturalSize === true) {\n el.style.width = 'auto';\n el.style.maxWidth = '100%';\n el.style.maxHeight = 'none';\n el.style.objectFit = 'contain';\n } else 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","/**\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 /** Editor: id local del bloque. Los ELEMENTOS crudos se marcan con\n * `data-veo-raw-block=<id>` para que el builder pueda seleccionarlos. */\n tagBlockId?: string;\n}\n\n/** Atributo de los elementos crudos de un bloque code en el editor. */\nexport const RAW_BLOCK_ATTR = 'data-veo-raw-block';\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 if (rawInline.tagBlockId) {\n for (const n of rawNodes) {\n if (n instanceof Element) n.setAttribute(RAW_BLOCK_ATTR, rawInline.tagBlockId);\n }\n }\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 // El `<slot>` no tiene caja propia (display: contents): envuelto en un\n // div para que el bloque tenga rect real (marco de selección, barra y\n // huecos «+» del editor miden el bloque con getBoundingClientRect).\n const wrapper = doc.createElement('div');\n wrapper.className = 'veo-code-host';\n wrapper.appendChild(slot);\n node = wrapper;\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 let cancelled = false;\n if (typeof block.js === 'string' && block.js.trim()) {\n const js = block.js;\n const run = (): void => {\n if (cancelled) return;\n const s = hostDoc.createElement('script');\n s.textContent = wrapUserScript(js);\n hostDoc.body.appendChild(s);\n injected.push(s);\n };\n // El renderer inserta el host de la guía en la página DESPUÉS de construir\n // el contenido: si el JS corriera ya, la HTML del bloque todavía no estaría\n // en el documento (`document.getElementById(...)` → null). Se difiere un\n // microtask, que corre apenas termina ese montaje síncrono.\n if (host && !host.isConnected) queueMicrotask(run);\n else run();\n }\n\n return {\n node,\n cleanup: () => {\n cancelled = true;\n for (const n of injected) n.parentNode?.removeChild(n);\n },\n };\n}\n\n/**\n * Envuelve el JS del autor en una IIFE con try/catch: un `const`/`let` al nivel\n * superior de un script clásico vive en el scope global y, como la preview\n * re-ejecuta el bloque en cada repintado, el segundo `<script>` fallaría con\n * «Identifier has already been declared». Los errores en tiempo de ejecución\n * salen en la consola con un prefijo reconocible.\n */\nexport function wrapUserScript(js: string): string {\n return `(function(){try{\\n${js}\\n}catch(e){console.error(\"[OnUser] Error en el bloque de código:\",e)}})();`;\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 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/* Edición (builder): sin animación de entrada al repintar la preview. */\n:host(.veo-no-anim) * { animation: none !important; }\n\n/* Bloque video: caja con relación de aspecto; el iframe la llena. */\n.veo-guide-video { position: relative; overflow: hidden; border-radius: 8px; background: #000; }\n.veo-guide-video iframe, .veo-guide-video video {\n position: absolute; inset: 0; width: 100%; height: 100%; border: 0; display: block;\n}\n\n/* ── Layout por filas/columnas (composite) ──\n El espacio tiene UNA fuente por capa: el aire con el borde lo da el padding\n de la card; la separación entre filas/bloques la da el margen inferior\n (12px, ahí vive la línea «+» del editor); los bloques NO llevan padding\n propio (solo el que el autor les ponga inline). El último elemento no deja\n margen colgando. */\n.veo-card > [data-veo-block], .veo-card > .veo-row, .veo-card > .veo-guide-actions,\n.veo-col > [data-veo-block], .veo-col > .veo-guide-actions { margin-bottom: 12px; }\n/* La card y cada columna son columnas flex: cada bloque mide SU contenido (como\n el botón) y se ubica con su alineación (align-self); filas, columnas, formularios\n y filas de botones ocupan todo el ancho. */\n.veo-card:not(.veo-card--empty), .veo-col {\n display: flex; flex-direction: column; align-items: flex-start;\n}\n.veo-card > [data-veo-block], .veo-col > [data-veo-block] { max-width: 100%; }\n/* Línea horizontal: ocupa todo el ancho; el padding del bloque es solo vertical\n (zona clickeable en el editor) y la línea es el borde superior del hr. */\n.veo-card > .veo-guide-divider, .veo-col > .veo-guide-divider { padding: 6px 0; align-self: stretch; }\n.veo-guide-divider { box-sizing: border-box; }\n/* Bloque de código (modo host): ocupa todo el ancho, como un formulario. */\n.veo-code-host { display: block; min-width: 0; }\n.veo-card > .veo-code-host, .veo-col > .veo-code-host { align-self: stretch; }\n.veo-guide-divider hr { margin: 0; border: 0; height: 0; }\n.veo-card > .veo-row, .veo-card > .veo-guide-actions, .veo-card > .veo-form,\n.veo-col > .veo-guide-actions, .veo-col > .veo-form { align-self: stretch; }\n.veo-row { display: flex; gap: 12px; align-items: flex-start; box-sizing: border-box; }\n.veo-col { flex: 1 1 0; min-width: 0; }\n.veo-col > :last-child { margin-bottom: 0; }\n/* Fila con alineación horizontal (editor de fila): las columnas miden su contenido. */\n.veo-row--aligned > .veo-col { flex: 0 1 auto; }\n\n/* ── Editor in-app: bloque seleccionado + barra de acciones + placeholders ── */\n.veo-block-placeholder {\n border: 1px dashed #b0a9a5; border-radius: 6px; padding: 12px; margin-bottom: 12px;\n color: #8a8582; font-size: 13px; text-align: center;\n}\n/* El bloque seleccionado no lleva contorno propio: lo rodea .veo-block-frame\n (marco aparte, con aire y alto mínimo, que no altera el layout). */\n.veo-block--selected { position: relative; z-index: 1; }\n.veo-block-frame {\n position: absolute; z-index: 4; pointer-events: none; box-sizing: border-box;\n border: 2px solid #3b82f6; border-radius: 10px; background: rgba(59, 130, 246, 0.04);\n}\n/* Barra del bloque (mock): píldora blanca con sombra, solo íconos; la papelera\n en rojo, separada por una línea. */\n.veo-block-toolbar {\n position: absolute; z-index: 5; display: inline-flex; align-items: center; gap: 2px; padding: 4px 6px;\n background: #fff; border: 1px solid rgba(0,0,0,0.06); border-radius: 12px;\n box-shadow: 0 6px 20px rgba(0,0,0,0.16);\n}\n.veo-block-toolbar button {\n border: 0; background: transparent; color: #4b4642; cursor: pointer; padding: 6px; border-radius: 8px;\n display: inline-flex; align-items: center; justify-content: center; line-height: 1;\n}\n.veo-block-toolbar button:hover { background: #f5efeb; }\n.veo-block-toolbar button svg { width: 20px; height: 20px; }\n.veo-block-toolbar .veo-block-toolbar-remove { color: #e5484d; }\n/* Separadores: antes de la papelera y antes de las flechas de mover. */\n.veo-block-toolbar .veo-block-toolbar-remove, .veo-block-toolbar .veo-block-toolbar-move-left {\n margin-left: 6px; position: relative;\n}\n.veo-block-toolbar .veo-block-toolbar-remove::before, .veo-block-toolbar .veo-block-toolbar-move-left::before {\n content: \"\"; position: absolute; left: -4px; top: 6px; bottom: 6px; width: 1px; background: #e7e2de;\n}\n.veo-block-toolbar button:disabled { opacity: 0.3; cursor: default; background: transparent; }\n/* Contenedor (hover): contorno azul de la tarjeta y dos pestañas centradas\n sobre su borde superior: «Editar contenedor» (outline) y «Editar filas». */\n.veo-card-frame {\n position: absolute; z-index: 3; inset: 0; pointer-events: none; box-sizing: border-box;\n border: 2px solid #3b82f6; border-radius: inherit;\n}\n.veo-card-toolbar {\n position: absolute; z-index: 6; left: 50%; transform: translateX(-50%);\n display: inline-flex; align-items: flex-end; gap: 8px; white-space: nowrap;\n}\n.veo-card-toolbar button {\n cursor: pointer; padding: 8px 14px; border-radius: 8px; border: 2px solid #3b82f6;\n font: 600 14px/1 system-ui, -apple-system, \"Segoe UI\", sans-serif;\n background: #fff; color: #3b82f6;\n}\n.veo-card-toolbar button:hover { background: #eff6ff; }\n/* Con fondo = la vista que el panel muestra ahora (contenedor o estructura). */\n.veo-card-toolbar button.is-active { background: #3b82f6; color: #fff; }\n.veo-card-toolbar button.is-active:hover { background: #2563eb; border-color: #2563eb; }\n/* Editor de fila: marco al pasar el mouse por una fila (o la fila del bloque\n seleccionado) y barra «Editar fila · duplicar» bajo su esquina derecha. */\n.veo-row-frame {\n position: absolute; z-index: 3; pointer-events: none; box-sizing: border-box;\n border: 2px solid #3b82f6; border-radius: 10px;\n}\n.veo-row-toolbar {\n position: absolute; z-index: 5; display: inline-flex; align-items: center; gap: 2px; padding: 4px 6px;\n background: #fff; border: 1px solid rgba(0,0,0,0.06); border-radius: 12px;\n box-shadow: 0 6px 20px rgba(0,0,0,0.16); white-space: nowrap;\n}\n.veo-row-toolbar button {\n border: 0; background: transparent; color: #4b4642; cursor: pointer; padding: 6px 8px; border-radius: 8px;\n display: inline-flex; align-items: center; gap: 8px; line-height: 1;\n font: 500 14px/1 system-ui, -apple-system, \"Segoe UI\", sans-serif;\n}\n.veo-row-toolbar button:hover { background: #f5efeb; }\n.veo-row-toolbar button svg { width: 20px; height: 20px; }\n.veo-row-toolbar .veo-row-toolbar-duplicate { margin-left: 6px; position: relative; }\n.veo-row-toolbar .veo-row-toolbar-duplicate::before {\n content: \"\"; position: absolute; left: -4px; top: 6px; bottom: 6px; width: 1px; background: #e7e2de;\n}\n.veo-row-toolbar .veo-row-toolbar-remove { color: #e5484d; }\n/* Huecos «+» (mock): zona invisible entre elementos; al pasar el mouse aparece\n la línea azul (horizontal = fila / bloque apilado, vertical = columna) con\n un «+» circular al centro. */\n.veo-gap { position: absolute; z-index: 4; }\n.veo-gap i { position: absolute; background: #3b82f6; opacity: 0; transition: opacity 100ms; pointer-events: none; }\n.veo-gap--h i { left: 0; right: 0; top: 50%; height: 2px; margin-top: -1px; }\n.veo-gap--v i { top: 0; bottom: 0; left: 50%; width: 2px; margin-left: -1px; }\n.veo-gap button {\n position: absolute; left: 50%; top: 50%; margin: -11px 0 0 -11px; box-sizing: border-box;\n opacity: 0; transition: opacity 100ms; width: 22px; height: 22px; border-radius: 50%; padding: 0;\n border: 2px solid #fff; background: #3b82f6; color: #fff; cursor: pointer;\n font: 600 15px/18px system-ui, -apple-system, \"Segoe UI\", sans-serif; text-align: center;\n box-shadow: 0 2px 8px rgba(0,0,0,0.25);\n}\n.veo-gap:hover i, .veo-gap:hover button, .veo-gap:focus-within button { opacity: 1; }\n.veo-gap button:hover { background: #2563eb; }\n\n/* Tarjeta sin bloques (paso recién creado). La tarjeta NO impone tamaño ni\n padding propios (así el ancho/padding del diseño se ven tal cual); el tamaño\n mínimo lo pone la zona punteada azul de la preview. */\n.veo-card--empty { display: flex; align-items: stretch; }\n.veo-card-empty-zone {\n flex: 1; min-width: 0; min-height: 160px; margin-top: 14px;\n display: flex; align-items: center; justify-content: center; gap: 6px; text-align: center;\n border: 2px dashed #3b82f6; border-radius: 8px; background: #eff6ff;\n color: #2563eb; font-size: 16px; font-weight: 500; user-select: none; pointer-events: none;\n padding: 0 12px; box-sizing: border-box; overflow: hidden;\n}\n.veo-card-empty-zone b { font-weight: 600; font-size: 22px; line-height: 1; }\n/* Sin ancho configurado, la zona da un tamaño cómodo por defecto. */\n.veo-card--empty:not([style*=\"width\"]) .veo-card-empty-zone { min-width: 360px; }\n/* Tarjeta angosta (la mide el renderer): solo el «+», sin texto, y más baja. */\n.veo-card--narrow .veo-card-empty-zone span { display: none; }\n.veo-card--narrow .veo-card-empty-zone { min-height: 120px; }\n.veo-card {\n /* Contenedor posicionado SIEMPRE: el ✕ (absolute) se ubica respecto a la\n tarjeta también en pasos embebidos (inline), no respecto a la app. Los\n flotantes lo pisan con position:fixed inline. */\n position: relative;\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/* Tema del workspace (design system): cada preset de texto toma sus tokens de\n las variables que publica \\`applyThemeVars\\` en la tarjeta. Las reglas solo\n existen bajo .veo-card--themed; los estilos inline del bloque las pisan. El\n \\`*\\` cubre el rich text (la regla global de fuente aplica a cada hijo). */\n.veo-card--themed [data-veo-preset=\"title\"] {\n color: var(--veo-t-title-color); font-size: var(--veo-t-title-size);\n font-weight: var(--veo-t-title-weight); text-align: var(--veo-t-title-align);\n}\n.veo-card--themed [data-veo-preset=\"subtitle\"] {\n color: var(--veo-t-subtitle-color); font-size: var(--veo-t-subtitle-size);\n font-weight: var(--veo-t-subtitle-weight); text-align: var(--veo-t-subtitle-align);\n}\n.veo-card--themed [data-veo-preset=\"paragraph\"] {\n color: var(--veo-t-paragraph-color); font-size: var(--veo-t-paragraph-size);\n font-weight: var(--veo-t-paragraph-weight); text-align: var(--veo-t-paragraph-align);\n}\n.veo-card--themed [data-veo-preset=\"small\"] { color: var(--veo-t-paragraph-color); }\n.veo-card--themed [data-veo-preset=\"title\"], .veo-card--themed [data-veo-preset=\"title\"] * {\n font-family: var(--veo-t-title-font, var(--veo-font));\n}\n.veo-card--themed [data-veo-preset=\"subtitle\"], .veo-card--themed [data-veo-preset=\"subtitle\"] * {\n font-family: var(--veo-t-subtitle-font, var(--veo-font));\n}\n.veo-card--themed [data-veo-preset=\"paragraph\"], .veo-card--themed [data-veo-preset=\"paragraph\"] *,\n.veo-card--themed [data-veo-preset=\"small\"], .veo-card--themed [data-veo-preset=\"small\"] * {\n font-family: var(--veo-t-paragraph-font, var(--veo-font));\n}\n/* Formulario del tema (pestaña Formulario). Dentro de un .veo-form los tokens\n de texto \\`--veo-t-*\\` se REDEFINEN con «Texto principal»: la pregunta es un\n bloque con preset (su tamaño va inline con esas variables), así toma los del\n formulario y no los del modal. Etiquetas y opciones = «Texto secundario». */\n.veo-card--themed-form .veo-form {\n background: var(--veo-f-bg); padding: var(--veo-f-pad);\n border: var(--veo-f-border, none); border-radius: var(--veo-f-radius, 8px);\n box-shadow: var(--veo-f-shadow, none);\n --veo-t-title-color: var(--veo-f-primary-color); --veo-t-title-size: var(--veo-f-primary-size);\n --veo-t-title-weight: var(--veo-f-primary-weight); --veo-t-title-align: var(--veo-f-primary-align);\n --veo-t-title-font: var(--veo-f-primary-font);\n --veo-t-subtitle-color: var(--veo-f-primary-color); --veo-t-subtitle-size: var(--veo-f-primary-size);\n --veo-t-subtitle-weight: var(--veo-f-primary-weight); --veo-t-subtitle-align: var(--veo-f-primary-align);\n --veo-t-subtitle-font: var(--veo-f-primary-font);\n --veo-t-paragraph-color: var(--veo-f-primary-color); --veo-t-paragraph-size: var(--veo-f-primary-size);\n --veo-t-paragraph-weight: var(--veo-f-primary-weight); --veo-t-paragraph-align: var(--veo-f-primary-align);\n --veo-t-paragraph-font: var(--veo-f-primary-font);\n}\n.veo-card--themed-form .veo-form-label,\n.veo-card--themed-form .veo-form-option,\n.veo-card--themed-form .veo-scale-label {\n color: var(--veo-f-secondary-color); font-weight: var(--veo-f-secondary-weight);\n font-family: var(--veo-f-secondary-font, var(--veo-font));\n}\n.veo-card--themed-form .veo-form-label,\n.veo-card--themed-form .veo-form-option {\n font-size: var(--veo-f-secondary-size); text-align: var(--veo-f-secondary-align);\n}\n.veo-card--themed-form .veo-form-input:focus { outline-color: var(--veo-f-accent); }\n.veo-card--themed-form .veo-form-option input { accent-color: var(--veo-f-accent); }\n.veo-card--themed-form .veo-nps-btn:hover { border-color: var(--veo-scale-color, var(--veo-f-accent)); }\n.veo-card--themed-form .veo-scale-active.veo-nps-btn {\n background: var(--veo-scale-color, var(--veo-f-accent)); color: var(--veo-f-on-accent);\n border-color: var(--veo-scale-color, var(--veo-f-accent));\n}\n.veo-guide-cta {\n background: var(--veo-cta-bg, var(--veo-primary));\n color: var(--veo-cta-color, #fff); border: var(--veo-cta-border, none);\n padding: var(--veo-cta-pad, 9px 18px); border-radius: var(--veo-cta-radius, 8px);\n font-size: var(--veo-cta-size, 14px); font-weight: var(--veo-cta-weight, 500); cursor: pointer;\n transition: opacity 120ms ease;\n}\n.veo-guide-cta:hover { opacity: 0.9; }\n/* Presets del boton (editor): secundario = contorno; enlace = solo texto. */\n.veo-guide-cta--secondary {\n background: var(--veo-cta2-bg, transparent); color: var(--veo-cta2-color, var(--veo-primary));\n border: var(--veo-cta2-border, 1px solid var(--veo-primary));\n padding: var(--veo-cta2-pad, var(--veo-cta-pad, 9px 18px));\n border-radius: var(--veo-cta2-radius, var(--veo-cta-radius, 8px));\n font-size: var(--veo-cta2-size, var(--veo-cta-size, 14px));\n font-weight: var(--veo-cta2-weight, var(--veo-cta-weight, 500));\n}\n.veo-guide-cta--link {\n background: transparent; color: var(--veo-cta3-color, var(--veo-primary));\n border: var(--veo-cta3-border, none); padding: var(--veo-cta3-pad, 0);\n border-radius: var(--veo-cta3-radius, 0);\n font-size: var(--veo-cta3-size, var(--veo-cta-size, 14px));\n font-weight: var(--veo-cta3-weight, var(--veo-cta-weight, 500));\n}\n.veo-guide-cta--link:hover { opacity: 1; text-decoration: underline; }\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/* Pregunta de la encuesta (rich text del bloque form). */\n.veo-form-question { font-size: 16px; font-weight: 600; line-height: 1.35; color: var(--veo-text); }\n.veo-form-question p { margin: 0; }\n.veo-form > .veo-guide-actions { margin: 0; }\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/* Lista de tareas (mock): ítems con anillo de progreso, texto + subtítulo,\n y al pie «X de N completadas» + porcentaje + barra. */\n.veo-checklist {\n display: flex; flex-direction: column; gap: 22px; align-self: stretch; width: 100%;\n min-width: 360px; box-sizing: border-box;\n}\n.veo-checklist-title { font-size: 24px; font-weight: 700; line-height: 1.25; color: var(--veo-cl-title); }\n.veo-checklist-title p { margin: 0; }\n.veo-checklist-items { display: flex; flex-direction: column; gap: 22px; }\n.veo-checklist-item {\n display: flex; align-items: center; gap: 18px; width: 100%; text-align: left;\n background: none; border: 0; padding: 0; cursor: pointer; font: inherit; color: inherit;\n}\n.veo-checklist-item:hover .veo-checklist-label { text-decoration: underline; }\n.veo-checklist-ring { width: 44px; height: 44px; flex: 0 0 auto; }\n.veo-checklist-texts { display: flex; flex-direction: column; gap: 4px; min-width: 0; }\n.veo-checklist-label {\n font-size: calc(var(--veo-cl-font-size, 14px) + 4px); font-weight: var(--veo-cl-font-weight, 600);\n line-height: 1.3; color: var(--veo-cl-title);\n}\n.veo-checklist-sub { font-size: calc(var(--veo-cl-font-size, 14px) + 1px); color: var(--veo-cl-subtitle); }\n.veo-checklist-footer { display: flex; flex-direction: column; gap: 10px; margin-top: 6px; }\n.veo-checklist-summary {\n display: flex; justify-content: space-between; align-items: baseline; gap: 16px;\n font-size: calc(var(--veo-cl-font-size, 14px) + 1px);\n}\n.veo-checklist-count { color: var(--veo-cl-subtitle); }\n.veo-checklist-percent { font-weight: 700; font-size: calc(var(--veo-cl-font-size, 14px) + 3px); color: var(--veo-cl-bar); }\n.veo-checklist-bar { height: var(--veo-cl-bar-h, 8px); background: #e7e2de; border-radius: 999px; overflow: hidden; }\n.veo-checklist--dark .veo-checklist-bar { background: #3c3734; }\n.veo-checklist-bar-fill { height: 100%; background: var(--veo-cl-bar); border-radius: 999px; transition: width 300ms ease; }\n.veo-checklist-empty { margin: 0; font-size: 13px; color: var(--veo-cl-subtitle); }\n/* Opción múltiple (mock): círculos/casillas grandes con su texto al lado. */\n.veo-form-options { display: flex; flex-direction: column; gap: 14px; }\n.veo-form-option {\n display: flex; align-items: center; gap: 14px;\n font-size: 16px; color: var(--veo-text); cursor: pointer;\n}\n.veo-form-option input {\n accent-color: var(--veo-primary); margin: 0; cursor: pointer;\n width: 26px; height: 26px; flex: 0 0 auto;\n}\n/* Escala numérica (mock): casillas cuadradas; con etiquetas, cada casilla\n lleva la suya debajo (la primera cuelga a la izquierda, la última a la derecha). */\n.veo-form-scale { display: flex; gap: 8px; flex-wrap: wrap; align-items: flex-start; }\n.veo-scale-item { display: inline-flex; flex-direction: column; align-items: center; gap: 8px; }\n.veo-scale-item--first { align-items: flex-start; }\n.veo-scale-item--last { align-items: flex-end; }\n.veo-scale-label { font-size: 12px; line-height: 1.2; color: #8a8582; white-space: nowrap; }\n.veo-nps-btn {\n min-width: var(--veo-scale-size, 44px); height: var(--veo-scale-size, 44px); padding: 0 6px;\n font-size: 16px; font-weight: 600; color: var(--veo-text);\n background: var(--veo-bg); border: 1px solid #d5cec9; border-radius: 8px;\n cursor: pointer; transition: all 100ms ease;\n}\n.veo-nps-btn:hover { border-color: var(--veo-scale-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 {\n background: var(--veo-scale-color, var(--veo-primary)); color: #fff;\n border-color: var(--veo-scale-color, var(--veo-primary));\n}\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 * El caret es un cuadrado rotado 45°: según hacia dónde apunte, su punta la\n * forman dos de sus lados. Solo esos llevan borde; los otros dos quedan DENTRO\n * del tooltip y, con borde, dibujaban una línea que «cerraba» la flecha.\n */\nconst OUTER_EDGES: Record<'top' | 'bottom' | 'left' | 'right', readonly string[]> = {\n top: ['top', 'left'],\n right: ['top', 'right'],\n bottom: ['bottom', 'right'],\n left: ['bottom', '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 // Caret con borde (`data-veo-border` = grosor en px): borde solo en la punta y\n // por ENCIMA de la tarjeta, así su mitad interior tapa el borde del tooltip y\n // la flecha queda abierta hacia él.\n const width = arrowEl.dataset.veoBorder;\n if (width) {\n for (const edge of ['top', 'right', 'bottom', 'left']) {\n arrowEl.style.setProperty(\n `border-${edge}-width`,\n OUTER_EDGES[side].includes(edge) ? `${width}px` : '0',\n );\n }\n arrowEl.style.zIndex = '1';\n }\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { buildStepContent, isSafeUrl } from '../block-builder';\nimport { COLOR_RE } from '../guide-design';\nimport { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type {\n BadgeConfig,\n BadgeTrigger,\n GuideInteractionMetadata,\n GuideRenderContext,\n GuideStep,\n} from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { positionArrow } from './floating-arrow';\n\n/** Retardo de gracia del hover: permite mover el mouse del badge al tooltip. */\nconst HOVER_CLOSE_DELAY_MS = 150;\n\n/**\n * Renderiza una guía tipo `badge` (estilo Pendo): un elemento CHICO —\n * icono/punto/cápsula/imagen — inyectado EN EL FLUJO del DOM junto al ancla\n * (`step.selector` + `style.inlinePosition`), que al hover o click\n * (`style.badgeTrigger`) abre un tooltip con el contenido del paso.\n *\n * Composición (no herencia): reusa `insertHost`/`keepHostAttached` del inline\n * (watchdog contra re-renders de React), `buildStepContent` (bloques) y el\n * posicionamiento Floating UI + caret del tooltip — con `strategy: 'fixed'`\n * porque el host vive DENTRO del flujo del cliente y un ancestro con\n * `overflow: hidden` recortaría un tooltip absoluto.\n *\n * EL BADGE ES PERMANENTE (como en Pendo): nada de lo que haga el usuario lo\n * quita — lo único que se abre y se cierra es el TOOLTIP. La ✕ del tooltip, el\n * hover-out, el click afuera, Esc y los CTA solo cierran el tooltip; el badge\n * queda para volver a consultarlo cuando quiera. Por eso el badge nunca emite\n * `dismissed` (no hay forma de descartarlo) y su frecuencia natural es `always`.\n *\n * Analytics (deliberado):\n * - `shown` la PRIMERA vez que se ABRE el tooltip (no al inyectar el badge):\n * mide cuánta gente abrió la ayuda, no en cuántas páginas existía el icono.\n * - `cta_clicked` en los botones del tooltip (con buttonId si lo tienen).\n */\nexport class BadgeRenderer extends BaseRenderer {\n private tooltip: HTMLElement | null = null;\n private arrowEl: HTMLElement | null = null;\n private badgeBtn: HTMLButtonElement | null = null;\n private open = false;\n private shownEmitted = false;\n private trigger: BadgeTrigger = 'hover';\n private side: 'top' | 'bottom' | 'left' | 'right' = 'top';\n private closeTimer: number | null = null;\n private stopFloat: (() => void) | null = null;\n\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n const { host, root } = this.createHost();\n const ownerDocument = root.ownerDocument ?? document;\n this.applyDesign(step.style);\n // Ancho del tooltip personalizable (slider «Ancho» del editor). Var\n // dedicada: --veo-width no distingue \"no seteado\" (el :host la define).\n const tipWidth = step.style?.width;\n if (typeof tipWidth === 'number' && Number.isFinite(tipWidth)) {\n host.style.setProperty(\n '--veo-badge-tip-width',\n `${Math.min(720, Math.max(220, tipWidth))}px`,\n );\n }\n this.trigger = step.style?.badgeTrigger === 'click' ? 'click' : 'hover';\n const rawSide = step.style?.tooltipPlacement;\n this.side = rawSide === 'bottom' || rawSide === 'left' || rawSide === 'right' ? rawSide : 'top';\n\n // ── Badge en el flujo del DOM, pegado al ancla ──\n const position = readInlinePosition(step.style);\n host.style.display = 'inline-flex';\n host.style.verticalAlign = 'middle';\n const badge = buildBadgeElement(readBadgeConfig(step), ownerDocument);\n root.appendChild(badge);\n this.badgeBtn = badge;\n insertHost(anchor, host, position);\n this.registerCleanup(keepHostAttached(host, selector, position));\n\n // ── Tooltip (cerrado hasta el trigger) ──\n const tooltip = ownerDocument.createElement('div');\n tooltip.className = 'veo-tooltip veo-badge-tooltip';\n tooltip.style.display = 'none';\n\n const emit = (action: 'shown' | 'cta_clicked', meta?: GuideInteractionMetadata): void => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action,\n ...(meta ? { metadata: meta } : {}),\n });\n };\n\n const buildTooltipContent = (s: GuideStep): HTMLElement =>\n buildStepContent(s, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n emit('cta_clicked', meta);\n if (action === 'url' && target) window.open(target, '_blank', 'noopener,noreferrer');\n // TODO cierra solo el TOOLTIP — el badge es permanente.\n this.closeTooltip();\n // Encadenado: además abre la otra guía.\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n // La ✕ también cierra solo el tooltip (nunca el badge, nunca dismissed).\n onDismiss: () => this.closeTooltip(),\n });\n\n const content = buildTooltipContent(step);\n tooltip.appendChild(content);\n\n const arrowEl = ownerDocument.createElement('div');\n arrowEl.className = 'veo-tooltip-arrow';\n tooltip.appendChild(arrowEl);\n root.appendChild(tooltip);\n this.tooltip = tooltip;\n this.arrowEl = arrowEl;\n\n // Update in-place (preview del editor).\n this.liveContainer = tooltip;\n this.liveContent = content;\n this.liveKey = this.liveKeyOf(step);\n this.liveBuild = buildTooltipContent;\n\n // ── Trigger ──\n const openNow = (): void => {\n this.cancelClose();\n if (!this.open) {\n this.openTooltip(badge);\n if (!this.shownEmitted) {\n this.shownEmitted = true;\n emit('shown');\n }\n }\n };\n if (this.trigger === 'hover') {\n const scheduleClose = (): void => {\n this.cancelClose();\n this.closeTimer = window.setTimeout(() => this.closeTooltip(), HOVER_CLOSE_DELAY_MS);\n };\n badge.addEventListener('mouseenter', openNow);\n badge.addEventListener('focus', openNow);\n badge.addEventListener('mouseleave', scheduleClose);\n badge.addEventListener('blur', scheduleClose);\n tooltip.addEventListener('mouseenter', () => this.cancelClose());\n tooltip.addEventListener('mouseleave', scheduleClose);\n } else {\n badge.addEventListener('click', () => {\n if (this.open) this.closeTooltip();\n else openNow();\n });\n const onDocClick = (e: MouseEvent): void => {\n if (!this.open) return;\n // El shadow host encapsula badge y tooltip: un click cuyo path no pasa\n // por el host es \"afuera\".\n if (e.composedPath().includes(host)) return;\n this.closeTooltip();\n };\n document.addEventListener('click', onDocClick, true);\n this.registerCleanup(() => document.removeEventListener('click', onDocClick, true));\n }\n const onKey = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this.open) this.closeTooltip();\n };\n document.addEventListener('keydown', onKey);\n this.registerCleanup(() => document.removeEventListener('keydown', onKey));\n\n // En el editor, el autor edita el CONTENIDO del tooltip: abrirlo de entrada\n // (si no, se edita a ciegas). No emite shown (isPreview no trackea igual).\n if (context.isPreview) openNow();\n }\n\n /** Cambiar de ancla/posición/trigger requiere re-montar y re-cablear. */\n protected override liveKeyOf(step: GuideStep): string {\n const selector = step.selector ?? '';\n const position = readInlinePosition(step.style);\n const trigger = step.style?.badgeTrigger === 'click' ? 'click' : 'hover';\n return `${selector}|${position}|${trigger}`;\n }\n\n protected override onLiveUpdate(step: GuideStep): void {\n // Re-pintar el badge (kind/color/size) y reposicionar si está abierto.\n if (this.badgeBtn) {\n const doc = this.badgeBtn.ownerDocument;\n const next = buildBadgeElement(readBadgeConfig(step), doc);\n // Conservar listeners del botón: solo se actualiza el interior + clases.\n this.badgeBtn.className = next.className;\n this.badgeBtn.setAttribute('style', next.getAttribute('style') ?? '');\n this.badgeBtn.replaceChildren(...Array.from(next.childNodes));\n }\n const rawSide = step.style?.tooltipPlacement;\n this.side = rawSide === 'bottom' || rawSide === 'left' || rawSide === 'right' ? rawSide : 'top';\n if (this.open && this.badgeBtn) this.position(this.badgeBtn);\n }\n\n override destroy(): void {\n this.cancelClose();\n this.stopFloat?.();\n this.stopFloat = null;\n this.tooltip = null;\n this.arrowEl = null;\n this.badgeBtn = null;\n this.open = false;\n super.destroy();\n }\n\n private openTooltip(badge: HTMLElement): void {\n if (!this.tooltip) return;\n this.tooltip.style.display = 'block';\n this.open = true;\n void this.position(badge);\n const reposition = (): void => {\n void this.position(badge);\n };\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n this.stopFloat = () => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n }\n\n private closeTooltip(): void {\n this.cancelClose();\n if (!this.tooltip || !this.open) return;\n this.tooltip.style.display = 'none';\n this.open = false;\n this.stopFloat?.();\n this.stopFloat = null;\n }\n\n private cancelClose(): void {\n if (this.closeTimer !== null) {\n window.clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n }\n\n private async position(badge: HTMLElement): Promise<void> {\n const tooltip = this.tooltip;\n const arrowEl = this.arrowEl;\n if (!tooltip || !arrowEl) return;\n const { x, y, placement, middlewareData } = await computePosition(badge, tooltip, {\n strategy: 'fixed',\n placement: this.side,\n middleware: [offset(8), flip(), shift({ padding: 8 }), arrow({ element: arrowEl })],\n });\n tooltip.style.left = `${x}px`;\n tooltip.style.top = `${y}px`;\n positionArrow(arrowEl, placement, middlewareData.arrow);\n }\n}\n\n/** Lee y normaliza `style.badge` (defaults seguros). */\nfunction readBadgeConfig(step: GuideStep): BadgeConfig {\n const raw = step.style?.badge;\n if (!raw || typeof raw !== 'object') return { kind: 'icon' };\n const b = raw as Record<string, unknown>;\n const kind =\n b.kind === 'dot' ||\n b.kind === 'pill' ||\n b.kind === 'text' ||\n b.kind === 'image' ||\n b.kind === 'icon'\n ? b.kind\n : 'icon';\n return {\n kind,\n icon: typeof b.icon === 'string' ? b.icon : null,\n text: typeof b.text === 'string' ? b.text : null,\n imageUrl: typeof b.imageUrl === 'string' ? b.imageUrl : null,\n color: typeof b.color === 'string' && COLOR_RE.test(b.color.trim()) ? b.color.trim() : null,\n size: typeof b.size === 'number' && Number.isFinite(b.size) ? b.size : null,\n };\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, n));\n}\n\n/**\n * Construye el elemento visual del badge. `<button>` por accesibilidad\n * (focus/teclado). Texto por `textContent`; imagen por `isSafeUrl`.\n */\nfunction buildBadgeElement(config: BadgeConfig, doc: Document): HTMLButtonElement {\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.className = `veo-badge veo-badge--${config.kind}`;\n btn.setAttribute('aria-label', 'Más información');\n const size = clamp(config.size ?? 18, 8, 48);\n\n switch (config.kind) {\n case 'dot':\n btn.style.width = `${size}px`;\n btn.style.height = `${size}px`;\n if (config.color) btn.style.background = config.color;\n break;\n case 'pill': {\n btn.textContent = config.text?.slice(0, 24) || 'Nuevo';\n btn.style.fontSize = `${clamp(Math.round(size * 0.62), 8, 24)}px`;\n if (config.color) btn.style.background = config.color;\n break;\n }\n case 'text': {\n // Texto plano, sin cápsula: hereda el color de acento (o el custom).\n btn.textContent = config.text?.slice(0, 32) || 'Nuevo';\n btn.style.fontSize = `${clamp(Math.round(size * 0.7), 9, 28)}px`;\n if (config.color) btn.style.color = config.color;\n break;\n }\n case 'image': {\n if (config.imageUrl && isSafeUrl(config.imageUrl)) {\n const img = doc.createElement('img');\n img.src = config.imageUrl;\n img.alt = '';\n img.style.width = `${size}px`;\n img.style.height = `${size}px`;\n btn.appendChild(img);\n } else {\n // Sin imagen válida degrada a icono para que el badge no sea invisible.\n btn.className = 'veo-badge veo-badge--icon';\n btn.textContent = '?';\n btn.style.width = `${size}px`;\n btn.style.height = `${size}px`;\n btn.style.fontSize = `${clamp(Math.round(size * 0.62), 8, 32)}px`;\n }\n break;\n }\n default: {\n // icon: carácter/emoji dentro de un circulito.\n btn.textContent = (config.icon || 'ℹ️').slice(0, 4);\n btn.style.width = `${size}px`;\n btn.style.height = `${size}px`;\n btn.style.fontSize = `${clamp(Math.round(size * 0.62), 8, 32)}px`;\n if (config.color) btn.style.color = config.color;\n break;\n }\n }\n return btn;\n}\n","import { buildContentNodes, createCloseButton } from './block-builder';\nimport type { GuideStep, WalkthroughCallbacks } from './types';\n\n/**\n * Construye el subtree DOM de un step de walkthrough con navegación\n * (counter, dots, contenido, botones atrás/siguiente/finalizar/omitir).\n *\n * Aplica las mismas reglas de seguridad que `buildStepContent`:\n * - `textContent` para todo string del backend (cero `innerHTML`).\n * - `imageUrl` validada con `isSafeUrl`.\n *\n * El botón primario cambia su label según el step:\n * - último step → \"Finalizar\" → llama `onComplete`\n * - otro → `step.ctaText` o \"Siguiente\" → llama `onNext`\n *\n * El botón \"Atrás\" solo se pinta a partir del segundo step. El botón\n * \"Omitir\" siempre se pinta — el usuario debe poder salir en cualquier\n * momento.\n */\nexport function buildWalkthroughStepContent(\n step: GuideStep,\n stepIndex: number,\n totalSteps: number,\n doc: Document,\n callbacks: WalkthroughCallbacks,\n): HTMLElement {\n const container = doc.createElement('div');\n container.className = 'veo-guide-content';\n\n const counter = doc.createElement('div');\n counter.className = 'veo-walkthrough-counter';\n counter.textContent = `Paso ${stepIndex + 1} de ${totalSteps}`;\n container.appendChild(counter);\n\n const progress = doc.createElement('div');\n progress.className = 'veo-walkthrough-progress';\n for (let i = 0; i < totalSteps; i++) {\n const dot = doc.createElement('span');\n dot.className = 'veo-walkthrough-progress-dot';\n if (i < stepIndex) dot.classList.add('completed');\n if (i === stepIndex) dot.classList.add('active');\n progress.appendChild(dot);\n }\n container.appendChild(progress);\n\n // Contenido del paso: respeta blocks[] (imágenes, rich text, full-bleed) o\n // cae a los escalares. Los bloques `button` se omiten — la navegación\n // (atrás/siguiente/omitir) es del chrome del tour, abajo.\n for (const node of buildContentNodes(step, doc)) {\n container.appendChild(node);\n }\n\n const actions = doc.createElement('div');\n actions.className = 'veo-walkthrough-actions';\n\n const skipBtn = doc.createElement('button');\n skipBtn.type = 'button';\n skipBtn.className = 'veo-walkthrough-skip';\n skipBtn.textContent = 'Omitir';\n skipBtn.addEventListener('click', () => callbacks.onSkip());\n actions.appendChild(skipBtn);\n\n const rightGroup = doc.createElement('div');\n rightGroup.className = 'veo-walkthrough-actions-right';\n\n if (stepIndex > 0) {\n const backBtn = doc.createElement('button');\n backBtn.type = 'button';\n backBtn.className = 'veo-walkthrough-btn-secondary';\n backBtn.textContent = 'Atrás';\n backBtn.addEventListener('click', () => callbacks.onBack());\n rightGroup.appendChild(backBtn);\n }\n\n const isLastStep = stepIndex === totalSteps - 1;\n const primaryBtn = doc.createElement('button');\n primaryBtn.type = 'button';\n primaryBtn.className = 'veo-guide-cta';\n const defaultLabel = isLastStep ? 'Finalizar' : 'Siguiente';\n primaryBtn.textContent =\n typeof step.ctaText === 'string' && step.ctaText ? step.ctaText : defaultLabel;\n primaryBtn.addEventListener('click', () => {\n if (isLastStep) callbacks.onComplete();\n else callbacks.onNext();\n });\n rightGroup.appendChild(primaryBtn);\n\n actions.appendChild(rightGroup);\n container.appendChild(actions);\n\n // \"✕\" universal (esquina superior derecha): salir en cualquier momento.\n // Mismo efecto que \"Omitir\" → reporta `dismissed`.\n container.appendChild(createCloseButton(doc, () => callbacks.onSkip()));\n\n return container;\n}\n","import { buildStepContent } from '../block-builder';\nimport { insertHost, keepHostAttached } from '../inline-host';\nimport type { GuideInteractionMetadata, GuideRenderContext, GuideStep } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { buildWalkthroughStepContent } from '../walkthrough-block-builder';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía tipo `banner`. Dos modos:\n *\n * - **Pantalla completa** (default): barra fija arriba o abajo del viewport.\n * La posición se lee de `step.style.position` (`top` | `bottom`).\n * - **Embebido en un contenedor** (`step.selector` presente): el banner se\n * inserta DENTRO del contenedor elegido (prepend con `top`, append con\n * `bottom`) y empuja su contenido — como los \"element banners\" de Pendo.\n * Reusa el watchdog inline (`keepHostAttached`) porque los frameworks del\n * host borran nodos ajenos al re-renderizar.\n *\n * No tiene backdrop ni atrapa el foco. Con `context.nav` (paso de un\n * walkthrough heterogéneo) muestra botones de navegación y delega\n * tracking/avance al controller — solo en modo pantalla completa.\n */\nexport class BannerRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const idx = context.nav?.stepIndex ?? 0;\n const step = context.guide.guideSteps[idx];\n if (!step) return;\n\n const position = step.style?.position === 'bottom' ? 'bottom' : 'top';\n // Con selector el banner se EMBEBE en ese contenedor — también en pasos de\n // secuencia (el chrome de navegación viaja adentro). En un paso-tooltip el\n // selector es el ancla; en un paso-banner es el contenedor: no colisionan\n // porque cada paso tiene UNA presentación.\n const selector = step.selector?.trim() || null;\n\n let anchor: Element | null = null;\n if (selector) {\n anchor = await waitForElement(selector);\n if (!anchor) return; // contenedor ausente → no pintar (como tooltip/inline)\n }\n\n const { host, root } = this.createHost();\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const banner = ownerDocument.createElement('div');\n banner.className = bannerClassOf(position, Boolean(anchor));\n\n const dismiss = (\n action: 'dismissed' | 'cta_clicked',\n ctaUrl?: string,\n meta?: GuideInteractionMetadata,\n ) => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: idx,\n action,\n ...(meta ? { metadata: meta } : {}),\n });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n\n const content = context.nav\n ? buildWalkthroughStepContent(\n step,\n context.nav.stepIndex,\n context.nav.totalSteps,\n ownerDocument,\n context.nav.callbacks,\n )\n : buildStepContent(step, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n\n banner.appendChild(content);\n root.appendChild(banner);\n\n if (selector && anchor) {\n host.style.display = 'block';\n const insertAt = position === 'top' ? 'prepend' : 'append';\n insertHost(anchor, host, insertAt);\n this.registerCleanup(keepHostAttached(host, selector, insertAt));\n }\n\n if (!context.nav) {\n this.liveContainer = banner;\n this.liveContent = content;\n this.liveBuild = (s) =>\n buildStepContent(s, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n this.liveKey = this.liveKeyOf(step);\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n }\n\n /** Cambiar de contenedor o de top/bottom embebido requiere re-insertar → remontar. */\n protected override liveKeyOf(step: GuideStep): string {\n const selector = step.selector?.trim() ?? '';\n if (!selector) return '';\n const position = step.style?.position === 'bottom' ? 'bottom' : 'top';\n return `${selector}|${position}`;\n }\n\n protected override onLiveUpdate(step: GuideStep): void {\n // La posición del banner de pantalla completa (top/bottom) es solo una\n // clase del wrapper — se actualiza en vivo. (El embebido remonta vía liveKey.)\n if (this.liveContainer) {\n const position = step.style?.position === 'bottom' ? 'bottom' : 'top';\n const embedded = Boolean(step.selector?.trim());\n this.liveContainer.className = bannerClassOf(position, embedded);\n }\n }\n}\n\nfunction bannerClassOf(position: 'top' | 'bottom', embedded: boolean): string {\n return embedded ? 'veo-banner veo-banner-embedded' : `veo-banner veo-banner-${position}`;\n}\n","import { renderRichText } from './rich-text';\nimport type { GuideProgressItem, GuideRenderContext, StepBlock } from './types';\n\n/**\n * Bloque «Lista de tareas» (mock): título (rich text del bloque), un ítem por\n * guía con anillo de progreso + texto + subtítulo («Completado 1 de 2 pasos»)\n * y al pie «X de N completadas», porcentaje y barra. El progreso llega por\n * `context.fetchProgress` (async): el bloque se pinta al instante y se rellena\n * cuando responde. Clic en un ítem abre esa guía en el paso donde el usuario\n * se quedó.\n */\n\n/** Estilos del bloque (`block.style`) con sus valores por defecto. */\nexport interface ChecklistStyle {\n colorMode: 'light' | 'dark';\n iconEmptyColor: string;\n iconFillColor: string;\n barColor: string;\n barHeight: number;\n fontSize: number;\n fontWeight: number;\n titleColor: string;\n subtitleColor: string;\n subtitleTemplate: string;\n}\n\nexport const CHECKLIST_DEFAULTS: ChecklistStyle = {\n colorMode: 'light',\n iconEmptyColor: '#e7e2de',\n iconFillColor: '#406a31',\n barColor: '#406a31',\n barHeight: 8,\n fontSize: 14,\n fontWeight: 600,\n titleColor: '#2c2825',\n subtitleColor: '#8a8582',\n subtitleTemplate: 'Completado <%= currentStep %> de <%= totalSteps %> pasos',\n};\n\nconst WEIGHTS: Record<string, number> = { regular: 400, medium: 500, semibold: 600, bold: 700 };\n\nexport function checklistStyle(style: Record<string, unknown> | null | undefined): ChecklistStyle {\n const s = style ?? {};\n const str = (k: keyof ChecklistStyle, fb: string): string =>\n typeof s[k] === 'string' && (s[k] as string).trim() ? (s[k] as string) : fb;\n const num = (k: keyof ChecklistStyle, fb: number, min: number, max: number): number =>\n typeof s[k] === 'number' && Number.isFinite(s[k] as number)\n ? Math.min(max, Math.max(min, s[k] as number))\n : fb;\n const weightRaw = s.fontWeight;\n const fontWeight =\n typeof weightRaw === 'number'\n ? Math.min(900, Math.max(100, weightRaw))\n : typeof weightRaw === 'string' && WEIGHTS[weightRaw.toLowerCase()]\n ? (WEIGHTS[weightRaw.toLowerCase()] as number)\n : CHECKLIST_DEFAULTS.fontWeight;\n const dark = s.colorMode === 'dark';\n return {\n colorMode: dark ? 'dark' : 'light',\n iconEmptyColor: str('iconEmptyColor', dark ? '#3c3734' : CHECKLIST_DEFAULTS.iconEmptyColor),\n iconFillColor: str('iconFillColor', CHECKLIST_DEFAULTS.iconFillColor),\n barColor: str('barColor', CHECKLIST_DEFAULTS.barColor),\n barHeight: num('barHeight', CHECKLIST_DEFAULTS.barHeight, 2, 40),\n fontSize: num('fontSize', CHECKLIST_DEFAULTS.fontSize, 10, 40),\n fontWeight,\n titleColor: str('titleColor', dark ? '#f5efeb' : CHECKLIST_DEFAULTS.titleColor),\n subtitleColor: str('subtitleColor', dark ? '#b0a9a5' : CHECKLIST_DEFAULTS.subtitleColor),\n subtitleTemplate: str('subtitleTemplate', CHECKLIST_DEFAULTS.subtitleTemplate),\n };\n}\n\n/** «Completado <%= currentStep %> de <%= totalSteps %>» → texto. */\nexport function renderSubtitle(\n template: string,\n p: { currentStep: number; totalSteps: number },\n): string {\n return template\n .replace(/<%=\\s*currentStep\\s*%>/g, String(p.currentStep))\n .replace(/<%=\\s*totalSteps\\s*%>/g, String(p.totalSteps));\n}\n\nconst RING_R = 10;\nconst RING_C = 2 * Math.PI * RING_R;\n\n/** Anillo de progreso (SVG): fracción rellena; completo = círculo lleno con check. */\nfunction buildRing(\n doc: Document,\n fraction: number,\n completed: boolean,\n st: ChecklistStyle,\n): SVGElement {\n const ns = 'http://www.w3.org/2000/svg';\n const svg = doc.createElementNS(ns, 'svg');\n svg.setAttribute('viewBox', '0 0 28 28');\n svg.setAttribute('class', 'veo-checklist-ring');\n svg.setAttribute('aria-hidden', 'true');\n const track = doc.createElementNS(ns, 'circle');\n track.setAttribute('cx', '14');\n track.setAttribute('cy', '14');\n track.setAttribute('r', String(RING_R));\n track.setAttribute('fill', completed ? st.iconFillColor : 'none');\n track.setAttribute('stroke', st.iconEmptyColor);\n track.setAttribute('stroke-width', '4.5');\n svg.appendChild(track);\n if (completed) {\n const check = doc.createElementNS(ns, 'path');\n check.setAttribute('d', 'M9 14.5l3.2 3.2L19 11');\n check.setAttribute('fill', 'none');\n check.setAttribute('stroke', '#fff');\n check.setAttribute('stroke-width', '2.4');\n check.setAttribute('stroke-linecap', 'round');\n check.setAttribute('stroke-linejoin', 'round');\n svg.appendChild(check);\n return svg;\n }\n const f = Math.max(0, Math.min(1, fraction));\n if (f > 0) {\n const arc = doc.createElementNS(ns, 'circle');\n arc.setAttribute('cx', '14');\n arc.setAttribute('cy', '14');\n arc.setAttribute('r', String(RING_R));\n arc.setAttribute('fill', 'none');\n arc.setAttribute('stroke', st.iconFillColor);\n arc.setAttribute('stroke-width', '4.5');\n arc.setAttribute('stroke-linecap', 'butt');\n arc.setAttribute('stroke-dasharray', `${(RING_C * f).toFixed(2)} ${RING_C.toFixed(2)}`);\n arc.setAttribute('transform', 'rotate(-90 14 14)');\n svg.appendChild(arc);\n }\n return svg;\n}\n\nexport function buildChecklistBlock(\n block: StepBlock,\n doc: Document,\n context: GuideRenderContext,\n): HTMLElement {\n const st = checklistStyle(block.style as Record<string, unknown> | null | undefined);\n const items = (block.items ?? []).filter((i) => i && typeof i.guideId === 'string' && i.guideId);\n const root = doc.createElement('div');\n root.className = `veo-checklist${st.colorMode === 'dark' ? ' veo-checklist--dark' : ''}`;\n root.style.setProperty('--veo-cl-font-size', `${st.fontSize}px`);\n root.style.setProperty('--veo-cl-font-weight', String(st.fontWeight));\n root.style.setProperty('--veo-cl-title', st.titleColor);\n root.style.setProperty('--veo-cl-subtitle', st.subtitleColor);\n root.style.setProperty('--veo-cl-bar', st.barColor);\n root.style.setProperty('--veo-cl-bar-h', `${st.barHeight}px`);\n\n // Título: rich text del bloque (o texto plano).\n if (\n (typeof block.html === 'string' && block.html) ||\n (typeof block.text === 'string' && block.text)\n ) {\n const title = doc.createElement('div');\n title.className = 'veo-checklist-title';\n if (typeof block.html === 'string' && block.html)\n title.appendChild(renderRichText(block.html, doc));\n else title.textContent = block.text as string;\n root.appendChild(title);\n }\n\n const list = doc.createElement('div');\n list.className = 'veo-checklist-items';\n list.setAttribute('role', 'list');\n root.appendChild(list);\n\n const footer = doc.createElement('div');\n footer.className = 'veo-checklist-footer';\n const summary = doc.createElement('div');\n summary.className = 'veo-checklist-summary';\n const count = doc.createElement('span');\n count.className = 'veo-checklist-count';\n const percent = doc.createElement('span');\n percent.className = 'veo-checklist-percent';\n summary.append(count, percent);\n const bar = doc.createElement('div');\n bar.className = 'veo-checklist-bar';\n const fill = doc.createElement('div');\n fill.className = 'veo-checklist-bar-fill';\n bar.appendChild(fill);\n footer.append(summary, bar);\n root.appendChild(footer);\n\n /** Pinta la lista con el progreso que haya (sin progreso: ítems sin subtítulo). */\n const paint = (progress: Map<string, GuideProgressItem> | null): void => {\n list.textContent = '';\n // Con progreso del backend solo se listan las guías publicadas (las demás no vienen).\n const visible = progress ? items.filter((i) => progress.has(i.guideId)) : items;\n let done = 0;\n for (const item of visible) {\n const p = progress?.get(item.guideId) ?? null;\n if (p?.completed) done++;\n const row = doc.createElement('button');\n row.type = 'button';\n row.className = `veo-checklist-item${p?.completed ? ' veo-checklist-item--done' : ''}`;\n row.setAttribute('role', 'listitem');\n const fraction = p && p.totalSteps > 0 ? p.currentStep / p.totalSteps : 0;\n row.appendChild(buildRing(doc, fraction, p?.completed === true, st));\n const texts = doc.createElement('span');\n texts.className = 'veo-checklist-texts';\n const label = doc.createElement('span');\n label.className = 'veo-checklist-label';\n label.textContent = (item.text ?? '').trim() || p?.guideName || 'Guía';\n if (p && p.published === false) row.title = 'Guía no publicada: los usuarios no la verán';\n texts.appendChild(label);\n if (p) {\n const sub = doc.createElement('span');\n sub.className = 'veo-checklist-sub';\n sub.textContent = renderSubtitle(st.subtitleTemplate, p);\n texts.appendChild(sub);\n }\n row.appendChild(texts);\n row.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (context.isPreview) return; // en el editor no se salta a otra guía\n // Retoma en el paso donde se quedó (completada → desde el principio).\n const start = p && !p.completed ? Math.min(p.currentStep, p.totalSteps - 1) : 0;\n if (context.onOpenGuideAt) context.onOpenGuideAt(item.guideId, start);\n else context.onOpenGuide?.(item.guideId);\n });\n list.appendChild(row);\n }\n const total = visible.length;\n const pct = total > 0 ? Math.round((done / total) * 100) : 0;\n count.textContent = `${done} de ${total} ${total === 1 ? 'completada' : 'completadas'}`;\n percent.textContent = `${pct}%`;\n fill.style.width = `${pct}%`;\n footer.hidden = total === 0;\n };\n\n // Editor sin guías todavía: dos ítems de ejemplo para ver el diseño (no se guardan).\n if (context.isPreview && items.length === 0) {\n const sample = new Map<string, GuideProgressItem>([\n [\n '__sample_1',\n {\n guideId: '__sample_1',\n guideName: 'Configura tu primer envío',\n totalSteps: 2,\n currentStep: 1,\n completed: false,\n },\n ],\n [\n '__sample_2',\n {\n guideId: '__sample_2',\n guideName: 'Conecta tu tienda',\n totalSteps: 2,\n currentStep: 2,\n completed: true,\n },\n ],\n ]);\n items.push(\n { guideId: '__sample_1', text: 'Configura tu primer envío' },\n { guideId: '__sample_2', text: 'Conecta tu tienda' },\n );\n paint(sample);\n const hint = doc.createElement('p');\n hint.className = 'veo-checklist-empty';\n hint.textContent = 'Ejemplo: agrega guías a la lista desde Opciones.';\n root.appendChild(hint);\n return root;\n }\n paint(null);\n if (context.fetchProgress && items.length > 0) {\n void context\n .fetchProgress(items.map((i) => i.guideId))\n .then((rows) => paint(new Map(rows.map((r) => [r.guideId, r]))))\n .catch(() => {\n /* sin progreso: se queda la lista sin subtítulos */\n });\n }\n return root;\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 const min = typeof field.min === 'number' ? field.min : 0;\n const max = typeof field.max === 'number' && field.max > min ? field.max : 10;\n return buildScale(wrapper, doc, min, max, 'veo-nps-btn', undefined, {\n labels: field.scaleLabels ?? [],\n showLabels: field.showLabels !== false,\n });\n }\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/**\n * Fila de casillas numeradas (escala numérica, p. ej. 0-10 o 1-5) o de\n * estrellas (rating 1-5). Con `labels`, cada casilla lleva su etiqueta como\n * nombre accesible y, si `showLabels`, se pinta debajo de SU casilla (la\n * primera alineada a la izquierda, la última a la derecha, el resto centradas).\n */\nfunction buildScale(\n wrapper: HTMLElement,\n doc: Document,\n min: number,\n max: number,\n btnClass: string,\n symbol?: string,\n opts: { labels: string[]; showLabels: boolean } = { labels: [], showLabels: false },\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 const labelOf = (n: number): string => opts.labels[n - min]?.trim() ?? '';\n const anyLabel =\n opts.showLabels &&\n Array.from({ length: max - min + 1 }, (_, i) => min + i).some((n) => labelOf(n));\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 const lbl = labelOf(n);\n btn.setAttribute('aria-label', lbl ? `${n} · ${lbl}` : String(n));\n if (lbl) btn.title = lbl;\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 if (!anyLabel) {\n row.appendChild(btn);\n continue;\n }\n // Casilla + su etiqueta debajo (columna). Los extremos cuelgan hacia afuera.\n const item = doc.createElement('div');\n item.className = `veo-scale-item${n === min ? ' veo-scale-item--first' : n === max ? ' veo-scale-item--last' : ''}`;\n const text = doc.createElement('span');\n text.className = 'veo-scale-label';\n text.textContent = lbl;\n item.append(btn, text);\n row.appendChild(item);\n }\n wrapper.appendChild(row);\n return { wrapper, read: () => selected };\n}\n","import type {\n GuideTheme,\n GuideThemeBox,\n GuideThemeButton,\n GuideThemeMode,\n GuideThemeText,\n} from './types';\n\n/** Id del tema del workspace en `step.design.theme` (el editor lo llama «Tema de tu marca»). */\nexport const WORKSPACE_THEME_ID = 'workspace';\n\nconst SHADOW_SPEC = {\n soft: { y: 4, blur: 14, alpha: 0.12 },\n medium: { y: 12, blur: 32, alpha: 0.22 },\n strong: { y: 24, blur: 64, alpha: 0.38 },\n} as const;\n\nconst JUSTIFY: Record<GuideThemeBox['align'], string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n distribute: 'space-between',\n};\n\nfunction channels(hex: string): [number, number, number] {\n const h = hex.replace('#', '');\n const full = h.length === 3 ? [...h].map((x) => x + x).join('') : h.slice(0, 6);\n const ch = (i: number): number => Number.parseInt(full.slice(i, i + 2), 16) || 0;\n return [ch(0), ch(2), ch(4)];\n}\n\n/** `box-shadow` CSS de un tipo de sombra del tema con su color. */\nfunction boxShadow(shadow: 'none' | 'soft' | 'medium' | 'strong', hex: string): string {\n if (shadow === 'none') return 'none';\n const spec = SHADOW_SPEC[shadow];\n const [r, g, b] = channels(hex);\n return `0 ${spec.y}px ${spec.blur}px rgba(${r}, ${g}, ${b}, ${spec.alpha})`;\n}\n\n/** Texto legible (oscuro/blanco) sobre un fondo hex, por luminancia. */\nexport function readableOn(hex: string): string {\n const [r, g, b] = channels(hex);\n return (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255 > 0.6 ? '#111827' : '#ffffff';\n}\n\n/** ¿Este paso usa el tema del workspace y la guía lo trae? Devuelve el modo de color a aplicar. */\nexport function themeModeFor(\n theme: GuideTheme | null | undefined,\n design: Record<string, unknown>,\n): GuideThemeMode | null {\n if (!theme || design.theme !== WORKSPACE_THEME_ID) return null;\n return (design.colorMode === 'dark' ? theme.dark : theme.light) ?? null;\n}\n\n/**\n * Alineación (`justify-content`) de una fila de botones según el tema: la decide\n * el PRIMER botón de la fila por su preset (primario/secundario/link). `null` = no\n * opina (preset sin tema, o el contenedor pide «Distribuir», que ya va por\n * `--veo-actions-justify`).\n */\nexport function themeRowJustify(\n mode: GuideThemeMode,\n inline: boolean,\n preset: unknown,\n): string | null {\n const box = inline ? mode.embedded : mode.overlay;\n if (box.align === 'distribute') return null;\n const button =\n preset === 'secondary'\n ? mode.buttons?.secondary\n : preset === 'link'\n ? mode.buttons?.tertiary\n : preset === undefined || preset === null || preset === 'primary'\n ? mode.buttons?.primary\n : undefined;\n return button ? (JUSTIFY[button.align] ?? null) : null;\n}\n\n/**\n * Las tipografías del tema pueden ser REFERENCIAS a la app: `inherit` = su\n * fuente de cuerpo, `app-heading` = la de sus encabezados. Se leen en vivo del\n * documento (la guía vive en un shadow DOM que no hereda la fuente).\n */\nfunction appFont(ref: string, doc: Document): string | null {\n const view = doc.defaultView;\n if (!view) return null;\n if (ref === 'inherit') return view.getComputedStyle(doc.body).fontFamily || null;\n if (ref === 'app-heading') {\n const heading = Array.from(doc.querySelectorAll('h1,h2,h3')).find(\n (el) => el.getClientRects().length > 0,\n );\n return view.getComputedStyle(heading ?? doc.body).fontFamily || null;\n }\n return ref;\n}\n\n/**\n * Estilos del CONTENEDOR que define el tema, en las mismas claves que\n * `step.design` (los lee `applyCompositeDesign`). El caller los usa como base:\n * `{ ...themeDesign, ...design }`, así lo puesto a mano en el paso gana.\n */\nexport function themeContainerDesign(\n mode: GuideThemeMode,\n inline: boolean,\n /** Paso anclado a un elemento o badge: fondo y relleno de la pestaña Tooltip. */\n tooltip = false,\n): Record<string, unknown> {\n const box = inline ? mode.embedded : mode.overlay;\n const tip = tooltip ? mode.tooltip : undefined;\n const padding = tip?.padding ?? box.padding;\n const out: Record<string, unknown> = {\n // El embebido va en el flujo de la página: sin fondo propio.\n background: tip\n ? tip.background\n : inline\n ? 'transparent'\n : (box.background ?? mode.colors.background),\n color: mode.colors.text,\n paddingTop: padding.top,\n paddingRight: padding.right,\n paddingBottom: padding.bottom,\n paddingLeft: padding.left,\n borderColor: tip?.borderColor ?? box.borderColor,\n borderWidth: tip?.borderWidth ?? box.borderWidth,\n radius: tip?.borderRadius ?? box.borderRadius,\n };\n const shadow = tip?.shadow ?? box.shadow;\n const shadowColor = tip?.shadowColor ?? box.shadowColor;\n if (shadow === 'none') {\n Object.assign(out, { shadowColor: 'transparent', shadowBlur: 0 });\n } else {\n const spec = SHADOW_SPEC[shadow];\n const [r, g, b] = channels(shadowColor);\n Object.assign(out, {\n shadowX: 0,\n shadowY: spec.y,\n shadowBlur: spec.blur,\n shadowSpread: 0,\n shadowColor: `rgba(${r}, ${g}, ${b}, ${spec.alpha})`,\n });\n }\n return out;\n}\n\n/**\n * Publica el tema como variables CSS en la tarjeta (heredan a todo su\n * contenido): acento de los botones, fuente base, alineación de la fila de\n * acciones y los tokens de texto por preset (`--veo-t-title-size`…) que leen\n * las reglas `.veo-card--themed [data-veo-preset]` de `GUIDE_STYLES`.\n */\nexport function applyThemeVars(\n card: HTMLElement,\n mode: GuideThemeMode,\n inline: boolean,\n /** Tooltip: el Título toma «Texto principal» y el resto «Texto secundario». */\n tooltip = false,\n): void {\n const doc = card.ownerDocument ?? document;\n const box = inline ? mode.embedded : mode.overlay;\n const set = (name: string, value: string | null): void => {\n if (value) card.style.setProperty(name, value);\n };\n card.classList.add('veo-card--themed');\n set('--veo-primary', mode.colors.accent);\n set('--veo-cta-color', readableOn(mode.colors.accent));\n // Botones del tema: principal (`--veo-cta-*`), secundario (`--veo-cta2-*`, lo\n // lee `.veo-guide-cta--secondary`) y terciario (`--veo-cta3-*`, preset «link»).\n const primary = mode.buttons?.primary;\n const publish = (prefix: string, b: GuideThemeButton | undefined): void => {\n if (!b) return;\n const p = b.padding;\n set(`${prefix}-bg`, b.background);\n set(`${prefix}-color`, b.color);\n set(`${prefix}-pad`, `${p.top}px ${p.right}px ${p.bottom}px ${p.left}px`);\n set(`${prefix}-size`, `${b.fontSize}px`);\n set(`${prefix}-weight`, String(b.fontWeight));\n set(`${prefix}-radius`, `${b.borderRadius}px`);\n set(\n `${prefix}-border`,\n b.borderWidth > 0 ? `${b.borderWidth}px solid ${b.borderColor}` : 'none',\n );\n };\n publish('--veo-cta', primary);\n publish('--veo-cta2', mode.buttons?.secondary);\n publish('--veo-cta3', mode.buttons?.tertiary);\n set('--veo-text', mode.colors.text);\n set('--veo-text-secondary', mode.colors.textMuted);\n set('--veo-font', appFont('inherit', doc));\n // El botón decide dónde va en su fila; solo «Distribuir» del contenedor lo pisa.\n set(\n '--veo-actions-justify',\n box.align === 'distribute' || !primary ? JUSTIFY[box.align] : JUSTIFY[primary.align],\n );\n\n // Formulario (bloques de encuesta): variables `--veo-f-*`. La clase activa las\n // reglas `.veo-card--themed-form .veo-form …` de `GUIDE_STYLES`.\n const form = mode.form;\n if (form) {\n card.classList.add('veo-card--themed-form');\n const fp = form.padding;\n set('--veo-f-bg', form.background);\n set('--veo-f-accent', form.accent);\n set('--veo-f-on-accent', form.onAccent);\n set('--veo-f-pad', `${fp.top}px ${fp.right}px ${fp.bottom}px ${fp.left}px`);\n // Acordeón «Borde» de la caja del formulario.\n if (typeof form.borderWidth === 'number' && form.borderColor) {\n set(\n '--veo-f-border',\n form.borderWidth > 0 ? `${form.borderWidth}px solid ${form.borderColor}` : 'none',\n );\n }\n if (typeof form.borderRadius === 'number') set('--veo-f-radius', `${form.borderRadius}px`);\n if (form.shadow && form.shadowColor) {\n set('--veo-f-shadow', boxShadow(form.shadow, form.shadowColor));\n }\n for (const [name, t] of [\n ['primary', form.text.primary],\n ['secondary', form.text.secondary],\n ] as const) {\n set(`--veo-f-${name}-color`, t.color);\n set(`--veo-f-${name}-size`, `${t.fontSize}px`);\n set(`--veo-f-${name}-weight`, String(t.fontWeight));\n set(`--veo-f-${name}-align`, t.align);\n set(`--veo-f-${name}-font`, appFont(t.fontFamily, doc));\n }\n }\n\n const tip = tooltip ? mode.tooltip?.text : undefined;\n const tokens: [string, GuideThemeText][] = [\n ['title', tip?.primary ?? mode.text.title],\n ['subtitle', tip?.secondary ?? mode.text.subtitle],\n ['paragraph', tip?.secondary ?? mode.text.paragraph],\n ];\n for (const [name, t] of tokens) {\n set(`--veo-t-${name}-color`, t.color);\n set(`--veo-t-${name}-size`, `${t.fontSize}px`);\n set(`--veo-t-${name}-weight`, String(t.fontWeight));\n set(`--veo-t-${name}-align`, t.align);\n set(`--veo-t-${name}-font`, appFont(t.fontFamily, doc));\n }\n}\n","import type { StepBlock } from './types';\n\n/** Bloque con su índice original en `step.blocks`. */\nexport interface IndexedBlock {\n block: StepBlock;\n index: number;\n}\nexport interface LayoutColumn {\n col: number;\n blocks: IndexedBlock[];\n}\nexport interface LayoutRow {\n row: number;\n columns: LayoutColumn[];\n}\n\n/**\n * Agrupa los bloques de un paso en filas y columnas según `block.row`/`col`.\n * Un bloque SIN `row` va en su propia fila (apilado, como siempre); así las\n * guías existentes no cambian. Las filas se ordenan por `row` y, dentro,\n * las columnas por `col`; el orden del array manda entre bloques de la misma\n * celda. Las filas «implícitas» (sin row) se intercalan según su posición en\n * el array respecto a las explícitas.\n */\nexport function groupLayout(blocks: StepBlock[]): LayoutRow[] {\n const rows = new Map<number, LayoutRow>();\n const order: number[] = [];\n // Filas implícitas: se les asigna un número fraccional entre la fila explícita\n // anterior y la siguiente para respetar el orden del array.\n let lastRow = -1;\n blocks.forEach((block, index) => {\n if (!block) return;\n let row: number;\n if (typeof block.row === 'number' && Number.isFinite(block.row)) {\n row = block.row;\n lastRow = row;\n } else {\n row = lastRow + 0.5;\n lastRow = row;\n }\n const col = typeof block.col === 'number' && Number.isFinite(block.col) ? block.col : 0;\n let r = rows.get(row);\n if (!r) {\n r = { row, columns: [] };\n rows.set(row, r);\n order.push(row);\n }\n let c = r.columns.find((x) => x.col === col);\n if (!c) {\n c = { col, blocks: [] };\n r.columns.push(c);\n }\n c.blocks.push({ block, index });\n });\n return order\n .sort((a, b) => a - b)\n .map((k) => {\n const r = rows.get(k) as LayoutRow;\n r.columns.sort((a, b) => a.col - b.col);\n return r;\n });\n}\n","/**\n * Bloqueo del scroll de la página mientras hay un backdrop visible.\n *\n * Un overlay `position: fixed` que cubre el viewport NO impide que la rueda\n * del mouse / el gesto táctil hagan scroll del documento de atrás (el browser\n * busca el ancestro scrolleable y el overlay no lo es). Con backdrop, la app\n * de atrás debe quedar congelada: `overflow: hidden` en `<html>` y `<body>`,\n * compensando el ancho de la scrollbar para que el layout no salte.\n *\n * Ref-count por documento: varias guías con backdrop a la vez (o un remontaje\n * del preview del editor) solo restauran el estado original al soltar la\n * última. Idempotente: llamar dos veces al release del mismo lock es no-op.\n */\ninterface LockState {\n count: number;\n html: { overflow: string; paddingRight: string };\n body: { overflow: string; paddingRight: string };\n}\n\nconst states = new WeakMap<Document, LockState>();\n\nexport function lockScroll(doc: Document = document): () => void {\n const html = doc.documentElement;\n const body = doc.body;\n if (!html || !body) return () => {};\n\n let state = states.get(doc);\n if (!state) {\n state = {\n count: 0,\n html: { overflow: html.style.overflow, paddingRight: html.style.paddingRight },\n body: { overflow: body.style.overflow, paddingRight: body.style.paddingRight },\n };\n states.set(doc, state);\n // Ancho de la scrollbar vertical (0 en overlay-scrollbars / móvil).\n const win = doc.defaultView;\n const gap = win ? Math.max(0, win.innerWidth - html.clientWidth) : 0;\n if (gap > 0) body.style.paddingRight = `${gap}px`;\n html.style.overflow = 'hidden';\n body.style.overflow = 'hidden';\n }\n state.count += 1;\n\n let released = false;\n return () => {\n if (released) return;\n released = true;\n const s = states.get(doc);\n if (!s) return;\n s.count -= 1;\n if (s.count > 0) return;\n states.delete(doc);\n html.style.overflow = s.html.overflow;\n html.style.paddingRight = s.html.paddingRight;\n body.style.overflow = s.body.overflow;\n body.style.paddingRight = s.body.paddingRight;\n };\n}\n\n/** `true` si el documento tiene el scroll bloqueado por alguna guía. */\nexport function isScrollLocked(doc: Document = document): boolean {\n return (states.get(doc)?.count ?? 0) > 0;\n}\n","import type { SnoozeUnit } from './types';\n\n/**\n * «Posponer guía»: la guía se cierra y no vuelve a mostrarse sola hasta que\n * pase el plazo. Vive en el navegador del usuario (localStorage) — es la misma\n * regla que el resto del estado local del SDK (último paso, frecuencia).\n */\nconst KEY = (guideId: string): string => `veo:snooze:${guideId}`;\n\nconst UNIT_MS: Record<SnoozeUnit, number> = {\n hour: 3_600_000,\n day: 86_400_000,\n week: 604_800_000,\n};\n\nexport function snoozeDurationMs(every: number, unit: SnoozeUnit): number {\n const n = Number.isFinite(every) && every > 0 ? Math.floor(every) : 1;\n return n * (UNIT_MS[unit] ?? UNIT_MS.day);\n}\n\nexport function snoozeGuide(\n guideId: string,\n every: number,\n unit: SnoozeUnit,\n now = Date.now(),\n): void {\n try {\n localStorage.setItem(KEY(guideId), String(now + snoozeDurationMs(every, unit)));\n } catch {\n /* storage opcional */\n }\n}\n\n/** ¿Sigue pospuesta? (Limpia la marca cuando venció.) */\nexport function isSnoozed(guideId: string, now = Date.now()): boolean {\n try {\n const raw = localStorage.getItem(KEY(guideId));\n if (raw === null) return false;\n const until = Number(raw);\n if (!Number.isFinite(until) || until <= now) {\n localStorage.removeItem(KEY(guideId));\n return false;\n }\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Marcador configurado del badge (`step.badge.marker`): construye el elemento\n * (icono / imagen / icono+texto) y lo posiciona sobre o junto al elemento ancla.\n * Puro en la parte de cálculo (`markerOffset`) para poder testearlo.\n */\nimport { autoUpdate } from '@floating-ui/dom';\nimport type { BadgeMarker, BadgeMarkerPosition } from '../types';\n\n/**\n * Set de iconos del badge (mock 2026-09): 4 en contorno, sus versiones sólidas\n * (círculo relleno con el glifo en blanco), la mira sólida y la etiqueta «New».\n * Paths de heroicons (viewBox 24); los glifos sólidos van sin el círculo.\n */\ninterface BadgeIconDef {\n paths: string[];\n /** Puntos (cx, cy) dibujados como círculos rellenos (el punto de la i / !). */\n dots?: Array<[number, number]>;\n /** Círculo relleno de fondo + glifo blanco. */\n solid?: boolean;\n /** Escala del glifo alrededor del centro (para meterlo dentro del círculo). */\n scale?: number;\n /** Etiqueta de texto en vez de glifo. */\n text?: string;\n}\n\nconst INFO_GLYPH =\n 'M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021';\nconst QUESTION_GLYPH =\n 'M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75';\nconst STAR_GLYPH =\n 'M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.563.563 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.563.563 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z';\nconst CIRCLE = 'M21 12a9 9 0 11-18 0 9 9 0 0118 0z';\nconst TARGET_GLYPH =\n 'M7.5 3.75H6A2.25 2.25 0 0 0 3.75 6v1.5M16.5 3.75H18A2.25 2.25 0 0 1 20.25 6v1.5m0 9V18A2.25 2.25 0 0 1 18 20.25h-1.5m-9 0H6A2.25 2.25 0 0 1 3.75 18v-1.5M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z';\n\nexport const BADGE_ICONS: Record<string, BadgeIconDef> = {\n info: { paths: [CIRCLE, INFO_GLYPH], dots: [[12, 8.25]] },\n exclamation: { paths: [CIRCLE, 'M12 8v4.5'], dots: [[12, 15.75]] },\n question: { paths: [CIRCLE, QUESTION_GLYPH], dots: [[12, 17.25]] },\n star: { paths: [STAR_GLYPH] },\n 'info-solid': { paths: [INFO_GLYPH], dots: [[12, 8.25]], solid: true, scale: 0.8 },\n 'exclamation-solid': { paths: ['M12 8v4.5'], dots: [[12, 15.75]], solid: true, scale: 0.8 },\n 'question-solid': { paths: [QUESTION_GLYPH], dots: [[12, 17.25]], solid: true, scale: 0.8 },\n 'star-solid': { paths: [STAR_GLYPH], solid: true, scale: 0.55 },\n 'target-solid': { paths: [TARGET_GLYPH], solid: true, scale: 0.6 },\n new: { paths: [], text: 'New' },\n};\n\nexport const BADGE_ICON_NAMES = Object.keys(BADGE_ICONS);\n\nexport const DEFAULT_MARKER_SIZE = 14;\nexport const DEFAULT_MARKER_Z = 19000;\n/** Separación entre el ancla y un marcador a su lado (left/right). */\nconst SIDE_GAP = 8;\n\nfunction num(v: number | null | undefined, fallback: number): number {\n return typeof v === 'number' && Number.isFinite(v) ? v : fallback;\n}\n\nfunction iconNode(doc: Document, name: string, size: number, color: string): Node {\n const def = BADGE_ICONS[name] ?? (BADGE_ICONS.info as BadgeIconDef);\n if (def.text) {\n const t = doc.createElement('span');\n t.textContent = def.text;\n t.style.font = `700 ${Math.round(size * 0.85)}px/1 system-ui, -apple-system, sans-serif`;\n t.style.color = color;\n return t;\n }\n const ns = 'http://www.w3.org/2000/svg';\n const svg = doc.createElementNS(ns, 'svg');\n svg.setAttribute('viewBox', '0 0 24 24');\n svg.setAttribute('width', String(size));\n svg.setAttribute('height', String(size));\n svg.setAttribute('fill', 'none');\n svg.setAttribute('aria-hidden', 'true');\n const glyphColor = def.solid ? '#ffffff' : color;\n if (def.solid) {\n const bg = doc.createElementNS(ns, 'circle');\n bg.setAttribute('cx', '12');\n bg.setAttribute('cy', '12');\n bg.setAttribute('r', '12');\n bg.setAttribute('fill', color);\n svg.appendChild(bg);\n }\n const g = doc.createElementNS(ns, 'g');\n g.setAttribute('stroke', glyphColor);\n g.setAttribute('stroke-width', def.solid ? '2' : '1.8');\n g.setAttribute('stroke-linecap', 'round');\n g.setAttribute('stroke-linejoin', 'round');\n if (def.scale && def.scale !== 1) {\n const k = def.scale;\n const t = 12 - 12 * k;\n g.setAttribute('transform', `translate(${t} ${t}) scale(${k})`);\n }\n for (const d of def.paths) {\n const path = doc.createElementNS(ns, 'path');\n path.setAttribute('d', d);\n g.appendChild(path);\n }\n for (const [cx, cy] of def.dots ?? []) {\n const dot = doc.createElementNS(ns, 'circle');\n dot.setAttribute('cx', String(cx));\n dot.setAttribute('cy', String(cy));\n dot.setAttribute('r', '0.9');\n dot.setAttribute('fill', glyphColor);\n dot.setAttribute('stroke', 'none');\n g.appendChild(dot);\n }\n svg.appendChild(g);\n return svg;\n}\n\n/** Construye el elemento visual del marcador según su tipo. Sin innerHTML. */\nexport function buildMarkerElement(doc: Document, marker: BadgeMarker): HTMLElement {\n const size = num(marker.size, DEFAULT_MARKER_SIZE);\n const color = marker.color || '#000000';\n const el = doc.createElement('span');\n el.className = `veo-badge-marker veo-badge-marker-${marker.kind}`;\n el.style.display = 'inline-flex';\n el.style.alignItems = 'center';\n el.style.justifyContent = 'center';\n el.style.boxSizing = 'border-box';\n el.style.lineHeight = '1';\n\n if (marker.kind === 'image') {\n const img = doc.createElement('img');\n img.alt = '';\n img.src = marker.imageUrl || '';\n img.style.width = `${size}px`;\n img.style.height = `${size}px`;\n img.style.objectFit = 'contain';\n img.style.display = 'block';\n el.appendChild(img);\n return el;\n }\n\n if (marker.kind === 'icon-text') {\n el.style.gap = '6px';\n el.style.color = color;\n el.style.fontSize = `${size}px`;\n el.style.fontFamily = 'inherit';\n el.style.fontWeight = '600';\n el.style.whiteSpace = 'nowrap';\n el.style.background = marker.bgColor || 'transparent';\n const bw = num(marker.borderWidth, 0);\n if (bw > 0) el.style.border = `${bw}px solid ${marker.borderColor || color}`;\n el.style.padding = `${num(marker.paddingY, 6)}px ${num(marker.paddingX, 10)}px`;\n el.style.borderRadius = `${num(marker.radius, 999)}px`;\n if (marker.showIcon !== false)\n el.appendChild(iconNode(doc, marker.icon || 'star', size, color));\n const text = doc.createElement('span');\n text.textContent = marker.text || '';\n el.appendChild(text);\n return el;\n }\n\n el.style.width = `${size}px`;\n el.style.height = `${size}px`;\n el.appendChild(iconNode(doc, marker.icon || 'info', size, color));\n return el;\n}\n\n/**\n * Posición (esquina superior izquierda) del marcador en coordenadas de PÁGINA\n * a partir del rect del ancla. Esquinas: el marcador queda CENTRADO sobre la\n * esquina (tipo punto de notificación). left/right: al lado, centrado\n * verticalmente. center: centrado sobre el elemento.\n */\nexport function markerOffset(\n anchor: { left: number; top: number; width: number; height: number },\n marker: { width: number; height: number },\n position: BadgeMarkerPosition,\n offset: { x: number; y: number },\n): { x: number; y: number } {\n const right = anchor.left + anchor.width;\n const bottom = anchor.top + anchor.height;\n const midY = anchor.top + anchor.height / 2 - marker.height / 2;\n const midX = anchor.left + anchor.width / 2 - marker.width / 2;\n let x: number;\n let y: number;\n switch (position) {\n case 'top-left':\n x = anchor.left - marker.width / 2;\n y = anchor.top - marker.height / 2;\n break;\n case 'bottom-left':\n x = anchor.left - marker.width / 2;\n y = bottom - marker.height / 2;\n break;\n case 'bottom-right':\n x = right - marker.width / 2;\n y = bottom - marker.height / 2;\n break;\n case 'left':\n x = anchor.left - marker.width - SIDE_GAP;\n y = midY;\n break;\n case 'right':\n x = right + SIDE_GAP;\n y = midY;\n break;\n case 'center':\n x = midX;\n y = midY;\n break;\n default: // top-right\n x = right - marker.width / 2;\n y = anchor.top - marker.height / 2;\n }\n return { x: x + offset.x, y: y + offset.y };\n}\n\n/** Elementos que no pueden contener hijos (vacíos o reemplazados): el marcador no se anida. */\nconst NO_CHILDREN = new Set([\n 'img',\n 'input',\n 'textarea',\n 'select',\n 'iframe',\n 'video',\n 'audio',\n 'canvas',\n 'br',\n 'hr',\n 'svg',\n 'object',\n 'embed',\n]);\n\n/**\n * ¿Se puede meter el marcador DENTRO del ancla? Solo si es un HTMLElement que\n * admite hijos y no recorta su contenido (con overflow oculto, un marcador\n * centrado sobre una esquina quedaría cortado).\n */\nfunction canNest(anchor: Element): anchor is HTMLElement {\n const win = anchor.ownerDocument.defaultView;\n if (!win || !(anchor instanceof win.HTMLElement)) return false;\n if (NO_CHILDREN.has(anchor.tagName.toLowerCase())) return false;\n const cs = win.getComputedStyle(anchor);\n if (cs.display === 'contents') return false;\n // `overflow` (shorthand) + ejes: cualquier valor distinto de visible recorta.\n const tokens = `${cs.overflow} ${cs.overflowX} ${cs.overflowY}`.split(/\\s+/).filter(Boolean);\n return tokens.every((t) => t === 'visible');\n}\n\n/**\n * Ancla `host` al elemento y devuelve la función que deja de seguirlo.\n *\n * Preferido: el host se anida DENTRO del ancla (position:absolute respecto a\n * ella). Así viaja con el elemento de forma nativa — sidebars sticky, barras\n * fixed, contenedores con scroll propio — sin recalcular en cada scroll, que\n * es lo que hacía temblar al marcador (el body scrollea y la corrección llega\n * un frame después). Solo hay que re-medir cuando cambia el tamaño.\n *\n * Fallback (ancla sin hijos posibles, p. ej. <img>/<input>, o con overflow\n * oculto): el host cuelga de <body> en coordenadas de página y sigue\n * scroll/resize/layout con `autoUpdate`.\n */\nexport function attachMarker(anchor: Element, host: HTMLElement, marker: BadgeMarker): () => void {\n host.style.position = 'absolute';\n host.style.zIndex = String(num(marker.zIndex, DEFAULT_MARKER_Z));\n host.style.margin = '0';\n const position = marker.position ?? 'top-right';\n const offset = { x: num(marker.offsetX, 0), y: num(marker.offsetY, 0) };\n const markerSize = (): { width: number; height: number } => {\n const m = host.getBoundingClientRect();\n return { width: m.width, height: m.height };\n };\n\n if (canNest(anchor)) {\n const win = anchor.ownerDocument.defaultView as Window;\n // El ancla pasa a ser el bloque contenedor del marcador (solo si era static).\n const prevPosition = anchor.style.position;\n const computed = win.getComputedStyle(anchor).position;\n if (!computed || computed === 'static') anchor.style.position = 'relative';\n anchor.appendChild(host);\n // El marcador es nuestro: su clic no debe activar el ancla (un <a> navegaría,\n // un <button> enviaría el form). Los listeners del badge, dentro del shadow,\n // corren antes que estos (burbujeo) así que el tooltip sigue funcionando.\n const swallowClick = (e: Event): void => {\n e.preventDefault();\n e.stopPropagation();\n };\n const swallow = (e: Event): void => e.stopPropagation();\n host.addEventListener('click', swallowClick);\n host.addEventListener('pointerdown', swallow);\n host.addEventListener('mousedown', swallow);\n\n const update = (): void => {\n // Coordenadas respecto al padding box del ancla: el borde queda en negativo\n // para que las esquinas se midan sobre el border box (lo que se ve).\n const { x, y } = markerOffset(\n {\n left: -anchor.clientLeft,\n top: -anchor.clientTop,\n width: anchor.offsetWidth,\n height: anchor.offsetHeight,\n },\n markerSize(),\n position,\n offset,\n );\n host.style.left = `${Math.round(x)}px`;\n host.style.top = `${Math.round(y)}px`;\n };\n update();\n // Sin ancestorScroll/layoutShift: el scroll ya no nos mueve; solo re-medimos\n // si cambia el tamaño del ancla o del marcador.\n const stop = autoUpdate(anchor, host, update, { ancestorScroll: false, layoutShift: false });\n return () => {\n stop();\n host.removeEventListener('click', swallowClick);\n host.removeEventListener('pointerdown', swallow);\n host.removeEventListener('mousedown', swallow);\n host.remove();\n anchor.style.position = prevPosition;\n };\n }\n\n // Fallback: flota sobre <body> en coordenadas de página.\n anchor.ownerDocument.body.appendChild(host);\n const update = (): void => {\n const a = anchor.getBoundingClientRect();\n const { x, y } = markerOffset(\n {\n left: a.left + window.scrollX,\n top: a.top + window.scrollY,\n width: a.width,\n height: a.height,\n },\n markerSize(),\n position,\n offset,\n );\n host.style.left = `${Math.round(x)}px`;\n host.style.top = `${Math.round(y)}px`;\n };\n update();\n const stop = autoUpdate(anchor, host, update);\n return () => {\n stop();\n host.remove();\n };\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { applyBlockStyle, buildContentBlock, createCloseButton, isSafeUrl } from '../block-builder';\nimport { buildChecklistBlock } from '../checklist-block';\nimport { mountCodeBlock } from '../code-block';\nimport { buildField } from '../form-content';\nimport {\n applyThemeVars,\n themeContainerDesign,\n themeModeFor,\n themeRowJustify,\n} from '../guide-theme';\nimport { insertHost, keepHostAttached } from '../inline-host';\nimport { groupLayout, type IndexedBlock, type LayoutColumn } from '../layout';\nimport { renderRichText } from '../rich-text';\nimport { lockScroll } from '../scroll-lock';\nimport { snoozeGuide } from '../snooze';\nimport type {\n ButtonActionSpec,\n CompositeStep,\n FormField,\n GuideRenderContext,\n InlinePosition,\n RowStyle,\n StepBlock,\n StepPosition,\n} from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { attachMarker, buildMarkerElement } from './badge-marker';\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 /** Id del bloque `form` (encuesta) que declara el campo. */\n blockId?: string | null;\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/** Alineación de columnas de una fila (editor de fila) → flex. */\nconst ROW_JUSTIFY: Record<string, string> = { ...ROW_ALIGN, distribute: 'space-between' };\nconst ROW_VALIGN: Record<string, string> = {\n top: 'flex-start',\n center: 'center',\n bottom: 'flex-end',\n};\n\n/**\n * Aplica el estilo de fila (`CompositeStep.rows[n]`): fondo, relleno, margen\n * y alineación. Con alineación horizontal las columnas dejan de repartirse el\n * ancho (`.veo-row--aligned`) para que la posición se note.\n */\nexport function applyRowStyle(rowEl: HTMLElement, style: RowStyle): void {\n const s = rowEl.style;\n if (typeof style.background === 'string' && style.background) s.background = style.background;\n for (const side of ['Top', 'Right', 'Bottom', 'Left'] as const) {\n const p = style[`padding${side}`];\n if (typeof p === 'number' && Number.isFinite(p))\n s.setProperty(`padding-${side.toLowerCase()}`, `${p}px`);\n const m = style[`margin${side}`];\n if (typeof m === 'number' && Number.isFinite(m))\n s.setProperty(`margin-${side.toLowerCase()}`, `${m}px`);\n }\n if (\n typeof style.minHeight === 'number' &&\n Number.isFinite(style.minHeight) &&\n style.minHeight > 0\n ) {\n s.minHeight = `${style.minHeight}px`;\n }\n if (style.align && ROW_JUSTIFY[style.align]) {\n s.justifyContent = ROW_JUSTIFY[style.align] as string;\n rowEl.classList.add('veo-row--aligned');\n }\n if (style.valign && ROW_VALIGN[style.valign]) s.alignItems = ROW_VALIGN[style.valign] as string;\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 /** Alineación de filas de botones según el tema del workspace (null = sin tema). */\n private themeRowJustify: ((preset: unknown) => string | null) | null = null;\n\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 // Editor: los elementos crudos llevan el id del bloque (no hay tarjeta\n // ni host); el builder los selecciona con un marco propio.\n const { cleanup } = mountCodeBlock(soleCode, rawDoc, context, undefined, {\n anchor,\n pos: inlinePosOf(step.inlinePosition),\n ...(context.isPreview && soleCode.editorId ? { tagBlockId: soleCode.editorId } : {}),\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 // Tema del workspace (design system): es la BASE del contenedor; lo que el\n // paso define a mano (`design`) la pisa. Textos y botones lo leen por CSS.\n const themeMode = themeModeFor(context.guide.theme, design);\n const inline = step.presentation === 'inline';\n // Tooltip = anclado a un elemento (no embebido) o badge: pestaña Tooltip del tema.\n const tooltipLike = !inline && (badgeMode || step.position === 'relative-to-element');\n if (themeMode) applyThemeVars(card, themeMode, inline, tooltipLike);\n // Filas de botones sin alineación propia: la da el tema (ver buildSequence).\n this.themeRowJustify = themeMode\n ? (preset: unknown) => themeRowJustify(themeMode, inline, preset)\n : null;\n const cardDesign = themeMode\n ? { ...themeContainerDesign(themeMode, inline, tooltipLike), ...design }\n : design;\n applyCompositeDesign(card, cardDesign);\n // Accesibilidad: nombre accesible del contenedor (lectores de pantalla).\n if (typeof design.ariaLabel === 'string' && design.ariaLabel.trim()) {\n card.setAttribute('role', 'dialog');\n card.setAttribute('aria-label', design.ariaLabel.trim());\n }\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 // Paso SIN bloques (recién creado en el editor): tarjeta blanca con tamaño\n // mínimo para que exista y se pueda clickear; en preview lleva una pista.\n if (blocks.length === 0) {\n card.classList.add('veo-card--empty');\n if (context.isPreview) {\n // Zona punteada azul (mock Figma): «+ Clic para agregar contenido».\n const zone = doc.createElement('div');\n zone.className = 'veo-card-empty-zone';\n const plus = doc.createElement('b');\n plus.textContent = '+';\n const text = doc.createElement('span');\n text.textContent = 'Clic para agregar contenido';\n zone.append(plus, text);\n card.appendChild(zone);\n // Tarjeta angosta → solo el «+». Se mide con ResizeObserver (el ancho\n // puede cambiar por el drag de redimensionar del editor).\n const applyNarrow = (): void => {\n card.classList.toggle('veo-card--narrow', card.clientWidth < NARROW_CARD_WIDTH);\n };\n if (typeof ResizeObserver !== 'undefined') {\n const ro = new ResizeObserver(applyNarrow);\n ro.observe(card);\n this.registerCleanup(() => ro.disconnect());\n }\n applyNarrow();\n }\n }\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 // Relleno y margen propios del ✕ (panel «Botón de cerrar» del editor).\n for (const side of ['Top', 'Right', 'Bottom', 'Left'] as const) {\n const p = design[`closePadding${side}`];\n if (typeof p === 'number')\n closeBtn.style.setProperty(`padding-${side.toLowerCase()}`, `${p}px`);\n const m = design[`closeMargin${side}`];\n if (typeof m === 'number')\n closeBtn.style.setProperty(`margin-${side.toLowerCase()}`, `${m}px`);\n }\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 reserveCloseSpace(card, blocks, closePos, cardDesign);\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 // Con el tema ya fundido: la flecha del tooltip toma su fondo y borde.\n cardDesign,\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 // Con backdrop la app de atrás queda congelada (sin scroll).\n this.registerCleanup(lockScroll(doc));\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, cardDesign);\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 // Con backdrop la app de atrás queda congelada (sin scroll).\n this.registerCleanup(lockScroll(doc));\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 // Editor: cada nodo lleva el id local de su bloque para poder seleccionarlo.\n const tag = (node: HTMLElement, block: StepBlock, index: number): HTMLElement => {\n node.dataset.veoBlock = String(index);\n if (block.editorId) node.dataset.veoBlockId = block.editorId;\n return node;\n };\n // Preview del editor: un bloque que no produce nodo (imagen sin URL, code\n // host…) igual necesita algo clickeable para poder editarlo.\n const placeholder = (block: StepBlock, label: string): HTMLElement | null => {\n if (!context.isPreview || !block.editorId) return null;\n const el = doc.createElement('div');\n el.className = 'veo-block-placeholder';\n el.textContent = label;\n return el;\n };\n // Secuencia de bloques (una celda) → nodos en `container`. Los botones\n // consecutivos se agrupan en una fila de acciones.\n const buildSequence = (container: HTMLElement, cell: IndexedBlock[]): void => {\n let i = 0;\n while (i < cell.length) {\n const { block: b, index } = cell[i] as IndexedBlock;\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\n // botón dentro. La toma del PRIMER botón del grupo.\n let rowAlign: string | undefined;\n const firstPreset = (b.style as Record<string, unknown> | null | undefined)?.preset;\n while (i < cell.length && cell[i]?.block.type === 'button') {\n const { block: bb, index: bi } = cell[i] as IndexedBlock;\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(tag(this.buildButton(bb, doc, context, idx, readers, emit), bb, bi));\n i++;\n }\n if (rowAlign) row.style.justifyContent = ROW_ALIGN[rowAlign] ?? 'flex-end';\n else {\n // Sin alineación a mano: la del tema para el preset del primer botón.\n const themed = this.themeRowJustify?.(firstPreset);\n if (themed) row.style.justifyContent = themed;\n }\n container.appendChild(row);\n continue;\n }\n if (b.type === 'code') {\n const { node, cleanup } = mountCodeBlock(b, doc, context, host);\n const el = node ?? placeholder(b, 'Bloque de código');\n if (el) container.appendChild(tag(el, b, index));\n this.registerCleanup(cleanup);\n i++;\n continue;\n }\n if (b.type === 'form') {\n container.appendChild(tag(this.buildForm(b, doc, context, idx, readers, emit), b, index));\n i++;\n continue;\n }\n if (b.type === 'checklist') {\n const el = buildChecklistBlock(b, doc, context);\n applyBlockStyle(el, b.style as Record<string, unknown> | null | undefined, 'text');\n // La lista ocupa todo el ancho de la tarjeta (la alineación del texto no la encoge).\n el.style.alignSelf = 'stretch';\n el.style.width = '100%';\n container.appendChild(tag(el, b, index));\n i++;\n continue;\n }\n const node =\n buildContentBlock(b, doc, { editing: context.isPreview === true }) ??\n placeholder(\n b,\n b.type === 'image'\n ? 'Imagen (sin URL)'\n : b.type === 'video'\n ? 'Video (elige proveedor y pega la URL)'\n : 'Bloque vacío',\n );\n if (node) container.appendChild(tag(node, b, index));\n i++;\n }\n };\n\n // Layout: filas de una columna SIN estilo propio van directo en la card\n // (DOM idéntico al de siempre); filas con varias columnas o con estilo de\n // fila (editor de fila) se envuelven en .veo-row > .veo-col.\n const rowStyles = (context.guide.guideSteps[idx] as unknown as CompositeStep | undefined)?.rows;\n for (const row of groupLayout(blocks)) {\n const rowStyle = Number.isInteger(row.row) ? rowStyles?.[String(row.row)] : undefined;\n if (row.columns.length === 1 && !rowStyle) {\n buildSequence(card, (row.columns[0] as LayoutColumn).blocks);\n continue;\n }\n const rowEl = doc.createElement('div');\n rowEl.className = 'veo-row';\n if (Number.isInteger(row.row)) rowEl.dataset.veoRow = String(row.row);\n for (const column of row.columns) {\n const colEl = doc.createElement('div');\n colEl.className = 'veo-col';\n buildSequence(colEl, column.blocks);\n rowEl.appendChild(colEl);\n }\n if (rowStyle) applyRowStyle(rowEl, rowStyle);\n card.appendChild(rowEl);\n }\n }\n\n /** Botón con enrutado de acción (navegación / cierre / url / guía / envío de forms). */\n /**\n * Bloque `form` (encuesta): pregunta (rich text del bloque) + campos + botón\n * de envío propio (`submit`). Con pregunta, el label del campo se omite (sería\n * la misma pregunta dos veces) y pasa a `aria-label` del input. El estilo del\n * bloque viste la pregunta (preset/alineación/color); los márgenes van al\n * contenedor del bloque entero.\n */\n private buildForm(\n b: StepBlock,\n doc: Document,\n context: GuideRenderContext,\n idx: number,\n readers: FormReader[],\n emit: (block: StepBlock) => void,\n ): HTMLElement {\n const form = doc.createElement('div');\n form.className = 'veo-form';\n const style = (b.style ?? {}) as Record<string, unknown>;\n const { marginTop, marginBottom, ...questionStyle } = style;\n for (const [side, v] of [\n ['marginTop', marginTop],\n ['marginBottom', marginBottom],\n ] as const) {\n if (typeof v === 'number' && Number.isFinite(v)) form.style[side] = `${v}px`;\n }\n let question: HTMLElement | null = null;\n if ((typeof b.html === 'string' && b.html) || (typeof b.text === 'string' && b.text)) {\n question = doc.createElement('div');\n question.className = 'veo-form-question';\n if (typeof b.html === 'string' && b.html) question.appendChild(renderRichText(b.html, doc));\n else question.textContent = b.text as string;\n applyBlockStyle(question, questionStyle, 'text');\n form.appendChild(question);\n }\n const questionText = question?.textContent?.trim() ?? '';\n // Lectores de ESTE bloque (los recoge su botón de envío) y del paso (los\n // recogen los botones submit-forms sueltos, como siempre).\n const own: FormReader[] = [];\n for (const field of b.fields ?? []) {\n const { wrapper, read } = buildField(field, doc);\n // Estilo de la escala (pestaña Escala › Estilo): color de selección y tamaño.\n const st = (b.style ?? {}) as Record<string, unknown>;\n if (typeof st.scaleColor === 'string' && st.scaleColor) {\n wrapper.style.setProperty('--veo-scale-color', st.scaleColor);\n }\n if (typeof st.scaleSize === 'number' && st.scaleSize >= 24 && st.scaleSize <= 96) {\n wrapper.style.setProperty('--veo-scale-size', `${st.scaleSize}px`);\n }\n if (question) {\n wrapper.querySelector('.veo-form-label')?.remove();\n if (questionText) {\n for (const inp of wrapper.querySelectorAll('input, textarea, select')) {\n inp.setAttribute('aria-label', questionText);\n }\n }\n }\n const reader: FormReader = { field, read, blockId: b.id ?? null };\n readers.push(reader);\n own.push(reader);\n form.appendChild(wrapper);\n }\n if (b.submit) {\n const actions = doc.createElement('div');\n actions.className = 'veo-guide-actions';\n const submit: StepBlock = { ...b.submit, type: 'button' };\n const sa = (submit.style as Record<string, unknown> | null | undefined)?.align;\n if (sa === 'left' || sa === 'center' || sa === 'right') {\n actions.style.justifyContent = ROW_ALIGN[sa] ?? 'flex-end';\n }\n actions.appendChild(this.buildButton(submit, doc, context, idx, readers, emit, own));\n form.appendChild(actions);\n }\n return form;\n }\n\n private buildButton(\n block: StepBlock,\n doc: Document,\n context: GuideRenderContext,\n idx: number,\n readers: FormReader[],\n emit: (block: StepBlock) => void,\n /** Botón de envío de una encuesta: envía ESTOS lectores antes de su acción. */\n submitFirst?: FormReader[],\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 // «Estilo del botón» (editor): primario (default), secundario (contorno),\n // enlace (solo texto). `custom` = estilos a mano de applyBlockStyle.\n const st = (block.style ?? {}) as Record<string, unknown>;\n if (st.preset === 'secondary' || st.preset === 'link') {\n btn.classList.add(`veo-guide-cta--${st.preset}`);\n }\n // Accesibilidad: nombre accesible distinto del texto visible.\n if (typeof st.ariaLabel === 'string' && st.ariaLabel.trim()) {\n btn.setAttribute('aria-label', st.ariaLabel.trim());\n }\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 // Acciones simples (sin envío de formularios). La principal es el bloque;\n // `secondAction` (máximo dos) se ejecuta justo después con el mismo código.\n const runSimple = (spec: ButtonActionSpec): void => {\n switch (spec.action) {\n case 'next':\n if (nav) nav.onNext();\n else context.onClose();\n break;\n case 'prev':\n nav?.onBack();\n break;\n case 'goto':\n if (nav?.onGoto && typeof spec.targetStep === 'number') nav.onGoto(spec.targetStep);\n else context.onClose();\n break;\n case 'snooze':\n // Posponer: se cierra sin marcar «descartada» (debe volver al vencer).\n snoozeGuide(\n context.guide.guideId,\n typeof spec.snoozeEvery === 'number' ? spec.snoozeEvery : 1,\n spec.snoozeUnit ?? 'day',\n );\n context.onClose();\n break;\n case 'url':\n if (typeof spec.url === 'string' && isSafeUrl(spec.url)) {\n // «Abrir en pestaña nueva» (default). Con newTab:false navega la misma.\n if (spec.newTab === false) window.location.assign(spec.url);\n else window.open(spec.url, '_blank', 'noopener,noreferrer');\n }\n break;\n case 'guide':\n if (spec.targetGuideId) context.onOpenGuide?.(spec.targetGuideId);\n this.closeOrSkip(context);\n break;\n default:\n this.closeOrSkip(context);\n }\n };\n const runSecond = (): void => {\n if (block.secondAction?.action) runSimple(block.secondAction);\n };\n const runActions = (): void => {\n switch (block.action) {\n case 'next':\n case 'prev':\n case 'goto':\n case 'snooze':\n case 'url':\n case 'guide':\n emit(block);\n runSimple(block);\n runSecond();\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 runSecond();\n }\n };\n btn.addEventListener('click', () => {\n if (submitFirst) this.submitForms(submitFirst, context, idx, btn, runActions);\n else runActions();\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 // Nada que enviar (campos opcionales vacíos): no se guarda respuesta, pero\n // el botón igual hace lo suyo (cerrar/avanzar) — un botón muerto confunde.\n if (Object.keys(answers).length === 0) {\n onDone();\n return;\n }\n btn.disabled = true;\n const submitFn = context.onFormSubmit ?? (() => Promise.resolve(true));\n // Encuesta de origen: si todas las respuestas salen del mismo bloque.\n const blockIds = new Set(\n readers.filter((r) => answers[r.field.key] !== undefined).map((r) => r.blockId ?? ''),\n );\n const pollId = blockIds.size === 1 ? [...blockIds][0] || undefined : undefined;\n void submitFn(answers, { ...(pollId ? { pollId } : {}), stepIndex: idx }).then((ok) => {\n btn.disabled = false;\n if (!ok) return;\n // «Completada» solo si esta encuesta cierra la guía (último paso o guía\n // de un paso); en un paso intermedio el envío solo avanza.\n const lastStep = !context.nav || idx >= context.nav.totalSteps - 1;\n if (lastStep) {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: idx,\n action: 'completed',\n });\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): configurado (`marker`) o compuesto con bloques (legado).\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 const marker = step.badge?.marker ?? null;\n if (marker) badge.appendChild(buildMarkerElement(doc, marker));\n else 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 if (marker) {\n // Marcador configurado: SOBRE/junto al ancla (esquina, lado o centro), sin\n // alterar el layout de la app. `attachMarker` lo anida en el ancla cuando\n // puede (viaja con ella sin temblar) o lo flota sobre <body> si no.\n host.style.display = 'inline-block';\n this.registerCleanup(attachMarker(anchor, host, marker));\n } else {\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\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 // Preview del editor («Mostrar vista previa del paso»): tooltip abierto.\n if (context.badgeOpen) openTip();\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 BASE = 16;\n // Margen del contenedor en un paso FLOTANTE = separación respecto al borde\n // de la pantalla (en los ejes pegados al borde) o desplazamiento desde el\n // centro (en los ejes centrados). Un margin CSS sobre un elemento fixed\n // centrado con translate lo corría de forma poco intuitiva, así que se\n // neutraliza y se traduce a offsets.\n const m = (k: string): number =>\n typeof design[k] === 'number' && Number.isFinite(design[k]) ? (design[k] as number) : 0;\n s.margin = '0';\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 = `${BASE + m('marginTop')}px`;\n else if (v === 'bottom') s.bottom = `${BASE + m('marginBottom')}px`;\n else s.top = '50%';\n\n if (h === 'left') s.left = `${BASE + m('marginLeft')}px`;\n else if (h === 'right') s.right = `${BASE + m('marginRight')}px`;\n else s.left = '50%';\n\n // Transform para centrar el/los ejes que quedaron en 50% (+ desplazamiento\n // por margen en esos ejes: arriba/izquierda positivo empuja abajo/derecha).\n const dx = m('marginLeft') - m('marginRight');\n const dy = m('marginTop') - m('marginBottom');\n const tx = h === 'middle' ? `calc(-50% + ${dx}px)` : '0';\n const ty = v === 'middle' ? `calc(-50% + ${dy}px)` : '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 */\n/** Alto del ✕ (24px) + su inset (10px) + aire hasta el contenido. */\nconst CLOSE_RESERVE_PX = 42;\n/** Relleno por defecto de la tarjeta en el CSS base (styles.ts). */\nconst CARD_DEFAULT_PAD_PX = 20;\n\n/**\n * El ✕ es absoluto: los bloques que ocupan todo el ancho (filas, listas de\n * tareas, formularios, títulos largos) quedaban debajo de él. Se reserva su\n * franja: el relleno de la tarjeta del lado del ✕ (arriba o abajo) sube al\n * menos hasta cubrirlo. No aplica si el primer bloque es una imagen (ahí el ✕\n * es una pastilla flotante sobre la foto) ni en tarjetas vacías.\n */\nfunction reserveCloseSpace(\n card: HTMLElement,\n blocks: StepBlock[],\n position: string,\n design: Record<string, unknown>,\n): void {\n if (blocks.length === 0) return;\n const side = position.includes('bottom') ? 'Bottom' : 'Top';\n const edgeBlock = side === 'Top' ? blocks[0] : blocks[blocks.length - 1];\n if (edgeBlock?.type === 'image') return;\n const margin = design[`closeMargin${side}`];\n const need = CLOSE_RESERVE_PX + (typeof margin === 'number' ? margin : 0);\n const current = design[`padding${side}`];\n const have = typeof current === 'number' ? current : CARD_DEFAULT_PAD_PX;\n if (have < need) card.style.setProperty(`padding-${side.toLowerCase()}`, `${need}px`);\n}\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 // `positionArrow` deja el borde solo en la punta (según el lado resuelto).\n caret.dataset.veoBorder = String(design.borderWidth);\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. */\n/** Ancho mínimo del contenedor (el editor tampoco permite menos). */\nexport const MIN_CARD_WIDTH = 120;\n/** Por debajo, la zona «agregar contenido» muestra solo el «+». */\nconst NARROW_CARD_WIDTH = 260;\n\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 // Modo de color del contenedor: «oscuro» aplica una paleta base que el\n // fondo/color explícitos del diseño pueden pisar.\n if (design.colorMode === 'dark') {\n s.background = '#1f1d1b';\n s.color = '#f5f0eb';\n card.classList.add('veo-card--dark');\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. Piso de MIN_CARD_WIDTH: un\n // ancho absurdo (10px) no debe romper la guía ni sacar el contenido.\n const width =\n typeof design.width === 'number' && Number.isFinite(design.width)\n ? `${Math.max(MIN_CARD_WIDTH, design.width)}px`\n : null;\n if (design.fullWidth === true) {\n s.width = '100%';\n } else if (design.widthType === 'fluid') {\n // Fluido = ocupa el ancho disponible (viewport si es flotante, contenedor\n // si es embebida) hasta el máximo configurado. Con `auto` una tarjeta\n // vacía o con poco contenido se encogía y el ancho parecía ignorado.\n s.width = '100%';\n if (width) s.maxWidth = width;\n } else if (width) {\n s.width = width;\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 { lockScroll } from '../scroll-lock';\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 // Con backdrop la app de atrás queda congelada (sin scroll).\n this.registerCleanup(lockScroll(doc));\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 { lockScroll } from '../scroll-lock';\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 /** Suelta el bloqueo de scroll del backdrop (null = sin backdrop). */\n private releaseScroll: (() => void) | null = null;\n\n /** Con backdrop la app de atrás queda congelada; sin él, scrollea normal. */\n private syncScrollLock(step: GuideStep): void {\n const wantLock = step.style?.backdrop !== false;\n if (wantLock && !this.releaseScroll) {\n this.releaseScroll = lockScroll(this.host?.ownerDocument ?? document);\n } else if (!wantLock && this.releaseScroll) {\n this.releaseScroll();\n this.releaseScroll = null;\n }\n }\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 this.syncScrollLock(step);\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 this.syncScrollLock(step);\n }\n\n override destroy(): void {\n this.overlay = null;\n this.releaseScroll?.();\n this.releaseScroll = 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 { isAutomaticActivation } from './activation-rules';\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 FormSubmitMeta,\n GuideInteractionEvent,\n GuideProgressItem,\n GuideStep,\n GuideTheme,\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 /** Tema del workspace (design system) ya resuelto; lo manda el editor del dashboard. */\n theme?: GuideTheme | null;\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>, meta?: FormSubmitMeta) => Promise<boolean>;\n /**\n * Lista de tareas en preview: progreso de las guías de la lista (el editor\n * lo pide al backend con un usuario de preview: nombres y pasos reales,\n * progreso en cero). Sin esto la lista se ve sin subtítulos ni barra.\n */\n fetchProgress?: (guideIds: string[]) => Promise<GuideProgressItem[]>;\n /** Nota bajo el \"¡Gracias!\" cuando hay `formSubmit` propio. */\n formSubmitNote?: string;\n /** Modo badge: montar con el tooltip ABIERTO (toggle del editor). */\n /**\n * Badge: tooltip abierto (true) o cerrado (false). Sin definir, se abre si la\n * activación es automática (igual que el runtime).\n */\n badgeOpen?: boolean;\n /**\n * Se llama cuando el USUARIO cierra la preview (✕ / descartar), no cuando el\n * editor la reemplaza por otra. El modo builder lo usa para re-armar el\n * disparador por elemento objetivo.\n */\n onClosed?: () => void;\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 // Abrir/cerrar el tooltip del badge requiere remontar.\n (input.badgeOpen === true) === (this.input.badgeOpen === true) &&\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(byUser = false): void {\n const onClosed = byUser ? this.input?.onClosed : undefined;\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 onClosed?.();\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(true),\n // Sin indicación explícita, el badge se abre solo si la guía arranca\n // sola (como en el runtime); `manual` lo deja cerrado.\n badgeOpen: this.input?.badgeOpen ?? isAutomaticActivation(this.input?.activationRules),\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 ...(this.input?.fetchProgress ? { fetchProgress: this.input.fetchProgress } : {}),\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(true),\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 ...(input.theme ? { theme: input.theme } : {}),\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 { PageUrlRule, 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 * El runtime manda `window.location.href` (URL completa) y el editor expresa\n * las reglas como PATHS (`/envios`) o URLs con protocolo. Se prueban TODOS los\n * candidatos: la URL completa, el path derivado (`pathname+search+hash`) y, en\n * apps con hash routing (`/#/envios`), la ruta del hash (`/envios`).\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 urlCandidates(pageUrl: string): string[] {\n const out = [pageUrl];\n try {\n const u = new URL(pageUrl);\n out.push(`${u.pathname}${u.search}${u.hash}`);\n if (u.hash.startsWith('#/')) out.push(u.hash.slice(1));\n } catch {\n // no es una URL absoluta: se compara tal cual\n }\n return out;\n}\n\nexport function matchesUrl(matcher: UrlMatcher, pageUrl: string): boolean {\n const candidates = urlCandidates(pageUrl);\n switch (matcher.type) {\n case 'exact':\n return candidates.some((c) => c === matcher.pattern);\n case 'prefix':\n return candidates.some((c) => c.startsWith(matcher.pattern));\n case 'regex':\n try {\n const re = new RegExp(matcher.pattern);\n return candidates.some((c) => re.test(c));\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') return true;\n // Páginas del módulo Páginas: reglas en OR (las expande el backend). Sin\n // reglas (página borrada / no expandida) el paso NO se muestra.\n if (loc.scope === 'pages') {\n const rules = loc.rules ?? [];\n return rules.some((r) => pageRuleMatches(r, pageUrl));\n }\n if (!loc.pattern) return true;\n return matchesUrl({ type: loc.matchType ?? 'prefix', pattern: loc.pattern }, pageUrl);\n}\n\n/**\n * Regla de una página etiquetada (portado de `pages.repository.ruleMatches`):\n * case-insensitive, contra la URL completa y el path. `contains` no existe en\n * el matcher de guías, por eso no reusa `matchesUrl`.\n */\nexport function pageRuleMatches(rule: PageUrlRule, pageUrl: string): boolean {\n const pattern = rule.pattern.toLowerCase();\n const candidates = urlCandidates(pageUrl).map((c) => c.toLowerCase());\n switch (rule.type) {\n case 'exact':\n return candidates.some((c) => c === pattern);\n case 'prefix':\n return candidates.some((c) => c.startsWith(pattern));\n case 'contains':\n return candidates.some((c) => c.includes(pattern));\n case 'regex':\n try {\n const re = new RegExp(rule.pattern, 'i');\n return candidates.some((c) => re.test(c));\n } catch {\n return false;\n }\n default:\n return false;\n }\n}\n","/**\n * Contrato de mensajes del puente builder (app del cliente ↔ dashboard).\n * Ambos lados validan `event.origin` y que `token` coincida antes de actuar.\n *\n * Flujo:\n * 1. El dashboard abre la app con `?veoBuilder=<token>&veoBuilderOrigin=<origen>`.\n * 2. La app (veo-builder.js) postea `ready` a la ventana que la abrió.\n * 3. El dashboard manda comandos (`start-picker`, `preview`, …).\n * 4. La app responde con eventos (`picked`, `pick-cancelled`, …).\n */\nimport type { PreviewGuideInput } from '../guides/guide-preview';\nimport type { BlockDropPayload } from './block-drop-target';\nimport type { DesignPatch } from './design-manipulator';\nimport type { PickedElement } from './element-picker';\n\nexport const VEO_BUILDER_SOURCE = 'veo-builder';\n// Los nombres de los query params viven en el core (`builder-token.ts`), única\n// fuente de verdad compartida con el loader y el gate del runtime de guías.\nexport { BUILDER_ORIGIN_PARAM, BUILDER_TOKEN_PARAM } from '../../core/builder-token';\n\n/**\n * Estado que el panel (editor) publica para que el SDK pinte el \"chrome\" del\n * editor (topbar + fila de pasos) ENCIMA de la app. El panel es la única fuente\n * de verdad; el chrome solo lo refleja y devuelve `chrome-action`s.\n */\nexport interface EditorChromeState {\n /**\n * `tagging` = «Modo tagging» (panel de features): solo la topbar, con ese\n * título y sin fila de pasos, vista previa ni Guardar (cada tag se guarda al\n * crearse). Default `guide` = editor de guías.\n */\n variant?: 'guide' | 'tagging';\n /** Título del header de la tarjeta; si falta, el SDK lo deriva de la sección. */\n panelTitle?: string;\n guideName: string;\n /** ISO de creación (null = guía nueva sin guardar). */\n createdAt: string | null;\n steps: Array<{ id: string; label: string; presentation: 'floating' | 'inline' }>;\n activeStep: number;\n /**\n * Qué muestra el panel. `step`, `block`, `add-block`, `row` y `structure`\n * son vistas del paso activo (la fila de pasos lo marca); las pestañas del\n * contenedor se «encienden» solo con `step` (contenedor) y `structure`.\n */\n section: 'activation' | 'step' | 'badge' | 'target' | 'block' | 'add-block' | 'row' | 'structure';\n /** Editando un bloque del paso: su nombre («Encuesta Texto abierto») para el título del panel. */\n blockLabel?: string | null;\n saving: boolean;\n dirty: boolean;\n /**\n * Estado de publicación de la guía, para que el autor vea en la barra si lo\n * que edita está Activa/Borrador/etc. (sin esto, guardar una guía en borrador\n * y no verla en la app era un misterio). `tone` elige el color del chip.\n */\n status?: { label: string; tone: 'live' | 'testing' | 'review' | 'draft' | 'paused' } | null;\n}\n\n/**\n * Qué está haciendo la preview en la app. El SDK lo publica cada vez que\n * evalúa un comando `preview` con `honorTrigger`, para que el panel explique\n * por qué la guía no se ve (retraso, elemento objetivo, otra página, otro\n * dispositivo) en vez de parecer rota.\n */\nexport type PreviewStatus =\n | { state: 'shown' }\n | { state: 'waiting-delay'; delayMs: number }\n | { state: 'waiting-trigger'; trigger: 'on_click' | 'on_hover'; selector: string }\n | { state: 'page-mismatch'; pattern: string }\n | { state: 'device-mismatch'; devices: 'desktop' | 'mobile' };\n\n/** Acciones que el usuario dispara en el chrome (barras) y el panel ejecuta. */\n/** Bloque de la preview: paso + id local del panel (`StepBlock.editorId`). */\nexport interface BlockRef {\n stepIndex: number;\n blockId: string;\n}\nexport type BlockToolbarAction =\n | 'edit'\n | 'duplicate'\n | 'remove'\n /** Mover: arriba/abajo dentro de su columna, izquierda/derecha entre columnas de su fila. */\n | 'move-up'\n | 'move-down'\n | 'move-left'\n | 'move-right';\n/** Barra de la FILA (hover o fila del bloque seleccionado): editar / duplicar / eliminar. */\nexport type RowToolbarAction = 'edit' | 'duplicate' | 'remove';\n/** Pestañas sobre el CONTENEDOR (hover): editar el paso o abrir la estructura de filas. */\nexport type CardToolbarAction = 'edit-container' | 'edit-rows';\nexport type BlockLayoutAction =\n | 'row-before'\n | 'row-after'\n | 'col-before'\n | 'col-after'\n /** Bloque apilado en la MISMA celda (fila+columna), antes/después del bloque. */\n | 'stack-before'\n | 'stack-after';\n\nexport type ChromeAction =\n | { action: 'select-activation' }\n | { action: 'select-step'; index: number }\n | { action: 'add-step' }\n /** Hover sobre la tarjeta de un paso: duplicar (se inserta después) o eliminar. */\n | { action: 'duplicate-step'; index: number }\n | { action: 'remove-step'; index: number }\n | { action: 'save'; exit: boolean }\n | { action: 'exit' }\n // Las tres siguientes las resuelve el SDK solo (no llegan al panel):\n // barra arriba/abajo, volver a mostrar la tarjeta y modo vista previa.\n | { action: 'dock'; position: 'top' | 'bottom' }\n | { action: 'show-panel' }\n | { action: 'preview' }\n | { action: 'exit-preview' };\n\n/** Eventos que la app del cliente envía al dashboard. */\nexport type BuilderEvent =\n // `chrome: true` → el SDK pinta el chrome del editor (barras); el panel debe\n // ocultar su propia cabecera/pasos/guardado y publicar `editor-state`.\n | { type: 'ready'; chrome?: boolean }\n | { type: 'chrome-action'; payload: ChromeAction }\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 /** Clic simple (sin arrastre) sobre la tarjeta de la preview: el panel abre «Agregar bloque». */\n | { type: 'card-clicked'; payload: { stepIndex: number } }\n /** Clic sobre un bloque de la preview: se selecciona en la app y el panel abre su editor. */\n | { type: 'block-clicked'; payload: BlockRef }\n /** Barra del bloque seleccionado: editar / duplicar / eliminar. */\n | { type: 'block-action'; payload: BlockRef & { action: BlockToolbarAction } }\n /** «+» en los bordes del bloque seleccionado: agregar fila arriba/abajo o columna izq/der. */\n | { type: 'block-layout'; payload: BlockRef & { action: BlockLayoutAction } }\n /** Barra de una fila: `blockId` = primer bloque de la fila (la fila no tiene id propio). */\n | { type: 'row-action'; payload: BlockRef & { action: RowToolbarAction } }\n /** Pestañas del contenedor (hover sobre la tarjeta): editar contenedor / editar filas. */\n | { type: 'card-action'; payload: { stepIndex: number; action: CardToolbarAction } }\n // Estado de la preview (ver `PreviewStatus`).\n | { type: 'preview-status'; payload: PreviewStatus }\n /** Respuesta a `scan-page`: elementos clickeables de la página y qué selectores dados existen en ella. */\n | { type: 'page-scan'; payload: PageScan }\n /** El autor cerró el modal de `show-confirmation`. */\n | { type: 'confirmation-closed' }\n | { type: 'closed' };\n\n/**\n * Modal de confirmación que el SDK pinta CENTRADO sobre la app del cliente\n * (mock «Feature tagueada»): check verde, título, mensaje, filas\n * label/valor y un botón que lo cierra. Mientras está abierto el panel se\n * oculta; al cerrarlo el SDK postea `confirmation-closed`.\n */\nexport interface ConfirmationCard {\n title: string;\n message: string;\n rows: Array<{ label: string; value: string }>;\n /** Texto del botón. Default «Listo». */\n buttonLabel?: string;\n}\n\n/** Un elemento clickeable de la página (candidato a feature), sin `rect`. */\nexport type PageElement = Omit<PickedElement, 'rect'>;\n\nexport interface PageScan {\n /** `location.pathname`: el mismo valor que `$page_path` de autocapture (restricción «Solo en esta página»). */\n pagePath: string;\n /**\n * Ruta «humana» de la app: en apps con hash routing (`/#/settings`) incluye\n * el hash; si no, es igual a `pagePath`. Para mostrar y para la foto del\n * elemento, NO para contar (autocapture no lleva el hash).\n */\n routePath: string;\n /** Elementos clickeables visibles que NO matchean ninguno de los `selectors` pedidos. */\n candidates: PageElement[];\n /** De los `selectors` pedidos, cuáles existen en esta página. */\n present: string[];\n}\n\n/** Comandos que el dashboard/panel envía a la app del cliente. */\nexport type BuilderCommand =\n /** `only: 'interactive'` (features): solo botones/enlaces/campos/formularios… (ver `ElementPickerOptions.only`). */\n | { type: 'start-picker'; maxAncestors?: number; hint?: string; only?: 'interactive' }\n | { type: 'stop-picker' }\n /** Panel de features: inventario de la página actual (ver `PageScan`). */\n | { type: 'scan-page'; selectors: string[] }\n /** Resalta (o deja de resaltar) un elemento por selector, sin entrar en modo picker. */\n | { type: 'highlight'; selector: string | null }\n /** Modal de confirmación centrado sobre la app (ver `ConfirmationCard`). */\n | { type: 'show-confirmation'; payload: ConfirmationCard }\n // `editable: true` (editor in-app) adjunta drag/resize sobre la preview.\n // `honorTrigger: true`: si la guía se dispara por elemento objetivo\n // (activationRules on_click/on_hover + selector), la preview ESPERA a esa\n // interacción en la app en vez de pintarse de una.\n // `honorTrigger` también respeta «retrasar la aparición» (delayMs) y el\n // filtro de dispositivo, publicando `preview-status` con lo que está pasando.\n | { type: 'preview'; guide: PreviewGuideInput; editable?: boolean; honorTrigger?: 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 /** El panel selecciona (o deselecciona con null) un bloque en la app. */\n | { type: 'select-block'; blockId: string | null }\n /** El panel edita una fila: se marca en la app (por el id de un bloque de esa fila). */\n | { type: 'select-row'; blockId: string | null }\n | { type: 'teardown' }\n // Chrome del editor: el panel publica su estado (nombre, pasos, sección…).\n | { type: 'editor-state'; state: EditorChromeState }\n // El panel pide ocultarse/mostrarse (botón «Cerrar» del contenido).\n | { type: 'panel-visibility'; visible: boolean }\n /** Tamaño compacto del panel (alto = contenido); `null` restaura el tamaño previo. */\n | { type: 'panel-size'; size: { width: number; height: number } | null }\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 * \"Chrome\" del editor in-app (mock Figma 2026-09): dos barras FIJAS arriba de la\n * app del cliente, dibujadas por el SDK (sin iframe):\n *\n * 1. Topbar oscura: logo · «Nombre · fecha» · app · [barra arriba/abajo]\n * [mostrar editor] [vista previa] · Salir · Guardar ▾ (Guardar y salir).\n * Vista previa: se esconden barras y tarjeta y queda una píldora\n * «Estás en vista previa | Salir» para volver al editor.\n * 2. Fila de pasos: tarjeta «Activación» + una tarjeta por paso + «Agregar\n * paso», con la píldora «Ocultar/Mostrar pasos» colgando al centro. Al\n * pasar el mouse por un paso aparece una capa oscura con «Editar»,\n * duplicar y eliminar (se pueden eliminar todos los pasos).\n *\n * La app se EMPUJA (`margin-top`/`margin-bottom` en <html>, según dónde esté\n * la barra) para que las barras no tapen nada. El chrome NO tiene estado propio: refleja el `EditorChromeState`\n * que publica el panel y devuelve `ChromeAction`s; el panel decide.\n */\nimport { hasDocument, hasWindow } from '../../utils/safe-env';\nimport type { ChromeAction, EditorChromeState } from './bridge-protocol';\n\nexport const CHROME_TOPBAR_H = 64;\nexport const CHROME_STEPS_H = 128;\n\nexport interface BuilderChromeOptions {\n /** Nombre de la app (origen) que se muestra junto al nombre de la guía. */\n appLabel: string;\n onAction: (action: ChromeAction) => void;\n}\n\nexport type ChromeDock = 'top' | 'bottom';\n\nexport interface BuilderChromeHandle {\n /** Refresca las barras con el estado publicado por el panel. */\n setState(state: EditorChromeState): void;\n /** Alto total ocupado hoy (topbar + pasos si están visibles). */\n height(): number;\n /** Dónde está anclada la barra. */\n dock(): ChromeDock;\n /** Modo vista previa: oculta las barras y muestra la píldora para salir. */\n setPreview(on: boolean): void;\n /** Oculta las barras SIN píldora (mientras dura el picker de elementos). */\n setHidden(on: boolean): void;\n /** Se llama cuando cambia el alto (colapsar/expandir pasos). */\n onHeightChange(cb: (h: number) => void): void;\n teardown(): void;\n}\n\nconst ICONS = {\n bolt: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m3.75 13.5 10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75Z\"/>',\n desktop:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 17.25v1.007a3 3 0 0 1-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0 1 15 18.257V17.25m6-12V15a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 15V5.25m18 0A2.25 2.25 0 0 0 18.75 3H5.25A2.25 2.25 0 0 0 3 5.25m18 0V12a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 12V5.25\"/>',\n updown:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3 7.5 7.5 3m0 0L12 7.5M7.5 3v13.5m13.5 0L16.5 21m0 0L12 16.5m4.5 4.5V7.5\"/>',\n map: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 6.75V15m6-6v8.25m.503 3.498 4.875-2.437c.381-.19.622-.58.622-1.006V4.82c0-.836-.88-1.38-1.628-1.006l-3.869 1.934c-.317.159-.69.159-1.006 0L9.503 3.252a1.125 1.125 0 0 0-1.006 0L3.622 5.689C3.24 5.88 3 6.27 3 6.695V19.18c0 .836.88 1.38 1.628 1.006l3.869-1.934c.317-.159.69-.159 1.006 0l4.994 2.497c.317.158.69.158 1.006 0Z\"/>',\n eye: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M2.036 12.322a1.012 1.012 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178Z\"/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\"/>',\n chevronDown:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m19.5 8.25-7.5 7.5-7.5-7.5\"/>',\n chevronUp:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m4.5 15.75 7.5-7.5 7.5 7.5\"/>',\n plus: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\"/>',\n pencil:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0 1 15.75 21H5.25A2.25 2.25 0 0 1 3 18.75V8.25A2.25 2.25 0 0 1 5.25 6H10\"/>',\n copy: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 0 0-2.25-2.25H6A2.25 2.25 0 0 0 3.75 6v8.25A2.25 2.25 0 0 0 6 16.5h2.25m8.25-8.25H18a2.25 2.25 0 0 1 2.25 2.25V18A2.25 2.25 0 0 1 18 20.25h-7.5A2.25 2.25 0 0 1 8.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 0 0-2.25 2.25v6\"/>',\n trash:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0\"/>',\n cursor:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15.042 21.672 13.684 16.6m0 0-2.51 2.225.569-9.47 5.227 7.917-3.286-.672ZM12 2.25V4.5m5.834.166-1.591 1.591M20.25 10.5H18M7.757 14.743l-1.59 1.59M6 10.5H3.75m4.007-4.243-1.59-1.59\"/>',\n spinner:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182\"/>',\n};\n\nfunction svg(name: keyof typeof ICONS, size = 20): string {\n return (\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" ` +\n `fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" aria-hidden=\"true\">${ICONS[name]}</svg>`\n );\n}\n\n/** «19 ago» (fecha corta, locale es). */\nfunction shortDate(iso: string | null): string {\n if (!iso) return '';\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return '';\n return d.toLocaleDateString('es', { day: 'numeric', month: 'short' }).replace('.', '');\n}\n\nfunction el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className: string,\n html?: string,\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n node.className = className;\n if (html !== undefined) node.innerHTML = html;\n return node;\n}\n\nfunction iconButton(name: keyof typeof ICONS, title: string, className = ''): HTMLButtonElement {\n const b = el('button', `veo-tb-icon ${className}`.trim(), svg(name));\n b.type = 'button';\n b.title = title;\n b.setAttribute('aria-label', title);\n return b;\n}\n\n/** Inyecta el chrome del editor. Devuelve el handle (o uno inerte sin DOM). */\nexport function injectBuilderChrome(opts: BuilderChromeOptions): BuilderChromeHandle {\n if (!hasWindow() || !hasDocument()) {\n return {\n setState: () => {},\n height: () => 0,\n dock: () => 'top',\n setPreview: () => {},\n setHidden: () => {},\n onHeightChange: () => {},\n teardown: () => {},\n };\n }\n\n const host = document.createElement('div');\n host.setAttribute('data-veo-builder-chrome', '');\n host.setAttribute('data-veo-ignore', '');\n const shadow = host.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = CHROME_CSS;\n\n const root = el('div', 'veo-chrome');\n\n // ── Topbar ──\n const topbar = el('div', 'veo-tb');\n const brand = el('div', 'veo-tb-brand', svg('bolt', 18));\n const nameEl = el('div', 'veo-tb-name');\n const statusEl = el('span', 'veo-tb-status');\n statusEl.hidden = true;\n const sep = el('span', 'veo-tb-sep');\n const appEl = el('div', 'veo-tb-app', `${svg('desktop', 16)}<span></span>`);\n (appEl.querySelector('span') as HTMLElement).textContent = opts.appLabel;\n const left = el('div', 'veo-tb-left');\n left.append(brand, nameEl, statusEl, sep, appEl);\n\n const right = el('div', 'veo-tb-right');\n const dockBtn = iconButton('updown', 'Mover la barra abajo');\n const showPanel = iconButton('map', 'Mostrar el editor');\n const preview = iconButton('eye', 'Vista previa');\n const exit = el('button', 'veo-tb-text', 'Salir');\n exit.type = 'button';\n const saveGroup = el('div', 'veo-tb-save');\n const save = el('button', 'veo-tb-save-main', '<span>Guardar</span>');\n save.type = 'button';\n const saveMore = el('button', 'veo-tb-save-more', svg('chevronDown', 16));\n saveMore.type = 'button';\n saveMore.title = 'Más opciones de guardado';\n saveMore.setAttribute('aria-label', 'Más opciones de guardado');\n const saveMenu = el('div', 'veo-tb-menu');\n const saveExit = el('button', 'veo-tb-menu-item', 'Guardar y salir');\n saveExit.type = 'button';\n saveMenu.append(saveExit);\n saveMenu.hidden = true;\n saveGroup.append(save, saveMore, saveMenu);\n right.append(dockBtn, showPanel, preview, el('span', 'veo-tb-vsep'), exit, saveGroup);\n topbar.append(left, right);\n\n // ── Fila de pasos ──\n const stepsBar = el('div', 'veo-steps');\n const stepsList = el('div', 'veo-steps-list');\n stepsBar.append(stepsList);\n\n const togglePill = el('button', 'veo-steps-toggle');\n togglePill.type = 'button';\n\n root.append(topbar, stepsBar, togglePill);\n\n // Píldora de vista previa (solo visible en ese modo).\n const previewPill = el('div', 'veo-preview-pill');\n const previewLabel = el(\n 'span',\n 'veo-preview-label',\n `${svg('eye', 18)}<span>Estás en vista previa</span>`,\n );\n const previewExit = el('button', 'veo-preview-exit', 'Salir');\n previewExit.type = 'button';\n previewPill.append(previewLabel, previewExit);\n previewPill.hidden = true;\n\n shadow.append(style, root, previewPill);\n document.body.appendChild(host);\n\n // ── Empujar la app (arriba o abajo según el anclaje) ──\n const html = document.documentElement;\n const prevMarginTop = html.style.marginTop;\n const prevMarginBottom = html.style.marginBottom;\n let collapsed = false;\n let dock: ChromeDock = 'top';\n let previewOn = false;\n let hiddenOn = false;\n let heightCb: ((h: number) => void) | null = null;\n let tagging = false;\n const height = (): number => CHROME_TOPBAR_H + (collapsed || tagging ? 0 : CHROME_STEPS_H);\n const applyHeight = (): void => {\n const h = previewOn || hiddenOn ? 0 : height();\n html.style.marginTop = dock === 'top' ? `${h}px` : prevMarginTop;\n html.style.marginBottom = dock === 'bottom' ? `${h}px` : prevMarginBottom;\n root.style.setProperty('--veo-chrome-h', `${height()}px`);\n root.classList.toggle('is-bottom', dock === 'bottom');\n stepsBar.hidden = collapsed || tagging;\n togglePill.hidden = tagging;\n // Modo tagging: sin vista previa ni Guardar (cada tag se guarda al crearse).\n preview.hidden = tagging;\n saveGroup.hidden = tagging;\n showPanel.title = tagging ? 'Mostrar el panel' : 'Mostrar el editor';\n const open = dock === 'top' ? 'chevronUp' : 'chevronDown';\n const closedIcon = dock === 'top' ? 'chevronDown' : 'chevronUp';\n togglePill.innerHTML = `<span>${collapsed ? 'Mostrar pasos' : 'Ocultar pasos'}</span>${svg(\n collapsed ? closedIcon : open,\n 16,\n )}`;\n dockBtn.title = dock === 'top' ? 'Mover la barra abajo' : 'Mover la barra arriba';\n dockBtn.setAttribute('aria-label', dockBtn.title);\n heightCb?.(h);\n };\n const setPreview = (on: boolean): void => {\n previewOn = on;\n root.hidden = on || hiddenOn;\n previewPill.hidden = !on;\n applyHeight();\n };\n const setHidden = (on: boolean): void => {\n hiddenOn = on;\n root.hidden = on || previewOn;\n applyHeight();\n };\n togglePill.addEventListener('click', () => {\n collapsed = !collapsed;\n applyHeight();\n });\n\n // ── Acciones ──\n const act = (a: ChromeAction): void => opts.onAction(a);\n dockBtn.addEventListener('click', () => {\n dock = dock === 'top' ? 'bottom' : 'top';\n applyHeight();\n act({ action: 'dock', position: dock });\n });\n showPanel.addEventListener('click', () => act({ action: 'show-panel' }));\n preview.addEventListener('click', () => act({ action: 'preview' }));\n previewExit.addEventListener('click', () => act({ action: 'exit-preview' }));\n exit.addEventListener('click', () => act({ action: 'exit' }));\n save.addEventListener('click', () => act({ action: 'save', exit: false }));\n saveMore.addEventListener('click', (e) => {\n e.stopPropagation();\n saveMenu.hidden = !saveMenu.hidden;\n });\n saveExit.addEventListener('click', () => {\n saveMenu.hidden = true;\n act({ action: 'save', exit: true });\n });\n const closeMenu = (): void => {\n saveMenu.hidden = true;\n };\n document.addEventListener('click', closeMenu);\n\n // ── Render de estado ──\n let current: EditorChromeState | null = null;\n const render = (): void => {\n const s = current;\n if (!s) return;\n const nextTagging = s.variant === 'tagging';\n if (nextTagging !== tagging) {\n tagging = nextTagging;\n applyHeight();\n }\n const date = shortDate(s.createdAt);\n nameEl.textContent = tagging\n ? s.guideName.trim() || 'Modo tagging'\n : `${s.guideName.trim() || 'Sin nombre'}${date ? ` · ${date}` : ''}`;\n if (s.status) {\n statusEl.hidden = false;\n statusEl.textContent = s.status.label;\n statusEl.dataset.tone = s.status.tone;\n statusEl.title = 'Estado de la guía (se cambia desde la lista de guías)';\n } else {\n statusEl.hidden = true;\n }\n save.innerHTML = s.saving\n ? `${svg('spinner', 16)}<span>Guardando…</span>`\n : '<span>Guardar</span>';\n save.disabled = s.saving;\n saveExit.disabled = s.saving;\n\n stepsList.replaceChildren();\n const activation = stepCard(svg('cursor', 22), 'Activación', s.section === 'activation');\n activation.addEventListener('click', () => act({ action: 'select-activation' }));\n stepsList.append(activation);\n s.steps.forEach((st, i) => {\n const thumb =\n st.presentation === 'inline'\n ? '<div class=\"veo-thumb veo-thumb-inline\"><i></i><i></i><i></i></div>'\n : '<div class=\"veo-thumb\"><i></i><i></i><b></b></div>';\n // «Estructura» es una vista del paso activo: la fila de pasos lo sigue marcando.\n const isStepView =\n s.section === 'step' ||\n s.section === 'block' ||\n s.section === 'add-block' ||\n s.section === 'row' ||\n s.section === 'structure';\n const card = stepCard(thumb, st.label, isStepView && s.activeStep === i, {\n // Se pueden borrar TODOS los pasos (el panel vuelve a Activación).\n canRemove: true,\n onEdit: () => act({ action: 'select-step', index: i }),\n onDuplicate: () => act({ action: 'duplicate-step', index: i }),\n onRemove: () => act({ action: 'remove-step', index: i }),\n });\n stepsList.append(card);\n });\n const add = el('button', 'veo-step-add', `${svg('plus', 18)}<span>Agregar paso</span>`);\n add.type = 'button';\n add.addEventListener('click', () => act({ action: 'add-step' }));\n stepsList.append(add);\n };\n\n applyHeight();\n\n return {\n setState: (state) => {\n current = state;\n render();\n },\n height,\n dock: () => dock,\n setPreview,\n setHidden,\n onHeightChange: (cb) => {\n heightCb = cb;\n },\n teardown: () => {\n document.removeEventListener('click', closeMenu);\n html.style.marginTop = prevMarginTop;\n html.style.marginBottom = prevMarginBottom;\n host.remove();\n },\n };\n}\n\ninterface StepCardActions {\n canRemove: boolean;\n onEdit: () => void;\n onDuplicate: () => void;\n onRemove: () => void;\n}\n\n/**\n * Tarjeta de la fila de pasos. Sin `actions` es un botón simple (Activación).\n * Con `actions` es un paso: al pasar el mouse (o enfocar) aparece la capa\n * oscura con «Editar», duplicar y eliminar. Un clic en cualquier parte de la\n * tarjeta que no sea un botón de la capa también edita.\n */\nfunction stepCard(\n inner: string,\n label: string,\n active: boolean,\n actions?: StepCardActions,\n): HTMLElement {\n const cls = `veo-step${active ? ' is-active' : ''}`;\n if (!actions) {\n const b = el(\n 'button',\n cls,\n `<div class=\"veo-step-box\">${inner}</div><span class=\"veo-step-label\"></span>`,\n );\n b.type = 'button';\n (b.querySelector('.veo-step-label') as HTMLElement).textContent = label;\n b.setAttribute('aria-pressed', active ? 'true' : 'false');\n return b;\n }\n const card = el(\n 'div',\n cls,\n `<div class=\"veo-step-box\">${inner}` +\n '<div class=\"veo-step-hover\">' +\n '<div class=\"veo-step-hover-top\">' +\n `<button type=\"button\" class=\"veo-step-icon veo-step-remove\" title=\"Eliminar paso\" aria-label=\"Eliminar paso\">${svg('trash', 14)}</button>` +\n `<button type=\"button\" class=\"veo-step-icon veo-step-duplicate\" title=\"Duplicar paso\" aria-label=\"Duplicar paso\">${svg('copy', 14)}</button>` +\n '</div>' +\n '<div class=\"veo-step-hover-main\">' +\n `<button type=\"button\" class=\"veo-step-edit\">${svg('pencil', 14)}<span>Editar</span></button>` +\n '</div>' +\n '</div></div><span class=\"veo-step-label\"></span>',\n );\n (card.querySelector('.veo-step-label') as HTMLElement).textContent = label;\n card.setAttribute('aria-current', active ? 'step' : 'false');\n const remove = card.querySelector('.veo-step-remove') as HTMLButtonElement;\n remove.disabled = !actions.canRemove;\n if (!actions.canRemove) remove.title = 'La guía necesita al menos un paso';\n const on = (sel: string, fn: () => void): void => {\n card.querySelector(sel)?.addEventListener('click', (e) => {\n e.stopPropagation();\n fn();\n });\n };\n on('.veo-step-edit', actions.onEdit);\n on('.veo-step-duplicate', actions.onDuplicate);\n on('.veo-step-remove', actions.onRemove);\n card.addEventListener('click', actions.onEdit);\n return card;\n}\n\nconst CHROME_CSS = `\n:host { all: initial; }\n.veo-chrome {\n position: fixed; top: 0; left: 0; right: 0;\n display: flex; flex-direction: column;\n z-index: 2147483646;\n font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif;\n font-size: 14px; color: #1c1917;\n}\n.veo-chrome[hidden] { display: none; }\n/* Modo tagging oculta controles por atributo: gana a los display de sus clases. */\n.veo-chrome [hidden], .veo-steps-toggle[hidden] { display: none !important; }\n.veo-chrome.is-bottom { top: auto; bottom: 0; flex-direction: column-reverse; }\n.veo-chrome.is-bottom .veo-tb-menu { top: auto; bottom: calc(100% + 8px); }\n.veo-chrome.is-bottom .veo-steps { border-bottom: 0; border-top: 1px solid #d6cfc8; }\n.veo-chrome.is-bottom .veo-steps-toggle { top: auto; bottom: var(--veo-chrome-h, ${CHROME_TOPBAR_H + CHROME_STEPS_H}px); transform: translate(-50%, 50%); }\n.veo-preview-pill {\n position: fixed; top: 28px; left: 50%; transform: translateX(-50%);\n z-index: 2147483646;\n display: inline-flex; align-items: center; gap: 12px;\n background: #2b2623; color: #fff; border-radius: 999px; padding: 12px 20px;\n font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif; font-size: 15px; font-weight: 500;\n box-shadow: 0 8px 24px rgba(0,0,0,0.3);\n}\n.veo-preview-pill[hidden] { display: none; }\n.veo-preview-label { display: inline-flex; align-items: center; gap: 10px; padding-right: 12px; border-right: 1px solid rgba(255,255,255,0.3); }\n.veo-preview-exit { border: 0; background: transparent; color: #fff; font: inherit; cursor: pointer; padding: 0 2px; }\n.veo-preview-exit:hover { text-decoration: underline; }\n.veo-tb {\n height: ${CHROME_TOPBAR_H}px; box-sizing: border-box;\n display: flex; align-items: center; justify-content: space-between;\n padding: 0 20px; gap: 16px;\n background: #2b2623; color: #fff;\n}\n.veo-tb-left, .veo-tb-right { display: flex; align-items: center; gap: 12px; min-width: 0; }\n.veo-tb-brand {\n width: 36px; height: 36px; border-radius: 999px; background: #b74d00;\n display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto;\n}\n.veo-tb-name { font-weight: 700; font-size: 16px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.veo-tb-status { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: 999px; font-size: 11px; font-weight: 600; letter-spacing: 0.02em; white-space: nowrap; background: rgba(255,255,255,0.18); color: #fff; }\n.veo-tb-status[data-tone=\"live\"] { background: #16a34a; }\n.veo-tb-status[data-tone=\"testing\"] { background: #b45309; }\n.veo-tb-status[data-tone=\"review\"] { background: #7c3aed; }\n.veo-tb-status[data-tone=\"draft\"] { background: #0f766e; }\n.veo-tb-status[data-tone=\"paused\"] { background: rgba(255,255,255,0.28); }\n.veo-tb-sep { width: 1px; height: 24px; background: rgba(255,255,255,0.25); }\n.veo-tb-vsep { width: 1px; height: 28px; background: rgba(255,255,255,0.25); margin: 0 4px; }\n.veo-tb-app { display: inline-flex; align-items: center; gap: 8px; color: rgba(255,255,255,0.85); white-space: nowrap; }\n.veo-tb-icon {\n width: 42px; height: 42px; border-radius: 10px; border: 0;\n background: rgba(255,255,255,0.12); color: #fff; cursor: pointer;\n display: inline-flex; align-items: center; justify-content: center;\n}\n.veo-tb-icon:hover { background: rgba(255,255,255,0.22); }\n.veo-tb-text { border: 0; background: transparent; color: #fff; font: inherit; font-size: 15px; cursor: pointer; padding: 8px 6px; }\n.veo-tb-text:hover { text-decoration: underline; }\n.veo-tb-save { position: relative; display: inline-flex; border-radius: 10px; overflow: visible; }\n.veo-tb-save-main, .veo-tb-save-more {\n border: 0; background: #b74d00; color: #fff; font: inherit; font-weight: 600; font-size: 15px;\n cursor: pointer; display: inline-flex; align-items: center; gap: 8px; height: 42px;\n}\n.veo-tb-save-main { padding: 0 8px 0 18px; border-radius: 10px 0 0 10px; }\n.veo-tb-save-more { padding: 0 12px 0 6px; border-radius: 0 10px 10px 0; }\n.veo-tb-save-main:hover, .veo-tb-save-more:hover { background: #953c00; }\n.veo-tb-save-main:disabled { opacity: 0.7; cursor: default; }\n.veo-tb-menu {\n position: absolute; right: 0; top: calc(100% + 8px); min-width: 220px;\n background: #fff; color: #1c1917; border-radius: 12px; padding: 6px;\n box-shadow: 0 12px 32px rgba(0,0,0,0.22);\n}\n.veo-tb-menu-item {\n display: block; width: 100%; text-align: left; border: 0; background: transparent;\n font: inherit; font-size: 15px; padding: 10px 14px; border-radius: 8px; cursor: pointer;\n}\n.veo-tb-menu-item:hover { background: #f5efe9; }\n.veo-steps {\n height: ${CHROME_STEPS_H}px; box-sizing: border-box;\n background: #e7e1dc; border-bottom: 1px solid #d6cfc8;\n padding: 16px 28px 0; overflow-x: auto;\n}\n.veo-steps[hidden] { display: none; }\n.veo-steps-list { display: flex; align-items: flex-start; gap: 20px; }\n.veo-step { border: 0; background: transparent; padding: 0; cursor: pointer; font: inherit; display: flex; flex-direction: column; align-items: center; gap: 8px; flex: 0 0 auto; }\n.veo-step-box {\n position: relative; overflow: hidden;\n width: 116px; height: 64px; border-radius: 10px; background: #fff; border: 2px solid transparent;\n display: flex; align-items: center; justify-content: center; color: #2b2623;\n box-shadow: 0 1px 2px rgba(0,0,0,0.06);\n}\n/* Capa de acciones del paso: aparece al pasar el mouse o al enfocar un botón. */\n.veo-step-hover {\n position: absolute; inset: 0; background: #2b2623; border-radius: 8px;\n display: flex; flex-direction: column; padding: 3px 4px 6px; box-sizing: border-box;\n opacity: 0; transition: opacity 120ms ease-out;\n}\n.veo-step:hover .veo-step-hover, .veo-step:focus-within .veo-step-hover { opacity: 1; }\n.veo-step-hover-top { display: flex; justify-content: space-between; align-items: center; }\n.veo-step-hover-main { flex: 1; display: flex; align-items: center; justify-content: center; }\n.veo-step-icon {\n border: 0; background: transparent; color: #fff; cursor: pointer; padding: 0;\n width: 20px; height: 20px; border-radius: 5px; display: inline-flex; align-items: center; justify-content: center;\n}\n.veo-step-icon:hover { background: rgba(255,255,255,0.14); }\n.veo-step-icon:disabled { opacity: 0.35; cursor: default; background: transparent; }\n.veo-step-edit {\n width: 100%; margin: 0 6px; border: 0; background: #dbeefc; color: #1d6fb8; font: inherit; font-size: 13px; font-weight: 600;\n border-radius: 6px; padding: 5px 10px; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 6px;\n}\n.veo-step-edit:hover { background: #cbe4f9; }\n.veo-step.is-active .veo-step-box { border-color: #b74d00; }\n.veo-step-label { font-size: 13px; color: #6b635d; }\n.veo-step.is-active .veo-step-label { color: #2b2623; font-weight: 600; }\n.veo-thumb { width: 72px; height: 36px; border: 1.5px solid #c9c2bb; border-radius: 6px; padding: 6px 7px; box-sizing: border-box; display: flex; flex-direction: column; gap: 4px; }\n.veo-thumb i { display: block; height: 3px; border-radius: 2px; background: #2b2623; width: 70%; }\n.veo-thumb i + i { width: 45%; background: #c9c2bb; }\n.veo-thumb b { display: block; height: 6px; width: 24px; border-radius: 2px; background: #b74d00; align-self: flex-end; }\n.veo-thumb-inline { border-style: dashed; }\n.veo-thumb-inline i { width: 100%; }\n.veo-step-add { border: 0; background: transparent; font: inherit; font-size: 15px; color: #6b635d; cursor: pointer; display: inline-flex; align-items: center; gap: 8px; height: 64px; padding: 0 8px; }\n.veo-step-add:hover { color: #2b2623; }\n.veo-steps-toggle {\n position: absolute; left: 50%; top: var(--veo-chrome-h, ${CHROME_TOPBAR_H + CHROME_STEPS_H}px);\n transform: translate(-50%, -50%);\n border: 0; background: #2b2623; color: #fff; font: inherit; font-size: 14px; font-weight: 500;\n border-radius: 999px; padding: 10px 18px; cursor: pointer;\n display: inline-flex; align-items: center; gap: 8px;\n box-shadow: 0 6px 18px rgba(0,0,0,0.25);\n}\n`;\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 = 484;\nconst PANEL_H = 660;\nconst MIN_W = 320;\nconst MIN_H = 320;\nconst MARGIN = 16;\n/** Alto del header propio del panel (drag + acciones). */\nconst HEADER_H = 52;\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 /** Alto ocupado arriba por el chrome del editor (el panel arranca debajo). */\n topOffset?: number;\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 /** Título del header (lo publica el editor: «Ajustes de activación», «Paso 1»…). */\n setTitle(title: string): void;\n /** Muestra/oculta la tarjeta (el estado del editor se conserva en el iframe). */\n setVisible(visible: boolean): void;\n isVisible(): boolean;\n /** Reposiciona el tope mínimo cuando el chrome cambia de alto. */\n setTopOffset(px: number): void;\n /**\n * Tamaño COMPACTO pedido por el editor (p. ej. «Estructura», un popover\n * chico): `height` es el alto del contenido, el header se suma acá. `null`\n * restaura el tamaño que tenía. Se ignora maximizado o en pop-out.\n */\n setSize(size: { width: number; height: number } | null): 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 {\n target: () => null,\n frameRect: () => null,\n teardown: () => {},\n setTitle: () => {},\n setVisible: () => {},\n isVisible: () => false,\n setTopOffset: () => {},\n setSize: () => {},\n };\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 topOffset = opts.topOffset ?? 0;\n // Mock: la tarjeta arranca a la IZQUIERDA, justo debajo del chrome.\n let left = 40;\n let top = topOffset + 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 (mock 2026-09): grip «···» arriba al centro, título a la izquierda y\n // a la derecha pop-out · maximizar · minimizar.\n const header = document.createElement('div');\n header.className = 'veo-panel-header';\n const grip = document.createElement('span');\n grip.className = 'veo-panel-grip';\n grip.setAttribute('aria-hidden', 'true');\n grip.textContent = '···';\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 = panelButton(ICON_POPOUT, 'Abrir en ventana aparte');\n const maximize = panelButton(ICON_EXPAND, 'Maximizar');\n const minimize = panelButton(ICON_MINUS, 'Minimizar');\n actions.append(popout, maximize, minimize);\n header.append(grip, 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 resizeGrip = document.createElement('div');\n resizeGrip.className = 'veo-panel-resize';\n resizeGrip.setAttribute('aria-hidden', 'true');\n\n card.append(header, iframe, resizeGrip);\n shadow.append(style, card);\n document.body.appendChild(host);\n\n // ── Minimizar / maximizar ───────────────────────────────────────────────\n let visible = true;\n let maximized = false;\n let restore: { left: number; top: number; w: number; h: number } | null = null;\n const setVisible = (next: boolean): void => {\n visible = next;\n card.style.display = next && !(popped && !popped.closed) ? '' : 'none';\n };\n minimize.addEventListener('click', () => setVisible(false));\n // Tamaño compacto (ver BuilderPanelHandle.setSize): recuerda el tamaño previo\n // la primera vez y lo restaura con `null`. Levanta el alto mínimo mientras\n // dura, para que un popover chico pueda ser chico de verdad.\n let compactRestore: { w: number; h: number } | null = null;\n const setSize = (size: { width: number; height: number } | null): void => {\n if (maximized || (popped && !popped.closed)) return;\n if (size) {\n if (!compactRestore) compactRestore = { w: card.offsetWidth, h: card.offsetHeight };\n card.style.minHeight = '0';\n card.style.width = `${clamp(Math.round(size.width), MIN_W, window.innerWidth - MARGIN * 2)}px`;\n card.style.height = `${clamp(Math.round(size.height) + HEADER_H, HEADER_H + 80, window.innerHeight - top - MARGIN)}px`;\n } else if (compactRestore) {\n card.style.minHeight = '';\n card.style.width = `${compactRestore.w}px`;\n card.style.height = `${compactRestore.h}px`;\n compactRestore = null;\n }\n };\n maximize.addEventListener('click', () => {\n maximized = !maximized;\n if (maximized) {\n restore = { left, top, w: card.offsetWidth, h: card.offsetHeight };\n left = MARGIN;\n top = topOffset + MARGIN;\n card.style.left = `${left}px`;\n card.style.top = `${top}px`;\n card.style.width = `${Math.max(MIN_W, window.innerWidth - MARGIN * 2)}px`;\n card.style.height = `${Math.max(MIN_H, window.innerHeight - top - MARGIN)}px`;\n maximize.title = 'Restaurar';\n } else if (restore) {\n left = restore.left;\n top = restore.top;\n card.style.left = `${left}px`;\n card.style.top = `${top}px`;\n card.style.width = `${restore.w}px`;\n card.style.height = `${restore.h}px`;\n maximize.title = 'Maximizar';\n }\n });\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 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)?.closest('.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), topOffset, Math.max(topOffset, 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 resizeGrip.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 setTitle: (t) => {\n title.textContent = t;\n },\n setVisible,\n setSize,\n isVisible: () => visible,\n setTopOffset: (px) => {\n topOffset = px;\n if (top < topOffset + MARGIN) {\n top = topOffset + MARGIN;\n card.style.top = `${top}px`;\n }\n },\n };\n}\n\nconst ICON_POPOUT =\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m6.75 7.5 3 2.25-3 2.25m4.5 0h3m-9 8.25h13.5A2.25 2.25 0 0 0 21 18V6a2.25 2.25 0 0 0-2.25-2.25H5.25A2.25 2.25 0 0 0 3 6v12a2.25 2.25 0 0 0 2.25 2.25Z\"/>';\nconst ICON_EXPAND =\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\"/>';\nconst ICON_MINUS = '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M5 12h14\"/>';\n\nfunction panelButton(iconPath: string, label: string): HTMLButtonElement {\n const b = document.createElement('button');\n b.className = 'veo-panel-btn';\n b.type = 'button';\n b.title = label;\n b.setAttribute('aria-label', label);\n b.innerHTML =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" ' +\n `fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" aria-hidden=\"true\">${iconPath}</svg>`;\n return b;\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: 14px;\n box-shadow: 0 12px 40px rgba(0,0,0,0.22);\n overflow: hidden;\n z-index: 2147483647;\n font-family: system-ui, -apple-system, sans-serif;\n}\n.veo-panel-header {\n position: relative; flex: 0 0 auto; height: ${HEADER_H}px; box-sizing: border-box;\n display: flex; align-items: center; justify-content: space-between;\n padding: 10px 14px 0 22px;\n background: #fbf8f5; color: #1c1917; border-bottom: 1px solid #e8e2dc;\n font-size: 17px; font-weight: 700;\n cursor: grab;\n}\n.veo-panel-header:active { cursor: grabbing; }\n.veo-panel-grip {\n position: absolute; top: 0; left: 50%; transform: translateX(-50%);\n color: #b5aca4; font-size: 14px; letter-spacing: 1px; line-height: 12px;\n}\n.veo-panel-title { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.veo-panel-actions { display: flex; gap: 2px; }\n.veo-panel-btn {\n border: 0; background: transparent; color: #4b4540;\n cursor: pointer; line-height: 1; display: inline-flex; align-items: center;\n padding: 6px; border-radius: 8px;\n}\n.veo-panel-btn:hover { background: rgba(0,0,0,0.06); color: #1c1917; }\n.veo-panel-frame { flex: 1 1 auto; width: 100%; border: 0; background: #fff; }\n.veo-panel-resize {\n position: absolute; right: 0; bottom: 0;\n width: 16px; height: 16px;\n cursor: nwse-resize;\n background:\n linear-gradient(135deg, transparent 50%, rgba(0,0,0,0.25) 50%, rgba(0,0,0,0.25) 60%,\n transparent 60%, transparent 72%, rgba(0,0,0,0.25) 72%, rgba(0,0,0,0.25) 82%, transparent 82%);\n}\n`;\n","/**\n * Manipulación DIRECTA del diseño en modo editor: arrastrar la tarjeta de una\n * modal para posicionarla, redimensionarla desde bordes/esquinas, y arrastrar\n * un banner para alternar top/bottom. Vive en el bundle builder (veo-builder.js)\n * — el runtime de guías no carga nada de esto.\n *\n * Funciona como DECORATOR: se adjunta DESPUÉS del render sobre el shadow root\n * abierto del host de la guía (no toca los renderers). Durante el gesto aplica\n * las variables CSS localmente (feedback a 60fps, sin postMessage); al soltar\n * (`pointerup`) emite UN `onCommit(patch)` con los valores finales, que el\n * builder-mode postea al panel como `design-updated`. El panel actualiza su\n * estado y re-manda `preview` — que entra por el update in-place con las\n * MISMAS variables → no hay loop ni parpadeo.\n *\n * Geometría del modal (ver styles.ts): la card usa `left: posX%` +\n * `translate(-posX%)`, o sea `cardLeft = posX * (viewportW - cardW)` →\n * `posX = cardLeft / (viewportW - cardW)`. Mismo modelo que serializa el\n * dashboard (`style.posX/posY` en 0..1) y consume `applyDesignVars`.\n */\nimport type { GuideType } from '../guides/types';\n\n/** Merge superficial sobre `step.style` del paso activo (lo aplica el panel). */\nexport interface DesignPatch {\n stepIndex: number;\n style: {\n posX?: number;\n posY?: number;\n width?: number;\n height?: number;\n position?: 'top' | 'bottom';\n };\n}\n\nexport interface DesignManipulatorOptions {\n /** Host de la guía (de `PreviewHandle.host()`), con shadow root abierto. */\n host: HTMLElement;\n guideType: GuideType;\n stepIndex: number;\n /** Se emite UNA vez por gesto, al soltar. */\n onCommit: (patch: DesignPatch) => void;\n /** Fin de cualquier gesto (con o sin cambios). Para aplicar previews encolados. */\n onGestureEnd?: () => void;\n}\n\nexport interface DesignManipulatorHandle {\n /** `true` mientras hay un gesto de drag/resize en curso. */\n isDragging(): boolean;\n /** Remueve handles, estilos y listeners. Idempotente. */\n detach(): void;\n}\n\nconst MIN_W = 220;\nconst MAX_W = 720;\nconst MIN_H = 120;\nconst MAX_H = 900;\n/** Zonas de agarre de los bordes (px). */\nconst EDGE = 8;\n\ntype ResizeDir = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw';\nconst RESIZE_DIRS: ResizeDir[] = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\n\nconst MANIPULATOR_CSS = `\n.veo-mnp-card {\n outline: 1.5px dashed rgba(255, 91, 53, 0.75);\n outline-offset: 2px;\n}\n.veo-mnp-card:hover { cursor: move; }\n.veo-mnp-handle {\n position: absolute;\n z-index: 10;\n background: transparent;\n}\n.veo-mnp-handle::after {\n content: '';\n position: absolute;\n width: 8px; height: 8px;\n background: #fff;\n border: 1.5px solid rgba(255, 91, 53, 0.9);\n border-radius: 2px;\n top: 50%; left: 50%;\n transform: translate(-50%, -50%);\n opacity: 0;\n transition: opacity 100ms ease;\n}\n.veo-mnp-card:hover .veo-mnp-handle::after,\n.veo-mnp-handle:hover::after { opacity: 1; }\n.veo-mnp-n { top: -${EDGE / 2}px; left: ${EDGE}px; right: ${EDGE}px; height: ${EDGE}px; cursor: ns-resize; }\n.veo-mnp-s { bottom: -${EDGE / 2}px; left: ${EDGE}px; right: ${EDGE}px; height: ${EDGE}px; cursor: ns-resize; }\n.veo-mnp-e { right: -${EDGE / 2}px; top: ${EDGE}px; bottom: ${EDGE}px; width: ${EDGE}px; cursor: ew-resize; }\n.veo-mnp-w { left: -${EDGE / 2}px; top: ${EDGE}px; bottom: ${EDGE}px; width: ${EDGE}px; cursor: ew-resize; }\n.veo-mnp-ne { top: -${EDGE / 2}px; right: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nesw-resize; }\n.veo-mnp-nw { top: -${EDGE / 2}px; left: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nwse-resize; }\n.veo-mnp-se { bottom: -${EDGE / 2}px; right: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nwse-resize; }\n.veo-mnp-sw { bottom: -${EDGE / 2}px; left: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nesw-resize; }\n.veo-mnp-banner { outline: 1.5px dashed rgba(255, 91, 53, 0.75); outline-offset: -2px; cursor: grab; }\n.veo-mnp-banner:active { cursor: grabbing; }\n`;\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.min(Math.max(v, min), max);\n}\n\nfunction round3(v: number): number {\n return Math.round(v * 1000) / 1000;\n}\n\n/** true si el mousedown cayó sobre algo interactivo (no iniciar drag ahí). */\nfunction isInteractive(target: EventTarget | null): boolean {\n return Boolean(\n target instanceof Element && target.closest('button, a, input, textarea, select, label'),\n );\n}\n\n/**\n * Adjunta la manipulación directa al host de una guía montada. Devuelve el\n * handle, o `null` si el tipo de guía no la soporta o el DOM esperado no está.\n * Idempotente: si la card ya está decorada, no re-adjunta.\n */\nexport function attachDesignManipulator(\n opts: DesignManipulatorOptions,\n): DesignManipulatorHandle | null {\n const shadow = opts.host.shadowRoot;\n if (!shadow) return null;\n\n const card = shadow.querySelector<HTMLElement>('.veo-modal-card');\n if (card) return attachModal(opts, shadow, card);\n\n const banner = shadow.querySelector<HTMLElement>('.veo-banner');\n // El banner embebido se posiciona con prepend/append en el contenedor: su\n // top/bottom se cambia desde el panel (remonta). Solo el fijo se arrastra.\n if (banner && !banner.classList.contains('veo-banner-embedded')) {\n return attachBanner(opts, shadow, banner);\n }\n\n return null;\n}\n\n// ── Modal: drag libre + resize por 8 handles ────────────────────────────────\n\nfunction attachModal(\n opts: DesignManipulatorOptions,\n shadow: ShadowRoot,\n card: HTMLElement,\n): DesignManipulatorHandle | null {\n if (card.dataset.veoManipulated === '1') return null;\n card.dataset.veoManipulated = '1';\n card.classList.add('veo-mnp-card');\n\n const doc = card.ownerDocument;\n const style = doc.createElement('style');\n style.textContent = MANIPULATOR_CSS;\n shadow.appendChild(style);\n\n const handles: HTMLElement[] = [];\n for (const dir of RESIZE_DIRS) {\n const h = doc.createElement('div');\n h.className = `veo-mnp-handle veo-mnp-${dir}`;\n h.dataset.veoDir = dir;\n card.appendChild(h);\n handles.push(h);\n }\n\n let dragging = false;\n let detached = false;\n\n /** Últimos valores aplicados durante el gesto (para el commit del up). */\n let patch: DesignPatch['style'] = {};\n\n const setVars = (v: { px?: number; py?: number; w?: number; h?: number }): void => {\n const host = opts.host;\n if (v.px !== undefined) host.style.setProperty('--veo-pos-x', `${v.px * 100}%`);\n if (v.py !== undefined) host.style.setProperty('--veo-pos-y', `${v.py * 100}%`);\n if (v.w !== undefined) host.style.setProperty('--veo-width', `${v.w}px`);\n if (v.h !== undefined) host.style.setProperty('--veo-min-h', `${v.h}px`);\n };\n\n /**\n * Un gesto genérico: guarda el rect inicial, traduce cada mousemove a\n * variables CSS (rAF-throttled) y al soltar emite el commit acumulado.\n */\n const startGesture = (\n e: MouseEvent,\n apply: (dx: number, dy: number, start: DOMRect) => DesignPatch['style'],\n ): void => {\n e.preventDefault();\n e.stopPropagation();\n dragging = true;\n patch = {};\n const start = card.getBoundingClientRect();\n const sx = e.clientX;\n const sy = e.clientY;\n let raf = 0;\n let lastEv: MouseEvent | null = null;\n\n const flush = (): void => {\n raf = 0;\n if (!lastEv) return;\n const next = apply(lastEv.clientX - sx, lastEv.clientY - sy, start);\n patch = { ...patch, ...next };\n setVars({\n ...(next.posX !== undefined ? { px: next.posX } : {}),\n ...(next.posY !== undefined ? { py: next.posY } : {}),\n ...(next.width !== undefined ? { w: next.width } : {}),\n ...(next.height !== undefined ? { h: next.height } : {}),\n });\n };\n\n const move = (ev: MouseEvent): void => {\n lastEv = ev;\n // rAF-throttle del feedback; fallback síncrono si el entorno no tiene rAF.\n if (typeof window.requestAnimationFrame !== 'function') flush();\n else if (!raf) raf = window.requestAnimationFrame(flush);\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n if (raf) window.cancelAnimationFrame(raf);\n flush();\n dragging = false;\n if (Object.keys(patch).length > 0 && !detached) {\n opts.onCommit({ stepIndex: opts.stepIndex, style: patch });\n }\n opts.onGestureEnd?.();\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n };\n\n /** posX para que el borde izquierdo quede en `left` con ancho `w`. */\n const posXFor = (left: number, w: number): number => {\n const span = window.innerWidth - w;\n return span <= 0 ? 0.5 : round3(clamp(left / span, 0, 1));\n };\n const posYFor = (top: number, h: number): number => {\n const span = window.innerHeight - h;\n return span <= 0 ? 0.5 : round3(clamp(top / span, 0, 1));\n };\n\n const onCardDown = (e: MouseEvent): void => {\n if (isInteractive(e.target)) return;\n if (e.target instanceof Element && e.target.closest('.veo-mnp-handle')) return;\n startGesture(e, (dx, dy, start) => ({\n posX: posXFor(start.left + dx, start.width),\n posY: posYFor(start.top + dy, start.height),\n }));\n };\n\n const onHandleDown = (e: MouseEvent): void => {\n const dir = (e.currentTarget as HTMLElement).dataset.veoDir as ResizeDir;\n startGesture(e, (dx, dy, start) => {\n const out: DesignPatch['style'] = {};\n if (dir.includes('e')) out.width = Math.round(clamp(start.width + dx, MIN_W, MAX_W));\n if (dir.includes('w')) {\n out.width = Math.round(clamp(start.width - dx, MIN_W, MAX_W));\n // El borde derecho queda fijo: la card se re-ancla donde corresponde.\n out.posX = posXFor(start.right - out.width, out.width);\n }\n if (dir.includes('s')) out.height = Math.round(clamp(start.height + dy, MIN_H, MAX_H));\n if (dir.includes('n')) {\n out.height = Math.round(clamp(start.height - dy, MIN_H, MAX_H));\n out.posY = posYFor(start.bottom - out.height, out.height);\n }\n return out;\n });\n };\n\n card.addEventListener('mousedown', onCardDown);\n for (const h of handles) h.addEventListener('mousedown', onHandleDown);\n\n return {\n isDragging: () => dragging,\n detach: () => {\n if (detached) return;\n detached = true;\n card.removeEventListener('mousedown', onCardDown);\n for (const h of handles) h.remove();\n style.remove();\n card.classList.remove('veo-mnp-card');\n delete card.dataset.veoManipulated;\n },\n };\n}\n\n// ── Banner fijo: drag vertical con snap top/bottom ──────────────────────────\n\nfunction attachBanner(\n opts: DesignManipulatorOptions,\n shadow: ShadowRoot,\n banner: HTMLElement,\n): DesignManipulatorHandle | null {\n if (banner.dataset.veoManipulated === '1') return null;\n banner.dataset.veoManipulated = '1';\n banner.classList.add('veo-mnp-banner');\n\n const doc = banner.ownerDocument;\n const style = doc.createElement('style');\n style.textContent = MANIPULATOR_CSS;\n shadow.appendChild(style);\n\n let dragging = false;\n let detached = false;\n\n const positionOf = (): 'top' | 'bottom' =>\n banner.classList.contains('veo-banner-bottom') ? 'bottom' : 'top';\n\n const onDown = (e: MouseEvent): void => {\n if (isInteractive(e.target)) return;\n e.preventDefault();\n dragging = true;\n const startPos = positionOf();\n let current = startPos;\n\n const move = (ev: MouseEvent): void => {\n // Snap: la mitad del viewport decide top/bottom, con feedback en vivo.\n const next = ev.clientY < window.innerHeight / 2 ? 'top' : 'bottom';\n if (next !== current) {\n current = next;\n banner.classList.remove('veo-banner-top', 'veo-banner-bottom');\n banner.classList.add(`veo-banner-${next}`);\n }\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n dragging = false;\n if (current !== startPos && !detached) {\n opts.onCommit({ stepIndex: opts.stepIndex, style: { position: current } });\n }\n opts.onGestureEnd?.();\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n };\n\n banner.addEventListener('mousedown', onDown);\n\n return {\n isDragging: () => dragging,\n detach: () => {\n if (detached) return;\n detached = true;\n banner.removeEventListener('mousedown', onDown);\n style.remove();\n banner.classList.remove('veo-mnp-banner');\n delete banner.dataset.veoManipulated;\n },\n };\n}\n","/**\n * Qué cuenta como \"elemento interactivo\" para el tagueo de features: los\n * controles sobre los que un usuario actúa (botones, enlaces, campos,\n * formularios, controles ARIA…). Un `div` o `span` a secas no lo es: taguear\n * eso no mide ninguna acción y además rara vez genera eventos de autocapture\n * (ver `findMeaningfulAncestor` en `autocapture/dom-listener.ts`, que sube\n * hasta el mismo tipo de elementos antes de emitir `$autocapture`).\n *\n * Lo usan el picker (modo `only: 'interactive'`: al pasar el mouse sobre un\n * `<span>` dentro de un botón se resalta el botón) y `scan-page` (inventario\n * de candidatos a feature de la página).\n */\n\nconst INTERACTIVE_ROLES = [\n 'button',\n 'link',\n 'tab',\n 'menuitem',\n 'menuitemcheckbox',\n 'menuitemradio',\n 'checkbox',\n 'radio',\n 'switch',\n 'option',\n 'combobox',\n 'textbox',\n 'searchbox',\n 'slider',\n 'spinbutton',\n];\n\n/** Selector CSS de los elementos interactivos (para `querySelectorAll`/`closest`). */\nexport const INTERACTIVE_SELECTOR = [\n 'button',\n 'a[href]',\n 'input:not([type=\"hidden\"])',\n 'select',\n 'textarea',\n 'form',\n 'summary',\n '[contenteditable=\"true\"]',\n '[onclick]',\n '[data-veo-tag]',\n ...INTERACTIVE_ROLES.map((r) => `[role=\"${r}\"]`),\n].join(', ');\n\n/** ¿El elemento es interactivo por sí mismo? */\nexport function isInteractiveElement(element: Element): boolean {\n try {\n return element.matches(INTERACTIVE_SELECTOR);\n } catch {\n return false;\n }\n}\n\n/**\n * El elemento interactivo más cercano: el propio elemento o su ancestro\n * interactivo más próximo (`<span>` dentro de `<button>` → el botón).\n * `null` si no hay ninguno (zona no interactiva de la página).\n */\nexport function closestInteractive(element: Element): Element | null {\n try {\n return element.closest(INTERACTIVE_SELECTOR);\n } catch {\n return null;\n }\n}\n\n/**\n * Emojis y pictogramas (⚙️ 👥 ✅ …) + sus acompañantes invisibles: selectores\n * de variante (U+FE0F), ZWJ (U+200D), modificadores de tono y el «combinador»\n * de teclas (U+20E3). Es lo que la gente pone como icono dentro del texto de\n * un botón o link y no forma parte del nombre de la acción.\n */\nconst EMOJI_RE = /\\p{Extended_Pictographic}|\\p{Emoji_Modifier}|\\u{FE0F}|\\u{200D}|\\u{20E3}/gu;\n\n/**\n * Texto \"humano\" de un elemento para nombrar una feature: sin emojis ni\n * iconos, con los espacios colapsados y recortado a `max`. Si el elemento no\n * tiene texto (botón de solo icono), usa `aria-label` o `title`.\n */\nexport function elementLabelText(element: Element, max = 120): string {\n const clean = (raw: string | null | undefined): string =>\n (raw ?? '').replace(EMOJI_RE, '').replace(/\\s+/g, ' ').trim();\n const text = clean(element.textContent);\n if (text) return text.slice(0, max);\n const fallback =\n clean(element.getAttribute('aria-label')) || clean(element.getAttribute('title'));\n return fallback.slice(0, max);\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';\nimport { closestInteractive, elementLabelText } from './interactive-elements';\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 /** Título del banner superior. Default en español. */\n hint?: string;\n /** Subtítulo del banner (default: cómo abrir menús con Alt + clic). */\n subhint?: string;\n /**\n * `'interactive'`: solo se pueden elegir elementos interactivos (botones,\n * enlaces, campos, formularios, controles ARIA…); al pasar sobre un hijo\n * (p. ej. el `<span>` de un botón) se resalta el control que lo contiene, y\n * sobre zonas no interactivas no se resalta ni se puede elegir nada.\n * Default: cualquier elemento (anclas de guías).\n */\n only?: 'interactive';\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: transparent;\n border: 3px dashed #b74d00;\n border-radius: 8px;\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: #2b2623;\n color: #f5efe9;\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: #ffd1ad; word-break: break-all; }\n.veo-pick-label .veo-pick-dim { color: #c9c2bb; margin-top: 3px; }\n.veo-pick-hint {\n position: fixed;\n top: 28px;\n left: 50%;\n transform: translateX(-50%);\n z-index: ${PICKER_Z};\n pointer-events: none;\n display: flex; align-items: center; gap: 16px;\n max-width: min(760px, calc(100vw - 32px));\n background: #2b2623;\n color: #fff;\n font: 15px/1.4 -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n padding: 14px 18px 14px 16px;\n border-radius: 14px;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n}\n.veo-pick-hint-icon {\n flex: 0 0 auto; width: 44px; height: 44px; border-radius: 999px;\n background: rgba(255,255,255,0.12);\n display: inline-flex; align-items: center; justify-content: center;\n}\n.veo-pick-hint-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }\n.veo-pick-hint-title { font-weight: 700; }\n.veo-pick-hint-sub { font-size: 13px; color: rgba(255,255,255,0.75); }\n.veo-pick-cancel {\n flex: 0 0 auto; pointer-events: auto;\n border: 0; border-radius: 10px; padding: 12px 18px;\n background: rgba(255,255,255,0.14); color: #fff;\n font: inherit; font-weight: 600; cursor: pointer;\n}\n.veo-pick-cancel:hover { background: rgba(255,255,255,0.24); }\n`;\n\nconst HINT_ICON =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" ' +\n 'stroke=\"currentColor\" stroke-width=\"1.6\" aria-hidden=\"true\"><path stroke-linecap=\"round\" ' +\n 'stroke-linejoin=\"round\" d=\"M7.5 3.75H6A2.25 2.25 0 0 0 3.75 6v1.5M16.5 3.75H18A2.25 2.25 0 0 1 ' +\n '20.25 6v1.5m0 9V18A2.25 2.25 0 0 1 18 20.25h-1.5m-9 0H6A2.25 2.25 0 0 1 3.75 18v-1.5M15 12a3 3 ' +\n '0 1 1-6 0 3 3 0 0 1 6 0Z\"/></svg>';\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 only: 'interactive' | null = null;\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.only = options.only ?? null;\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 // Banner (mock 2026-09): icono · título + subtítulo · Cancelar.\n const hint = document.createElement('div');\n hint.className = 'veo-pick-hint';\n const icon = document.createElement('span');\n icon.className = 'veo-pick-hint-icon';\n icon.innerHTML = HINT_ICON;\n const text = document.createElement('div');\n text.className = 'veo-pick-hint-text';\n const title = document.createElement('span');\n title.className = 'veo-pick-hint-title';\n title.textContent = options.hint ?? 'Selecciona un elemento existente para colocar la guía.';\n const sub = document.createElement('span');\n sub.className = 'veo-pick-hint-sub';\n sub.textContent =\n options.subhint ?? 'Usa Alt + clic u Opción + clic para abrir menús y desplegables.';\n text.append(title, sub);\n const cancel = document.createElement('button');\n cancel.className = 'veo-pick-cancel';\n cancel.type = 'button';\n cancel.textContent = 'Cancelar';\n cancel.addEventListener('click', (e) => {\n e.stopPropagation();\n const cb = this.onCancel;\n this.stop();\n cb?.();\n });\n hint.append(icon, text, cancel);\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.only = null;\n this.onPick = null;\n this.onCancel = null;\n }\n\n /** Elemento que se elegiría para el nodo bajo el cursor (o null si no hay). */\n private resolveTarget(target: EventTarget | null): Element | null {\n if (!(target instanceof Element) || this.isOwn(target)) return null;\n return this.only === 'interactive' ? closestInteractive(target) : target;\n }\n\n private hideBox(): void {\n if (this.box) this.box.style.display = 'none';\n if (this.label) this.label.style.display = 'none';\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 if (!(event.target instanceof Element) || this.isOwn(event.target)) return;\n const target = this.resolveTarget(event.target);\n this.current = target;\n if (target) this.draw(target);\n else this.hideBox(); // zona no interactiva: nada que elegir\n };\n\n private onClick = (event: MouseEvent): void => {\n // Alt/Opción + clic: pasa a la app (abrir menús/desplegables) sin seleccionar.\n if (event.altKey) return;\n if (this.isOwn(event.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 target = this.current ?? this.resolveTarget(event.target);\n if (!target) return; // nada elegible bajo el cursor: el picker sigue abierto\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 (event.altKey || 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: elementLabelText(element),\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 { buildSelectorPath, filterHumanClasses } from '../autocapture/selector-builder';\nimport { isDeviceAllowed } from '../guides/activation-devices';\nimport { activationDelayMs, isAutomaticActivation } from '../guides/activation-rules';\nimport { applyBlockStyle, buildContentBlock } from '../guides/block-builder';\nimport { RAW_BLOCK_ATTR } from '../guides/code-block';\nimport { closeGuidePreview, previewGuide } from '../guides/guide-preview';\nimport { groupLayout } from '../guides/layout';\nimport { GUIDE_STYLES } from '../guides/styles';\nimport type { CompositeStep, StepBlock } from '../guides/types';\nimport { stepMatchesPage } from '../guides/url-match';\nimport { attachBlockDropTarget, type BlockDropTargetHandle } from './block-drop-target';\nimport {\n type BlockLayoutAction,\n type BlockToolbarAction,\n type BuilderCommand,\n type BuilderEvent,\n type CardToolbarAction,\n type ConfirmationCard,\n type EditorChromeState,\n type PageElement,\n type PageScan,\n type PreviewStatus,\n type RowToolbarAction,\n VEO_BUILDER_SOURCE,\n} from './bridge-protocol';\nimport { type BuilderChromeHandle, injectBuilderChrome } from './builder-chrome';\nimport { type BuilderPanelHandle, injectBuilderPanel } from './builder-panel';\nimport { attachDesignManipulator, type DesignManipulatorHandle } from './design-manipulator';\nimport { type ElementPickerHandle, startElementPicker } from './element-picker';\nimport { elementLabelText, INTERACTIVE_SELECTOR } from './interactive-elements';\n\nexport interface BuilderModeHandle {\n /** Desconecta el puente y limpia picker/preview/panel. */\n teardown(): void;\n}\n\n/** Selección del bloque code crudo (ver `attachRawBlock`). */\ninterface RawBlockHandle {\n /** Resalta el bloque si `id` es el suyo; con otro id (o null) lo oculta. */\n select(id: string | null): void;\n detach(): 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 */\n/** Estilos del modal de confirmación (shadow DOM, tokens OnUser: coral #b74d00, success #e6f6df/#406a31). */\nconst CONFIRMATION_STYLES = `\n:host { all: initial; }\n.veo-confirm-backdrop {\n position: fixed; inset: 0; z-index: 2147483645;\n background: rgba(20, 16, 14, 0.45);\n}\n.veo-confirm {\n position: fixed; left: 50%; top: 50%; transform: translate(-50%, -50%);\n z-index: 2147483646; box-sizing: border-box;\n width: min(432px, calc(100vw - 32px)); padding: 28px 24px 24px;\n border-radius: 16px; background: #fff; color: #1d1917;\n box-shadow: 0 24px 64px rgba(0,0,0,0.28);\n font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif;\n text-align: center;\n}\n.veo-confirm-check {\n width: 64px; height: 64px; margin: 0 auto; border-radius: 50%;\n background: #e6f6df; color: #2f9a4e; display: flex; align-items: center; justify-content: center;\n}\n.veo-confirm-check svg { width: 30px; height: 30px; }\n.veo-confirm-title { margin: 18px 0 0; font-size: 17px; font-weight: 600; }\n.veo-confirm-msg { margin: 8px 0 0; font-size: 13px; color: #6b6461; }\n.veo-confirm-rows {\n margin: 18px 0 0; padding: 12px 14px; border-radius: 12px; background: #f6f2ef; text-align: left;\n}\n.veo-confirm-row { display: flex; justify-content: space-between; gap: 16px; font-size: 13px; padding: 4px 0; }\n.veo-confirm-row dt { color: #6b6461; margin: 0; }\n.veo-confirm-row dd { margin: 0; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.veo-confirm-btn {\n display: block; width: 100%; margin-top: 18px; height: 44px; border: 0; border-radius: 10px;\n background: #b74d00; color: #fff; font: inherit; font-size: 15px; font-weight: 600; cursor: pointer;\n}\n.veo-confirm-btn:hover { background: #953c00; }\n.veo-confirm-btn:focus-visible { outline: 3px solid rgba(183,77,0,0.35); outline-offset: 2px; }\n`;\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 /** Barras del editor (topbar + pasos) sobre la app; solo en modo panel. */\n let chrome: BuilderChromeHandle | null = null;\n let staticTarget: Window | null = null;\n let manipulator: DesignManipulatorHandle | null = null;\n let dropTarget: BlockDropTargetHandle | null = null;\n /** Detach del listener de clic simple sobre la tarjeta (→ «Agregar bloque»). */\n let cardClick: (() => void) | null = null;\n /** Selección del bloque code CRUDO (inline de un solo bloque code, sin tarjeta). */\n let rawBlock: RawBlockHandle | null = null;\n /** Bloque seleccionado en la app (id local del panel); sobrevive a los re-renders. */\n let selectedBlockId: string | 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 /** Modo vista previa (ojo de la topbar): guía sin editor ni barras. */\n let previewMode = false;\n /** Disparador por elemento objetivo armado para la preview (click/hover). */\n let previewTrigger: (() => void) | null = null;\n /** Ya se disparó: las siguientes previews se pintan directo hasta que se cierre. */\n let previewFired = false;\n /** «Retrasar la aparición» en curso para la preview (timer de delayMs). */\n let previewDelay: ReturnType<typeof setTimeout> | null = null;\n /**\n * El autor cerró la guía con ✕. Con Automático + Elemento objetivo la guía ya\n * arrancó sola; tras cerrarla debe esperar la interacción con el elemento\n * (como el runtime), no repintarse al instante.\n */\n let previewDismissed = false;\n /** Si la tarjeta estaba visible al entrar en vista previa (se restaura al salir). */\n let panelWasVisible = true;\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 previewStep = (\n cmd: Extract<BuilderCommand, { type: 'preview' }>,\n ): CompositeStep | undefined => {\n const steps = cmd.guide.guideSteps as unknown as CompositeStep[] | undefined;\n return steps?.[cmd.guide.startStepIndex ?? 0];\n };\n const previewMatchesPage = (cmd: Extract<BuilderCommand, { type: 'preview' }>): boolean =>\n stepMatchesPage(previewStep(cmd)?.pageLocation, window.location.href);\n\n const postPreviewStatus = (payload: PreviewStatus): void =>\n post({ type: 'preview-status', payload });\n\n const detachPreviewTools = (): void => {\n manipulator?.detach();\n manipulator = null;\n dropTarget?.detach();\n dropTarget = null;\n cardClick?.();\n cardClick = null;\n rowHover?.();\n rowHover = null;\n hoverRowId = null;\n hoverCard = false;\n rawBlock?.detach();\n rawBlock = null;\n // Sin herramientas no hay preview «editable» pintada: el próximo comando\n // igual no debe parchearse en el lugar (saltaría el enganche de clics,\n // marcos y hover, p. ej. al salir de vista previa). Se repinta completo.\n shownPreview = null;\n };\n\n const withholdPreview = (): void => {\n detachPreviewTools();\n shownPreview = null;\n closeGuidePreview();\n };\n\n /**\n * Marco de selección: aire alrededor del bloque (el «tamaño por defecto» al\n * seleccionar) y hueco de la barra. Sin alto mínimo: un marco más alto que\n * el bloque se montaba sobre los bloques vecinos.\n */\n /** Aire del marco alrededor del bloque (los bloques ya no llevan padding propio). */\n const FRAME_PAD = 4;\n const FRAME_MIN_H = 0;\n const TOOLBAR_H = 30;\n\n const ICON = {\n pencil:\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125\"/></svg>',\n copy: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M16.5 8.25V6a2.25 2.25 0 0 0-2.25-2.25H6A2.25 2.25 0 0 0 3.75 6v8.25A2.25 2.25 0 0 0 6 16.5h2.25m8.25-8.25H18a2.25 2.25 0 0 1 2.25 2.25V18A2.25 2.25 0 0 1 18 20.25h-7.5A2.25 2.25 0 0 1 8.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 0 0-2.25 2.25v6\"/></svg>',\n trash:\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0\"/></svg>',\n };\n const ICON_MOVE = {\n left: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19.5 12h-15m0 0 6.75 6.75M4.5 12l6.75-6.75\"/></svg>',\n right:\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4.5 12h15m0 0-6.75-6.75M19.5 12l-6.75 6.75\"/></svg>',\n };\n\n /**\n * Qué movimientos admite un bloque DENTRO de su fila (espejo de\n * `moveBlockByLayout` del panel): izquierda/derecha si la fila tiene una\n * columna a ese lado.\n */\n const moveAbility = (blocks: StepBlock[], blockId: string): { left: boolean; right: boolean } => {\n for (const row of groupLayout(blocks)) {\n for (let c = 0; c < row.columns.length; c++) {\n const col = row.columns[c] as (typeof row.columns)[number];\n if (!col.blocks.some((b) => b.block.editorId === blockId)) continue;\n return { left: c > 0, right: c < row.columns.length - 1 };\n }\n }\n return { left: false, right: false };\n };\n\n /** Bloques del paso mostrado (preview), para calcular disponibilidad de mover. */\n let previewBlocks: StepBlock[] = [];\n /**\n * Editor de fila. Una fila no tiene id propio: se identifica por el `editorId`\n * de su PRIMER bloque. `hoverRowId` = fila bajo el mouse; `selectedRowId` = la\n * que el panel está editando (`select-row`). El marco/barra de fila se pinta\n * para la fila editada, si no la del bloque seleccionado, si no la del hover.\n */\n let hoverRowId: string | null = null;\n let selectedRowId: string | null = null;\n let rowHover: (() => void) | null = null;\n /** Hover sobre el contenedor (tarjeta): contorno + pestañas «Editar contenedor / filas». */\n let hoverCard = false;\n /** Sección que muestra el panel (del último `editor-state`): marca la pestaña activa. */\n let panelSection: EditorChromeState['section'] | null = null;\n /** Comando cuya preview está pintada ahora (base del parche en el lugar). */\n let shownPreview: Extract<BuilderCommand, { type: 'preview' }> | null = null;\n\n /** Firma estructural de un paso: todo salvo texto/html/estilo de cada bloque. */\n const structureOf = (step: CompositeStep | undefined): string => {\n if (!step) return '';\n const { blocks, ...rest } = step;\n return JSON.stringify({\n rest,\n blocks: (blocks ?? []).map((b) => {\n const { text: _t, html: _h, style: _s, ...keep } = b as StepBlock;\n return keep;\n }),\n });\n };\n\n /**\n * Parche en el lugar (edición): si el paso mostrado tiene la MISMA estructura\n * que el nuevo (bloques, layout, diseño del contenedor, acciones), solo se\n * reconstruyen los nodos de los bloques cuyo texto/html/estilo cambió. Así\n * escribir no repinta (ni hace parpadear) toda la tarjeta. Devuelve false si\n * hay que repintar entera.\n */\n const tryPatchPreview = (cmd: Extract<BuilderCommand, { type: 'preview' }>): boolean => {\n const prev = shownPreview;\n if (!prev || cmd.guide.guideType !== 'composite' || prev.guide.guideType !== 'composite') {\n return false;\n }\n const idx = cmd.guide.startStepIndex ?? 0;\n if ((prev.guide.startStepIndex ?? 0) !== idx) return false;\n // Lo que no es el paso (activación, badge abierto, etc.) también debe ser igual.\n const guideSig = (g: typeof cmd.guide): string =>\n JSON.stringify({ ...g, guideSteps: undefined });\n if (guideSig(prev.guide) !== guideSig(cmd.guide) || prev.editable !== cmd.editable)\n return false;\n const host = document.querySelector<HTMLElement>('[data-veo-guide]');\n const card = host ? previewCard(host) : null;\n if (!host || !card) return false;\n const prevStep = (prev.guide.guideSteps as unknown as CompositeStep[])[idx];\n const nextStep = (cmd.guide.guideSteps as unknown as CompositeStep[])[idx];\n if (!prevStep || !nextStep) return false;\n if (structureOf(prevStep) !== structureOf(nextStep)) return false;\n const doc = card.ownerDocument;\n const prevBlocks = prevStep.blocks ?? [];\n const nextBlocks = nextStep.blocks ?? [];\n for (let i = 0; i < nextBlocks.length; i++) {\n const a = prevBlocks[i] as StepBlock;\n const b = nextBlocks[i] as StepBlock;\n if (\n a.text === b.text &&\n a.html === b.html &&\n JSON.stringify(a.style) === JSON.stringify(b.style)\n ) {\n continue;\n }\n if (!b.editorId) return false;\n const node = card.querySelector<HTMLElement>(`[data-veo-block-id=\"${b.editorId}\"]`);\n if (!node) return false;\n if (b.type === 'button') {\n // Texto, preset y estilos; la acción no cambió (está en la estructura).\n node.textContent = b.text?.trim() || 'OK';\n node.removeAttribute('style');\n node.classList.remove('veo-guide-cta--secondary', 'veo-guide-cta--link');\n const st = (b.style ?? {}) as Record<string, unknown>;\n if (st.preset === 'secondary' || st.preset === 'link') {\n node.classList.add(`veo-guide-cta--${st.preset}`);\n }\n if (typeof st.ariaLabel === 'string' && st.ariaLabel.trim()) {\n node.setAttribute('aria-label', st.ariaLabel.trim());\n } else node.removeAttribute('aria-label');\n applyBlockStyle(node, b.style, 'button');\n continue;\n }\n if (b.type === 'code' || b.type === 'form') return false;\n const fresh =\n buildContentBlock(b, doc, { editing: true }) ??\n (() => {\n const el = doc.createElement('div');\n el.className = 'veo-block-placeholder';\n el.textContent =\n b.type === 'image'\n ? 'Imagen (sin URL)'\n : b.type === 'video'\n ? 'Video (elige proveedor y pega la URL)'\n : 'Bloque vacío';\n return el;\n })();\n fresh.dataset.veoBlock = node.dataset.veoBlock ?? String(i);\n fresh.dataset.veoBlockId = b.editorId;\n node.replaceWith(fresh);\n }\n shownPreview = cmd;\n previewBlocks = nextBlocks;\n // La geometría pudo cambiar (más/menos texto): marco, barra y huecos.\n applyBlockHighlight(host, idx);\n renderGapZones(host, idx, nextBlocks);\n return true;\n };\n\n /** Card de la preview activa (shadow root del host). */\n const previewCard = (host: HTMLElement): HTMLElement | null =>\n host.shadowRoot?.querySelector<HTMLElement>('.veo-card') ?? null;\n\n /** Quita el resaltado y la barra del bloque seleccionado (sin tocar el estado). */\n const clearBlockHighlight = (host: HTMLElement): void => {\n const card = previewCard(host);\n if (!card) return;\n for (const el of card.querySelectorAll('.veo-block--selected')) {\n el.classList.remove('veo-block--selected');\n }\n card.querySelector('.veo-block-toolbar')?.remove();\n card.querySelector('.veo-block-frame')?.remove();\n };\n\n /**\n * Resalta el bloque `selectedBlockId` en la preview y le cuelga la barra\n * (editar / duplicar / eliminar) sobre su borde superior derecho. Se llama\n * al seleccionar y tras cada re-render (cada edición repinta la card).\n */\n const applyBlockHighlight = (host: HTMLElement, stepIndex: number): void => {\n clearBlockHighlight(host);\n const card = previewCard(host);\n if (!card) return;\n const el = selectedBlockId\n ? card.querySelector<HTMLElement>(`[data-veo-block-id=\"${selectedBlockId}\"]`)\n : null;\n if (!el || !selectedBlockId) {\n renderRowChrome(host, stepIndex);\n return;\n }\n el.classList.add('veo-block--selected');\n const doc = card.ownerDocument;\n // Marco de selección: rodea al bloque con aire (FRAME_PAD) y tiene un alto\n // cómodo por defecto (FRAME_MIN_H) para que los controles no se pisen con\n // bloques de una línea. Es solo visual: NO cambia el tamaño del bloque.\n // El marco lleva aire alrededor del bloque y se recorta a la caja de su\n // contenedor (columna o contenido de la card), nunca más allá.\n const cs = getComputedStyle(card);\n const padL = Number.parseFloat(cs.paddingLeft) || 0;\n const padT = Number.parseFloat(cs.paddingTop) || 0;\n const padR = Number.parseFloat(cs.paddingRight) || 0;\n const padB = Number.parseFloat(cs.paddingBottom) || 0;\n const parent = el.parentElement;\n const inCol = parent?.classList.contains('veo-col') ? parent : null;\n const boxL = inCol ? inCol.offsetLeft : padL;\n const boxR = inCol ? inCol.offsetLeft + inCol.offsetWidth : card.clientWidth - padR;\n const boxT = padT;\n const boxB = card.clientHeight - padB;\n // La separación entre bloques/filas (BLOCK_GAP en el CSS) deja lugar para\n // el aire del marco Y la línea «+» del hueco sin que se pisen.\n const fx = Math.max(boxL, el.offsetLeft - FRAME_PAD);\n const fr = Math.min(boxR, el.offsetLeft + el.offsetWidth + FRAME_PAD);\n const fw = Math.max(0, fr - fx);\n const fy = Math.max(boxT, el.offsetTop - FRAME_PAD);\n const fb = Math.min(boxB, el.offsetTop + el.offsetHeight + FRAME_PAD);\n const fh = Math.max(FRAME_MIN_H, fb - fy);\n const frame = doc.createElement('div');\n frame.className = 'veo-block-frame';\n frame.setAttribute('data-veo-builder-chrome', '');\n frame.style.left = `${fx}px`;\n frame.style.top = `${fy}px`;\n frame.style.width = `${fw}px`;\n frame.style.height = `${fh}px`;\n card.appendChild(frame);\n const bar = doc.createElement('div');\n bar.className = 'veo-block-toolbar';\n bar.setAttribute('data-veo-builder-chrome', '');\n const blockId = selectedBlockId;\n const mk = (action: BlockToolbarAction, label: string, icon: string, enabled = true): void => {\n const b = doc.createElement('button');\n b.type = 'button';\n b.title = label;\n b.setAttribute('aria-label', label);\n b.className = `veo-block-toolbar-${action}`;\n b.innerHTML = icon;\n b.disabled = !enabled;\n b.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'block-action', payload: { stepIndex, blockId, action } });\n });\n bar.appendChild(b);\n };\n const can = moveAbility(previewBlocks, blockId);\n mk('edit', 'Editar', ICON.pencil);\n mk('duplicate', 'Duplicar', ICON.copy);\n mk('remove', 'Eliminar', ICON.trash);\n // Sin «Subir/Bajar»: la barra solo mueve entre columnas (mock).\n mk('move-left', 'Mover a la izquierda', ICON_MOVE.left, can.left);\n mk('move-right', 'Mover a la derecha', ICON_MOVE.right, can.right);\n // Barra: justo encima del BLOQUE seleccionado, alineada a su borde derecho\n // (esquina superior derecha del bloque). Se mide su alto real una vez en\n // el DOM para pegarla al marco.\n bar.style.right = `${Math.max(0, card.clientWidth - fr)}px`;\n card.appendChild(bar);\n const barH = bar.offsetHeight || TOOLBAR_H;\n // Posición preferida: encima del bloque; alternativa: debajo (si choca con\n // las pestañas del contenedor). Las guarda para `resolveToolbarOverlaps`.\n bar.dataset.veoTopAbove = String(fy - barH - 6);\n bar.dataset.veoTopBelow = String(fb + 6);\n bar.style.top = bar.dataset.veoTopAbove;\n // La fila del bloque seleccionado también muestra su marco y su barra.\n renderRowChrome(host, stepIndex);\n };\n\n /** Rect (coordenadas de la card) de un elemento de chrome posicionado. */\n const chromeRect = (el: HTMLElement) => ({\n left: el.offsetLeft,\n top: el.offsetTop,\n right: el.offsetLeft + el.offsetWidth,\n bottom: el.offsetTop + el.offsetHeight,\n });\n const intersects = (\n a: ReturnType<typeof chromeRect>,\n b: ReturnType<typeof chromeRect>,\n ): boolean => a.left < b.right && b.left < a.right && a.top < b.bottom && b.top < a.bottom;\n\n /**\n * Las tres barras (contenedor, bloque, fila) nunca se tapan entre sí:\n * 1. la del bloque va encima del bloque; si choca con las pestañas del\n * contenedor, pasa debajo del bloque;\n * 2. la de la fila va abajo a la derecha de la fila; si choca con la del\n * bloque, se corre a la izquierda de la fila; si aún choca, se apila\n * debajo de la barra del bloque.\n * Se llama cada vez que se pinta cualquiera de las tres.\n */\n const resolveToolbarOverlaps = (card: HTMLElement): void => {\n const cardBar = card.querySelector<HTMLElement>('.veo-card-toolbar');\n const blockBar = card.querySelector<HTMLElement>('.veo-block-toolbar');\n const rowBar = card.querySelector<HTMLElement>('.veo-row-toolbar');\n if (blockBar?.dataset.veoTopAbove) {\n blockBar.style.top = `${blockBar.dataset.veoTopAbove}px`;\n if (cardBar && intersects(chromeRect(blockBar), chromeRect(cardBar))) {\n blockBar.style.top = `${blockBar.dataset.veoTopBelow}px`;\n }\n }\n if (rowBar?.dataset.veoRight) {\n rowBar.style.left = '';\n rowBar.style.right = `${rowBar.dataset.veoRight}px`;\n rowBar.style.top = `${rowBar.dataset.veoTopBelow}px`;\n const others = [cardBar, blockBar].filter((b): b is HTMLElement => !!b);\n const clashes = () => others.some((o) => intersects(chromeRect(rowBar), chromeRect(o)));\n if (clashes()) {\n rowBar.style.right = '';\n rowBar.style.left = `${rowBar.dataset.veoLeft}px`;\n }\n if (clashes() && blockBar) {\n // Último recurso: apilada justo debajo de la barra del bloque (misma\n // alineación derecha). Una debajo de la otra no se cruzan nunca.\n rowBar.style.left = '';\n rowBar.style.right = `${rowBar.dataset.veoRight}px`;\n rowBar.style.top = `${chromeRect(blockBar).bottom + 6}px`;\n }\n }\n };\n\n /** Rect de un elemento relativo a la card (offsetParent = card, que es relative). */\n const rectOf = (el: HTMLElement) => ({\n left: el.offsetLeft,\n top: el.offsetTop,\n right: el.offsetLeft + el.offsetWidth,\n bottom: el.offsetTop + el.offsetHeight,\n });\n type Rect = ReturnType<typeof rectOf>;\n const union = (rs: Rect[]): Rect | null =>\n rs.length === 0\n ? null\n : rs.reduce((acc, r) => ({\n left: Math.min(acc.left, r.left),\n top: Math.min(acc.top, r.top),\n right: Math.max(acc.right, r.right),\n bottom: Math.max(acc.bottom, r.bottom),\n }));\n\n /**\n * Huecos «+» (mock): al pasar el mouse por el espacio ENTRE elementos aparece\n * una línea azul con un «+»:\n * - horizontal a lo ancho del contenido, entre filas (o arriba/abajo de\n * todas) → nueva FILA;\n * - vertical a lo alto de la fila, entre columnas (o en sus bordes) → nueva\n * COLUMNA en esa fila;\n * - horizontal a lo ancho de la columna, entre bloques apilados → nuevo\n * BLOQUE dentro de esa columna.\n * La estructura sale de `groupLayout` sobre los bloques de la preview (con\n * `editorId`) y la geometría de los nodos etiquetados.\n */\n /**\n * Geometría real de filas y columnas de la card: los bloques miden su\n * contenido, así que sale de sus contenedores (.veo-col / .veo-row) y, en\n * filas de una sola columna sin envoltorio, del ancho del contenido de la\n * card. Cada fila lleva `id` = editorId de su primer bloque (las filas no\n * tienen id propio) y su número de fila del layout.\n */\n const layoutRows = (card: HTMLElement, blocks: StepBlock[]) => {\n const elOf = (b: StepBlock): HTMLElement | null =>\n b.editorId ? card.querySelector<HTMLElement>(`[data-veo-block-id=\"${b.editorId}\"]`) : null;\n const cs = getComputedStyle(card);\n const padL = Number.parseFloat(cs.paddingLeft) || 0;\n const padR = Number.parseFloat(cs.paddingRight) || 0;\n const contentLeft = padL;\n const contentRight = card.clientWidth - padR;\n const rows = groupLayout(blocks)\n .map((row) => {\n const columns = row.columns\n .map((col) => {\n const items = col.blocks\n .map(({ block }) => ({ block, el: elOf(block) }))\n .filter(\n (x): x is { block: StepBlock; el: HTMLElement } => !!x.el && !!x.block.editorId,\n );\n const blocksRect = union(items.map((x) => rectOf(x.el)));\n if (!blocksRect) return null;\n const colEl = items[0]?.el.parentElement;\n const rect = colEl?.classList.contains('veo-col') ? rectOf(colEl) : blocksRect;\n return { items, rect };\n })\n .filter((c): c is NonNullable<typeof c> => c !== null);\n const blocksRect = union(columns.map((c) => c.rect));\n if (!blocksRect) return null;\n const rowEl = columns[0]?.items[0]?.el.parentElement?.parentElement;\n const rect = rowEl?.classList.contains('veo-row')\n ? rectOf(rowEl)\n : { ...blocksRect, left: contentLeft, right: contentRight };\n const id = columns[0]?.items[0]?.block.editorId as string;\n return { id, row: row.row, columns, rect };\n })\n .filter((r): r is NonNullable<typeof r> => r !== null);\n return { rows, content: { left: contentLeft, right: contentRight } };\n };\n\n /** Quita el marco y la barra de fila (sin tocar el estado). */\n const clearRowChrome = (card: HTMLElement): void => {\n card.querySelector('.veo-row-frame')?.remove();\n card.querySelector('.veo-row-toolbar')?.remove();\n };\n\n /**\n * Marco + barra de FILA (mock): al pasar el mouse por una fila aparece su\n * contorno y, bajo su esquina derecha, «Editar fila | duplicar». También se\n * muestra para la fila del bloque seleccionado y para la fila que el panel\n * está editando. La barra postea `row-action` con el primer bloque de la fila.\n */\n const renderRowChrome = (host: HTMLElement, stepIndex: number): void => {\n const card = previewCard(host);\n if (!card) return;\n clearRowChrome(card);\n resolveToolbarOverlaps(card);\n const { rows } = layoutRows(card, previewBlocks);\n const rowOfSelected = selectedBlockId\n ? rows.find((r) =>\n r.columns.some((c) => c.items.some((i) => i.block.editorId === selectedBlockId)),\n )\n : undefined;\n const target =\n (selectedRowId ? rows.find((r) => r.id === selectedRowId) : undefined) ??\n rowOfSelected ??\n (hoverRowId ? rows.find((r) => r.id === hoverRowId) : undefined);\n if (!target) return;\n const doc = card.ownerDocument;\n const cs = getComputedStyle(card);\n const padT = Number.parseFloat(cs.paddingTop) || 0;\n const padB = Number.parseFloat(cs.paddingBottom) || 0;\n const PAD = 6; // el marco de fila rodea al marco del bloque\n const fx = Math.max(0, target.rect.left - PAD);\n const fr = Math.min(card.clientWidth, target.rect.right + PAD);\n const fy = Math.max(Math.min(padT, target.rect.top), target.rect.top - PAD);\n const fb = Math.min(\n Math.max(card.clientHeight - padB, target.rect.bottom),\n target.rect.bottom + PAD,\n );\n const frame = doc.createElement('div');\n frame.className = 'veo-row-frame';\n frame.setAttribute('data-veo-builder-chrome', '');\n frame.style.left = `${fx}px`;\n frame.style.top = `${fy}px`;\n frame.style.width = `${Math.max(0, fr - fx)}px`;\n frame.style.height = `${Math.max(0, fb - fy)}px`;\n card.appendChild(frame);\n const bar = doc.createElement('div');\n bar.className = 'veo-row-toolbar';\n bar.setAttribute('data-veo-builder-chrome', '');\n const blockId = target.id;\n const mk = (action: RowToolbarAction, label: string, icon: string, text?: string): void => {\n const b = doc.createElement('button');\n b.type = 'button';\n b.title = label;\n b.setAttribute('aria-label', label);\n b.className = `veo-row-toolbar-${action}`;\n b.innerHTML = icon;\n if (text) b.append(text);\n b.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'row-action', payload: { stepIndex, blockId, action } });\n });\n bar.appendChild(b);\n };\n mk('edit', 'Editar fila', ICON.pencil, 'Editar fila');\n mk('duplicate', 'Duplicar fila', ICON.copy);\n mk('remove', 'Eliminar fila', ICON.trash);\n card.appendChild(bar);\n // Posición preferida: abajo a la derecha de la fila. Alternativas (si choca\n // con otra barra): a la izquierda, y si no, apilada bajo la barra del bloque.\n bar.dataset.veoRight = String(Math.max(0, card.clientWidth - fr));\n bar.dataset.veoLeft = String(fx);\n bar.dataset.veoTopBelow = String(fb + 6);\n resolveToolbarOverlaps(card);\n };\n\n /**\n * Contorno + pestañas del CONTENEDOR (mock): al pasar el mouse por la tarjeta\n * se marca su borde y aparecen, centradas sobre el borde superior, «Editar\n * contenedor» (abre el paso en el panel) y «Editar filas» (abre la\n * estructura de filas y bloques). Postean `card-action`.\n */\n const renderCardChrome = (host: HTMLElement, stepIndex: number): void => {\n const card = previewCard(host);\n if (!card) return;\n card.querySelector('.veo-card-frame')?.remove();\n card.querySelector('.veo-card-toolbar')?.remove();\n if (!hoverCard) {\n resolveToolbarOverlaps(card);\n return;\n }\n const doc = card.ownerDocument;\n const frame = doc.createElement('div');\n frame.className = 'veo-card-frame';\n frame.setAttribute('data-veo-builder-chrome', '');\n card.appendChild(frame);\n const bar = doc.createElement('div');\n bar.className = 'veo-card-toolbar';\n bar.setAttribute('data-veo-builder-chrome', '');\n const mk = (action: CardToolbarAction, label: string, active: boolean): void => {\n const b = doc.createElement('button');\n b.type = 'button';\n b.className = `veo-card-toolbar-${action}${active ? ' is-active' : ''}`;\n b.setAttribute('aria-pressed', active ? 'true' : 'false');\n b.textContent = label;\n b.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'card-action', payload: { stepIndex, action } });\n });\n bar.appendChild(b);\n };\n mk('edit-container', 'Editar contenedor', panelSection === 'step');\n mk('edit-rows', 'Editar filas', panelSection === 'structure');\n card.appendChild(bar);\n // A caballo del borde superior de la tarjeta (mitad afuera, mitad adentro).\n bar.style.top = `${-Math.round((bar.offsetHeight || 34) / 2)}px`;\n resolveToolbarOverlaps(card);\n };\n\n /**\n * Hover de filas: al mover el mouse sobre la card se calcula qué fila está\n * debajo (geometría de `layoutRows`) y se pinta su marco/barra. Salir de la\n * card (o de todas las filas) lo quita; pasar a la barra de la fila lo\n * conserva. Una fila seleccionada/editada tiene prioridad (ver renderRowChrome).\n */\n const attachRowHover = (host: HTMLElement, stepIndex: number): (() => void) => {\n const onMove = (e: MouseEvent): void => {\n const card = previewCard(host);\n if (!card) return;\n // Contenedor: el puntero está sobre la tarjeta o sobre sus pestañas.\n const overCard = e\n .composedPath()\n .some(\n (n) =>\n n instanceof Element &&\n (n.classList.contains('veo-card') || n.classList.contains('veo-card-toolbar')),\n );\n if (overCard !== hoverCard) {\n hoverCard = overCard;\n renderCardChrome(host, stepIndex);\n }\n if (\n e\n .composedPath()\n .some((n) => n instanceof Element && n.classList.contains('veo-row-toolbar'))\n ) {\n return; // sobre la barra de la fila: se mantiene\n }\n const rect = card.getBoundingClientRect();\n const x = e.clientX - rect.left - card.clientLeft;\n const y = e.clientY - rect.top - card.clientTop;\n // Camino hacia la barra: la barra cuelga 6px bajo la fila y puede tapar\n // la fila siguiente. Mientras el puntero esté en la franja que va del\n // borde de la fila a la barra (con aire), se conserva la fila actual.\n const bar = card.querySelector<HTMLElement>('.veo-row-toolbar');\n if (bar) {\n const AIR = 10;\n if (\n x >= bar.offsetLeft - AIR &&\n x <= bar.offsetLeft + bar.offsetWidth + AIR &&\n y >= bar.offsetTop - 14 &&\n y <= bar.offsetTop + bar.offsetHeight + AIR\n ) {\n return;\n }\n }\n const TOL = 6;\n const hit = layoutRows(card, previewBlocks).rows.find(\n (r) =>\n x >= r.rect.left - TOL &&\n x <= r.rect.right + TOL &&\n y >= r.rect.top - TOL &&\n y <= r.rect.bottom + TOL,\n );\n const next = hit?.id ?? null;\n if (next === hoverRowId) return;\n hoverRowId = next;\n renderRowChrome(host, stepIndex);\n };\n const onLeave = (): void => {\n if (hoverCard) {\n hoverCard = false;\n renderCardChrome(host, stepIndex);\n }\n if (hoverRowId === null) return;\n hoverRowId = null;\n renderRowChrome(host, stepIndex);\n };\n host.addEventListener('mousemove', onMove);\n host.addEventListener('mouseleave', onLeave);\n return () => {\n host.removeEventListener('mousemove', onMove);\n host.removeEventListener('mouseleave', onLeave);\n };\n };\n\n const renderGapZones = (host: HTMLElement, stepIndex: number, blocks: StepBlock[]): void => {\n const card = previewCard(host);\n if (!card) return;\n for (const z of card.querySelectorAll('.veo-gap')) z.remove();\n const doc = card.ownerDocument;\n const GAP = 18; // grosor de la zona de hover\n const EDGE = 4; // separación de las líneas de borde respecto al contenido\n\n const zone = (\n kind: 'h' | 'v',\n x: number,\n y: number,\n w: number,\n h: number,\n label: string,\n blockId: string,\n action: BlockLayoutAction,\n ): void => {\n const z = doc.createElement('div');\n z.className = `veo-gap veo-gap--${kind}`;\n z.setAttribute('data-veo-builder-chrome', '');\n z.dataset.veoGapAction = action;\n z.style.left = `${x}px`;\n z.style.top = `${y}px`;\n z.style.width = `${Math.max(w, GAP)}px`;\n z.style.height = `${Math.max(h, GAP)}px`;\n const line = doc.createElement('i');\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.title = label;\n btn.setAttribute('aria-label', label);\n btn.textContent = '+';\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'block-layout', payload: { stepIndex, blockId, action } });\n });\n z.append(line, btn);\n card.appendChild(z);\n };\n\n const { rows, content } = layoutRows(card, blocks);\n if (rows.length === 0) return;\n const cw = content.right - content.left;\n\n // Filas: arriba de la primera, entre filas, debajo de la última.\n rows.forEach((row, k) => {\n const first = row.columns[0]?.items[0]?.block.editorId as string;\n if (k === 0) {\n zone(\n 'h',\n content.left,\n row.rect.top - EDGE - GAP,\n cw,\n GAP,\n 'Agregar fila',\n first,\n 'row-before',\n );\n } else {\n const prev = rows[k - 1] as (typeof rows)[number];\n const y = (prev.rect.bottom + row.rect.top) / 2 - GAP / 2;\n zone('h', content.left, y, cw, GAP, 'Agregar fila', first, 'row-before');\n }\n if (k === rows.length - 1) {\n zone(\n 'h',\n content.left,\n row.rect.bottom + EDGE,\n cw,\n GAP,\n 'Agregar fila',\n first,\n 'row-after',\n );\n }\n });\n\n // Columnas: borde izquierdo, entre columnas, borde derecho (por fila).\n for (const row of rows) {\n const rh = row.rect.bottom - row.rect.top;\n row.columns.forEach((col, j) => {\n const id = col.items[0]?.block.editorId as string;\n if (j === 0) {\n zone(\n 'v',\n row.rect.left - EDGE - GAP,\n row.rect.top,\n GAP,\n rh,\n 'Agregar columna',\n id,\n 'col-before',\n );\n } else {\n const prev = row.columns[j - 1] as (typeof row.columns)[number];\n const x = (prev.rect.right + col.rect.left) / 2 - GAP / 2;\n zone('v', x, row.rect.top, GAP, rh, 'Agregar columna', id, 'col-before');\n }\n if (j === row.columns.length - 1) {\n zone(\n 'v',\n row.rect.right + EDGE,\n row.rect.top,\n GAP,\n rh,\n 'Agregar columna',\n id,\n 'col-after',\n );\n }\n });\n }\n\n // Bloques apilados dentro de una columna: entre bloques; y debajo del último\n // si la columna es más baja que su fila (hay hueco para apilar).\n for (const row of rows) {\n for (const col of row.columns) {\n const w = col.rect.right - col.rect.left;\n col.items.forEach((it, i) => {\n const next = col.items[i + 1];\n if (next) {\n const a = rectOf(it.el);\n const b = rectOf(next.el);\n const y = (a.bottom + b.top) / 2 - GAP / 2;\n zone(\n 'h',\n col.rect.left,\n y,\n w,\n GAP,\n 'Agregar bloque',\n it.block.editorId as string,\n 'stack-after',\n );\n } else if (row.columns.length > 1 && col.rect.bottom < row.rect.bottom - GAP) {\n zone(\n 'h',\n col.rect.left,\n col.rect.bottom + EDGE,\n w,\n GAP,\n 'Agregar bloque',\n it.block.editorId as string,\n 'stack-after',\n );\n }\n });\n }\n }\n };\n\n /**\n * Clics sobre la preview (modo edición). Se captura en el host para ganar a\n * los listeners de los bloques (un botón de la guía NO ejecuta su acción al\n * editarlo). Un arrastre (manipulador) también termina en `click` y se\n * descarta por distancia.\n * - sobre un bloque → se selecciona y el panel abre su editor;\n * - sobre la tarjeta (fuera de bloques) → se deselecciona y el panel abre\n * «Agregar bloque».\n */\n const attachCardClick = (host: HTMLElement, stepIndex: number): (() => void) => {\n let downAt: { x: number; y: number } | null = null;\n const onDown = (e: MouseEvent): void => {\n downAt = { x: e.clientX, y: e.clientY };\n };\n const onClick = (e: MouseEvent): void => {\n const path = e.composedPath();\n if (\n path.some(\n (n) =>\n n instanceof Element &&\n (n.classList.contains('veo-block-toolbar') ||\n n.classList.contains('veo-row-toolbar') ||\n n.classList.contains('veo-card-toolbar') ||\n n.classList.contains('veo-gap')),\n )\n ) {\n return; // las barras y los huecos «+» manejan sus propios clics\n }\n const inCard = path.some((n) => n instanceof Element && n.classList.contains('veo-card'));\n if (!inCard) return;\n if (downAt && Math.hypot(e.clientX - downAt.x, e.clientY - downAt.y) > 4) return;\n const blockEl = path.find(\n (n): n is HTMLElement => n instanceof HTMLElement && !!n.dataset.veoBlockId,\n );\n if (blockEl) {\n // Botones/enlaces del bloque no ejecutan su acción mientras se edita.\n if (path.some((n) => n instanceof Element && n.matches('button, a'))) {\n e.preventDefault();\n e.stopPropagation();\n }\n selectedBlockId = blockEl.dataset.veoBlockId ?? null;\n applyBlockHighlight(host, stepIndex);\n if (selectedBlockId) {\n post({ type: 'block-clicked', payload: { stepIndex, blockId: selectedBlockId } });\n }\n return;\n }\n const interactive = path.some(\n (n) =>\n n instanceof Element &&\n n.matches('button, a, input, textarea, select, label, [contenteditable]'),\n );\n if (interactive) return;\n selectedBlockId = null;\n clearBlockHighlight(host);\n renderRowChrome(host, stepIndex);\n post({ type: 'card-clicked', payload: { stepIndex } });\n };\n host.addEventListener('mousedown', onDown, true);\n host.addEventListener('click', onClick, true);\n return () => {\n host.removeEventListener('mousedown', onDown, true);\n host.removeEventListener('click', onClick, true);\n };\n };\n\n /**\n * Bloque code CRUDO: una guía inline cuyo único bloque es code se inyecta tal\n * cual en el DOM real (sin host, shadow ni tarjeta) para duplicar un elemento\n * nativo. No hay `.veo-card` a la que colgarle el clic ni el marco, así que\n * el editor lo selecciona aparte: un clic sobre cualquiera de sus elementos\n * (marcados con `data-veo-raw-block`) lo resalta con un marco FIJO sobre su\n * caja real y una barra (Editar / Eliminar; duplicar y mover no aplican: es\n * el único bloque del paso). Los enlaces/botones del HTML no ejecutan su\n * acción mientras se edita, igual que en la tarjeta. Alrededor lleva los\n * mismos huecos «+» que la tarjeta (fila arriba/abajo, columna izq/der):\n * agregar un bloque convierte el paso en tarjeta normal con todo el editor.\n */\n const attachRawBlock = (stepIndex: number, blockId: string): RawBlockHandle | null => {\n const nodes = Array.from(\n document.querySelectorAll<HTMLElement>(`[${RAW_BLOCK_ATTR}=\"${blockId}\"]`),\n );\n if (nodes.length === 0) return null;\n const doc = document;\n const box = doc.createElement('div');\n box.setAttribute('data-veo-builder-chrome', '');\n box.style.cssText = 'position:fixed;left:0;top:0;width:0;height:0;z-index:2147483646;';\n box.style.display = 'none';\n const shadow = box.attachShadow({ mode: 'open' });\n const style = doc.createElement('style');\n style.textContent = GUIDE_STYLES;\n shadow.appendChild(style);\n const frame = doc.createElement('div');\n frame.className = 'veo-block-frame';\n frame.style.position = 'fixed';\n const bar = doc.createElement('div');\n bar.className = 'veo-block-toolbar';\n bar.style.position = 'fixed';\n const mk = (action: BlockToolbarAction, label: string, icon: string, enabled = true): void => {\n const b = doc.createElement('button');\n b.type = 'button';\n b.title = label;\n b.setAttribute('aria-label', label);\n b.className = `veo-block-toolbar-${action}`;\n b.innerHTML = icon;\n b.disabled = !enabled;\n b.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'block-action', payload: { stepIndex, blockId, action } });\n });\n bar.appendChild(b);\n };\n mk('edit', 'Editar', ICON.pencil);\n mk('duplicate', 'Duplicar', ICON.copy, false);\n mk('remove', 'Eliminar', ICON.trash);\n mk('move-left', 'Mover a la izquierda', ICON_MOVE.left, false);\n mk('move-right', 'Mover a la derecha', ICON_MOVE.right, false);\n frame.style.display = 'none';\n bar.style.display = 'none';\n // Huecos «+» (siempre visibles al hover, sin selección): misma geometría\n // que `renderGapZones` pero fijos sobre la caja real del bloque crudo.\n const GAP = 18;\n const EDGE = 4;\n const gap = (kind: 'h' | 'v', label: string, action: BlockLayoutAction): HTMLElement => {\n const z = doc.createElement('div');\n z.className = `veo-gap veo-gap--${kind}`;\n z.style.position = 'fixed';\n z.dataset.veoGapAction = action;\n const line = doc.createElement('i');\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.title = label;\n btn.setAttribute('aria-label', label);\n btn.textContent = '+';\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'block-layout', payload: { stepIndex, blockId, action } });\n });\n z.append(line, btn);\n return z;\n };\n const gaps = {\n top: gap('h', 'Agregar fila', 'row-before'),\n bottom: gap('h', 'Agregar fila', 'row-after'),\n left: gap('v', 'Agregar columna', 'col-before'),\n right: gap('v', 'Agregar columna', 'col-after'),\n };\n shadow.append(frame, bar, gaps.top, gaps.bottom, gaps.left, gaps.right);\n doc.body.appendChild(box);\n box.style.display = '';\n\n let visible = false;\n const place = (el: HTMLElement, x: number, y: number, w: number, h: number): void => {\n el.style.left = `${x}px`;\n el.style.top = `${y}px`;\n el.style.width = `${w}px`;\n el.style.height = `${h}px`;\n };\n const reposition = (): void => {\n const live = nodes.filter((n) => n.isConnected);\n if (live.length === 0) return;\n let l = Number.POSITIVE_INFINITY;\n let t = Number.POSITIVE_INFINITY;\n let r = Number.NEGATIVE_INFINITY;\n let b = Number.NEGATIVE_INFINITY;\n for (const n of live) {\n const rc = n.getBoundingClientRect();\n if (rc.width === 0 && rc.height === 0) continue;\n l = Math.min(l, rc.left);\n t = Math.min(t, rc.top);\n r = Math.max(r, rc.right);\n b = Math.max(b, rc.bottom);\n }\n if (!Number.isFinite(l)) return;\n place(gaps.top, l, t - EDGE - GAP, r - l, GAP);\n place(gaps.bottom, l, b + EDGE, r - l, GAP);\n place(gaps.left, l - EDGE - GAP, t, GAP, b - t);\n place(gaps.right, r + EDGE, t, GAP, b - t);\n if (!visible) return;\n place(frame, l, t, r - l, b - t);\n const bh = bar.offsetHeight || TOOLBAR_H;\n const bw = bar.offsetWidth;\n bar.style.left = `${Math.max(0, r - bw)}px`;\n bar.style.top = `${Math.max(0, t - bh - 6)}px`;\n };\n const select = (id: string | null): void => {\n visible = id === blockId;\n frame.style.display = visible ? '' : 'none';\n bar.style.display = visible ? '' : 'none';\n reposition();\n };\n reposition();\n const onClick = (e: MouseEvent): void => {\n const path = e.composedPath();\n if (!nodes.some((n) => path.includes(n))) return;\n // Botones/enlaces del HTML no ejecutan su acción mientras se edita.\n if (path.some((n) => n instanceof Element && n.matches('button, a'))) {\n e.preventDefault();\n e.stopPropagation();\n }\n selectedBlockId = blockId;\n select(blockId);\n post({ type: 'block-clicked', payload: { stepIndex, blockId } });\n };\n doc.addEventListener('click', onClick, true);\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n return {\n select,\n detach: () => {\n doc.removeEventListener('click', onClick, true);\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n box.remove();\n },\n };\n };\n\n /**\n * Aplica la preview respetando el targeting de página y (con `honorTrigger`)\n * el dispositivo; si no aplica, la cierra y le cuenta al panel por qué.\n */\n const applyPreviewGated = (cmd: Extract<BuilderCommand, { type: 'preview' }>): void => {\n // «Mostrar ahora» (honorTrigger:false) es un disparo manual: cuenta como si\n // el elemento objetivo/retraso ya se hubiera cumplido. Lo que se recuerda\n // para re-aplicar (cerrar con ✕, navegar, entrar/salir de vista previa) es\n // la versión que SÍ honra la activación; si se guardara tal cual, al cerrar\n // la guía se repintaría al instante y no habría forma de quitarla.\n const showNow = !cmd.honorTrigger;\n if (showNow) {\n disarmPreviewTrigger();\n cancelPreviewDelay();\n previewFired = true;\n previewDismissed = false;\n }\n lastPreview = showNow ? { ...cmd, honorTrigger: true } : cmd;\n if (!previewMatchesPage(cmd)) {\n cancelPreviewDelay();\n withholdPreview();\n postPreviewStatus({\n state: 'page-mismatch',\n pattern: previewStep(cmd)?.pageLocation?.pattern ?? '',\n });\n return;\n }\n const devices = cmd.guide.activationRules?.devices;\n if (!showNow && previewMode && devices && !isDeviceAllowed(devices)) {\n cancelPreviewDelay();\n withholdPreview();\n postPreviewStatus({ state: 'device-mismatch', devices: devices as 'desktop' | 'mobile' });\n return;\n }\n applyPreview(lastPreview);\n };\n\n const disarmPreviewTrigger = (): void => {\n previewTrigger?.();\n previewTrigger = null;\n };\n\n const cancelPreviewDelay = (): void => {\n if (previewDelay) clearTimeout(previewDelay);\n previewDelay = null;\n };\n\n /**\n * Elemento objetivo: arma un listener delegado (click, y hover si aplica)\n * sobre `selector`; al disparar, pinta la preview. Ignora nuestros overlays.\n */\n const armPreviewTrigger = (selector: string, trigger: 'on_click' | 'on_hover'): void => {\n disarmPreviewTrigger();\n const onFire = (e: Event): void => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n if (target.closest('[data-veo-builder-chrome],[data-veo-builder-panel],[data-veo-picker]')) {\n return;\n }\n try {\n if (!target.closest(selector)) return;\n } catch {\n return;\n }\n disarmPreviewTrigger();\n previewFired = true;\n previewDismissed = false;\n if (lastPreview) applyPreviewGated(lastPreview);\n };\n document.addEventListener('click', onFire, true);\n if (trigger === 'on_hover') document.addEventListener('mouseover', onFire, true);\n previewTrigger = () => {\n document.removeEventListener('click', onFire, true);\n document.removeEventListener('mouseover', onFire, true);\n };\n postPreviewStatus({ state: 'waiting-trigger', trigger, selector });\n };\n\n /**\n * «Retrasar la aparición»: la preview espera `delayMs` como el runtime. Al\n * cumplirse se pinta y las siguientes previews (cada edición) van directo\n * hasta que el autor la cierre con ✕ — si no, cada tecla reiniciaría la espera.\n */\n const armPreviewDelay = (delayMs: number): void => {\n cancelPreviewDelay();\n previewDelay = setTimeout(() => {\n previewDelay = null;\n previewFired = true;\n if (lastPreview) applyPreviewGated(lastPreview);\n }, delayMs);\n postPreviewStatus({ state: 'waiting-delay', delayMs });\n };\n\n const applyPreview = (cmd: Extract<BuilderCommand, { type: 'preview' }>): void => {\n // Edición: si solo cambió el contenido/estilo de algún bloque (misma\n // estructura), se parchea en el lugar sin repintar la tarjeta entera ni\n // tocar los listeners (manipulador, clics, huecos).\n if (cmd.editable && !previewMode && tryPatchPreview(cmd)) {\n previewStepIndex = cmd.guide.startStepIndex ?? 0;\n return;\n }\n detachPreviewTools();\n previewStepIndex = cmd.guide.startStepIndex ?? 0;\n\n // Elemento objetivo: hasta que el autor haga clic/hover en el elemento, la\n // preview no se pinta (como en el runtime). Tras cerrarla, se re-arma.\n const rules = cmd.guide.activationRules;\n const trig = rules?.trigger;\n const sel = rules?.selector?.trim();\n // La activación (elemento objetivo, retraso, dispositivo) se respeta SOLO\n // en vista previa («como la ve el usuario»). Mientras se edita, la tarjeta\n // se pinta siempre al instante: si no, un paso nuevo no aparecía hasta\n // hacer clic en el elemento objetivo o cumplir el retraso.\n const gate = cmd.honorTrigger && !previewFired && previewMode;\n // Elemento objetivo: esperar la interacción, salvo que la guía arranque sola\n // (Automático, `autoShow`) y el autor aún no la haya cerrado. Tras cerrarla\n // con ✕, el elemento objetivo es lo que la vuelve a abrir (como el runtime).\n const waitsForTarget =\n (trig === 'on_click' || trig === 'on_hover') &&\n (!isAutomaticActivation(rules) || previewDismissed);\n if (gate && waitsForTarget && sel) {\n cancelPreviewDelay();\n closeGuidePreview();\n armPreviewTrigger(sel, trig);\n return;\n }\n const delayMs = activationDelayMs(rules);\n if (gate && delayMs > 0) {\n disarmPreviewTrigger();\n closeGuidePreview();\n // Si ya hay una espera corriendo (el autor sigue editando) no se reinicia.\n if (!previewDelay) armPreviewDelay(delayMs);\n return;\n }\n disarmPreviewTrigger();\n cancelPreviewDelay();\n const fetchProgress = previewProgressFetcher();\n const handle = previewGuide({\n ...cmd.guide,\n ...(fetchProgress ? { fetchProgress } : {}),\n onClosed: () => {\n // El autor cerró la guía con ✕.\n detachPreviewTools();\n shownPreview = null;\n previewFired = false;\n previewDismissed = true;\n // Vista previa («como la ve el usuario»): un cierre es un cierre. La\n // guía no se repinta sola; si tiene elemento objetivo, ese clic/hover\n // la vuelve a abrir (como el runtime). En modo edición también se\n // queda cerrada: la próxima edición o selección de paso la repinta.\n if (previewMode) {\n const r = lastPreview?.guide.activationRules;\n const t = r?.trigger;\n const selector = r?.selector?.trim();\n if ((t === 'on_click' || t === 'on_hover') && selector) armPreviewTrigger(selector, t);\n }\n },\n });\n if (cmd.honorTrigger) postPreviewStatus({ state: 'shown' });\n // En vista previa la guía se ve como la vería el usuario: sin drag/resize.\n if (!cmd.editable || previewMode) return;\n void handle.ready.then((result) => {\n if (!result.rendered) return;\n const host = handle.host();\n if (!host) {\n // Inline de un solo bloque code: HTML CRUDA en el DOM real, sin host ni\n // tarjeta. Se selecciona con un marco propio sobre los elementos crudos.\n const idx = cmd.guide.startStepIndex ?? 0;\n const only = (cmd.guide.guideSteps as unknown as CompositeStep[])[idx]?.blocks?.[0];\n if (only?.type === 'code' && only.editorId) {\n rawBlock = attachRawBlock(idx, only.editorId);\n rawBlock?.select(selectedBlockId);\n }\n return;\n }\n // Sin animación de entrada mientras se edita (evita el parpadeo).\n host.classList.add('veo-no-anim');\n shownPreview = cmd;\n cardClick = attachCardClick(host, cmd.guide.startStepIndex ?? 0);\n const stepBlocks =\n (cmd.guide.guideSteps as unknown as CompositeStep[])[cmd.guide.startStepIndex ?? 0]\n ?.blocks ?? [];\n previewBlocks = stepBlocks;\n applyBlockHighlight(host, cmd.guide.startStepIndex ?? 0);\n renderGapZones(host, cmd.guide.startStepIndex ?? 0, stepBlocks);\n rowHover = attachRowHover(host, cmd.guide.startStepIndex ?? 0);\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`. Con\n // `chrome: true` el panel sabe que las barras las pinta el SDK.\n post(chrome ? { type: 'ready', chrome: true } : { type: 'ready' });\n break;\n case 'editor-state':\n chrome?.setState(cmd.state);\n if (panelSection !== cmd.state.section) {\n panelSection = cmd.state.section;\n // La pestaña activa del contenedor cambia con la sección del panel.\n const h = document.querySelector<HTMLElement>('[data-veo-guide]');\n if (h && hoverCard && !previewMode) renderCardChrome(h, previewStepIndex);\n }\n panel?.setTitle(\n cmd.state.panelTitle ??\n (cmd.state.section === 'activation'\n ? 'Ajustes de activación'\n : cmd.state.section === 'badge'\n ? 'Ajustes de badge'\n : cmd.state.section === 'target'\n ? 'Ajustes del elemento objetivo'\n : cmd.state.section === 'row'\n ? 'Editar fila'\n : cmd.state.blockLabel\n ? `Editor · ${cmd.state.blockLabel}`\n : (cmd.state.steps[cmd.state.activeStep]?.label ?? 'Paso')),\n );\n break;\n case 'panel-visibility':\n panel?.setVisible(cmd.visible);\n break;\n case 'panel-size':\n panel?.setSize(cmd.size);\n break;\n case 'start-picker': {\n picker?.stop();\n // Para elegir con comodidad se esconde TODO (barras + tarjeta) mientras\n // dura el picker; vuelve como estaba al terminar (elegir o cancelar).\n const panelWasShown = panel?.isVisible() ?? false;\n if (panelWasShown) panel?.setVisible(false);\n chrome?.setHidden(true);\n // La guía en preview también estorba (tapa elementos): se cierra y se\n // re-pinta al terminar, con el mismo comando que la mostró.\n const previewToRestore = lastPreview;\n if (previewToRestore) {\n detachPreviewTools();\n closeGuidePreview();\n }\n const restorePanel = (): void => {\n chrome?.setHidden(false);\n if (panelWasShown) panel?.setVisible(true);\n if (previewToRestore && lastPreview === previewToRestore) {\n applyPreviewGated(previewToRestore);\n }\n };\n picker = startElementPicker({\n onPick: (payload) => {\n picker = null;\n restorePanel();\n post({ type: 'picked', payload });\n },\n onCancel: () => {\n picker = null;\n restorePanel();\n post({ type: 'pick-cancelled' });\n },\n ...(cmd.maxAncestors !== undefined ? { maxAncestors: cmd.maxAncestors } : {}),\n ...(cmd.hint !== undefined ? { hint: cmd.hint } : {}),\n ...(cmd.only !== undefined ? { only: cmd.only } : {}),\n });\n break;\n }\n case 'stop-picker':\n picker?.stop();\n picker = null;\n chrome?.setHidden(false);\n break;\n case 'scan-page':\n post({ type: 'page-scan', payload: scanPage(cmd.selectors) });\n break;\n case 'highlight':\n setHighlight(cmd.selector);\n break;\n case 'show-confirmation':\n showConfirmation(cmd.payload);\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 'select-block': {\n selectedBlockId = cmd.blockId;\n const h = document.querySelector<HTMLElement>('[data-veo-guide]');\n if (h && !previewMode) applyBlockHighlight(h, previewStepIndex);\n if (!previewMode) rawBlock?.select(cmd.blockId);\n break;\n }\n case 'select-row': {\n selectedRowId = cmd.blockId;\n const h = document.querySelector<HTMLElement>('[data-veo-guide]');\n if (h && !previewMode) renderRowChrome(h, previewStepIndex);\n break;\n }\n case 'close-preview':\n detachPreviewTools();\n hideDragGhost();\n pendingPreview = null;\n lastPreview = null;\n disarmPreviewTrigger();\n cancelPreviewDelay();\n previewFired = false;\n previewDismissed = false;\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 detachPreviewTools();\n hideDragGhost();\n pendingPreview = null;\n disarmPreviewTrigger();\n cancelPreviewDelay();\n closeGuidePreview();\n post({ type: 'closed' }); // avisar al editor ANTES de sacar el panel\n panel?.teardown();\n panel = null;\n highlightBox?.remove();\n highlightBox = null;\n confirmation?.remove();\n confirmation = null;\n if (confirmationKey) document.removeEventListener('keydown', confirmationKey, true);\n confirmationKey = null;\n chrome?.teardown();\n chrome = null;\n clearBuilderToken(); // salir del modo builder: no re-activar en la próxima carga\n };\n\n /**\n * Inventario de la página para el panel de features: elementos interactivos\n * (`INTERACTIVE_SELECTOR`: botones, enlaces, campos, formularios, controles\n * ARIA…) visibles, fuera del chrome/panel de OnUser, que no matchean ninguna\n * feature ya tagueada; y cuáles de los selectores dados existen en la página.\n */\n const scanPage = (selectors: string[]): PageScan => {\n const present = selectors.filter((sel) => {\n try {\n return document.querySelector(sel) !== null;\n } catch {\n return false;\n }\n });\n const taggedEls = new Set<Element>();\n for (const sel of present) {\n try {\n for (const e of Array.from(document.querySelectorAll(sel))) taggedEls.add(e);\n } catch {\n // selector inválido: ya filtrado arriba\n }\n }\n const seen = new Set<string>();\n const candidates: PageElement[] = [];\n const nodes = document.querySelectorAll(INTERACTIVE_SELECTOR);\n for (const element of Array.from(nodes)) {\n if (candidates.length >= 200) break;\n if (element.closest('[data-veo-builder-chrome],[data-veo-builder-panel],[data-veo-picker]')) {\n continue;\n }\n if (element.getClientRects().length === 0) continue;\n // Ya tagueado (él o un ancestro con feature): no es candidato.\n let tagged = false;\n for (let n: Element | null = element; n; n = n.parentElement) {\n if (taggedEls.has(n)) {\n tagged = true;\n break;\n }\n }\n if (tagged) continue;\n const selector = buildSelectorPath(element, 5);\n if (!selector || seen.has(selector)) continue;\n seen.add(selector);\n candidates.push({\n selector,\n shortSelector: buildSelectorPath(element, 0),\n tag: element.tagName.toLowerCase(),\n id: element.id || null,\n classes: filterHumanClasses(element),\n text: elementLabelText(element),\n });\n }\n const { pathname, hash } = window.location;\n // Hash routing (`#/ruta`): la ruta visible incluye el hash.\n const routePath = /^#\\/./.test(hash) ? `${pathname}${hash}` : pathname;\n return { pagePath: pathname, routePath, candidates, present };\n };\n\n /**\n * Modal de confirmación centrado sobre la app (mock «Feature tagueada»):\n * backdrop + tarjeta con check verde, título, mensaje, filas y botón. El\n * panel se oculta mientras está abierto y vuelve al cerrarlo (botón o Esc).\n */\n let confirmation: HTMLElement | null = null;\n let confirmationKey: ((e: KeyboardEvent) => void) | null = null;\n const closeConfirmation = (): void => {\n if (!confirmation) return;\n confirmation.remove();\n confirmation = null;\n if (confirmationKey) document.removeEventListener('keydown', confirmationKey, true);\n confirmationKey = null;\n panel?.setVisible(true);\n post({ type: 'confirmation-closed' });\n };\n const showConfirmation = (card: ConfirmationCard): void => {\n if (confirmation) {\n confirmation.remove();\n confirmation = null;\n }\n panel?.setVisible(false);\n const host = document.createElement('div');\n host.setAttribute('data-veo-builder-chrome', '');\n host.setAttribute('data-veo-confirmation', '');\n const shadow = host.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = CONFIRMATION_STYLES;\n const backdrop = document.createElement('div');\n backdrop.className = 'veo-confirm-backdrop';\n const dialog = document.createElement('div');\n dialog.className = 'veo-confirm';\n dialog.setAttribute('role', 'dialog');\n dialog.setAttribute('aria-modal', 'true');\n dialog.setAttribute('aria-label', card.title);\n const badge = document.createElement('div');\n badge.className = 'veo-confirm-check';\n badge.innerHTML =\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12.5l4.5 4.5L19 7.5\"/></svg>';\n const title = document.createElement('h2');\n title.className = 'veo-confirm-title';\n title.textContent = card.title;\n const message = document.createElement('p');\n message.className = 'veo-confirm-msg';\n message.textContent = card.message;\n const rows = document.createElement('dl');\n rows.className = 'veo-confirm-rows';\n for (const r of card.rows) {\n const row = document.createElement('div');\n row.className = 'veo-confirm-row';\n const dt = document.createElement('dt');\n dt.textContent = r.label;\n const dd = document.createElement('dd');\n dd.textContent = r.value;\n row.append(dt, dd);\n rows.appendChild(row);\n }\n const button = document.createElement('button');\n button.type = 'button';\n button.className = 'veo-confirm-btn';\n button.textContent = card.buttonLabel ?? 'Listo';\n button.addEventListener('click', closeConfirmation);\n dialog.append(badge, title, message);\n if (card.rows.length > 0) dialog.appendChild(rows);\n dialog.appendChild(button);\n shadow.append(style, backdrop, dialog);\n document.body.appendChild(host);\n confirmation = host;\n confirmationKey = (e: KeyboardEvent): void => {\n if (e.key !== 'Escape') return;\n e.preventDefault();\n e.stopPropagation();\n closeConfirmation();\n };\n document.addEventListener('keydown', confirmationKey, true);\n button.focus();\n };\n\n /** Marco de resalte sobre un elemento (hover en la lista del panel). */\n let highlightBox: HTMLElement | null = null;\n const setHighlight = (selector: string | null): void => {\n highlightBox?.remove();\n highlightBox = null;\n if (!selector) return;\n let target: Element | null = null;\n try {\n target = document.querySelector(selector);\n } catch {\n return;\n }\n if (!target) return;\n const r = target.getBoundingClientRect();\n const box = document.createElement('div');\n box.setAttribute('data-veo-builder-chrome', '');\n box.style.cssText =\n `position:fixed;left:${r.left - 3}px;top:${r.top - 3}px;width:${r.width + 6}px;height:${r.height + 6}px;` +\n 'border:2px solid #FF5B35;border-radius:6px;background:rgba(255,91,53,0.10);pointer-events:none;z-index:2147483646;';\n document.body.appendChild(box);\n highlightBox = box;\n };\n\n // Transporte: panel inyectado (app top-level) o iframe/popup (embebida).\n if (ctx.panel) {\n // Chrome (barras) primero: el panel arranca debajo. Las acciones de las\n // barras van al panel como eventos `chrome-action`; seleccionar algo\n // vuelve a mostrar la tarjeta si estaba minimizada.\n chrome = injectBuilderChrome({\n appLabel: window.location.hostname,\n onAction: (action) => {\n switch (action.action) {\n // Controles que resuelve el SDK solo (no van al panel).\n case 'dock':\n panel?.setTopOffset(action.position === 'top' ? (chrome?.height() ?? 0) : 0);\n return;\n case 'show-panel':\n panel?.setVisible(true);\n return;\n case 'preview':\n if (previewMode) return;\n previewMode = true;\n // La activación se evalúa desde cero al entrar en vista previa.\n previewFired = false;\n previewDismissed = false;\n panelWasVisible = panel?.isVisible() ?? true;\n panel?.setVisible(false);\n chrome?.setPreview(true);\n if (lastPreview) applyPreviewGated(lastPreview);\n return;\n case 'exit-preview':\n if (!previewMode) return;\n previewMode = false;\n disarmPreviewTrigger();\n cancelPreviewDelay();\n chrome?.setPreview(false);\n panel?.setVisible(panelWasVisible);\n if (lastPreview) applyPreviewGated(lastPreview);\n return;\n case 'select-activation':\n case 'select-step':\n case 'add-step':\n panel?.setVisible(true);\n break;\n }\n post({ type: 'chrome-action', payload: action });\n },\n });\n panel = injectBuilderPanel({\n dashboardOrigin,\n token,\n appOrigin: window.location.origin,\n guide: ctx.guide,\n panelPath: ctx.panelPath,\n onClose: () => teardown(),\n topOffset: chrome.height(),\n });\n chrome.onHeightChange((h) => panel?.setTopOffset(chrome?.dock() === 'top' ? h : 0));\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/**\n * Lista de tareas en la preview del editor: progreso con un usuario de\n * preview (nombres y pasos reales de las guías publicadas, progreso 0). Solo\n * si `init()` dejó apiKey/apiUrl en `window.__veoBuilder`.\n */\nfunction previewProgressFetcher():\n | ((guideIds: string[]) => Promise<import('../guides/types').GuideProgressItem[]>)\n | undefined {\n const cfg = (window as unknown as { __veoBuilder?: { apiKey?: string; apiUrl?: string } })\n .__veoBuilder;\n if (!cfg?.apiKey || !cfg?.apiUrl) return undefined;\n const apiUrl = cfg.apiUrl.replace(/\\/+$/, '');\n const apiKey = cfg.apiKey;\n return async (guideIds) => {\n const params = new URLSearchParams({\n endUserId: 'veo_preview',\n guideIds: guideIds.join(','),\n includeUnpublished: '1',\n });\n const res = await fetch(`${apiUrl}/v1/guides/progress?${params}`, {\n headers: { 'X-Api-Key': apiKey },\n });\n if (!res.ok) return [];\n const data = (await res.json()) as { items?: import('../guides/types').GuideProgressItem[] };\n return data.items ?? [];\n };\n}\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"]}
|
|
1
|
+
{"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/autocapture/constants.ts","../src/plugins/autocapture/selector-builder.ts","../src/plugins/guides/activation-devices.ts","../src/plugins/guides/activation-rules.ts","../src/plugins/guides/constants.ts","../src/plugins/guides/rich-text.ts","../src/plugins/guides/video-block.ts","../src/plugins/guides/block-builder.ts","../src/utils/uuid.ts","../src/plugins/guides/renderers/custom-frame.ts","../src/plugins/guides/code-block.ts","../src/plugins/guides/guide-design.ts","../src/plugins/guides/inline-host.ts","../src/plugins/guides/wait-for-element.ts","../src/plugins/guides/styles.ts","../src/plugins/guides/renderers/base-renderer.ts","../src/plugins/guides/renderers/floating-arrow.ts","../src/plugins/guides/renderers/badge-renderer.ts","../src/plugins/guides/walkthrough-block-builder.ts","../src/plugins/guides/renderers/banner-renderer.ts","../src/plugins/guides/checklist-block.ts","../src/plugins/guides/form-content.ts","../src/plugins/guides/guide-theme.ts","../src/plugins/guides/layout.ts","../src/plugins/guides/scroll-lock.ts","../src/plugins/guides/snooze.ts","../src/plugins/guides/z-index.ts","../src/plugins/guides/renderers/badge-marker.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-chrome.ts","../src/plugins/builder/builder-panel.ts","../src/plugins/builder/design-manipulator.ts","../src/plugins/builder/interactive-elements.ts","../src/plugins/builder/element-picker.ts","../src/plugins/builder/builder-mode.ts","../src/plugins/builder/builder-session.ts","../src/builder.ts"],"names":["el","session","classes","classPart","rebuilt","nodes","computePosition","offset","flip","shift","arrow","clamp","num","svg","update","stop","autoUpdate","node","ready","renderer","MIN_W","MIN_H","blocksRect","rect","EDGE"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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,EAucb,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;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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","/** 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 captureClickQuality: true,\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 * «Mostrar la guía en» (Ajustes de activación): todos los dispositivos, solo\n * escritorio y tablets, o solo móvil. Se decide en el cliente por el ancho del\n * viewport (móvil = < 768px, el corte habitual). Función pura para testear.\n */\nimport type { ActivationDevices } from './types';\n\nexport const MOBILE_MAX_WIDTH = 767;\n\nexport function isDeviceAllowed(\n devices: ActivationDevices | null | undefined,\n viewportWidth: number = typeof window === 'undefined' ? 1024 : window.innerWidth,\n): boolean {\n if (!devices || devices === 'all') return true;\n const mobile = viewportWidth <= MOBILE_MAX_WIDTH;\n return devices === 'mobile' ? mobile : !mobile;\n}\n","import type { ActivationRules } from './types';\n\n/**\n * ¿La guía ARRANCA SOLA al cargar la página?\n * - `immediate` / `delayed`: sí (con `delayMs` en el segundo caso).\n * - `on_click` / `on_hover` + `autoShow`: sí, y además el elemento objetivo\n * la vuelve a abrir (Automático + Elemento objetivo, no excluyentes).\n * - `manual`: no; solo el badge del paso (o abrirla por id) la muestran.\n * Se usa para decidir el retraso y si el tooltip del badge se abre solo.\n */\nexport function isAutomaticActivation(rules: Partial<ActivationRules> | null | undefined): boolean {\n const trigger = rules?.trigger ?? 'immediate';\n if (trigger === 'immediate' || trigger === 'delayed') return true;\n if (trigger === 'on_click' || trigger === 'on_hover') return rules?.autoShow === true;\n return false;\n}\n\n/** Retraso efectivo en ms de una guía automática (0 si no aplica). */\nexport function activationDelayMs(rules: Partial<ActivationRules> | null | undefined): number {\n if (!isAutomaticActivation(rules)) return 0;\n const ms = rules?.delayMs ?? 0;\n return Number.isFinite(ms) && ms > 0 ? ms : 0;\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/** Host aparte del MARCADOR de un badge (vive junto al ancla; el tooltip queda en el host principal, en body). */\nexport const BADGE_MARKER_HOST_ATTR = 'data-veo-badge';\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 type { StepBlock, VideoProvider } from './types';\n\n/**\n * Bloque `video`: embed del proveedor en un iframe. Solo se aceptan URLs de\n * los proveedores soportados, y el iframe apunta SIEMPRE al dominio de embed\n * conocido (nunca a la URL tal cual): así no se puede incrustar cualquier\n * sitio desde una guía.\n */\nexport function videoEmbedUrl(\n provider: VideoProvider | null | undefined,\n url: string,\n): string | null {\n let u: URL;\n try {\n u = new URL(url);\n } catch {\n return null;\n }\n if (u.protocol !== 'https:' && u.protocol !== 'http:') return null;\n const host = u.hostname.replace(/^www\\./, '').replace(/^m\\./, '');\n const id = (re: RegExp, from: string): string | null => {\n const m = from.match(re);\n return m?.[1] ?? null;\n };\n switch (provider) {\n case 'youtube': {\n let v: string | null = null;\n if (host === 'youtube.com' || host === 'youtube-nocookie.com') {\n v =\n u.searchParams.get('v') ??\n id(/^\\/(?:embed|shorts|live)\\/([A-Za-z0-9_-]{6,})/, u.pathname);\n } else if (host === 'youtu.be') {\n v = id(/^\\/([A-Za-z0-9_-]{6,})/, u.pathname);\n }\n if (!v || !/^[A-Za-z0-9_-]{6,}$/.test(v)) return null;\n return `https://www.youtube-nocookie.com/embed/${v}`;\n }\n case 'vimeo': {\n if (host !== 'vimeo.com' && host !== 'player.vimeo.com') return null;\n const v = id(/(\\d{6,})/, u.pathname);\n return v ? `https://player.vimeo.com/video/${v}` : null;\n }\n case 'loom': {\n if (host !== 'loom.com') return null;\n const v = id(/^\\/(?:share|embed)\\/([A-Za-z0-9]{16,})/, u.pathname);\n return v ? `https://www.loom.com/embed/${v}` : null;\n }\n case 'wistia': {\n // https://<cuenta>.wistia.com/medias/<id> | https://fast.wistia.net/embed/iframe/<id>\n if (!under(host, 'wistia.com') && !under(host, 'wistia.net')) return null;\n const v = id(/\\/(?:medias|embed\\/iframe)\\/([A-Za-z0-9]{6,})/, u.pathname);\n return v ? `https://fast.wistia.net/embed/iframe/${v}` : null;\n }\n case 'msstream': {\n // Stream clásico: https://web.microsoftstream.com/video/<guid>\n if (!under(host, 'microsoftstream.com')) return null;\n const v = id(/\\/(?:embed\\/)?video\\/([0-9a-f-]{36})/i, u.pathname);\n return v\n ? `https://web.microsoftstream.com/embed/video/${v}?autoplay=false&showinfo=true`\n : null;\n }\n case 'vidyard': {\n // https://share.vidyard.com/watch/<id> | https://play.vidyard.com/<id>\n if (!under(host, 'vidyard.com')) return null;\n const v =\n id(/\\/watch\\/([A-Za-z0-9_-]{8,})/, u.pathname) ??\n (host === 'play.vidyard.com' ? id(/^\\/([A-Za-z0-9_-]{8,})/, u.pathname) : null);\n return v ? `https://play.vidyard.com/${v}` : null;\n }\n case 'sharepoint':\n // Stream (SharePoint): el autor pega la URL de inserción que genera\n // SharePoint («Insertar»); no hay id derivable, se incrusta esa URL del\n // tenant (solo https y solo *.sharepoint.com).\n return u.protocol === 'https:' && under(host, 'sharepoint.com') ? u.href : null;\n case 'brightcove':\n // https://players.brightcove.net/<cuenta>/<player>_default/index.html?videoId=<id>\n return u.protocol === 'https:' &&\n host === 'players.brightcove.net' &&\n u.searchParams.get('videoId')\n ? u.href\n : null;\n case 'kaltura':\n // URL de inserción del reproductor: https://cdnapisec.kaltura.com/p/<partner>/…\n return u.protocol === 'https:' && under(host, 'kaltura.com') && u.pathname.startsWith('/p/')\n ? u.href\n : null;\n default:\n return null;\n }\n}\n\n/** `host` es `domain` o un subdominio suyo. */\nfunction under(host: string, domain: string): boolean {\n return host === domain || host.endsWith(`.${domain}`);\n}\n\n/** URL http(s) directa a un archivo de video (mp4/webm/mov). */\nexport function fileVideoUrl(url: string): string | null {\n try {\n const u = new URL(url);\n if (u.protocol !== 'https:' && u.protocol !== 'http:') return null;\n return /\\.(mp4|webm|mov)$/i.test(u.pathname) ? u.href : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Nodo del bloque video: wrapper con ancho (fijo en px o al contenedor) y\n * relación de aspecto, e iframe del proveedor. En edición (`editing`) se\n * quita pantalla completa (el estudio tapa la app) y el iframe no captura\n * el mouse (para poder seleccionarlo).\n */\nexport function buildVideoBlock(\n block: StepBlock,\n doc: Document,\n opts: { editing?: boolean } = {},\n): HTMLElement | null {\n const isFile = block.provider === 'file';\n const src =\n typeof block.url === 'string'\n ? isFile\n ? fileVideoUrl(block.url)\n : videoEmbedUrl(block.provider, block.url)\n : null;\n if (!src) return null;\n const s = (block.style ?? {}) as Record<string, unknown>;\n const wrap = doc.createElement('div');\n wrap.className = 'veo-guide-video';\n const ratio = s.aspect === '4:3' ? '4 / 3' : '16 / 9';\n wrap.style.aspectRatio = ratio;\n if (s.widthMode === 'fill') {\n wrap.style.width = '100%';\n } else {\n const w = typeof s.width === 'number' && Number.isFinite(s.width) ? s.width : 400;\n wrap.style.width = `${Math.max(120, Math.min(1600, w))}px`;\n wrap.style.maxWidth = '100%';\n }\n const align = s.align === 'center' ? 'center' : s.align === 'right' ? 'flex-end' : 'flex-start';\n wrap.style.alignSelf = align;\n if (isFile) {\n // Archivo propio: reproductor nativo (sin iframe).\n const video = doc.createElement('video');\n video.src = src;\n video.controls = true;\n video.setAttribute('playsinline', '');\n video.preload = 'metadata';\n video.setAttribute(\n 'aria-label',\n typeof block.alt === 'string' && block.alt.trim() ? block.alt.trim() : 'Video',\n );\n if (opts.editing) video.style.pointerEvents = 'none';\n wrap.appendChild(video);\n return wrap;\n }\n const frame = doc.createElement('iframe');\n frame.src = src;\n frame.title = typeof block.alt === 'string' && block.alt.trim() ? block.alt.trim() : 'Video';\n frame.setAttribute('loading', 'lazy');\n frame.setAttribute('referrerpolicy', 'strict-origin-when-cross-origin');\n frame.setAttribute(\n 'allow',\n `accelerometer; autoplay; clipboard-write; encrypted-media; picture-in-picture${opts.editing ? '' : '; fullscreen'}`,\n );\n if (!opts.editing) frame.setAttribute('allowfullscreen', '');\n if (opts.editing) frame.style.pointerEvents = 'none';\n wrap.appendChild(frame);\n return wrap;\n}\n","import { SAFE_URL_PROTOCOLS } from './constants';\nimport { renderRichText } from './rich-text';\nimport type { CtaAction, GuideInteractionMetadata, GuideStep, StepBlock } from './types';\nimport { buildVideoBlock } from './video-block';\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(\n block: StepBlock,\n doc: Document,\n opts: { editing?: boolean } = {},\n): HTMLElement | null {\n switch (block.type) {\n case 'video':\n return buildVideoBlock(block, doc, opts);\n case 'divider':\n return buildDividerBlock(block, doc);\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 = typeof block.alt === 'string' ? block.alt : '';\n applyBlockStyle(el, block.style, 'image');\n return el;\n }\n default:\n return null;\n }\n}\n\nconst DIVIDER_LINE_STYLES = new Set(['solid', 'dotted', 'dashed']);\n\n/**\n * Bloque `divider` (línea horizontal): wrapper de ancho completo con una\n * franja de 6px arriba/abajo (zona clickeable en el editor) y un `<hr>` cuyo\n * borde superior es la línea. `style`: `preset` theme|custom (custom habilita\n * color/grosor), `lineStyle` solid|dotted|dashed, `colorMode` (oscuro = línea\n * clara por defecto) y márgenes.\n */\nexport function buildDividerBlock(block: StepBlock, doc: Document): HTMLElement {\n const s = (block.style ?? {}) as Record<string, unknown>;\n const wrap = doc.createElement('div');\n wrap.className = 'veo-guide-divider';\n wrap.setAttribute('role', 'separator');\n const hr = doc.createElement('hr');\n const custom = s.preset === 'custom';\n const color =\n custom && typeof s.color === 'string' && s.color\n ? s.color\n : s.colorMode === 'dark'\n ? 'rgba(255, 255, 255, 0.35)'\n : '#e5e7eb';\n const thickness =\n custom && typeof s.thickness === 'number' && Number.isFinite(s.thickness)\n ? clampNum(Math.round(s.thickness), 1, 12)\n : 1;\n const lineStyle =\n typeof s.lineStyle === 'string' && DIVIDER_LINE_STYLES.has(s.lineStyle) ? s.lineStyle : 'solid';\n hr.style.borderTop = `${thickness}px ${lineStyle} ${color}`;\n wrap.appendChild(hr);\n for (const [k, prop] of [\n ['marginTop', 'marginTop'],\n ['marginRight', 'marginRight'],\n ['marginBottom', 'marginBottom'],\n ['marginLeft', 'marginLeft'],\n ] as const) {\n const v = s[k];\n if (typeof v === 'number' && Number.isFinite(v)) {\n wrap.style[prop] = `${clampNum(v, 0, 64)}px`;\n }\n }\n return wrap;\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 */\n/** Presets tipográficos del bloque de texto («Estilo del tema»). */\nexport const TEXT_PRESETS = {\n title: { size: 18, weight: 600, lineHeight: 1.3 },\n subtitle: { size: 16, weight: 600, lineHeight: 1.35 },\n paragraph: { size: 14, weight: 400, lineHeight: 1.5 },\n small: { size: 12, weight: 400, lineHeight: 1.5 },\n} as const;\n\nexport function applyBlockStyle(\n el: HTMLElement,\n style: StepBlock['style'],\n kind: 'text' | 'image' | 'button',\n): void {\n // Preset del texto como atributo: con el tema del workspace, las reglas\n // `.veo-card--themed [data-veo-preset]` le dan color/fuente/tamaño del design\n // system. Un bloque sin estilo es un Párrafo (o Título si es un `title` viejo).\n if (kind === 'text') {\n const explicit =\n style && typeof style === 'object' ? (style as Record<string, unknown>).preset : undefined;\n el.dataset.veoPreset =\n typeof explicit === 'string'\n ? explicit\n : el.classList.contains('veo-guide-title')\n ? 'title'\n : 'paragraph';\n }\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') {\n el.style.textAlign = align;\n // La card/columna es una columna flex y cada bloque mide su contenido:\n // la alineación también ubica el bloque dentro de la fila.\n el.style.alignSelf = BLOCK_ALIGN_SELF[align] as string;\n } else if (kind === 'image') el.style.alignSelf = BLOCK_ALIGN_SELF[align] as string;\n }\n // «Estilo del tema» del bloque de texto (editor): un preset define tamaño y\n // peso; `custom` deja los valores a mano (fontSize/fontWeight de abajo).\n if (kind === 'text' && typeof s.preset === 'string' && s.preset in TEXT_PRESETS) {\n const preset = TEXT_PRESETS[s.preset as keyof typeof TEXT_PRESETS];\n if (preset) {\n // El tema del workspace (si el paso lo usa) define tamaño y peso del\n // preset; sin tema las variables no existen y valen los del SDK.\n const token = s.preset === 'small' ? null : `--veo-t-${s.preset}`;\n el.style.fontSize = token ? `var(${token}-size, ${preset.size}px)` : `${preset.size}px`;\n el.style.fontWeight = token\n ? `var(${token}-weight, ${preset.weight})`\n : String(preset.weight);\n el.style.lineHeight = String(preset.lineHeight);\n }\n }\n // Modo de color del bloque: «oscuro» = franja oscura con texto claro (el\n // color explícito de abajo lo pisa).\n if (kind !== 'image' && s.colorMode === 'dark') {\n el.style.background = '#1f1d1b';\n el.style.color = '#f5f0eb';\n el.style.borderRadius = el.style.borderRadius || '8px';\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 // «Usar el tamaño real de la imagen»: sin escalar ni recortar (hasta el\n // ancho disponible). Si no, el ancho es un % del contenedor.\n if (kind === 'image' && s.naturalSize === true) {\n el.style.width = 'auto';\n el.style.maxWidth = '100%';\n el.style.maxHeight = 'none';\n el.style.objectFit = 'contain';\n } else 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","/**\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 /** Editor: id local del bloque. Los ELEMENTOS crudos se marcan con\n * `data-veo-raw-block=<id>` para que el builder pueda seleccionarlos. */\n tagBlockId?: string;\n}\n\n/** Atributo de los elementos crudos de un bloque code en el editor. */\nexport const RAW_BLOCK_ATTR = 'data-veo-raw-block';\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 if (rawInline.tagBlockId) {\n for (const n of rawNodes) {\n if (n instanceof Element) n.setAttribute(RAW_BLOCK_ATTR, rawInline.tagBlockId);\n }\n }\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 // El `<slot>` no tiene caja propia (display: contents): envuelto en un\n // div para que el bloque tenga rect real (marco de selección, barra y\n // huecos «+» del editor miden el bloque con getBoundingClientRect).\n const wrapper = doc.createElement('div');\n wrapper.className = 'veo-code-host';\n wrapper.appendChild(slot);\n node = wrapper;\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 let cancelled = false;\n if (typeof block.js === 'string' && block.js.trim()) {\n const js = block.js;\n const run = (): void => {\n if (cancelled) return;\n const s = hostDoc.createElement('script');\n s.textContent = wrapUserScript(js);\n hostDoc.body.appendChild(s);\n injected.push(s);\n };\n // El renderer inserta el host de la guía en la página DESPUÉS de construir\n // el contenido: si el JS corriera ya, la HTML del bloque todavía no estaría\n // en el documento (`document.getElementById(...)` → null). Se difiere un\n // microtask, que corre apenas termina ese montaje síncrono.\n if (host && !host.isConnected) queueMicrotask(run);\n else run();\n }\n\n return {\n node,\n cleanup: () => {\n cancelled = true;\n for (const n of injected) n.parentNode?.removeChild(n);\n },\n };\n}\n\n/**\n * Envuelve el JS del autor en una IIFE con try/catch: un `const`/`let` al nivel\n * superior de un script clásico vive en el scope global y, como la preview\n * re-ejecuta el bloque en cada repintado, el segundo `<script>` fallaría con\n * «Identifier has already been declared». Los errores en tiempo de ejecución\n * salen en la consola con un prefijo reconocible.\n */\nexport function wrapUserScript(js: string): string {\n return `(function(){try{\\n${js}\\n}catch(e){console.error(\"[OnUser] Error en el bloque de código:\",e)}})();`;\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 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/* Edición (builder): sin animación de entrada al repintar la preview. */\n:host(.veo-no-anim) * { animation: none !important; }\n\n/* Bloque video: caja con relación de aspecto; el iframe la llena. */\n.veo-guide-video { position: relative; overflow: hidden; border-radius: 8px; background: #000; }\n.veo-guide-video iframe, .veo-guide-video video {\n position: absolute; inset: 0; width: 100%; height: 100%; border: 0; display: block;\n}\n\n/* ── Layout por filas/columnas (composite) ──\n El espacio tiene UNA fuente por capa: el aire con el borde lo da el padding\n de la card; la separación entre filas/bloques la da el margen inferior\n (12px, ahí vive la línea «+» del editor); los bloques NO llevan padding\n propio (solo el que el autor les ponga inline). El último elemento no deja\n margen colgando. */\n.veo-card > [data-veo-block], .veo-card > .veo-row, .veo-card > .veo-guide-actions,\n.veo-col > [data-veo-block], .veo-col > .veo-guide-actions { margin-bottom: 12px; }\n/* La card y cada columna son columnas flex: cada bloque mide SU contenido (como\n el botón) y se ubica con su alineación (align-self); filas, columnas, formularios\n y filas de botones ocupan todo el ancho. */\n.veo-card:not(.veo-card--empty), .veo-col {\n display: flex; flex-direction: column; align-items: flex-start;\n}\n.veo-card > [data-veo-block], .veo-col > [data-veo-block] { max-width: 100%; }\n/* Línea horizontal: ocupa todo el ancho; el padding del bloque es solo vertical\n (zona clickeable en el editor) y la línea es el borde superior del hr. */\n.veo-card > .veo-guide-divider, .veo-col > .veo-guide-divider { padding: 6px 0; align-self: stretch; }\n.veo-guide-divider { box-sizing: border-box; }\n/* Bloque de código (modo host): ocupa todo el ancho, como un formulario. */\n.veo-code-host { display: block; min-width: 0; }\n.veo-card > .veo-code-host, .veo-col > .veo-code-host { align-self: stretch; }\n.veo-guide-divider hr { margin: 0; border: 0; height: 0; }\n.veo-card > .veo-row, .veo-card > .veo-guide-actions, .veo-card > .veo-form,\n.veo-col > .veo-guide-actions, .veo-col > .veo-form { align-self: stretch; }\n.veo-row { display: flex; gap: 12px; align-items: flex-start; box-sizing: border-box; }\n.veo-col { flex: 1 1 0; min-width: 0; }\n.veo-col > :last-child { margin-bottom: 0; }\n/* Fila con alineación horizontal (editor de fila): las columnas miden su contenido. */\n.veo-row--aligned > .veo-col { flex: 0 1 auto; }\n\n/* ── Editor in-app: bloque seleccionado + barra de acciones + placeholders ── */\n.veo-block-placeholder {\n border: 1px dashed #b0a9a5; border-radius: 6px; padding: 12px; margin-bottom: 12px;\n color: #8a8582; font-size: 13px; text-align: center;\n}\n/* El bloque seleccionado no lleva contorno propio: lo rodea .veo-block-frame\n (marco aparte, con aire y alto mínimo, que no altera el layout). */\n.veo-block--selected { position: relative; z-index: 1; }\n.veo-block-frame {\n position: absolute; z-index: 4; pointer-events: none; box-sizing: border-box;\n border: 2px solid #3b82f6; border-radius: 10px; background: rgba(59, 130, 246, 0.04);\n}\n/* Barra del bloque (mock): píldora blanca con sombra, solo íconos; la papelera\n en rojo, separada por una línea. */\n.veo-block-toolbar {\n position: absolute; z-index: 5; display: inline-flex; align-items: center; gap: 2px; padding: 4px 6px;\n background: #fff; border: 1px solid rgba(0,0,0,0.06); border-radius: 12px;\n box-shadow: 0 6px 20px rgba(0,0,0,0.16);\n}\n.veo-block-toolbar button {\n border: 0; background: transparent; color: #4b4642; cursor: pointer; padding: 6px; border-radius: 8px;\n display: inline-flex; align-items: center; justify-content: center; line-height: 1;\n}\n.veo-block-toolbar button:hover { background: #f5efeb; }\n.veo-block-toolbar button svg { width: 20px; height: 20px; }\n.veo-block-toolbar .veo-block-toolbar-remove { color: #e5484d; }\n/* Separadores: antes de la papelera y antes de las flechas de mover. */\n.veo-block-toolbar .veo-block-toolbar-remove, .veo-block-toolbar .veo-block-toolbar-move-left {\n margin-left: 6px; position: relative;\n}\n.veo-block-toolbar .veo-block-toolbar-remove::before, .veo-block-toolbar .veo-block-toolbar-move-left::before {\n content: \"\"; position: absolute; left: -4px; top: 6px; bottom: 6px; width: 1px; background: #e7e2de;\n}\n.veo-block-toolbar button:disabled { opacity: 0.3; cursor: default; background: transparent; }\n/* Contenedor (hover): contorno azul de la tarjeta y dos pestañas centradas\n sobre su borde superior: «Editar contenedor» (outline) y «Editar filas». */\n.veo-card-frame {\n position: absolute; z-index: 3; inset: 0; pointer-events: none; box-sizing: border-box;\n border: 2px solid #3b82f6; border-radius: inherit;\n}\n.veo-card-toolbar {\n position: absolute; z-index: 6; left: 50%; transform: translateX(-50%);\n display: inline-flex; align-items: flex-end; gap: 8px; white-space: nowrap;\n}\n.veo-card-toolbar button {\n cursor: pointer; padding: 8px 14px; border-radius: 8px; border: 2px solid #3b82f6;\n font: 600 14px/1 system-ui, -apple-system, \"Segoe UI\", sans-serif;\n background: #fff; color: #3b82f6;\n}\n.veo-card-toolbar button:hover { background: #eff6ff; }\n/* Con fondo = la vista que el panel muestra ahora (contenedor o estructura). */\n.veo-card-toolbar button.is-active { background: #3b82f6; color: #fff; }\n.veo-card-toolbar button.is-active:hover { background: #2563eb; border-color: #2563eb; }\n/* Editor de fila: marco al pasar el mouse por una fila (o la fila del bloque\n seleccionado) y barra «Editar fila · duplicar» bajo su esquina derecha. */\n.veo-row-frame {\n position: absolute; z-index: 3; pointer-events: none; box-sizing: border-box;\n border: 2px solid #3b82f6; border-radius: 10px;\n}\n.veo-row-toolbar {\n position: absolute; z-index: 5; display: inline-flex; align-items: center; gap: 2px; padding: 4px 6px;\n background: #fff; border: 1px solid rgba(0,0,0,0.06); border-radius: 12px;\n box-shadow: 0 6px 20px rgba(0,0,0,0.16); white-space: nowrap;\n}\n.veo-row-toolbar button {\n border: 0; background: transparent; color: #4b4642; cursor: pointer; padding: 6px 8px; border-radius: 8px;\n display: inline-flex; align-items: center; gap: 8px; line-height: 1;\n font: 500 14px/1 system-ui, -apple-system, \"Segoe UI\", sans-serif;\n}\n.veo-row-toolbar button:hover { background: #f5efeb; }\n.veo-row-toolbar button svg { width: 20px; height: 20px; }\n.veo-row-toolbar .veo-row-toolbar-duplicate { margin-left: 6px; position: relative; }\n.veo-row-toolbar .veo-row-toolbar-duplicate::before {\n content: \"\"; position: absolute; left: -4px; top: 6px; bottom: 6px; width: 1px; background: #e7e2de;\n}\n.veo-row-toolbar .veo-row-toolbar-remove { color: #e5484d; }\n/* Huecos «+» (mock): zona invisible entre elementos; al pasar el mouse aparece\n la línea azul (horizontal = fila / bloque apilado, vertical = columna) con\n un «+» circular al centro. */\n.veo-gap { position: absolute; z-index: 4; }\n.veo-gap i { position: absolute; background: #3b82f6; opacity: 0; transition: opacity 100ms; pointer-events: none; }\n.veo-gap--h i { left: 0; right: 0; top: 50%; height: 2px; margin-top: -1px; }\n.veo-gap--v i { top: 0; bottom: 0; left: 50%; width: 2px; margin-left: -1px; }\n.veo-gap button {\n position: absolute; left: 50%; top: 50%; margin: -11px 0 0 -11px; box-sizing: border-box;\n opacity: 0; transition: opacity 100ms; width: 22px; height: 22px; border-radius: 50%; padding: 0;\n border: 2px solid #fff; background: #3b82f6; color: #fff; cursor: pointer;\n font: 600 15px/18px system-ui, -apple-system, \"Segoe UI\", sans-serif; text-align: center;\n box-shadow: 0 2px 8px rgba(0,0,0,0.25);\n}\n.veo-gap:hover i, .veo-gap:hover button, .veo-gap:focus-within button { opacity: 1; }\n.veo-gap button:hover { background: #2563eb; }\n\n/* Tarjeta sin bloques (paso recién creado). La tarjeta NO impone tamaño ni\n padding propios (así el ancho/padding del diseño se ven tal cual); el tamaño\n mínimo lo pone la zona punteada azul de la preview. */\n.veo-card--empty { display: flex; align-items: stretch; }\n.veo-card-empty-zone {\n flex: 1; min-width: 0; min-height: 160px; margin-top: 14px;\n display: flex; align-items: center; justify-content: center; gap: 6px; text-align: center;\n border: 2px dashed #3b82f6; border-radius: 8px; background: #eff6ff;\n color: #2563eb; font-size: 16px; font-weight: 500; user-select: none; pointer-events: none;\n padding: 0 12px; box-sizing: border-box; overflow: hidden;\n}\n.veo-card-empty-zone b { font-weight: 600; font-size: 22px; line-height: 1; }\n/* Sin ancho configurado, la zona da un tamaño cómodo por defecto. */\n.veo-card--empty:not([style*=\"width\"]) .veo-card-empty-zone { min-width: 360px; }\n/* Tarjeta angosta (la mide el renderer): solo el «+», sin texto, y más baja. */\n.veo-card--narrow .veo-card-empty-zone span { display: none; }\n.veo-card--narrow .veo-card-empty-zone { min-height: 120px; }\n.veo-card {\n /* Contenedor posicionado SIEMPRE: el ✕ (absolute) se ubica respecto a la\n tarjeta también en pasos embebidos (inline), no respecto a la app. Los\n flotantes lo pisan con position:fixed inline. */\n position: relative;\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/* Tema del workspace (design system): cada preset de texto toma sus tokens de\n las variables que publica \\`applyThemeVars\\` en la tarjeta. Las reglas solo\n existen bajo .veo-card--themed; los estilos inline del bloque las pisan. El\n \\`*\\` cubre el rich text (la regla global de fuente aplica a cada hijo). */\n.veo-card--themed [data-veo-preset=\"title\"] {\n color: var(--veo-t-title-color); font-size: var(--veo-t-title-size);\n font-weight: var(--veo-t-title-weight); text-align: var(--veo-t-title-align);\n}\n.veo-card--themed [data-veo-preset=\"subtitle\"] {\n color: var(--veo-t-subtitle-color); font-size: var(--veo-t-subtitle-size);\n font-weight: var(--veo-t-subtitle-weight); text-align: var(--veo-t-subtitle-align);\n}\n.veo-card--themed [data-veo-preset=\"paragraph\"] {\n color: var(--veo-t-paragraph-color); font-size: var(--veo-t-paragraph-size);\n font-weight: var(--veo-t-paragraph-weight); text-align: var(--veo-t-paragraph-align);\n}\n.veo-card--themed [data-veo-preset=\"small\"] { color: var(--veo-t-paragraph-color); }\n.veo-card--themed [data-veo-preset=\"title\"], .veo-card--themed [data-veo-preset=\"title\"] * {\n font-family: var(--veo-t-title-font, var(--veo-font));\n}\n.veo-card--themed [data-veo-preset=\"subtitle\"], .veo-card--themed [data-veo-preset=\"subtitle\"] * {\n font-family: var(--veo-t-subtitle-font, var(--veo-font));\n}\n.veo-card--themed [data-veo-preset=\"paragraph\"], .veo-card--themed [data-veo-preset=\"paragraph\"] *,\n.veo-card--themed [data-veo-preset=\"small\"], .veo-card--themed [data-veo-preset=\"small\"] * {\n font-family: var(--veo-t-paragraph-font, var(--veo-font));\n}\n/* Formulario del tema (pestaña Formulario). Dentro de un .veo-form los tokens\n de texto \\`--veo-t-*\\` se REDEFINEN con «Texto principal»: la pregunta es un\n bloque con preset (su tamaño va inline con esas variables), así toma los del\n formulario y no los del modal. Etiquetas y opciones = «Texto secundario». */\n.veo-card--themed-form .veo-form {\n background: var(--veo-f-bg); padding: var(--veo-f-pad);\n border: var(--veo-f-border, none); border-radius: var(--veo-f-radius, 8px);\n box-shadow: var(--veo-f-shadow, none);\n --veo-t-title-color: var(--veo-f-primary-color); --veo-t-title-size: var(--veo-f-primary-size);\n --veo-t-title-weight: var(--veo-f-primary-weight); --veo-t-title-align: var(--veo-f-primary-align);\n --veo-t-title-font: var(--veo-f-primary-font);\n --veo-t-subtitle-color: var(--veo-f-primary-color); --veo-t-subtitle-size: var(--veo-f-primary-size);\n --veo-t-subtitle-weight: var(--veo-f-primary-weight); --veo-t-subtitle-align: var(--veo-f-primary-align);\n --veo-t-subtitle-font: var(--veo-f-primary-font);\n --veo-t-paragraph-color: var(--veo-f-primary-color); --veo-t-paragraph-size: var(--veo-f-primary-size);\n --veo-t-paragraph-weight: var(--veo-f-primary-weight); --veo-t-paragraph-align: var(--veo-f-primary-align);\n --veo-t-paragraph-font: var(--veo-f-primary-font);\n}\n.veo-card--themed-form .veo-form-label,\n.veo-card--themed-form .veo-form-option,\n.veo-card--themed-form .veo-scale-label {\n color: var(--veo-f-secondary-color); font-weight: var(--veo-f-secondary-weight);\n font-family: var(--veo-f-secondary-font, var(--veo-font));\n}\n.veo-card--themed-form .veo-form-label,\n.veo-card--themed-form .veo-form-option {\n font-size: var(--veo-f-secondary-size); text-align: var(--veo-f-secondary-align);\n}\n.veo-card--themed-form .veo-form-input:focus { outline-color: var(--veo-f-accent); }\n.veo-card--themed-form .veo-form-option input { accent-color: var(--veo-f-accent); }\n.veo-card--themed-form .veo-nps-btn:hover { border-color: var(--veo-scale-color, var(--veo-f-accent)); }\n.veo-card--themed-form .veo-scale-active.veo-nps-btn {\n background: var(--veo-scale-color, var(--veo-f-accent)); color: var(--veo-f-on-accent);\n border-color: var(--veo-scale-color, var(--veo-f-accent));\n}\n.veo-guide-cta {\n background: var(--veo-cta-bg, var(--veo-primary));\n color: var(--veo-cta-color, #fff); border: var(--veo-cta-border, none);\n padding: var(--veo-cta-pad, 9px 18px); border-radius: var(--veo-cta-radius, 8px);\n font-size: var(--veo-cta-size, 14px); font-weight: var(--veo-cta-weight, 500); cursor: pointer;\n transition: opacity 120ms ease;\n}\n.veo-guide-cta:hover { opacity: 0.9; }\n/* Presets del boton (editor): secundario = contorno; enlace = solo texto. */\n.veo-guide-cta--secondary {\n background: var(--veo-cta2-bg, transparent); color: var(--veo-cta2-color, var(--veo-primary));\n border: var(--veo-cta2-border, 1px solid var(--veo-primary));\n padding: var(--veo-cta2-pad, var(--veo-cta-pad, 9px 18px));\n border-radius: var(--veo-cta2-radius, var(--veo-cta-radius, 8px));\n font-size: var(--veo-cta2-size, var(--veo-cta-size, 14px));\n font-weight: var(--veo-cta2-weight, var(--veo-cta-weight, 500));\n}\n.veo-guide-cta--link {\n background: transparent; color: var(--veo-cta3-color, var(--veo-primary));\n border: var(--veo-cta3-border, none); padding: var(--veo-cta3-pad, 0);\n border-radius: var(--veo-cta3-radius, 0);\n font-size: var(--veo-cta3-size, var(--veo-cta-size, 14px));\n font-weight: var(--veo-cta3-weight, var(--veo-cta-weight, 500));\n}\n.veo-guide-cta--link:hover { opacity: 1; text-decoration: underline; }\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/* Pregunta de la encuesta (rich text del bloque form). */\n.veo-form-question { font-size: 16px; font-weight: 600; line-height: 1.35; color: var(--veo-text); }\n.veo-form-question p { margin: 0; }\n.veo-form > .veo-guide-actions { margin: 0; }\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/* Lista de tareas (mock): ítems con anillo de progreso, texto + subtítulo,\n y al pie «X de N completadas» + porcentaje + barra. */\n.veo-checklist {\n display: flex; flex-direction: column; gap: 22px; align-self: stretch; width: 100%;\n min-width: 360px; box-sizing: border-box;\n}\n.veo-checklist-title { font-size: 24px; font-weight: 700; line-height: 1.25; color: var(--veo-cl-title); }\n.veo-checklist-title p { margin: 0; }\n.veo-checklist-items { display: flex; flex-direction: column; gap: 22px; }\n.veo-checklist-item {\n display: flex; align-items: center; gap: 18px; width: 100%; text-align: left;\n background: none; border: 0; padding: 0; cursor: pointer; font: inherit; color: inherit;\n}\n.veo-checklist-item:hover .veo-checklist-label { text-decoration: underline; }\n.veo-checklist-ring { width: 44px; height: 44px; flex: 0 0 auto; }\n.veo-checklist-texts { display: flex; flex-direction: column; gap: 4px; min-width: 0; }\n.veo-checklist-label {\n font-size: calc(var(--veo-cl-font-size, 14px) + 4px); font-weight: var(--veo-cl-font-weight, 600);\n line-height: 1.3; color: var(--veo-cl-title);\n}\n.veo-checklist-sub { font-size: calc(var(--veo-cl-font-size, 14px) + 1px); color: var(--veo-cl-subtitle); }\n.veo-checklist-footer { display: flex; flex-direction: column; gap: 10px; margin-top: 6px; }\n.veo-checklist-summary {\n display: flex; justify-content: space-between; align-items: baseline; gap: 16px;\n font-size: calc(var(--veo-cl-font-size, 14px) + 1px);\n}\n.veo-checklist-count { color: var(--veo-cl-subtitle); }\n.veo-checklist-percent { font-weight: 700; font-size: calc(var(--veo-cl-font-size, 14px) + 3px); color: var(--veo-cl-bar); }\n.veo-checklist-bar { height: var(--veo-cl-bar-h, 8px); background: #e7e2de; border-radius: 999px; overflow: hidden; }\n.veo-checklist--dark .veo-checklist-bar { background: #3c3734; }\n.veo-checklist-bar-fill { height: 100%; background: var(--veo-cl-bar); border-radius: 999px; transition: width 300ms ease; }\n.veo-checklist-empty { margin: 0; font-size: 13px; color: var(--veo-cl-subtitle); }\n/* Opción múltiple (mock): círculos/casillas grandes con su texto al lado. */\n.veo-form-options { display: flex; flex-direction: column; gap: 14px; }\n.veo-form-option {\n display: flex; align-items: center; gap: 14px;\n font-size: 16px; color: var(--veo-text); cursor: pointer;\n}\n.veo-form-option input {\n accent-color: var(--veo-primary); margin: 0; cursor: pointer;\n width: 26px; height: 26px; flex: 0 0 auto;\n}\n/* Escala numérica (mock): casillas cuadradas; con etiquetas, cada casilla\n lleva la suya debajo (la primera cuelga a la izquierda, la última a la derecha). */\n.veo-form-scale { display: flex; gap: 8px; flex-wrap: wrap; align-items: flex-start; }\n.veo-scale-item { display: inline-flex; flex-direction: column; align-items: center; gap: 8px; }\n.veo-scale-item--first { align-items: flex-start; }\n.veo-scale-item--last { align-items: flex-end; }\n.veo-scale-label { font-size: 12px; line-height: 1.2; color: #8a8582; white-space: nowrap; }\n.veo-nps-btn {\n min-width: var(--veo-scale-size, 44px); height: var(--veo-scale-size, 44px); padding: 0 6px;\n font-size: 16px; font-weight: 600; color: var(--veo-text);\n background: var(--veo-bg); border: 1px solid #d5cec9; border-radius: 8px;\n cursor: pointer; transition: all 100ms ease;\n}\n.veo-nps-btn:hover { border-color: var(--veo-scale-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 {\n background: var(--veo-scale-color, var(--veo-primary)); color: #fff;\n border-color: var(--veo-scale-color, var(--veo-primary));\n}\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 { BADGE_MARKER_HOST_ATTR, 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 * Host SUELTO con los mismos estilos (shadow DOM), sin agregarlo al DOM ni\n * registrarlo como `this.host`. Para piezas que deben vivir dentro de la app\n * (el marcador de un badge, junto a su ancla) mientras la tarjeta se queda\n * en `body`: si la tarjeta viajara dentro del ancla, un ancestro con\n * `transform`/`overflow` la recortaría y su z-index quedaría atrapado.\n */\n protected createDetachedHost(attr = BADGE_MARKER_HOST_ATTR): {\n host: HTMLElement;\n root: HTMLElement;\n } {\n const host = document.createElement('div');\n host.setAttribute(attr, '');\n const shadow = host.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = GUIDE_STYLES;\n shadow.appendChild(style);\n const root = document.createElement('div');\n shadow.appendChild(root);\n this.registerCleanup(() => host.remove());\n return { host, 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 * El caret es un cuadrado rotado 45°: según hacia dónde apunte, su punta la\n * forman dos de sus lados. Solo esos llevan borde; los otros dos quedan DENTRO\n * del tooltip y, con borde, dibujaban una línea que «cerraba» la flecha.\n */\nconst OUTER_EDGES: Record<'top' | 'bottom' | 'left' | 'right', readonly string[]> = {\n top: ['top', 'left'],\n right: ['top', 'right'],\n bottom: ['bottom', 'right'],\n left: ['bottom', '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 // Caret con borde (`data-veo-border` = grosor en px): borde solo en la punta y\n // por ENCIMA de la tarjeta, así su mitad interior tapa el borde del tooltip y\n // la flecha queda abierta hacia él.\n const width = arrowEl.dataset.veoBorder;\n if (width) {\n for (const edge of ['top', 'right', 'bottom', 'left']) {\n arrowEl.style.setProperty(\n `border-${edge}-width`,\n OUTER_EDGES[side].includes(edge) ? `${width}px` : '0',\n );\n }\n arrowEl.style.zIndex = '1';\n }\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { buildStepContent, isSafeUrl } from '../block-builder';\nimport { COLOR_RE } from '../guide-design';\nimport { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type {\n BadgeConfig,\n BadgeTrigger,\n GuideInteractionMetadata,\n GuideRenderContext,\n GuideStep,\n} from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { positionArrow } from './floating-arrow';\n\n/** Retardo de gracia del hover: permite mover el mouse del badge al tooltip. */\nconst HOVER_CLOSE_DELAY_MS = 150;\n\n/**\n * Renderiza una guía tipo `badge` (estilo Pendo): un elemento CHICO —\n * icono/punto/cápsula/imagen — inyectado EN EL FLUJO del DOM junto al ancla\n * (`step.selector` + `style.inlinePosition`), que al hover o click\n * (`style.badgeTrigger`) abre un tooltip con el contenido del paso.\n *\n * Composición (no herencia): reusa `insertHost`/`keepHostAttached` del inline\n * (watchdog contra re-renders de React), `buildStepContent` (bloques) y el\n * posicionamiento Floating UI + caret del tooltip — con `strategy: 'fixed'`\n * porque el host vive DENTRO del flujo del cliente y un ancestro con\n * `overflow: hidden` recortaría un tooltip absoluto.\n *\n * EL BADGE ES PERMANENTE (como en Pendo): nada de lo que haga el usuario lo\n * quita — lo único que se abre y se cierra es el TOOLTIP. La ✕ del tooltip, el\n * hover-out, el click afuera, Esc y los CTA solo cierran el tooltip; el badge\n * queda para volver a consultarlo cuando quiera. Por eso el badge nunca emite\n * `dismissed` (no hay forma de descartarlo) y su frecuencia natural es `always`.\n *\n * Analytics (deliberado):\n * - `shown` la PRIMERA vez que se ABRE el tooltip (no al inyectar el badge):\n * mide cuánta gente abrió la ayuda, no en cuántas páginas existía el icono.\n * - `cta_clicked` en los botones del tooltip (con buttonId si lo tienen).\n */\nexport class BadgeRenderer extends BaseRenderer {\n private tooltip: HTMLElement | null = null;\n private arrowEl: HTMLElement | null = null;\n private badgeBtn: HTMLButtonElement | null = null;\n private open = false;\n private shownEmitted = false;\n private trigger: BadgeTrigger = 'hover';\n private side: 'top' | 'bottom' | 'left' | 'right' = 'top';\n private closeTimer: number | null = null;\n private stopFloat: (() => void) | null = null;\n\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n const { host, root } = this.createHost();\n const ownerDocument = root.ownerDocument ?? document;\n this.applyDesign(step.style);\n // Ancho del tooltip personalizable (slider «Ancho» del editor). Var\n // dedicada: --veo-width no distingue \"no seteado\" (el :host la define).\n const tipWidth = step.style?.width;\n if (typeof tipWidth === 'number' && Number.isFinite(tipWidth)) {\n host.style.setProperty(\n '--veo-badge-tip-width',\n `${Math.min(720, Math.max(220, tipWidth))}px`,\n );\n }\n this.trigger = step.style?.badgeTrigger === 'click' ? 'click' : 'hover';\n const rawSide = step.style?.tooltipPlacement;\n this.side = rawSide === 'bottom' || rawSide === 'left' || rawSide === 'right' ? rawSide : 'top';\n\n // ── Badge en el flujo del DOM, pegado al ancla ──\n const position = readInlinePosition(step.style);\n host.style.display = 'inline-flex';\n host.style.verticalAlign = 'middle';\n const badge = buildBadgeElement(readBadgeConfig(step), ownerDocument);\n root.appendChild(badge);\n this.badgeBtn = badge;\n insertHost(anchor, host, position);\n this.registerCleanup(keepHostAttached(host, selector, position));\n\n // ── Tooltip (cerrado hasta el trigger) ──\n const tooltip = ownerDocument.createElement('div');\n tooltip.className = 'veo-tooltip veo-badge-tooltip';\n tooltip.style.display = 'none';\n\n const emit = (action: 'shown' | 'cta_clicked', meta?: GuideInteractionMetadata): void => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action,\n ...(meta ? { metadata: meta } : {}),\n });\n };\n\n const buildTooltipContent = (s: GuideStep): HTMLElement =>\n buildStepContent(s, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n emit('cta_clicked', meta);\n if (action === 'url' && target) window.open(target, '_blank', 'noopener,noreferrer');\n // TODO cierra solo el TOOLTIP — el badge es permanente.\n this.closeTooltip();\n // Encadenado: además abre la otra guía.\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n // La ✕ también cierra solo el tooltip (nunca el badge, nunca dismissed).\n onDismiss: () => this.closeTooltip(),\n });\n\n const content = buildTooltipContent(step);\n tooltip.appendChild(content);\n\n const arrowEl = ownerDocument.createElement('div');\n arrowEl.className = 'veo-tooltip-arrow';\n tooltip.appendChild(arrowEl);\n root.appendChild(tooltip);\n this.tooltip = tooltip;\n this.arrowEl = arrowEl;\n\n // Update in-place (preview del editor).\n this.liveContainer = tooltip;\n this.liveContent = content;\n this.liveKey = this.liveKeyOf(step);\n this.liveBuild = buildTooltipContent;\n\n // ── Trigger ──\n const openNow = (): void => {\n this.cancelClose();\n if (!this.open) {\n this.openTooltip(badge);\n if (!this.shownEmitted) {\n this.shownEmitted = true;\n emit('shown');\n }\n }\n };\n if (this.trigger === 'hover') {\n const scheduleClose = (): void => {\n this.cancelClose();\n this.closeTimer = window.setTimeout(() => this.closeTooltip(), HOVER_CLOSE_DELAY_MS);\n };\n badge.addEventListener('mouseenter', openNow);\n badge.addEventListener('focus', openNow);\n badge.addEventListener('mouseleave', scheduleClose);\n badge.addEventListener('blur', scheduleClose);\n tooltip.addEventListener('mouseenter', () => this.cancelClose());\n tooltip.addEventListener('mouseleave', scheduleClose);\n } else {\n badge.addEventListener('click', () => {\n if (this.open) this.closeTooltip();\n else openNow();\n });\n const onDocClick = (e: MouseEvent): void => {\n if (!this.open) return;\n // El shadow host encapsula badge y tooltip: un click cuyo path no pasa\n // por el host es \"afuera\".\n if (e.composedPath().includes(host)) return;\n this.closeTooltip();\n };\n document.addEventListener('click', onDocClick, true);\n this.registerCleanup(() => document.removeEventListener('click', onDocClick, true));\n }\n const onKey = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this.open) this.closeTooltip();\n };\n document.addEventListener('keydown', onKey);\n this.registerCleanup(() => document.removeEventListener('keydown', onKey));\n\n // En el editor, el autor edita el CONTENIDO del tooltip: abrirlo de entrada\n // (si no, se edita a ciegas). No emite shown (isPreview no trackea igual).\n if (context.isPreview) openNow();\n }\n\n /** Cambiar de ancla/posición/trigger requiere re-montar y re-cablear. */\n protected override liveKeyOf(step: GuideStep): string {\n const selector = step.selector ?? '';\n const position = readInlinePosition(step.style);\n const trigger = step.style?.badgeTrigger === 'click' ? 'click' : 'hover';\n return `${selector}|${position}|${trigger}`;\n }\n\n protected override onLiveUpdate(step: GuideStep): void {\n // Re-pintar el badge (kind/color/size) y reposicionar si está abierto.\n if (this.badgeBtn) {\n const doc = this.badgeBtn.ownerDocument;\n const next = buildBadgeElement(readBadgeConfig(step), doc);\n // Conservar listeners del botón: solo se actualiza el interior + clases.\n this.badgeBtn.className = next.className;\n this.badgeBtn.setAttribute('style', next.getAttribute('style') ?? '');\n this.badgeBtn.replaceChildren(...Array.from(next.childNodes));\n }\n const rawSide = step.style?.tooltipPlacement;\n this.side = rawSide === 'bottom' || rawSide === 'left' || rawSide === 'right' ? rawSide : 'top';\n if (this.open && this.badgeBtn) this.position(this.badgeBtn);\n }\n\n override destroy(): void {\n this.cancelClose();\n this.stopFloat?.();\n this.stopFloat = null;\n this.tooltip = null;\n this.arrowEl = null;\n this.badgeBtn = null;\n this.open = false;\n super.destroy();\n }\n\n private openTooltip(badge: HTMLElement): void {\n if (!this.tooltip) return;\n this.tooltip.style.display = 'block';\n this.open = true;\n void this.position(badge);\n const reposition = (): void => {\n void this.position(badge);\n };\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n this.stopFloat = () => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n }\n\n private closeTooltip(): void {\n this.cancelClose();\n if (!this.tooltip || !this.open) return;\n this.tooltip.style.display = 'none';\n this.open = false;\n this.stopFloat?.();\n this.stopFloat = null;\n }\n\n private cancelClose(): void {\n if (this.closeTimer !== null) {\n window.clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n }\n\n private async position(badge: HTMLElement): Promise<void> {\n const tooltip = this.tooltip;\n const arrowEl = this.arrowEl;\n if (!tooltip || !arrowEl) return;\n const { x, y, placement, middlewareData } = await computePosition(badge, tooltip, {\n strategy: 'fixed',\n placement: this.side,\n middleware: [offset(8), flip(), shift({ padding: 8 }), arrow({ element: arrowEl })],\n });\n tooltip.style.left = `${x}px`;\n tooltip.style.top = `${y}px`;\n positionArrow(arrowEl, placement, middlewareData.arrow);\n }\n}\n\n/** Lee y normaliza `style.badge` (defaults seguros). */\nfunction readBadgeConfig(step: GuideStep): BadgeConfig {\n const raw = step.style?.badge;\n if (!raw || typeof raw !== 'object') return { kind: 'icon' };\n const b = raw as Record<string, unknown>;\n const kind =\n b.kind === 'dot' ||\n b.kind === 'pill' ||\n b.kind === 'text' ||\n b.kind === 'image' ||\n b.kind === 'icon'\n ? b.kind\n : 'icon';\n return {\n kind,\n icon: typeof b.icon === 'string' ? b.icon : null,\n text: typeof b.text === 'string' ? b.text : null,\n imageUrl: typeof b.imageUrl === 'string' ? b.imageUrl : null,\n color: typeof b.color === 'string' && COLOR_RE.test(b.color.trim()) ? b.color.trim() : null,\n size: typeof b.size === 'number' && Number.isFinite(b.size) ? b.size : null,\n };\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, n));\n}\n\n/**\n * Construye el elemento visual del badge. `<button>` por accesibilidad\n * (focus/teclado). Texto por `textContent`; imagen por `isSafeUrl`.\n */\nfunction buildBadgeElement(config: BadgeConfig, doc: Document): HTMLButtonElement {\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.className = `veo-badge veo-badge--${config.kind}`;\n btn.setAttribute('aria-label', 'Más información');\n const size = clamp(config.size ?? 18, 8, 48);\n\n switch (config.kind) {\n case 'dot':\n btn.style.width = `${size}px`;\n btn.style.height = `${size}px`;\n if (config.color) btn.style.background = config.color;\n break;\n case 'pill': {\n btn.textContent = config.text?.slice(0, 24) || 'Nuevo';\n btn.style.fontSize = `${clamp(Math.round(size * 0.62), 8, 24)}px`;\n if (config.color) btn.style.background = config.color;\n break;\n }\n case 'text': {\n // Texto plano, sin cápsula: hereda el color de acento (o el custom).\n btn.textContent = config.text?.slice(0, 32) || 'Nuevo';\n btn.style.fontSize = `${clamp(Math.round(size * 0.7), 9, 28)}px`;\n if (config.color) btn.style.color = config.color;\n break;\n }\n case 'image': {\n if (config.imageUrl && isSafeUrl(config.imageUrl)) {\n const img = doc.createElement('img');\n img.src = config.imageUrl;\n img.alt = '';\n img.style.width = `${size}px`;\n img.style.height = `${size}px`;\n btn.appendChild(img);\n } else {\n // Sin imagen válida degrada a icono para que el badge no sea invisible.\n btn.className = 'veo-badge veo-badge--icon';\n btn.textContent = '?';\n btn.style.width = `${size}px`;\n btn.style.height = `${size}px`;\n btn.style.fontSize = `${clamp(Math.round(size * 0.62), 8, 32)}px`;\n }\n break;\n }\n default: {\n // icon: carácter/emoji dentro de un circulito.\n btn.textContent = (config.icon || 'ℹ️').slice(0, 4);\n btn.style.width = `${size}px`;\n btn.style.height = `${size}px`;\n btn.style.fontSize = `${clamp(Math.round(size * 0.62), 8, 32)}px`;\n if (config.color) btn.style.color = config.color;\n break;\n }\n }\n return btn;\n}\n","import { buildContentNodes, createCloseButton } from './block-builder';\nimport type { GuideStep, WalkthroughCallbacks } from './types';\n\n/**\n * Construye el subtree DOM de un step de walkthrough con navegación\n * (counter, dots, contenido, botones atrás/siguiente/finalizar/omitir).\n *\n * Aplica las mismas reglas de seguridad que `buildStepContent`:\n * - `textContent` para todo string del backend (cero `innerHTML`).\n * - `imageUrl` validada con `isSafeUrl`.\n *\n * El botón primario cambia su label según el step:\n * - último step → \"Finalizar\" → llama `onComplete`\n * - otro → `step.ctaText` o \"Siguiente\" → llama `onNext`\n *\n * El botón \"Atrás\" solo se pinta a partir del segundo step. El botón\n * \"Omitir\" siempre se pinta — el usuario debe poder salir en cualquier\n * momento.\n */\nexport function buildWalkthroughStepContent(\n step: GuideStep,\n stepIndex: number,\n totalSteps: number,\n doc: Document,\n callbacks: WalkthroughCallbacks,\n): HTMLElement {\n const container = doc.createElement('div');\n container.className = 'veo-guide-content';\n\n const counter = doc.createElement('div');\n counter.className = 'veo-walkthrough-counter';\n counter.textContent = `Paso ${stepIndex + 1} de ${totalSteps}`;\n container.appendChild(counter);\n\n const progress = doc.createElement('div');\n progress.className = 'veo-walkthrough-progress';\n for (let i = 0; i < totalSteps; i++) {\n const dot = doc.createElement('span');\n dot.className = 'veo-walkthrough-progress-dot';\n if (i < stepIndex) dot.classList.add('completed');\n if (i === stepIndex) dot.classList.add('active');\n progress.appendChild(dot);\n }\n container.appendChild(progress);\n\n // Contenido del paso: respeta blocks[] (imágenes, rich text, full-bleed) o\n // cae a los escalares. Los bloques `button` se omiten — la navegación\n // (atrás/siguiente/omitir) es del chrome del tour, abajo.\n for (const node of buildContentNodes(step, doc)) {\n container.appendChild(node);\n }\n\n const actions = doc.createElement('div');\n actions.className = 'veo-walkthrough-actions';\n\n const skipBtn = doc.createElement('button');\n skipBtn.type = 'button';\n skipBtn.className = 'veo-walkthrough-skip';\n skipBtn.textContent = 'Omitir';\n skipBtn.addEventListener('click', () => callbacks.onSkip());\n actions.appendChild(skipBtn);\n\n const rightGroup = doc.createElement('div');\n rightGroup.className = 'veo-walkthrough-actions-right';\n\n if (stepIndex > 0) {\n const backBtn = doc.createElement('button');\n backBtn.type = 'button';\n backBtn.className = 'veo-walkthrough-btn-secondary';\n backBtn.textContent = 'Atrás';\n backBtn.addEventListener('click', () => callbacks.onBack());\n rightGroup.appendChild(backBtn);\n }\n\n const isLastStep = stepIndex === totalSteps - 1;\n const primaryBtn = doc.createElement('button');\n primaryBtn.type = 'button';\n primaryBtn.className = 'veo-guide-cta';\n const defaultLabel = isLastStep ? 'Finalizar' : 'Siguiente';\n primaryBtn.textContent =\n typeof step.ctaText === 'string' && step.ctaText ? step.ctaText : defaultLabel;\n primaryBtn.addEventListener('click', () => {\n if (isLastStep) callbacks.onComplete();\n else callbacks.onNext();\n });\n rightGroup.appendChild(primaryBtn);\n\n actions.appendChild(rightGroup);\n container.appendChild(actions);\n\n // \"✕\" universal (esquina superior derecha): salir en cualquier momento.\n // Mismo efecto que \"Omitir\" → reporta `dismissed`.\n container.appendChild(createCloseButton(doc, () => callbacks.onSkip()));\n\n return container;\n}\n","import { buildStepContent } from '../block-builder';\nimport { insertHost, keepHostAttached } from '../inline-host';\nimport type { GuideInteractionMetadata, GuideRenderContext, GuideStep } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { buildWalkthroughStepContent } from '../walkthrough-block-builder';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía tipo `banner`. Dos modos:\n *\n * - **Pantalla completa** (default): barra fija arriba o abajo del viewport.\n * La posición se lee de `step.style.position` (`top` | `bottom`).\n * - **Embebido en un contenedor** (`step.selector` presente): el banner se\n * inserta DENTRO del contenedor elegido (prepend con `top`, append con\n * `bottom`) y empuja su contenido — como los \"element banners\" de Pendo.\n * Reusa el watchdog inline (`keepHostAttached`) porque los frameworks del\n * host borran nodos ajenos al re-renderizar.\n *\n * No tiene backdrop ni atrapa el foco. Con `context.nav` (paso de un\n * walkthrough heterogéneo) muestra botones de navegación y delega\n * tracking/avance al controller — solo en modo pantalla completa.\n */\nexport class BannerRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const idx = context.nav?.stepIndex ?? 0;\n const step = context.guide.guideSteps[idx];\n if (!step) return;\n\n const position = step.style?.position === 'bottom' ? 'bottom' : 'top';\n // Con selector el banner se EMBEBE en ese contenedor — también en pasos de\n // secuencia (el chrome de navegación viaja adentro). En un paso-tooltip el\n // selector es el ancla; en un paso-banner es el contenedor: no colisionan\n // porque cada paso tiene UNA presentación.\n const selector = step.selector?.trim() || null;\n\n let anchor: Element | null = null;\n if (selector) {\n anchor = await waitForElement(selector);\n if (!anchor) return; // contenedor ausente → no pintar (como tooltip/inline)\n }\n\n const { host, root } = this.createHost();\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const banner = ownerDocument.createElement('div');\n banner.className = bannerClassOf(position, Boolean(anchor));\n\n const dismiss = (\n action: 'dismissed' | 'cta_clicked',\n ctaUrl?: string,\n meta?: GuideInteractionMetadata,\n ) => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: idx,\n action,\n ...(meta ? { metadata: meta } : {}),\n });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n\n const content = context.nav\n ? buildWalkthroughStepContent(\n step,\n context.nav.stepIndex,\n context.nav.totalSteps,\n ownerDocument,\n context.nav.callbacks,\n )\n : buildStepContent(step, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n\n banner.appendChild(content);\n root.appendChild(banner);\n\n if (selector && anchor) {\n host.style.display = 'block';\n const insertAt = position === 'top' ? 'prepend' : 'append';\n insertHost(anchor, host, insertAt);\n this.registerCleanup(keepHostAttached(host, selector, insertAt));\n }\n\n if (!context.nav) {\n this.liveContainer = banner;\n this.liveContent = content;\n this.liveBuild = (s) =>\n buildStepContent(s, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n this.liveKey = this.liveKeyOf(step);\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n }\n\n /** Cambiar de contenedor o de top/bottom embebido requiere re-insertar → remontar. */\n protected override liveKeyOf(step: GuideStep): string {\n const selector = step.selector?.trim() ?? '';\n if (!selector) return '';\n const position = step.style?.position === 'bottom' ? 'bottom' : 'top';\n return `${selector}|${position}`;\n }\n\n protected override onLiveUpdate(step: GuideStep): void {\n // La posición del banner de pantalla completa (top/bottom) es solo una\n // clase del wrapper — se actualiza en vivo. (El embebido remonta vía liveKey.)\n if (this.liveContainer) {\n const position = step.style?.position === 'bottom' ? 'bottom' : 'top';\n const embedded = Boolean(step.selector?.trim());\n this.liveContainer.className = bannerClassOf(position, embedded);\n }\n }\n}\n\nfunction bannerClassOf(position: 'top' | 'bottom', embedded: boolean): string {\n return embedded ? 'veo-banner veo-banner-embedded' : `veo-banner veo-banner-${position}`;\n}\n","import { renderRichText } from './rich-text';\nimport type { GuideProgressItem, GuideRenderContext, StepBlock } from './types';\n\n/**\n * Bloque «Lista de tareas» (mock): título (rich text del bloque), un ítem por\n * guía con anillo de progreso + texto + subtítulo («Completado 1 de 2 pasos»)\n * y al pie «X de N completadas», porcentaje y barra. El progreso llega por\n * `context.fetchProgress` (async): el bloque se pinta al instante y se rellena\n * cuando responde. Clic en un ítem abre esa guía en el paso donde el usuario\n * se quedó.\n */\n\n/** Estilos del bloque (`block.style`) con sus valores por defecto. */\nexport interface ChecklistStyle {\n colorMode: 'light' | 'dark';\n iconEmptyColor: string;\n iconFillColor: string;\n barColor: string;\n barHeight: number;\n fontSize: number;\n fontWeight: number;\n titleColor: string;\n subtitleColor: string;\n subtitleTemplate: string;\n}\n\nexport const CHECKLIST_DEFAULTS: ChecklistStyle = {\n colorMode: 'light',\n iconEmptyColor: '#e7e2de',\n iconFillColor: '#406a31',\n barColor: '#406a31',\n barHeight: 8,\n fontSize: 14,\n fontWeight: 600,\n titleColor: '#2c2825',\n subtitleColor: '#8a8582',\n subtitleTemplate: 'Completado <%= currentStep %> de <%= totalSteps %> pasos',\n};\n\nconst WEIGHTS: Record<string, number> = { regular: 400, medium: 500, semibold: 600, bold: 700 };\n\nexport function checklistStyle(style: Record<string, unknown> | null | undefined): ChecklistStyle {\n const s = style ?? {};\n const str = (k: keyof ChecklistStyle, fb: string): string =>\n typeof s[k] === 'string' && (s[k] as string).trim() ? (s[k] as string) : fb;\n const num = (k: keyof ChecklistStyle, fb: number, min: number, max: number): number =>\n typeof s[k] === 'number' && Number.isFinite(s[k] as number)\n ? Math.min(max, Math.max(min, s[k] as number))\n : fb;\n const weightRaw = s.fontWeight;\n const fontWeight =\n typeof weightRaw === 'number'\n ? Math.min(900, Math.max(100, weightRaw))\n : typeof weightRaw === 'string' && WEIGHTS[weightRaw.toLowerCase()]\n ? (WEIGHTS[weightRaw.toLowerCase()] as number)\n : CHECKLIST_DEFAULTS.fontWeight;\n const dark = s.colorMode === 'dark';\n return {\n colorMode: dark ? 'dark' : 'light',\n iconEmptyColor: str('iconEmptyColor', dark ? '#3c3734' : CHECKLIST_DEFAULTS.iconEmptyColor),\n iconFillColor: str('iconFillColor', CHECKLIST_DEFAULTS.iconFillColor),\n barColor: str('barColor', CHECKLIST_DEFAULTS.barColor),\n barHeight: num('barHeight', CHECKLIST_DEFAULTS.barHeight, 2, 40),\n fontSize: num('fontSize', CHECKLIST_DEFAULTS.fontSize, 10, 40),\n fontWeight,\n titleColor: str('titleColor', dark ? '#f5efeb' : CHECKLIST_DEFAULTS.titleColor),\n subtitleColor: str('subtitleColor', dark ? '#b0a9a5' : CHECKLIST_DEFAULTS.subtitleColor),\n subtitleTemplate: str('subtitleTemplate', CHECKLIST_DEFAULTS.subtitleTemplate),\n };\n}\n\n/** «Completado <%= currentStep %> de <%= totalSteps %>» → texto. */\nexport function renderSubtitle(\n template: string,\n p: { currentStep: number; totalSteps: number },\n): string {\n return template\n .replace(/<%=\\s*currentStep\\s*%>/g, String(p.currentStep))\n .replace(/<%=\\s*totalSteps\\s*%>/g, String(p.totalSteps));\n}\n\nconst RING_R = 10;\nconst RING_C = 2 * Math.PI * RING_R;\n\n/** Anillo de progreso (SVG): fracción rellena; completo = círculo lleno con check. */\nfunction buildRing(\n doc: Document,\n fraction: number,\n completed: boolean,\n st: ChecklistStyle,\n): SVGElement {\n const ns = 'http://www.w3.org/2000/svg';\n const svg = doc.createElementNS(ns, 'svg');\n svg.setAttribute('viewBox', '0 0 28 28');\n svg.setAttribute('class', 'veo-checklist-ring');\n svg.setAttribute('aria-hidden', 'true');\n const track = doc.createElementNS(ns, 'circle');\n track.setAttribute('cx', '14');\n track.setAttribute('cy', '14');\n track.setAttribute('r', String(RING_R));\n track.setAttribute('fill', completed ? st.iconFillColor : 'none');\n track.setAttribute('stroke', st.iconEmptyColor);\n track.setAttribute('stroke-width', '4.5');\n svg.appendChild(track);\n if (completed) {\n const check = doc.createElementNS(ns, 'path');\n check.setAttribute('d', 'M9 14.5l3.2 3.2L19 11');\n check.setAttribute('fill', 'none');\n check.setAttribute('stroke', '#fff');\n check.setAttribute('stroke-width', '2.4');\n check.setAttribute('stroke-linecap', 'round');\n check.setAttribute('stroke-linejoin', 'round');\n svg.appendChild(check);\n return svg;\n }\n const f = Math.max(0, Math.min(1, fraction));\n if (f > 0) {\n const arc = doc.createElementNS(ns, 'circle');\n arc.setAttribute('cx', '14');\n arc.setAttribute('cy', '14');\n arc.setAttribute('r', String(RING_R));\n arc.setAttribute('fill', 'none');\n arc.setAttribute('stroke', st.iconFillColor);\n arc.setAttribute('stroke-width', '4.5');\n arc.setAttribute('stroke-linecap', 'butt');\n arc.setAttribute('stroke-dasharray', `${(RING_C * f).toFixed(2)} ${RING_C.toFixed(2)}`);\n arc.setAttribute('transform', 'rotate(-90 14 14)');\n svg.appendChild(arc);\n }\n return svg;\n}\n\nexport function buildChecklistBlock(\n block: StepBlock,\n doc: Document,\n context: GuideRenderContext,\n): HTMLElement {\n const st = checklistStyle(block.style as Record<string, unknown> | null | undefined);\n const items = (block.items ?? []).filter((i) => i && typeof i.guideId === 'string' && i.guideId);\n const root = doc.createElement('div');\n root.className = `veo-checklist${st.colorMode === 'dark' ? ' veo-checklist--dark' : ''}`;\n root.style.setProperty('--veo-cl-font-size', `${st.fontSize}px`);\n root.style.setProperty('--veo-cl-font-weight', String(st.fontWeight));\n root.style.setProperty('--veo-cl-title', st.titleColor);\n root.style.setProperty('--veo-cl-subtitle', st.subtitleColor);\n root.style.setProperty('--veo-cl-bar', st.barColor);\n root.style.setProperty('--veo-cl-bar-h', `${st.barHeight}px`);\n\n // Título: rich text del bloque (o texto plano).\n if (\n (typeof block.html === 'string' && block.html) ||\n (typeof block.text === 'string' && block.text)\n ) {\n const title = doc.createElement('div');\n title.className = 'veo-checklist-title';\n if (typeof block.html === 'string' && block.html)\n title.appendChild(renderRichText(block.html, doc));\n else title.textContent = block.text as string;\n root.appendChild(title);\n }\n\n const list = doc.createElement('div');\n list.className = 'veo-checklist-items';\n list.setAttribute('role', 'list');\n root.appendChild(list);\n\n const footer = doc.createElement('div');\n footer.className = 'veo-checklist-footer';\n const summary = doc.createElement('div');\n summary.className = 'veo-checklist-summary';\n const count = doc.createElement('span');\n count.className = 'veo-checklist-count';\n const percent = doc.createElement('span');\n percent.className = 'veo-checklist-percent';\n summary.append(count, percent);\n const bar = doc.createElement('div');\n bar.className = 'veo-checklist-bar';\n const fill = doc.createElement('div');\n fill.className = 'veo-checklist-bar-fill';\n bar.appendChild(fill);\n footer.append(summary, bar);\n root.appendChild(footer);\n\n /** Pinta la lista con el progreso que haya (sin progreso: ítems sin subtítulo). */\n const paint = (progress: Map<string, GuideProgressItem> | null): void => {\n list.textContent = '';\n // Con progreso del backend solo se listan las guías publicadas (las demás no vienen).\n const visible = progress ? items.filter((i) => progress.has(i.guideId)) : items;\n let done = 0;\n for (const item of visible) {\n const p = progress?.get(item.guideId) ?? null;\n if (p?.completed) done++;\n const row = doc.createElement('button');\n row.type = 'button';\n row.className = `veo-checklist-item${p?.completed ? ' veo-checklist-item--done' : ''}`;\n row.setAttribute('role', 'listitem');\n const fraction = p && p.totalSteps > 0 ? p.currentStep / p.totalSteps : 0;\n row.appendChild(buildRing(doc, fraction, p?.completed === true, st));\n const texts = doc.createElement('span');\n texts.className = 'veo-checklist-texts';\n const label = doc.createElement('span');\n label.className = 'veo-checklist-label';\n label.textContent = (item.text ?? '').trim() || p?.guideName || 'Guía';\n if (p && p.published === false) row.title = 'Guía no publicada: los usuarios no la verán';\n texts.appendChild(label);\n if (p) {\n const sub = doc.createElement('span');\n sub.className = 'veo-checklist-sub';\n sub.textContent = renderSubtitle(st.subtitleTemplate, p);\n texts.appendChild(sub);\n }\n row.appendChild(texts);\n row.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (context.isPreview) return; // en el editor no se salta a otra guía\n // Retoma en el paso donde se quedó (completada → desde el principio).\n const start = p && !p.completed ? Math.min(p.currentStep, p.totalSteps - 1) : 0;\n if (context.onOpenGuideAt) context.onOpenGuideAt(item.guideId, start);\n else context.onOpenGuide?.(item.guideId);\n });\n list.appendChild(row);\n }\n const total = visible.length;\n const pct = total > 0 ? Math.round((done / total) * 100) : 0;\n count.textContent = `${done} de ${total} ${total === 1 ? 'completada' : 'completadas'}`;\n percent.textContent = `${pct}%`;\n fill.style.width = `${pct}%`;\n footer.hidden = total === 0;\n };\n\n // Editor sin guías todavía: dos ítems de ejemplo para ver el diseño (no se guardan).\n if (context.isPreview && items.length === 0) {\n const sample = new Map<string, GuideProgressItem>([\n [\n '__sample_1',\n {\n guideId: '__sample_1',\n guideName: 'Configura tu primer envío',\n totalSteps: 2,\n currentStep: 1,\n completed: false,\n },\n ],\n [\n '__sample_2',\n {\n guideId: '__sample_2',\n guideName: 'Conecta tu tienda',\n totalSteps: 2,\n currentStep: 2,\n completed: true,\n },\n ],\n ]);\n items.push(\n { guideId: '__sample_1', text: 'Configura tu primer envío' },\n { guideId: '__sample_2', text: 'Conecta tu tienda' },\n );\n paint(sample);\n const hint = doc.createElement('p');\n hint.className = 'veo-checklist-empty';\n hint.textContent = 'Ejemplo: agrega guías a la lista desde Opciones.';\n root.appendChild(hint);\n return root;\n }\n paint(null);\n if (context.fetchProgress && items.length > 0) {\n void context\n .fetchProgress(items.map((i) => i.guideId))\n .then((rows) => paint(new Map(rows.map((r) => [r.guideId, r]))))\n .catch(() => {\n /* sin progreso: se queda la lista sin subtítulos */\n });\n }\n return root;\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 const min = typeof field.min === 'number' ? field.min : 0;\n const max = typeof field.max === 'number' && field.max > min ? field.max : 10;\n return buildScale(wrapper, doc, min, max, 'veo-nps-btn', undefined, {\n labels: field.scaleLabels ?? [],\n showLabels: field.showLabels !== false,\n });\n }\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/**\n * Fila de casillas numeradas (escala numérica, p. ej. 0-10 o 1-5) o de\n * estrellas (rating 1-5). Con `labels`, cada casilla lleva su etiqueta como\n * nombre accesible y, si `showLabels`, se pinta debajo de SU casilla (la\n * primera alineada a la izquierda, la última a la derecha, el resto centradas).\n */\nfunction buildScale(\n wrapper: HTMLElement,\n doc: Document,\n min: number,\n max: number,\n btnClass: string,\n symbol?: string,\n opts: { labels: string[]; showLabels: boolean } = { labels: [], showLabels: false },\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 const labelOf = (n: number): string => opts.labels[n - min]?.trim() ?? '';\n const anyLabel =\n opts.showLabels &&\n Array.from({ length: max - min + 1 }, (_, i) => min + i).some((n) => labelOf(n));\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 const lbl = labelOf(n);\n btn.setAttribute('aria-label', lbl ? `${n} · ${lbl}` : String(n));\n if (lbl) btn.title = lbl;\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 if (!anyLabel) {\n row.appendChild(btn);\n continue;\n }\n // Casilla + su etiqueta debajo (columna). Los extremos cuelgan hacia afuera.\n const item = doc.createElement('div');\n item.className = `veo-scale-item${n === min ? ' veo-scale-item--first' : n === max ? ' veo-scale-item--last' : ''}`;\n const text = doc.createElement('span');\n text.className = 'veo-scale-label';\n text.textContent = lbl;\n item.append(btn, text);\n row.appendChild(item);\n }\n wrapper.appendChild(row);\n return { wrapper, read: () => selected };\n}\n","import type {\n GuideTheme,\n GuideThemeBox,\n GuideThemeButton,\n GuideThemeMode,\n GuideThemeText,\n} from './types';\n\n/** Id del tema del workspace en `step.design.theme` (el editor lo llama «Tema de tu marca»). */\nexport const WORKSPACE_THEME_ID = 'workspace';\n\nconst SHADOW_SPEC = {\n soft: { y: 4, blur: 14, alpha: 0.12 },\n medium: { y: 12, blur: 32, alpha: 0.22 },\n strong: { y: 24, blur: 64, alpha: 0.38 },\n} as const;\n\nconst JUSTIFY: Record<GuideThemeBox['align'], string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n distribute: 'space-between',\n};\n\nfunction channels(hex: string): [number, number, number] {\n const h = hex.replace('#', '');\n const full = h.length === 3 ? [...h].map((x) => x + x).join('') : h.slice(0, 6);\n const ch = (i: number): number => Number.parseInt(full.slice(i, i + 2), 16) || 0;\n return [ch(0), ch(2), ch(4)];\n}\n\n/** `box-shadow` CSS de un tipo de sombra del tema con su color. */\nfunction boxShadow(shadow: 'none' | 'soft' | 'medium' | 'strong', hex: string): string {\n if (shadow === 'none') return 'none';\n const spec = SHADOW_SPEC[shadow];\n const [r, g, b] = channels(hex);\n return `0 ${spec.y}px ${spec.blur}px rgba(${r}, ${g}, ${b}, ${spec.alpha})`;\n}\n\n/** Texto legible (oscuro/blanco) sobre un fondo hex, por luminancia. */\nexport function readableOn(hex: string): string {\n const [r, g, b] = channels(hex);\n return (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255 > 0.6 ? '#111827' : '#ffffff';\n}\n\n/** ¿Este paso usa el tema del workspace y la guía lo trae? Devuelve el modo de color a aplicar. */\nexport function themeModeFor(\n theme: GuideTheme | null | undefined,\n design: Record<string, unknown>,\n): GuideThemeMode | null {\n if (!theme || design.theme !== WORKSPACE_THEME_ID) return null;\n return (design.colorMode === 'dark' ? theme.dark : theme.light) ?? null;\n}\n\n/**\n * Alineación (`justify-content`) de una fila de botones según el tema: la decide\n * el PRIMER botón de la fila por su preset (primario/secundario/link). `null` = no\n * opina (preset sin tema, o el contenedor pide «Distribuir», que ya va por\n * `--veo-actions-justify`).\n */\nexport function themeRowJustify(\n mode: GuideThemeMode,\n inline: boolean,\n preset: unknown,\n): string | null {\n const box = inline ? mode.embedded : mode.overlay;\n if (box.align === 'distribute') return null;\n const button =\n preset === 'secondary'\n ? mode.buttons?.secondary\n : preset === 'link'\n ? mode.buttons?.tertiary\n : preset === undefined || preset === null || preset === 'primary'\n ? mode.buttons?.primary\n : undefined;\n return button ? (JUSTIFY[button.align] ?? null) : null;\n}\n\n/**\n * Las tipografías del tema pueden ser REFERENCIAS a la app: `inherit` = su\n * fuente de cuerpo, `app-heading` = la de sus encabezados. Se leen en vivo del\n * documento (la guía vive en un shadow DOM que no hereda la fuente).\n */\nfunction appFont(ref: string, doc: Document): string | null {\n const view = doc.defaultView;\n if (!view) return null;\n if (ref === 'inherit') return view.getComputedStyle(doc.body).fontFamily || null;\n if (ref === 'app-heading') {\n const heading = Array.from(doc.querySelectorAll('h1,h2,h3')).find(\n (el) => el.getClientRects().length > 0,\n );\n return view.getComputedStyle(heading ?? doc.body).fontFamily || null;\n }\n return ref;\n}\n\n/**\n * Estilos del CONTENEDOR que define el tema, en las mismas claves que\n * `step.design` (los lee `applyCompositeDesign`). El caller los usa como base:\n * `{ ...themeDesign, ...design }`, así lo puesto a mano en el paso gana.\n */\nexport function themeContainerDesign(\n mode: GuideThemeMode,\n inline: boolean,\n /** Paso anclado a un elemento o badge: fondo y relleno de la pestaña Tooltip. */\n tooltip = false,\n): Record<string, unknown> {\n const box = inline ? mode.embedded : mode.overlay;\n const tip = tooltip ? mode.tooltip : undefined;\n const padding = tip?.padding ?? box.padding;\n const out: Record<string, unknown> = {\n // El embebido va en el flujo de la página: sin fondo propio.\n background: tip\n ? tip.background\n : inline\n ? 'transparent'\n : (box.background ?? mode.colors.background),\n color: mode.colors.text,\n paddingTop: padding.top,\n paddingRight: padding.right,\n paddingBottom: padding.bottom,\n paddingLeft: padding.left,\n borderColor: tip?.borderColor ?? box.borderColor,\n borderWidth: tip?.borderWidth ?? box.borderWidth,\n radius: tip?.borderRadius ?? box.borderRadius,\n };\n const shadow = tip?.shadow ?? box.shadow;\n const shadowColor = tip?.shadowColor ?? box.shadowColor;\n if (shadow === 'none') {\n Object.assign(out, { shadowColor: 'transparent', shadowBlur: 0 });\n } else {\n const spec = SHADOW_SPEC[shadow];\n const [r, g, b] = channels(shadowColor);\n Object.assign(out, {\n shadowX: 0,\n shadowY: spec.y,\n shadowBlur: spec.blur,\n shadowSpread: 0,\n shadowColor: `rgba(${r}, ${g}, ${b}, ${spec.alpha})`,\n });\n }\n return out;\n}\n\n/**\n * Publica el tema como variables CSS en la tarjeta (heredan a todo su\n * contenido): acento de los botones, fuente base, alineación de la fila de\n * acciones y los tokens de texto por preset (`--veo-t-title-size`…) que leen\n * las reglas `.veo-card--themed [data-veo-preset]` de `GUIDE_STYLES`.\n */\nexport function applyThemeVars(\n card: HTMLElement,\n mode: GuideThemeMode,\n inline: boolean,\n /** Tooltip: el Título toma «Texto principal» y el resto «Texto secundario». */\n tooltip = false,\n): void {\n const doc = card.ownerDocument ?? document;\n const box = inline ? mode.embedded : mode.overlay;\n const set = (name: string, value: string | null): void => {\n if (value) card.style.setProperty(name, value);\n };\n card.classList.add('veo-card--themed');\n set('--veo-primary', mode.colors.accent);\n set('--veo-cta-color', readableOn(mode.colors.accent));\n // Botones del tema: principal (`--veo-cta-*`), secundario (`--veo-cta2-*`, lo\n // lee `.veo-guide-cta--secondary`) y terciario (`--veo-cta3-*`, preset «link»).\n const primary = mode.buttons?.primary;\n const publish = (prefix: string, b: GuideThemeButton | undefined): void => {\n if (!b) return;\n const p = b.padding;\n set(`${prefix}-bg`, b.background);\n set(`${prefix}-color`, b.color);\n set(`${prefix}-pad`, `${p.top}px ${p.right}px ${p.bottom}px ${p.left}px`);\n set(`${prefix}-size`, `${b.fontSize}px`);\n set(`${prefix}-weight`, String(b.fontWeight));\n set(`${prefix}-radius`, `${b.borderRadius}px`);\n set(\n `${prefix}-border`,\n b.borderWidth > 0 ? `${b.borderWidth}px solid ${b.borderColor}` : 'none',\n );\n };\n publish('--veo-cta', primary);\n publish('--veo-cta2', mode.buttons?.secondary);\n publish('--veo-cta3', mode.buttons?.tertiary);\n set('--veo-text', mode.colors.text);\n set('--veo-text-secondary', mode.colors.textMuted);\n set('--veo-font', appFont('inherit', doc));\n // El botón decide dónde va en su fila; solo «Distribuir» del contenedor lo pisa.\n set(\n '--veo-actions-justify',\n box.align === 'distribute' || !primary ? JUSTIFY[box.align] : JUSTIFY[primary.align],\n );\n\n // Formulario (bloques de encuesta): variables `--veo-f-*`. La clase activa las\n // reglas `.veo-card--themed-form .veo-form …` de `GUIDE_STYLES`.\n const form = mode.form;\n if (form) {\n card.classList.add('veo-card--themed-form');\n const fp = form.padding;\n set('--veo-f-bg', form.background);\n set('--veo-f-accent', form.accent);\n set('--veo-f-on-accent', form.onAccent);\n set('--veo-f-pad', `${fp.top}px ${fp.right}px ${fp.bottom}px ${fp.left}px`);\n // Acordeón «Borde» de la caja del formulario.\n if (typeof form.borderWidth === 'number' && form.borderColor) {\n set(\n '--veo-f-border',\n form.borderWidth > 0 ? `${form.borderWidth}px solid ${form.borderColor}` : 'none',\n );\n }\n if (typeof form.borderRadius === 'number') set('--veo-f-radius', `${form.borderRadius}px`);\n if (form.shadow && form.shadowColor) {\n set('--veo-f-shadow', boxShadow(form.shadow, form.shadowColor));\n }\n for (const [name, t] of [\n ['primary', form.text.primary],\n ['secondary', form.text.secondary],\n ] as const) {\n set(`--veo-f-${name}-color`, t.color);\n set(`--veo-f-${name}-size`, `${t.fontSize}px`);\n set(`--veo-f-${name}-weight`, String(t.fontWeight));\n set(`--veo-f-${name}-align`, t.align);\n set(`--veo-f-${name}-font`, appFont(t.fontFamily, doc));\n }\n }\n\n const tip = tooltip ? mode.tooltip?.text : undefined;\n const tokens: [string, GuideThemeText][] = [\n ['title', tip?.primary ?? mode.text.title],\n ['subtitle', tip?.secondary ?? mode.text.subtitle],\n ['paragraph', tip?.secondary ?? mode.text.paragraph],\n ];\n for (const [name, t] of tokens) {\n set(`--veo-t-${name}-color`, t.color);\n set(`--veo-t-${name}-size`, `${t.fontSize}px`);\n set(`--veo-t-${name}-weight`, String(t.fontWeight));\n set(`--veo-t-${name}-align`, t.align);\n set(`--veo-t-${name}-font`, appFont(t.fontFamily, doc));\n }\n}\n","import type { StepBlock } from './types';\n\n/** Bloque con su índice original en `step.blocks`. */\nexport interface IndexedBlock {\n block: StepBlock;\n index: number;\n}\nexport interface LayoutColumn {\n col: number;\n blocks: IndexedBlock[];\n}\nexport interface LayoutRow {\n row: number;\n columns: LayoutColumn[];\n}\n\n/**\n * Agrupa los bloques de un paso en filas y columnas según `block.row`/`col`.\n * Un bloque SIN `row` va en su propia fila (apilado, como siempre); así las\n * guías existentes no cambian. Las filas se ordenan por `row` y, dentro,\n * las columnas por `col`; el orden del array manda entre bloques de la misma\n * celda. Las filas «implícitas» (sin row) se intercalan según su posición en\n * el array respecto a las explícitas.\n */\nexport function groupLayout(blocks: StepBlock[]): LayoutRow[] {\n const rows = new Map<number, LayoutRow>();\n const order: number[] = [];\n // Filas implícitas: se les asigna un número fraccional entre la fila explícita\n // anterior y la siguiente para respetar el orden del array.\n let lastRow = -1;\n blocks.forEach((block, index) => {\n if (!block) return;\n let row: number;\n if (typeof block.row === 'number' && Number.isFinite(block.row)) {\n row = block.row;\n lastRow = row;\n } else {\n row = lastRow + 0.5;\n lastRow = row;\n }\n const col = typeof block.col === 'number' && Number.isFinite(block.col) ? block.col : 0;\n let r = rows.get(row);\n if (!r) {\n r = { row, columns: [] };\n rows.set(row, r);\n order.push(row);\n }\n let c = r.columns.find((x) => x.col === col);\n if (!c) {\n c = { col, blocks: [] };\n r.columns.push(c);\n }\n c.blocks.push({ block, index });\n });\n return order\n .sort((a, b) => a - b)\n .map((k) => {\n const r = rows.get(k) as LayoutRow;\n r.columns.sort((a, b) => a.col - b.col);\n return r;\n });\n}\n","/**\n * Bloqueo del scroll de la página mientras hay un backdrop visible.\n *\n * Un overlay `position: fixed` que cubre el viewport NO impide que la rueda\n * del mouse / el gesto táctil hagan scroll del documento de atrás (el browser\n * busca el ancestro scrolleable y el overlay no lo es). Con backdrop, la app\n * de atrás debe quedar congelada: `overflow: hidden` en `<html>` y `<body>`,\n * compensando el ancho de la scrollbar para que el layout no salte.\n *\n * Ref-count por documento: varias guías con backdrop a la vez (o un remontaje\n * del preview del editor) solo restauran el estado original al soltar la\n * última. Idempotente: llamar dos veces al release del mismo lock es no-op.\n */\ninterface LockState {\n count: number;\n html: { overflow: string; paddingRight: string };\n body: { overflow: string; paddingRight: string };\n}\n\nconst states = new WeakMap<Document, LockState>();\n\nexport function lockScroll(doc: Document = document): () => void {\n const html = doc.documentElement;\n const body = doc.body;\n if (!html || !body) return () => {};\n\n let state = states.get(doc);\n if (!state) {\n state = {\n count: 0,\n html: { overflow: html.style.overflow, paddingRight: html.style.paddingRight },\n body: { overflow: body.style.overflow, paddingRight: body.style.paddingRight },\n };\n states.set(doc, state);\n // Ancho de la scrollbar vertical (0 en overlay-scrollbars / móvil).\n const win = doc.defaultView;\n const gap = win ? Math.max(0, win.innerWidth - html.clientWidth) : 0;\n if (gap > 0) body.style.paddingRight = `${gap}px`;\n html.style.overflow = 'hidden';\n body.style.overflow = 'hidden';\n }\n state.count += 1;\n\n let released = false;\n return () => {\n if (released) return;\n released = true;\n const s = states.get(doc);\n if (!s) return;\n s.count -= 1;\n if (s.count > 0) return;\n states.delete(doc);\n html.style.overflow = s.html.overflow;\n html.style.paddingRight = s.html.paddingRight;\n body.style.overflow = s.body.overflow;\n body.style.paddingRight = s.body.paddingRight;\n };\n}\n\n/** `true` si el documento tiene el scroll bloqueado por alguna guía. */\nexport function isScrollLocked(doc: Document = document): boolean {\n return (states.get(doc)?.count ?? 0) > 0;\n}\n","import type { SnoozeUnit } from './types';\n\n/**\n * «Posponer guía»: la guía se cierra y no vuelve a mostrarse sola hasta que\n * pase el plazo. Vive en el navegador del usuario (localStorage) — es la misma\n * regla que el resto del estado local del SDK (último paso, frecuencia).\n */\nconst KEY = (guideId: string): string => `veo:snooze:${guideId}`;\n\nconst UNIT_MS: Record<SnoozeUnit, number> = {\n hour: 3_600_000,\n day: 86_400_000,\n week: 604_800_000,\n};\n\nexport function snoozeDurationMs(every: number, unit: SnoozeUnit): number {\n const n = Number.isFinite(every) && every > 0 ? Math.floor(every) : 1;\n return n * (UNIT_MS[unit] ?? UNIT_MS.day);\n}\n\nexport function snoozeGuide(\n guideId: string,\n every: number,\n unit: SnoozeUnit,\n now = Date.now(),\n): void {\n try {\n localStorage.setItem(KEY(guideId), String(now + snoozeDurationMs(every, unit)));\n } catch {\n /* storage opcional */\n }\n}\n\n/** ¿Sigue pospuesta? (Limpia la marca cuando venció.) */\nexport function isSnoozed(guideId: string, now = Date.now()): boolean {\n try {\n const raw = localStorage.getItem(KEY(guideId));\n if (raw === null) return false;\n const until = Number(raw);\n if (!Number.isFinite(until) || until <= now) {\n localStorage.removeItem(KEY(guideId));\n return false;\n }\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Límite del `z-index` en CSS (int32). Un valor mayor hace la declaración\n * INVÁLIDA y el navegador la descarta: el elemento queda en `auto` y cualquier\n * tooltip/portal de la app lo tapa. Por eso todo z-index del autor se acota.\n */\nexport const MAX_Z_INDEX = 2147483647;\n\n/** Acota a [-MAX, MAX] y redondea; NaN/no numérico → `fallback`. */\nexport function clampZIndex(value: unknown, fallback: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) return fallback;\n return Math.max(-MAX_Z_INDEX, Math.min(MAX_Z_INDEX, Math.round(value)));\n}\n","/**\n * Marcador configurado del badge (`step.badge.marker`): construye el elemento\n * (icono / imagen / icono+texto) y lo posiciona sobre o junto al elemento ancla.\n * Puro en la parte de cálculo (`markerOffset`) para poder testearlo.\n */\nimport { autoUpdate } from '@floating-ui/dom';\nimport type { BadgeMarker, BadgeMarkerPosition } from '../types';\nimport { clampZIndex } from '../z-index';\n\n/**\n * Set de iconos del badge (mock 2026-09): 4 en contorno, sus versiones sólidas\n * (círculo relleno con el glifo en blanco), la mira sólida y la etiqueta «New».\n * Paths de heroicons (viewBox 24); los glifos sólidos van sin el círculo.\n */\ninterface BadgeIconDef {\n paths: string[];\n /** Puntos (cx, cy) dibujados como círculos rellenos (el punto de la i / !). */\n dots?: Array<[number, number]>;\n /** Círculo relleno de fondo + glifo blanco. */\n solid?: boolean;\n /** Escala del glifo alrededor del centro (para meterlo dentro del círculo). */\n scale?: number;\n /** Etiqueta de texto en vez de glifo. */\n text?: string;\n}\n\nconst INFO_GLYPH =\n 'M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021';\nconst QUESTION_GLYPH =\n 'M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75';\nconst STAR_GLYPH =\n 'M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.563.563 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.563.563 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z';\nconst CIRCLE = 'M21 12a9 9 0 11-18 0 9 9 0 0118 0z';\nconst TARGET_GLYPH =\n 'M7.5 3.75H6A2.25 2.25 0 0 0 3.75 6v1.5M16.5 3.75H18A2.25 2.25 0 0 1 20.25 6v1.5m0 9V18A2.25 2.25 0 0 1 18 20.25h-1.5m-9 0H6A2.25 2.25 0 0 1 3.75 18v-1.5M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z';\n\nexport const BADGE_ICONS: Record<string, BadgeIconDef> = {\n info: { paths: [CIRCLE, INFO_GLYPH], dots: [[12, 8.25]] },\n exclamation: { paths: [CIRCLE, 'M12 8v4.5'], dots: [[12, 15.75]] },\n question: { paths: [CIRCLE, QUESTION_GLYPH], dots: [[12, 17.25]] },\n star: { paths: [STAR_GLYPH] },\n 'info-solid': { paths: [INFO_GLYPH], dots: [[12, 8.25]], solid: true, scale: 0.8 },\n 'exclamation-solid': { paths: ['M12 8v4.5'], dots: [[12, 15.75]], solid: true, scale: 0.8 },\n 'question-solid': { paths: [QUESTION_GLYPH], dots: [[12, 17.25]], solid: true, scale: 0.8 },\n 'star-solid': { paths: [STAR_GLYPH], solid: true, scale: 0.55 },\n 'target-solid': { paths: [TARGET_GLYPH], solid: true, scale: 0.6 },\n new: { paths: [], text: 'New' },\n};\n\nexport const BADGE_ICON_NAMES = Object.keys(BADGE_ICONS);\n\nexport const DEFAULT_MARKER_SIZE = 14;\nexport const DEFAULT_MARKER_Z = 19000;\n/** Separación entre el ancla y un marcador a su lado (left/right). */\nconst SIDE_GAP = 8;\n\nfunction num(v: number | null | undefined, fallback: number): number {\n return typeof v === 'number' && Number.isFinite(v) ? v : fallback;\n}\n\nfunction iconNode(doc: Document, name: string, size: number, color: string): Node {\n const def = BADGE_ICONS[name] ?? (BADGE_ICONS.info as BadgeIconDef);\n if (def.text) {\n const t = doc.createElement('span');\n t.textContent = def.text;\n t.style.font = `700 ${Math.round(size * 0.85)}px/1 system-ui, -apple-system, sans-serif`;\n t.style.color = color;\n return t;\n }\n const ns = 'http://www.w3.org/2000/svg';\n const svg = doc.createElementNS(ns, 'svg');\n svg.setAttribute('viewBox', '0 0 24 24');\n svg.setAttribute('width', String(size));\n svg.setAttribute('height', String(size));\n svg.setAttribute('fill', 'none');\n svg.setAttribute('aria-hidden', 'true');\n const glyphColor = def.solid ? '#ffffff' : color;\n if (def.solid) {\n const bg = doc.createElementNS(ns, 'circle');\n bg.setAttribute('cx', '12');\n bg.setAttribute('cy', '12');\n bg.setAttribute('r', '12');\n bg.setAttribute('fill', color);\n svg.appendChild(bg);\n }\n const g = doc.createElementNS(ns, 'g');\n g.setAttribute('stroke', glyphColor);\n g.setAttribute('stroke-width', def.solid ? '2' : '1.8');\n g.setAttribute('stroke-linecap', 'round');\n g.setAttribute('stroke-linejoin', 'round');\n if (def.scale && def.scale !== 1) {\n const k = def.scale;\n const t = 12 - 12 * k;\n g.setAttribute('transform', `translate(${t} ${t}) scale(${k})`);\n }\n for (const d of def.paths) {\n const path = doc.createElementNS(ns, 'path');\n path.setAttribute('d', d);\n g.appendChild(path);\n }\n for (const [cx, cy] of def.dots ?? []) {\n const dot = doc.createElementNS(ns, 'circle');\n dot.setAttribute('cx', String(cx));\n dot.setAttribute('cy', String(cy));\n dot.setAttribute('r', '0.9');\n dot.setAttribute('fill', glyphColor);\n dot.setAttribute('stroke', 'none');\n g.appendChild(dot);\n }\n svg.appendChild(g);\n return svg;\n}\n\n/** Construye el elemento visual del marcador según su tipo. Sin innerHTML. */\nexport function buildMarkerElement(doc: Document, marker: BadgeMarker): HTMLElement {\n const size = num(marker.size, DEFAULT_MARKER_SIZE);\n const color = marker.color || '#000000';\n const el = doc.createElement('span');\n el.className = `veo-badge-marker veo-badge-marker-${marker.kind}`;\n el.style.display = 'inline-flex';\n el.style.alignItems = 'center';\n el.style.justifyContent = 'center';\n el.style.boxSizing = 'border-box';\n el.style.lineHeight = '1';\n\n if (marker.kind === 'image') {\n const img = doc.createElement('img');\n img.alt = '';\n img.src = marker.imageUrl || '';\n img.style.width = `${size}px`;\n img.style.height = `${size}px`;\n img.style.objectFit = 'contain';\n img.style.display = 'block';\n el.appendChild(img);\n return el;\n }\n\n if (marker.kind === 'icon-text') {\n el.style.gap = '6px';\n el.style.color = color;\n el.style.fontSize = `${size}px`;\n el.style.fontFamily = 'inherit';\n el.style.fontWeight = '600';\n el.style.whiteSpace = 'nowrap';\n el.style.background = marker.bgColor || 'transparent';\n const bw = num(marker.borderWidth, 0);\n if (bw > 0) el.style.border = `${bw}px solid ${marker.borderColor || color}`;\n el.style.padding = `${num(marker.paddingY, 6)}px ${num(marker.paddingX, 10)}px`;\n el.style.borderRadius = `${num(marker.radius, 999)}px`;\n if (marker.showIcon !== false)\n el.appendChild(iconNode(doc, marker.icon || 'star', size, color));\n const text = doc.createElement('span');\n text.textContent = marker.text || '';\n el.appendChild(text);\n return el;\n }\n\n el.style.width = `${size}px`;\n el.style.height = `${size}px`;\n el.appendChild(iconNode(doc, marker.icon || 'info', size, color));\n return el;\n}\n\n/**\n * Posición (esquina superior izquierda) del marcador en coordenadas de PÁGINA\n * a partir del rect del ancla. Esquinas: el marcador queda CENTRADO sobre la\n * esquina (tipo punto de notificación). left/right: al lado, centrado\n * verticalmente. center: centrado sobre el elemento.\n */\nexport function markerOffset(\n anchor: { left: number; top: number; width: number; height: number },\n marker: { width: number; height: number },\n position: BadgeMarkerPosition,\n offset: { x: number; y: number },\n): { x: number; y: number } {\n const right = anchor.left + anchor.width;\n const bottom = anchor.top + anchor.height;\n const midY = anchor.top + anchor.height / 2 - marker.height / 2;\n const midX = anchor.left + anchor.width / 2 - marker.width / 2;\n let x: number;\n let y: number;\n switch (position) {\n case 'top-left':\n x = anchor.left - marker.width / 2;\n y = anchor.top - marker.height / 2;\n break;\n case 'bottom-left':\n x = anchor.left - marker.width / 2;\n y = bottom - marker.height / 2;\n break;\n case 'bottom-right':\n x = right - marker.width / 2;\n y = bottom - marker.height / 2;\n break;\n case 'left':\n x = anchor.left - marker.width - SIDE_GAP;\n y = midY;\n break;\n case 'right':\n x = right + SIDE_GAP;\n y = midY;\n break;\n case 'center':\n x = midX;\n y = midY;\n break;\n default: // top-right\n x = right - marker.width / 2;\n y = anchor.top - marker.height / 2;\n }\n return { x: x + offset.x, y: y + offset.y };\n}\n\n/** Elementos que no pueden contener hijos (vacíos o reemplazados): el marcador no se anida. */\nconst NO_CHILDREN = new Set([\n 'img',\n 'input',\n 'textarea',\n 'select',\n 'iframe',\n 'video',\n 'audio',\n 'canvas',\n 'br',\n 'hr',\n 'svg',\n 'object',\n 'embed',\n]);\n\n/**\n * ¿Se puede meter el marcador DENTRO del ancla? Solo si es un HTMLElement que\n * admite hijos y no recorta su contenido (con overflow oculto, un marcador\n * centrado sobre una esquina quedaría cortado).\n */\nfunction canNest(anchor: Element): anchor is HTMLElement {\n const win = anchor.ownerDocument.defaultView;\n if (!win || !(anchor instanceof win.HTMLElement)) return false;\n if (NO_CHILDREN.has(anchor.tagName.toLowerCase())) return false;\n const cs = win.getComputedStyle(anchor);\n if (cs.display === 'contents') return false;\n // `overflow` (shorthand) + ejes: cualquier valor distinto de visible recorta.\n const tokens = `${cs.overflow} ${cs.overflowX} ${cs.overflowY}`.split(/\\s+/).filter(Boolean);\n return tokens.every((t) => t === 'visible');\n}\n\n/**\n * Ancla `host` al elemento y devuelve la función que deja de seguirlo.\n *\n * Preferido: el host se anida DENTRO del ancla (position:absolute respecto a\n * ella). Así viaja con el elemento de forma nativa — sidebars sticky, barras\n * fixed, contenedores con scroll propio — sin recalcular en cada scroll, que\n * es lo que hacía temblar al marcador (el body scrollea y la corrección llega\n * un frame después). Solo hay que re-medir cuando cambia el tamaño.\n *\n * Fallback (ancla sin hijos posibles, p. ej. <img>/<input>, o con overflow\n * oculto): el host cuelga de <body> en coordenadas de página y sigue\n * scroll/resize/layout con `autoUpdate`.\n */\nexport function attachMarker(anchor: Element, host: HTMLElement, marker: BadgeMarker): () => void {\n host.style.position = 'absolute';\n host.style.zIndex = String(clampZIndex(marker.zIndex, DEFAULT_MARKER_Z));\n host.style.margin = '0';\n const position = marker.position ?? 'top-right';\n const offset = { x: num(marker.offsetX, 0), y: num(marker.offsetY, 0) };\n const markerSize = (): { width: number; height: number } => {\n const m = host.getBoundingClientRect();\n return { width: m.width, height: m.height };\n };\n\n if (canNest(anchor)) {\n const win = anchor.ownerDocument.defaultView as Window;\n // El ancla pasa a ser el bloque contenedor del marcador (solo si era static).\n const prevPosition = anchor.style.position;\n const computed = win.getComputedStyle(anchor).position;\n if (!computed || computed === 'static') anchor.style.position = 'relative';\n anchor.appendChild(host);\n // El marcador es nuestro: su clic no debe activar el ancla (un <a> navegaría,\n // un <button> enviaría el form). Los listeners del badge, dentro del shadow,\n // corren antes que estos (burbujeo) así que el tooltip sigue funcionando.\n const swallowClick = (e: Event): void => {\n e.preventDefault();\n e.stopPropagation();\n };\n const swallow = (e: Event): void => e.stopPropagation();\n host.addEventListener('click', swallowClick);\n host.addEventListener('pointerdown', swallow);\n host.addEventListener('mousedown', swallow);\n\n const update = (): void => {\n // Coordenadas respecto al padding box del ancla: el borde queda en negativo\n // para que las esquinas se midan sobre el border box (lo que se ve).\n const { x, y } = markerOffset(\n {\n left: -anchor.clientLeft,\n top: -anchor.clientTop,\n width: anchor.offsetWidth,\n height: anchor.offsetHeight,\n },\n markerSize(),\n position,\n offset,\n );\n host.style.left = `${Math.round(x)}px`;\n host.style.top = `${Math.round(y)}px`;\n };\n update();\n // Sin ancestorScroll/layoutShift: el scroll ya no nos mueve; solo re-medimos\n // si cambia el tamaño del ancla o del marcador.\n const stop = autoUpdate(anchor, host, update, { ancestorScroll: false, layoutShift: false });\n return () => {\n stop();\n host.removeEventListener('click', swallowClick);\n host.removeEventListener('pointerdown', swallow);\n host.removeEventListener('mousedown', swallow);\n host.remove();\n anchor.style.position = prevPosition;\n };\n }\n\n // Fallback: flota sobre <body> en coordenadas de página.\n anchor.ownerDocument.body.appendChild(host);\n const update = (): void => {\n const a = anchor.getBoundingClientRect();\n const { x, y } = markerOffset(\n {\n left: a.left + window.scrollX,\n top: a.top + window.scrollY,\n width: a.width,\n height: a.height,\n },\n markerSize(),\n position,\n offset,\n );\n host.style.left = `${Math.round(x)}px`;\n host.style.top = `${Math.round(y)}px`;\n };\n update();\n const stop = autoUpdate(anchor, host, update);\n return () => {\n stop();\n host.remove();\n };\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { applyBlockStyle, buildContentBlock, createCloseButton, isSafeUrl } from '../block-builder';\nimport { buildChecklistBlock } from '../checklist-block';\nimport { mountCodeBlock } from '../code-block';\nimport { buildField } from '../form-content';\nimport {\n applyThemeVars,\n themeContainerDesign,\n themeModeFor,\n themeRowJustify,\n} from '../guide-theme';\nimport { insertHost, keepHostAttached } from '../inline-host';\nimport { groupLayout, type IndexedBlock, type LayoutColumn } from '../layout';\nimport { renderRichText } from '../rich-text';\nimport { lockScroll } from '../scroll-lock';\nimport { snoozeGuide } from '../snooze';\nimport type {\n ButtonActionSpec,\n CompositeStep,\n FormField,\n GuideRenderContext,\n InlinePosition,\n RowStyle,\n StepBlock,\n StepPosition,\n} from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { clampZIndex } from '../z-index';\nimport { attachMarker, buildMarkerElement } from './badge-marker';\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 /** Id del bloque `form` (encuesta) que declara el campo. */\n blockId?: string | null;\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/** Alineación de columnas de una fila (editor de fila) → flex. */\nconst ROW_JUSTIFY: Record<string, string> = { ...ROW_ALIGN, distribute: 'space-between' };\nconst ROW_VALIGN: Record<string, string> = {\n top: 'flex-start',\n center: 'center',\n bottom: 'flex-end',\n};\n\n/**\n * Aplica el estilo de fila (`CompositeStep.rows[n]`): fondo, relleno, margen\n * y alineación. Con alineación horizontal las columnas dejan de repartirse el\n * ancho (`.veo-row--aligned`) para que la posición se note.\n */\nexport function applyRowStyle(rowEl: HTMLElement, style: RowStyle): void {\n const s = rowEl.style;\n if (typeof style.background === 'string' && style.background) s.background = style.background;\n for (const side of ['Top', 'Right', 'Bottom', 'Left'] as const) {\n const p = style[`padding${side}`];\n if (typeof p === 'number' && Number.isFinite(p))\n s.setProperty(`padding-${side.toLowerCase()}`, `${p}px`);\n const m = style[`margin${side}`];\n if (typeof m === 'number' && Number.isFinite(m))\n s.setProperty(`margin-${side.toLowerCase()}`, `${m}px`);\n }\n if (\n typeof style.minHeight === 'number' &&\n Number.isFinite(style.minHeight) &&\n style.minHeight > 0\n ) {\n s.minHeight = `${style.minHeight}px`;\n }\n if (style.align && ROW_JUSTIFY[style.align]) {\n s.justifyContent = ROW_JUSTIFY[style.align] as string;\n rowEl.classList.add('veo-row--aligned');\n }\n if (style.valign && ROW_VALIGN[style.valign]) s.alignItems = ROW_VALIGN[style.valign] as string;\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 /** Alineación de filas de botones según el tema del workspace (null = sin tema). */\n private themeRowJustify: ((preset: unknown) => string | null) | null = null;\n\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 // Editor: los elementos crudos llevan el id del bloque (no hay tarjeta\n // ni host); el builder los selecciona con un marco propio.\n const { cleanup } = mountCodeBlock(soleCode, rawDoc, context, undefined, {\n anchor,\n pos: inlinePosOf(step.inlinePosition),\n ...(context.isPreview && soleCode.editorId ? { tagBlockId: soleCode.editorId } : {}),\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') {\n host.style.zIndex = String(clampZIndex(design.zIndex, 0));\n }\n\n // ── Card + diseño ──\n const card = doc.createElement('div');\n card.className = 'veo-card';\n // Tema del workspace (design system): es la BASE del contenedor; lo que el\n // paso define a mano (`design`) la pisa. Textos y botones lo leen por CSS.\n const themeMode = themeModeFor(context.guide.theme, design);\n const inline = step.presentation === 'inline';\n // Tooltip = anclado a un elemento (no embebido) o badge: pestaña Tooltip del tema.\n const tooltipLike = !inline && (badgeMode || step.position === 'relative-to-element');\n if (themeMode) applyThemeVars(card, themeMode, inline, tooltipLike);\n // Filas de botones sin alineación propia: la da el tema (ver buildSequence).\n this.themeRowJustify = themeMode\n ? (preset: unknown) => themeRowJustify(themeMode, inline, preset)\n : null;\n const cardDesign = themeMode\n ? { ...themeContainerDesign(themeMode, inline, tooltipLike), ...design }\n : design;\n applyCompositeDesign(card, cardDesign);\n // Accesibilidad: nombre accesible del contenedor (lectores de pantalla).\n if (typeof design.ariaLabel === 'string' && design.ariaLabel.trim()) {\n card.setAttribute('role', 'dialog');\n card.setAttribute('aria-label', design.ariaLabel.trim());\n }\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 // Paso SIN bloques (recién creado en el editor): tarjeta blanca con tamaño\n // mínimo para que exista y se pueda clickear; en preview lleva una pista.\n if (blocks.length === 0) {\n card.classList.add('veo-card--empty');\n if (context.isPreview) {\n // Zona punteada azul (mock Figma): «+ Clic para agregar contenido».\n const zone = doc.createElement('div');\n zone.className = 'veo-card-empty-zone';\n const plus = doc.createElement('b');\n plus.textContent = '+';\n const text = doc.createElement('span');\n text.textContent = 'Clic para agregar contenido';\n zone.append(plus, text);\n card.appendChild(zone);\n // Tarjeta angosta → solo el «+». Se mide con ResizeObserver (el ancho\n // puede cambiar por el drag de redimensionar del editor).\n const applyNarrow = (): void => {\n card.classList.toggle('veo-card--narrow', card.clientWidth < NARROW_CARD_WIDTH);\n };\n if (typeof ResizeObserver !== 'undefined') {\n const ro = new ResizeObserver(applyNarrow);\n ro.observe(card);\n this.registerCleanup(() => ro.disconnect());\n }\n applyNarrow();\n }\n }\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 // Relleno y margen propios del ✕ (panel «Botón de cerrar» del editor).\n for (const side of ['Top', 'Right', 'Bottom', 'Left'] as const) {\n const p = design[`closePadding${side}`];\n if (typeof p === 'number')\n closeBtn.style.setProperty(`padding-${side.toLowerCase()}`, `${p}px`);\n const m = design[`closeMargin${side}`];\n if (typeof m === 'number')\n closeBtn.style.setProperty(`margin-${side.toLowerCase()}`, `${m}px`);\n }\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 reserveCloseSpace(card, blocks, closePos, cardDesign);\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 // Con el tema ya fundido: la flecha del tooltip toma su fondo y borde.\n cardDesign,\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 = clampZIndex(design.backdropZIndex, 200000);\n bg.style.zIndex = String(bz);\n root.appendChild(bg);\n // Con backdrop la app de atrás queda congelada (sin scroll).\n this.registerCleanup(lockScroll(doc));\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, cardDesign);\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(clampZIndex(design.backdropZIndex, 0));\n }\n overlay.addEventListener('click', (e) => {\n if (e.target === overlay) {\n dismiss('dismissed');\n this.closeOrSkip(context);\n }\n });\n // Con backdrop la app de atrás queda congelada (sin scroll).\n this.registerCleanup(lockScroll(doc));\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 // Editor: cada nodo lleva el id local de su bloque para poder seleccionarlo.\n const tag = (node: HTMLElement, block: StepBlock, index: number): HTMLElement => {\n node.dataset.veoBlock = String(index);\n if (block.editorId) node.dataset.veoBlockId = block.editorId;\n return node;\n };\n // Preview del editor: un bloque que no produce nodo (imagen sin URL, code\n // host…) igual necesita algo clickeable para poder editarlo.\n const placeholder = (block: StepBlock, label: string): HTMLElement | null => {\n if (!context.isPreview || !block.editorId) return null;\n const el = doc.createElement('div');\n el.className = 'veo-block-placeholder';\n el.textContent = label;\n return el;\n };\n // Secuencia de bloques (una celda) → nodos en `container`. Los botones\n // consecutivos se agrupan en una fila de acciones.\n const buildSequence = (container: HTMLElement, cell: IndexedBlock[]): void => {\n let i = 0;\n while (i < cell.length) {\n const { block: b, index } = cell[i] as IndexedBlock;\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\n // botón dentro. La toma del PRIMER botón del grupo.\n let rowAlign: string | undefined;\n const firstPreset = (b.style as Record<string, unknown> | null | undefined)?.preset;\n while (i < cell.length && cell[i]?.block.type === 'button') {\n const { block: bb, index: bi } = cell[i] as IndexedBlock;\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(tag(this.buildButton(bb, doc, context, idx, readers, emit), bb, bi));\n i++;\n }\n if (rowAlign) row.style.justifyContent = ROW_ALIGN[rowAlign] ?? 'flex-end';\n else {\n // Sin alineación a mano: la del tema para el preset del primer botón.\n const themed = this.themeRowJustify?.(firstPreset);\n if (themed) row.style.justifyContent = themed;\n }\n container.appendChild(row);\n continue;\n }\n if (b.type === 'code') {\n const { node, cleanup } = mountCodeBlock(b, doc, context, host);\n const el = node ?? placeholder(b, 'Bloque de código');\n if (el) container.appendChild(tag(el, b, index));\n this.registerCleanup(cleanup);\n i++;\n continue;\n }\n if (b.type === 'form') {\n container.appendChild(tag(this.buildForm(b, doc, context, idx, readers, emit), b, index));\n i++;\n continue;\n }\n if (b.type === 'checklist') {\n const el = buildChecklistBlock(b, doc, context);\n applyBlockStyle(el, b.style as Record<string, unknown> | null | undefined, 'text');\n // La lista ocupa todo el ancho de la tarjeta (la alineación del texto no la encoge).\n el.style.alignSelf = 'stretch';\n el.style.width = '100%';\n container.appendChild(tag(el, b, index));\n i++;\n continue;\n }\n const node =\n buildContentBlock(b, doc, { editing: context.isPreview === true }) ??\n placeholder(\n b,\n b.type === 'image'\n ? 'Imagen (sin URL)'\n : b.type === 'video'\n ? 'Video (elige proveedor y pega la URL)'\n : 'Bloque vacío',\n );\n if (node) container.appendChild(tag(node, b, index));\n i++;\n }\n };\n\n // Layout: filas de una columna SIN estilo propio van directo en la card\n // (DOM idéntico al de siempre); filas con varias columnas o con estilo de\n // fila (editor de fila) se envuelven en .veo-row > .veo-col.\n const rowStyles = (context.guide.guideSteps[idx] as unknown as CompositeStep | undefined)?.rows;\n for (const row of groupLayout(blocks)) {\n const rowStyle = Number.isInteger(row.row) ? rowStyles?.[String(row.row)] : undefined;\n if (row.columns.length === 1 && !rowStyle) {\n buildSequence(card, (row.columns[0] as LayoutColumn).blocks);\n continue;\n }\n const rowEl = doc.createElement('div');\n rowEl.className = 'veo-row';\n if (Number.isInteger(row.row)) rowEl.dataset.veoRow = String(row.row);\n for (const column of row.columns) {\n const colEl = doc.createElement('div');\n colEl.className = 'veo-col';\n buildSequence(colEl, column.blocks);\n rowEl.appendChild(colEl);\n }\n if (rowStyle) applyRowStyle(rowEl, rowStyle);\n card.appendChild(rowEl);\n }\n }\n\n /** Botón con enrutado de acción (navegación / cierre / url / guía / envío de forms). */\n /**\n * Bloque `form` (encuesta): pregunta (rich text del bloque) + campos + botón\n * de envío propio (`submit`). Con pregunta, el label del campo se omite (sería\n * la misma pregunta dos veces) y pasa a `aria-label` del input. El estilo del\n * bloque viste la pregunta (preset/alineación/color); los márgenes van al\n * contenedor del bloque entero.\n */\n private buildForm(\n b: StepBlock,\n doc: Document,\n context: GuideRenderContext,\n idx: number,\n readers: FormReader[],\n emit: (block: StepBlock) => void,\n ): HTMLElement {\n const form = doc.createElement('div');\n form.className = 'veo-form';\n const style = (b.style ?? {}) as Record<string, unknown>;\n const { marginTop, marginBottom, ...questionStyle } = style;\n for (const [side, v] of [\n ['marginTop', marginTop],\n ['marginBottom', marginBottom],\n ] as const) {\n if (typeof v === 'number' && Number.isFinite(v)) form.style[side] = `${v}px`;\n }\n let question: HTMLElement | null = null;\n if ((typeof b.html === 'string' && b.html) || (typeof b.text === 'string' && b.text)) {\n question = doc.createElement('div');\n question.className = 'veo-form-question';\n if (typeof b.html === 'string' && b.html) question.appendChild(renderRichText(b.html, doc));\n else question.textContent = b.text as string;\n applyBlockStyle(question, questionStyle, 'text');\n form.appendChild(question);\n }\n const questionText = question?.textContent?.trim() ?? '';\n // Lectores de ESTE bloque (los recoge su botón de envío) y del paso (los\n // recogen los botones submit-forms sueltos, como siempre).\n const own: FormReader[] = [];\n for (const field of b.fields ?? []) {\n const { wrapper, read } = buildField(field, doc);\n // Estilo de la escala (pestaña Escala › Estilo): color de selección y tamaño.\n const st = (b.style ?? {}) as Record<string, unknown>;\n if (typeof st.scaleColor === 'string' && st.scaleColor) {\n wrapper.style.setProperty('--veo-scale-color', st.scaleColor);\n }\n if (typeof st.scaleSize === 'number' && st.scaleSize >= 24 && st.scaleSize <= 96) {\n wrapper.style.setProperty('--veo-scale-size', `${st.scaleSize}px`);\n }\n if (question) {\n wrapper.querySelector('.veo-form-label')?.remove();\n if (questionText) {\n for (const inp of wrapper.querySelectorAll('input, textarea, select')) {\n inp.setAttribute('aria-label', questionText);\n }\n }\n }\n const reader: FormReader = { field, read, blockId: b.id ?? null };\n readers.push(reader);\n own.push(reader);\n form.appendChild(wrapper);\n }\n if (b.submit) {\n const actions = doc.createElement('div');\n actions.className = 'veo-guide-actions';\n const submit: StepBlock = { ...b.submit, type: 'button' };\n const sa = (submit.style as Record<string, unknown> | null | undefined)?.align;\n if (sa === 'left' || sa === 'center' || sa === 'right') {\n actions.style.justifyContent = ROW_ALIGN[sa] ?? 'flex-end';\n }\n actions.appendChild(this.buildButton(submit, doc, context, idx, readers, emit, own));\n form.appendChild(actions);\n }\n return form;\n }\n\n private buildButton(\n block: StepBlock,\n doc: Document,\n context: GuideRenderContext,\n idx: number,\n readers: FormReader[],\n emit: (block: StepBlock) => void,\n /** Botón de envío de una encuesta: envía ESTOS lectores antes de su acción. */\n submitFirst?: FormReader[],\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 // «Estilo del botón» (editor): primario (default), secundario (contorno),\n // enlace (solo texto). `custom` = estilos a mano de applyBlockStyle.\n const st = (block.style ?? {}) as Record<string, unknown>;\n if (st.preset === 'secondary' || st.preset === 'link') {\n btn.classList.add(`veo-guide-cta--${st.preset}`);\n }\n // Accesibilidad: nombre accesible distinto del texto visible.\n if (typeof st.ariaLabel === 'string' && st.ariaLabel.trim()) {\n btn.setAttribute('aria-label', st.ariaLabel.trim());\n }\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 // Acciones simples (sin envío de formularios). La principal es el bloque;\n // `secondAction` (máximo dos) se ejecuta justo después con el mismo código.\n const runSimple = (spec: ButtonActionSpec): void => {\n switch (spec.action) {\n case 'next':\n if (nav) nav.onNext();\n else context.onClose();\n break;\n case 'prev':\n nav?.onBack();\n break;\n case 'goto':\n if (nav?.onGoto && typeof spec.targetStep === 'number') nav.onGoto(spec.targetStep);\n else context.onClose();\n break;\n case 'snooze':\n // Posponer: se cierra sin marcar «descartada» (debe volver al vencer).\n snoozeGuide(\n context.guide.guideId,\n typeof spec.snoozeEvery === 'number' ? spec.snoozeEvery : 1,\n spec.snoozeUnit ?? 'day',\n );\n context.onClose();\n break;\n case 'url':\n if (typeof spec.url === 'string' && isSafeUrl(spec.url)) {\n // «Abrir en pestaña nueva» (default). Con newTab:false navega la misma.\n if (spec.newTab === false) window.location.assign(spec.url);\n else window.open(spec.url, '_blank', 'noopener,noreferrer');\n }\n break;\n case 'guide':\n if (spec.targetGuideId) context.onOpenGuide?.(spec.targetGuideId);\n this.closeOrSkip(context);\n break;\n default:\n this.closeOrSkip(context);\n }\n };\n const runSecond = (): void => {\n if (block.secondAction?.action) runSimple(block.secondAction);\n };\n const runActions = (): void => {\n switch (block.action) {\n case 'next':\n case 'prev':\n case 'goto':\n case 'snooze':\n case 'url':\n case 'guide':\n emit(block);\n runSimple(block);\n runSecond();\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 runSecond();\n }\n };\n btn.addEventListener('click', () => {\n if (submitFirst) this.submitForms(submitFirst, context, idx, btn, runActions);\n else runActions();\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 // Nada que enviar (campos opcionales vacíos): no se guarda respuesta, pero\n // el botón igual hace lo suyo (cerrar/avanzar) — un botón muerto confunde.\n if (Object.keys(answers).length === 0) {\n onDone();\n return;\n }\n btn.disabled = true;\n const submitFn = context.onFormSubmit ?? (() => Promise.resolve(true));\n // Encuesta de origen: si todas las respuestas salen del mismo bloque.\n const blockIds = new Set(\n readers.filter((r) => answers[r.field.key] !== undefined).map((r) => r.blockId ?? ''),\n );\n const pollId = blockIds.size === 1 ? [...blockIds][0] || undefined : undefined;\n void submitFn(answers, { ...(pollId ? { pollId } : {}), stepIndex: idx }).then((ok) => {\n btn.disabled = false;\n if (!ok) return;\n // «Completada» solo si esta encuesta cierra la guía (último paso o guía\n // de un paso); en un paso intermedio el envío solo avanza.\n const lastStep = !context.nav || idx >= context.nav.totalSteps - 1;\n if (lastStep) {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: idx,\n action: 'completed',\n });\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): configurado (`marker`) o compuesto con bloques (legado).\n // Va en un host PROPIO junto al ancla (dentro de la app). El tooltip (la\n // card) se queda en el host principal, en <body>: dentro del ancla, un\n // ancestro con transform/overflow (sidebars, menús) lo recortaba, lo\n // encogía al ancho del ancla y atrapaba su z-index por debajo de la app.\n const { host: markerHost, root: markerRoot } = this.createDetachedHost();\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 const marker = step.badge?.marker ?? null;\n if (marker) badge.appendChild(buildMarkerElement(doc, marker));\n else this.buildContent(badge, step.badge?.blocks ?? [], doc, context, idx, [], host);\n markerRoot.appendChild(badge);\n host.style.display = 'block';\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 if (marker) {\n // Marcador configurado: SOBRE/junto al ancla (esquina, lado o centro), sin\n // alterar el layout de la app. `attachMarker` lo anida en el ancla cuando\n // puede (viaja con ella sin temblar) o lo flota sobre <body> si no.\n markerHost.style.display = 'inline-block';\n this.registerCleanup(attachMarker(anchor, markerHost, marker));\n } else {\n // El host del marcador va al flujo, junto al ancla → queda permanente.\n markerHost.style.display = 'inline-block';\n const pos = inlinePosOf(step.inlinePosition);\n insertHost(anchor, markerHost, pos);\n this.registerCleanup(keepHostAttached(markerHost, anchorSelector, pos));\n }\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 // Preview del editor («Mostrar vista previa del paso»): tooltip abierto.\n if (context.badgeOpen) openTip();\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 BASE = 16;\n // Margen del contenedor en un paso FLOTANTE = separación respecto al borde\n // de la pantalla (en los ejes pegados al borde) o desplazamiento desde el\n // centro (en los ejes centrados). Un margin CSS sobre un elemento fixed\n // centrado con translate lo corría de forma poco intuitiva, así que se\n // neutraliza y se traduce a offsets.\n const m = (k: string): number =>\n typeof design[k] === 'number' && Number.isFinite(design[k]) ? (design[k] as number) : 0;\n s.margin = '0';\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 = `${BASE + m('marginTop')}px`;\n else if (v === 'bottom') s.bottom = `${BASE + m('marginBottom')}px`;\n else s.top = '50%';\n\n if (h === 'left') s.left = `${BASE + m('marginLeft')}px`;\n else if (h === 'right') s.right = `${BASE + m('marginRight')}px`;\n else s.left = '50%';\n\n // Transform para centrar el/los ejes que quedaron en 50% (+ desplazamiento\n // por margen en esos ejes: arriba/izquierda positivo empuja abajo/derecha).\n const dx = m('marginLeft') - m('marginRight');\n const dy = m('marginTop') - m('marginBottom');\n const tx = h === 'middle' ? `calc(-50% + ${dx}px)` : '0';\n const ty = v === 'middle' ? `calc(-50% + ${dy}px)` : '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 */\n/** Alto del ✕ (24px) + su inset (10px) + aire hasta el contenido. */\nconst CLOSE_RESERVE_PX = 42;\n/** Relleno por defecto de la tarjeta en el CSS base (styles.ts). */\nconst CARD_DEFAULT_PAD_PX = 20;\n\n/**\n * El ✕ es absoluto: los bloques que ocupan todo el ancho (filas, listas de\n * tareas, formularios, títulos largos) quedaban debajo de él. Se reserva su\n * franja: el relleno de la tarjeta del lado del ✕ (arriba o abajo) sube al\n * menos hasta cubrirlo. No aplica si el primer bloque es una imagen (ahí el ✕\n * es una pastilla flotante sobre la foto) ni en tarjetas vacías.\n */\nfunction reserveCloseSpace(\n card: HTMLElement,\n blocks: StepBlock[],\n position: string,\n design: Record<string, unknown>,\n): void {\n if (blocks.length === 0) return;\n const side = position.includes('bottom') ? 'Bottom' : 'Top';\n const edgeBlock = side === 'Top' ? blocks[0] : blocks[blocks.length - 1];\n if (edgeBlock?.type === 'image') return;\n const margin = design[`closeMargin${side}`];\n const need = CLOSE_RESERVE_PX + (typeof margin === 'number' ? margin : 0);\n const current = design[`padding${side}`];\n const have = typeof current === 'number' ? current : CARD_DEFAULT_PAD_PX;\n if (have < need) card.style.setProperty(`padding-${side.toLowerCase()}`, `${need}px`);\n}\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 // `positionArrow` deja el borde solo en la punta (según el lado resuelto).\n caret.dataset.veoBorder = String(design.borderWidth);\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(clampZIndex(zIndex, 0));\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. */\n/** Ancho mínimo del contenedor (el editor tampoco permite menos). */\nexport const MIN_CARD_WIDTH = 120;\n/** Por debajo, la zona «agregar contenido» muestra solo el «+». */\nconst NARROW_CARD_WIDTH = 260;\n\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 // Modo de color del contenedor: «oscuro» aplica una paleta base que el\n // fondo/color explícitos del diseño pueden pisar.\n if (design.colorMode === 'dark') {\n s.background = '#1f1d1b';\n s.color = '#f5f0eb';\n card.classList.add('veo-card--dark');\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. Piso de MIN_CARD_WIDTH: un\n // ancho absurdo (10px) no debe romper la guía ni sacar el contenido.\n const width =\n typeof design.width === 'number' && Number.isFinite(design.width)\n ? `${Math.max(MIN_CARD_WIDTH, design.width)}px`\n : null;\n if (design.fullWidth === true) {\n s.width = '100%';\n } else if (design.widthType === 'fluid') {\n // Fluido = ocupa el ancho disponible (viewport si es flotante, contenedor\n // si es embebida) hasta el máximo configurado. Con `auto` una tarjeta\n // vacía o con poco contenido se encogía y el ancho parecía ignorado.\n s.width = '100%';\n if (width) s.maxWidth = width;\n } else if (width) {\n s.width = width;\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 { lockScroll } from '../scroll-lock';\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 // Con backdrop la app de atrás queda congelada (sin scroll).\n this.registerCleanup(lockScroll(doc));\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 { lockScroll } from '../scroll-lock';\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 /** Suelta el bloqueo de scroll del backdrop (null = sin backdrop). */\n private releaseScroll: (() => void) | null = null;\n\n /** Con backdrop la app de atrás queda congelada; sin él, scrollea normal. */\n private syncScrollLock(step: GuideStep): void {\n const wantLock = step.style?.backdrop !== false;\n if (wantLock && !this.releaseScroll) {\n this.releaseScroll = lockScroll(this.host?.ownerDocument ?? document);\n } else if (!wantLock && this.releaseScroll) {\n this.releaseScroll();\n this.releaseScroll = null;\n }\n }\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 this.syncScrollLock(step);\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 this.syncScrollLock(step);\n }\n\n override destroy(): void {\n this.overlay = null;\n this.releaseScroll?.();\n this.releaseScroll = 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 { isAutomaticActivation } from './activation-rules';\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 FormSubmitMeta,\n GuideInteractionEvent,\n GuideProgressItem,\n GuideStep,\n GuideTheme,\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 /** Tema del workspace (design system) ya resuelto; lo manda el editor del dashboard. */\n theme?: GuideTheme | null;\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>, meta?: FormSubmitMeta) => Promise<boolean>;\n /**\n * Lista de tareas en preview: progreso de las guías de la lista (el editor\n * lo pide al backend con un usuario de preview: nombres y pasos reales,\n * progreso en cero). Sin esto la lista se ve sin subtítulos ni barra.\n */\n fetchProgress?: (guideIds: string[]) => Promise<GuideProgressItem[]>;\n /** Nota bajo el \"¡Gracias!\" cuando hay `formSubmit` propio. */\n formSubmitNote?: string;\n /** Modo badge: montar con el tooltip ABIERTO (toggle del editor). */\n /**\n * Badge: tooltip abierto (true) o cerrado (false). Sin definir, se abre si la\n * activación es automática (igual que el runtime).\n */\n badgeOpen?: boolean;\n /**\n * Se llama cuando el USUARIO cierra la preview (✕ / descartar), no cuando el\n * editor la reemplaza por otra. El modo builder lo usa para re-armar el\n * disparador por elemento objetivo.\n */\n onClosed?: () => void;\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 // Abrir/cerrar el tooltip del badge requiere remontar.\n (input.badgeOpen === true) === (this.input.badgeOpen === true) &&\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(byUser = false): void {\n const onClosed = byUser ? this.input?.onClosed : undefined;\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 onClosed?.();\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(true),\n // Sin indicación explícita, el badge se abre solo si la guía arranca\n // sola (como en el runtime); `manual` lo deja cerrado.\n badgeOpen: this.input?.badgeOpen ?? isAutomaticActivation(this.input?.activationRules),\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 ...(this.input?.fetchProgress ? { fetchProgress: this.input.fetchProgress } : {}),\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(true),\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 ...(input.theme ? { theme: input.theme } : {}),\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 { PageUrlRule, 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 * El runtime manda `window.location.href` (URL completa) y el editor expresa\n * las reglas como PATHS (`/envios`) o URLs con protocolo. Se prueban TODOS los\n * candidatos: la URL completa, el path derivado (`pathname+search+hash`) y, en\n * apps con hash routing (`/#/envios`), la ruta del hash (`/envios`).\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 urlCandidates(pageUrl: string): string[] {\n const out = [pageUrl];\n try {\n const u = new URL(pageUrl);\n out.push(`${u.pathname}${u.search}${u.hash}`);\n if (u.hash.startsWith('#/')) out.push(u.hash.slice(1));\n } catch {\n // no es una URL absoluta: se compara tal cual\n }\n return out;\n}\n\nexport function matchesUrl(matcher: UrlMatcher, pageUrl: string): boolean {\n const candidates = urlCandidates(pageUrl);\n switch (matcher.type) {\n case 'exact':\n return candidates.some((c) => c === matcher.pattern);\n case 'prefix':\n return candidates.some((c) => c.startsWith(matcher.pattern));\n case 'regex':\n try {\n const re = new RegExp(matcher.pattern);\n return candidates.some((c) => re.test(c));\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') return true;\n // Páginas del módulo Páginas: reglas en OR (las expande el backend). Sin\n // reglas (página borrada / no expandida) el paso NO se muestra.\n if (loc.scope === 'pages') {\n const rules = loc.rules ?? [];\n return rules.some((r) => pageRuleMatches(r, pageUrl));\n }\n if (!loc.pattern) return true;\n return matchesUrl({ type: loc.matchType ?? 'prefix', pattern: loc.pattern }, pageUrl);\n}\n\n/**\n * Regla de una página etiquetada (portado de `pages.repository.ruleMatches`):\n * case-insensitive, contra la URL completa y el path. `contains` no existe en\n * el matcher de guías, por eso no reusa `matchesUrl`.\n */\nexport function pageRuleMatches(rule: PageUrlRule, pageUrl: string): boolean {\n const pattern = rule.pattern.toLowerCase();\n const candidates = urlCandidates(pageUrl).map((c) => c.toLowerCase());\n switch (rule.type) {\n case 'exact':\n return candidates.some((c) => c === pattern);\n case 'prefix':\n return candidates.some((c) => c.startsWith(pattern));\n case 'contains':\n return candidates.some((c) => c.includes(pattern));\n case 'regex':\n try {\n const re = new RegExp(rule.pattern, 'i');\n return candidates.some((c) => re.test(c));\n } catch {\n return false;\n }\n default:\n return false;\n }\n}\n","/**\n * Contrato de mensajes del puente builder (app del cliente ↔ dashboard).\n * Ambos lados validan `event.origin` y que `token` coincida antes de actuar.\n *\n * Flujo:\n * 1. El dashboard abre la app con `?veoBuilder=<token>&veoBuilderOrigin=<origen>`.\n * 2. La app (veo-builder.js) postea `ready` a la ventana que la abrió.\n * 3. El dashboard manda comandos (`start-picker`, `preview`, …).\n * 4. La app responde con eventos (`picked`, `pick-cancelled`, …).\n */\nimport type { PreviewGuideInput } from '../guides/guide-preview';\nimport type { BlockDropPayload } from './block-drop-target';\nimport type { DesignPatch } from './design-manipulator';\nimport type { PickedElement } from './element-picker';\n\nexport const VEO_BUILDER_SOURCE = 'veo-builder';\n// Los nombres de los query params viven en el core (`builder-token.ts`), única\n// fuente de verdad compartida con el loader y el gate del runtime de guías.\nexport { BUILDER_ORIGIN_PARAM, BUILDER_TOKEN_PARAM } from '../../core/builder-token';\n\n/**\n * Estado que el panel (editor) publica para que el SDK pinte el \"chrome\" del\n * editor (topbar + fila de pasos) ENCIMA de la app. El panel es la única fuente\n * de verdad; el chrome solo lo refleja y devuelve `chrome-action`s.\n */\nexport interface EditorChromeState {\n /**\n * `tagging` = «Modo tagging» (panel de features): solo la topbar, con ese\n * título y sin fila de pasos, vista previa ni Guardar (cada tag se guarda al\n * crearse). Default `guide` = editor de guías.\n */\n variant?: 'guide' | 'tagging';\n /** Título del header de la tarjeta; si falta, el SDK lo deriva de la sección. */\n panelTitle?: string;\n guideName: string;\n /** ISO de creación (null = guía nueva sin guardar). */\n createdAt: string | null;\n steps: Array<{ id: string; label: string; presentation: 'floating' | 'inline' }>;\n activeStep: number;\n /**\n * Qué muestra el panel. `step`, `block`, `add-block`, `row` y `structure`\n * son vistas del paso activo (la fila de pasos lo marca); las pestañas del\n * contenedor se «encienden» solo con `step` (contenedor) y `structure`.\n */\n section: 'activation' | 'step' | 'badge' | 'target' | 'block' | 'add-block' | 'row' | 'structure';\n /** Editando un bloque del paso: su nombre («Encuesta Texto abierto») para el título del panel. */\n blockLabel?: string | null;\n saving: boolean;\n dirty: boolean;\n /**\n * Estado de publicación de la guía, para que el autor vea en la barra si lo\n * que edita está Activa/Borrador/etc. (sin esto, guardar una guía en borrador\n * y no verla en la app era un misterio). `tone` elige el color del chip.\n */\n status?: { label: string; tone: 'live' | 'testing' | 'review' | 'draft' | 'paused' } | null;\n}\n\n/**\n * Qué está haciendo la preview en la app. El SDK lo publica cada vez que\n * evalúa un comando `preview` con `honorTrigger`, para que el panel explique\n * por qué la guía no se ve (retraso, elemento objetivo, otra página, otro\n * dispositivo) en vez de parecer rota.\n */\nexport type PreviewStatus =\n | { state: 'shown' }\n | { state: 'waiting-delay'; delayMs: number }\n | { state: 'waiting-trigger'; trigger: 'on_click' | 'on_hover'; selector: string }\n | { state: 'page-mismatch'; pattern: string }\n | { state: 'device-mismatch'; devices: 'desktop' | 'mobile' };\n\n/** Acciones que el usuario dispara en el chrome (barras) y el panel ejecuta. */\n/** Bloque de la preview: paso + id local del panel (`StepBlock.editorId`). */\nexport interface BlockRef {\n stepIndex: number;\n blockId: string;\n}\nexport type BlockToolbarAction =\n | 'edit'\n | 'duplicate'\n | 'remove'\n /** Mover: arriba/abajo dentro de su columna, izquierda/derecha entre columnas de su fila. */\n | 'move-up'\n | 'move-down'\n | 'move-left'\n | 'move-right';\n/** Barra de la FILA (hover o fila del bloque seleccionado): editar / duplicar / eliminar. */\nexport type RowToolbarAction = 'edit' | 'duplicate' | 'remove';\n/** Pestañas sobre el CONTENEDOR (hover): editar el paso o abrir la estructura de filas. */\nexport type CardToolbarAction = 'edit-container' | 'edit-rows';\nexport type BlockLayoutAction =\n | 'row-before'\n | 'row-after'\n | 'col-before'\n | 'col-after'\n /** Bloque apilado en la MISMA celda (fila+columna), antes/después del bloque. */\n | 'stack-before'\n | 'stack-after';\n\nexport type ChromeAction =\n | { action: 'select-activation' }\n | { action: 'select-step'; index: number }\n | { action: 'add-step' }\n /** Hover sobre la tarjeta de un paso: duplicar (se inserta después) o eliminar. */\n | { action: 'duplicate-step'; index: number }\n | { action: 'remove-step'; index: number }\n | { action: 'save'; exit: boolean }\n | { action: 'exit' }\n // Las tres siguientes las resuelve el SDK solo (no llegan al panel):\n // barra arriba/abajo, volver a mostrar la tarjeta y modo vista previa.\n | { action: 'dock'; position: 'top' | 'bottom' }\n | { action: 'show-panel' }\n | { action: 'preview' }\n | { action: 'exit-preview' };\n\n/** Eventos que la app del cliente envía al dashboard. */\nexport type BuilderEvent =\n // `chrome: true` → el SDK pinta el chrome del editor (barras); el panel debe\n // ocultar su propia cabecera/pasos/guardado y publicar `editor-state`.\n | { type: 'ready'; chrome?: boolean }\n | { type: 'chrome-action'; payload: ChromeAction }\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 /** Clic simple (sin arrastre) sobre la tarjeta de la preview: el panel abre «Agregar bloque». */\n | { type: 'card-clicked'; payload: { stepIndex: number } }\n /** Clic sobre un bloque de la preview: se selecciona en la app y el panel abre su editor. */\n | { type: 'block-clicked'; payload: BlockRef }\n /** Barra del bloque seleccionado: editar / duplicar / eliminar. */\n | { type: 'block-action'; payload: BlockRef & { action: BlockToolbarAction } }\n /** «+» en los bordes del bloque seleccionado: agregar fila arriba/abajo o columna izq/der. */\n | { type: 'block-layout'; payload: BlockRef & { action: BlockLayoutAction } }\n /** Barra de una fila: `blockId` = primer bloque de la fila (la fila no tiene id propio). */\n | { type: 'row-action'; payload: BlockRef & { action: RowToolbarAction } }\n /** Pestañas del contenedor (hover sobre la tarjeta): editar contenedor / editar filas. */\n | { type: 'card-action'; payload: { stepIndex: number; action: CardToolbarAction } }\n // Estado de la preview (ver `PreviewStatus`).\n | { type: 'preview-status'; payload: PreviewStatus }\n /** Respuesta a `scan-page`: elementos clickeables de la página y qué selectores dados existen en ella. */\n | { type: 'page-scan'; payload: PageScan }\n /** El autor cerró el modal de `show-confirmation`. */\n | { type: 'confirmation-closed' }\n | { type: 'closed' };\n\n/**\n * Modal de confirmación que el SDK pinta CENTRADO sobre la app del cliente\n * (mock «Feature tagueada»): check verde, título, mensaje, filas\n * label/valor y un botón que lo cierra. Mientras está abierto el panel se\n * oculta; al cerrarlo el SDK postea `confirmation-closed`.\n */\nexport interface ConfirmationCard {\n title: string;\n message: string;\n rows: Array<{ label: string; value: string }>;\n /** Texto del botón. Default «Listo». */\n buttonLabel?: string;\n}\n\n/** Un elemento clickeable de la página (candidato a feature), sin `rect`. */\nexport type PageElement = Omit<PickedElement, 'rect'>;\n\nexport interface PageScan {\n /** `location.pathname`: el mismo valor que `$page_path` de autocapture (restricción «Solo en esta página»). */\n pagePath: string;\n /**\n * Ruta «humana» de la app: en apps con hash routing (`/#/settings`) incluye\n * el hash; si no, es igual a `pagePath`. Para mostrar y para la foto del\n * elemento, NO para contar (autocapture no lleva el hash).\n */\n routePath: string;\n /** Elementos clickeables visibles que NO matchean ninguno de los `selectors` pedidos. */\n candidates: PageElement[];\n /** De los `selectors` pedidos, cuáles existen en esta página. */\n present: string[];\n}\n\n/** Comandos que el dashboard/panel envía a la app del cliente. */\nexport type BuilderCommand =\n /** `only: 'interactive'` (features): solo botones/enlaces/campos/formularios… (ver `ElementPickerOptions.only`). */\n | { type: 'start-picker'; maxAncestors?: number; hint?: string; only?: 'interactive' }\n | { type: 'stop-picker' }\n /** Panel de features: inventario de la página actual (ver `PageScan`). */\n | { type: 'scan-page'; selectors: string[] }\n /** Resalta (o deja de resaltar) un elemento por selector, sin entrar en modo picker. */\n | { type: 'highlight'; selector: string | null }\n /** Modal de confirmación centrado sobre la app (ver `ConfirmationCard`). */\n | { type: 'show-confirmation'; payload: ConfirmationCard }\n // `editable: true` (editor in-app) adjunta drag/resize sobre la preview.\n // `honorTrigger: true`: si la guía se dispara por elemento objetivo\n // (activationRules on_click/on_hover + selector), la preview ESPERA a esa\n // interacción en la app en vez de pintarse de una.\n // `honorTrigger` también respeta «retrasar la aparición» (delayMs) y el\n // filtro de dispositivo, publicando `preview-status` con lo que está pasando.\n | { type: 'preview'; guide: PreviewGuideInput; editable?: boolean; honorTrigger?: 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 /** El panel selecciona (o deselecciona con null) un bloque en la app. */\n | { type: 'select-block'; blockId: string | null }\n /** El panel edita una fila: se marca en la app (por el id de un bloque de esa fila). */\n | { type: 'select-row'; blockId: string | null }\n | { type: 'teardown' }\n // Chrome del editor: el panel publica su estado (nombre, pasos, sección…).\n | { type: 'editor-state'; state: EditorChromeState }\n // El panel pide ocultarse/mostrarse (botón «Cerrar» del contenido).\n | { type: 'panel-visibility'; visible: boolean }\n /** Tamaño compacto del panel (alto = contenido); `null` restaura el tamaño previo. */\n | { type: 'panel-size'; size: { width: number; height: number } | null }\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 * \"Chrome\" del editor in-app (mock Figma 2026-09): dos barras FIJAS arriba de la\n * app del cliente, dibujadas por el SDK (sin iframe):\n *\n * 1. Topbar oscura: logo · «Nombre · fecha» · app · [barra arriba/abajo]\n * [mostrar editor] [vista previa] · Salir · Guardar ▾ (Guardar y salir).\n * Vista previa: se esconden barras y tarjeta y queda una píldora\n * «Estás en vista previa | Salir» para volver al editor.\n * 2. Fila de pasos: tarjeta «Activación» + una tarjeta por paso + «Agregar\n * paso», con la píldora «Ocultar/Mostrar pasos» colgando al centro. Al\n * pasar el mouse por un paso aparece una capa oscura con «Editar»,\n * duplicar y eliminar (se pueden eliminar todos los pasos).\n *\n * La app se EMPUJA (`margin-top`/`margin-bottom` en <html>, según dónde esté\n * la barra) para que las barras no tapen nada. El chrome NO tiene estado propio: refleja el `EditorChromeState`\n * que publica el panel y devuelve `ChromeAction`s; el panel decide.\n */\nimport { hasDocument, hasWindow } from '../../utils/safe-env';\nimport type { ChromeAction, EditorChromeState } from './bridge-protocol';\n\nexport const CHROME_TOPBAR_H = 64;\nexport const CHROME_STEPS_H = 128;\n\nexport interface BuilderChromeOptions {\n /** Nombre de la app (origen) que se muestra junto al nombre de la guía. */\n appLabel: string;\n onAction: (action: ChromeAction) => void;\n}\n\nexport type ChromeDock = 'top' | 'bottom';\n\nexport interface BuilderChromeHandle {\n /** Refresca las barras con el estado publicado por el panel. */\n setState(state: EditorChromeState): void;\n /** Alto total ocupado hoy (topbar + pasos si están visibles). */\n height(): number;\n /** Dónde está anclada la barra. */\n dock(): ChromeDock;\n /** Modo vista previa: oculta las barras y muestra la píldora para salir. */\n setPreview(on: boolean): void;\n /** Oculta las barras SIN píldora (mientras dura el picker de elementos). */\n setHidden(on: boolean): void;\n /** Se llama cuando cambia el alto (colapsar/expandir pasos). */\n onHeightChange(cb: (h: number) => void): void;\n teardown(): void;\n}\n\nconst ICONS = {\n bolt: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m3.75 13.5 10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75Z\"/>',\n desktop:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 17.25v1.007a3 3 0 0 1-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0 1 15 18.257V17.25m6-12V15a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 15V5.25m18 0A2.25 2.25 0 0 0 18.75 3H5.25A2.25 2.25 0 0 0 3 5.25m18 0V12a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 12V5.25\"/>',\n updown:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3 7.5 7.5 3m0 0L12 7.5M7.5 3v13.5m13.5 0L16.5 21m0 0L12 16.5m4.5 4.5V7.5\"/>',\n map: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 6.75V15m6-6v8.25m.503 3.498 4.875-2.437c.381-.19.622-.58.622-1.006V4.82c0-.836-.88-1.38-1.628-1.006l-3.869 1.934c-.317.159-.69.159-1.006 0L9.503 3.252a1.125 1.125 0 0 0-1.006 0L3.622 5.689C3.24 5.88 3 6.27 3 6.695V19.18c0 .836.88 1.38 1.628 1.006l3.869-1.934c.317-.159.69-.159 1.006 0l4.994 2.497c.317.158.69.158 1.006 0Z\"/>',\n eye: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M2.036 12.322a1.012 1.012 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178Z\"/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\"/>',\n chevronDown:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m19.5 8.25-7.5 7.5-7.5-7.5\"/>',\n chevronUp:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m4.5 15.75 7.5-7.5 7.5 7.5\"/>',\n plus: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\"/>',\n pencil:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0 1 15.75 21H5.25A2.25 2.25 0 0 1 3 18.75V8.25A2.25 2.25 0 0 1 5.25 6H10\"/>',\n copy: '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 0 0-2.25-2.25H6A2.25 2.25 0 0 0 3.75 6v8.25A2.25 2.25 0 0 0 6 16.5h2.25m8.25-8.25H18a2.25 2.25 0 0 1 2.25 2.25V18A2.25 2.25 0 0 1 18 20.25h-7.5A2.25 2.25 0 0 1 8.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 0 0-2.25 2.25v6\"/>',\n trash:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0\"/>',\n cursor:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15.042 21.672 13.684 16.6m0 0-2.51 2.225.569-9.47 5.227 7.917-3.286-.672ZM12 2.25V4.5m5.834.166-1.591 1.591M20.25 10.5H18M7.757 14.743l-1.59 1.59M6 10.5H3.75m4.007-4.243-1.59-1.59\"/>',\n spinner:\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182\"/>',\n};\n\nfunction svg(name: keyof typeof ICONS, size = 20): string {\n return (\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" ` +\n `fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" aria-hidden=\"true\">${ICONS[name]}</svg>`\n );\n}\n\n/** «19 ago» (fecha corta, locale es). */\nfunction shortDate(iso: string | null): string {\n if (!iso) return '';\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return '';\n return d.toLocaleDateString('es', { day: 'numeric', month: 'short' }).replace('.', '');\n}\n\nfunction el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className: string,\n html?: string,\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n node.className = className;\n if (html !== undefined) node.innerHTML = html;\n return node;\n}\n\nfunction iconButton(name: keyof typeof ICONS, title: string, className = ''): HTMLButtonElement {\n const b = el('button', `veo-tb-icon ${className}`.trim(), svg(name));\n b.type = 'button';\n b.title = title;\n b.setAttribute('aria-label', title);\n return b;\n}\n\n/** Inyecta el chrome del editor. Devuelve el handle (o uno inerte sin DOM). */\nexport function injectBuilderChrome(opts: BuilderChromeOptions): BuilderChromeHandle {\n if (!hasWindow() || !hasDocument()) {\n return {\n setState: () => {},\n height: () => 0,\n dock: () => 'top',\n setPreview: () => {},\n setHidden: () => {},\n onHeightChange: () => {},\n teardown: () => {},\n };\n }\n\n const host = document.createElement('div');\n host.setAttribute('data-veo-builder-chrome', '');\n host.setAttribute('data-veo-ignore', '');\n const shadow = host.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = CHROME_CSS;\n\n const root = el('div', 'veo-chrome');\n\n // ── Topbar ──\n const topbar = el('div', 'veo-tb');\n const brand = el('div', 'veo-tb-brand', svg('bolt', 18));\n const nameEl = el('div', 'veo-tb-name');\n const statusEl = el('span', 'veo-tb-status');\n statusEl.hidden = true;\n const sep = el('span', 'veo-tb-sep');\n const appEl = el('div', 'veo-tb-app', `${svg('desktop', 16)}<span></span>`);\n (appEl.querySelector('span') as HTMLElement).textContent = opts.appLabel;\n const left = el('div', 'veo-tb-left');\n left.append(brand, nameEl, statusEl, sep, appEl);\n\n const right = el('div', 'veo-tb-right');\n const dockBtn = iconButton('updown', 'Mover la barra abajo');\n const showPanel = iconButton('map', 'Mostrar el editor');\n const preview = iconButton('eye', 'Vista previa');\n const exit = el('button', 'veo-tb-text', 'Salir');\n exit.type = 'button';\n const saveGroup = el('div', 'veo-tb-save');\n const save = el('button', 'veo-tb-save-main', '<span>Guardar</span>');\n save.type = 'button';\n const saveMore = el('button', 'veo-tb-save-more', svg('chevronDown', 16));\n saveMore.type = 'button';\n saveMore.title = 'Más opciones de guardado';\n saveMore.setAttribute('aria-label', 'Más opciones de guardado');\n const saveMenu = el('div', 'veo-tb-menu');\n const saveExit = el('button', 'veo-tb-menu-item', 'Guardar y salir');\n saveExit.type = 'button';\n saveMenu.append(saveExit);\n saveMenu.hidden = true;\n saveGroup.append(save, saveMore, saveMenu);\n right.append(dockBtn, showPanel, preview, el('span', 'veo-tb-vsep'), exit, saveGroup);\n topbar.append(left, right);\n\n // ── Fila de pasos ──\n const stepsBar = el('div', 'veo-steps');\n const stepsList = el('div', 'veo-steps-list');\n stepsBar.append(stepsList);\n\n const togglePill = el('button', 'veo-steps-toggle');\n togglePill.type = 'button';\n\n root.append(topbar, stepsBar, togglePill);\n\n // Píldora de vista previa (solo visible en ese modo).\n const previewPill = el('div', 'veo-preview-pill');\n const previewLabel = el(\n 'span',\n 'veo-preview-label',\n `${svg('eye', 18)}<span>Estás en vista previa</span>`,\n );\n const previewExit = el('button', 'veo-preview-exit', 'Salir');\n previewExit.type = 'button';\n previewPill.append(previewLabel, previewExit);\n previewPill.hidden = true;\n\n shadow.append(style, root, previewPill);\n document.body.appendChild(host);\n\n // ── Empujar la app (arriba o abajo según el anclaje) ──\n const html = document.documentElement;\n const prevMarginTop = html.style.marginTop;\n const prevMarginBottom = html.style.marginBottom;\n let collapsed = false;\n let dock: ChromeDock = 'top';\n let previewOn = false;\n let hiddenOn = false;\n let heightCb: ((h: number) => void) | null = null;\n let tagging = false;\n const height = (): number => CHROME_TOPBAR_H + (collapsed || tagging ? 0 : CHROME_STEPS_H);\n const applyHeight = (): void => {\n const h = previewOn || hiddenOn ? 0 : height();\n html.style.marginTop = dock === 'top' ? `${h}px` : prevMarginTop;\n html.style.marginBottom = dock === 'bottom' ? `${h}px` : prevMarginBottom;\n root.style.setProperty('--veo-chrome-h', `${height()}px`);\n root.classList.toggle('is-bottom', dock === 'bottom');\n stepsBar.hidden = collapsed || tagging;\n togglePill.hidden = tagging;\n // Modo tagging: sin vista previa ni Guardar (cada tag se guarda al crearse).\n preview.hidden = tagging;\n saveGroup.hidden = tagging;\n showPanel.title = tagging ? 'Mostrar el panel' : 'Mostrar el editor';\n const open = dock === 'top' ? 'chevronUp' : 'chevronDown';\n const closedIcon = dock === 'top' ? 'chevronDown' : 'chevronUp';\n togglePill.innerHTML = `<span>${collapsed ? 'Mostrar pasos' : 'Ocultar pasos'}</span>${svg(\n collapsed ? closedIcon : open,\n 16,\n )}`;\n dockBtn.title = dock === 'top' ? 'Mover la barra abajo' : 'Mover la barra arriba';\n dockBtn.setAttribute('aria-label', dockBtn.title);\n heightCb?.(h);\n };\n const setPreview = (on: boolean): void => {\n previewOn = on;\n root.hidden = on || hiddenOn;\n previewPill.hidden = !on;\n applyHeight();\n };\n const setHidden = (on: boolean): void => {\n hiddenOn = on;\n root.hidden = on || previewOn;\n applyHeight();\n };\n togglePill.addEventListener('click', () => {\n collapsed = !collapsed;\n applyHeight();\n });\n\n // ── Acciones ──\n const act = (a: ChromeAction): void => opts.onAction(a);\n dockBtn.addEventListener('click', () => {\n dock = dock === 'top' ? 'bottom' : 'top';\n applyHeight();\n act({ action: 'dock', position: dock });\n });\n showPanel.addEventListener('click', () => act({ action: 'show-panel' }));\n preview.addEventListener('click', () => act({ action: 'preview' }));\n previewExit.addEventListener('click', () => act({ action: 'exit-preview' }));\n exit.addEventListener('click', () => act({ action: 'exit' }));\n save.addEventListener('click', () => act({ action: 'save', exit: false }));\n saveMore.addEventListener('click', (e) => {\n e.stopPropagation();\n saveMenu.hidden = !saveMenu.hidden;\n });\n saveExit.addEventListener('click', () => {\n saveMenu.hidden = true;\n act({ action: 'save', exit: true });\n });\n const closeMenu = (): void => {\n saveMenu.hidden = true;\n };\n document.addEventListener('click', closeMenu);\n\n // ── Render de estado ──\n let current: EditorChromeState | null = null;\n const render = (): void => {\n const s = current;\n if (!s) return;\n const nextTagging = s.variant === 'tagging';\n if (nextTagging !== tagging) {\n tagging = nextTagging;\n applyHeight();\n }\n const date = shortDate(s.createdAt);\n nameEl.textContent = tagging\n ? s.guideName.trim() || 'Modo tagging'\n : `${s.guideName.trim() || 'Sin nombre'}${date ? ` · ${date}` : ''}`;\n if (s.status) {\n statusEl.hidden = false;\n statusEl.textContent = s.status.label;\n statusEl.dataset.tone = s.status.tone;\n statusEl.title = 'Estado de la guía (se cambia desde la lista de guías)';\n } else {\n statusEl.hidden = true;\n }\n save.innerHTML = s.saving\n ? `${svg('spinner', 16)}<span>Guardando…</span>`\n : '<span>Guardar</span>';\n save.disabled = s.saving;\n saveExit.disabled = s.saving;\n\n stepsList.replaceChildren();\n const activation = stepCard(svg('cursor', 22), 'Activación', s.section === 'activation');\n activation.addEventListener('click', () => act({ action: 'select-activation' }));\n stepsList.append(activation);\n s.steps.forEach((st, i) => {\n const thumb =\n st.presentation === 'inline'\n ? '<div class=\"veo-thumb veo-thumb-inline\"><i></i><i></i><i></i></div>'\n : '<div class=\"veo-thumb\"><i></i><i></i><b></b></div>';\n // «Estructura» es una vista del paso activo: la fila de pasos lo sigue marcando.\n const isStepView =\n s.section === 'step' ||\n s.section === 'block' ||\n s.section === 'add-block' ||\n s.section === 'row' ||\n s.section === 'structure';\n const card = stepCard(thumb, st.label, isStepView && s.activeStep === i, {\n // Se pueden borrar TODOS los pasos (el panel vuelve a Activación).\n canRemove: true,\n onEdit: () => act({ action: 'select-step', index: i }),\n onDuplicate: () => act({ action: 'duplicate-step', index: i }),\n onRemove: () => act({ action: 'remove-step', index: i }),\n });\n stepsList.append(card);\n });\n const add = el('button', 'veo-step-add', `${svg('plus', 18)}<span>Agregar paso</span>`);\n add.type = 'button';\n add.addEventListener('click', () => act({ action: 'add-step' }));\n stepsList.append(add);\n };\n\n applyHeight();\n\n return {\n setState: (state) => {\n current = state;\n render();\n },\n height,\n dock: () => dock,\n setPreview,\n setHidden,\n onHeightChange: (cb) => {\n heightCb = cb;\n },\n teardown: () => {\n document.removeEventListener('click', closeMenu);\n html.style.marginTop = prevMarginTop;\n html.style.marginBottom = prevMarginBottom;\n host.remove();\n },\n };\n}\n\ninterface StepCardActions {\n canRemove: boolean;\n onEdit: () => void;\n onDuplicate: () => void;\n onRemove: () => void;\n}\n\n/**\n * Tarjeta de la fila de pasos. Sin `actions` es un botón simple (Activación).\n * Con `actions` es un paso: al pasar el mouse (o enfocar) aparece la capa\n * oscura con «Editar», duplicar y eliminar. Un clic en cualquier parte de la\n * tarjeta que no sea un botón de la capa también edita.\n */\nfunction stepCard(\n inner: string,\n label: string,\n active: boolean,\n actions?: StepCardActions,\n): HTMLElement {\n const cls = `veo-step${active ? ' is-active' : ''}`;\n if (!actions) {\n const b = el(\n 'button',\n cls,\n `<div class=\"veo-step-box\">${inner}</div><span class=\"veo-step-label\"></span>`,\n );\n b.type = 'button';\n (b.querySelector('.veo-step-label') as HTMLElement).textContent = label;\n b.setAttribute('aria-pressed', active ? 'true' : 'false');\n return b;\n }\n const card = el(\n 'div',\n cls,\n `<div class=\"veo-step-box\">${inner}` +\n '<div class=\"veo-step-hover\">' +\n '<div class=\"veo-step-hover-top\">' +\n `<button type=\"button\" class=\"veo-step-icon veo-step-remove\" title=\"Eliminar paso\" aria-label=\"Eliminar paso\">${svg('trash', 14)}</button>` +\n `<button type=\"button\" class=\"veo-step-icon veo-step-duplicate\" title=\"Duplicar paso\" aria-label=\"Duplicar paso\">${svg('copy', 14)}</button>` +\n '</div>' +\n '<div class=\"veo-step-hover-main\">' +\n `<button type=\"button\" class=\"veo-step-edit\">${svg('pencil', 14)}<span>Editar</span></button>` +\n '</div>' +\n '</div></div><span class=\"veo-step-label\"></span>',\n );\n (card.querySelector('.veo-step-label') as HTMLElement).textContent = label;\n card.setAttribute('aria-current', active ? 'step' : 'false');\n const remove = card.querySelector('.veo-step-remove') as HTMLButtonElement;\n remove.disabled = !actions.canRemove;\n if (!actions.canRemove) remove.title = 'La guía necesita al menos un paso';\n const on = (sel: string, fn: () => void): void => {\n card.querySelector(sel)?.addEventListener('click', (e) => {\n e.stopPropagation();\n fn();\n });\n };\n on('.veo-step-edit', actions.onEdit);\n on('.veo-step-duplicate', actions.onDuplicate);\n on('.veo-step-remove', actions.onRemove);\n card.addEventListener('click', actions.onEdit);\n return card;\n}\n\nconst CHROME_CSS = `\n:host { all: initial; }\n.veo-chrome {\n position: fixed; top: 0; left: 0; right: 0;\n display: flex; flex-direction: column;\n z-index: 2147483646;\n font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif;\n font-size: 14px; color: #1c1917;\n}\n.veo-chrome[hidden] { display: none; }\n/* Modo tagging oculta controles por atributo: gana a los display de sus clases. */\n.veo-chrome [hidden], .veo-steps-toggle[hidden] { display: none !important; }\n.veo-chrome.is-bottom { top: auto; bottom: 0; flex-direction: column-reverse; }\n.veo-chrome.is-bottom .veo-tb-menu { top: auto; bottom: calc(100% + 8px); }\n.veo-chrome.is-bottom .veo-steps { border-bottom: 0; border-top: 1px solid #d6cfc8; }\n.veo-chrome.is-bottom .veo-steps-toggle { top: auto; bottom: var(--veo-chrome-h, ${CHROME_TOPBAR_H + CHROME_STEPS_H}px); transform: translate(-50%, 50%); }\n.veo-preview-pill {\n position: fixed; top: 28px; left: 50%; transform: translateX(-50%);\n z-index: 2147483646;\n display: inline-flex; align-items: center; gap: 12px;\n background: #2b2623; color: #fff; border-radius: 999px; padding: 12px 20px;\n font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif; font-size: 15px; font-weight: 500;\n box-shadow: 0 8px 24px rgba(0,0,0,0.3);\n}\n.veo-preview-pill[hidden] { display: none; }\n.veo-preview-label { display: inline-flex; align-items: center; gap: 10px; padding-right: 12px; border-right: 1px solid rgba(255,255,255,0.3); }\n.veo-preview-exit { border: 0; background: transparent; color: #fff; font: inherit; cursor: pointer; padding: 0 2px; }\n.veo-preview-exit:hover { text-decoration: underline; }\n.veo-tb {\n height: ${CHROME_TOPBAR_H}px; box-sizing: border-box;\n display: flex; align-items: center; justify-content: space-between;\n padding: 0 20px; gap: 16px;\n background: #2b2623; color: #fff;\n}\n.veo-tb-left, .veo-tb-right { display: flex; align-items: center; gap: 12px; min-width: 0; }\n.veo-tb-brand {\n width: 36px; height: 36px; border-radius: 999px; background: #b74d00;\n display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto;\n}\n.veo-tb-name { font-weight: 700; font-size: 16px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.veo-tb-status { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: 999px; font-size: 11px; font-weight: 600; letter-spacing: 0.02em; white-space: nowrap; background: rgba(255,255,255,0.18); color: #fff; }\n.veo-tb-status[data-tone=\"live\"] { background: #16a34a; }\n.veo-tb-status[data-tone=\"testing\"] { background: #b45309; }\n.veo-tb-status[data-tone=\"review\"] { background: #7c3aed; }\n.veo-tb-status[data-tone=\"draft\"] { background: #0f766e; }\n.veo-tb-status[data-tone=\"paused\"] { background: rgba(255,255,255,0.28); }\n.veo-tb-sep { width: 1px; height: 24px; background: rgba(255,255,255,0.25); }\n.veo-tb-vsep { width: 1px; height: 28px; background: rgba(255,255,255,0.25); margin: 0 4px; }\n.veo-tb-app { display: inline-flex; align-items: center; gap: 8px; color: rgba(255,255,255,0.85); white-space: nowrap; }\n.veo-tb-icon {\n width: 42px; height: 42px; border-radius: 10px; border: 0;\n background: rgba(255,255,255,0.12); color: #fff; cursor: pointer;\n display: inline-flex; align-items: center; justify-content: center;\n}\n.veo-tb-icon:hover { background: rgba(255,255,255,0.22); }\n.veo-tb-text { border: 0; background: transparent; color: #fff; font: inherit; font-size: 15px; cursor: pointer; padding: 8px 6px; }\n.veo-tb-text:hover { text-decoration: underline; }\n.veo-tb-save { position: relative; display: inline-flex; border-radius: 10px; overflow: visible; }\n.veo-tb-save-main, .veo-tb-save-more {\n border: 0; background: #b74d00; color: #fff; font: inherit; font-weight: 600; font-size: 15px;\n cursor: pointer; display: inline-flex; align-items: center; gap: 8px; height: 42px;\n}\n.veo-tb-save-main { padding: 0 8px 0 18px; border-radius: 10px 0 0 10px; }\n.veo-tb-save-more { padding: 0 12px 0 6px; border-radius: 0 10px 10px 0; }\n.veo-tb-save-main:hover, .veo-tb-save-more:hover { background: #953c00; }\n.veo-tb-save-main:disabled { opacity: 0.7; cursor: default; }\n.veo-tb-menu {\n position: absolute; right: 0; top: calc(100% + 8px); min-width: 220px;\n background: #fff; color: #1c1917; border-radius: 12px; padding: 6px;\n box-shadow: 0 12px 32px rgba(0,0,0,0.22);\n}\n.veo-tb-menu-item {\n display: block; width: 100%; text-align: left; border: 0; background: transparent;\n font: inherit; font-size: 15px; padding: 10px 14px; border-radius: 8px; cursor: pointer;\n}\n.veo-tb-menu-item:hover { background: #f5efe9; }\n.veo-steps {\n height: ${CHROME_STEPS_H}px; box-sizing: border-box;\n background: #e7e1dc; border-bottom: 1px solid #d6cfc8;\n padding: 16px 28px 0; overflow-x: auto;\n}\n.veo-steps[hidden] { display: none; }\n.veo-steps-list { display: flex; align-items: flex-start; gap: 20px; }\n.veo-step { border: 0; background: transparent; padding: 0; cursor: pointer; font: inherit; display: flex; flex-direction: column; align-items: center; gap: 8px; flex: 0 0 auto; }\n.veo-step-box {\n position: relative; overflow: hidden;\n width: 116px; height: 64px; border-radius: 10px; background: #fff; border: 2px solid transparent;\n display: flex; align-items: center; justify-content: center; color: #2b2623;\n box-shadow: 0 1px 2px rgba(0,0,0,0.06);\n}\n/* Capa de acciones del paso: aparece al pasar el mouse o al enfocar un botón. */\n.veo-step-hover {\n position: absolute; inset: 0; background: #2b2623; border-radius: 8px;\n display: flex; flex-direction: column; padding: 3px 4px 6px; box-sizing: border-box;\n opacity: 0; transition: opacity 120ms ease-out;\n}\n.veo-step:hover .veo-step-hover, .veo-step:focus-within .veo-step-hover { opacity: 1; }\n.veo-step-hover-top { display: flex; justify-content: space-between; align-items: center; }\n.veo-step-hover-main { flex: 1; display: flex; align-items: center; justify-content: center; }\n.veo-step-icon {\n border: 0; background: transparent; color: #fff; cursor: pointer; padding: 0;\n width: 20px; height: 20px; border-radius: 5px; display: inline-flex; align-items: center; justify-content: center;\n}\n.veo-step-icon:hover { background: rgba(255,255,255,0.14); }\n.veo-step-icon:disabled { opacity: 0.35; cursor: default; background: transparent; }\n.veo-step-edit {\n width: 100%; margin: 0 6px; border: 0; background: #dbeefc; color: #1d6fb8; font: inherit; font-size: 13px; font-weight: 600;\n border-radius: 6px; padding: 5px 10px; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 6px;\n}\n.veo-step-edit:hover { background: #cbe4f9; }\n.veo-step.is-active .veo-step-box { border-color: #b74d00; }\n.veo-step-label { font-size: 13px; color: #6b635d; }\n.veo-step.is-active .veo-step-label { color: #2b2623; font-weight: 600; }\n.veo-thumb { width: 72px; height: 36px; border: 1.5px solid #c9c2bb; border-radius: 6px; padding: 6px 7px; box-sizing: border-box; display: flex; flex-direction: column; gap: 4px; }\n.veo-thumb i { display: block; height: 3px; border-radius: 2px; background: #2b2623; width: 70%; }\n.veo-thumb i + i { width: 45%; background: #c9c2bb; }\n.veo-thumb b { display: block; height: 6px; width: 24px; border-radius: 2px; background: #b74d00; align-self: flex-end; }\n.veo-thumb-inline { border-style: dashed; }\n.veo-thumb-inline i { width: 100%; }\n.veo-step-add { border: 0; background: transparent; font: inherit; font-size: 15px; color: #6b635d; cursor: pointer; display: inline-flex; align-items: center; gap: 8px; height: 64px; padding: 0 8px; }\n.veo-step-add:hover { color: #2b2623; }\n.veo-steps-toggle {\n position: absolute; left: 50%; top: var(--veo-chrome-h, ${CHROME_TOPBAR_H + CHROME_STEPS_H}px);\n transform: translate(-50%, -50%);\n border: 0; background: #2b2623; color: #fff; font: inherit; font-size: 14px; font-weight: 500;\n border-radius: 999px; padding: 10px 18px; cursor: pointer;\n display: inline-flex; align-items: center; gap: 8px;\n box-shadow: 0 6px 18px rgba(0,0,0,0.25);\n}\n`;\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 = 484;\nconst PANEL_H = 660;\nconst MIN_W = 320;\nconst MIN_H = 320;\nconst MARGIN = 16;\n/** Alto del header propio del panel (drag + acciones). */\nconst HEADER_H = 52;\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 /** Alto ocupado arriba por el chrome del editor (el panel arranca debajo). */\n topOffset?: number;\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 /** Título del header (lo publica el editor: «Ajustes de activación», «Paso 1»…). */\n setTitle(title: string): void;\n /** Muestra/oculta la tarjeta (el estado del editor se conserva en el iframe). */\n setVisible(visible: boolean): void;\n isVisible(): boolean;\n /** Reposiciona el tope mínimo cuando el chrome cambia de alto. */\n setTopOffset(px: number): void;\n /**\n * Tamaño COMPACTO pedido por el editor (p. ej. «Estructura», un popover\n * chico): `height` es el alto del contenido, el header se suma acá. `null`\n * restaura el tamaño que tenía. Se ignora maximizado o en pop-out.\n */\n setSize(size: { width: number; height: number } | null): 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 {\n target: () => null,\n frameRect: () => null,\n teardown: () => {},\n setTitle: () => {},\n setVisible: () => {},\n isVisible: () => false,\n setTopOffset: () => {},\n setSize: () => {},\n };\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 topOffset = opts.topOffset ?? 0;\n // Mock: la tarjeta arranca a la IZQUIERDA, justo debajo del chrome.\n let left = 40;\n let top = topOffset + 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 (mock 2026-09): grip «···» arriba al centro, título a la izquierda y\n // a la derecha pop-out · maximizar · minimizar.\n const header = document.createElement('div');\n header.className = 'veo-panel-header';\n const grip = document.createElement('span');\n grip.className = 'veo-panel-grip';\n grip.setAttribute('aria-hidden', 'true');\n grip.textContent = '···';\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 = panelButton(ICON_POPOUT, 'Abrir en ventana aparte');\n const maximize = panelButton(ICON_EXPAND, 'Maximizar');\n const minimize = panelButton(ICON_MINUS, 'Minimizar');\n actions.append(popout, maximize, minimize);\n header.append(grip, 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 resizeGrip = document.createElement('div');\n resizeGrip.className = 'veo-panel-resize';\n resizeGrip.setAttribute('aria-hidden', 'true');\n\n card.append(header, iframe, resizeGrip);\n shadow.append(style, card);\n document.body.appendChild(host);\n\n // ── Minimizar / maximizar ───────────────────────────────────────────────\n let visible = true;\n let maximized = false;\n let restore: { left: number; top: number; w: number; h: number } | null = null;\n const setVisible = (next: boolean): void => {\n visible = next;\n card.style.display = next && !(popped && !popped.closed) ? '' : 'none';\n };\n minimize.addEventListener('click', () => setVisible(false));\n // Tamaño compacto (ver BuilderPanelHandle.setSize): recuerda el tamaño previo\n // la primera vez y lo restaura con `null`. Levanta el alto mínimo mientras\n // dura, para que un popover chico pueda ser chico de verdad.\n let compactRestore: { w: number; h: number } | null = null;\n const setSize = (size: { width: number; height: number } | null): void => {\n if (maximized || (popped && !popped.closed)) return;\n if (size) {\n if (!compactRestore) compactRestore = { w: card.offsetWidth, h: card.offsetHeight };\n card.style.minHeight = '0';\n card.style.width = `${clamp(Math.round(size.width), MIN_W, window.innerWidth - MARGIN * 2)}px`;\n card.style.height = `${clamp(Math.round(size.height) + HEADER_H, HEADER_H + 80, window.innerHeight - top - MARGIN)}px`;\n } else if (compactRestore) {\n card.style.minHeight = '';\n card.style.width = `${compactRestore.w}px`;\n card.style.height = `${compactRestore.h}px`;\n compactRestore = null;\n }\n };\n maximize.addEventListener('click', () => {\n maximized = !maximized;\n if (maximized) {\n restore = { left, top, w: card.offsetWidth, h: card.offsetHeight };\n left = MARGIN;\n top = topOffset + MARGIN;\n card.style.left = `${left}px`;\n card.style.top = `${top}px`;\n card.style.width = `${Math.max(MIN_W, window.innerWidth - MARGIN * 2)}px`;\n card.style.height = `${Math.max(MIN_H, window.innerHeight - top - MARGIN)}px`;\n maximize.title = 'Restaurar';\n } else if (restore) {\n left = restore.left;\n top = restore.top;\n card.style.left = `${left}px`;\n card.style.top = `${top}px`;\n card.style.width = `${restore.w}px`;\n card.style.height = `${restore.h}px`;\n maximize.title = 'Maximizar';\n }\n });\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 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)?.closest('.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), topOffset, Math.max(topOffset, 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 resizeGrip.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 setTitle: (t) => {\n title.textContent = t;\n },\n setVisible,\n setSize,\n isVisible: () => visible,\n setTopOffset: (px) => {\n topOffset = px;\n if (top < topOffset + MARGIN) {\n top = topOffset + MARGIN;\n card.style.top = `${top}px`;\n }\n },\n };\n}\n\nconst ICON_POPOUT =\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m6.75 7.5 3 2.25-3 2.25m4.5 0h3m-9 8.25h13.5A2.25 2.25 0 0 0 21 18V6a2.25 2.25 0 0 0-2.25-2.25H5.25A2.25 2.25 0 0 0 3 6v12a2.25 2.25 0 0 0 2.25 2.25Z\"/>';\nconst ICON_EXPAND =\n '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\"/>';\nconst ICON_MINUS = '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M5 12h14\"/>';\n\nfunction panelButton(iconPath: string, label: string): HTMLButtonElement {\n const b = document.createElement('button');\n b.className = 'veo-panel-btn';\n b.type = 'button';\n b.title = label;\n b.setAttribute('aria-label', label);\n b.innerHTML =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" ' +\n `fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" aria-hidden=\"true\">${iconPath}</svg>`;\n return b;\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: 14px;\n box-shadow: 0 12px 40px rgba(0,0,0,0.22);\n overflow: hidden;\n z-index: 2147483647;\n font-family: system-ui, -apple-system, sans-serif;\n}\n.veo-panel-header {\n position: relative; flex: 0 0 auto; height: ${HEADER_H}px; box-sizing: border-box;\n display: flex; align-items: center; justify-content: space-between;\n padding: 10px 14px 0 22px;\n background: #fbf8f5; color: #1c1917; border-bottom: 1px solid #e8e2dc;\n font-size: 17px; font-weight: 700;\n cursor: grab;\n}\n.veo-panel-header:active { cursor: grabbing; }\n.veo-panel-grip {\n position: absolute; top: 0; left: 50%; transform: translateX(-50%);\n color: #b5aca4; font-size: 14px; letter-spacing: 1px; line-height: 12px;\n}\n.veo-panel-title { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.veo-panel-actions { display: flex; gap: 2px; }\n.veo-panel-btn {\n border: 0; background: transparent; color: #4b4540;\n cursor: pointer; line-height: 1; display: inline-flex; align-items: center;\n padding: 6px; border-radius: 8px;\n}\n.veo-panel-btn:hover { background: rgba(0,0,0,0.06); color: #1c1917; }\n.veo-panel-frame { flex: 1 1 auto; width: 100%; border: 0; background: #fff; }\n.veo-panel-resize {\n position: absolute; right: 0; bottom: 0;\n width: 16px; height: 16px;\n cursor: nwse-resize;\n background:\n linear-gradient(135deg, transparent 50%, rgba(0,0,0,0.25) 50%, rgba(0,0,0,0.25) 60%,\n transparent 60%, transparent 72%, rgba(0,0,0,0.25) 72%, rgba(0,0,0,0.25) 82%, transparent 82%);\n}\n`;\n","/**\n * Manipulación DIRECTA del diseño en modo editor: arrastrar la tarjeta de una\n * modal para posicionarla, redimensionarla desde bordes/esquinas, y arrastrar\n * un banner para alternar top/bottom. Vive en el bundle builder (veo-builder.js)\n * — el runtime de guías no carga nada de esto.\n *\n * Funciona como DECORATOR: se adjunta DESPUÉS del render sobre el shadow root\n * abierto del host de la guía (no toca los renderers). Durante el gesto aplica\n * las variables CSS localmente (feedback a 60fps, sin postMessage); al soltar\n * (`pointerup`) emite UN `onCommit(patch)` con los valores finales, que el\n * builder-mode postea al panel como `design-updated`. El panel actualiza su\n * estado y re-manda `preview` — que entra por el update in-place con las\n * MISMAS variables → no hay loop ni parpadeo.\n *\n * Geometría del modal (ver styles.ts): la card usa `left: posX%` +\n * `translate(-posX%)`, o sea `cardLeft = posX * (viewportW - cardW)` →\n * `posX = cardLeft / (viewportW - cardW)`. Mismo modelo que serializa el\n * dashboard (`style.posX/posY` en 0..1) y consume `applyDesignVars`.\n */\nimport type { GuideType } from '../guides/types';\n\n/** Merge superficial sobre `step.style` del paso activo (lo aplica el panel). */\nexport interface DesignPatch {\n stepIndex: number;\n style: {\n posX?: number;\n posY?: number;\n width?: number;\n height?: number;\n position?: 'top' | 'bottom';\n };\n}\n\nexport interface DesignManipulatorOptions {\n /** Host de la guía (de `PreviewHandle.host()`), con shadow root abierto. */\n host: HTMLElement;\n guideType: GuideType;\n stepIndex: number;\n /** Se emite UNA vez por gesto, al soltar. */\n onCommit: (patch: DesignPatch) => void;\n /** Fin de cualquier gesto (con o sin cambios). Para aplicar previews encolados. */\n onGestureEnd?: () => void;\n}\n\nexport interface DesignManipulatorHandle {\n /** `true` mientras hay un gesto de drag/resize en curso. */\n isDragging(): boolean;\n /** Remueve handles, estilos y listeners. Idempotente. */\n detach(): void;\n}\n\nconst MIN_W = 220;\nconst MAX_W = 720;\nconst MIN_H = 120;\nconst MAX_H = 900;\n/** Zonas de agarre de los bordes (px). */\nconst EDGE = 8;\n\ntype ResizeDir = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw';\nconst RESIZE_DIRS: ResizeDir[] = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\n\nconst MANIPULATOR_CSS = `\n.veo-mnp-card {\n outline: 1.5px dashed rgba(255, 91, 53, 0.75);\n outline-offset: 2px;\n}\n.veo-mnp-card:hover { cursor: move; }\n.veo-mnp-handle {\n position: absolute;\n z-index: 10;\n background: transparent;\n}\n.veo-mnp-handle::after {\n content: '';\n position: absolute;\n width: 8px; height: 8px;\n background: #fff;\n border: 1.5px solid rgba(255, 91, 53, 0.9);\n border-radius: 2px;\n top: 50%; left: 50%;\n transform: translate(-50%, -50%);\n opacity: 0;\n transition: opacity 100ms ease;\n}\n.veo-mnp-card:hover .veo-mnp-handle::after,\n.veo-mnp-handle:hover::after { opacity: 1; }\n.veo-mnp-n { top: -${EDGE / 2}px; left: ${EDGE}px; right: ${EDGE}px; height: ${EDGE}px; cursor: ns-resize; }\n.veo-mnp-s { bottom: -${EDGE / 2}px; left: ${EDGE}px; right: ${EDGE}px; height: ${EDGE}px; cursor: ns-resize; }\n.veo-mnp-e { right: -${EDGE / 2}px; top: ${EDGE}px; bottom: ${EDGE}px; width: ${EDGE}px; cursor: ew-resize; }\n.veo-mnp-w { left: -${EDGE / 2}px; top: ${EDGE}px; bottom: ${EDGE}px; width: ${EDGE}px; cursor: ew-resize; }\n.veo-mnp-ne { top: -${EDGE / 2}px; right: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nesw-resize; }\n.veo-mnp-nw { top: -${EDGE / 2}px; left: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nwse-resize; }\n.veo-mnp-se { bottom: -${EDGE / 2}px; right: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nwse-resize; }\n.veo-mnp-sw { bottom: -${EDGE / 2}px; left: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nesw-resize; }\n.veo-mnp-banner { outline: 1.5px dashed rgba(255, 91, 53, 0.75); outline-offset: -2px; cursor: grab; }\n.veo-mnp-banner:active { cursor: grabbing; }\n`;\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.min(Math.max(v, min), max);\n}\n\nfunction round3(v: number): number {\n return Math.round(v * 1000) / 1000;\n}\n\n/** true si el mousedown cayó sobre algo interactivo (no iniciar drag ahí). */\nfunction isInteractive(target: EventTarget | null): boolean {\n return Boolean(\n target instanceof Element && target.closest('button, a, input, textarea, select, label'),\n );\n}\n\n/**\n * Adjunta la manipulación directa al host de una guía montada. Devuelve el\n * handle, o `null` si el tipo de guía no la soporta o el DOM esperado no está.\n * Idempotente: si la card ya está decorada, no re-adjunta.\n */\nexport function attachDesignManipulator(\n opts: DesignManipulatorOptions,\n): DesignManipulatorHandle | null {\n const shadow = opts.host.shadowRoot;\n if (!shadow) return null;\n\n const card = shadow.querySelector<HTMLElement>('.veo-modal-card');\n if (card) return attachModal(opts, shadow, card);\n\n const banner = shadow.querySelector<HTMLElement>('.veo-banner');\n // El banner embebido se posiciona con prepend/append en el contenedor: su\n // top/bottom se cambia desde el panel (remonta). Solo el fijo se arrastra.\n if (banner && !banner.classList.contains('veo-banner-embedded')) {\n return attachBanner(opts, shadow, banner);\n }\n\n return null;\n}\n\n// ── Modal: drag libre + resize por 8 handles ────────────────────────────────\n\nfunction attachModal(\n opts: DesignManipulatorOptions,\n shadow: ShadowRoot,\n card: HTMLElement,\n): DesignManipulatorHandle | null {\n if (card.dataset.veoManipulated === '1') return null;\n card.dataset.veoManipulated = '1';\n card.classList.add('veo-mnp-card');\n\n const doc = card.ownerDocument;\n const style = doc.createElement('style');\n style.textContent = MANIPULATOR_CSS;\n shadow.appendChild(style);\n\n const handles: HTMLElement[] = [];\n for (const dir of RESIZE_DIRS) {\n const h = doc.createElement('div');\n h.className = `veo-mnp-handle veo-mnp-${dir}`;\n h.dataset.veoDir = dir;\n card.appendChild(h);\n handles.push(h);\n }\n\n let dragging = false;\n let detached = false;\n\n /** Últimos valores aplicados durante el gesto (para el commit del up). */\n let patch: DesignPatch['style'] = {};\n\n const setVars = (v: { px?: number; py?: number; w?: number; h?: number }): void => {\n const host = opts.host;\n if (v.px !== undefined) host.style.setProperty('--veo-pos-x', `${v.px * 100}%`);\n if (v.py !== undefined) host.style.setProperty('--veo-pos-y', `${v.py * 100}%`);\n if (v.w !== undefined) host.style.setProperty('--veo-width', `${v.w}px`);\n if (v.h !== undefined) host.style.setProperty('--veo-min-h', `${v.h}px`);\n };\n\n /**\n * Un gesto genérico: guarda el rect inicial, traduce cada mousemove a\n * variables CSS (rAF-throttled) y al soltar emite el commit acumulado.\n */\n const startGesture = (\n e: MouseEvent,\n apply: (dx: number, dy: number, start: DOMRect) => DesignPatch['style'],\n ): void => {\n e.preventDefault();\n e.stopPropagation();\n dragging = true;\n patch = {};\n const start = card.getBoundingClientRect();\n const sx = e.clientX;\n const sy = e.clientY;\n let raf = 0;\n let lastEv: MouseEvent | null = null;\n\n const flush = (): void => {\n raf = 0;\n if (!lastEv) return;\n const next = apply(lastEv.clientX - sx, lastEv.clientY - sy, start);\n patch = { ...patch, ...next };\n setVars({\n ...(next.posX !== undefined ? { px: next.posX } : {}),\n ...(next.posY !== undefined ? { py: next.posY } : {}),\n ...(next.width !== undefined ? { w: next.width } : {}),\n ...(next.height !== undefined ? { h: next.height } : {}),\n });\n };\n\n const move = (ev: MouseEvent): void => {\n lastEv = ev;\n // rAF-throttle del feedback; fallback síncrono si el entorno no tiene rAF.\n if (typeof window.requestAnimationFrame !== 'function') flush();\n else if (!raf) raf = window.requestAnimationFrame(flush);\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n if (raf) window.cancelAnimationFrame(raf);\n flush();\n dragging = false;\n if (Object.keys(patch).length > 0 && !detached) {\n opts.onCommit({ stepIndex: opts.stepIndex, style: patch });\n }\n opts.onGestureEnd?.();\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n };\n\n /** posX para que el borde izquierdo quede en `left` con ancho `w`. */\n const posXFor = (left: number, w: number): number => {\n const span = window.innerWidth - w;\n return span <= 0 ? 0.5 : round3(clamp(left / span, 0, 1));\n };\n const posYFor = (top: number, h: number): number => {\n const span = window.innerHeight - h;\n return span <= 0 ? 0.5 : round3(clamp(top / span, 0, 1));\n };\n\n const onCardDown = (e: MouseEvent): void => {\n if (isInteractive(e.target)) return;\n if (e.target instanceof Element && e.target.closest('.veo-mnp-handle')) return;\n startGesture(e, (dx, dy, start) => ({\n posX: posXFor(start.left + dx, start.width),\n posY: posYFor(start.top + dy, start.height),\n }));\n };\n\n const onHandleDown = (e: MouseEvent): void => {\n const dir = (e.currentTarget as HTMLElement).dataset.veoDir as ResizeDir;\n startGesture(e, (dx, dy, start) => {\n const out: DesignPatch['style'] = {};\n if (dir.includes('e')) out.width = Math.round(clamp(start.width + dx, MIN_W, MAX_W));\n if (dir.includes('w')) {\n out.width = Math.round(clamp(start.width - dx, MIN_W, MAX_W));\n // El borde derecho queda fijo: la card se re-ancla donde corresponde.\n out.posX = posXFor(start.right - out.width, out.width);\n }\n if (dir.includes('s')) out.height = Math.round(clamp(start.height + dy, MIN_H, MAX_H));\n if (dir.includes('n')) {\n out.height = Math.round(clamp(start.height - dy, MIN_H, MAX_H));\n out.posY = posYFor(start.bottom - out.height, out.height);\n }\n return out;\n });\n };\n\n card.addEventListener('mousedown', onCardDown);\n for (const h of handles) h.addEventListener('mousedown', onHandleDown);\n\n return {\n isDragging: () => dragging,\n detach: () => {\n if (detached) return;\n detached = true;\n card.removeEventListener('mousedown', onCardDown);\n for (const h of handles) h.remove();\n style.remove();\n card.classList.remove('veo-mnp-card');\n delete card.dataset.veoManipulated;\n },\n };\n}\n\n// ── Banner fijo: drag vertical con snap top/bottom ──────────────────────────\n\nfunction attachBanner(\n opts: DesignManipulatorOptions,\n shadow: ShadowRoot,\n banner: HTMLElement,\n): DesignManipulatorHandle | null {\n if (banner.dataset.veoManipulated === '1') return null;\n banner.dataset.veoManipulated = '1';\n banner.classList.add('veo-mnp-banner');\n\n const doc = banner.ownerDocument;\n const style = doc.createElement('style');\n style.textContent = MANIPULATOR_CSS;\n shadow.appendChild(style);\n\n let dragging = false;\n let detached = false;\n\n const positionOf = (): 'top' | 'bottom' =>\n banner.classList.contains('veo-banner-bottom') ? 'bottom' : 'top';\n\n const onDown = (e: MouseEvent): void => {\n if (isInteractive(e.target)) return;\n e.preventDefault();\n dragging = true;\n const startPos = positionOf();\n let current = startPos;\n\n const move = (ev: MouseEvent): void => {\n // Snap: la mitad del viewport decide top/bottom, con feedback en vivo.\n const next = ev.clientY < window.innerHeight / 2 ? 'top' : 'bottom';\n if (next !== current) {\n current = next;\n banner.classList.remove('veo-banner-top', 'veo-banner-bottom');\n banner.classList.add(`veo-banner-${next}`);\n }\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n dragging = false;\n if (current !== startPos && !detached) {\n opts.onCommit({ stepIndex: opts.stepIndex, style: { position: current } });\n }\n opts.onGestureEnd?.();\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n };\n\n banner.addEventListener('mousedown', onDown);\n\n return {\n isDragging: () => dragging,\n detach: () => {\n if (detached) return;\n detached = true;\n banner.removeEventListener('mousedown', onDown);\n style.remove();\n banner.classList.remove('veo-mnp-banner');\n delete banner.dataset.veoManipulated;\n },\n };\n}\n","/**\n * Qué cuenta como \"elemento interactivo\" para el tagueo de features: los\n * controles sobre los que un usuario actúa (botones, enlaces, campos,\n * formularios, controles ARIA…). Un `div` o `span` a secas no lo es: taguear\n * eso no mide ninguna acción y además rara vez genera eventos de autocapture\n * (ver `findMeaningfulAncestor` en `autocapture/dom-listener.ts`, que sube\n * hasta el mismo tipo de elementos antes de emitir `$autocapture`).\n *\n * Lo usan el picker (modo `only: 'interactive'`: al pasar el mouse sobre un\n * `<span>` dentro de un botón se resalta el botón) y `scan-page` (inventario\n * de candidatos a feature de la página).\n */\n\nconst INTERACTIVE_ROLES = [\n 'button',\n 'link',\n 'tab',\n 'menuitem',\n 'menuitemcheckbox',\n 'menuitemradio',\n 'checkbox',\n 'radio',\n 'switch',\n 'option',\n 'combobox',\n 'textbox',\n 'searchbox',\n 'slider',\n 'spinbutton',\n];\n\n/** Selector CSS de los elementos interactivos (para `querySelectorAll`/`closest`). */\nexport const INTERACTIVE_SELECTOR = [\n 'button',\n 'a[href]',\n 'input:not([type=\"hidden\"])',\n 'select',\n 'textarea',\n 'form',\n 'summary',\n '[contenteditable=\"true\"]',\n '[onclick]',\n '[data-veo-tag]',\n ...INTERACTIVE_ROLES.map((r) => `[role=\"${r}\"]`),\n].join(', ');\n\n/** ¿El elemento es interactivo por sí mismo? */\nexport function isInteractiveElement(element: Element): boolean {\n try {\n return element.matches(INTERACTIVE_SELECTOR);\n } catch {\n return false;\n }\n}\n\n/**\n * El elemento interactivo más cercano: el propio elemento o su ancestro\n * interactivo más próximo (`<span>` dentro de `<button>` → el botón).\n * `null` si no hay ninguno (zona no interactiva de la página).\n */\nexport function closestInteractive(element: Element): Element | null {\n try {\n return element.closest(INTERACTIVE_SELECTOR);\n } catch {\n return null;\n }\n}\n\n/**\n * Emojis y pictogramas (⚙️ 👥 ✅ …) + sus acompañantes invisibles: selectores\n * de variante (U+FE0F), ZWJ (U+200D), modificadores de tono y el «combinador»\n * de teclas (U+20E3). Es lo que la gente pone como icono dentro del texto de\n * un botón o link y no forma parte del nombre de la acción.\n */\nconst EMOJI_RE = /\\p{Extended_Pictographic}|\\p{Emoji_Modifier}|\\u{FE0F}|\\u{200D}|\\u{20E3}/gu;\n\n/**\n * Texto \"humano\" de un elemento para nombrar una feature: sin emojis ni\n * iconos, con los espacios colapsados y recortado a `max`. Si el elemento no\n * tiene texto (botón de solo icono), usa `aria-label` o `title`.\n */\nexport function elementLabelText(element: Element, max = 120): string {\n const clean = (raw: string | null | undefined): string =>\n (raw ?? '').replace(EMOJI_RE, '').replace(/\\s+/g, ' ').trim();\n const text = clean(element.textContent);\n if (text) return text.slice(0, max);\n const fallback =\n clean(element.getAttribute('aria-label')) || clean(element.getAttribute('title'));\n return fallback.slice(0, max);\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';\nimport { closestInteractive, elementLabelText } from './interactive-elements';\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 /** Título del banner superior. Default en español. */\n hint?: string;\n /** Subtítulo del banner (default: cómo abrir menús con Alt + clic). */\n subhint?: string;\n /**\n * `'interactive'`: solo se pueden elegir elementos interactivos (botones,\n * enlaces, campos, formularios, controles ARIA…); al pasar sobre un hijo\n * (p. ej. el `<span>` de un botón) se resalta el control que lo contiene, y\n * sobre zonas no interactivas no se resalta ni se puede elegir nada.\n * Default: cualquier elemento (anclas de guías).\n */\n only?: 'interactive';\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: transparent;\n border: 3px dashed #b74d00;\n border-radius: 8px;\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: #2b2623;\n color: #f5efe9;\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: #ffd1ad; word-break: break-all; }\n.veo-pick-label .veo-pick-dim { color: #c9c2bb; margin-top: 3px; }\n.veo-pick-hint {\n position: fixed;\n top: 28px;\n left: 50%;\n transform: translateX(-50%);\n z-index: ${PICKER_Z};\n pointer-events: none;\n display: flex; align-items: center; gap: 16px;\n max-width: min(760px, calc(100vw - 32px));\n background: #2b2623;\n color: #fff;\n font: 15px/1.4 -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n padding: 14px 18px 14px 16px;\n border-radius: 14px;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n}\n.veo-pick-hint-icon {\n flex: 0 0 auto; width: 44px; height: 44px; border-radius: 999px;\n background: rgba(255,255,255,0.12);\n display: inline-flex; align-items: center; justify-content: center;\n}\n.veo-pick-hint-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }\n.veo-pick-hint-title { font-weight: 700; }\n.veo-pick-hint-sub { font-size: 13px; color: rgba(255,255,255,0.75); }\n.veo-pick-cancel {\n flex: 0 0 auto; pointer-events: auto;\n border: 0; border-radius: 10px; padding: 12px 18px;\n background: rgba(255,255,255,0.14); color: #fff;\n font: inherit; font-weight: 600; cursor: pointer;\n}\n.veo-pick-cancel:hover { background: rgba(255,255,255,0.24); }\n`;\n\nconst HINT_ICON =\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" ' +\n 'stroke=\"currentColor\" stroke-width=\"1.6\" aria-hidden=\"true\"><path stroke-linecap=\"round\" ' +\n 'stroke-linejoin=\"round\" d=\"M7.5 3.75H6A2.25 2.25 0 0 0 3.75 6v1.5M16.5 3.75H18A2.25 2.25 0 0 1 ' +\n '20.25 6v1.5m0 9V18A2.25 2.25 0 0 1 18 20.25h-1.5m-9 0H6A2.25 2.25 0 0 1 3.75 18v-1.5M15 12a3 3 ' +\n '0 1 1-6 0 3 3 0 0 1 6 0Z\"/></svg>';\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 only: 'interactive' | null = null;\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.only = options.only ?? null;\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 // Banner (mock 2026-09): icono · título + subtítulo · Cancelar.\n const hint = document.createElement('div');\n hint.className = 'veo-pick-hint';\n const icon = document.createElement('span');\n icon.className = 'veo-pick-hint-icon';\n icon.innerHTML = HINT_ICON;\n const text = document.createElement('div');\n text.className = 'veo-pick-hint-text';\n const title = document.createElement('span');\n title.className = 'veo-pick-hint-title';\n title.textContent = options.hint ?? 'Selecciona un elemento existente para colocar la guía.';\n const sub = document.createElement('span');\n sub.className = 'veo-pick-hint-sub';\n sub.textContent =\n options.subhint ?? 'Usa Alt + clic u Opción + clic para abrir menús y desplegables.';\n text.append(title, sub);\n const cancel = document.createElement('button');\n cancel.className = 'veo-pick-cancel';\n cancel.type = 'button';\n cancel.textContent = 'Cancelar';\n cancel.addEventListener('click', (e) => {\n e.stopPropagation();\n const cb = this.onCancel;\n this.stop();\n cb?.();\n });\n hint.append(icon, text, cancel);\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.only = null;\n this.onPick = null;\n this.onCancel = null;\n }\n\n /** Elemento que se elegiría para el nodo bajo el cursor (o null si no hay). */\n private resolveTarget(target: EventTarget | null): Element | null {\n if (!(target instanceof Element) || this.isOwn(target)) return null;\n return this.only === 'interactive' ? closestInteractive(target) : target;\n }\n\n private hideBox(): void {\n if (this.box) this.box.style.display = 'none';\n if (this.label) this.label.style.display = 'none';\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 if (!(event.target instanceof Element) || this.isOwn(event.target)) return;\n const target = this.resolveTarget(event.target);\n this.current = target;\n if (target) this.draw(target);\n else this.hideBox(); // zona no interactiva: nada que elegir\n };\n\n private onClick = (event: MouseEvent): void => {\n // Alt/Opción + clic: pasa a la app (abrir menús/desplegables) sin seleccionar.\n if (event.altKey) return;\n if (this.isOwn(event.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 target = this.current ?? this.resolveTarget(event.target);\n if (!target) return; // nada elegible bajo el cursor: el picker sigue abierto\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 (event.altKey || 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: elementLabelText(element),\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 { buildSelectorPath, filterHumanClasses } from '../autocapture/selector-builder';\nimport { isDeviceAllowed } from '../guides/activation-devices';\nimport { activationDelayMs, isAutomaticActivation } from '../guides/activation-rules';\nimport { applyBlockStyle, buildContentBlock } from '../guides/block-builder';\nimport { RAW_BLOCK_ATTR } from '../guides/code-block';\nimport { closeGuidePreview, previewGuide } from '../guides/guide-preview';\nimport { groupLayout } from '../guides/layout';\nimport { GUIDE_STYLES } from '../guides/styles';\nimport type { CompositeStep, StepBlock } from '../guides/types';\nimport { stepMatchesPage } from '../guides/url-match';\nimport { attachBlockDropTarget, type BlockDropTargetHandle } from './block-drop-target';\nimport {\n type BlockLayoutAction,\n type BlockToolbarAction,\n type BuilderCommand,\n type BuilderEvent,\n type CardToolbarAction,\n type ConfirmationCard,\n type EditorChromeState,\n type PageElement,\n type PageScan,\n type PreviewStatus,\n type RowToolbarAction,\n VEO_BUILDER_SOURCE,\n} from './bridge-protocol';\nimport { type BuilderChromeHandle, injectBuilderChrome } from './builder-chrome';\nimport { type BuilderPanelHandle, injectBuilderPanel } from './builder-panel';\nimport { attachDesignManipulator, type DesignManipulatorHandle } from './design-manipulator';\nimport { type ElementPickerHandle, startElementPicker } from './element-picker';\nimport { elementLabelText, INTERACTIVE_SELECTOR } from './interactive-elements';\n\nexport interface BuilderModeHandle {\n /** Desconecta el puente y limpia picker/preview/panel. */\n teardown(): void;\n}\n\n/** Selección del bloque code crudo (ver `attachRawBlock`). */\ninterface RawBlockHandle {\n /** Resalta el bloque si `id` es el suyo; con otro id (o null) lo oculta. */\n select(id: string | null): void;\n detach(): 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 */\n/** Estilos del modal de confirmación (shadow DOM, tokens OnUser: coral #b74d00, success #e6f6df/#406a31). */\nconst CONFIRMATION_STYLES = `\n:host { all: initial; }\n.veo-confirm-backdrop {\n position: fixed; inset: 0; z-index: 2147483645;\n background: rgba(20, 16, 14, 0.45);\n}\n.veo-confirm {\n position: fixed; left: 50%; top: 50%; transform: translate(-50%, -50%);\n z-index: 2147483646; box-sizing: border-box;\n width: min(432px, calc(100vw - 32px)); padding: 28px 24px 24px;\n border-radius: 16px; background: #fff; color: #1d1917;\n box-shadow: 0 24px 64px rgba(0,0,0,0.28);\n font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif;\n text-align: center;\n}\n.veo-confirm-check {\n width: 64px; height: 64px; margin: 0 auto; border-radius: 50%;\n background: #e6f6df; color: #2f9a4e; display: flex; align-items: center; justify-content: center;\n}\n.veo-confirm-check svg { width: 30px; height: 30px; }\n.veo-confirm-title { margin: 18px 0 0; font-size: 17px; font-weight: 600; }\n.veo-confirm-msg { margin: 8px 0 0; font-size: 13px; color: #6b6461; }\n.veo-confirm-rows {\n margin: 18px 0 0; padding: 12px 14px; border-radius: 12px; background: #f6f2ef; text-align: left;\n}\n.veo-confirm-row { display: flex; justify-content: space-between; gap: 16px; font-size: 13px; padding: 4px 0; }\n.veo-confirm-row dt { color: #6b6461; margin: 0; }\n.veo-confirm-row dd { margin: 0; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.veo-confirm-btn {\n display: block; width: 100%; margin-top: 18px; height: 44px; border: 0; border-radius: 10px;\n background: #b74d00; color: #fff; font: inherit; font-size: 15px; font-weight: 600; cursor: pointer;\n}\n.veo-confirm-btn:hover { background: #953c00; }\n.veo-confirm-btn:focus-visible { outline: 3px solid rgba(183,77,0,0.35); outline-offset: 2px; }\n`;\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 /** Barras del editor (topbar + pasos) sobre la app; solo en modo panel. */\n let chrome: BuilderChromeHandle | null = null;\n let staticTarget: Window | null = null;\n let manipulator: DesignManipulatorHandle | null = null;\n let dropTarget: BlockDropTargetHandle | null = null;\n /** Detach del listener de clic simple sobre la tarjeta (→ «Agregar bloque»). */\n let cardClick: (() => void) | null = null;\n /** Selección del bloque code CRUDO (inline de un solo bloque code, sin tarjeta). */\n let rawBlock: RawBlockHandle | null = null;\n /** Bloque seleccionado en la app (id local del panel); sobrevive a los re-renders. */\n let selectedBlockId: string | 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 /** Modo vista previa (ojo de la topbar): guía sin editor ni barras. */\n let previewMode = false;\n /** Disparador por elemento objetivo armado para la preview (click/hover). */\n let previewTrigger: (() => void) | null = null;\n /** Ya se disparó: las siguientes previews se pintan directo hasta que se cierre. */\n let previewFired = false;\n /** «Retrasar la aparición» en curso para la preview (timer de delayMs). */\n let previewDelay: ReturnType<typeof setTimeout> | null = null;\n /**\n * El autor cerró la guía con ✕. Con Automático + Elemento objetivo la guía ya\n * arrancó sola; tras cerrarla debe esperar la interacción con el elemento\n * (como el runtime), no repintarse al instante.\n */\n let previewDismissed = false;\n /** Si la tarjeta estaba visible al entrar en vista previa (se restaura al salir). */\n let panelWasVisible = true;\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 previewStep = (\n cmd: Extract<BuilderCommand, { type: 'preview' }>,\n ): CompositeStep | undefined => {\n const steps = cmd.guide.guideSteps as unknown as CompositeStep[] | undefined;\n return steps?.[cmd.guide.startStepIndex ?? 0];\n };\n const previewMatchesPage = (cmd: Extract<BuilderCommand, { type: 'preview' }>): boolean =>\n stepMatchesPage(previewStep(cmd)?.pageLocation, window.location.href);\n\n const postPreviewStatus = (payload: PreviewStatus): void =>\n post({ type: 'preview-status', payload });\n\n const detachPreviewTools = (): void => {\n manipulator?.detach();\n manipulator = null;\n dropTarget?.detach();\n dropTarget = null;\n cardClick?.();\n cardClick = null;\n rowHover?.();\n rowHover = null;\n hoverRowId = null;\n hoverCard = false;\n rawBlock?.detach();\n rawBlock = null;\n // Sin herramientas no hay preview «editable» pintada: el próximo comando\n // igual no debe parchearse en el lugar (saltaría el enganche de clics,\n // marcos y hover, p. ej. al salir de vista previa). Se repinta completo.\n shownPreview = null;\n };\n\n const withholdPreview = (): void => {\n detachPreviewTools();\n shownPreview = null;\n closeGuidePreview();\n };\n\n /**\n * Marco de selección: aire alrededor del bloque (el «tamaño por defecto» al\n * seleccionar) y hueco de la barra. Sin alto mínimo: un marco más alto que\n * el bloque se montaba sobre los bloques vecinos.\n */\n /** Aire del marco alrededor del bloque (los bloques ya no llevan padding propio). */\n const FRAME_PAD = 4;\n const FRAME_MIN_H = 0;\n const TOOLBAR_H = 30;\n\n const ICON = {\n pencil:\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125\"/></svg>',\n copy: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M16.5 8.25V6a2.25 2.25 0 0 0-2.25-2.25H6A2.25 2.25 0 0 0 3.75 6v8.25A2.25 2.25 0 0 0 6 16.5h2.25m8.25-8.25H18a2.25 2.25 0 0 1 2.25 2.25V18A2.25 2.25 0 0 1 18 20.25h-7.5A2.25 2.25 0 0 1 8.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 0 0-2.25 2.25v6\"/></svg>',\n trash:\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0\"/></svg>',\n };\n const ICON_MOVE = {\n left: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19.5 12h-15m0 0 6.75 6.75M4.5 12l6.75-6.75\"/></svg>',\n right:\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4.5 12h15m0 0-6.75-6.75M19.5 12l-6.75 6.75\"/></svg>',\n };\n\n /**\n * Qué movimientos admite un bloque DENTRO de su fila (espejo de\n * `moveBlockByLayout` del panel): izquierda/derecha si la fila tiene una\n * columna a ese lado.\n */\n const moveAbility = (blocks: StepBlock[], blockId: string): { left: boolean; right: boolean } => {\n for (const row of groupLayout(blocks)) {\n for (let c = 0; c < row.columns.length; c++) {\n const col = row.columns[c] as (typeof row.columns)[number];\n if (!col.blocks.some((b) => b.block.editorId === blockId)) continue;\n return { left: c > 0, right: c < row.columns.length - 1 };\n }\n }\n return { left: false, right: false };\n };\n\n /** Bloques del paso mostrado (preview), para calcular disponibilidad de mover. */\n let previewBlocks: StepBlock[] = [];\n /**\n * Editor de fila. Una fila no tiene id propio: se identifica por el `editorId`\n * de su PRIMER bloque. `hoverRowId` = fila bajo el mouse; `selectedRowId` = la\n * que el panel está editando (`select-row`). El marco/barra de fila se pinta\n * para la fila editada, si no la del bloque seleccionado, si no la del hover.\n */\n let hoverRowId: string | null = null;\n let selectedRowId: string | null = null;\n let rowHover: (() => void) | null = null;\n /** Hover sobre el contenedor (tarjeta): contorno + pestañas «Editar contenedor / filas». */\n let hoverCard = false;\n /** Sección que muestra el panel (del último `editor-state`): marca la pestaña activa. */\n let panelSection: EditorChromeState['section'] | null = null;\n /** Comando cuya preview está pintada ahora (base del parche en el lugar). */\n let shownPreview: Extract<BuilderCommand, { type: 'preview' }> | null = null;\n\n /** Firma estructural de un paso: todo salvo texto/html/estilo de cada bloque. */\n const structureOf = (step: CompositeStep | undefined): string => {\n if (!step) return '';\n const { blocks, ...rest } = step;\n return JSON.stringify({\n rest,\n blocks: (blocks ?? []).map((b) => {\n const { text: _t, html: _h, style: _s, ...keep } = b as StepBlock;\n return keep;\n }),\n });\n };\n\n /**\n * Parche en el lugar (edición): si el paso mostrado tiene la MISMA estructura\n * que el nuevo (bloques, layout, diseño del contenedor, acciones), solo se\n * reconstruyen los nodos de los bloques cuyo texto/html/estilo cambió. Así\n * escribir no repinta (ni hace parpadear) toda la tarjeta. Devuelve false si\n * hay que repintar entera.\n */\n const tryPatchPreview = (cmd: Extract<BuilderCommand, { type: 'preview' }>): boolean => {\n const prev = shownPreview;\n if (!prev || cmd.guide.guideType !== 'composite' || prev.guide.guideType !== 'composite') {\n return false;\n }\n const idx = cmd.guide.startStepIndex ?? 0;\n if ((prev.guide.startStepIndex ?? 0) !== idx) return false;\n // Lo que no es el paso (activación, badge abierto, etc.) también debe ser igual.\n const guideSig = (g: typeof cmd.guide): string =>\n JSON.stringify({ ...g, guideSteps: undefined });\n if (guideSig(prev.guide) !== guideSig(cmd.guide) || prev.editable !== cmd.editable)\n return false;\n const host = document.querySelector<HTMLElement>('[data-veo-guide]');\n const card = host ? previewCard(host) : null;\n if (!host || !card) return false;\n const prevStep = (prev.guide.guideSteps as unknown as CompositeStep[])[idx];\n const nextStep = (cmd.guide.guideSteps as unknown as CompositeStep[])[idx];\n if (!prevStep || !nextStep) return false;\n if (structureOf(prevStep) !== structureOf(nextStep)) return false;\n const doc = card.ownerDocument;\n const prevBlocks = prevStep.blocks ?? [];\n const nextBlocks = nextStep.blocks ?? [];\n for (let i = 0; i < nextBlocks.length; i++) {\n const a = prevBlocks[i] as StepBlock;\n const b = nextBlocks[i] as StepBlock;\n if (\n a.text === b.text &&\n a.html === b.html &&\n JSON.stringify(a.style) === JSON.stringify(b.style)\n ) {\n continue;\n }\n if (!b.editorId) return false;\n const node = card.querySelector<HTMLElement>(`[data-veo-block-id=\"${b.editorId}\"]`);\n if (!node) return false;\n if (b.type === 'button') {\n // Texto, preset y estilos; la acción no cambió (está en la estructura).\n node.textContent = b.text?.trim() || 'OK';\n node.removeAttribute('style');\n node.classList.remove('veo-guide-cta--secondary', 'veo-guide-cta--link');\n const st = (b.style ?? {}) as Record<string, unknown>;\n if (st.preset === 'secondary' || st.preset === 'link') {\n node.classList.add(`veo-guide-cta--${st.preset}`);\n }\n if (typeof st.ariaLabel === 'string' && st.ariaLabel.trim()) {\n node.setAttribute('aria-label', st.ariaLabel.trim());\n } else node.removeAttribute('aria-label');\n applyBlockStyle(node, b.style, 'button');\n continue;\n }\n if (b.type === 'code' || b.type === 'form') return false;\n const fresh =\n buildContentBlock(b, doc, { editing: true }) ??\n (() => {\n const el = doc.createElement('div');\n el.className = 'veo-block-placeholder';\n el.textContent =\n b.type === 'image'\n ? 'Imagen (sin URL)'\n : b.type === 'video'\n ? 'Video (elige proveedor y pega la URL)'\n : 'Bloque vacío';\n return el;\n })();\n fresh.dataset.veoBlock = node.dataset.veoBlock ?? String(i);\n fresh.dataset.veoBlockId = b.editorId;\n node.replaceWith(fresh);\n }\n shownPreview = cmd;\n previewBlocks = nextBlocks;\n // La geometría pudo cambiar (más/menos texto): marco, barra y huecos.\n applyBlockHighlight(host, idx);\n renderGapZones(host, idx, nextBlocks);\n return true;\n };\n\n /** Card de la preview activa (shadow root del host). */\n const previewCard = (host: HTMLElement): HTMLElement | null =>\n host.shadowRoot?.querySelector<HTMLElement>('.veo-card') ?? null;\n\n /** Quita el resaltado y la barra del bloque seleccionado (sin tocar el estado). */\n const clearBlockHighlight = (host: HTMLElement): void => {\n const card = previewCard(host);\n if (!card) return;\n for (const el of card.querySelectorAll('.veo-block--selected')) {\n el.classList.remove('veo-block--selected');\n }\n card.querySelector('.veo-block-toolbar')?.remove();\n card.querySelector('.veo-block-frame')?.remove();\n };\n\n /**\n * Resalta el bloque `selectedBlockId` en la preview y le cuelga la barra\n * (editar / duplicar / eliminar) sobre su borde superior derecho. Se llama\n * al seleccionar y tras cada re-render (cada edición repinta la card).\n */\n const applyBlockHighlight = (host: HTMLElement, stepIndex: number): void => {\n clearBlockHighlight(host);\n const card = previewCard(host);\n if (!card) return;\n const el = selectedBlockId\n ? card.querySelector<HTMLElement>(`[data-veo-block-id=\"${selectedBlockId}\"]`)\n : null;\n if (!el || !selectedBlockId) {\n renderRowChrome(host, stepIndex);\n return;\n }\n el.classList.add('veo-block--selected');\n const doc = card.ownerDocument;\n // Marco de selección: rodea al bloque con aire (FRAME_PAD) y tiene un alto\n // cómodo por defecto (FRAME_MIN_H) para que los controles no se pisen con\n // bloques de una línea. Es solo visual: NO cambia el tamaño del bloque.\n // El marco lleva aire alrededor del bloque y se recorta a la caja de su\n // contenedor (columna o contenido de la card), nunca más allá.\n const cs = getComputedStyle(card);\n const padL = Number.parseFloat(cs.paddingLeft) || 0;\n const padT = Number.parseFloat(cs.paddingTop) || 0;\n const padR = Number.parseFloat(cs.paddingRight) || 0;\n const padB = Number.parseFloat(cs.paddingBottom) || 0;\n const parent = el.parentElement;\n const inCol = parent?.classList.contains('veo-col') ? parent : null;\n const boxL = inCol ? inCol.offsetLeft : padL;\n const boxR = inCol ? inCol.offsetLeft + inCol.offsetWidth : card.clientWidth - padR;\n const boxT = padT;\n const boxB = card.clientHeight - padB;\n // La separación entre bloques/filas (BLOCK_GAP en el CSS) deja lugar para\n // el aire del marco Y la línea «+» del hueco sin que se pisen.\n const fx = Math.max(boxL, el.offsetLeft - FRAME_PAD);\n const fr = Math.min(boxR, el.offsetLeft + el.offsetWidth + FRAME_PAD);\n const fw = Math.max(0, fr - fx);\n const fy = Math.max(boxT, el.offsetTop - FRAME_PAD);\n const fb = Math.min(boxB, el.offsetTop + el.offsetHeight + FRAME_PAD);\n const fh = Math.max(FRAME_MIN_H, fb - fy);\n const frame = doc.createElement('div');\n frame.className = 'veo-block-frame';\n frame.setAttribute('data-veo-builder-chrome', '');\n frame.style.left = `${fx}px`;\n frame.style.top = `${fy}px`;\n frame.style.width = `${fw}px`;\n frame.style.height = `${fh}px`;\n card.appendChild(frame);\n const bar = doc.createElement('div');\n bar.className = 'veo-block-toolbar';\n bar.setAttribute('data-veo-builder-chrome', '');\n const blockId = selectedBlockId;\n const mk = (action: BlockToolbarAction, label: string, icon: string, enabled = true): void => {\n const b = doc.createElement('button');\n b.type = 'button';\n b.title = label;\n b.setAttribute('aria-label', label);\n b.className = `veo-block-toolbar-${action}`;\n b.innerHTML = icon;\n b.disabled = !enabled;\n b.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'block-action', payload: { stepIndex, blockId, action } });\n });\n bar.appendChild(b);\n };\n const can = moveAbility(previewBlocks, blockId);\n mk('edit', 'Editar', ICON.pencil);\n mk('duplicate', 'Duplicar', ICON.copy);\n mk('remove', 'Eliminar', ICON.trash);\n // Sin «Subir/Bajar»: la barra solo mueve entre columnas (mock).\n mk('move-left', 'Mover a la izquierda', ICON_MOVE.left, can.left);\n mk('move-right', 'Mover a la derecha', ICON_MOVE.right, can.right);\n // Barra: justo encima del BLOQUE seleccionado, alineada a su borde derecho\n // (esquina superior derecha del bloque). Se mide su alto real una vez en\n // el DOM para pegarla al marco.\n bar.style.right = `${Math.max(0, card.clientWidth - fr)}px`;\n card.appendChild(bar);\n const barH = bar.offsetHeight || TOOLBAR_H;\n // Posición preferida: encima del bloque; alternativa: debajo (si choca con\n // las pestañas del contenedor). Las guarda para `resolveToolbarOverlaps`.\n bar.dataset.veoTopAbove = String(fy - barH - 6);\n bar.dataset.veoTopBelow = String(fb + 6);\n bar.style.top = bar.dataset.veoTopAbove;\n // La fila del bloque seleccionado también muestra su marco y su barra.\n renderRowChrome(host, stepIndex);\n };\n\n /** Rect (coordenadas de la card) de un elemento de chrome posicionado. */\n const chromeRect = (el: HTMLElement) => ({\n left: el.offsetLeft,\n top: el.offsetTop,\n right: el.offsetLeft + el.offsetWidth,\n bottom: el.offsetTop + el.offsetHeight,\n });\n const intersects = (\n a: ReturnType<typeof chromeRect>,\n b: ReturnType<typeof chromeRect>,\n ): boolean => a.left < b.right && b.left < a.right && a.top < b.bottom && b.top < a.bottom;\n\n /**\n * Las tres barras (contenedor, bloque, fila) nunca se tapan entre sí:\n * 1. la del bloque va encima del bloque; si choca con las pestañas del\n * contenedor, pasa debajo del bloque;\n * 2. la de la fila va abajo a la derecha de la fila; si choca con la del\n * bloque, se corre a la izquierda de la fila; si aún choca, se apila\n * debajo de la barra del bloque.\n * Se llama cada vez que se pinta cualquiera de las tres.\n */\n const resolveToolbarOverlaps = (card: HTMLElement): void => {\n const cardBar = card.querySelector<HTMLElement>('.veo-card-toolbar');\n const blockBar = card.querySelector<HTMLElement>('.veo-block-toolbar');\n const rowBar = card.querySelector<HTMLElement>('.veo-row-toolbar');\n if (blockBar?.dataset.veoTopAbove) {\n blockBar.style.top = `${blockBar.dataset.veoTopAbove}px`;\n if (cardBar && intersects(chromeRect(blockBar), chromeRect(cardBar))) {\n blockBar.style.top = `${blockBar.dataset.veoTopBelow}px`;\n }\n }\n if (rowBar?.dataset.veoRight) {\n rowBar.style.left = '';\n rowBar.style.right = `${rowBar.dataset.veoRight}px`;\n rowBar.style.top = `${rowBar.dataset.veoTopBelow}px`;\n const others = [cardBar, blockBar].filter((b): b is HTMLElement => !!b);\n const clashes = () => others.some((o) => intersects(chromeRect(rowBar), chromeRect(o)));\n if (clashes()) {\n rowBar.style.right = '';\n rowBar.style.left = `${rowBar.dataset.veoLeft}px`;\n }\n if (clashes() && blockBar) {\n // Último recurso: apilada justo debajo de la barra del bloque (misma\n // alineación derecha). Una debajo de la otra no se cruzan nunca.\n rowBar.style.left = '';\n rowBar.style.right = `${rowBar.dataset.veoRight}px`;\n rowBar.style.top = `${chromeRect(blockBar).bottom + 6}px`;\n }\n }\n };\n\n /** Rect de un elemento relativo a la card (offsetParent = card, que es relative). */\n const rectOf = (el: HTMLElement) => ({\n left: el.offsetLeft,\n top: el.offsetTop,\n right: el.offsetLeft + el.offsetWidth,\n bottom: el.offsetTop + el.offsetHeight,\n });\n type Rect = ReturnType<typeof rectOf>;\n const union = (rs: Rect[]): Rect | null =>\n rs.length === 0\n ? null\n : rs.reduce((acc, r) => ({\n left: Math.min(acc.left, r.left),\n top: Math.min(acc.top, r.top),\n right: Math.max(acc.right, r.right),\n bottom: Math.max(acc.bottom, r.bottom),\n }));\n\n /**\n * Huecos «+» (mock): al pasar el mouse por el espacio ENTRE elementos aparece\n * una línea azul con un «+»:\n * - horizontal a lo ancho del contenido, entre filas (o arriba/abajo de\n * todas) → nueva FILA;\n * - vertical a lo alto de la fila, entre columnas (o en sus bordes) → nueva\n * COLUMNA en esa fila;\n * - horizontal a lo ancho de la columna, entre bloques apilados → nuevo\n * BLOQUE dentro de esa columna.\n * La estructura sale de `groupLayout` sobre los bloques de la preview (con\n * `editorId`) y la geometría de los nodos etiquetados.\n */\n /**\n * Geometría real de filas y columnas de la card: los bloques miden su\n * contenido, así que sale de sus contenedores (.veo-col / .veo-row) y, en\n * filas de una sola columna sin envoltorio, del ancho del contenido de la\n * card. Cada fila lleva `id` = editorId de su primer bloque (las filas no\n * tienen id propio) y su número de fila del layout.\n */\n const layoutRows = (card: HTMLElement, blocks: StepBlock[]) => {\n const elOf = (b: StepBlock): HTMLElement | null =>\n b.editorId ? card.querySelector<HTMLElement>(`[data-veo-block-id=\"${b.editorId}\"]`) : null;\n const cs = getComputedStyle(card);\n const padL = Number.parseFloat(cs.paddingLeft) || 0;\n const padR = Number.parseFloat(cs.paddingRight) || 0;\n const contentLeft = padL;\n const contentRight = card.clientWidth - padR;\n const rows = groupLayout(blocks)\n .map((row) => {\n const columns = row.columns\n .map((col) => {\n const items = col.blocks\n .map(({ block }) => ({ block, el: elOf(block) }))\n .filter(\n (x): x is { block: StepBlock; el: HTMLElement } => !!x.el && !!x.block.editorId,\n );\n const blocksRect = union(items.map((x) => rectOf(x.el)));\n if (!blocksRect) return null;\n const colEl = items[0]?.el.parentElement;\n const rect = colEl?.classList.contains('veo-col') ? rectOf(colEl) : blocksRect;\n return { items, rect };\n })\n .filter((c): c is NonNullable<typeof c> => c !== null);\n const blocksRect = union(columns.map((c) => c.rect));\n if (!blocksRect) return null;\n const rowEl = columns[0]?.items[0]?.el.parentElement?.parentElement;\n const rect = rowEl?.classList.contains('veo-row')\n ? rectOf(rowEl)\n : { ...blocksRect, left: contentLeft, right: contentRight };\n const id = columns[0]?.items[0]?.block.editorId as string;\n return { id, row: row.row, columns, rect };\n })\n .filter((r): r is NonNullable<typeof r> => r !== null);\n return { rows, content: { left: contentLeft, right: contentRight } };\n };\n\n /** Quita el marco y la barra de fila (sin tocar el estado). */\n const clearRowChrome = (card: HTMLElement): void => {\n card.querySelector('.veo-row-frame')?.remove();\n card.querySelector('.veo-row-toolbar')?.remove();\n };\n\n /**\n * Marco + barra de FILA (mock): al pasar el mouse por una fila aparece su\n * contorno y, bajo su esquina derecha, «Editar fila | duplicar». También se\n * muestra para la fila del bloque seleccionado y para la fila que el panel\n * está editando. La barra postea `row-action` con el primer bloque de la fila.\n */\n const renderRowChrome = (host: HTMLElement, stepIndex: number): void => {\n const card = previewCard(host);\n if (!card) return;\n clearRowChrome(card);\n resolveToolbarOverlaps(card);\n const { rows } = layoutRows(card, previewBlocks);\n const rowOfSelected = selectedBlockId\n ? rows.find((r) =>\n r.columns.some((c) => c.items.some((i) => i.block.editorId === selectedBlockId)),\n )\n : undefined;\n const target =\n (selectedRowId ? rows.find((r) => r.id === selectedRowId) : undefined) ??\n rowOfSelected ??\n (hoverRowId ? rows.find((r) => r.id === hoverRowId) : undefined);\n if (!target) return;\n const doc = card.ownerDocument;\n const cs = getComputedStyle(card);\n const padT = Number.parseFloat(cs.paddingTop) || 0;\n const padB = Number.parseFloat(cs.paddingBottom) || 0;\n const PAD = 6; // el marco de fila rodea al marco del bloque\n const fx = Math.max(0, target.rect.left - PAD);\n const fr = Math.min(card.clientWidth, target.rect.right + PAD);\n const fy = Math.max(Math.min(padT, target.rect.top), target.rect.top - PAD);\n const fb = Math.min(\n Math.max(card.clientHeight - padB, target.rect.bottom),\n target.rect.bottom + PAD,\n );\n const frame = doc.createElement('div');\n frame.className = 'veo-row-frame';\n frame.setAttribute('data-veo-builder-chrome', '');\n frame.style.left = `${fx}px`;\n frame.style.top = `${fy}px`;\n frame.style.width = `${Math.max(0, fr - fx)}px`;\n frame.style.height = `${Math.max(0, fb - fy)}px`;\n card.appendChild(frame);\n const bar = doc.createElement('div');\n bar.className = 'veo-row-toolbar';\n bar.setAttribute('data-veo-builder-chrome', '');\n const blockId = target.id;\n const mk = (action: RowToolbarAction, label: string, icon: string, text?: string): void => {\n const b = doc.createElement('button');\n b.type = 'button';\n b.title = label;\n b.setAttribute('aria-label', label);\n b.className = `veo-row-toolbar-${action}`;\n b.innerHTML = icon;\n if (text) b.append(text);\n b.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'row-action', payload: { stepIndex, blockId, action } });\n });\n bar.appendChild(b);\n };\n mk('edit', 'Editar fila', ICON.pencil, 'Editar fila');\n mk('duplicate', 'Duplicar fila', ICON.copy);\n mk('remove', 'Eliminar fila', ICON.trash);\n card.appendChild(bar);\n // Posición preferida: abajo a la derecha de la fila. Alternativas (si choca\n // con otra barra): a la izquierda, y si no, apilada bajo la barra del bloque.\n bar.dataset.veoRight = String(Math.max(0, card.clientWidth - fr));\n bar.dataset.veoLeft = String(fx);\n bar.dataset.veoTopBelow = String(fb + 6);\n resolveToolbarOverlaps(card);\n };\n\n /**\n * Contorno + pestañas del CONTENEDOR (mock): al pasar el mouse por la tarjeta\n * se marca su borde y aparecen, centradas sobre el borde superior, «Editar\n * contenedor» (abre el paso en el panel) y «Editar filas» (abre la\n * estructura de filas y bloques). Postean `card-action`.\n */\n const renderCardChrome = (host: HTMLElement, stepIndex: number): void => {\n const card = previewCard(host);\n if (!card) return;\n card.querySelector('.veo-card-frame')?.remove();\n card.querySelector('.veo-card-toolbar')?.remove();\n if (!hoverCard) {\n resolveToolbarOverlaps(card);\n return;\n }\n const doc = card.ownerDocument;\n const frame = doc.createElement('div');\n frame.className = 'veo-card-frame';\n frame.setAttribute('data-veo-builder-chrome', '');\n card.appendChild(frame);\n const bar = doc.createElement('div');\n bar.className = 'veo-card-toolbar';\n bar.setAttribute('data-veo-builder-chrome', '');\n const mk = (action: CardToolbarAction, label: string, active: boolean): void => {\n const b = doc.createElement('button');\n b.type = 'button';\n b.className = `veo-card-toolbar-${action}${active ? ' is-active' : ''}`;\n b.setAttribute('aria-pressed', active ? 'true' : 'false');\n b.textContent = label;\n b.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'card-action', payload: { stepIndex, action } });\n });\n bar.appendChild(b);\n };\n mk('edit-container', 'Editar contenedor', panelSection === 'step');\n mk('edit-rows', 'Editar filas', panelSection === 'structure');\n card.appendChild(bar);\n // A caballo del borde superior de la tarjeta (mitad afuera, mitad adentro).\n bar.style.top = `${-Math.round((bar.offsetHeight || 34) / 2)}px`;\n resolveToolbarOverlaps(card);\n };\n\n /**\n * Hover de filas: al mover el mouse sobre la card se calcula qué fila está\n * debajo (geometría de `layoutRows`) y se pinta su marco/barra. Salir de la\n * card (o de todas las filas) lo quita; pasar a la barra de la fila lo\n * conserva. Una fila seleccionada/editada tiene prioridad (ver renderRowChrome).\n */\n const attachRowHover = (host: HTMLElement, stepIndex: number): (() => void) => {\n const onMove = (e: MouseEvent): void => {\n const card = previewCard(host);\n if (!card) return;\n // Contenedor: el puntero está sobre la tarjeta o sobre sus pestañas.\n const overCard = e\n .composedPath()\n .some(\n (n) =>\n n instanceof Element &&\n (n.classList.contains('veo-card') || n.classList.contains('veo-card-toolbar')),\n );\n if (overCard !== hoverCard) {\n hoverCard = overCard;\n renderCardChrome(host, stepIndex);\n }\n if (\n e\n .composedPath()\n .some((n) => n instanceof Element && n.classList.contains('veo-row-toolbar'))\n ) {\n return; // sobre la barra de la fila: se mantiene\n }\n const rect = card.getBoundingClientRect();\n const x = e.clientX - rect.left - card.clientLeft;\n const y = e.clientY - rect.top - card.clientTop;\n // Camino hacia la barra: la barra cuelga 6px bajo la fila y puede tapar\n // la fila siguiente. Mientras el puntero esté en la franja que va del\n // borde de la fila a la barra (con aire), se conserva la fila actual.\n const bar = card.querySelector<HTMLElement>('.veo-row-toolbar');\n if (bar) {\n const AIR = 10;\n if (\n x >= bar.offsetLeft - AIR &&\n x <= bar.offsetLeft + bar.offsetWidth + AIR &&\n y >= bar.offsetTop - 14 &&\n y <= bar.offsetTop + bar.offsetHeight + AIR\n ) {\n return;\n }\n }\n const TOL = 6;\n const hit = layoutRows(card, previewBlocks).rows.find(\n (r) =>\n x >= r.rect.left - TOL &&\n x <= r.rect.right + TOL &&\n y >= r.rect.top - TOL &&\n y <= r.rect.bottom + TOL,\n );\n const next = hit?.id ?? null;\n if (next === hoverRowId) return;\n hoverRowId = next;\n renderRowChrome(host, stepIndex);\n };\n const onLeave = (): void => {\n if (hoverCard) {\n hoverCard = false;\n renderCardChrome(host, stepIndex);\n }\n if (hoverRowId === null) return;\n hoverRowId = null;\n renderRowChrome(host, stepIndex);\n };\n host.addEventListener('mousemove', onMove);\n host.addEventListener('mouseleave', onLeave);\n return () => {\n host.removeEventListener('mousemove', onMove);\n host.removeEventListener('mouseleave', onLeave);\n };\n };\n\n const renderGapZones = (host: HTMLElement, stepIndex: number, blocks: StepBlock[]): void => {\n const card = previewCard(host);\n if (!card) return;\n for (const z of card.querySelectorAll('.veo-gap')) z.remove();\n const doc = card.ownerDocument;\n const GAP = 18; // grosor de la zona de hover\n const EDGE = 4; // separación de las líneas de borde respecto al contenido\n\n const zone = (\n kind: 'h' | 'v',\n x: number,\n y: number,\n w: number,\n h: number,\n label: string,\n blockId: string,\n action: BlockLayoutAction,\n ): void => {\n const z = doc.createElement('div');\n z.className = `veo-gap veo-gap--${kind}`;\n z.setAttribute('data-veo-builder-chrome', '');\n z.dataset.veoGapAction = action;\n z.style.left = `${x}px`;\n z.style.top = `${y}px`;\n z.style.width = `${Math.max(w, GAP)}px`;\n z.style.height = `${Math.max(h, GAP)}px`;\n const line = doc.createElement('i');\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.title = label;\n btn.setAttribute('aria-label', label);\n btn.textContent = '+';\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'block-layout', payload: { stepIndex, blockId, action } });\n });\n z.append(line, btn);\n card.appendChild(z);\n };\n\n const { rows, content } = layoutRows(card, blocks);\n if (rows.length === 0) return;\n const cw = content.right - content.left;\n\n // Filas: arriba de la primera, entre filas, debajo de la última.\n rows.forEach((row, k) => {\n const first = row.columns[0]?.items[0]?.block.editorId as string;\n if (k === 0) {\n zone(\n 'h',\n content.left,\n row.rect.top - EDGE - GAP,\n cw,\n GAP,\n 'Agregar fila',\n first,\n 'row-before',\n );\n } else {\n const prev = rows[k - 1] as (typeof rows)[number];\n const y = (prev.rect.bottom + row.rect.top) / 2 - GAP / 2;\n zone('h', content.left, y, cw, GAP, 'Agregar fila', first, 'row-before');\n }\n if (k === rows.length - 1) {\n zone(\n 'h',\n content.left,\n row.rect.bottom + EDGE,\n cw,\n GAP,\n 'Agregar fila',\n first,\n 'row-after',\n );\n }\n });\n\n // Columnas: borde izquierdo, entre columnas, borde derecho (por fila).\n for (const row of rows) {\n const rh = row.rect.bottom - row.rect.top;\n row.columns.forEach((col, j) => {\n const id = col.items[0]?.block.editorId as string;\n if (j === 0) {\n zone(\n 'v',\n row.rect.left - EDGE - GAP,\n row.rect.top,\n GAP,\n rh,\n 'Agregar columna',\n id,\n 'col-before',\n );\n } else {\n const prev = row.columns[j - 1] as (typeof row.columns)[number];\n const x = (prev.rect.right + col.rect.left) / 2 - GAP / 2;\n zone('v', x, row.rect.top, GAP, rh, 'Agregar columna', id, 'col-before');\n }\n if (j === row.columns.length - 1) {\n zone(\n 'v',\n row.rect.right + EDGE,\n row.rect.top,\n GAP,\n rh,\n 'Agregar columna',\n id,\n 'col-after',\n );\n }\n });\n }\n\n // Bloques apilados dentro de una columna: entre bloques; y debajo del último\n // si la columna es más baja que su fila (hay hueco para apilar).\n for (const row of rows) {\n for (const col of row.columns) {\n const w = col.rect.right - col.rect.left;\n col.items.forEach((it, i) => {\n const next = col.items[i + 1];\n if (next) {\n const a = rectOf(it.el);\n const b = rectOf(next.el);\n const y = (a.bottom + b.top) / 2 - GAP / 2;\n zone(\n 'h',\n col.rect.left,\n y,\n w,\n GAP,\n 'Agregar bloque',\n it.block.editorId as string,\n 'stack-after',\n );\n } else if (row.columns.length > 1 && col.rect.bottom < row.rect.bottom - GAP) {\n zone(\n 'h',\n col.rect.left,\n col.rect.bottom + EDGE,\n w,\n GAP,\n 'Agregar bloque',\n it.block.editorId as string,\n 'stack-after',\n );\n }\n });\n }\n }\n };\n\n /**\n * Clics sobre la preview (modo edición). Se captura en el host para ganar a\n * los listeners de los bloques (un botón de la guía NO ejecuta su acción al\n * editarlo). Un arrastre (manipulador) también termina en `click` y se\n * descarta por distancia.\n * - sobre un bloque → se selecciona y el panel abre su editor;\n * - sobre la tarjeta (fuera de bloques) → se deselecciona y el panel abre\n * «Agregar bloque».\n */\n const attachCardClick = (host: HTMLElement, stepIndex: number): (() => void) => {\n let downAt: { x: number; y: number } | null = null;\n const onDown = (e: MouseEvent): void => {\n downAt = { x: e.clientX, y: e.clientY };\n };\n const onClick = (e: MouseEvent): void => {\n const path = e.composedPath();\n if (\n path.some(\n (n) =>\n n instanceof Element &&\n (n.classList.contains('veo-block-toolbar') ||\n n.classList.contains('veo-row-toolbar') ||\n n.classList.contains('veo-card-toolbar') ||\n n.classList.contains('veo-gap')),\n )\n ) {\n return; // las barras y los huecos «+» manejan sus propios clics\n }\n const inCard = path.some((n) => n instanceof Element && n.classList.contains('veo-card'));\n if (!inCard) return;\n if (downAt && Math.hypot(e.clientX - downAt.x, e.clientY - downAt.y) > 4) return;\n const blockEl = path.find(\n (n): n is HTMLElement => n instanceof HTMLElement && !!n.dataset.veoBlockId,\n );\n if (blockEl) {\n // Botones/enlaces del bloque no ejecutan su acción mientras se edita.\n if (path.some((n) => n instanceof Element && n.matches('button, a'))) {\n e.preventDefault();\n e.stopPropagation();\n }\n selectedBlockId = blockEl.dataset.veoBlockId ?? null;\n applyBlockHighlight(host, stepIndex);\n if (selectedBlockId) {\n post({ type: 'block-clicked', payload: { stepIndex, blockId: selectedBlockId } });\n }\n return;\n }\n const interactive = path.some(\n (n) =>\n n instanceof Element &&\n n.matches('button, a, input, textarea, select, label, [contenteditable]'),\n );\n if (interactive) return;\n selectedBlockId = null;\n clearBlockHighlight(host);\n renderRowChrome(host, stepIndex);\n post({ type: 'card-clicked', payload: { stepIndex } });\n };\n host.addEventListener('mousedown', onDown, true);\n host.addEventListener('click', onClick, true);\n return () => {\n host.removeEventListener('mousedown', onDown, true);\n host.removeEventListener('click', onClick, true);\n };\n };\n\n /**\n * Bloque code CRUDO: una guía inline cuyo único bloque es code se inyecta tal\n * cual en el DOM real (sin host, shadow ni tarjeta) para duplicar un elemento\n * nativo. No hay `.veo-card` a la que colgarle el clic ni el marco, así que\n * el editor lo selecciona aparte: un clic sobre cualquiera de sus elementos\n * (marcados con `data-veo-raw-block`) lo resalta con un marco FIJO sobre su\n * caja real y una barra (Editar / Eliminar; duplicar y mover no aplican: es\n * el único bloque del paso). Los enlaces/botones del HTML no ejecutan su\n * acción mientras se edita, igual que en la tarjeta. Alrededor lleva los\n * mismos huecos «+» que la tarjeta (fila arriba/abajo, columna izq/der):\n * agregar un bloque convierte el paso en tarjeta normal con todo el editor.\n */\n const attachRawBlock = (stepIndex: number, blockId: string): RawBlockHandle | null => {\n const nodes = Array.from(\n document.querySelectorAll<HTMLElement>(`[${RAW_BLOCK_ATTR}=\"${blockId}\"]`),\n );\n if (nodes.length === 0) return null;\n const doc = document;\n const box = doc.createElement('div');\n box.setAttribute('data-veo-builder-chrome', '');\n box.style.cssText = 'position:fixed;left:0;top:0;width:0;height:0;z-index:2147483646;';\n box.style.display = 'none';\n const shadow = box.attachShadow({ mode: 'open' });\n const style = doc.createElement('style');\n style.textContent = GUIDE_STYLES;\n shadow.appendChild(style);\n const frame = doc.createElement('div');\n frame.className = 'veo-block-frame';\n frame.style.position = 'fixed';\n const bar = doc.createElement('div');\n bar.className = 'veo-block-toolbar';\n bar.style.position = 'fixed';\n const mk = (action: BlockToolbarAction, label: string, icon: string, enabled = true): void => {\n const b = doc.createElement('button');\n b.type = 'button';\n b.title = label;\n b.setAttribute('aria-label', label);\n b.className = `veo-block-toolbar-${action}`;\n b.innerHTML = icon;\n b.disabled = !enabled;\n b.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'block-action', payload: { stepIndex, blockId, action } });\n });\n bar.appendChild(b);\n };\n mk('edit', 'Editar', ICON.pencil);\n mk('duplicate', 'Duplicar', ICON.copy, false);\n mk('remove', 'Eliminar', ICON.trash);\n mk('move-left', 'Mover a la izquierda', ICON_MOVE.left, false);\n mk('move-right', 'Mover a la derecha', ICON_MOVE.right, false);\n frame.style.display = 'none';\n bar.style.display = 'none';\n // Huecos «+» (siempre visibles al hover, sin selección): misma geometría\n // que `renderGapZones` pero fijos sobre la caja real del bloque crudo.\n const GAP = 18;\n const EDGE = 4;\n const gap = (kind: 'h' | 'v', label: string, action: BlockLayoutAction): HTMLElement => {\n const z = doc.createElement('div');\n z.className = `veo-gap veo-gap--${kind}`;\n z.style.position = 'fixed';\n z.dataset.veoGapAction = action;\n const line = doc.createElement('i');\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.title = label;\n btn.setAttribute('aria-label', label);\n btn.textContent = '+';\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n post({ type: 'block-layout', payload: { stepIndex, blockId, action } });\n });\n z.append(line, btn);\n return z;\n };\n const gaps = {\n top: gap('h', 'Agregar fila', 'row-before'),\n bottom: gap('h', 'Agregar fila', 'row-after'),\n left: gap('v', 'Agregar columna', 'col-before'),\n right: gap('v', 'Agregar columna', 'col-after'),\n };\n shadow.append(frame, bar, gaps.top, gaps.bottom, gaps.left, gaps.right);\n doc.body.appendChild(box);\n box.style.display = '';\n\n let visible = false;\n const place = (el: HTMLElement, x: number, y: number, w: number, h: number): void => {\n el.style.left = `${x}px`;\n el.style.top = `${y}px`;\n el.style.width = `${w}px`;\n el.style.height = `${h}px`;\n };\n const reposition = (): void => {\n const live = nodes.filter((n) => n.isConnected);\n if (live.length === 0) return;\n let l = Number.POSITIVE_INFINITY;\n let t = Number.POSITIVE_INFINITY;\n let r = Number.NEGATIVE_INFINITY;\n let b = Number.NEGATIVE_INFINITY;\n for (const n of live) {\n const rc = n.getBoundingClientRect();\n if (rc.width === 0 && rc.height === 0) continue;\n l = Math.min(l, rc.left);\n t = Math.min(t, rc.top);\n r = Math.max(r, rc.right);\n b = Math.max(b, rc.bottom);\n }\n if (!Number.isFinite(l)) return;\n place(gaps.top, l, t - EDGE - GAP, r - l, GAP);\n place(gaps.bottom, l, b + EDGE, r - l, GAP);\n place(gaps.left, l - EDGE - GAP, t, GAP, b - t);\n place(gaps.right, r + EDGE, t, GAP, b - t);\n if (!visible) return;\n place(frame, l, t, r - l, b - t);\n const bh = bar.offsetHeight || TOOLBAR_H;\n const bw = bar.offsetWidth;\n bar.style.left = `${Math.max(0, r - bw)}px`;\n bar.style.top = `${Math.max(0, t - bh - 6)}px`;\n };\n const select = (id: string | null): void => {\n visible = id === blockId;\n frame.style.display = visible ? '' : 'none';\n bar.style.display = visible ? '' : 'none';\n reposition();\n };\n reposition();\n const onClick = (e: MouseEvent): void => {\n const path = e.composedPath();\n if (!nodes.some((n) => path.includes(n))) return;\n // Botones/enlaces del HTML no ejecutan su acción mientras se edita.\n if (path.some((n) => n instanceof Element && n.matches('button, a'))) {\n e.preventDefault();\n e.stopPropagation();\n }\n selectedBlockId = blockId;\n select(blockId);\n post({ type: 'block-clicked', payload: { stepIndex, blockId } });\n };\n doc.addEventListener('click', onClick, true);\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n return {\n select,\n detach: () => {\n doc.removeEventListener('click', onClick, true);\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n box.remove();\n },\n };\n };\n\n /**\n * Aplica la preview respetando el targeting de página y (con `honorTrigger`)\n * el dispositivo; si no aplica, la cierra y le cuenta al panel por qué.\n */\n const applyPreviewGated = (cmd: Extract<BuilderCommand, { type: 'preview' }>): void => {\n // «Mostrar ahora» (honorTrigger:false) es un disparo manual: cuenta como si\n // el elemento objetivo/retraso ya se hubiera cumplido. Lo que se recuerda\n // para re-aplicar (cerrar con ✕, navegar, entrar/salir de vista previa) es\n // la versión que SÍ honra la activación; si se guardara tal cual, al cerrar\n // la guía se repintaría al instante y no habría forma de quitarla.\n const showNow = !cmd.honorTrigger;\n if (showNow) {\n disarmPreviewTrigger();\n cancelPreviewDelay();\n previewFired = true;\n previewDismissed = false;\n }\n lastPreview = showNow ? { ...cmd, honorTrigger: true } : cmd;\n if (!previewMatchesPage(cmd)) {\n cancelPreviewDelay();\n withholdPreview();\n postPreviewStatus({\n state: 'page-mismatch',\n pattern: previewStep(cmd)?.pageLocation?.pattern ?? '',\n });\n return;\n }\n const devices = cmd.guide.activationRules?.devices;\n if (!showNow && previewMode && devices && !isDeviceAllowed(devices)) {\n cancelPreviewDelay();\n withholdPreview();\n postPreviewStatus({ state: 'device-mismatch', devices: devices as 'desktop' | 'mobile' });\n return;\n }\n applyPreview(lastPreview);\n };\n\n const disarmPreviewTrigger = (): void => {\n previewTrigger?.();\n previewTrigger = null;\n };\n\n const cancelPreviewDelay = (): void => {\n if (previewDelay) clearTimeout(previewDelay);\n previewDelay = null;\n };\n\n /**\n * Elemento objetivo: arma un listener delegado (click, y hover si aplica)\n * sobre `selector`; al disparar, pinta la preview. Ignora nuestros overlays.\n */\n const armPreviewTrigger = (selector: string, trigger: 'on_click' | 'on_hover'): void => {\n disarmPreviewTrigger();\n const onFire = (e: Event): void => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n if (target.closest('[data-veo-builder-chrome],[data-veo-builder-panel],[data-veo-picker]')) {\n return;\n }\n try {\n if (!target.closest(selector)) return;\n } catch {\n return;\n }\n disarmPreviewTrigger();\n previewFired = true;\n previewDismissed = false;\n if (lastPreview) applyPreviewGated(lastPreview);\n };\n document.addEventListener('click', onFire, true);\n if (trigger === 'on_hover') document.addEventListener('mouseover', onFire, true);\n previewTrigger = () => {\n document.removeEventListener('click', onFire, true);\n document.removeEventListener('mouseover', onFire, true);\n };\n postPreviewStatus({ state: 'waiting-trigger', trigger, selector });\n };\n\n /**\n * «Retrasar la aparición»: la preview espera `delayMs` como el runtime. Al\n * cumplirse se pinta y las siguientes previews (cada edición) van directo\n * hasta que el autor la cierre con ✕ — si no, cada tecla reiniciaría la espera.\n */\n const armPreviewDelay = (delayMs: number): void => {\n cancelPreviewDelay();\n previewDelay = setTimeout(() => {\n previewDelay = null;\n previewFired = true;\n if (lastPreview) applyPreviewGated(lastPreview);\n }, delayMs);\n postPreviewStatus({ state: 'waiting-delay', delayMs });\n };\n\n const applyPreview = (cmd: Extract<BuilderCommand, { type: 'preview' }>): void => {\n // Edición: si solo cambió el contenido/estilo de algún bloque (misma\n // estructura), se parchea en el lugar sin repintar la tarjeta entera ni\n // tocar los listeners (manipulador, clics, huecos).\n if (cmd.editable && !previewMode && tryPatchPreview(cmd)) {\n previewStepIndex = cmd.guide.startStepIndex ?? 0;\n return;\n }\n detachPreviewTools();\n previewStepIndex = cmd.guide.startStepIndex ?? 0;\n\n // Elemento objetivo: hasta que el autor haga clic/hover en el elemento, la\n // preview no se pinta (como en el runtime). Tras cerrarla, se re-arma.\n const rules = cmd.guide.activationRules;\n const trig = rules?.trigger;\n const sel = rules?.selector?.trim();\n // La activación (elemento objetivo, retraso, dispositivo) se respeta SOLO\n // en vista previa («como la ve el usuario»). Mientras se edita, la tarjeta\n // se pinta siempre al instante: si no, un paso nuevo no aparecía hasta\n // hacer clic en el elemento objetivo o cumplir el retraso.\n const gate = cmd.honorTrigger && !previewFired && previewMode;\n // Elemento objetivo: esperar la interacción, salvo que la guía arranque sola\n // (Automático, `autoShow`) y el autor aún no la haya cerrado. Tras cerrarla\n // con ✕, el elemento objetivo es lo que la vuelve a abrir (como el runtime).\n const waitsForTarget =\n (trig === 'on_click' || trig === 'on_hover') &&\n (!isAutomaticActivation(rules) || previewDismissed);\n if (gate && waitsForTarget && sel) {\n cancelPreviewDelay();\n closeGuidePreview();\n armPreviewTrigger(sel, trig);\n return;\n }\n const delayMs = activationDelayMs(rules);\n if (gate && delayMs > 0) {\n disarmPreviewTrigger();\n closeGuidePreview();\n // Si ya hay una espera corriendo (el autor sigue editando) no se reinicia.\n if (!previewDelay) armPreviewDelay(delayMs);\n return;\n }\n disarmPreviewTrigger();\n cancelPreviewDelay();\n const fetchProgress = previewProgressFetcher();\n const handle = previewGuide({\n ...cmd.guide,\n ...(fetchProgress ? { fetchProgress } : {}),\n onClosed: () => {\n // El autor cerró la guía con ✕.\n detachPreviewTools();\n shownPreview = null;\n previewFired = false;\n previewDismissed = true;\n // Vista previa («como la ve el usuario»): un cierre es un cierre. La\n // guía no se repinta sola; si tiene elemento objetivo, ese clic/hover\n // la vuelve a abrir (como el runtime). En modo edición también se\n // queda cerrada: la próxima edición o selección de paso la repinta.\n if (previewMode) {\n const r = lastPreview?.guide.activationRules;\n const t = r?.trigger;\n const selector = r?.selector?.trim();\n if ((t === 'on_click' || t === 'on_hover') && selector) armPreviewTrigger(selector, t);\n }\n },\n });\n if (cmd.honorTrigger) postPreviewStatus({ state: 'shown' });\n // En vista previa la guía se ve como la vería el usuario: sin drag/resize.\n if (!cmd.editable || previewMode) return;\n void handle.ready.then((result) => {\n if (!result.rendered) return;\n const host = handle.host();\n if (!host) {\n // Inline de un solo bloque code: HTML CRUDA en el DOM real, sin host ni\n // tarjeta. Se selecciona con un marco propio sobre los elementos crudos.\n const idx = cmd.guide.startStepIndex ?? 0;\n const only = (cmd.guide.guideSteps as unknown as CompositeStep[])[idx]?.blocks?.[0];\n if (only?.type === 'code' && only.editorId) {\n rawBlock = attachRawBlock(idx, only.editorId);\n rawBlock?.select(selectedBlockId);\n }\n return;\n }\n // Sin animación de entrada mientras se edita (evita el parpadeo).\n host.classList.add('veo-no-anim');\n shownPreview = cmd;\n cardClick = attachCardClick(host, cmd.guide.startStepIndex ?? 0);\n const stepBlocks =\n (cmd.guide.guideSteps as unknown as CompositeStep[])[cmd.guide.startStepIndex ?? 0]\n ?.blocks ?? [];\n previewBlocks = stepBlocks;\n applyBlockHighlight(host, cmd.guide.startStepIndex ?? 0);\n renderGapZones(host, cmd.guide.startStepIndex ?? 0, stepBlocks);\n rowHover = attachRowHover(host, cmd.guide.startStepIndex ?? 0);\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`. Con\n // `chrome: true` el panel sabe que las barras las pinta el SDK.\n post(chrome ? { type: 'ready', chrome: true } : { type: 'ready' });\n break;\n case 'editor-state':\n chrome?.setState(cmd.state);\n if (panelSection !== cmd.state.section) {\n panelSection = cmd.state.section;\n // La pestaña activa del contenedor cambia con la sección del panel.\n const h = document.querySelector<HTMLElement>('[data-veo-guide]');\n if (h && hoverCard && !previewMode) renderCardChrome(h, previewStepIndex);\n }\n panel?.setTitle(\n cmd.state.panelTitle ??\n (cmd.state.section === 'activation'\n ? 'Ajustes de activación'\n : cmd.state.section === 'badge'\n ? 'Ajustes de badge'\n : cmd.state.section === 'target'\n ? 'Ajustes del elemento objetivo'\n : cmd.state.section === 'row'\n ? 'Editar fila'\n : cmd.state.blockLabel\n ? `Editor · ${cmd.state.blockLabel}`\n : (cmd.state.steps[cmd.state.activeStep]?.label ?? 'Paso')),\n );\n break;\n case 'panel-visibility':\n panel?.setVisible(cmd.visible);\n break;\n case 'panel-size':\n panel?.setSize(cmd.size);\n break;\n case 'start-picker': {\n picker?.stop();\n // Para elegir con comodidad se esconde TODO (barras + tarjeta) mientras\n // dura el picker; vuelve como estaba al terminar (elegir o cancelar).\n const panelWasShown = panel?.isVisible() ?? false;\n if (panelWasShown) panel?.setVisible(false);\n chrome?.setHidden(true);\n // La guía en preview también estorba (tapa elementos): se cierra y se\n // re-pinta al terminar, con el mismo comando que la mostró.\n const previewToRestore = lastPreview;\n if (previewToRestore) {\n detachPreviewTools();\n closeGuidePreview();\n }\n const restorePanel = (): void => {\n chrome?.setHidden(false);\n if (panelWasShown) panel?.setVisible(true);\n if (previewToRestore && lastPreview === previewToRestore) {\n applyPreviewGated(previewToRestore);\n }\n };\n picker = startElementPicker({\n onPick: (payload) => {\n picker = null;\n restorePanel();\n post({ type: 'picked', payload });\n },\n onCancel: () => {\n picker = null;\n restorePanel();\n post({ type: 'pick-cancelled' });\n },\n ...(cmd.maxAncestors !== undefined ? { maxAncestors: cmd.maxAncestors } : {}),\n ...(cmd.hint !== undefined ? { hint: cmd.hint } : {}),\n ...(cmd.only !== undefined ? { only: cmd.only } : {}),\n });\n break;\n }\n case 'stop-picker':\n picker?.stop();\n picker = null;\n chrome?.setHidden(false);\n break;\n case 'scan-page':\n post({ type: 'page-scan', payload: scanPage(cmd.selectors) });\n break;\n case 'highlight':\n setHighlight(cmd.selector);\n break;\n case 'show-confirmation':\n showConfirmation(cmd.payload);\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 'select-block': {\n selectedBlockId = cmd.blockId;\n const h = document.querySelector<HTMLElement>('[data-veo-guide]');\n if (h && !previewMode) applyBlockHighlight(h, previewStepIndex);\n if (!previewMode) rawBlock?.select(cmd.blockId);\n break;\n }\n case 'select-row': {\n selectedRowId = cmd.blockId;\n const h = document.querySelector<HTMLElement>('[data-veo-guide]');\n if (h && !previewMode) renderRowChrome(h, previewStepIndex);\n break;\n }\n case 'close-preview':\n detachPreviewTools();\n hideDragGhost();\n pendingPreview = null;\n lastPreview = null;\n disarmPreviewTrigger();\n cancelPreviewDelay();\n previewFired = false;\n previewDismissed = false;\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 detachPreviewTools();\n hideDragGhost();\n pendingPreview = null;\n disarmPreviewTrigger();\n cancelPreviewDelay();\n closeGuidePreview();\n post({ type: 'closed' }); // avisar al editor ANTES de sacar el panel\n panel?.teardown();\n panel = null;\n highlightBox?.remove();\n highlightBox = null;\n confirmation?.remove();\n confirmation = null;\n if (confirmationKey) document.removeEventListener('keydown', confirmationKey, true);\n confirmationKey = null;\n chrome?.teardown();\n chrome = null;\n clearBuilderToken(); // salir del modo builder: no re-activar en la próxima carga\n };\n\n /**\n * Inventario de la página para el panel de features: elementos interactivos\n * (`INTERACTIVE_SELECTOR`: botones, enlaces, campos, formularios, controles\n * ARIA…) visibles, fuera del chrome/panel de OnUser, que no matchean ninguna\n * feature ya tagueada; y cuáles de los selectores dados existen en la página.\n */\n const scanPage = (selectors: string[]): PageScan => {\n const present = selectors.filter((sel) => {\n try {\n return document.querySelector(sel) !== null;\n } catch {\n return false;\n }\n });\n const taggedEls = new Set<Element>();\n for (const sel of present) {\n try {\n for (const e of Array.from(document.querySelectorAll(sel))) taggedEls.add(e);\n } catch {\n // selector inválido: ya filtrado arriba\n }\n }\n const seen = new Set<string>();\n const candidates: PageElement[] = [];\n const nodes = document.querySelectorAll(INTERACTIVE_SELECTOR);\n for (const element of Array.from(nodes)) {\n if (candidates.length >= 200) break;\n if (element.closest('[data-veo-builder-chrome],[data-veo-builder-panel],[data-veo-picker]')) {\n continue;\n }\n if (element.getClientRects().length === 0) continue;\n // Ya tagueado (él o un ancestro con feature): no es candidato.\n let tagged = false;\n for (let n: Element | null = element; n; n = n.parentElement) {\n if (taggedEls.has(n)) {\n tagged = true;\n break;\n }\n }\n if (tagged) continue;\n const selector = buildSelectorPath(element, 5);\n if (!selector || seen.has(selector)) continue;\n seen.add(selector);\n candidates.push({\n selector,\n shortSelector: buildSelectorPath(element, 0),\n tag: element.tagName.toLowerCase(),\n id: element.id || null,\n classes: filterHumanClasses(element),\n text: elementLabelText(element),\n });\n }\n const { pathname, hash } = window.location;\n // Hash routing (`#/ruta`): la ruta visible incluye el hash.\n const routePath = /^#\\/./.test(hash) ? `${pathname}${hash}` : pathname;\n return { pagePath: pathname, routePath, candidates, present };\n };\n\n /**\n * Modal de confirmación centrado sobre la app (mock «Feature tagueada»):\n * backdrop + tarjeta con check verde, título, mensaje, filas y botón. El\n * panel se oculta mientras está abierto y vuelve al cerrarlo (botón o Esc).\n */\n let confirmation: HTMLElement | null = null;\n let confirmationKey: ((e: KeyboardEvent) => void) | null = null;\n const closeConfirmation = (): void => {\n if (!confirmation) return;\n confirmation.remove();\n confirmation = null;\n if (confirmationKey) document.removeEventListener('keydown', confirmationKey, true);\n confirmationKey = null;\n panel?.setVisible(true);\n post({ type: 'confirmation-closed' });\n };\n const showConfirmation = (card: ConfirmationCard): void => {\n if (confirmation) {\n confirmation.remove();\n confirmation = null;\n }\n panel?.setVisible(false);\n const host = document.createElement('div');\n host.setAttribute('data-veo-builder-chrome', '');\n host.setAttribute('data-veo-confirmation', '');\n const shadow = host.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = CONFIRMATION_STYLES;\n const backdrop = document.createElement('div');\n backdrop.className = 'veo-confirm-backdrop';\n const dialog = document.createElement('div');\n dialog.className = 'veo-confirm';\n dialog.setAttribute('role', 'dialog');\n dialog.setAttribute('aria-modal', 'true');\n dialog.setAttribute('aria-label', card.title);\n const badge = document.createElement('div');\n badge.className = 'veo-confirm-check';\n badge.innerHTML =\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12.5l4.5 4.5L19 7.5\"/></svg>';\n const title = document.createElement('h2');\n title.className = 'veo-confirm-title';\n title.textContent = card.title;\n const message = document.createElement('p');\n message.className = 'veo-confirm-msg';\n message.textContent = card.message;\n const rows = document.createElement('dl');\n rows.className = 'veo-confirm-rows';\n for (const r of card.rows) {\n const row = document.createElement('div');\n row.className = 'veo-confirm-row';\n const dt = document.createElement('dt');\n dt.textContent = r.label;\n const dd = document.createElement('dd');\n dd.textContent = r.value;\n row.append(dt, dd);\n rows.appendChild(row);\n }\n const button = document.createElement('button');\n button.type = 'button';\n button.className = 'veo-confirm-btn';\n button.textContent = card.buttonLabel ?? 'Listo';\n button.addEventListener('click', closeConfirmation);\n dialog.append(badge, title, message);\n if (card.rows.length > 0) dialog.appendChild(rows);\n dialog.appendChild(button);\n shadow.append(style, backdrop, dialog);\n document.body.appendChild(host);\n confirmation = host;\n confirmationKey = (e: KeyboardEvent): void => {\n if (e.key !== 'Escape') return;\n e.preventDefault();\n e.stopPropagation();\n closeConfirmation();\n };\n document.addEventListener('keydown', confirmationKey, true);\n button.focus();\n };\n\n /** Marco de resalte sobre un elemento (hover en la lista del panel). */\n let highlightBox: HTMLElement | null = null;\n const setHighlight = (selector: string | null): void => {\n highlightBox?.remove();\n highlightBox = null;\n if (!selector) return;\n let target: Element | null = null;\n try {\n target = document.querySelector(selector);\n } catch {\n return;\n }\n if (!target) return;\n const r = target.getBoundingClientRect();\n const box = document.createElement('div');\n box.setAttribute('data-veo-builder-chrome', '');\n box.style.cssText =\n `position:fixed;left:${r.left - 3}px;top:${r.top - 3}px;width:${r.width + 6}px;height:${r.height + 6}px;` +\n 'border:2px solid #FF5B35;border-radius:6px;background:rgba(255,91,53,0.10);pointer-events:none;z-index:2147483646;';\n document.body.appendChild(box);\n highlightBox = box;\n };\n\n // Transporte: panel inyectado (app top-level) o iframe/popup (embebida).\n if (ctx.panel) {\n // Chrome (barras) primero: el panel arranca debajo. Las acciones de las\n // barras van al panel como eventos `chrome-action`; seleccionar algo\n // vuelve a mostrar la tarjeta si estaba minimizada.\n chrome = injectBuilderChrome({\n appLabel: window.location.hostname,\n onAction: (action) => {\n switch (action.action) {\n // Controles que resuelve el SDK solo (no van al panel).\n case 'dock':\n panel?.setTopOffset(action.position === 'top' ? (chrome?.height() ?? 0) : 0);\n return;\n case 'show-panel':\n panel?.setVisible(true);\n return;\n case 'preview':\n if (previewMode) return;\n previewMode = true;\n // La activación se evalúa desde cero al entrar en vista previa.\n previewFired = false;\n previewDismissed = false;\n panelWasVisible = panel?.isVisible() ?? true;\n panel?.setVisible(false);\n chrome?.setPreview(true);\n if (lastPreview) applyPreviewGated(lastPreview);\n return;\n case 'exit-preview':\n if (!previewMode) return;\n previewMode = false;\n disarmPreviewTrigger();\n cancelPreviewDelay();\n chrome?.setPreview(false);\n panel?.setVisible(panelWasVisible);\n if (lastPreview) applyPreviewGated(lastPreview);\n return;\n case 'select-activation':\n case 'select-step':\n case 'add-step':\n panel?.setVisible(true);\n break;\n }\n post({ type: 'chrome-action', payload: action });\n },\n });\n panel = injectBuilderPanel({\n dashboardOrigin,\n token,\n appOrigin: window.location.origin,\n guide: ctx.guide,\n panelPath: ctx.panelPath,\n onClose: () => teardown(),\n topOffset: chrome.height(),\n });\n chrome.onHeightChange((h) => panel?.setTopOffset(chrome?.dock() === 'top' ? h : 0));\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/**\n * Lista de tareas en la preview del editor: progreso con un usuario de\n * preview (nombres y pasos reales de las guías publicadas, progreso 0). Solo\n * si `init()` dejó apiKey/apiUrl en `window.__veoBuilder`.\n */\nfunction previewProgressFetcher():\n | ((guideIds: string[]) => Promise<import('../guides/types').GuideProgressItem[]>)\n | undefined {\n const cfg = (window as unknown as { __veoBuilder?: { apiKey?: string; apiUrl?: string } })\n .__veoBuilder;\n if (!cfg?.apiKey || !cfg?.apiUrl) return undefined;\n const apiUrl = cfg.apiUrl.replace(/\\/+$/, '');\n const apiKey = cfg.apiKey;\n return async (guideIds) => {\n const params = new URLSearchParams({\n endUserId: 'veo_preview',\n guideIds: guideIds.join(','),\n includeUnpublished: '1',\n });\n const res = await fetch(`${apiUrl}/v1/guides/progress?${params}`, {\n headers: { 'X-Api-Key': apiKey },\n });\n if (!res.ok) return [];\n const data = (await res.json()) as { items?: import('../guides/types').GuideProgressItem[] };\n return data.items ?? [];\n };\n}\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"]}
|