{"version":3,"sources":["../src/plugins/builder/block-drop-target.ts","../src/plugins/builder/bridge-protocol.ts","../src/plugins/builder/builder-panel.ts","../src/plugins/builder/design-manipulator.ts","../src/plugins/builder/element-picker.ts","../src/plugins/builder/builder-mode.ts","../src/plugins/builder/builder-session.ts"],"names":["MIN_W","MIN_H","clamp"],"mappings":"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","file":"chunk-AFU5ZG6Z.mjs","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 * Contrato de mensajes del puente builder (app del cliente ↔ dashboard).\n * Ambos lados validan `event.origin` y que `token` coincida antes de actuar.\n *\n * Flujo:\n *   1. El dashboard abre la app con `?veoBuilder=<token>&veoBuilderOrigin=<origen>`.\n *   2. La app (veo-builder.js) postea `ready` a la ventana que la abrió.\n *   3. El dashboard manda comandos (`start-picker`, `preview`, …).\n *   4. La app responde con eventos (`picked`, `pick-cancelled`, …).\n */\nimport type { PreviewGuideInput } from '../guides/guide-preview';\nimport type { BlockDropPayload } from './block-drop-target';\nimport type { DesignPatch } from './design-manipulator';\nimport type { PickedElement } from './element-picker';\n\nexport const VEO_BUILDER_SOURCE = 'veo-builder';\n// Los nombres de los query params viven en el core (`builder-token.ts`), única\n// fuente de verdad compartida con el loader y el gate del runtime de guías.\nexport { BUILDER_ORIGIN_PARAM, BUILDER_TOKEN_PARAM } from '../../core/builder-token';\n\n/** Eventos que la app del cliente envía al dashboard. */\nexport type BuilderEvent =\n  | { type: 'ready' }\n  | { type: 'picked'; payload: PickedElement }\n  | { type: 'pick-cancelled' }\n  // Manipulación directa: el autor arrastró/redimensionó la guía en la app;\n  // el panel mergea `payload.style` sobre el `style` del paso indicado.\n  | { type: 'design-updated'; payload: DesignPatch }\n  // Drag & drop de bloques: el autor soltó un bloque de la paleta SOBRE la\n  // guía en preview; el panel lo inserta en `step.blocks[]` en esa posición.\n  | { type: 'block-dropped'; payload: BlockDropPayload }\n  | { type: 'closed' };\n\n/** Comandos que el dashboard/panel envía a la app del cliente. */\nexport type BuilderCommand =\n  | { type: 'start-picker'; maxAncestors?: number; hint?: string }\n  | { type: 'stop-picker' }\n  // `editable: true` (editor in-app) adjunta drag/resize sobre la preview.\n  | { type: 'preview'; guide: PreviewGuideInput; editable?: boolean }\n  // Drag de un bloque de la paleta POR POINTER (el DnD HTML5 no cruza bien el\n  // iframe del panel): el panel captura el puntero y streamea sus coordenadas\n  // RELATIVAS AL IFRAME; la app las convierte con el rect del panel, mueve la\n  // línea de inserción y en `drop` responde con el evento `block-dropped`.\n  | {\n      type: 'block-drag';\n      phase: 'move' | 'drop' | 'cancel';\n      x: number;\n      y: number;\n      blockType: string;\n      label?: string;\n    }\n  | { type: 'close-preview' }\n  | { type: 'teardown' }\n  // Modo panel inyectado: el panel avisa que cargó y está listo para recibir\n  // eventos; la app responde con `ready`. Resuelve la carrera de que el iframe\n  // del panel todavía no tenga su listener cuando la app postea `ready`.\n  | { type: 'panel-ready' };\n\n/** Sobre común: todo mensaje del puente lleva `source` + `token`. */\nexport interface BuilderEnvelope {\n  source: typeof VEO_BUILDER_SOURCE;\n  token: string;\n}\n\nexport type BuilderEventMessage = BuilderEnvelope & BuilderEvent;\nexport type BuilderCommandMessage = BuilderEnvelope & BuilderCommand;\n","/**\n * Modo \"panel inyectado\" (editor en la pestaña de la app).\n *\n * La app es la pestaña top-level (login real) y el editor de Veo se inyecta\n * ENCIMA como una tarjeta flotante **arrastrable y redimensionable** (un iframe\n * al dashboard). Además se puede **sacar a una ventana independiente** del\n * navegador (\"pop-out\").\n *\n * El panel corre en el origen del dashboard (sesión de Veo para guardar guías) y\n * habla con la app (`window.parent` si está anclado, `window.opener` si está en\n * ventana aparte) por el puente postMessage. Este módulo inyecta/gestiona el\n * panel y expone su ventana destino.\n */\nimport { hasDocument, hasWindow } from '../../utils/safe-env';\n\nconst DEFAULT_PANEL_PATH = '/guides/design';\nconst PANEL_W = 400;\nconst PANEL_H = 640;\nconst MIN_W = 320;\nconst MIN_H = 320;\nconst MARGIN = 16;\n\nexport interface BuilderPanelOptions {\n  dashboardOrigin: string;\n  token: string;\n  appOrigin: string;\n  guide: string | null;\n  panelPath: string | null;\n  onClose: () => void;\n}\n\nexport interface BuilderPanelHandle {\n  /** Ventana destino de los mensajes: el iframe anclado o la ventana pop-out. */\n  target(): Window | null;\n  /**\n   * Rect del IFRAME del panel en coordenadas de la página de la app, o `null`\n   * si el editor está en pop-out (ventana aparte: no hay mapeo de coordenadas).\n   * Lo usa el drag de bloques para convertir el puntero panel → página.\n   */\n  frameRect(): DOMRect | null;\n  /** Quita el panel del DOM (y cierra la ventana pop-out si hay). */\n  teardown(): void;\n}\n\n/** Inyecta el panel del editor (arrastrable, redimensionable, pop-out). */\nexport function injectBuilderPanel(opts: BuilderPanelOptions): BuilderPanelHandle {\n  if (!hasWindow() || !hasDocument()) {\n    return { target: () => null, frameRect: () => null, teardown: () => {} };\n  }\n\n  const panelUrl = buildPanelUrl(opts);\n\n  const host = document.createElement('div');\n  host.setAttribute('data-veo-builder-panel', '');\n  const shadow = host.attachShadow({ mode: 'open' });\n\n  const style = document.createElement('style');\n  style.textContent = PANEL_CSS;\n\n  const card = document.createElement('div');\n  card.className = 'veo-panel';\n  let left = Math.max(MARGIN, window.innerWidth - PANEL_W - MARGIN);\n  let top = MARGIN;\n  card.style.left = `${left}px`;\n  card.style.top = `${top}px`;\n  card.style.width = `${PANEL_W}px`;\n  card.style.height = `${PANEL_H}px`;\n\n  // Header: título + pop-out + cerrar.\n  const header = document.createElement('div');\n  header.className = 'veo-panel-header';\n  const title = document.createElement('span');\n  title.className = 'veo-panel-title';\n  title.textContent = 'OnUser · Editor';\n  const actions = document.createElement('div');\n  actions.className = 'veo-panel-actions';\n  const popout = document.createElement('button');\n  popout.className = 'veo-panel-btn';\n  popout.type = 'button';\n  popout.title = 'Abrir en ventana aparte';\n  popout.setAttribute('aria-label', 'Abrir en ventana aparte');\n  popout.textContent = '⧉';\n  const close = document.createElement('button');\n  close.className = 'veo-panel-btn veo-panel-close';\n  close.type = 'button';\n  close.title = 'Cerrar';\n  close.setAttribute('aria-label', 'Cerrar');\n  close.textContent = '✕';\n  actions.append(popout, close);\n  header.append(title, actions);\n\n  const iframe = document.createElement('iframe');\n  iframe.className = 'veo-panel-frame';\n  iframe.title = 'Editor de Veo';\n  iframe.src = panelUrl;\n\n  const grip = document.createElement('div');\n  grip.className = 'veo-panel-resize';\n  grip.setAttribute('aria-hidden', 'true');\n\n  card.append(header, iframe, grip);\n  shadow.append(style, card);\n  document.body.appendChild(host);\n\n  // ── Pop-out: sacar el editor a una ventana independiente ────────────────\n  let popped: Window | null = null;\n  let pollTimer: ReturnType<typeof setInterval> | undefined;\n\n  const stopPoll = (): void => {\n    if (pollTimer !== undefined) {\n      clearInterval(pollTimer);\n      pollTimer = undefined;\n    }\n  };\n\n  close.addEventListener('click', () => opts.onClose());\n  popout.addEventListener('click', () => {\n    const win = window.open(\n      panelUrl,\n      'veo-editor',\n      `popup,width=${Math.round(card.offsetWidth)},height=${Math.round(card.offsetHeight) + 60}`,\n    );\n    if (!win) return; // bloqueado por el navegador\n    popped = win;\n    card.style.display = 'none'; // el editor ahora vive en la ventana aparte\n    pollTimer = setInterval(() => {\n      if (popped?.closed) {\n        stopPoll();\n        opts.onClose(); // cerrar la ventana = salir del modo editor\n      }\n    }, 600);\n  });\n\n  // ── Arrastre por el header ──────────────────────────────────────────────\n  header.addEventListener('mousedown', (e) => {\n    if ((e.target as HTMLElement)?.classList.contains('veo-panel-btn')) return;\n    e.preventDefault();\n    const sx = e.clientX;\n    const sy = e.clientY;\n    const ol = left;\n    const ot = top;\n    iframe.style.pointerEvents = 'none';\n    const move = (ev: MouseEvent): void => {\n      left = clamp(ol + (ev.clientX - sx), 0, Math.max(0, window.innerWidth - card.offsetWidth));\n      top = clamp(ot + (ev.clientY - sy), 0, Math.max(0, window.innerHeight - 40));\n      card.style.left = `${left}px`;\n      card.style.top = `${top}px`;\n    };\n    const up = (): void => {\n      window.removeEventListener('mousemove', move);\n      window.removeEventListener('mouseup', up);\n      iframe.style.pointerEvents = '';\n    };\n    window.addEventListener('mousemove', move);\n    window.addEventListener('mouseup', up);\n  });\n\n  // ── Redimensionar por el grip (esquina inferior derecha) ────────────────\n  grip.addEventListener('mousedown', (e) => {\n    e.preventDefault();\n    e.stopPropagation();\n    const sx = e.clientX;\n    const sy = e.clientY;\n    const sw = card.offsetWidth;\n    const sh = card.offsetHeight;\n    iframe.style.pointerEvents = 'none';\n    const move = (ev: MouseEvent): void => {\n      card.style.width = `${clamp(sw + (ev.clientX - sx), MIN_W, window.innerWidth)}px`;\n      card.style.height = `${clamp(sh + (ev.clientY - sy), MIN_H, window.innerHeight)}px`;\n    };\n    const up = (): void => {\n      window.removeEventListener('mousemove', move);\n      window.removeEventListener('mouseup', up);\n      iframe.style.pointerEvents = '';\n    };\n    window.addEventListener('mousemove', move);\n    window.addEventListener('mouseup', up);\n  });\n\n  return {\n    target: () => (popped && !popped.closed ? popped : iframe.contentWindow),\n    frameRect: () => (popped && !popped.closed ? null : iframe.getBoundingClientRect()),\n    teardown: () => {\n      stopPoll();\n      if (popped && !popped.closed) popped.close();\n      host.remove();\n    },\n  };\n}\n\nfunction clamp(v: number, min: number, max: number): number {\n  return Math.min(Math.max(v, min), max);\n}\n\nfunction buildPanelUrl(opts: BuilderPanelOptions): string {\n  const path = opts.panelPath ?? DEFAULT_PANEL_PATH;\n  const url = new URL(path, opts.dashboardOrigin);\n  url.searchParams.set('veoToken', opts.token);\n  url.searchParams.set('veoApp', opts.appOrigin);\n  if (opts.guide) url.searchParams.set('veoGuide', opts.guide);\n  return url.toString();\n}\n\nconst PANEL_CSS = `\n:host { all: initial; }\n.veo-panel {\n  position: fixed;\n  min-width: ${MIN_W}px; min-height: ${MIN_H}px;\n  max-width: 96vw; max-height: 94vh;\n  display: flex; flex-direction: column;\n  background: #fff;\n  border-radius: 12px;\n  box-shadow: 0 12px 40px rgba(0,0,0,0.28);\n  overflow: hidden;\n  z-index: 2147483647;\n  font-family: system-ui, -apple-system, sans-serif;\n}\n.veo-panel-header {\n  flex: 0 0 auto;\n  display: flex; align-items: center; justify-content: space-between;\n  padding: 8px 10px 8px 12px;\n  background: #1b1714; color: #f7f1eb;\n  font-size: 13px; font-weight: 600;\n  cursor: grab;\n}\n.veo-panel-header:active { cursor: grabbing; }\n.veo-panel-actions { display: flex; gap: 2px; }\n.veo-panel-btn {\n  border: 0; background: transparent; color: #fff;\n  font-size: 14px; cursor: pointer; line-height: 1;\n  padding: 4px 7px; border-radius: 6px;\n}\n.veo-panel-btn:hover { background: rgba(255,255,255,0.15); }\n.veo-panel-frame { flex: 1 1 auto; width: 100%; border: 0; background: #fff; }\n.veo-panel-resize {\n  position: absolute; right: 0; bottom: 0;\n  width: 16px; height: 16px;\n  cursor: nwse-resize;\n  background:\n    linear-gradient(135deg, transparent 50%, rgba(0,0,0,0.25) 50%, rgba(0,0,0,0.25) 60%,\n    transparent 60%, transparent 72%, rgba(0,0,0,0.25) 72%, rgba(0,0,0,0.25) 82%, transparent 82%);\n}\n`;\n","/**\n * Manipulación DIRECTA del diseño en modo editor: arrastrar la tarjeta de una\n * modal para posicionarla, redimensionarla desde bordes/esquinas, y arrastrar\n * un banner para alternar top/bottom. Vive en el bundle builder (veo-builder.js)\n * — el runtime de guías no carga nada de esto.\n *\n * Funciona como DECORATOR: se adjunta DESPUÉS del render sobre el shadow root\n * abierto del host de la guía (no toca los renderers). Durante el gesto aplica\n * las variables CSS localmente (feedback a 60fps, sin postMessage); al soltar\n * (`pointerup`) emite UN `onCommit(patch)` con los valores finales, que el\n * builder-mode postea al panel como `design-updated`. El panel actualiza su\n * estado y re-manda `preview` — que entra por el update in-place con las\n * MISMAS variables → no hay loop ni parpadeo.\n *\n * Geometría del modal (ver styles.ts): la card usa `left: posX%` +\n * `translate(-posX%)`, o sea `cardLeft = posX * (viewportW - cardW)` →\n * `posX = cardLeft / (viewportW - cardW)`. Mismo modelo que serializa el\n * dashboard (`style.posX/posY` en 0..1) y consume `applyDesignVars`.\n */\nimport type { GuideType } from '../guides/types';\n\n/** Merge superficial sobre `step.style` del paso activo (lo aplica el panel). */\nexport interface DesignPatch {\n  stepIndex: number;\n  style: {\n    posX?: number;\n    posY?: number;\n    width?: number;\n    height?: number;\n    position?: 'top' | 'bottom';\n  };\n}\n\nexport interface DesignManipulatorOptions {\n  /** Host de la guía (de `PreviewHandle.host()`), con shadow root abierto. */\n  host: HTMLElement;\n  guideType: GuideType;\n  stepIndex: number;\n  /** Se emite UNA vez por gesto, al soltar. */\n  onCommit: (patch: DesignPatch) => void;\n  /** Fin de cualquier gesto (con o sin cambios). Para aplicar previews encolados. */\n  onGestureEnd?: () => void;\n}\n\nexport interface DesignManipulatorHandle {\n  /** `true` mientras hay un gesto de drag/resize en curso. */\n  isDragging(): boolean;\n  /** Remueve handles, estilos y listeners. Idempotente. */\n  detach(): void;\n}\n\nconst MIN_W = 220;\nconst MAX_W = 720;\nconst MIN_H = 120;\nconst MAX_H = 900;\n/** Zonas de agarre de los bordes (px). */\nconst EDGE = 8;\n\ntype ResizeDir = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw';\nconst RESIZE_DIRS: ResizeDir[] = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\n\nconst MANIPULATOR_CSS = `\n.veo-mnp-card {\n  outline: 1.5px dashed rgba(255, 91, 53, 0.75);\n  outline-offset: 2px;\n}\n.veo-mnp-card:hover { cursor: move; }\n.veo-mnp-handle {\n  position: absolute;\n  z-index: 10;\n  background: transparent;\n}\n.veo-mnp-handle::after {\n  content: '';\n  position: absolute;\n  width: 8px; height: 8px;\n  background: #fff;\n  border: 1.5px solid rgba(255, 91, 53, 0.9);\n  border-radius: 2px;\n  top: 50%; left: 50%;\n  transform: translate(-50%, -50%);\n  opacity: 0;\n  transition: opacity 100ms ease;\n}\n.veo-mnp-card:hover .veo-mnp-handle::after,\n.veo-mnp-handle:hover::after { opacity: 1; }\n.veo-mnp-n  { top: -${EDGE / 2}px; left: ${EDGE}px; right: ${EDGE}px; height: ${EDGE}px; cursor: ns-resize; }\n.veo-mnp-s  { bottom: -${EDGE / 2}px; left: ${EDGE}px; right: ${EDGE}px; height: ${EDGE}px; cursor: ns-resize; }\n.veo-mnp-e  { right: -${EDGE / 2}px; top: ${EDGE}px; bottom: ${EDGE}px; width: ${EDGE}px; cursor: ew-resize; }\n.veo-mnp-w  { left: -${EDGE / 2}px; top: ${EDGE}px; bottom: ${EDGE}px; width: ${EDGE}px; cursor: ew-resize; }\n.veo-mnp-ne { top: -${EDGE / 2}px; right: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nesw-resize; }\n.veo-mnp-nw { top: -${EDGE / 2}px; left: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nwse-resize; }\n.veo-mnp-se { bottom: -${EDGE / 2}px; right: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nwse-resize; }\n.veo-mnp-sw { bottom: -${EDGE / 2}px; left: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nesw-resize; }\n.veo-mnp-banner { outline: 1.5px dashed rgba(255, 91, 53, 0.75); outline-offset: -2px; cursor: grab; }\n.veo-mnp-banner:active { cursor: grabbing; }\n`;\n\nfunction clamp(v: number, min: number, max: number): number {\n  return Math.min(Math.max(v, min), max);\n}\n\nfunction round3(v: number): number {\n  return Math.round(v * 1000) / 1000;\n}\n\n/** true si el mousedown cayó sobre algo interactivo (no iniciar drag ahí). */\nfunction isInteractive(target: EventTarget | null): boolean {\n  return Boolean(\n    target instanceof Element && target.closest('button, a, input, textarea, select, label'),\n  );\n}\n\n/**\n * Adjunta la manipulación directa al host de una guía montada. Devuelve el\n * handle, o `null` si el tipo de guía no la soporta o el DOM esperado no está.\n * Idempotente: si la card ya está decorada, no re-adjunta.\n */\nexport function attachDesignManipulator(\n  opts: DesignManipulatorOptions,\n): DesignManipulatorHandle | null {\n  const shadow = opts.host.shadowRoot;\n  if (!shadow) return null;\n\n  const card = shadow.querySelector<HTMLElement>('.veo-modal-card');\n  if (card) return attachModal(opts, shadow, card);\n\n  const banner = shadow.querySelector<HTMLElement>('.veo-banner');\n  // El banner embebido se posiciona con prepend/append en el contenedor: su\n  // top/bottom se cambia desde el panel (remonta). Solo el fijo se arrastra.\n  if (banner && !banner.classList.contains('veo-banner-embedded')) {\n    return attachBanner(opts, shadow, banner);\n  }\n\n  return null;\n}\n\n// ── Modal: drag libre + resize por 8 handles ────────────────────────────────\n\nfunction attachModal(\n  opts: DesignManipulatorOptions,\n  shadow: ShadowRoot,\n  card: HTMLElement,\n): DesignManipulatorHandle | null {\n  if (card.dataset.veoManipulated === '1') return null;\n  card.dataset.veoManipulated = '1';\n  card.classList.add('veo-mnp-card');\n\n  const doc = card.ownerDocument;\n  const style = doc.createElement('style');\n  style.textContent = MANIPULATOR_CSS;\n  shadow.appendChild(style);\n\n  const handles: HTMLElement[] = [];\n  for (const dir of RESIZE_DIRS) {\n    const h = doc.createElement('div');\n    h.className = `veo-mnp-handle veo-mnp-${dir}`;\n    h.dataset.veoDir = dir;\n    card.appendChild(h);\n    handles.push(h);\n  }\n\n  let dragging = false;\n  let detached = false;\n\n  /** Últimos valores aplicados durante el gesto (para el commit del up). */\n  let patch: DesignPatch['style'] = {};\n\n  const setVars = (v: { px?: number; py?: number; w?: number; h?: number }): void => {\n    const host = opts.host;\n    if (v.px !== undefined) host.style.setProperty('--veo-pos-x', `${v.px * 100}%`);\n    if (v.py !== undefined) host.style.setProperty('--veo-pos-y', `${v.py * 100}%`);\n    if (v.w !== undefined) host.style.setProperty('--veo-width', `${v.w}px`);\n    if (v.h !== undefined) host.style.setProperty('--veo-min-h', `${v.h}px`);\n  };\n\n  /**\n   * Un gesto genérico: guarda el rect inicial, traduce cada mousemove a\n   * variables CSS (rAF-throttled) y al soltar emite el commit acumulado.\n   */\n  const startGesture = (\n    e: MouseEvent,\n    apply: (dx: number, dy: number, start: DOMRect) => DesignPatch['style'],\n  ): void => {\n    e.preventDefault();\n    e.stopPropagation();\n    dragging = true;\n    patch = {};\n    const start = card.getBoundingClientRect();\n    const sx = e.clientX;\n    const sy = e.clientY;\n    let raf = 0;\n    let lastEv: MouseEvent | null = null;\n\n    const flush = (): void => {\n      raf = 0;\n      if (!lastEv) return;\n      const next = apply(lastEv.clientX - sx, lastEv.clientY - sy, start);\n      patch = { ...patch, ...next };\n      setVars({\n        ...(next.posX !== undefined ? { px: next.posX } : {}),\n        ...(next.posY !== undefined ? { py: next.posY } : {}),\n        ...(next.width !== undefined ? { w: next.width } : {}),\n        ...(next.height !== undefined ? { h: next.height } : {}),\n      });\n    };\n\n    const move = (ev: MouseEvent): void => {\n      lastEv = ev;\n      // rAF-throttle del feedback; fallback síncrono si el entorno no tiene rAF.\n      if (typeof window.requestAnimationFrame !== 'function') flush();\n      else if (!raf) raf = window.requestAnimationFrame(flush);\n    };\n    const up = (): void => {\n      window.removeEventListener('mousemove', move);\n      window.removeEventListener('mouseup', up);\n      if (raf) window.cancelAnimationFrame(raf);\n      flush();\n      dragging = false;\n      if (Object.keys(patch).length > 0 && !detached) {\n        opts.onCommit({ stepIndex: opts.stepIndex, style: patch });\n      }\n      opts.onGestureEnd?.();\n    };\n    window.addEventListener('mousemove', move);\n    window.addEventListener('mouseup', up);\n  };\n\n  /** posX para que el borde izquierdo quede en `left` con ancho `w`. */\n  const posXFor = (left: number, w: number): number => {\n    const span = window.innerWidth - w;\n    return span <= 0 ? 0.5 : round3(clamp(left / span, 0, 1));\n  };\n  const posYFor = (top: number, h: number): number => {\n    const span = window.innerHeight - h;\n    return span <= 0 ? 0.5 : round3(clamp(top / span, 0, 1));\n  };\n\n  const onCardDown = (e: MouseEvent): void => {\n    if (isInteractive(e.target)) return;\n    if (e.target instanceof Element && e.target.closest('.veo-mnp-handle')) return;\n    startGesture(e, (dx, dy, start) => ({\n      posX: posXFor(start.left + dx, start.width),\n      posY: posYFor(start.top + dy, start.height),\n    }));\n  };\n\n  const onHandleDown = (e: MouseEvent): void => {\n    const dir = (e.currentTarget as HTMLElement).dataset.veoDir as ResizeDir;\n    startGesture(e, (dx, dy, start) => {\n      const out: DesignPatch['style'] = {};\n      if (dir.includes('e')) out.width = Math.round(clamp(start.width + dx, MIN_W, MAX_W));\n      if (dir.includes('w')) {\n        out.width = Math.round(clamp(start.width - dx, MIN_W, MAX_W));\n        // El borde derecho queda fijo: la card se re-ancla donde corresponde.\n        out.posX = posXFor(start.right - out.width, out.width);\n      }\n      if (dir.includes('s')) out.height = Math.round(clamp(start.height + dy, MIN_H, MAX_H));\n      if (dir.includes('n')) {\n        out.height = Math.round(clamp(start.height - dy, MIN_H, MAX_H));\n        out.posY = posYFor(start.bottom - out.height, out.height);\n      }\n      return out;\n    });\n  };\n\n  card.addEventListener('mousedown', onCardDown);\n  for (const h of handles) h.addEventListener('mousedown', onHandleDown);\n\n  return {\n    isDragging: () => dragging,\n    detach: () => {\n      if (detached) return;\n      detached = true;\n      card.removeEventListener('mousedown', onCardDown);\n      for (const h of handles) h.remove();\n      style.remove();\n      card.classList.remove('veo-mnp-card');\n      delete card.dataset.veoManipulated;\n    },\n  };\n}\n\n// ── Banner fijo: drag vertical con snap top/bottom ──────────────────────────\n\nfunction attachBanner(\n  opts: DesignManipulatorOptions,\n  shadow: ShadowRoot,\n  banner: HTMLElement,\n): DesignManipulatorHandle | null {\n  if (banner.dataset.veoManipulated === '1') return null;\n  banner.dataset.veoManipulated = '1';\n  banner.classList.add('veo-mnp-banner');\n\n  const doc = banner.ownerDocument;\n  const style = doc.createElement('style');\n  style.textContent = MANIPULATOR_CSS;\n  shadow.appendChild(style);\n\n  let dragging = false;\n  let detached = false;\n\n  const positionOf = (): 'top' | 'bottom' =>\n    banner.classList.contains('veo-banner-bottom') ? 'bottom' : 'top';\n\n  const onDown = (e: MouseEvent): void => {\n    if (isInteractive(e.target)) return;\n    e.preventDefault();\n    dragging = true;\n    const startPos = positionOf();\n    let current = startPos;\n\n    const move = (ev: MouseEvent): void => {\n      // Snap: la mitad del viewport decide top/bottom, con feedback en vivo.\n      const next = ev.clientY < window.innerHeight / 2 ? 'top' : 'bottom';\n      if (next !== current) {\n        current = next;\n        banner.classList.remove('veo-banner-top', 'veo-banner-bottom');\n        banner.classList.add(`veo-banner-${next}`);\n      }\n    };\n    const up = (): void => {\n      window.removeEventListener('mousemove', move);\n      window.removeEventListener('mouseup', up);\n      dragging = false;\n      if (current !== startPos && !detached) {\n        opts.onCommit({ stepIndex: opts.stepIndex, style: { position: current } });\n      }\n      opts.onGestureEnd?.();\n    };\n    window.addEventListener('mousemove', move);\n    window.addEventListener('mouseup', up);\n  };\n\n  banner.addEventListener('mousedown', onDown);\n\n  return {\n    isDragging: () => dragging,\n    detach: () => {\n      if (detached) return;\n      detached = true;\n      banner.removeEventListener('mousedown', onDown);\n      style.remove();\n      banner.classList.remove('veo-mnp-banner');\n      delete banner.dataset.veoManipulated;\n    },\n  };\n}\n","/**\n * Element picker — el \"inspeccionar\" del navegador, pero del SDK. Corre\n * DENTRO de la app del cliente (no en el dashboard: son orígenes distintos\n * y el dashboard no puede leer el DOM de la app). Resalta el elemento bajo\n * el cursor, muestra su selector + dimensiones, y al hacer click captura un\n * selector CSS estable reutilizando `buildSelectorPath` del autocapture.\n *\n * Es la base del builder no-code: el dashboard abre la app del cliente en\n * modo builder, el usuario \"pincha\" un elemento y el selector resultante se\n * usa como ancla de un tooltip/walkthrough. El puente con el dashboard\n * (postMessage) es la fase siguiente; aquí exponemos el primitivo\n * `startElementPicker(onPick)`.\n *\n * No usa `innerHTML` — todo por `textContent`/DOM, igual que los renderers.\n */\n\nimport { hasDocument } from '../../utils/safe-env';\nimport { buildSelectorPath, filterHumanClasses } from '../autocapture/selector-builder';\n\n/** z-index por encima de las guías (2147483640) para tapar también una preview. */\nconst PICKER_Z = 2147483646;\nconst PICKER_HOST_ATTR = 'data-veo-picker';\nconst DEFAULT_MAX_ANCESTORS = 5;\n\n/** Datos del elemento elegido que se entregan al caller. */\nexport interface PickedElement {\n  /** Selector CSS estable con ancestros (lo que se guarda como ancla). */\n  selector: string;\n  /** Selector corto solo del elemento (tag + id/atributo/clases). */\n  shortSelector: string;\n  tag: string;\n  id: string | null;\n  classes: string[];\n  text: string;\n  rect: { x: number; y: number; width: number; height: number };\n}\n\nexport interface ElementPickerOptions {\n  /** Llamado al hacer click en un elemento. El picker se cierra tras esto. */\n  onPick: (picked: PickedElement) => void;\n  /** Llamado al cancelar (Esc). El picker se cierra. */\n  onCancel?: () => void;\n  /** Niveles de ancestros del selector. Default 5 (igual que autocapture). */\n  maxAncestors?: number;\n  /** Texto del banner superior. Default en español. */\n  hint?: string;\n}\n\nexport interface ElementPickerHandle {\n  /** Cierra el picker sin elegir nada. Idempotente. */\n  stop(): void;\n}\n\nconst PICKER_STYLES = `\n:host { all: initial; }\n.veo-pick-box {\n  position: fixed;\n  z-index: ${PICKER_Z};\n  pointer-events: none;\n  box-sizing: border-box;\n  background: rgba(99, 102, 241, 0.22);\n  border: 1px dashed rgba(99, 102, 241, 0.95);\n  border-radius: 2px;\n  transition: top 60ms ease-out, left 60ms ease-out, width 60ms ease-out, height 60ms ease-out;\n}\n.veo-pick-label {\n  position: fixed;\n  z-index: ${PICKER_Z};\n  pointer-events: none;\n  max-width: 360px;\n  background: #1e1b4b;\n  color: #e0e7ff;\n  font: 12px/1.45 ui-monospace, SFMono-Regular, Menlo, monospace;\n  padding: 6px 9px;\n  border-radius: 6px;\n  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.35);\n}\n.veo-pick-label .veo-pick-sel { color: #c7d2fe; word-break: break-all; }\n.veo-pick-label .veo-pick-dim { color: #a5b4fc; margin-top: 3px; }\n.veo-pick-hint {\n  position: fixed;\n  top: 12px;\n  left: 50%;\n  transform: translateX(-50%);\n  z-index: ${PICKER_Z};\n  pointer-events: none;\n  background: #4338ca;\n  color: #fff;\n  font: 13px/1 -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n  padding: 8px 14px;\n  border-radius: 999px;\n  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);\n}\n`;\n\n/**\n * Controla un picker activo. Singleton a nivel de módulo: empezar otro\n * cierra el anterior. Los listeners van en fase de captura para poder\n * cancelar el click ANTES de que la app del cliente reaccione.\n */\nclass ElementPicker {\n  private host: HTMLElement | null = null;\n  private box: HTMLElement | null = null;\n  private label: HTMLElement | null = null;\n  private current: Element | null = null;\n  private maxAncestors = DEFAULT_MAX_ANCESTORS;\n  private onPick: ((p: PickedElement) => void) | null = null;\n  private onCancel: (() => void) | null = null;\n\n  start(options: ElementPickerOptions): void {\n    this.stop(); // solo un picker a la vez\n\n    this.maxAncestors = options.maxAncestors ?? DEFAULT_MAX_ANCESTORS;\n    this.onPick = options.onPick;\n    this.onCancel = options.onCancel ?? null;\n\n    const host = document.createElement('div');\n    host.setAttribute(PICKER_HOST_ATTR, '');\n    const shadow = host.attachShadow({ mode: 'open' });\n\n    const style = document.createElement('style');\n    style.textContent = PICKER_STYLES;\n\n    this.box = document.createElement('div');\n    this.box.className = 'veo-pick-box';\n    this.box.style.display = 'none';\n\n    this.label = document.createElement('div');\n    this.label.className = 'veo-pick-label';\n    this.label.style.display = 'none';\n\n    const hint = document.createElement('div');\n    hint.className = 'veo-pick-hint';\n    hint.textContent = options.hint ?? 'Selecciona un elemento · Esc para cancelar';\n\n    shadow.append(style, this.box, this.label, hint);\n    document.body.appendChild(host);\n    this.host = host;\n\n    document.addEventListener('mousemove', this.onMove, true);\n    document.addEventListener('click', this.onClick, true);\n    document.addEventListener('mousedown', this.swallow, true);\n    document.addEventListener('mouseup', this.swallow, true);\n    document.addEventListener('keydown', this.onKey, true);\n    window.addEventListener('scroll', this.reposition, true);\n    window.addEventListener('resize', this.reposition);\n  }\n\n  stop(): void {\n    document.removeEventListener('mousemove', this.onMove, true);\n    document.removeEventListener('click', this.onClick, true);\n    document.removeEventListener('mousedown', this.swallow, true);\n    document.removeEventListener('mouseup', this.swallow, true);\n    document.removeEventListener('keydown', this.onKey, true);\n    window.removeEventListener('scroll', this.reposition, true);\n    window.removeEventListener('resize', this.reposition);\n\n    if (this.host?.parentNode) this.host.parentNode.removeChild(this.host);\n    this.host = null;\n    this.box = null;\n    this.label = null;\n    this.current = null;\n    this.onPick = null;\n    this.onCancel = null;\n  }\n\n  /** ¿Es un nodo de nuestro propio overlay? (no debe ser seleccionable). */\n  private isOwn(target: EventTarget | null): boolean {\n    return target instanceof Node && this.host !== null && this.host.contains(target);\n  }\n\n  private onMove = (event: MouseEvent): void => {\n    const target = event.target;\n    if (!(target instanceof Element) || this.isOwn(target)) return;\n    this.current = target;\n    this.draw(target);\n  };\n\n  private onClick = (event: MouseEvent): void => {\n    const target = this.current ?? (event.target instanceof Element ? event.target : null);\n    if (!target || this.isOwn(target)) return;\n\n    // Evitar que la app reaccione al click de selección.\n    event.preventDefault();\n    event.stopPropagation();\n    event.stopImmediatePropagation();\n\n    const picked = this.describe(target);\n    const cb = this.onPick;\n    this.stop();\n    cb?.(picked);\n  };\n\n  private onKey = (event: KeyboardEvent): void => {\n    if (event.key !== 'Escape') return;\n    event.preventDefault();\n    event.stopPropagation();\n    const cb = this.onCancel;\n    this.stop();\n    cb?.();\n  };\n\n  /** Traga mousedown/mouseup durante el picking (evita focus/active de la app). */\n  private swallow = (event: MouseEvent): void => {\n    if (this.isOwn(event.target)) return;\n    event.preventDefault();\n    event.stopPropagation();\n  };\n\n  private reposition = (): void => {\n    if (this.current) this.draw(this.current);\n  };\n\n  /** Dibuja el recuadro de resalte y la etiqueta sobre el elemento dado. */\n  private draw(element: Element): void {\n    if (!this.box || !this.label) return;\n    const rect = element.getBoundingClientRect();\n\n    this.box.style.display = 'block';\n    this.box.style.top = `${rect.top}px`;\n    this.box.style.left = `${rect.left}px`;\n    this.box.style.width = `${rect.width}px`;\n    this.box.style.height = `${rect.height}px`;\n\n    const shortSel = buildSelectorPath(element, 0);\n    this.label.textContent = '';\n    const sel = document.createElement('div');\n    sel.className = 'veo-pick-sel';\n    sel.textContent = shortSel;\n    const dim = document.createElement('div');\n    dim.className = 'veo-pick-dim';\n    dim.textContent = `${Math.round(rect.width)} × ${Math.round(rect.height)}`;\n    this.label.append(sel, dim);\n\n    // Etiqueta debajo del recuadro; si no hay espacio, arriba.\n    this.label.style.display = 'block';\n    const LABEL_H = 48;\n    const placeAbove = rect.bottom + 8 + LABEL_H > window.innerHeight;\n    this.label.style.top = placeAbove\n      ? `${Math.max(8, rect.top - LABEL_H - 8)}px`\n      : `${rect.bottom + 8}px`;\n    this.label.style.left = `${Math.max(8, rect.left)}px`;\n  }\n\n  private describe(element: Element): PickedElement {\n    const rect = element.getBoundingClientRect();\n    return {\n      selector: buildSelectorPath(element, this.maxAncestors),\n      shortSelector: buildSelectorPath(element, 0),\n      tag: element.tagName.toLowerCase(),\n      id: element.id || null,\n      classes: filterHumanClasses(element),\n      text: (element.textContent ?? '').trim().slice(0, 120),\n      rect: {\n        x: Math.round(rect.left),\n        y: Math.round(rect.top),\n        width: Math.round(rect.width),\n        height: Math.round(rect.height),\n      },\n    };\n  }\n}\n\nlet activePicker: ElementPicker | null = null;\n\n/**\n * Inicia el modo de selección de elementos (inspector). Resalta lo que está\n * bajo el cursor y, al hacer click, entrega un selector CSS estable.\n * Devuelve un handle con `stop()`. Iniciar otro picker cierra el anterior.\n *\n * @example\n * ```ts\n * import { startElementPicker } from '@veo/sdk';\n *\n * const picker = startElementPicker({\n *   onPick: ({ selector }) => console.log('elegido:', selector),\n *   onCancel: () => console.log('cancelado'),\n * });\n * // picker.stop() para abortar manualmente.\n * ```\n */\nexport function startElementPicker(options: ElementPickerOptions): ElementPickerHandle {\n  if (!hasDocument()) {\n    return { stop: () => {} };\n  }\n  if (!activePicker) activePicker = new ElementPicker();\n  activePicker.start(options);\n  return { stop: () => activePicker?.stop() };\n}\n\n/** Cierra el picker activo, si lo hay. Idempotente. */\nexport function stopElementPicker(): void {\n  activePicker?.stop();\n}\n","/**\n * Lado APP del puente builder. Corre dentro de la app del cliente (vía\n * veo-builder.js). Si el contexto trae `?veoBuilder=<token>`, se conecta con el\n * editor de Veo, atiende comandos y devuelve el elemento elegido.\n *\n * Dos transportes:\n *  - **iframe/popup** (`resolveTarget` = opener/parent): el dashboard es la\n *    ventana principal y embebe/abre la app; le hablamos a esa ventana.\n *  - **panel inyectado** (`ctx.panel`): la app es top-level (login real) y NOSOTROS\n *    inyectamos el panel del editor encima (iframe al dashboard); le hablamos a\n *    ese iframe. Es el modo sin adaptación por app.\n *\n * Seguridad: solo acepta mensajes cuyo `origin` coincida con el del dashboard\n * (`veoBuilderOrigin` / `document.referrer`) y cuyo `token` coincida.\n */\nimport {\n  type BuilderClientContext,\n  clearBuilderToken,\n  resolveBuilderContext,\n} from '../../core/builder-token';\nimport { hasDocument, hasWindow } from '../../utils/safe-env';\nimport { closeGuidePreview, previewGuide } from '../guides/guide-preview';\nimport type { CompositeStep } from '../guides/types';\nimport { stepMatchesPage } from '../guides/url-match';\nimport { attachBlockDropTarget, type BlockDropTargetHandle } from './block-drop-target';\nimport { type BuilderCommand, type BuilderEvent, VEO_BUILDER_SOURCE } from './bridge-protocol';\nimport { type BuilderPanelHandle, injectBuilderPanel } from './builder-panel';\nimport { attachDesignManipulator, type DesignManipulatorHandle } from './design-manipulator';\nimport { type ElementPickerHandle, startElementPicker } from './element-picker';\n\nexport interface BuilderModeHandle {\n  /** Desconecta el puente y limpia picker/preview/panel. */\n  teardown(): void;\n}\n\n/**\n * Inicializa el modo builder si hay contexto (URL o persistido). Devuelve un\n * handle, o `null` si no estamos en modo builder o no hay canal con el editor.\n * Es seguro llamarla siempre.\n */\nexport function initBuilderMode(): BuilderModeHandle | null {\n  if (!hasWindow() || !hasDocument()) return null;\n\n  // Contexto de la URL o de sessionStorage: sobrevive al redirect del guard de\n  // auth (que suele tirar el query string) y a un login en la misma pestaña.\n  const ctx = resolveBuilderContext();\n  if (!ctx) return null;\n\n  const token = ctx.token;\n  const dashboardOrigin = resolveDashboardOrigin(ctx.origin);\n  if (!dashboardOrigin) return null;\n\n  let picker: ElementPickerHandle | null = null;\n  let panel: BuilderPanelHandle | null = null;\n  let staticTarget: Window | null = null;\n  let manipulator: DesignManipulatorHandle | null = null;\n  let dropTarget: BlockDropTargetHandle | null = null;\n  /** Fantasma que sigue el cursor durante el drag de un bloque de la paleta. */\n  let dragGhost: HTMLElement | null = null;\n  /** Paso mostrado por la preview activa (destino de los drops de bloque). */\n  let previewStepIndex = 0;\n  /** Preview que llegó DURANTE un drag: se aplica al terminar el gesto. */\n  let pendingPreview: Extract<BuilderCommand, { type: 'preview' }> | null = null;\n  /** Último comando de preview: se re-evalúa al navegar (targeting por-página). */\n  let lastPreview: Extract<BuilderCommand, { type: 'preview' }> | null = null;\n  const getTarget = (): Window | null => (panel ? panel.target() : staticTarget);\n\n  const post = (event: BuilderEvent): void => {\n    getTarget()?.postMessage({ source: VEO_BUILDER_SOURCE, token, ...event }, dashboardOrigin);\n  };\n\n  /**\n   * ¿El paso que se está previsualizando aplica a la URL ACTUAL? El editor debe\n   * reflejar el targeting por-página real: si el paso apunta a otra página, la\n   * preview NO se muestra (igual que el runtime). `sitewide`/sin pageLocation →\n   * siempre true, así el editado normal no se ve afectado.\n   */\n  const previewMatchesPage = (cmd: Extract<BuilderCommand, { type: 'preview' }>): boolean => {\n    const steps = cmd.guide.guideSteps as unknown as CompositeStep[] | undefined;\n    const step = steps?.[cmd.guide.startStepIndex ?? 0];\n    return stepMatchesPage(step?.pageLocation, window.location.href);\n  };\n\n  /** Aplica la preview respetando el targeting de página; si no aplica, la cierra. */\n  const applyPreviewGated = (cmd: Extract<BuilderCommand, { type: 'preview' }>): void => {\n    lastPreview = cmd;\n    if (previewMatchesPage(cmd)) {\n      applyPreview(cmd);\n    } else {\n      manipulator?.detach();\n      manipulator = null;\n      dropTarget?.detach();\n      dropTarget = null;\n      closeGuidePreview();\n    }\n  };\n\n  const applyPreview = (cmd: Extract<BuilderCommand, { type: 'preview' }>): void => {\n    manipulator?.detach();\n    manipulator = null;\n    dropTarget?.detach();\n    dropTarget = null;\n    previewStepIndex = cmd.guide.startStepIndex ?? 0;\n    const handle = previewGuide(cmd.guide);\n    if (!cmd.editable) return;\n    void handle.ready.then((result) => {\n      if (!result.rendered) return;\n      const host = handle.host();\n      if (!host) return;\n      manipulator = attachDesignManipulator({\n        host,\n        guideType: cmd.guide.guideType,\n        stepIndex: cmd.guide.startStepIndex ?? 0,\n        onCommit: (payload) => post({ type: 'design-updated', payload }),\n        onGestureEnd: () => {\n          if (!pendingPreview) return;\n          const queued = pendingPreview;\n          pendingPreview = null;\n          applyPreviewGated(queued);\n        },\n      });\n      // Paleta → guía: soltar un bloque del panel sobre la preview lo inserta.\n      dropTarget = attachBlockDropTarget({\n        host,\n        stepIndex: cmd.guide.startStepIndex ?? 0,\n        onDrop: (payload) => post({ type: 'block-dropped', payload }),\n      });\n    });\n  };\n\n  const hideDragGhost = (): void => {\n    dragGhost?.remove();\n    dragGhost = null;\n  };\n\n  const moveDragGhost = (x: number, y: number, label: string): void => {\n    if (!dragGhost) {\n      dragGhost = document.createElement('div');\n      dragGhost.style.cssText =\n        'position:fixed;padding:4px 10px;border-radius:999px;background:#1c1917;color:#fff;' +\n        'font:12px/1.4 system-ui,sans-serif;box-shadow:0 4px 14px rgba(0,0,0,0.35);' +\n        'border:1px solid rgba(255,255,255,0.25);pointer-events:none;z-index:2147483647;';\n      document.body.appendChild(dragGhost);\n    }\n    dragGhost.textContent = label;\n    dragGhost.style.left = `${x + 14}px`;\n    dragGhost.style.top = `${y + 12}px`;\n  };\n\n  /**\n   * Drag de bloque por pointer: coords relativas al iframe del panel → página.\n   * En pop-out no hay mapeo (otra ventana) — se ignora.\n   */\n  const handleBlockDrag = (cmd: Extract<BuilderCommand, { type: 'block-drag' }>): void => {\n    const rect = panel?.frameRect();\n    if (!rect || !dropTarget) {\n      if (cmd.phase !== 'move') hideDragGhost();\n      dropTarget?.cancelHover();\n      return;\n    }\n    const x = rect.left + cmd.x;\n    const y = rect.top + cmd.y;\n    if (cmd.phase === 'move') {\n      moveDragGhost(x, y, cmd.label || cmd.blockType);\n      dropTarget.hoverAt(x, y);\n      return;\n    }\n    hideDragGhost();\n    if (cmd.phase === 'cancel') {\n      dropTarget.cancelHover();\n      return;\n    }\n    const spotAt = dropTarget.dropAt(x, y);\n    if (spotAt) {\n      post({\n        type: 'block-dropped',\n        payload: { stepIndex: previewStepIndex, blockType: cmd.blockType, ...spotAt },\n      });\n    }\n  };\n\n  const handleCommand = (cmd: BuilderCommand): void => {\n    switch (cmd.type) {\n      case 'panel-ready':\n        // El panel cargó y ya escucha → recién ahora le mandamos `ready`.\n        post({ type: 'ready' });\n        break;\n      case 'start-picker':\n        picker?.stop();\n        picker = startElementPicker({\n          onPick: (payload) => {\n            picker = null;\n            post({ type: 'picked', payload });\n          },\n          onCancel: () => {\n            picker = null;\n            post({ type: 'pick-cancelled' });\n          },\n          ...(cmd.maxAncestors !== undefined ? { maxAncestors: cmd.maxAncestors } : {}),\n          ...(cmd.hint !== undefined ? { hint: cmd.hint } : {}),\n        });\n        break;\n      case 'stop-picker':\n        picker?.stop();\n        picker = null;\n        break;\n      case 'preview':\n        if (!cmd.guide) break;\n        // Mientras hay un drag en curso, no remontar la preview debajo del\n        // mouse del autor: se encola el ÚLTIMO comando y se aplica al soltar.\n        if (manipulator?.isDragging()) pendingPreview = cmd;\n        else applyPreviewGated(cmd);\n        break;\n      case 'block-drag':\n        handleBlockDrag(cmd);\n        break;\n      case 'close-preview':\n        manipulator?.detach();\n        manipulator = null;\n        dropTarget?.detach();\n        dropTarget = null;\n        hideDragGhost();\n        pendingPreview = null;\n        lastPreview = null;\n        closeGuidePreview();\n        break;\n      case 'teardown':\n        teardown();\n        break;\n    }\n  };\n\n  const onMessage = (event: MessageEvent): void => {\n    if (event.origin !== dashboardOrigin) return;\n    const data = event.data as { source?: unknown; token?: unknown } | null;\n    if (!data || data.source !== VEO_BUILDER_SOURCE || data.token !== token) return;\n    handleCommand(data as BuilderCommand);\n  };\n\n  const onPageHide = (): void => post({ type: 'closed' });\n\n  // ── Watcher de navegación (SPA): al cambiar de página, re-evalúa la preview\n  // contra su targeting por-página (aparece/desaparece como en el runtime). ──\n  const onNav = (): void => {\n    if (lastPreview && !manipulator?.isDragging()) applyPreviewGated(lastPreview);\n  };\n  const origPush = window.history.pushState;\n  const origReplace = window.history.replaceState;\n  const installNavWatcher = (): void => {\n    window.history.pushState = function pushState(this: History, ...args) {\n      const r = origPush.apply(this, args as Parameters<History['pushState']>);\n      onNav();\n      return r;\n    };\n    window.history.replaceState = function replaceState(this: History, ...args) {\n      const r = origReplace.apply(this, args as Parameters<History['replaceState']>);\n      onNav();\n      return r;\n    };\n    window.addEventListener('popstate', onNav);\n    window.addEventListener('hashchange', onNav);\n  };\n  const removeNavWatcher = (): void => {\n    window.history.pushState = origPush;\n    window.history.replaceState = origReplace;\n    window.removeEventListener('popstate', onNav);\n    window.removeEventListener('hashchange', onNav);\n  };\n\n  const teardown = (): void => {\n    window.removeEventListener('message', onMessage);\n    window.removeEventListener('pagehide', onPageHide);\n    removeNavWatcher();\n    picker?.stop();\n    picker = null;\n    manipulator?.detach();\n    manipulator = null;\n    dropTarget?.detach();\n    dropTarget = null;\n    hideDragGhost();\n    pendingPreview = null;\n    closeGuidePreview();\n    post({ type: 'closed' }); // avisar al editor ANTES de sacar el panel\n    panel?.teardown();\n    panel = null;\n    clearBuilderToken(); // salir del modo builder: no re-activar en la próxima carga\n  };\n\n  // Transporte: panel inyectado (app top-level) o iframe/popup (embebida).\n  if (ctx.panel) {\n    panel = injectBuilderPanel({\n      dashboardOrigin,\n      token,\n      appOrigin: window.location.origin,\n      guide: ctx.guide,\n      panelPath: ctx.panelPath,\n      onClose: () => teardown(),\n    });\n  } else {\n    staticTarget = resolveTarget();\n    if (!staticTarget) return null;\n  }\n\n  const activate = (): void => {\n    window.addEventListener('message', onMessage);\n    window.addEventListener('pagehide', onPageHide);\n    installNavWatcher();\n    // Panel: esperamos el `panel-ready` del iframe para postear `ready` (todavía\n    // puede no tener su listener). iframe/popup: el opener ya escucha → posteamos ya.\n    if (!ctx.panel) post({ type: 'ready' });\n  };\n\n  // Modo panel inyectado: la seguridad ya la da la sesión AUTENTICADA del\n  // dashboard (el panel es un iframe del dashboard con Clerk) — el token es solo\n  // correlación. Activamos directo, SIN verify: el verify contra el backend\n  // podría fallar por expiración del token durante el login (que tarda), dejando\n  // el panel para siempre en \"conectando…\".\n  //\n  // Modo iframe/popup (embebido): verificamos el token firmado antes de activar\n  // (si `init()` dejó la config). Solo bloquea si el backend dice {valid:false}.\n  const cfg = (window as unknown as { __veoBuilder?: { apiKey?: string; apiUrl?: string } })\n    .__veoBuilder;\n  if (!ctx.panel && cfg?.apiKey && cfg?.apiUrl) {\n    void verifyBuilderToken(cfg.apiUrl, cfg.apiKey, token).then((ok) => {\n      if (ok) activate();\n      else if (window.console) console.warn('[veo] token de builder inválido — modo no activado');\n    });\n  } else {\n    activate();\n  }\n\n  return { teardown };\n}\n\n/**\n * Verifica el token con el backend. Solo devuelve `false` (no activar) cuando el\n * backend responde explícitamente `{valid:false}` (token forjado/expirado/de\n * otro workspace). Ante 404/red caída/errores transitorios devuelve `true`\n * (best-effort) para no brickear el modo builder.\n */\nasync function verifyBuilderToken(apiUrl: string, apiKey: string, token: string): Promise<boolean> {\n  try {\n    const url = `${apiUrl.replace(/\\/+$/, '')}/v1/builder/verify`;\n    const res = await fetch(url, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'X-Api-Key': apiKey },\n      body: JSON.stringify({ token }),\n    });\n    if (!res.ok) return true; // no pudimos verificar → best-effort\n    const data = (await res.json().catch(() => null)) as { valid?: unknown } | null;\n    return data?.valid !== false;\n  } catch {\n    return true; // red caída / sin backend → best-effort\n  }\n}\n\n/** Ventana con la que hablar en modo iframe/popup: el opener o el parent. */\nfunction resolveTarget(): Window | null {\n  if (window.opener && window.opener !== window) return window.opener as Window;\n  if (window.parent && window.parent !== window) return window.parent;\n  return null;\n}\n\nfunction resolveDashboardOrigin(originHint: string | null): string | null {\n  // Origen de la URL o persistido en el primer arranque (antes del redirect).\n  if (originHint) {\n    try {\n      return new URL(originHint).origin;\n    } catch {\n      return null;\n    }\n  }\n  // Fallback: el referrer. Poco fiable tras un redirect same-origin (apunta a la\n  // propia app), por eso el origen persistido va primero.\n  if (hasDocument() && document.referrer) {\n    try {\n      return new URL(document.referrer).origin;\n    } catch {\n      return null;\n    }\n  }\n  return null;\n}\n\n// Tipo re-exportado para consumidores que tipan el contexto.\nexport type { BuilderClientContext };\n","/**\n * Lado DASHBOARD del puente builder. Abre la app del cliente en un popup,\n * en modo builder, y expone una API para pedirle que seleccione un elemento\n * o previsualice una guía. Pensado para importarse en el dashboard\n * (`import { createBuilderSession } from '@veo/sdk/builder'`).\n *\n * Seguridad: solo procesa mensajes cuyo `origin` sea el de la app y cuyo\n * `token` coincida con el de esta sesión.\n */\nimport { hasWindow } from '../../utils/safe-env';\nimport type { PreviewGuideInput } from '../guides/guide-preview';\nimport {\n  BUILDER_ORIGIN_PARAM,\n  BUILDER_TOKEN_PARAM,\n  type BuilderCommand,\n  VEO_BUILDER_SOURCE,\n} from './bridge-protocol';\nimport type { PickedElement } from './element-picker';\n\nexport interface BuilderSessionOptions {\n  /** URL de la app del cliente a abrir en modo builder. */\n  appUrl: string;\n  /** Token de la sesión (idealmente emitido/firmado por el backend). */\n  token: string;\n  /** Origen al que la app debe responder. Default: `location.origin`. */\n  dashboardOrigin?: string;\n  /** La app está lista y escuchando comandos. */\n  onReady?: () => void;\n  /** El usuario eligió un elemento. */\n  onPicked?: (picked: PickedElement) => void;\n  /** El usuario canceló la selección (Esc). */\n  onCancelled?: () => void;\n  /** La app cerró el modo builder (o el popup se cerró). */\n  onClosed?: () => void;\n  /**\n   * Si se pasa, la app se embebe en este `<iframe>` (modo estudio in-app) en\n   * lugar de abrirse en un popup. El lado app ya habla con `window.parent`,\n   * así que el puente funciona igual. La sesión setea el `src` del iframe.\n   */\n  frame?: HTMLIFrameElement;\n  /** Nombre de la ventana popup. Default: `veo-builder`. */\n  windowName?: string;\n  /** Features del popup. Default: ventana de ~1280×860. */\n  windowFeatures?: string;\n}\n\nexport interface BuilderSession {\n  /** Pide a la app que entre en modo selección de elemento. */\n  startPicker(options?: { maxAncestors?: number; hint?: string }): void;\n  /** Cancela la selección en curso. */\n  stopPicker(): void;\n  /** Pide a la app que previsualice una guía. */\n  preview(guide: PreviewGuideInput): void;\n  /** Cierra la preview activa en la app. */\n  closePreview(): void;\n  /** Cierra el popup y desconecta el puente. */\n  close(): void;\n}\n\nconst DEFAULT_FEATURES = 'popup,width=1280,height=860';\nconst POPUP_POLL_MS = 600;\n\nexport function createBuilderSession(options: BuilderSessionOptions): BuilderSession {\n  if (!hasWindow()) return noopSession();\n\n  const dashboardOrigin = options.dashboardOrigin ?? window.location.origin;\n  const appOrigin = safeOrigin(options.appUrl);\n  const url = buildAppUrl(options.appUrl, options.token, dashboardOrigin);\n\n  const frame = options.frame ?? null;\n  const useFrame = frame !== null;\n\n  let popup: Window | null = null;\n  if (useFrame) {\n    // biome-ignore lint/style/noNonNullAssertion: useFrame garantiza frame\n    frame!.src = url;\n  } else {\n    popup = window.open(\n      url,\n      options.windowName ?? 'veo-builder',\n      options.windowFeatures ?? DEFAULT_FEATURES,\n    );\n  }\n\n  /** Ventana destino de los comandos: el popup o el contentWindow del iframe. */\n  const targetWindow = (): Window | null => (useFrame ? (frame?.contentWindow ?? null) : popup);\n\n  const post = (command: BuilderCommand): void => {\n    const w = targetWindow();\n    if (!w) return;\n    if (!useFrame && popup?.closed) return;\n    w.postMessage(\n      { source: VEO_BUILDER_SOURCE, token: options.token, ...command },\n      appOrigin ?? '*',\n    );\n  };\n\n  let pollTimer: ReturnType<typeof setInterval> | undefined;\n\n  const cleanup = (): void => {\n    window.removeEventListener('message', onMessage);\n    if (pollTimer !== undefined) {\n      clearInterval(pollTimer);\n      pollTimer = undefined;\n    }\n  };\n\n  const onMessage = (event: MessageEvent): void => {\n    if (appOrigin && event.origin !== appOrigin) return;\n    const data = event.data as {\n      source?: unknown;\n      token?: unknown;\n      type?: unknown;\n      payload?: unknown;\n    } | null;\n    if (!data || data.source !== VEO_BUILDER_SOURCE || data.token !== options.token) return;\n\n    switch (data.type) {\n      case 'ready':\n        options.onReady?.();\n        break;\n      case 'picked':\n        if (data.payload) options.onPicked?.(data.payload as PickedElement);\n        break;\n      case 'pick-cancelled':\n        options.onCancelled?.();\n        break;\n      case 'closed':\n        cleanup();\n        options.onClosed?.();\n        break;\n    }\n  };\n\n  window.addEventListener('message', onMessage);\n\n  // Detectar cierre manual del popup (el usuario cierra la ventana). En modo\n  // iframe el ciclo de vida lo controla el dashboard (no hay nada que pollear).\n  if (!useFrame) {\n    pollTimer = setInterval(() => {\n      if (popup?.closed) {\n        cleanup();\n        options.onClosed?.();\n      }\n    }, POPUP_POLL_MS);\n  }\n\n  return {\n    startPicker: (o) =>\n      post({\n        type: 'start-picker',\n        ...(o?.maxAncestors !== undefined ? { maxAncestors: o.maxAncestors } : {}),\n        ...(o?.hint !== undefined ? { hint: o.hint } : {}),\n      }),\n    stopPicker: () => post({ type: 'stop-picker' }),\n    preview: (guide) => post({ type: 'preview', guide }),\n    closePreview: () => post({ type: 'close-preview' }),\n    close: () => {\n      post({ type: 'teardown' });\n      if (useFrame) {\n        if (frame) frame.src = 'about:blank';\n      } else if (popup && !popup.closed) {\n        popup.close();\n      }\n      cleanup();\n    },\n  };\n}\n\nfunction buildAppUrl(appUrl: string, token: string, dashboardOrigin: string): string {\n  try {\n    const u = new URL(appUrl, window.location.href);\n    u.searchParams.set(BUILDER_TOKEN_PARAM, token);\n    u.searchParams.set(BUILDER_ORIGIN_PARAM, dashboardOrigin);\n    return u.toString();\n  } catch {\n    return appUrl;\n  }\n}\n\nfunction safeOrigin(url: string): string | null {\n  try {\n    return new URL(url, window.location.href).origin;\n  } catch {\n    return null;\n  }\n}\n\nfunction noopSession(): BuilderSession {\n  return {\n    startPicker: () => {},\n    stopPicker: () => {},\n    preview: () => {},\n    closePreview: () => {},\n    close: () => {},\n  };\n}\n"]}