{"version":3,"sources":["../src/plugins/builder/block-drop-target.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/element-picker.ts","../src/plugins/builder/builder-mode.ts","../src/plugins/builder/builder-session.ts"],"names":["el","MIN_W","MIN_H","clamp"],"mappings":"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","file":"chunk-3ZOKCQ54.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/**\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  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  /** Qué muestra el panel: ajustes de activación o el paso activo. */\n  section: 'activation' | 'step' | 'badge' | 'target';\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. */\nexport type ChromeAction =\n  | { action: 'select-activation' }\n  | { action: 'select-step'; index: number }\n  | { action: 'add-step' }\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  // Estado de la preview (ver `PreviewStatus`).\n  | { type: 'preview-status'; payload: PreviewStatus }\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  // `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  | { 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  // 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.\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  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  const height = (): number => CHROME_TOPBAR_H + (collapsed ? 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;\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 date = shortDate(s.createdAt);\n    nameEl.textContent = `${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      const card = stepCard(thumb, st.label, s.section === 'step' && s.activeStep === i);\n      card.addEventListener('click', () => act({ action: 'select-step', index: i }));\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\nfunction stepCard(inner: string, label: string, active: boolean): HTMLButtonElement {\n  const b = el(\n    'button',\n    `veo-step${active ? ' is-active' : ''}`,\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\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.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  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.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\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    };\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  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    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 * 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  /** 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\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 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    // 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.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    // Alt/Opción + clic: pasa a la app (abrir menús/desplegables) sin seleccionar.\n    if (event.altKey) return;\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 (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: (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 { isDeviceAllowed } from '../guides/activation-devices';\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 {\n  type BuilderCommand,\n  type BuilderEvent,\n  type PreviewStatus,\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';\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  /** 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  /** 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  /** 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 withholdPreview = (): void => {\n    manipulator?.detach();\n    manipulator = null;\n    dropTarget?.detach();\n    dropTarget = null;\n    closeGuidePreview();\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    lastPreview = 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 (cmd.honorTrigger && !previewMode && devices && !isDeviceAllowed(devices)) {\n      cancelPreviewDelay();\n      withholdPreview();\n      postPreviewStatus({ state: 'device-mismatch', devices: devices as 'desktop' | 'mobile' });\n      return;\n    }\n    applyPreview(cmd);\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      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    manipulator?.detach();\n    manipulator = null;\n    dropTarget?.detach();\n    dropTarget = null;\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    const gate = cmd.honorTrigger && !previewFired && !previewMode;\n    if (gate && (trig === 'on_click' || trig === 'on_hover') && sel) {\n      cancelPreviewDelay();\n      closeGuidePreview();\n      armPreviewTrigger(sel, trig);\n      return;\n    }\n    const delayMs = trig === 'delayed' ? (rules?.delayMs ?? 0) : 0;\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 handle = previewGuide({\n      ...cmd.guide,\n      onClosed: () => {\n        // El autor cerró la guía con ✕ → vuelve a esperar la interacción/retraso.\n        manipulator?.detach();\n        manipulator = null;\n        dropTarget?.detach();\n        dropTarget = null;\n        previewFired = false;\n        if (lastPreview) applyPreviewGated(lastPreview);\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) 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`. 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        panel?.setTitle(\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.steps[cmd.state.activeStep]?.label ?? 'Paso'),\n        );\n        break;\n      case 'panel-visibility':\n        panel?.setVisible(cmd.visible);\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          manipulator?.detach();\n          manipulator = null;\n          dropTarget?.detach();\n          dropTarget = null;\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        });\n        break;\n      }\n      case 'stop-picker':\n        picker?.stop();\n        picker = null;\n        chrome?.setHidden(false);\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        disarmPreviewTrigger();\n        cancelPreviewDelay();\n        previewFired = 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    manipulator?.detach();\n    manipulator = null;\n    dropTarget?.detach();\n    dropTarget = null;\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    chrome?.teardown();\n    chrome = 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    // 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            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            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 * 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"]}