veo-sdk 0.3.7 → 0.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/builder-YYMD7MNK.mjs +5 -0
- package/dist/{builder-7MBMYL26.mjs.map → builder-YYMD7MNK.mjs.map} +1 -1
- package/dist/builder.cjs +19 -3
- package/dist/builder.cjs.map +1 -1
- package/dist/builder.mjs +4 -4
- package/dist/{chunk-RNHOBE2D.mjs → chunk-7OMKQH5J.mjs} +3 -3
- package/dist/{chunk-RNHOBE2D.mjs.map → chunk-7OMKQH5J.mjs.map} +1 -1
- package/dist/{chunk-4VJIILXF.mjs → chunk-E2KQJBUT.mjs} +21 -5
- package/dist/chunk-E2KQJBUT.mjs.map +1 -0
- package/dist/{chunk-734ORVMM.mjs → chunk-T4BZ53QV.mjs} +3 -3
- package/dist/{chunk-734ORVMM.mjs.map → chunk-T4BZ53QV.mjs.map} +1 -1
- package/dist/index.cjs +19 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +5 -5
- package/dist/veo-builder.js +11 -5
- package/dist/veo-builder.js.map +1 -1
- package/dist/veo-guides.js +9 -3
- package/dist/veo-guides.js.map +1 -1
- package/package.json +1 -1
- package/dist/builder-7MBMYL26.mjs +0 -5
- package/dist/chunk-4VJIILXF.mjs.map +0 -1
package/dist/veo-guides.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/safe-env.ts","../src/plugins/guides/constants.ts","../src/plugins/guides/guide-frequency-cache.ts","../src/plugins/guides/guide-resolver-client.ts","../src/plugins/guides/guide-tracker-client.ts","../src/plugins/guides/guide-tracker-queue.ts","../src/plugins/guides/block-builder.ts","../src/plugins/guides/walkthrough-block-builder.ts","../src/plugins/guides/guide-design.ts","../src/plugins/guides/styles.ts","../src/plugins/guides/renderers/base-renderer.ts","../src/plugins/guides/renderers/banner-renderer.ts","../node_modules/.pnpm/@floating-ui+utils@0.2.11/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../node_modules/.pnpm/@floating-ui+core@1.7.5/node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../node_modules/.pnpm/@floating-ui+utils@0.2.11/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../node_modules/.pnpm/@floating-ui+dom@1.7.6/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../src/plugins/guides/wait-for-element.ts","../src/utils/uuid.ts","../src/plugins/guides/renderers/custom-frame.ts","../src/plugins/guides/renderers/custom-renderer.ts","../src/plugins/guides/form-content.ts","../src/plugins/guides/renderers/form-renderer.ts","../src/plugins/guides/inline-host.ts","../src/plugins/guides/renderers/inline-custom-renderer.ts","../src/plugins/guides/renderers/inline-form-renderer.ts","../src/plugins/guides/renderers/inline-renderer.ts","../src/plugins/guides/renderers/modal-renderer.ts","../src/plugins/guides/renderers/floating-arrow.ts","../src/plugins/guides/renderers/tooltip-renderer.ts","../src/plugins/guides/renderers/walkthrough-renderer.ts","../src/plugins/guides/walkthrough-state.ts","../src/plugins/guides/guides-controller.ts","../src/plugins/guides/guide-preview.ts","../src/plugins/guides/preview-mode.ts","../src/plugins/guides/index.ts"],"names":["hasWindow","hasDocument","SAFE_URL_PROTOCOLS","GUIDE_HOST_ATTR","FREQUENCY_CACHE_KEY_PREFIX","WALKTHROUGH_STATE_KEY_PREFIX","STATUS_PRIORITY","namespaceFromApiKey","apiKey","GuideFrequencyCache","namespace","guideId","displayFrequency","entry","status","existing","now","mutated","id","sorted","a","b","excess","tuple","raw","parsed","entries","item","e","serialized","GuideResolverClient","apiUrl","debug","endUserId","pageUrl","params","response","err","data","toWire","payload","wire","GuideTrackerClient","request","url","blob","GuideTrackerQueue","config","batch","results","i","result","onPagehide","onVisibility","reason","error","buildStepContent","step","doc","callbacks","container","blocks","normalizeBlocks","renderBlocks","renderLegacyStep","createCloseButton","isSafeUrl","img","heading","paragraph","actions","cta","action","ctaUrl","readCtaUrl","valid","block","btnBlock","buildButtonBlock","node","buildContentBlock","el","applyBlockStyle","btn","BLOCK_ALIGN_SELF","clampNum","min","max","style","kind","s","align","onClose","className","closeBtn","base","candidate","buildWalkthroughStepContent","stepIndex","totalSteps","counter","progress","dot","skipBtn","rightGroup","backBtn","isLastStep","primaryBtn","defaultLabel","DARK_THEME","ALIGN_JUSTIFY","ALIGN_SELF","ELEMENT_ALIGN_MODE","SHADOW","PRESET_POS","COLOR_RE","clamp","applyDesignVars","host","key","value","px","py","applyElementVars","prefix","GUIDE_STYLES","BaseRenderer","shadow","root","fn","BannerRenderer","context","idx","ownerDocument","position","banner","dismiss","content","round","createCoords","v","oppositeSideMap","start","end","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","getSideAxis","firstChar","getAlignmentAxis","getAlignmentSides","rects","rtl","alignment","alignmentAxis","length","mainAlignmentSide","getOppositePlacement","getExpandedPlacements","oppositePlacement","getOppositeAlignmentPlacement","lrPlacement","rlPlacement","tbPlacement","btPlacement","getSideList","side","isStart","getOppositeAxisPlacements","flipAlignment","direction","list","expandPaddingObject","padding","getPaddingObject","rectToClientRect","rect","x","y","width","height","computeCoordsFromPlacement","_ref","reference","floating","sideAxis","alignLength","isVertical","commonX","commonY","commonAlign","coords","detectOverflow","state","options","_await$platform$isEle","platform","elements","strategy","boundary","rootBoundary","elementContext","altBoundary","paddingObject","element","clippingClientRect","offsetParent","offsetScale","elementClientRect","MAX_RESET_COUNT","computePosition","middleware","platformWithDetectOverflow","statefulPlacement","resetCount","middlewareData","currentMiddleware","name","nextX","nextY","reset","arrow","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","largestPossiblePadding","minPadding","maxPadding","min$1","center","offset","shouldAddOffset","alignmentOffset","flip","_middlewareData$arrow","_middlewareData$flip","initialPlacement","checkMainAxis","checkCrossAxis","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","detectOverflowOptions","initialSideAxis","isBasePlacement","fallbackPlacements","hasFallbackAxisSideDirection","placements","overflow","overflows","overflowsData","sides","_middlewareData$flip2","_overflowsData$filter","nextIndex","nextPlacement","d","resetPlacement","_overflowsData$filter2","currentSideAxis","acc","originSides","convertValueToCoords","mainAxisMulti","crossAxisMulti","rawValue","mainAxis","crossAxis","_middlewareData$offse","diffCoords","shift","limiter","mainAxisCoord","crossAxisCoord","minSide","maxSide","limitedCoords","getNodeName","isNode","getWindow","_node$ownerDocument","getDocumentElement","isElement","isHTMLElement","isShadowRoot","isOverflowElement","overflowX","overflowY","display","getComputedStyle","isTableElement","isTopLayer","willChangeRe","containRe","isNotNone","isWebKitValue","isContainingBlock","elementOrCss","css","isWebKit","getContainingBlock","currentNode","getParentNode","isLastTraversableNode","getNodeScroll","getNearestOverflowAncestor","parentNode","getOverflowAncestors","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","getFrameElement","getCssDimensions","hasOffset","offsetWidth","offsetHeight","shouldFallback","unwrapElement","getScale","domElement","$","noOffsets","getVisualOffsets","shouldAddVisualOffsets","isFixed","floatingOffsetParent","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","left","top","getWindowScrollBarX","leftScroll","getHTMLOffset","documentElement","scroll","htmlRect","convertOffsetParentRelativeRectToViewportRelativeRect","topLayer","offsets","isOffsetParentAnElement","offsetRect","htmlOffset","getClientRects","getDocumentRect","html","body","SCROLLBAR_MAX","getViewportRect","visualViewport","visualViewportBased","windowScrollbarX","bodyStyles","bodyMarginInline","clippingStableScrollbarWidth","getInnerBoundingClientRect","getClientRectFromClippingAncestor","clippingAncestor","hasFixedPositionAncestor","stopNode","getClippingElementAncestors","cache","cachedResult","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","getClippingRect","clippingAncestors","firstRect","right","bottom","getDimensions","getRectRelativeToOffsetParent","setLeftRTLScrollbarOffset","isStaticPositioned","getTrueOffsetParent","polyfill","rawOffsetParent","getOffsetParent","svgOffsetParent","getElementRects","getOffsetParentFn","getDimensionsFn","floatingDimensions","isRTL","mergedOptions","platformWithCache","waitForElement","selector","timeoutMs","resolve","safeQuery","resolved","finish","observer","timer","uuidv7","timeHex","random","hex","mountCustomFrame","opts","iframe","hasFixedHeight","toCssSize","token","wantsTailwind","buildSrcdoc","collectHostTokens","close","onMessage","event","isRecord","rootStyle","decls","seen","bodyFont","js","bridge","tokensStyle","escapeClosing","tailwind","code","tag","rx","DEFAULT_PLACEMENT","DEFAULT_OFFSET","DEFAULT_WIDTH","CustomRenderer","anchor","wrapper","cleanup","applyFloatingPosition","update","reposition","ox","oy","vertical","horizontal","mountFormContent","card","fields","readers","form","field","read","buildField","submit","answers","ok","note","showThanks","thanks","noteEl","label","input","select","blank","opt","option","group","inputs","optionLabel","radio","text","checkbox","values","yesLabel","noLabel","optText","buildScale","btnClass","symbol","row","selected","buttons","n","active","FormRenderer","overlay","onKey","readInlinePosition","p","insertHost","keepHostAttached","InlineCustomRenderer","InlineFormRenderer","InlineRenderer","ModalRenderer","onBackdropOrEsc","STATIC_SIDE","positionArrow","arrowEl","prop","TooltipRenderer","tooltip","updatePosition","WalkthroughRenderer","WalkthroughStateManager","next","STATUS_BY_ACTION","GuidesController","client","httpClient","sessionId","guides","guide","renderer","delayMs","onInteraction","onTrack","eventName","properties","onFormSubmit","render","readStepRender","success","newState","dedupKey","cacheStatus","extractPath","type","res","r","PREVIEW_GUIDE_ID","GuidePreviewController","normalize","ready","safeDestroy","createSingleStepRenderer","shown","startIndex","index","prev","activeController","previewGuide","closeGuidePreview","activationRules","runPreviewMode","submitToBackend","veo","preview","show","chip","mountChip","handle","reshow","guidesPlugin","controller"],"mappings":"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","file":"veo-guides.js","sourcesContent":["/**\n * Helpers para detectar el entorno de ejecución (browser vs SSR/Node) y la\n * disponibilidad de APIs del navegador. El SDK debe poder importarse en Node\n * sin romperse, por eso todo acceso a globals del browser pasa por aquí.\n */\n\n/** ¿Existe el objeto global `window`? */\nexport function hasWindow(): boolean {\n return typeof window !== 'undefined';\n}\n\n/** ¿Existe el objeto global `document`? */\nexport function hasDocument(): boolean {\n return typeof document !== 'undefined';\n}\n\n/** ¿`localStorage` está disponible y es escribible? (puede fallar en modo incógnito) */\nexport function hasLocalStorage(): boolean {\n try {\n if (typeof localStorage === 'undefined') return false;\n const testKey = '__veo_test__';\n localStorage.setItem(testKey, '1');\n localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n}\n\n/** ¿`navigator.sendBeacon` está disponible? */\nexport function hasNavigatorSendBeacon(): boolean {\n return typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function';\n}\n","/** z-index muy alto para flotar sobre cualquier UI del cliente sin tapar dev tools. */\nexport const GUIDE_Z_INDEX = 2147483640;\n\n/** Tiempo máximo esperando que aparezca el elemento ancla de un tooltip. */\nexport const DEFAULT_ANCHOR_WAIT_MS = 5000;\n\n/** Protocolos permitidos en `imageUrl` y `style.ctaUrl`. */\nexport const SAFE_URL_PROTOCOLS: ReadonlyArray<string> = ['http:', 'https:'];\n\n/** Atributo data-* que marca un host de guía en el DOM (útil para tests). */\nexport const GUIDE_HOST_ATTR = 'data-veo-guide';\n\n/**\n * Prefijo del key de localStorage donde vive el cache de frequency.\n * Se completa con un identificador derivado del apiKey para evitar\n * contaminación cuando el mismo navegador corre varios workspaces.\n */\nexport const FREQUENCY_CACHE_KEY_PREFIX = 'veo:freq:';\n\n/** Tiempo entre flushes automáticos del tracker (ms). */\nexport const DEFAULT_TRACKER_FLUSH_INTERVAL_MS = 3000;\n\n/** Cuántas interactions se acumulan antes de un flush forzado. */\nexport const DEFAULT_TRACKER_BATCH_SIZE = 5;\n\n/** Reintentos por item antes de descartar (se aplica con backoff implícito por el timer). */\nexport const DEFAULT_TRACKER_MAX_RETRIES = 3;\n\n/** Límite de entradas en el cache local — protege contra bloat de localStorage. */\nexport const FREQUENCY_CACHE_MAX_ENTRIES = 500;\n\n/** TTL para entradas del cache. Tras esto se vuelven a re-evaluar contra el backend. */\nexport const FREQUENCY_CACHE_TTL_MS = 90 * 24 * 60 * 60 * 1000;\n\n/**\n * Prefijo del key de localStorage donde vive el estado del walkthrough\n * activo. Se completa con el mismo `namespaceFromApiKey` que el frequency\n * cache para que dos workspaces en el mismo navegador no se pisen.\n */\nexport const WALKTHROUGH_STATE_KEY_PREFIX = 'veo:walkthrough_state:';\n\n/**\n * Si pasan 30 min sin progreso (`advance`/`back`), el walkthrough se\n * considera abandonado. El estado se limpia de localStorage al detectarlo\n * y NO se envía `completed` al backend (porque no se completó).\n */\nexport const WALKTHROUGH_ABANDONMENT_TIMEOUT_MS = 30 * 60 * 1000;\n\n/**\n * Tiempo máximo esperando que aparezca el selector del step actual en el\n * DOM. Más restrictivo que `DEFAULT_ANCHOR_WAIT_MS` porque en walkthroughs\n * la página correcta debería estar ya cargada al resumir.\n */\nexport const WALKTHROUGH_STEP_SELECTOR_TIMEOUT_MS = 5000;\n","import {\n FREQUENCY_CACHE_KEY_PREFIX,\n FREQUENCY_CACHE_MAX_ENTRIES,\n FREQUENCY_CACHE_TTL_MS,\n} from './constants';\nimport type { DisplayFrequency, FrequencyCacheEntry, FrequencyStatus } from './types';\n\n/** Prioridad de status para no degradar shown→dismissed→… */\nconst STATUS_PRIORITY: Record<FrequencyStatus, number> = {\n shown: 1,\n dismissed: 2,\n completed: 2,\n};\n\n/**\n * Namespace short y estable derivado del apiKey. NO es cripto: solo evita\n * que dos apps que comparten el navegador pisen sus caches. El apiKey\n * público (`pk_*`) ya es workspace-único, así que usar sus últimos 16\n * caracteres alcanza para diferenciar.\n */\nexport function namespaceFromApiKey(apiKey: string): string {\n return apiKey.slice(-16) || 'default';\n}\n\n/**\n * Cache persistente de \"qué guías ya vio/cerró este usuario\". Vive en\n * `localStorage` con key namespaceada para evitar colisión entre\n * workspaces que corren en el mismo navegador.\n *\n * No es source of truth — el backend siempre manda. Esta cache solo\n * evita el flash visual de re-pintar una guía que el usuario ya cerró\n * antes de que el roundtrip al backend termine.\n */\nexport class GuideFrequencyCache {\n private readonly storageKey: string;\n private cache: Map<string, FrequencyCacheEntry>;\n\n constructor(namespace: string) {\n this.storageKey = `${FREQUENCY_CACHE_KEY_PREFIX}${namespace}`;\n this.cache = this.load();\n this.prune();\n }\n\n /**\n * Decide si una guía debe filtrarse localmente antes de pintarla.\n *\n * - `every_visit` / `always` → nunca filtra (siempre re-pinta).\n * - `once` → cualquier entry registrada filtra (verla ya cuenta).\n * - `until_dismissed` → si fue descartada O COMPLETADA (responder un\n * form / terminar un walkthrough es más fuerte que descartar — sin\n * esto, una encuesta seguiría preguntando después de respondida).\n */\n shouldFilter(guideId: string, displayFrequency: DisplayFrequency): boolean {\n if (displayFrequency === 'every_visit' || displayFrequency === 'always') return false;\n\n const entry = this.cache.get(guideId);\n if (!entry) return false;\n\n if (displayFrequency === 'once') return true;\n if (displayFrequency === 'until_dismissed') {\n return entry.status === 'dismissed' || entry.status === 'completed';\n }\n // `until_answered` (forms): solo COMPLETAR filtra localmente. El descarte\n // no la silencia — y si las props ya tienen valor por otro medio, es el\n // BACKEND quien la excluye del resolve (acá no conocemos los traits).\n if (displayFrequency === 'until_answered') return entry.status === 'completed';\n return false;\n }\n\n /**\n * Registra/actualiza la entry de una guía. Nunca degrada un estado más\n * fuerte (no convierte `dismissed` en `shown` por un re-render). Persiste\n * cada llamada — escribir a localStorage es lo bastante barato.\n */\n record(guideId: string, status: FrequencyStatus): void {\n const existing = this.cache.get(guideId);\n if (existing && STATUS_PRIORITY[status] < STATUS_PRIORITY[existing.status]) {\n return;\n }\n this.cache.set(guideId, {\n guideId,\n status,\n lastInteractionAt: Date.now(),\n });\n this.persist();\n }\n\n /** Limpia el cache (botón \"reset\" del demo, tests). */\n clear(): void {\n this.cache.clear();\n this.persist();\n }\n\n /** Útil para debugging — devuelve un snapshot. */\n snapshot(): FrequencyCacheEntry[] {\n return Array.from(this.cache.values());\n }\n\n /**\n * Limpia entries expiradas por TTL y, si aún excede el límite, descarta\n * las más viejas hasta caber. Se ejecuta una vez en el constructor; no\n * vale la pena correrlo a cada lectura.\n */\n private prune(): void {\n const now = Date.now();\n let mutated = false;\n\n for (const [id, entry] of this.cache) {\n if (now - entry.lastInteractionAt > FREQUENCY_CACHE_TTL_MS) {\n this.cache.delete(id);\n mutated = true;\n }\n }\n\n if (this.cache.size > FREQUENCY_CACHE_MAX_ENTRIES) {\n const sorted = Array.from(this.cache.entries()).sort(\n (a, b) => a[1].lastInteractionAt - b[1].lastInteractionAt,\n );\n const excess = this.cache.size - FREQUENCY_CACHE_MAX_ENTRIES;\n for (let i = 0; i < excess; i++) {\n const tuple = sorted[i];\n if (tuple) this.cache.delete(tuple[0]);\n }\n mutated = true;\n }\n\n if (mutated) this.persist();\n }\n\n private load(): Map<string, FrequencyCacheEntry> {\n if (typeof localStorage === 'undefined') return new Map();\n try {\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) return new Map();\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) return new Map();\n const entries: Array<[string, FrequencyCacheEntry]> = [];\n for (const item of parsed) {\n if (\n item &&\n typeof item === 'object' &&\n typeof (item as FrequencyCacheEntry).guideId === 'string' &&\n typeof (item as FrequencyCacheEntry).lastInteractionAt === 'number' &&\n ['shown', 'dismissed', 'completed'].includes((item as FrequencyCacheEntry).status)\n ) {\n const e = item as FrequencyCacheEntry;\n entries.push([e.guideId, e]);\n }\n }\n return new Map(entries);\n } catch {\n return new Map();\n }\n }\n\n private persist(): void {\n if (typeof localStorage === 'undefined') return;\n try {\n const serialized = JSON.stringify(Array.from(this.cache.values()));\n localStorage.setItem(this.storageKey, serialized);\n } catch {\n // QuotaExceeded o similar — el cache es opcional, no rompemos la app.\n }\n }\n}\n","import type { ResolvedGuide, ResolveGuidesResponse } from './types';\n\n/**\n * Wrapper sobre `GET /v1/guides/resolve`. Nunca lanza: cualquier error de\n * red o de parsing devuelve un array vacío, para que el plugin no rompa\n * la app del cliente.\n *\n * Importante: el endpoint usa `?pageUrl=...` (no `?url=...`) — el backend\n * valida con class-validator `IsUrl({ require_protocol: true })`.\n */\nexport class GuideResolverClient {\n constructor(\n private readonly apiUrl: string,\n private readonly apiKey: string,\n private readonly debug = false,\n ) {}\n\n async resolve(endUserId: string, pageUrl: string): Promise<ResolvedGuide[]> {\n const params = new URLSearchParams({ endUserId, pageUrl });\n let response: Response;\n try {\n response = await fetch(`${this.apiUrl}/v1/guides/resolve?${params.toString()}`, {\n method: 'GET',\n headers: { 'X-Api-Key': this.apiKey },\n credentials: 'omit',\n });\n } catch (err) {\n if (this.debug) console.error('[veo] guides resolve fetch failed:', err);\n return [];\n }\n\n if (!response.ok) {\n if (this.debug) console.warn('[veo] guides resolve HTTP', response.status);\n return [];\n }\n\n try {\n const data = (await response.json()) as ResolveGuidesResponse;\n return Array.isArray(data.guides) ? data.guides : [];\n } catch (err) {\n if (this.debug) console.error('[veo] guides resolve parse failed:', err);\n return [];\n }\n }\n\n /**\n * Trae una guía específica por ID, sin pasar por la lógica de\n * activación. La usa el controller para resumir un walkthrough entre\n * páginas: el `resolve` no devuelve la guía si la URL actual no\n * matchea, pero el walkthrough activo debe poder consultarla igual.\n *\n * El endpoint backend (`GET /v1/guides/:guideId`) devuelve `GuideResponse`,\n * un superset de `ResolvedGuide` con campos de audit. Acá descartamos los\n * extra y nos quedamos con el shape que el resto del SDK ya consume.\n *\n * Devuelve `null` en cualquier error (404, red, parse) — el caller debe\n * tratarlo como \"guía ya no existe\" y cancelar el walkthrough limpiamente.\n */\n async fetchById(guideId: string): Promise<ResolvedGuide | null> {\n let response: Response;\n try {\n response = await fetch(`${this.apiUrl}/v1/guides/${encodeURIComponent(guideId)}`, {\n method: 'GET',\n headers: { 'X-Api-Key': this.apiKey },\n credentials: 'omit',\n });\n } catch (err) {\n if (this.debug) console.error('[veo] guides fetchById network failed:', err);\n return null;\n }\n\n if (!response.ok) {\n if (this.debug) console.warn('[veo] guides fetchById HTTP', response.status);\n return null;\n }\n\n try {\n const data = (await response.json()) as Partial<ResolvedGuide>;\n if (\n typeof data.guideId !== 'string' ||\n typeof data.guideName !== 'string' ||\n typeof data.guideType !== 'string' ||\n !Array.isArray(data.guideSteps) ||\n !data.activationRules ||\n typeof data.displayFrequency !== 'string' ||\n typeof data.displayPriority !== 'number'\n ) {\n if (this.debug) console.warn('[veo] guides fetchById: unexpected shape');\n return null;\n }\n return {\n guideId: data.guideId,\n guideName: data.guideName,\n guideType: data.guideType,\n guideSteps: data.guideSteps,\n activationRules: data.activationRules,\n displayFrequency: data.displayFrequency,\n displayPriority: data.displayPriority,\n };\n } catch (err) {\n if (this.debug) console.error('[veo] guides fetchById parse failed:', err);\n return null;\n }\n }\n}\n","import type { GuideInteractionPayload } from './types';\n\nexport interface InteractionRequest {\n guideId: string;\n payload: GuideInteractionPayload;\n}\n\n/**\n * Wire shape esperada por `POST /v1/guides/:id/interactions` en el backend.\n * Nuestro tipo interno (`GuideInteractionPayload`) usa `action`/`stepIndex`;\n * el backend exige `interactionType`/`stepPosition`. Esta función centraliza\n * la traducción.\n */\ninterface WireInteraction {\n endUserId: string;\n sessionId?: string;\n interactionType: GuideInteractionPayload['action'];\n stepPosition?: number;\n pageUrl?: string;\n pagePath?: string;\n}\n\nfunction toWire(payload: GuideInteractionPayload): WireInteraction {\n const wire: WireInteraction = {\n endUserId: payload.endUserId,\n interactionType: payload.action,\n };\n if (payload.sessionId) wire.sessionId = payload.sessionId;\n if (typeof payload.stepIndex === 'number') wire.stepPosition = payload.stepIndex;\n if (payload.pageUrl) wire.pageUrl = payload.pageUrl;\n if (payload.pagePath) wire.pagePath = payload.pagePath;\n return wire;\n}\n\n/**\n * Cliente HTTP puro para registrar interacciones de guías. No hace retry\n * ni queue — esa responsabilidad vive en `GuideTrackerQueue`.\n *\n * `send` lanza en error (queue puede reintentar). `sendBeacon` es síncrono,\n * \"best effort\", para el cierre de página: usa `navigator.sendBeacon` con\n * el apiKey como query param `?key=` (la única forma de autenticar con\n * sendBeacon, ya que no permite headers custom — el backend lo soporta\n * desde el ApiKeyGuard).\n */\nexport class GuideTrackerClient {\n constructor(\n private readonly apiUrl: string,\n private readonly apiKey: string,\n ) {}\n\n async send(request: InteractionRequest): Promise<void> {\n const url = this.buildUrl(request.guideId);\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'X-Api-Key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(toWire(request.payload)),\n credentials: 'omit',\n });\n\n if (!response.ok) {\n throw new Error(`guide interaction send failed: HTTP ${response.status}`);\n }\n }\n\n /**\n * Envío \"fire-and-forget\" en pagehide. Devuelve `false` si el navegador\n * no acepta el beacon (cola llena, no soportado) — en ese caso la queue\n * sabrá que perdió el envío.\n */\n sendBeacon(request: InteractionRequest): boolean {\n if (typeof navigator === 'undefined' || typeof navigator.sendBeacon !== 'function') {\n return false;\n }\n const url = `${this.buildUrl(request.guideId)}?key=${encodeURIComponent(this.apiKey)}`;\n const blob = new Blob([JSON.stringify(toWire(request.payload))], {\n type: 'application/json',\n });\n try {\n return navigator.sendBeacon(url, blob);\n } catch {\n return false;\n }\n }\n\n private buildUrl(guideId: string): string {\n return `${this.apiUrl}/v1/guides/${encodeURIComponent(guideId)}/interactions`;\n }\n}\n","import type { GuideTrackerClient, InteractionRequest } from './guide-tracker-client';\nimport type { QueuedInteraction } from './types';\n\nexport interface GuideTrackerQueueConfig {\n client: GuideTrackerClient;\n flushIntervalMs: number;\n batchSize: number;\n maxRetries: number;\n /**\n * Llamado cuando un item se descarta tras agotar `maxRetries`. El\n * plugin puede usarlo para `console.warn` en debug mode. Nunca debe\n * lanzar — si lo hace, se ignora silenciosamente.\n */\n onError?: (error: Error, item: QueuedInteraction) => void;\n}\n\n/**\n * Queue dedicada para `POST /v1/guides/:id/interactions`.\n *\n * Cada item es independiente (URL distinto por `guideId`), así que el\n * \"batch\" en realidad dispara N requests en paralelo. El `batchSize` es\n * el umbral para forzar un flush — no agrupa requests en uno solo.\n *\n * Retry:\n * - Si `send()` lanza, el item se devuelve al buffer con `attempts++`.\n * - El timer regular vuelve a intentar en el próximo tick.\n * - Al alcanzar `maxRetries`, se descarta llamando `onError`.\n *\n * En `pagehide`/`visibilitychange` (hidden) drena el buffer vía\n * `navigator.sendBeacon`. Best effort — no re-encola lo que el beacon\n * rechace porque la página ya se va.\n */\nexport class GuideTrackerQueue {\n private buffer: QueuedInteraction[] = [];\n private timer: ReturnType<typeof setInterval> | null = null;\n private flushing = false;\n private unloadCleanup: (() => void) | null = null;\n\n constructor(private readonly config: GuideTrackerQueueConfig) {\n this.startTimer();\n this.installUnloadHandler();\n }\n\n /** Tamaño actual del buffer (útil para debug/stats en el demo). */\n get size(): number {\n return this.buffer.length;\n }\n\n /**\n * Encola una interaction. Si el buffer alcanza `batchSize`, dispara\n * `flush()` inmediato.\n */\n enqueue(request: InteractionRequest): void {\n this.buffer.push({\n guideId: request.guideId,\n payload: request.payload,\n attempts: 0,\n enqueuedAt: Date.now(),\n });\n if (this.buffer.length >= this.config.batchSize) {\n void this.flush();\n }\n }\n\n /**\n * Envía todo el buffer en paralelo. Items que fallan vuelven al buffer\n * si todavía tienen reintentos disponibles. Idempotente con respecto a\n * flushes concurrentes (el segundo es un no-op).\n */\n async flush(): Promise<void> {\n if (this.flushing || this.buffer.length === 0) return;\n this.flushing = true;\n\n const batch = this.buffer.splice(0, this.buffer.length);\n const results = await Promise.allSettled(\n batch.map((item) =>\n this.config.client.send({ guideId: item.guideId, payload: item.payload }),\n ),\n );\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const item = batch[i];\n if (!result || !item) continue;\n if (result.status === 'fulfilled') continue;\n\n item.attempts += 1;\n if (item.attempts < this.config.maxRetries) {\n this.buffer.push(item);\n } else {\n this.safeOnError(result.reason, item);\n }\n }\n\n this.flushing = false;\n }\n\n /**\n * Drena el buffer vía `sendBeacon`. Síncrono, sin retry. Para pagehide.\n */\n flushBeacon(): void {\n if (this.buffer.length === 0) return;\n const batch = this.buffer.splice(0, this.buffer.length);\n for (const item of batch) {\n this.config.client.sendBeacon({ guideId: item.guideId, payload: item.payload });\n }\n }\n\n destroy(): void {\n if (this.timer) clearInterval(this.timer);\n this.timer = null;\n this.unloadCleanup?.();\n this.unloadCleanup = null;\n }\n\n private startTimer(): void {\n if (typeof window === 'undefined') return;\n this.timer = setInterval(() => {\n void this.flush();\n }, this.config.flushIntervalMs);\n }\n\n private installUnloadHandler(): void {\n if (typeof window === 'undefined') return;\n const onPagehide = (): void => this.flushBeacon();\n const onVisibility = (): void => {\n if (document.visibilityState === 'hidden') this.flushBeacon();\n };\n window.addEventListener('pagehide', onPagehide);\n window.addEventListener('visibilitychange', onVisibility);\n this.unloadCleanup = () => {\n window.removeEventListener('pagehide', onPagehide);\n window.removeEventListener('visibilitychange', onVisibility);\n };\n }\n\n private safeOnError(reason: unknown, item: QueuedInteraction): void {\n if (!this.config.onError) return;\n const error = reason instanceof Error ? reason : new Error(String(reason));\n try {\n this.config.onError(error, item);\n } catch {\n // Un onError roto no debe afectar al resto del flush.\n }\n }\n}\n","import { SAFE_URL_PROTOCOLS } from './constants';\nimport type { CtaAction, GuideStep, StepBlock } from './types';\n\ninterface StepCallbacks {\n onCtaClick: (action: CtaAction, url?: string) => void;\n onDismiss: () => void;\n}\n\n/**\n * Construye el subtree DOM de un step (título, contenido, imagen, CTA,\n * botón de cerrar) de forma segura.\n *\n * Reglas inmutables:\n * - **Nunca** usa `innerHTML` ni `insertAdjacentHTML`.\n * - Todo texto se asigna por `textContent` (escape HTML automático).\n * - URLs (`imageUrl`, `style.ctaUrl`) pasan por `isSafeUrl` — solo\n * `http(s):` permitido, rechaza `javascript:`, `data:`, etc.\n * - Campos opcionales ausentes simplemente no pintan su nodo. Si una\n * guía no trae `ctaText` no se pinta botón.\n *\n * El `doc` se inyecta para soportar tests con jsdom u otros documentos.\n */\nexport function buildStepContent(\n step: GuideStep,\n doc: Document,\n callbacks: StepCallbacks,\n): HTMLElement {\n const container = doc.createElement('div');\n container.className = 'veo-guide-content';\n\n const blocks = normalizeBlocks(step);\n if (blocks) {\n renderBlocks(container, blocks, doc, callbacks);\n } else {\n renderLegacyStep(container, step, doc, callbacks);\n }\n\n // Botón \"✕\" siempre presente (esquina superior derecha).\n container.appendChild(createCloseButton(doc, () => callbacks.onDismiss()));\n\n return container;\n}\n\n/** Render clásico: imagen + un título + un texto + un CTA (campos escalares). */\nfunction renderLegacyStep(\n container: HTMLElement,\n step: GuideStep,\n doc: Document,\n callbacks: StepCallbacks,\n): void {\n if (typeof step.imageUrl === 'string' && step.imageUrl && isSafeUrl(step.imageUrl)) {\n const img = doc.createElement('img');\n img.className = 'veo-guide-image';\n img.src = step.imageUrl;\n img.alt = typeof step.title === 'string' ? step.title : '';\n container.appendChild(img);\n }\n\n if (typeof step.title === 'string' && step.title) {\n const heading = doc.createElement('h2');\n heading.className = 'veo-guide-title';\n heading.textContent = step.title;\n container.appendChild(heading);\n }\n\n if (typeof step.content === 'string' && step.content) {\n const paragraph = doc.createElement('p');\n paragraph.className = 'veo-guide-text';\n paragraph.textContent = step.content;\n container.appendChild(paragraph);\n }\n\n const actions = doc.createElement('div');\n actions.className = 'veo-guide-actions';\n\n if (typeof step.ctaText === 'string' && step.ctaText) {\n const cta = doc.createElement('button');\n cta.type = 'button';\n cta.className = 'veo-guide-cta';\n cta.textContent = step.ctaText;\n cta.addEventListener('click', () => {\n const action: CtaAction = step.ctaAction ?? 'dismiss';\n const ctaUrl = readCtaUrl(step);\n callbacks.onCtaClick(action, ctaUrl);\n });\n actions.appendChild(cta);\n }\n\n container.appendChild(actions);\n}\n\n/** Devuelve los bloques válidos del paso, o `null` si no hay (usa el legacy). */\nfunction normalizeBlocks(step: GuideStep): StepBlock[] | null {\n if (!Array.isArray(step.blocks) || step.blocks.length === 0) return null;\n const valid = step.blocks.filter((b): b is StepBlock => {\n if (!b || typeof b !== 'object') return false;\n if (b.type === 'image') return typeof b.url === 'string' && isSafeUrl(b.url);\n return b.type === 'title' || b.type === 'text' || b.type === 'button';\n });\n return valid.length > 0 ? valid : null;\n}\n\n/**\n * Render por bloques: recorre en orden. Los botones consecutivos se agrupan en\n * una misma fila de acciones (para que queden lado a lado). Todo texto por\n * `textContent`; las imágenes por `isSafeUrl`.\n */\nfunction renderBlocks(\n container: HTMLElement,\n blocks: StepBlock[],\n doc: Document,\n callbacks: StepCallbacks,\n): void {\n let i = 0;\n while (i < blocks.length) {\n const block = blocks[i];\n if (block?.type === 'button') {\n const actions = doc.createElement('div');\n actions.className = 'veo-guide-actions';\n while (i < blocks.length && blocks[i]?.type === 'button') {\n const btnBlock = blocks[i] as StepBlock;\n actions.appendChild(buildButtonBlock(btnBlock, doc, callbacks));\n i++;\n }\n container.appendChild(actions);\n continue;\n }\n const node = buildContentBlock(block as StepBlock, doc);\n if (node) container.appendChild(node);\n i++;\n }\n}\n\nfunction buildContentBlock(block: StepBlock, doc: Document): HTMLElement | null {\n switch (block.type) {\n case 'title': {\n const el = doc.createElement('h2');\n el.className = 'veo-guide-title';\n el.textContent = typeof block.text === 'string' ? block.text : '';\n applyBlockStyle(el, block.style, 'text');\n return el;\n }\n case 'text': {\n const el = doc.createElement('p');\n el.className = 'veo-guide-text';\n el.textContent = typeof block.text === 'string' ? block.text : '';\n applyBlockStyle(el, block.style, 'text');\n return el;\n }\n case 'image': {\n if (typeof block.url !== 'string' || !isSafeUrl(block.url)) return null;\n const el = doc.createElement('img');\n el.className = 'veo-guide-image';\n el.src = block.url;\n el.alt = '';\n applyBlockStyle(el, block.style, 'image');\n return el;\n }\n default:\n return null;\n }\n}\n\nfunction buildButtonBlock(\n block: StepBlock,\n doc: Document,\n callbacks: StepCallbacks,\n): HTMLButtonElement {\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.className = 'veo-guide-cta';\n btn.textContent = typeof block.text === 'string' && block.text ? block.text : 'OK';\n applyBlockStyle(btn, block.style, 'button');\n btn.addEventListener('click', () => {\n const action: CtaAction = block.action ?? 'dismiss';\n const url =\n action === 'url' && typeof block.url === 'string' && isSafeUrl(block.url)\n ? block.url\n : undefined;\n callbacks.onCtaClick(action, url);\n });\n return btn;\n}\n\nconst BLOCK_ALIGN_SELF: Record<string, string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n};\n\nfunction clampNum(n: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, n));\n}\n\n/**\n * Aplica el estilo por-bloque como estilos INLINE (cada bloque es único, no\n * puede usar las CSS vars compartidas del host). Setear `el.style.*` es seguro:\n * el browser descarta valores inválidos (no hay inyección de CSS crudo).\n */\nfunction applyBlockStyle(\n el: HTMLElement,\n style: StepBlock['style'],\n kind: 'text' | 'image' | 'button',\n): void {\n if (!style || typeof style !== 'object') return;\n const s = style as Record<string, unknown>;\n const align = typeof s.align === 'string' ? s.align : null;\n if (align && (align === 'left' || align === 'center' || align === 'right')) {\n if (kind === 'text') el.style.textAlign = align;\n else el.style.alignSelf = BLOCK_ALIGN_SELF[align] as string;\n }\n if (kind !== 'image' && typeof s.color === 'string') el.style.color = s.color;\n if (kind === 'text' && typeof s.fontSize === 'number' && Number.isFinite(s.fontSize)) {\n el.style.fontSize = `${clampNum(s.fontSize, 8, 72)}px`;\n }\n if (kind === 'image' && typeof s.width === 'number' && Number.isFinite(s.width)) {\n el.style.width = `${clampNum(s.width, 10, 100)}%`;\n }\n if (kind === 'image' && typeof s.radius === 'number' && Number.isFinite(s.radius)) {\n el.style.borderRadius = `${clampNum(s.radius, 0, 48)}px`;\n }\n if (typeof s.marginTop === 'number' && Number.isFinite(s.marginTop)) {\n el.style.marginTop = `${clampNum(s.marginTop, 0, 64)}px`;\n }\n if (typeof s.marginBottom === 'number' && Number.isFinite(s.marginBottom)) {\n el.style.marginBottom = `${clampNum(s.marginBottom, 0, 64)}px`;\n }\n}\n\n/**\n * Botón \"✕\" de cerrar reutilizable. Universal: modal/banner/tooltip/inline (vía\n * `buildStepContent`), walkthrough, forms y guías custom lo usan, para que toda\n * guía tenga siempre una salida en la esquina superior derecha.\n *\n * `className` permite un estilo distinto por chrome (las custom usan\n * `veo-custom-close`, un botón visible sobre HTML arbitrario del cliente).\n */\nexport function createCloseButton(\n doc: Document,\n onClose: () => void,\n className = 'veo-guide-close',\n): HTMLButtonElement {\n const closeBtn = doc.createElement('button');\n closeBtn.type = 'button';\n closeBtn.className = className;\n closeBtn.setAttribute('aria-label', 'Cerrar');\n closeBtn.textContent = '×';\n closeBtn.addEventListener('click', onClose);\n return closeBtn;\n}\n\n/**\n * Acepta solo `http:` y `https:`. Resuelve relativas contra la página\n * actual cuando hay `window`; en SSR (sin window) toma la URL como\n * absoluta. Rechaza cualquier protocolo no listado y URLs malformadas.\n */\nexport function isSafeUrl(url: string): boolean {\n if (typeof url !== 'string' || url.length === 0) return false;\n try {\n const base = typeof window !== 'undefined' ? window.location.href : 'http://localhost/';\n const parsed = new URL(url, base);\n return SAFE_URL_PROTOCOLS.includes(parsed.protocol);\n } catch {\n return false;\n }\n}\n\n/**\n * El backend no tiene aún un campo `ctaUrl` en el GuideStep — la URL\n * destino para `ctaAction === 'url'` se guarda como convención en\n * `style.ctaUrl`. Esta función la extrae validando que sea una URL\n * segura. Devuelve `undefined` si falta o no pasa el chequeo.\n */\nfunction readCtaUrl(step: GuideStep): string | undefined {\n const candidate = step.style?.ctaUrl;\n if (typeof candidate !== 'string') return undefined;\n return isSafeUrl(candidate) ? candidate : undefined;\n}\n","import { createCloseButton, isSafeUrl } from './block-builder';\nimport type { GuideStep, WalkthroughCallbacks } from './types';\n\n/**\n * Construye el subtree DOM de un step de walkthrough con navegación\n * (counter, dots, contenido, botones atrás/siguiente/finalizar/omitir).\n *\n * Aplica las mismas reglas de seguridad que `buildStepContent`:\n * - `textContent` para todo string del backend (cero `innerHTML`).\n * - `imageUrl` validada con `isSafeUrl`.\n *\n * El botón primario cambia su label según el step:\n * - último step → \"Finalizar\" → llama `onComplete`\n * - otro → `step.ctaText` o \"Siguiente\" → llama `onNext`\n *\n * El botón \"Atrás\" solo se pinta a partir del segundo step. El botón\n * \"Omitir\" siempre se pinta — el usuario debe poder salir en cualquier\n * momento.\n */\nexport function buildWalkthroughStepContent(\n step: GuideStep,\n stepIndex: number,\n totalSteps: number,\n doc: Document,\n callbacks: WalkthroughCallbacks,\n): HTMLElement {\n const container = doc.createElement('div');\n container.className = 'veo-guide-content';\n\n const counter = doc.createElement('div');\n counter.className = 'veo-walkthrough-counter';\n counter.textContent = `Paso ${stepIndex + 1} de ${totalSteps}`;\n container.appendChild(counter);\n\n const progress = doc.createElement('div');\n progress.className = 'veo-walkthrough-progress';\n for (let i = 0; i < totalSteps; i++) {\n const dot = doc.createElement('span');\n dot.className = 'veo-walkthrough-progress-dot';\n if (i < stepIndex) dot.classList.add('completed');\n if (i === stepIndex) dot.classList.add('active');\n progress.appendChild(dot);\n }\n container.appendChild(progress);\n\n if (typeof step.imageUrl === 'string' && step.imageUrl && isSafeUrl(step.imageUrl)) {\n const img = doc.createElement('img');\n img.className = 'veo-guide-image';\n img.src = step.imageUrl;\n img.alt = typeof step.title === 'string' ? step.title : '';\n container.appendChild(img);\n }\n\n if (typeof step.title === 'string' && step.title) {\n const heading = doc.createElement('h2');\n heading.className = 'veo-guide-title';\n heading.textContent = step.title;\n container.appendChild(heading);\n }\n\n if (typeof step.content === 'string' && step.content) {\n const paragraph = doc.createElement('p');\n paragraph.className = 'veo-guide-text';\n paragraph.textContent = step.content;\n container.appendChild(paragraph);\n }\n\n const actions = doc.createElement('div');\n actions.className = 'veo-walkthrough-actions';\n\n const skipBtn = doc.createElement('button');\n skipBtn.type = 'button';\n skipBtn.className = 'veo-walkthrough-skip';\n skipBtn.textContent = 'Omitir';\n skipBtn.addEventListener('click', () => callbacks.onSkip());\n actions.appendChild(skipBtn);\n\n const rightGroup = doc.createElement('div');\n rightGroup.className = 'veo-walkthrough-actions-right';\n\n if (stepIndex > 0) {\n const backBtn = doc.createElement('button');\n backBtn.type = 'button';\n backBtn.className = 'veo-walkthrough-btn-secondary';\n backBtn.textContent = 'Atrás';\n backBtn.addEventListener('click', () => callbacks.onBack());\n rightGroup.appendChild(backBtn);\n }\n\n const isLastStep = stepIndex === totalSteps - 1;\n const primaryBtn = doc.createElement('button');\n primaryBtn.type = 'button';\n primaryBtn.className = 'veo-guide-cta';\n const defaultLabel = isLastStep ? 'Finalizar' : 'Siguiente';\n primaryBtn.textContent =\n typeof step.ctaText === 'string' && step.ctaText ? step.ctaText : defaultLabel;\n primaryBtn.addEventListener('click', () => {\n if (isLastStep) callbacks.onComplete();\n else callbacks.onNext();\n });\n rightGroup.appendChild(primaryBtn);\n\n actions.appendChild(rightGroup);\n container.appendChild(actions);\n\n // \"✕\" universal (esquina superior derecha): salir en cualquier momento.\n // Mismo efecto que \"Omitir\" → reporta `dismissed`.\n container.appendChild(createCloseButton(doc, () => callbacks.onSkip()));\n\n return container;\n}\n","import type { GuideStep } from './types';\n\n/**\n * Tematización de guías dirigida por datos. El autor (dashboard no-code)\n * guarda props de diseño en `step.style`; acá las traducimos a las\n * variables CSS `--veo-*` que ya define `GUIDE_STYLES`.\n *\n * Seguridad: solo asignamos *custom properties* sobre el host (valores,\n * nunca selectores ni código). Validamos cada valor; lo inválido se ignora\n * y queda el default del stylesheet. Ningún valor llega a `innerHTML` ni a\n * `eval` — coherente con las reglas del renderer.\n */\n\n/** Overrides del tema oscuro (claro = defaults del stylesheet). */\nconst DARK_THEME: Record<string, string> = {\n '--veo-bg': '#1f2937',\n '--veo-text': '#f9fafb',\n '--veo-text-secondary': '#d1d5db',\n '--veo-shadow': '0 20px 60px rgba(0, 0, 0, 0.55)',\n};\n\nconst ALIGN_JUSTIFY: Record<string, string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n};\n\n/** `align-self` en el contenedor flex del step (para elementos tipo imagen). */\nconst ALIGN_SELF: Record<string, string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n};\n\n/** Elementos con estilo propio + qué usan para alinear (text-align vs align-self). */\nconst ELEMENT_ALIGN_MODE: Record<string, 'text' | 'self'> = {\n title: 'text',\n text: 'text',\n image: 'self',\n};\n\n/** Presets de sombra → box-shadow. */\nconst SHADOW: Record<string, string> = {\n none: 'none',\n soft: '0 4px 14px rgba(0, 0, 0, 0.10)',\n medium: '0 8px 30px rgba(0, 0, 0, 0.18)',\n strong: '0 24px 60px rgba(0, 0, 0, 0.32)',\n};\n\n/** Presets de posición del modal → fracción [x, y] del overlay (0..1). */\nconst PRESET_POS: Record<string, [number, number]> = {\n center: [0.5, 0.5],\n top: [0.5, 0],\n bottom: [0.5, 1],\n left: [0, 0.5],\n right: [1, 0.5],\n 'top-left': [0, 0],\n 'top-right': [1, 0],\n 'bottom-left': [0, 1],\n 'bottom-right': [1, 1],\n};\n\n/**\n * Acepta colores CSS razonables: hex (#rgb..#rrggbbaa), funcional\n * (rgb/rgba/hsl/hsla) o keyword simple. No interpola en CSS arbitrario:\n * el valor solo se usa como valor de una custom property.\n */\nconst COLOR_RE = /^#[0-9a-f]{3,8}$|^(rgb|rgba|hsl|hsla)\\([\\d.,%/\\sdeg]+\\)$|^[a-z]{3,20}$/i;\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, n));\n}\n\n/**\n * Aplica las props de diseño de `step.style` como variables CSS sobre el\n * host del shadow root. No-op si no hay style. Idempotente.\n */\nexport function applyDesignVars(host: HTMLElement, style: GuideStep['style']): void {\n if (!style || typeof style !== 'object') return;\n const s = style as Record<string, unknown>;\n\n if (typeof s.accentColor === 'string' && COLOR_RE.test(s.accentColor.trim())) {\n host.style.setProperty('--veo-primary', s.accentColor.trim());\n }\n\n // Fuente (del design system del workspace). Sin `<>{}` para no romper el CSS.\n if (\n typeof s.fontFamily === 'string' &&\n s.fontFamily.length <= 200 &&\n !/[<>{}]/.test(s.fontFamily)\n ) {\n host.style.setProperty('--veo-font', s.fontFamily.trim());\n }\n\n if (s.theme === 'dark') {\n for (const [key, value] of Object.entries(DARK_THEME)) {\n host.style.setProperty(key, value);\n }\n }\n\n if (typeof s.radius === 'number' && Number.isFinite(s.radius)) {\n host.style.setProperty('--veo-radius', `${clamp(s.radius, 0, 48)}px`);\n }\n\n if (typeof s.width === 'number' && Number.isFinite(s.width)) {\n host.style.setProperty('--veo-width', `${clamp(s.width, 220, 720)}px`);\n }\n\n if (s.align === 'left' || s.align === 'center' || s.align === 'right') {\n host.style.setProperty('--veo-actions-justify', ALIGN_JUSTIFY[s.align] as string);\n }\n\n if (typeof s.padding === 'number' && Number.isFinite(s.padding)) {\n host.style.setProperty('--veo-pad', `${clamp(s.padding, 0, 64)}px`);\n }\n\n if (typeof s.margin === 'number' && Number.isFinite(s.margin)) {\n host.style.setProperty('--veo-margin', `${clamp(s.margin, 0, 64)}px`);\n }\n\n if (typeof s.borderWidth === 'number' && Number.isFinite(s.borderWidth)) {\n host.style.setProperty('--veo-border-width', `${clamp(s.borderWidth, 0, 16)}px`);\n }\n\n if (typeof s.borderColor === 'string' && COLOR_RE.test(s.borderColor.trim())) {\n host.style.setProperty('--veo-border-color', s.borderColor.trim());\n }\n\n if (typeof s.shadow === 'string' && SHADOW[s.shadow]) {\n host.style.setProperty('--veo-shadow', SHADOW[s.shadow] as string);\n }\n\n // Posición del modal: libre (posX/posY en 0..1) tiene prioridad sobre el preset.\n let px: number | undefined;\n let py: number | undefined;\n if (typeof s.posX === 'number' && typeof s.posY === 'number') {\n px = clamp(s.posX, 0, 1);\n py = clamp(s.posY, 0, 1);\n } else if (typeof s.overlayPosition === 'string' && PRESET_POS[s.overlayPosition]) {\n [px, py] = PRESET_POS[s.overlayPosition] as [number, number];\n }\n if (px !== undefined && py !== undefined) {\n host.style.setProperty('--veo-pos-x', `${px * 100}%`);\n host.style.setProperty('--veo-pos-y', `${py * 100}%`);\n }\n\n // Estilo POR ELEMENTO (title/text/image/cta): cada bloque puede sobrescribir\n // alineación, color, tamaño y márgenes de forma independiente del step.\n if (s.elements && typeof s.elements === 'object') {\n const el = s.elements as Record<string, unknown>;\n applyElementVars(host, 'title', el.title);\n applyElementVars(host, 'text', el.text);\n applyElementVars(host, 'image', el.image);\n // El CTA alinea la fila de acciones (reusa --veo-actions-justify).\n const cta = el.cta as Record<string, unknown> | undefined;\n if (cta && typeof cta.align === 'string' && ALIGN_JUSTIFY[cta.align]) {\n host.style.setProperty('--veo-actions-justify', ALIGN_JUSTIFY[cta.align] as string);\n }\n }\n}\n\n/**\n * Emite las variables CSS de un elemento (`--veo-{prefix}-*`). Cada prop es\n * opcional y se valida; lo inválido se ignora y queda el default del stylesheet.\n */\nfunction applyElementVars(host: HTMLElement, prefix: string, raw: unknown): void {\n if (!raw || typeof raw !== 'object') return;\n const el = raw as Record<string, unknown>;\n\n if (\n typeof el.align === 'string' &&\n (el.align === 'left' || el.align === 'center' || el.align === 'right')\n ) {\n const mode = ELEMENT_ALIGN_MODE[prefix] ?? 'text';\n const value = mode === 'self' ? (ALIGN_SELF[el.align] as string) : el.align;\n host.style.setProperty(`--veo-${prefix}-align`, value);\n }\n if (typeof el.color === 'string' && COLOR_RE.test(el.color.trim())) {\n host.style.setProperty(`--veo-${prefix}-color`, el.color.trim());\n }\n if (typeof el.fontSize === 'number' && Number.isFinite(el.fontSize)) {\n host.style.setProperty(`--veo-${prefix}-size`, `${clamp(el.fontSize, 8, 72)}px`);\n }\n if (typeof el.width === 'number' && Number.isFinite(el.width)) {\n host.style.setProperty(`--veo-${prefix}-width`, `${clamp(el.width, 10, 100)}%`);\n }\n if (typeof el.radius === 'number' && Number.isFinite(el.radius)) {\n host.style.setProperty(`--veo-${prefix}-radius`, `${clamp(el.radius, 0, 48)}px`);\n }\n if (typeof el.marginTop === 'number' && Number.isFinite(el.marginTop)) {\n host.style.setProperty(`--veo-${prefix}-mt`, `${clamp(el.marginTop, 0, 64)}px`);\n }\n if (typeof el.marginBottom === 'number' && Number.isFinite(el.marginBottom)) {\n host.style.setProperty(`--veo-${prefix}-mb`, `${clamp(el.marginBottom, 0, 64)}px`);\n }\n}\n","import { GUIDE_Z_INDEX } from './constants';\n\n/**\n * CSS inyectado en cada shadow DOM. Como `:host { all: initial }` rompe\n * con la herencia del host, todos los estilos viven aquí. Las variables\n * CSS (`--veo-*`) son los puntos de extensión para tematización futura.\n */\nexport const GUIDE_STYLES = `\n:host {\n --veo-primary: #4f46e5;\n --veo-text: #1f2937;\n --veo-text-secondary: #4b5563;\n --veo-bg: #ffffff;\n --veo-radius: 12px;\n --veo-shadow: 0 20px 60px rgba(0, 0, 0, 0.25);\n --veo-width: 420px;\n --veo-actions-justify: flex-end;\n all: initial;\n}\n* { box-sizing: border-box; font-family: var(--veo-font, -apple-system, system-ui, \"Segoe UI\", Roboto, sans-serif); }\n\n.veo-modal-overlay {\n position: fixed; inset: 0;\n background: rgba(15, 15, 30, 0.45);\n z-index: ${GUIDE_Z_INDEX};\n animation: veo-fade-in 180ms ease-out;\n}\n/*\n * Posición libre/preset: --veo-pos-x/y son porcentajes (default 50% = centro).\n * El truco translate(-pos) alinea la MISMA fracción de la tarjeta con esa\n * fracción del overlay, así la tarjeta nunca se sale (0% = pegada izquierda,\n * 100% = pegada derecha, 50% = centrada) sea cual sea su ancho.\n */\n.veo-modal-card {\n position: absolute;\n left: var(--veo-pos-x, 50%);\n top: var(--veo-pos-y, 50%);\n transform: translate(calc(var(--veo-pos-x, 50%) * -1), calc(var(--veo-pos-y, 50%) * -1));\n background: var(--veo-bg);\n border-radius: var(--veo-radius);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 24px);\n max-width: var(--veo-width); width: 90%;\n box-shadow: var(--veo-shadow);\n animation: veo-fade-in 180ms ease-out;\n}\n\n.veo-banner {\n position: fixed; left: 0; right: 0;\n background: var(--veo-bg);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 16px);\n z-index: ${GUIDE_Z_INDEX};\n box-shadow: var(--veo-shadow, 0 2px 12px rgba(0, 0, 0, 0.12));\n animation: veo-slide-down 200ms ease-out;\n}\n.veo-banner-top { top: 0; }\n.veo-banner-bottom { bottom: 0; }\n\n.veo-tooltip {\n position: absolute;\n background: var(--veo-bg);\n border-radius: var(--veo-radius);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 15px);\n max-width: 300px;\n z-index: ${GUIDE_Z_INDEX};\n box-shadow: var(--veo-shadow, 0 8px 30px rgba(0, 0, 0, 0.18));\n animation: veo-fade-in 150ms ease-out;\n}\n.veo-tooltip-arrow {\n position: absolute;\n width: 12px;\n height: 12px;\n background: var(--veo-bg);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n transform: rotate(45deg);\n pointer-events: none;\n}\n\n.veo-inline {\n background: var(--veo-bg);\n border-radius: var(--veo-radius);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 20px);\n max-width: var(--veo-width);\n margin: var(--veo-margin, 12px) 0;\n position: relative;\n box-shadow: var(--veo-shadow);\n animation: veo-fade-in 160ms ease-out;\n}\n\n.veo-guide-content {\n position: relative;\n display: flex; flex-direction: column;\n}\n.veo-guide-image {\n display: block;\n width: var(--veo-image-width, 100%);\n max-height: 180px;\n object-fit: cover;\n align-self: var(--veo-image-align, stretch);\n border-radius: var(--veo-image-radius, 8px);\n margin: var(--veo-image-mt, 0) 0 var(--veo-image-mb, 12px);\n}\n.veo-guide-title {\n font-size: var(--veo-title-size, 18px); font-weight: 600; line-height: 1.3;\n text-align: var(--veo-title-align, left);\n margin: var(--veo-title-mt, 0) 0 var(--veo-title-mb, 6px);\n color: var(--veo-title-color, var(--veo-text));\n}\n.veo-guide-text {\n font-size: var(--veo-text-size, 14px); line-height: 1.5;\n text-align: var(--veo-text-align, left);\n margin: var(--veo-text-mt, 0) 0 var(--veo-text-mb, 16px);\n color: var(--veo-text-color, var(--veo-text-secondary));\n}\n.veo-guide-actions {\n display: flex; gap: 8px; justify-content: var(--veo-actions-justify);\n}\n.veo-guide-cta {\n background: var(--veo-primary); color: #fff; border: none;\n padding: 9px 18px; border-radius: 8px;\n font-size: 14px; font-weight: 500; cursor: pointer;\n transition: opacity 120ms ease;\n}\n.veo-guide-cta:hover { opacity: 0.9; }\n.veo-guide-cta:active { transform: translateY(1px); }\n.veo-guide-close {\n position: absolute; top: -6px; right: -6px;\n width: 24px; height: 24px;\n background: none; border: none;\n font-size: 22px; line-height: 1;\n cursor: pointer; color: #9ca3af; padding: 0;\n}\n.veo-guide-close:hover { color: var(--veo-text); }\n\n.veo-form { display: flex; flex-direction: column; gap: 14px; margin-bottom: 16px; }\n.veo-form-field { display: flex; flex-direction: column; gap: 6px; }\n.veo-form-label { font-size: 13px; font-weight: 500; color: var(--veo-text); }\n.veo-form-input {\n font-size: 14px; color: var(--veo-text);\n background: var(--veo-bg);\n border: 1px solid #d1d5db; border-radius: 8px;\n padding: 8px 10px; width: 100%;\n}\n.veo-form-input:focus { outline: 2px solid var(--veo-primary); outline-offset: -1px; border-color: transparent; }\n.veo-form-options { display: flex; flex-direction: column; gap: 6px; }\n.veo-form-option {\n display: flex; align-items: center; gap: 8px;\n font-size: 14px; color: var(--veo-text); cursor: pointer;\n}\n.veo-form-option input { accent-color: var(--veo-primary); margin: 0; cursor: pointer; }\n.veo-form-scale { display: flex; gap: 4px; flex-wrap: wrap; }\n.veo-nps-btn {\n min-width: 30px; height: 30px; padding: 0 4px;\n font-size: 13px; font-weight: 500; color: var(--veo-text);\n background: var(--veo-bg); border: 1px solid #d1d5db; border-radius: 6px;\n cursor: pointer; transition: all 100ms ease;\n}\n.veo-nps-btn:hover { border-color: var(--veo-primary); }\n.veo-rating-btn {\n background: none; border: none; padding: 0 2px;\n font-size: 26px; line-height: 1; color: #d1d5db;\n cursor: pointer; transition: color 100ms ease;\n}\n.veo-scale-active.veo-nps-btn { background: var(--veo-primary); color: #fff; border-color: var(--veo-primary); }\n.veo-scale-active.veo-rating-btn { color: #f59e0b; }\n.veo-form-error { font-size: 13px; color: #dc2626; margin: 0; }\n.veo-form-thanks {\n text-align: center; padding: 24px 8px;\n font-size: 16px; font-weight: 600; color: var(--veo-text);\n}\n.veo-form-preview-note {\n text-align: center; margin: 0 0 12px;\n font-size: 12px; color: #b45309;\n}\n\n.veo-walkthrough {\n position: absolute;\n background: var(--veo-bg);\n border-radius: var(--veo-radius);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 16px);\n max-width: 340px;\n z-index: ${GUIDE_Z_INDEX};\n box-shadow: var(--veo-shadow, 0 8px 30px rgba(0, 0, 0, 0.2));\n animation: veo-fade-in 150ms ease-out;\n}\n.veo-walkthrough-arrow {\n position: absolute;\n width: 12px;\n height: 12px;\n background: var(--veo-bg);\n transform: rotate(45deg);\n pointer-events: none;\n}\n.veo-walkthrough-counter {\n font-size: 11px; color: #9ca3af;\n margin-bottom: 8px; letter-spacing: 0.02em;\n}\n.veo-walkthrough-progress {\n display: flex; gap: 4px;\n margin-bottom: 12px;\n}\n.veo-walkthrough-progress-dot {\n width: 8px; height: 8px;\n border-radius: 50%;\n background: #e5e7eb;\n transition: background 200ms ease;\n}\n.veo-walkthrough-progress-dot.active { background: var(--veo-primary); }\n.veo-walkthrough-progress-dot.completed { background: var(--veo-primary); opacity: 0.5; }\n.veo-walkthrough-actions {\n display: flex; align-items: center;\n margin-top: 16px; gap: 8px;\n}\n.veo-walkthrough-actions-right {\n display: flex; gap: 8px;\n margin-left: auto;\n}\n.veo-walkthrough-btn-secondary {\n background: transparent; color: #6b7280;\n border: 1px solid #e5e7eb;\n padding: 8px 16px; border-radius: 8px;\n font-size: 13px; cursor: pointer;\n transition: background 120ms ease;\n}\n.veo-walkthrough-btn-secondary:hover { background: #f9fafb; }\n.veo-walkthrough-skip {\n background: transparent; color: #9ca3af;\n border: none; padding: 4px 8px;\n font-size: 12px; cursor: pointer;\n}\n.veo-walkthrough-skip:hover { color: var(--veo-text); }\n\n.veo-custom-floating {\n position: fixed;\n z-index: ${GUIDE_Z_INDEX};\n max-width: calc(100vw - 16px);\n max-height: calc(100vh - 16px);\n animation: veo-fade-in 160ms ease;\n}\n.veo-custom-anchored {\n position: fixed;\n top: 0; left: 0;\n z-index: ${GUIDE_Z_INDEX};\n max-width: calc(100vw - 16px);\n animation: veo-fade-in 160ms ease;\n}\n.veo-custom-inline {\n display: block;\n position: relative;\n margin: 12px 0;\n}\n.veo-custom-frame {\n display: block;\n border: 0;\n width: 360px;\n background: transparent;\n color-scheme: normal;\n}\n/*\n * X de cerrar de las guías custom: el HTML del cliente vive en un iframe\n * sandbox, así que el botón lo pone el host POR ENCIMA del iframe. Con fondo\n * propio para ser visible sobre cualquier contenido.\n */\n.veo-custom-close {\n position: absolute; top: 6px; right: 6px; z-index: 1;\n width: 22px; height: 22px; padding: 0;\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; line-height: 1; color: #6b7280;\n background: rgba(255, 255, 255, 0.92);\n border: 1px solid rgba(0, 0, 0, 0.08); border-radius: 50%;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.14); cursor: pointer;\n}\n.veo-custom-close:hover { color: #111827; }\n\n@keyframes veo-fade-in { from { opacity: 0; } to { opacity: 1; } }\n@keyframes veo-slide-up {\n from { transform: translateY(10px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n}\n@keyframes veo-slide-down {\n from { transform: translateY(-10px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n}\n`;\n","import { GUIDE_HOST_ATTR } from '../constants';\nimport { applyDesignVars } from '../guide-design';\nimport { GUIDE_STYLES } from '../styles';\nimport type { GuideRenderContext, GuideStep } from '../types';\n\n/**\n * Base de los renderers de guías. Encapsula:\n * - creación del host con Shadow DOM (aislamiento de estilos)\n * - inyección del CSS común\n * - limpieza del DOM y de listeners en `destroy()`\n *\n * Cada subclase implementa `render(context)`. La subclase puede registrar\n * cleanup adicional con `registerCleanup` para que se ejecute en destroy.\n *\n * Tipos genéricos:\n * - `TContext` (default `GuideRenderContext`): el shape que recibe la\n * subclase. WalkthroughRenderer usa uno propio con step + callbacks.\n * - `TResult` (default `void`): lo que `render` devuelve. El walkthrough\n * usa `boolean` para señalar éxito al controller cuando el ancla no\n * aparece. El resto sigue devolviendo `void`/`Promise<void>`.\n */\nexport abstract class BaseRenderer<TContext = GuideRenderContext, TResult = void> {\n protected host: HTMLElement | null = null;\n protected shadow: ShadowRoot | null = null;\n private cleanups: Array<() => void> = [];\n\n /**\n * Crea un `<div data-veo-guide>` adjunto a `document.body`, le adjunta\n * un ShadowRoot abierto e inyecta los estilos. Retorna el nodo raíz\n * donde la subclase puede insertar el contenido específico.\n */\n protected createHost(): { host: HTMLElement; shadow: ShadowRoot; root: HTMLElement } {\n const host = document.createElement('div');\n host.setAttribute(GUIDE_HOST_ATTR, '');\n const shadow = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = GUIDE_STYLES;\n shadow.appendChild(style);\n\n const root = document.createElement('div');\n shadow.appendChild(root);\n\n document.body.appendChild(host);\n\n this.host = host;\n this.shadow = shadow;\n return { host, shadow, root };\n }\n\n /**\n * Aplica la tematización por datos del step (`step.style`) como variables\n * CSS sobre el host. Llamar tras `createHost()`. No-op si no hay host o\n * style. Ver `guide-design.ts`.\n */\n protected applyDesign(style: GuideStep['style']): void {\n if (this.host) applyDesignVars(this.host, style);\n }\n\n /**\n * Registra una función a ejecutar en `destroy()`. Útil para limpiar\n * listeners globales (scroll, resize) o intervalos.\n */\n protected registerCleanup(fn: () => void): void {\n this.cleanups.push(fn);\n }\n\n /** Remueve el host del DOM y corre todas las funciones de cleanup. */\n destroy(): void {\n for (const fn of this.cleanups) {\n try {\n fn();\n } catch {\n // No propagar: un cleanup roto no debe romper el resto.\n }\n }\n this.cleanups = [];\n\n if (this.host?.parentNode) {\n this.host.parentNode.removeChild(this.host);\n }\n this.host = null;\n this.shadow = null;\n }\n\n abstract render(context: TContext): TResult | Promise<TResult>;\n}\n","import { buildStepContent } from '../block-builder';\nimport type { GuideRenderContext } from '../types';\nimport { buildWalkthroughStepContent } from '../walkthrough-block-builder';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía tipo `banner`: barra fija arriba o abajo. La\n * posición se lee de `step.style.position` (`top` | `bottom`); default\n * es `top`. No tiene backdrop ni atrapa el foco.\n *\n * Con `context.nav` (paso de un walkthrough heterogéneo) muestra botones de\n * navegación y delega tracking/avance al controller.\n */\nexport class BannerRenderer extends BaseRenderer {\n render(context: GuideRenderContext): void {\n const idx = context.nav?.stepIndex ?? 0;\n const step = context.guide.guideSteps[idx];\n if (!step) return;\n\n const { root } = this.createHost();\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n const position = step.style?.position === 'bottom' ? 'bottom' : 'top';\n\n const banner = ownerDocument.createElement('div');\n banner.className = `veo-banner veo-banner-${position}`;\n\n const dismiss = (action: 'dismissed' | 'cta_clicked', ctaUrl?: string) => {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: idx, action });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n\n const content = context.nav\n ? buildWalkthroughStepContent(\n step,\n context.nav.stepIndex,\n context.nav.totalSteps,\n ownerDocument,\n context.nav.callbacks,\n )\n : buildStepContent(step, ownerDocument, {\n onCtaClick: (action, url) => dismiss('cta_clicked', action === 'url' ? url : undefined),\n onDismiss: () => dismiss('dismissed'),\n });\n\n banner.appendChild(content);\n root.appendChild(banner);\n\n if (!context.nav) {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n }\n}\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nfunction getSideAxis(placement) {\n const firstChar = placement[0];\n return firstChar === 't' || firstChar === 'b' ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.includes('start') ? placement.replace('start', 'end') : placement.replace('end', 'start');\n}\nconst lrPlacement = ['left', 'right'];\nconst rlPlacement = ['right', 'left'];\nconst tbPlacement = ['top', 'bottom'];\nconst btPlacement = ['bottom', 'top'];\nfunction getSideList(side, isStart, rtl) {\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rlPlacement : lrPlacement;\n return isStart ? lrPlacement : rlPlacement;\n case 'left':\n case 'right':\n return isStart ? tbPlacement : btPlacement;\n default:\n return [];\n }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n const alignment = getAlignment(placement);\n let list = getSideList(getSide(placement), direction === 'start', rtl);\n if (alignment) {\n list = list.map(side => side + \"-\" + alignment);\n if (flipAlignment) {\n list = list.concat(list.map(getOppositeAlignmentPlacement));\n }\n }\n return list;\n}\nfunction getOppositePlacement(placement) {\n const side = getSide(placement);\n return oppositeSideMap[side] + placement.slice(side.length);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n const {\n x,\n y,\n width,\n height\n } = rect;\n return {\n width,\n height,\n top: y,\n left: x,\n right: x + width,\n bottom: y + height,\n x,\n y\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n// Maximum number of resets that can occur before bailing to avoid infinite reset loops.\nconst MAX_RESET_COUNT = 50;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const platformWithDetectOverflow = platform.detectOverflow ? platform : {\n ...platform,\n detectOverflow\n };\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let resetCount = 0;\n const middlewareData = {};\n for (let i = 0; i < middleware.length; i++) {\n const currentMiddleware = middleware[i];\n if (!currentMiddleware) {\n continue;\n }\n const {\n name,\n fn\n } = currentMiddleware;\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform: platformWithDetectOverflow,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData[name] = {\n ...middlewareData[name],\n ...data\n };\n if (reset && resetCount < MAX_RESET_COUNT) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n const ignoreCrossAxisOverflow = checkCrossAxis === 'alignment' ? initialSideAxis !== getSideAxis(nextPlacement) : false;\n if (!ignoreCrossAxisOverflow ||\n // We leave the current main axis only if every placement on that axis\n // overflows the main axis.\n overflowsData.every(d => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$filter2;\n const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n if (hasFallbackAxisSideDirection) {\n const currentSideAxis = getSideAxis(d.placement);\n return currentSideAxis === initialSideAxis ||\n // Create a bias to the `y` side axis due to horizontal\n // reading directions favoring greater width.\n currentSideAxis === 'y';\n }\n return true;\n }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n rects,\n platform\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await platform.detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await platform.detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\nconst originSides = /*#__PURE__*/new Set(['left', 'top']);\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getSideAxis(placement) === 'y';\n const mainAxisMulti = originSides.has(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = evaluate(options, state);\n\n // eslint-disable-next-line prefer-const\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: rawValue.mainAxis || 0,\n crossAxis: rawValue.crossAxis || 0,\n alignmentAxis: rawValue.alignmentAxis\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n if (options === void 0) {\n options = 0;\n }\n return {\n name: 'offset',\n options,\n async fn(state) {\n var _middlewareData$offse, _middlewareData$arrow;\n const {\n x,\n y,\n placement,\n middlewareData\n } = state;\n const diffCoords = await convertValueToCoords(state, options);\n\n // If the placement is the same and the arrow caused an alignment offset\n // then we don't need to change the positioning coordinates.\n if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: {\n ...diffCoords,\n placement\n }\n };\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n platform\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y,\n enabled: {\n [mainAxis]: checkMainAxis,\n [crossAxis]: checkCrossAxis\n }\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = originSides.has(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n var _state$middlewareData, _state$middlewareData2;\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = evaluate(options, state);\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isYAxis = getSideAxis(placement) === 'y';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n const maximumClippingWidth = width - overflow.left - overflow.right;\n const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n availableWidth = maximumClippingWidth;\n }\n if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n availableHeight = maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isYAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","function hasWindow() {\n return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n if (isNode(node)) {\n return (node.nodeName || '').toLowerCase();\n }\n // Mocked nodes in testing environments may not be instances of Node. By\n // returning `#document` an infinite loop won't occur.\n // https://github.com/floating-ui/floating-ui/issues/2317\n return '#document';\n}\nfunction getWindow(node) {\n var _node$ownerDocument;\n return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n var _ref;\n return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n return false;\n }\n return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && display !== 'inline' && display !== 'contents';\n}\nfunction isTableElement(element) {\n return /^(table|td|th)$/.test(getNodeName(element));\n}\nfunction isTopLayer(element) {\n try {\n if (element.matches(':popover-open')) {\n return true;\n }\n } catch (_e) {\n // no-op\n }\n try {\n return element.matches(':modal');\n } catch (_e) {\n return false;\n }\n}\nconst willChangeRe = /transform|translate|scale|rotate|perspective|filter/;\nconst containRe = /paint|layout|strict|content/;\nconst isNotNone = value => !!value && value !== 'none';\nlet isWebKitValue;\nfunction isContainingBlock(elementOrCss) {\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n return isNotNone(css.transform) || isNotNone(css.translate) || isNotNone(css.scale) || isNotNone(css.rotate) || isNotNone(css.perspective) || !isWebKit() && (isNotNone(css.backdropFilter) || isNotNone(css.filter)) || willChangeRe.test(css.willChange || '') || containRe.test(css.contain || '');\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (isWebKitValue == null) {\n isWebKitValue = typeof CSS !== 'undefined' && CSS.supports && CSS.supports('-webkit-backdrop-filter', 'none');\n }\n return isWebKitValue;\n}\nfunction isLastTraversableNode(node) {\n return /^(html|body|#document)$/.test(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n } else {\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n }\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","import { rectToClientRect, arrow as arrow$1, autoPlacement as autoPlacement$1, detectOverflow as detectOverflow$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle as getComputedStyle$1, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle$1(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle$1(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n const leftScroll = getNodeScroll(element).scrollLeft;\n if (!rect) {\n return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n }\n return rect.left + leftScroll;\n}\n\nfunction getHTMLOffset(documentElement, scroll) {\n const htmlRect = documentElement.getBoundingClientRect();\n const x = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect);\n const y = htmlRect.top + scroll.scrollTop;\n return {\n x,\n y\n };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle$1(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Safety check: ensure the scrollbar space is reasonable in case this\n// calculation is affected by unusual styles.\n// Most scrollbars leave 15-18px of space.\nconst SCROLLBAR_MAX = 25;\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n const windowScrollbarX = getWindowScrollBarX(html);\n // <html> `overflow: hidden` + `scrollbar-gutter: stable` reduces the\n // visual width of the <html> but this is not considered in the size\n // of `html.clientWidth`.\n if (windowScrollbarX <= 0) {\n const doc = html.ownerDocument;\n const body = doc.body;\n const bodyStyles = getComputedStyle(body);\n const bodyMarginInline = doc.compatMode === 'CSS1Compat' ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0;\n const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline);\n if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) {\n width -= clippingStableScrollbarWidth;\n }\n } else if (windowScrollbarX <= SCROLLBAR_MAX) {\n // If the <body> scrollbar is on the left, the width needs to be extended\n // by the scrollbar amount so there isn't extra space on the right.\n width += windowScrollbarX;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y,\n width: clippingAncestor.width,\n height: clippingAncestor.height\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle$1(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle$1(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle$1(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && (currentContainingBlockComputedStyle.position === 'absolute' || currentContainingBlockComputedStyle.position === 'fixed') || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstRect = getClientRectFromClippingAncestor(element, clippingAncestors[0], strategy);\n let top = firstRect.top;\n let right = firstRect.right;\n let bottom = firstRect.bottom;\n let left = firstRect.left;\n for (let i = 1; i < clippingAncestors.length; i++) {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestors[i], strategy);\n top = max(rect.top, top);\n right = min(rect.right, right);\n bottom = min(rect.bottom, bottom);\n left = max(rect.left, left);\n }\n return {\n width: right - left,\n height: bottom - top,\n x: left,\n y: top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n\n // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n function setLeftRTLScrollbarOffset() {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n setLeftRTLScrollbarOffset();\n }\n }\n if (isFixed && !isOffsetParentAnElement && documentElement) {\n setLeftRTLScrollbarOffset();\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle$1(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle$1(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the <html> element as the offsetParent if it's non-static,\n // while Chrome and Safari return the <body> element. The <body> element must\n // be used to perform the correct calculations even if the <html> element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle$1(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\nfunction rectsAreEqual(a, b) {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const elementRectForRootMargin = element.getBoundingClientRect();\n const {\n left,\n top,\n width,\n height\n } = elementRectForRootMargin;\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n // If the reference is clipped, the ratio is 0. Throttle the refresh\n // to prevent an infinite loop of updates.\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 1000);\n } else {\n refresh(false, ratio);\n }\n }\n if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n // It's possible that even though the ratio is reported as 1, the\n // element is not actually fully within the IntersectionObserver's root\n // area anymore. This can happen under performance constraints. This may\n // be a bug in the browser's IntersectionObserver implementation. To\n // work around this, we compare the element's bounding rect now with\n // what it was at the time we created the IntersectionObserver. If they\n // are not equal then the element moved, so we refresh.\n refresh();\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle <iframe>s\n root: root.ownerDocument\n });\n } catch (_e) {\n io = new IntersectionObserver(handleObserve, options);\n }\n io.observe(element);\n }\n refresh(true);\n return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n ancestorScroll = true,\n ancestorResize = true,\n elementResize = typeof ResizeObserver === 'function',\n layoutShift = typeof IntersectionObserver === 'function',\n animationFrame = false\n } = options;\n const referenceEl = unwrapElement(reference);\n const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...(floating ? getOverflowAncestors(floating) : [])] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n let reobserveFrame = -1;\n let resizeObserver = null;\n if (elementResize) {\n resizeObserver = new ResizeObserver(_ref => {\n let [firstEntry] = _ref;\n if (firstEntry && firstEntry.target === referenceEl && resizeObserver && floating) {\n // Prevent update loops when using the `size` middleware.\n // https://github.com/floating-ui/floating-ui/issues/1740\n resizeObserver.unobserve(floating);\n cancelAnimationFrame(reobserveFrame);\n reobserveFrame = requestAnimationFrame(() => {\n var _resizeObserver;\n (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n });\n }\n update();\n });\n if (referenceEl && !animationFrame) {\n resizeObserver.observe(referenceEl);\n }\n if (floating) {\n resizeObserver.observe(floating);\n }\n }\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n if (animationFrame) {\n frameLoop();\n }\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {\n update();\n }\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n update();\n return () => {\n var _resizeObserver2;\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n cleanupIo == null || cleanupIo();\n (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n resizeObserver = null;\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n // This caches the expensive `getClippingElementAncestors` function so that\n // multiple lifecycle resets re-use the same result. It only lives for a\n // single call. If other functions become expensive, we can add them as well.\n const cache = new Map();\n const mergedOptions = {\n platform,\n ...options\n };\n const platformWithCache = {\n ...mergedOptions.platform,\n _c: cache\n };\n return computePosition$1(reference, floating, {\n ...mergedOptions,\n platform: platformWithCache\n });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n","import { DEFAULT_ANCHOR_WAIT_MS } from './constants';\n\n/**\n * Resuelve un selector CSS de forma robusta para SPAs: chequea inmediato\n * y, si no existe, observa el DOM con MutationObserver hasta `timeoutMs`.\n * Devuelve `null` si no apareció antes del timeout.\n *\n * Esta función nunca lanza. Si el selector es inválido devuelve `null`\n * silenciosamente — un selector roto en la DB no debe romper la app.\n */\nexport function waitForElement(\n selector: string,\n timeoutMs: number = DEFAULT_ANCHOR_WAIT_MS,\n): Promise<Element | null> {\n return new Promise((resolve) => {\n const safeQuery = (): Element | null => {\n try {\n return document.querySelector(selector);\n } catch {\n return null;\n }\n };\n\n const existing = safeQuery();\n if (existing) {\n resolve(existing);\n return;\n }\n\n let resolved = false;\n const finish = (el: Element | null) => {\n if (resolved) return;\n resolved = true;\n observer.disconnect();\n clearTimeout(timer);\n resolve(el);\n };\n\n const observer = new MutationObserver(() => {\n const el = safeQuery();\n if (el) finish(el);\n });\n\n observer.observe(document.body, { childList: true, subtree: true });\n\n const timer = setTimeout(() => finish(null), timeoutMs);\n });\n}\n","/**\n * Genera un UUID v7 (timestamp-based, ordenable cronológicamente).\n * Spec: RFC 9562.\n *\n * Formato: tttttttt-tttt-7xxx-yxxx-xxxxxxxxxxxx\n * - 48 bits de timestamp (ms desde epoch)\n * - 4 bits de versión (7)\n * - 2 bits de variante (10)\n * - 74 bits aleatorios\n */\nexport function uuidv7(): string {\n const timestamp = Date.now();\n const timeHex = timestamp.toString(16).padStart(12, '0');\n\n // 10 bytes aleatorios para los 74 bits de entropía (+ bits de versión/variante).\n const random = new Uint8Array(10);\n if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {\n crypto.getRandomValues(random);\n } else {\n // Fallback inseguro pero funcional (no debería ocurrir en browsers modernos).\n for (let i = 0; i < random.length; i++) {\n random[i] = Math.floor(Math.random() * 256);\n }\n }\n\n // Set version (7) en el primer nibble del 3er grupo.\n random[0] = ((random[0] ?? 0) & 0x0f) | 0x70;\n // Set variant (10) en los 2 bits altos del 4to grupo.\n random[2] = ((random[2] ?? 0) & 0x3f) | 0x80;\n\n const hex = Array.from(random, (b) => b.toString(16).padStart(2, '0')).join('');\n\n return [\n timeHex.slice(0, 8),\n timeHex.slice(8, 12),\n hex.slice(0, 4),\n hex.slice(4, 8),\n hex.slice(8, 20),\n ].join('-');\n}\n","import { uuidv7 } from '../../../utils/uuid';\nimport { isSafeUrl } from '../block-builder';\nimport type { GuideRenderContext, GuideStep } from '../types';\n\ninterface VeoBridgeMessage {\n __veo?: unknown;\n type?: unknown;\n url?: unknown;\n name?: unknown;\n props?: unknown;\n height?: unknown;\n close?: unknown;\n}\n\n/**\n * Monta el `<iframe sandbox>` con el HTML/CSS/JS del cliente (origen `null`,\n * sin acceso al host) y cablea el puente postMessage (`dismiss`/`cta`/`track`/\n * `navigate`/`resize`) validando `source` + token. Compartido por las guías\n * `custom` (flotante/anclada) e `inline-custom` (embebida en el flujo).\n *\n * El caller crea el wrapper y posiciona/inserta el iframe; acá sólo va la\n * lógica del documento + el bridge. Devuelve el iframe y un cleanup.\n */\nexport function mountCustomFrame(\n doc: Document,\n step: GuideStep,\n context: GuideRenderContext,\n opts: { width: string; fixedHeight?: number | string | null },\n): { iframe: HTMLIFrameElement; cleanup: () => void } {\n const iframe = doc.createElement('iframe');\n iframe.className = 'veo-custom-frame';\n // allow-scripts SIN allow-same-origin → origen null, sin acceso al host.\n iframe.setAttribute('sandbox', 'allow-scripts');\n iframe.setAttribute('title', context.guide.guideName || 'Veo');\n iframe.style.width = opts.width;\n\n const hasFixedHeight = opts.fixedHeight !== undefined && opts.fixedHeight !== null;\n if (hasFixedHeight) iframe.style.height = toCssSize(opts.fixedHeight as number | string);\n\n const token = uuidv7();\n // fix: las apps modernas usan design tokens/Tailwind. Reenviamos las custom\n // properties del host (`:root`) al iframe para que el CSS del cliente pueda\n // usar `var(--su-token)`; y opcionalmente inyectamos Tailwind (Play CDN) si el\n // autor lo pidió en `style.tailwind` (sujeto al CSP de la app — ver más abajo).\n const wantsTailwind = (step.style as Record<string, unknown> | undefined)?.tailwind === true;\n iframe.srcdoc = buildSrcdoc(step.html ?? '', step.css ?? '', step.js ?? '', token, {\n tokens: collectHostTokens(),\n tailwind: wantsTailwind,\n });\n\n const close = (): void => context.onClose();\n\n const onMessage = (event: MessageEvent): void => {\n if (event.source !== iframe.contentWindow) return;\n const data = event.data as VeoBridgeMessage | null;\n if (!data || typeof data !== 'object' || data.__veo !== token) return;\n\n switch (data.type) {\n case 'dismiss':\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'dismissed',\n });\n close();\n break;\n case 'cta':\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'cta_clicked',\n });\n if (typeof data.url === 'string' && isSafeUrl(data.url)) {\n window.open(data.url, '_blank', 'noopener,noreferrer');\n }\n if (data.close !== false) close();\n break;\n case 'navigate':\n if (typeof data.url === 'string' && isSafeUrl(data.url)) {\n window.location.assign(data.url);\n }\n break;\n case 'track':\n if (typeof data.name === 'string' && context.onTrack) {\n context.onTrack(data.name, isRecord(data.props) ? data.props : undefined);\n }\n break;\n case 'resize':\n if (!hasFixedHeight && typeof data.height === 'number' && data.height > 0) {\n iframe.style.height = `${Math.ceil(data.height)}px`;\n }\n break;\n }\n };\n window.addEventListener('message', onMessage);\n\n return { iframe, cleanup: () => window.removeEventListener('message', onMessage) };\n}\n\nexport function toCssSize(value: number | string): string {\n return typeof value === 'number' ? `${value}px` : value;\n}\n\n/**\n * Recolecta las custom properties (`--*`) definidas en `:root` del host y las\n * devuelve como un bloque `:root{…}` para inyectar en el iframe. Así el CSS de\n * una guía custom puede usar los MISMOS design tokens que la app (`var(--…)`),\n * aunque el iframe esté aislado (origen null). También expone la fuente del host\n * como `--veo-host-font`. Acotado (≤400 vars, valores ≤200 chars, sin `<>{}`).\n */\nfunction collectHostTokens(): string {\n if (typeof window === 'undefined' || typeof document === 'undefined') return '';\n try {\n const rootStyle = getComputedStyle(document.documentElement);\n const decls: string[] = [];\n const seen = new Set<string>();\n for (let i = 0; i < rootStyle.length && decls.length < 400; i++) {\n const name = rootStyle.item(i);\n if (!name.startsWith('--') || seen.has(name)) continue;\n seen.add(name);\n const value = rootStyle.getPropertyValue(name).trim();\n if (!value || value.length > 200 || /[<>{}]/.test(value)) continue;\n decls.push(`${name}:${value}`);\n }\n const bodyFont = getComputedStyle(document.body).fontFamily;\n if (bodyFont && bodyFont.length <= 200 && !/[<>{}]/.test(bodyFont)) {\n decls.push(`--veo-host-font:${bodyFont}`);\n }\n return decls.length ? `:root{${decls.join(';')}}` : '';\n } catch {\n return '';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Arma el documento del iframe. El JS del cliente puede llamar a `window.veo`\n * (bridge inyectado). `</script>`/`</style>` dentro del código se neutralizan\n * para que no corten sus bloques.\n *\n * `opts.tokens` = bloque `:root{…}` con los design tokens del host (para que el\n * CSS del cliente use `var(--…)`). `opts.tailwind` inyecta el Play CDN de\n * Tailwind para que las clases utilitarias compilen en runtime — sujeto al CSP\n * de la app (`script-src` debe permitir `cdn.tailwindcss.com`); si el CSP lo\n * bloquea, el CDN no carga y quedan solo los tokens + CSS propio.\n */\nfunction buildSrcdoc(\n html: string,\n css: string,\n js: string,\n token: string,\n opts: { tokens: string; tailwind: boolean },\n): string {\n const bridge =\n `(function(){var T=${JSON.stringify(token)};` +\n `function P(m){m.__veo=T;parent.postMessage(m,'*');}` +\n `window.veo={` +\n `dismiss:function(){P({type:'dismiss'});},` +\n `cta:function(u){P({type:'cta',url:u});},` +\n `track:function(n,p){P({type:'track',name:n,props:p||{}});},` +\n `navigate:function(u){P({type:'navigate',url:u});}};` +\n // Los <a href> dentro del iframe sandbox navegarían el iframe (la cajita),\n // no la app del host. Interceptamos el click y reenviamos la navegación al\n // host: links normales → navigate (misma pestaña); target=_blank → nueva\n // pestaña. Así los links de una guía custom \"simplemente funcionan\".\n `document.addEventListener('click',function(e){` +\n `var a=e.target&&e.target.closest?e.target.closest('a[href]'):null;` +\n `if(!a)return;` +\n `var h=a.getAttribute('href');` +\n `if(!h||h.charAt(0)==='#'||/^(javascript|mailto|tel):/i.test(h))return;` +\n `e.preventDefault();` +\n `if(a.target==='_blank'){P({type:'cta',url:a.href,close:false});}` +\n `else{P({type:'navigate',url:h});}` +\n `},true);` +\n `function H(){P({type:'resize',height:Math.ceil(document.documentElement.scrollHeight)});}` +\n `window.addEventListener('load',H);` +\n `try{if(typeof ResizeObserver!=='undefined'){new ResizeObserver(H).observe(document.documentElement);}}catch(e){}` +\n `})();`;\n\n // Tokens del host primero (para poder usarlos), luego el CSS del autor (gana).\n const tokensStyle = opts.tokens ? `<style>${escapeClosing(opts.tokens, 'style')}</style>` : '';\n // Tailwind Play CDN (opt-in). El src remoto depende del CSP de la app.\n const tailwind = opts.tailwind ? '<script src=\"https://cdn.tailwindcss.com\"></script>' : '';\n\n return (\n '<!DOCTYPE html><html><head><meta charset=\"utf-8\">' +\n '<style>html,body{margin:0;padding:0;background:transparent;font-family:var(--veo-host-font,system-ui,sans-serif);}</style>' +\n tokensStyle +\n tailwind +\n `<style>${escapeClosing(css, 'style')}</style></head><body>${html}` +\n `<script>${bridge}</script>` +\n (js ? `<script>${escapeClosing(js, 'script')}</script>` : '') +\n '</body></html>'\n );\n}\n\nfunction escapeClosing(code: string, tag: 'script' | 'style'): string {\n const rx = tag === 'script' ? /<\\/script/gi : /<\\/style/gi;\n return code.replace(rx, `<\\\\/${tag}`);\n}\n","import { computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { createCloseButton } from '../block-builder';\nimport type { CustomPlacement, GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { mountCustomFrame, toCssSize } from './custom-frame';\n\nconst DEFAULT_PLACEMENT: CustomPlacement = { mode: 'floating', position: 'bottom-right' };\nconst DEFAULT_OFFSET = 16;\nconst DEFAULT_WIDTH = 360;\n\n/**\n * Renderiza una guía `custom` montando el HTML/CSS/JS del cliente en un\n * **iframe sandbox** (ver `custom-frame.ts`). Ubicación: `floating`\n * (esquina/centro del viewport) o `anchored` (Floating UI contra un selector\n * del host). La variante embebida en el flujo es `inline-custom`.\n */\nexport class CustomRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step || typeof step.html !== 'string' || step.html.length === 0) return;\n\n const placement: CustomPlacement = step.placement ?? DEFAULT_PLACEMENT;\n\n let anchor: Element | null = null;\n if (placement.mode === 'anchored') {\n const selector =\n placement.selector ?? step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n anchor = await waitForElement(selector);\n if (!anchor) return; // sin ancla no mostramos (guía fantasma = peor UX)\n }\n\n const { root } = this.createHost();\n const doc = root.ownerDocument ?? document;\n\n const wrapper = doc.createElement('div');\n wrapper.className =\n placement.mode === 'anchored' ? 'veo-custom-anchored' : 'veo-custom-floating';\n\n const { iframe, cleanup } = mountCustomFrame(doc, step, context, {\n width: toCssSize(placement.width ?? DEFAULT_WIDTH),\n fixedHeight: placement.height ?? null,\n });\n this.registerCleanup(cleanup);\n\n wrapper.appendChild(iframe);\n // X universal por encima del iframe (el sandbox aísla el contenido del\n // cliente, así que la salida la pone el host).\n wrapper.appendChild(\n createCloseButton(\n doc,\n () => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'dismissed',\n });\n context.onClose();\n },\n 'veo-custom-close',\n ),\n );\n root.appendChild(wrapper);\n\n if (placement.mode === 'floating') {\n applyFloatingPosition(wrapper, placement);\n } else if (anchor) {\n this.registerCleanup(await this.setupAnchoredPosition(anchor, wrapper, placement));\n }\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n\n private async setupAnchoredPosition(\n anchor: Element,\n wrapper: HTMLElement,\n placement: CustomPlacement,\n ): Promise<() => void> {\n const side = placement.side ?? 'bottom';\n const update = async (): Promise<void> => {\n const { x, y } = await computePosition(anchor, wrapper, {\n placement: side,\n strategy: 'fixed',\n middleware: [offset(placement.offsetY ?? 8), flip(), shift({ padding: 8 })],\n });\n wrapper.style.left = `${x}px`;\n wrapper.style.top = `${y}px`;\n };\n await update();\n\n const reposition = (): void => {\n void update();\n };\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n return () => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n }\n}\n\n/** Fija el wrapper en una esquina/centro del viewport según `position`. */\nfunction applyFloatingPosition(wrapper: HTMLElement, placement: CustomPlacement): void {\n const position = placement.position ?? 'bottom-right';\n const ox = `${placement.offsetX ?? DEFAULT_OFFSET}px`;\n const oy = `${placement.offsetY ?? DEFAULT_OFFSET}px`;\n const s = wrapper.style;\n\n if (position === 'center') {\n s.top = '50%';\n s.left = '50%';\n s.transform = 'translate(-50%, -50%)';\n return;\n }\n\n const [vertical, horizontal] = position.split('-');\n if (vertical === 'top') s.top = oy;\n else s.bottom = oy;\n\n if (horizontal === 'left') {\n s.left = ox;\n } else if (horizontal === 'right') {\n s.right = ox;\n } else {\n s.left = '50%';\n s.transform = 'translateX(-50%)';\n }\n}\n","import { createCloseButton } from './block-builder';\nimport type { FormField, GuideRenderContext } from './types';\n\n/**\n * Construcción COMPARTIDA del contenido de una guía `form` (overlay) e\n * `inline-form` (embebida): título/texto, campos, validación de requeridos,\n * envío vía `context.onFormSubmit`, estado \"¡Gracias!\" y cierre diferido.\n * El caller pone el chrome (modal-card u tarjeta inline) y pasa la `card`\n * donde se reemplaza el contenido por el agradecimiento.\n *\n * Mismas reglas de seguridad que block-builder: cero `innerHTML`, todo texto\n * por `textContent`.\n */\nexport function mountFormContent(\n card: HTMLElement,\n context: GuideRenderContext,\n doc: Document,\n): void {\n const step = context.guide.guideSteps[0];\n if (!step) return;\n const fields = step.fields ?? [];\n\n const dismiss = (): void => {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'dismissed' });\n context.onClose();\n };\n\n const content = doc.createElement('div');\n content.className = 'veo-guide-content';\n\n if (step.title) {\n const heading = doc.createElement('h2');\n heading.className = 'veo-guide-title';\n heading.textContent = step.title;\n content.appendChild(heading);\n }\n if (step.content) {\n const paragraph = doc.createElement('p');\n paragraph.className = 'veo-guide-text';\n paragraph.textContent = step.content;\n content.appendChild(paragraph);\n }\n\n const readers: Array<{ field: FormField; read: () => unknown }> = [];\n const form = doc.createElement('form');\n form.className = 'veo-form';\n form.noValidate = true;\n for (const field of fields) {\n const { wrapper, read } = buildField(field, doc);\n readers.push({ field, read });\n form.appendChild(wrapper);\n }\n\n const error = doc.createElement('p');\n error.className = 'veo-form-error';\n error.style.display = 'none';\n form.appendChild(error);\n\n const actions = doc.createElement('div');\n actions.className = 'veo-guide-actions';\n const submit = doc.createElement('button');\n submit.type = 'submit';\n submit.className = 'veo-guide-cta';\n submit.textContent = step.ctaText || 'Enviar';\n actions.appendChild(submit);\n form.appendChild(actions);\n\n form.addEventListener('submit', (e) => {\n e.preventDefault();\n error.style.display = 'none';\n\n const answers: Record<string, unknown> = {};\n for (const { field, read } of readers) {\n const value = read();\n const empty = value === undefined || value === null || value === '';\n if (empty) {\n if (field.required) {\n error.textContent = `Completá \"${field.label}\"`;\n error.style.display = 'block';\n return;\n }\n continue;\n }\n answers[field.key] = value;\n }\n if (Object.keys(answers).length === 0) {\n error.textContent = 'Respondé al menos un campo';\n error.style.display = 'block';\n return;\n }\n\n submit.disabled = true;\n const submitFn = context.onFormSubmit ?? (() => Promise.resolve(true));\n void submitFn(answers).then((ok) => {\n if (!ok) {\n submit.disabled = false;\n error.textContent = 'No se pudo enviar. Probá de nuevo.';\n error.style.display = 'block';\n return;\n }\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'completed' });\n const note = context.isPreview\n ? (context.previewNote ?? 'Vista previa: la respuesta NO se guardó.')\n : null;\n showThanks(card, doc, note);\n window.setTimeout(() => context.onClose(), note ? 2200 : 1400);\n });\n });\n\n content.appendChild(form);\n content.appendChild(createCloseButton(doc, dismiss));\n\n card.appendChild(content);\n}\n\n/** Reemplaza el contenido de la tarjeta por un \"¡Gracias!\" breve. */\nfunction showThanks(card: HTMLElement, doc: Document, note: string | null): void {\n while (card.firstChild) card.removeChild(card.firstChild);\n const thanks = doc.createElement('div');\n thanks.className = 'veo-form-thanks';\n thanks.textContent = '✓ ¡Gracias por tu respuesta!';\n card.appendChild(thanks);\n if (note) {\n const noteEl = doc.createElement('p');\n noteEl.className = 'veo-form-preview-note';\n noteEl.textContent = note;\n card.appendChild(noteEl);\n }\n}\n\n/** Construye el DOM de un campo y devuelve su lector de valor. */\nfunction buildField(\n field: FormField,\n doc: Document,\n): { wrapper: HTMLElement; read: () => unknown } {\n const wrapper = doc.createElement('div');\n wrapper.className = 'veo-form-field';\n\n const label = doc.createElement('label');\n label.className = 'veo-form-label';\n label.textContent = field.required ? `${field.label} *` : field.label;\n wrapper.appendChild(label);\n\n switch (field.type) {\n case 'textarea': {\n const input = doc.createElement('textarea');\n input.className = 'veo-form-input';\n input.rows = 3;\n if (field.placeholder) input.placeholder = field.placeholder;\n wrapper.appendChild(input);\n return { wrapper, read: () => input.value.trim() };\n }\n case 'number': {\n const input = doc.createElement('input');\n input.type = 'number';\n input.className = 'veo-form-input';\n if (field.placeholder) input.placeholder = field.placeholder;\n wrapper.appendChild(input);\n return {\n wrapper,\n read: () => (input.value.trim() === '' ? undefined : Number(input.value)),\n };\n }\n case 'select': {\n const select = doc.createElement('select');\n select.className = 'veo-form-input';\n const blank = doc.createElement('option');\n blank.value = '';\n blank.textContent = field.placeholder || 'Elegí una opción…';\n select.appendChild(blank);\n for (const opt of field.options ?? []) {\n const option = doc.createElement('option');\n option.value = opt;\n option.textContent = opt;\n select.appendChild(option);\n }\n wrapper.appendChild(select);\n return { wrapper, read: () => select.value || undefined };\n }\n case 'radio': {\n const group = doc.createElement('div');\n group.className = 'veo-form-options';\n const name = `veo-${field.key}`;\n const inputs: HTMLInputElement[] = [];\n for (const opt of field.options ?? []) {\n const optionLabel = doc.createElement('label');\n optionLabel.className = 'veo-form-option';\n const radio = doc.createElement('input');\n radio.type = 'radio';\n radio.name = name;\n radio.value = opt;\n inputs.push(radio);\n const text = doc.createElement('span');\n text.textContent = opt;\n optionLabel.appendChild(radio);\n optionLabel.appendChild(text);\n group.appendChild(optionLabel);\n }\n wrapper.appendChild(group);\n return { wrapper, read: () => inputs.find((i) => i.checked)?.value };\n }\n case 'multiselect': {\n // Grupo de checkboxes: la respuesta es un ARRAY con las opciones marcadas.\n const group = doc.createElement('div');\n group.className = 'veo-form-options';\n const inputs: HTMLInputElement[] = [];\n for (const opt of field.options ?? []) {\n const optionLabel = doc.createElement('label');\n optionLabel.className = 'veo-form-option';\n const checkbox = doc.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.value = opt;\n inputs.push(checkbox);\n const text = doc.createElement('span');\n text.textContent = opt;\n optionLabel.appendChild(checkbox);\n optionLabel.appendChild(text);\n group.appendChild(optionLabel);\n }\n wrapper.appendChild(group);\n return {\n wrapper,\n read: () => {\n const values = inputs.filter((i) => i.checked).map((i) => i.value);\n return values.length > 0 ? values : undefined;\n },\n };\n }\n case 'checkbox': {\n const optionLabel = doc.createElement('label');\n optionLabel.className = 'veo-form-option';\n const checkbox = doc.createElement('input');\n checkbox.type = 'checkbox';\n const text = doc.createElement('span');\n text.textContent = field.placeholder || 'Sí';\n optionLabel.appendChild(checkbox);\n optionLabel.appendChild(text);\n wrapper.appendChild(optionLabel);\n // Checkbox siempre responde true/false (no “vacío”): required pide marcarlo.\n return { wrapper, read: () => (checkbox.checked ? true : field.required ? '' : false) };\n }\n case 'yesno': {\n // Radio Sí/No: dos opciones visibles, pero la respuesta es BOOLEANA\n // (true/false) — el widget \"amigable\" para props de tipo sí/no.\n const group = doc.createElement('div');\n group.className = 'veo-form-options';\n const name = `veo-${field.key}`;\n const [yesLabel, noLabel] =\n field.options?.length === 2 ? (field.options as [string, string]) : ['Sí', 'No'];\n const inputs: Array<{ input: HTMLInputElement; value: boolean }> = [];\n for (const { label: optText, value } of [\n { label: yesLabel, value: true },\n { label: noLabel, value: false },\n ]) {\n const optionLabel = doc.createElement('label');\n optionLabel.className = 'veo-form-option';\n const radio = doc.createElement('input');\n radio.type = 'radio';\n radio.name = name;\n inputs.push({ input: radio, value });\n const text = doc.createElement('span');\n text.textContent = optText;\n optionLabel.appendChild(radio);\n optionLabel.appendChild(text);\n group.appendChild(optionLabel);\n }\n wrapper.appendChild(group);\n return { wrapper, read: () => inputs.find((i) => i.input.checked)?.value };\n }\n case 'nps':\n return buildScale(wrapper, doc, 0, 10, 'veo-nps-btn');\n case 'rating':\n return buildScale(wrapper, doc, 1, 5, 'veo-rating-btn', '★');\n default: {\n const input = doc.createElement('input');\n input.type = 'text';\n input.className = 'veo-form-input';\n if (field.placeholder) input.placeholder = field.placeholder;\n wrapper.appendChild(input);\n return { wrapper, read: () => input.value.trim() };\n }\n }\n}\n\n/** Fila de botones numerados (NPS 0-10) o de estrellas (rating 1-5). */\nfunction buildScale(\n wrapper: HTMLElement,\n doc: Document,\n min: number,\n max: number,\n btnClass: string,\n symbol?: string,\n): { wrapper: HTMLElement; read: () => unknown } {\n const row = doc.createElement('div');\n row.className = 'veo-form-scale';\n let selected: number | undefined;\n const buttons: HTMLButtonElement[] = [];\n for (let n = min; n <= max; n++) {\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.className = btnClass;\n btn.textContent = symbol ?? String(n);\n btn.setAttribute('aria-label', String(n));\n btn.addEventListener('click', () => {\n selected = n;\n buttons.forEach((b, i) => {\n // Rating pinta acumulado (★★★☆☆); NPS solo el elegido.\n const active = symbol ? i + min <= n : i + min === n;\n b.classList.toggle('veo-scale-active', active);\n });\n });\n buttons.push(btn);\n row.appendChild(btn);\n }\n wrapper.appendChild(row);\n return { wrapper, read: () => selected };\n}\n","import { mountFormContent } from '../form-content';\nimport type { GuideRenderContext } from '../types';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía `form` (encuesta/NPS estilo Pendo): backdrop + tarjeta\n * centrada (mismo chrome que el modal) con los campos de `step.fields`.\n * Al enviar, las respuestas viajan vía `context.onFormSubmit` y el backend\n * las mergea como PROPIEDADES (`user_traits`) del usuario que respondió.\n *\n * El contenido (campos/envío/gracias) es compartido con `inline-form`\n * (ver `form-content.ts`); acá solo va el chrome flotante.\n */\nexport class FormRenderer extends BaseRenderer {\n render(context: GuideRenderContext): void {\n const step = context.guide.guideSteps[0];\n if (!step || (step.fields ?? []).length === 0) return;\n\n const { root } = this.createHost();\n this.applyDesign(step.style);\n const doc = root.ownerDocument ?? document;\n\n const overlay = doc.createElement('div');\n overlay.className = 'veo-modal-overlay';\n const card = doc.createElement('div');\n card.className = 'veo-modal-card';\n\n mountFormContent(card, context, doc);\n overlay.appendChild(card);\n root.appendChild(overlay);\n\n const dismiss = (): void => {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'dismissed' });\n context.onClose();\n };\n overlay.addEventListener('click', (e) => {\n if (e.target === overlay) dismiss();\n });\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') dismiss();\n };\n document.addEventListener('keydown', onKey);\n this.registerCleanup(() => document.removeEventListener('keydown', onKey));\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n}\n","import type { GuideStep } from './types';\n\n/** Dónde insertar la guía respecto al elemento ancla. Default `after`. */\nexport type InlinePosition = 'before' | 'after' | 'prepend' | 'append';\n\nexport function readInlinePosition(style: GuideStep['style']): InlinePosition {\n const p = (style as Record<string, unknown> | null | undefined)?.inlinePosition;\n return p === 'before' || p === 'prepend' || p === 'append' ? p : 'after';\n}\n\n/** Inserta el host en el flujo del DOM relativo al ancla. */\nexport function insertHost(anchor: Element, host: HTMLElement, position: InlinePosition): void {\n switch (position) {\n case 'before':\n anchor.before(host);\n break;\n case 'after':\n anchor.after(host);\n break;\n case 'prepend':\n anchor.prepend(host);\n break;\n case 'append':\n anchor.append(host);\n break;\n }\n}\n\n/**\n * Mantiene el host PEGADO al DOM. Los frameworks del host (React/Next)\n * reconcilian sus contenedores al hidratar/re-renderizar y BORRAN nodos que\n * no reconocen — la guía inline aparecía durante la carga y desaparecía al\n * montar el contenido real. Chequea cada 1s: si el host quedó desconectado,\n * re-busca el ancla y se re-inserta. Devuelve el stop() (registrarlo como\n * cleanup del renderer para que el dismiss/destroy lo corte).\n */\nexport function keepHostAttached(\n host: HTMLElement,\n selector: string,\n position: InlinePosition,\n): () => void {\n const id = window.setInterval(() => {\n if (host.isConnected) return;\n const anchor = document.querySelector(selector);\n if (anchor) insertHost(anchor, host, position);\n }, 1000);\n return () => window.clearInterval(id);\n}\n","import { createCloseButton } from '../block-builder';\nimport { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type { GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { mountCustomFrame } from './custom-frame';\n\n/**\n * Guía `inline-custom`: HTML/CSS/JS del cliente (iframe sandbox, ver\n * `custom-frame.ts`) EMBEBIDO en el flujo del DOM, junto a un elemento ancla\n * (`step.selector` + `step.style.inlinePosition`). Como el inline estándar pero\n * con código propio en vez de bloques.\n */\nexport class InlineCustomRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step || typeof step.html !== 'string' || step.html.length === 0) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n const { host, root } = this.createHost();\n host.style.display = 'block';\n const position = readInlinePosition(step.style);\n insertHost(anchor, host, position);\n // El framework del host puede borrar el nodo al re-renderizar → watchdog.\n this.registerCleanup(keepHostAttached(host, selector, position));\n const doc = root.ownerDocument ?? document;\n\n const wrapper = doc.createElement('div');\n wrapper.className = 'veo-custom-inline';\n\n const { iframe, cleanup } = mountCustomFrame(doc, step, context, { width: '100%' });\n this.registerCleanup(cleanup);\n\n wrapper.appendChild(iframe);\n wrapper.appendChild(\n createCloseButton(\n doc,\n () => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'dismissed',\n });\n context.onClose();\n },\n 'veo-custom-close',\n ),\n );\n root.appendChild(wrapper);\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n}\n","import { mountFormContent } from '../form-content';\nimport { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type { GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía `inline-form`: el MISMO formulario que `form` (campos →\n * props del usuario) pero EMBEBIDO en el flujo del DOM junto a un elemento\n * ancla, como `inline`. `step.selector` = ancla; `step.style.inlinePosition`\n * = dónde insertarse. El contenido compartido vive en `form-content.ts`.\n */\nexport class InlineFormRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step || (step.fields ?? []).length === 0) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n const { host, root } = this.createHost();\n // createHost adjuntó el host a <body>; lo movemos al flujo del DOM, junto\n // al ancla. `display:block` vence el `:host{all:initial}` (que sería inline).\n host.style.display = 'block';\n const position = readInlinePosition(step.style);\n insertHost(anchor, host, position);\n // El framework del host puede borrar el nodo al re-renderizar → watchdog.\n this.registerCleanup(keepHostAttached(host, selector, position));\n\n this.applyDesign(step.style);\n const doc = root.ownerDocument ?? document;\n\n const card = doc.createElement('div');\n card.className = 'veo-inline';\n mountFormContent(card, context, doc);\n root.appendChild(card);\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n}\n","import { buildStepContent } from '../block-builder';\nimport { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type { GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía `inline`: EMBEBIDA en el flujo del DOM, junto a un\n * elemento ancla (no flota como overlay). A diferencia de modal/banner/tooltip\n * (host fijo/absoluto sobre `body`), acá el host se mueve al flujo del\n * documento — ocupa su propio espacio en el layout.\n *\n * `step.selector` = elemento ancla; `step.style.inlinePosition`\n * (`before`|`after`|`prepend`|`append`) = dónde insertarse. Single-step.\n */\nexport class InlineRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n const { host, root } = this.createHost();\n // createHost adjuntó el host a <body>; lo movemos al flujo del DOM, junto\n // al ancla. `display:block` vence el `:host{all:initial}` (que sería inline).\n host.style.display = 'block';\n const position = readInlinePosition(step.style);\n insertHost(anchor, host, position);\n // El framework del host puede borrar el nodo al re-renderizar → watchdog.\n this.registerCleanup(keepHostAttached(host, selector, position));\n\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const card = ownerDocument.createElement('div');\n card.className = 'veo-inline';\n\n const dismiss = (action: 'dismissed' | 'cta_clicked', ctaUrl?: string) => {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n\n const content = buildStepContent(step, ownerDocument, {\n onCtaClick: (action, url) => dismiss('cta_clicked', action === 'url' ? url : undefined),\n onDismiss: () => dismiss('dismissed'),\n });\n\n card.appendChild(content);\n root.appendChild(card);\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n}\n","import { buildStepContent } from '../block-builder';\nimport type { GuideRenderContext } from '../types';\nimport { buildWalkthroughStepContent } from '../walkthrough-block-builder';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía de tipo `modal`: backdrop oscuro + tarjeta centrada.\n * Cierra al clickear el backdrop o presionar Escape.\n *\n * Single-step normal: consume `guideSteps[0]`. Si el contexto trae `nav`\n * (paso de un walkthrough heterogéneo modal→banner→tooltip), consume\n * `guideSteps[nav.stepIndex]`, muestra botones de navegación y delega\n * tracking/avance al controller (backdrop/Esc → `nav.callbacks.onSkip`).\n */\nexport class ModalRenderer extends BaseRenderer {\n render(context: GuideRenderContext): void {\n const idx = context.nav?.stepIndex ?? 0;\n const step = context.guide.guideSteps[idx];\n if (!step) return;\n\n const { root } = this.createHost();\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const overlay = ownerDocument.createElement('div');\n overlay.className = 'veo-modal-overlay';\n\n const card = ownerDocument.createElement('div');\n card.className = 'veo-modal-card';\n\n const dismiss = (action: 'dismissed' | 'cta_clicked', ctaUrl?: string) => {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: idx, action });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n // En modo navegación el cierre lo maneja el controller vía onSkip.\n const onBackdropOrEsc = (): void => {\n if (context.nav) context.nav.callbacks.onSkip();\n else dismiss('dismissed');\n };\n\n const content = context.nav\n ? buildWalkthroughStepContent(\n step,\n context.nav.stepIndex,\n context.nav.totalSteps,\n ownerDocument,\n context.nav.callbacks,\n )\n : buildStepContent(step, ownerDocument, {\n onCtaClick: (action, url) => dismiss('cta_clicked', action === 'url' ? url : undefined),\n onDismiss: () => dismiss('dismissed'),\n });\n\n card.appendChild(content);\n overlay.appendChild(card);\n root.appendChild(overlay);\n\n overlay.addEventListener('click', (e) => {\n if (e.target === overlay) onBackdropOrEsc();\n });\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onBackdropOrEsc();\n };\n document.addEventListener('keydown', onKey);\n this.registerCleanup(() => document.removeEventListener('keydown', onKey));\n\n // El `shown` de un walkthrough lo emite el controller (step 0) / step_advanced.\n if (!context.nav) {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n }\n}\n","/**\n * Posicionamiento del caret (flecha) que apunta al elemento anclado, compartido\n * por el tooltip y el walkthrough. Floating UI (middleware `arrow`) da el\n * desplazamiento a lo largo del borde; acá lo aplicamos y \"pegamos\" el caret al\n * lado del tooltip enfrentado al ancla.\n */\n\n/** Lado del tooltip donde se \"pega\" el caret, opuesto al placement resuelto. */\nconst STATIC_SIDE: Record<string, 'top' | 'bottom' | 'left' | 'right'> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\n/**\n * Ubica el caret sobre el borde del tooltip enfrentado al ancla. Floating UI\n * da el desplazamiento a lo largo del borde (`x` o `y`); el otro eje se fija a\n * `-6px` (mitad del caret) para que sobresalga.\n */\nexport function positionArrow(\n arrowEl: HTMLElement,\n placement: string,\n data: { x?: number; y?: number } | undefined,\n): void {\n const side = STATIC_SIDE[placement.split('-')[0] ?? 'bottom'] ?? 'top';\n for (const prop of ['top', 'bottom', 'left', 'right'] as const) {\n arrowEl.style.setProperty(prop, '');\n }\n if (data?.x != null) arrowEl.style.setProperty('left', `${data.x}px`);\n if (data?.y != null) arrowEl.style.setProperty('top', `${data.y}px`);\n arrowEl.style.setProperty(side, '-6px');\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { buildStepContent } from '../block-builder';\nimport type { GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { positionArrow } from './floating-arrow';\n\n/**\n * Renderiza una guía tipo `tooltip` anclada a un elemento del host.\n * Espera el ancla con MutationObserver (selector puede no existir aún\n * en SPAs), la posiciona con Floating UI y la re-posiciona en scroll\n * y resize.\n *\n * Si el ancla no aparece dentro del timeout, no muestra nada. Esto es\n * deliberado: las guías \"fantasma\" sin destino son peor UX que no\n * mostrar.\n */\nexport class TooltipRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n const { root } = this.createHost();\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const tooltip = ownerDocument.createElement('div');\n tooltip.className = 'veo-tooltip';\n\n const dismiss = (action: 'dismissed' | 'cta_clicked', ctaUrl?: string) => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action,\n });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n\n const content = buildStepContent(step, ownerDocument, {\n onCtaClick: (action, url) => {\n dismiss('cta_clicked', action === 'url' ? url : undefined);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n\n tooltip.appendChild(content);\n\n // Caret que apunta al elemento anclado (se reposiciona junto al tooltip).\n const arrowEl = ownerDocument.createElement('div');\n arrowEl.className = 'veo-tooltip-arrow';\n tooltip.appendChild(arrowEl);\n\n root.appendChild(tooltip);\n\n const updatePosition = async (): Promise<void> => {\n const { x, y, placement, middlewareData } = await computePosition(anchor, tooltip, {\n placement: 'bottom',\n middleware: [offset(10), flip(), shift({ padding: 8 }), arrow({ element: arrowEl })],\n });\n tooltip.style.left = `${x}px`;\n tooltip.style.top = `${y}px`;\n positionArrow(arrowEl, placement, middlewareData.arrow);\n };\n\n await updatePosition();\n\n const reposition = (): void => {\n void updatePosition();\n };\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n this.registerCleanup(() => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n });\n\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'shown',\n });\n }\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { WALKTHROUGH_STEP_SELECTOR_TIMEOUT_MS } from '../constants';\nimport type { ResolvedGuide, WalkthroughCallbacks } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { buildWalkthroughStepContent } from '../walkthrough-block-builder';\nimport { BaseRenderer } from './base-renderer';\nimport { positionArrow } from './floating-arrow';\n\nexport interface WalkthroughRenderContext {\n guide: ResolvedGuide;\n currentStepIndex: number;\n callbacks: WalkthroughCallbacks;\n}\n\n/**\n * Renderiza UN step de un walkthrough — variante de tooltip con\n * navegación. Se destruye y re-crea por step en lugar de actualizar el\n * DOM en sitio: como cada step puede anclarse a un selector distinto,\n * recomputar todo es más simple y barato que tracking diffs.\n *\n * `render` retorna `boolean` (a diferencia de los demás renderers) para\n * señalar al controller si el ancla apareció a tiempo. Si devuelve\n * `false`, el controller cancela el walkthrough limpiamente.\n */\nexport class WalkthroughRenderer extends BaseRenderer<WalkthroughRenderContext, boolean> {\n async render(context: WalkthroughRenderContext): Promise<boolean> {\n const step = context.guide.guideSteps[context.currentStepIndex];\n if (!step) return false;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return false;\n\n const anchor = await waitForElement(selector, WALKTHROUGH_STEP_SELECTOR_TIMEOUT_MS);\n if (!anchor) return false;\n\n const { root } = this.createHost();\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const tooltip = ownerDocument.createElement('div');\n tooltip.className = 'veo-walkthrough';\n\n const content = buildWalkthroughStepContent(\n step,\n context.currentStepIndex,\n context.guide.guideSteps.length,\n ownerDocument,\n context.callbacks,\n );\n tooltip.appendChild(content);\n\n // Caret que apunta al elemento anclado (se reposiciona junto al tooltip).\n const arrowEl = ownerDocument.createElement('div');\n arrowEl.className = 'veo-walkthrough-arrow';\n tooltip.appendChild(arrowEl);\n\n root.appendChild(tooltip);\n\n const updatePosition = async (): Promise<void> => {\n const { x, y, placement, middlewareData } = await computePosition(anchor, tooltip, {\n placement: 'bottom',\n middleware: [offset(10), flip(), shift({ padding: 8 }), arrow({ element: arrowEl })],\n });\n tooltip.style.left = `${x}px`;\n tooltip.style.top = `${y}px`;\n positionArrow(arrowEl, placement, middlewareData.arrow);\n };\n\n await updatePosition();\n\n const reposition = (): void => {\n void updatePosition();\n };\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n this.registerCleanup(() => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n });\n\n return true;\n }\n}\n","import { WALKTHROUGH_ABANDONMENT_TIMEOUT_MS, WALKTHROUGH_STATE_KEY_PREFIX } from './constants';\nimport type { WalkthroughState } from './types';\n\n/**\n * Estado persistente del walkthrough activo. Solo permite UNO por\n * workspace (namespace de apiKey). Vive en `localStorage` para sobrevivir\n * recargas de página: el step actual + el guideId alcanzan para resumir\n * desde donde quedó el usuario.\n *\n * Si pasan más de `WALKTHROUGH_ABANDONMENT_TIMEOUT_MS` sin progreso, se\n * considera abandonado: la próxima llamada a `current()` lo limpia\n * silenciosamente. NO se reporta `dismissed` al backend en ese caso —\n * abandonarse no es un acto del usuario.\n */\nexport class WalkthroughStateManager {\n private readonly storageKey: string;\n private state: WalkthroughState | null = null;\n\n constructor(namespace: string) {\n this.storageKey = `${WALKTHROUGH_STATE_KEY_PREFIX}${namespace}`;\n this.state = this.load();\n if (this.state && this.isAbandoned(this.state)) {\n this.clear();\n }\n }\n\n /**\n * Estado del walkthrough activo. Devuelve `null` si no hay ninguno o si\n * el último progreso fue hace más del timeout (en ese caso también\n * limpia el storage como side-effect).\n */\n current(): WalkthroughState | null {\n if (!this.state) return null;\n if (this.isAbandoned(this.state)) {\n this.clear();\n return null;\n }\n return this.state;\n }\n\n /** Atajo legible para el controller. */\n hasActive(): boolean {\n return this.current() !== null;\n }\n\n /**\n * Inicia un nuevo walkthrough en step 0. Sobreescribe cualquier estado\n * previo — los callers (controller) son responsables de verificar\n * `hasActive()` antes si necesitan exclusividad.\n */\n start(guideId: string, totalSteps: number): WalkthroughState {\n const now = Date.now();\n this.state = {\n guideId,\n totalSteps,\n currentStepIndex: 0,\n startedAt: now,\n lastProgressAt: now,\n };\n this.persist();\n return this.state;\n }\n\n /**\n * Avanza al siguiente step. Si el step resultante excede `totalSteps`,\n * devuelve `null` y NO toca el estado — el controller debe interpretar\n * eso como \"ya estamos en el último, no hay próximo\" y disparar\n * `complete` vía el handler del botón \"Finalizar\".\n */\n advance(): WalkthroughState | null {\n if (!this.state) return null;\n\n const next = this.state.currentStepIndex + 1;\n if (next >= this.state.totalSteps) return null;\n\n this.state = {\n ...this.state,\n currentStepIndex: next,\n lastProgressAt: Date.now(),\n };\n this.persist();\n return this.state;\n }\n\n /**\n * Retrocede al step anterior. En step 0 no hace nada y devuelve el\n * estado tal cual (el botón \"Atrás\" no debería estar visible en el\n * primer step, pero por defensa el manager también lo guard-ea).\n */\n back(): WalkthroughState | null {\n if (!this.state) return null;\n if (this.state.currentStepIndex === 0) return this.state;\n\n this.state = {\n ...this.state,\n currentStepIndex: this.state.currentStepIndex - 1,\n lastProgressAt: Date.now(),\n };\n this.persist();\n return this.state;\n }\n\n /** Limpia el estado activo (skip, complete, abandono, guía borrada). */\n clear(): void {\n this.state = null;\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.removeItem(this.storageKey);\n } catch {\n // Storage bloqueado — no rompemos la app.\n }\n }\n\n private isAbandoned(state: WalkthroughState): boolean {\n return Date.now() - state.lastProgressAt > WALKTHROUGH_ABANDONMENT_TIMEOUT_MS;\n }\n\n private load(): WalkthroughState | null {\n if (typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== 'object') return null;\n const candidate = parsed as Partial<WalkthroughState>;\n if (\n typeof candidate.guideId !== 'string' ||\n typeof candidate.totalSteps !== 'number' ||\n typeof candidate.currentStepIndex !== 'number' ||\n typeof candidate.startedAt !== 'number' ||\n typeof candidate.lastProgressAt !== 'number'\n ) {\n return null;\n }\n return candidate as WalkthroughState;\n } catch {\n return null;\n }\n }\n\n private persist(): void {\n if (typeof localStorage === 'undefined' || !this.state) return;\n try {\n localStorage.setItem(this.storageKey, JSON.stringify(this.state));\n } catch {\n // Quota exceeded — silently fail. El walkthrough en memoria sigue.\n }\n }\n}\n","import type { VeoClient } from '../../types';\nimport {\n DEFAULT_TRACKER_BATCH_SIZE,\n DEFAULT_TRACKER_FLUSH_INTERVAL_MS,\n DEFAULT_TRACKER_MAX_RETRIES,\n} from './constants';\nimport { GuideFrequencyCache, namespaceFromApiKey } from './guide-frequency-cache';\nimport { GuideResolverClient } from './guide-resolver-client';\nimport { GuideTrackerClient } from './guide-tracker-client';\nimport { GuideTrackerQueue } from './guide-tracker-queue';\nimport { BannerRenderer } from './renderers/banner-renderer';\nimport type { BaseRenderer } from './renderers/base-renderer';\nimport { CustomRenderer } from './renderers/custom-renderer';\nimport { FormRenderer } from './renderers/form-renderer';\nimport { InlineCustomRenderer } from './renderers/inline-custom-renderer';\nimport { InlineFormRenderer } from './renderers/inline-form-renderer';\nimport { InlineRenderer } from './renderers/inline-renderer';\nimport { ModalRenderer } from './renderers/modal-renderer';\nimport { TooltipRenderer } from './renderers/tooltip-renderer';\nimport { WalkthroughRenderer } from './renderers/walkthrough-renderer';\nimport type {\n FrequencyStatus,\n GuideInteractionAction,\n GuideInteractionEvent,\n GuideType,\n ResolvedGuide,\n WalkthroughCallbacks,\n} from './types';\nimport { WalkthroughStateManager } from './walkthrough-state';\n\nexport interface GuidesControllerConfig {\n apiUrl: string;\n apiKey: string;\n debug?: boolean;\n /** Override del resolver (tests). */\n resolver?: GuideResolverClient;\n /** Override del tracker queue (tests). */\n trackerQueue?: GuideTrackerQueue;\n /** Override del cache (tests). */\n frequencyCache?: GuideFrequencyCache;\n /** Override del walkthrough state manager (tests). */\n walkthroughState?: WalkthroughStateManager;\n}\n\n/** Mapeo `action → cache status`. Solo acciones terminales mutan el cache. */\nconst STATUS_BY_ACTION: Record<GuideInteractionAction, FrequencyStatus | null> = {\n shown: 'shown',\n dismissed: 'dismissed',\n cta_clicked: null,\n step_advanced: null,\n step_back: null,\n completed: 'completed',\n};\n\n/**\n * Orquesta el ciclo de vida de las guías:\n *\n * 1. `pageview`/`identify` → `checkGuides(url, sessionId)`.\n * 2. Si hay un walkthrough activo (estado persistido en localStorage),\n * tiene prioridad: se intenta resumir en la página actual antes de\n * consultar nuevas guías. Si el selector del step actual aparece,\n * se pinta; si no, se cancela el walkthrough limpiamente.\n * 3. Si no hay walkthrough activo, se consulta `/v1/guides/resolve` y\n * se procesa cada guía:\n * - `walkthrough` con varios steps → arranca un walkthrough\n * (uno a la vez; el resto se ignora si ya hay uno).\n * - single-step → modal/banner/tooltip como antes.\n * 4. Cada interaction actualiza el cache local Y se encola para\n * `POST /v1/guides/:id/interactions`.\n *\n * Dedupe: `dispatched` guarda `${guideId}:${action}` ya encolados en la\n * sesión actual del SDK. Las acciones por-step de walkthroughs no\n * usan dedupe — cada `step_advanced` puede repetirse y representa una\n * navegación distinta.\n */\nexport class GuidesController {\n private readonly resolver: GuideResolverClient;\n private readonly trackerQueue: GuideTrackerQueue;\n private readonly frequencyCache: GuideFrequencyCache;\n private readonly walkthroughState: WalkthroughStateManager;\n private readonly debug: boolean;\n /** Para `POST /v1/guides/:id/form-response` (respuestas de guías form). */\n private readonly apiUrl: string;\n private readonly apiKey: string;\n private readonly activeRenderers = new Set<BaseRenderer>();\n /**\n * Guías single-step actualmente en pantalla, por `guideId`. Evita repintar/\n * duplicar la misma guía en cada pageview de una SPA (p.ej. una guía inline\n * anclada a un elemento persistente). Se libera al cerrarse la guía.\n */\n private readonly activeByGuideId = new Map<string, BaseRenderer>();\n private readonly dispatched = new Set<string>();\n /**\n * Renderer del paso de walkthrough activo. Puede ser el `WalkthroughRenderer`\n * (tooltip anclado) o un Modal/Banner con navegación (walkthrough heterogéneo);\n * tipamos por `destroy()`, lo único que el controller necesita.\n */\n private activeWalkthroughRenderer: { destroy(): void } | null = null;\n private activeWalkthroughGuide: ResolvedGuide | null = null;\n\n constructor(\n private readonly client: VeoClient,\n config: GuidesControllerConfig,\n ) {\n this.debug = config.debug === true;\n this.apiUrl = config.apiUrl;\n this.apiKey = config.apiKey;\n this.resolver =\n config.resolver ?? new GuideResolverClient(config.apiUrl, config.apiKey, this.debug);\n\n if (config.trackerQueue) {\n this.trackerQueue = config.trackerQueue;\n } else {\n const httpClient = new GuideTrackerClient(config.apiUrl, config.apiKey);\n this.trackerQueue = new GuideTrackerQueue({\n client: httpClient,\n flushIntervalMs: DEFAULT_TRACKER_FLUSH_INTERVAL_MS,\n batchSize: DEFAULT_TRACKER_BATCH_SIZE,\n maxRetries: DEFAULT_TRACKER_MAX_RETRIES,\n onError: (err, item) => {\n if (this.debug) {\n console.warn(\n `[veo] dropped guide interaction after retries: guideId=${item.guideId} action=${item.payload.action}`,\n err,\n );\n }\n },\n });\n }\n\n const namespace = namespaceFromApiKey(config.apiKey);\n this.frequencyCache = config.frequencyCache ?? new GuideFrequencyCache(namespace);\n this.walkthroughState = config.walkthroughState ?? new WalkthroughStateManager(namespace);\n }\n\n /** Cuántas interactions hay pendientes de envío. Útil para debug en demo. */\n get pendingInteractions(): number {\n return this.trackerQueue.size;\n }\n\n /** Limpia el cache local (botón \"reset\" del demo, tests). */\n clearFrequencyCache(): void {\n this.frequencyCache.clear();\n }\n\n /** Limpia el walkthrough activo (debug del demo). */\n clearWalkthroughState(): void {\n this.tearDownWalkthrough();\n }\n\n /** Punto de entrada principal. Llamado en cada pageview/identify. */\n async checkGuides(pageUrl: string, sessionId: string): Promise<void> {\n const endUserId = this.client.getEndUserId();\n if (!endUserId) {\n if (this.debug) console.log('[veo] guides: skipped, no endUserId yet');\n return;\n }\n\n if (await this.tryResumeWalkthrough(endUserId, sessionId, pageUrl)) {\n return;\n }\n\n let guides: ResolvedGuide[];\n try {\n guides = await this.resolver.resolve(endUserId, pageUrl);\n } catch (err) {\n if (this.debug) console.error('[veo] guides resolver threw:', err);\n return;\n }\n if (this.debug) console.log(`[veo] guides: ${guides.length} eligible at ${pageUrl}`);\n\n for (const guide of guides) {\n if (this.frequencyCache.shouldFilter(guide.guideId, guide.displayFrequency)) {\n if (this.debug) console.log(`[veo] guides: filtered locally guideId=${guide.guideId}`);\n continue;\n }\n\n // Ya está en pantalla → no repintar/duplicar (clave en SPAs: cada\n // navegación dispara un pageview, pero la guía sigue montada).\n if (this.activeByGuideId.has(guide.guideId)) {\n if (this.debug) console.log(`[veo] guides: already shown guideId=${guide.guideId}`);\n continue;\n }\n\n if (guide.guideType === 'walkthrough' && guide.guideSteps.length > 1) {\n if (this.walkthroughState.hasActive()) {\n if (this.debug)\n console.log(`[veo] guides: walkthrough ${guide.guideId} skipped (another active)`);\n continue;\n }\n await this.startWalkthrough(guide, endUserId, sessionId, pageUrl);\n // No retornamos: las guías single-step pueden seguir mostrándose\n // en paralelo. Solo bloqueamos OTROS walkthroughs vía hasActive().\n continue;\n }\n\n this.runSingleStepRender(guide, sessionId, pageUrl);\n }\n }\n\n /** Cierra todas las guías activas, limpia cache de dispatch y para timers. */\n destroy(): void {\n for (const renderer of this.activeRenderers) {\n try {\n renderer.destroy();\n } catch (err) {\n if (this.debug) console.error('[veo] renderer destroy failed:', err);\n }\n }\n this.activeRenderers.clear();\n this.activeByGuideId.clear();\n if (this.activeWalkthroughRenderer) {\n try {\n this.activeWalkthroughRenderer.destroy();\n } catch {\n // swallow — el cleanup no debe propagar\n }\n this.activeWalkthroughRenderer = null;\n this.activeWalkthroughGuide = null;\n }\n this.dispatched.clear();\n this.trackerQueue.destroy();\n }\n\n private runSingleStepRender(guide: ResolvedGuide, sessionId: string, pageUrl: string): void {\n const renderer = this.createSingleStepRenderer(guide.guideType);\n if (!renderer) return;\n\n // Reservar el slot YA (antes del delay) para que pageviews rápidos no\n // disparen dos renders de la misma guía.\n this.activeByGuideId.set(guide.guideId, renderer);\n\n const delayMs = guide.activationRules.delayMs ?? 0;\n window.setTimeout(\n () => this.mountSingleStepRenderer(guide, renderer, sessionId, pageUrl),\n delayMs,\n );\n }\n\n private mountSingleStepRenderer(\n guide: ResolvedGuide,\n renderer: BaseRenderer,\n sessionId: string,\n pageUrl: string,\n ): void {\n this.activeRenderers.add(renderer);\n this.activeByGuideId.set(guide.guideId, renderer);\n\n const onClose = (): void => {\n renderer.destroy();\n this.activeRenderers.delete(renderer);\n if (this.activeByGuideId.get(guide.guideId) === renderer) {\n this.activeByGuideId.delete(guide.guideId);\n }\n };\n\n const onInteraction = (event: GuideInteractionEvent): void => {\n this.handleInteraction(guide, sessionId, pageUrl, event);\n };\n\n const onTrack = (eventName: string, properties?: Record<string, unknown>): void => {\n this.client.track(eventName, properties);\n };\n\n const onFormSubmit = (answers: Record<string, unknown>): Promise<boolean> =>\n this.submitFormResponse(guide.guideId, answers);\n\n try {\n void renderer.render({ guide, onInteraction, onClose, onTrack, onFormSubmit });\n } catch (err) {\n if (this.debug) console.error('[veo] renderer.render threw:', err);\n this.activeRenderers.delete(renderer);\n if (this.activeByGuideId.get(guide.guideId) === renderer) {\n this.activeByGuideId.delete(guide.guideId);\n }\n }\n }\n\n /**\n * Si hay un walkthrough persistido, intenta pintar el step actual en\n * la página actual. Retorna `true` si lo intentó (sea éxito o cancel),\n * `false` si no había walkthrough activo.\n *\n * Cancela limpiamente (sin enviar `dismissed` falso) cuando:\n * - La guía fue eliminada en el backend (404 → `fetchById` devuelve null).\n * - La guía cambió de tipo y ya no es walkthrough.\n * - El selector del step actual no aparece dentro del timeout.\n */\n private async tryResumeWalkthrough(\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n ): Promise<boolean> {\n const state = this.walkthroughState.current();\n if (!state) return false;\n\n const guide = await this.resolver.fetchById(state.guideId);\n if (!guide || guide.guideType !== 'walkthrough') {\n if (this.debug)\n console.log(`[veo] guides: walkthrough ${state.guideId} no longer available, cleaning up`);\n this.tearDownWalkthrough();\n return true;\n }\n\n // El cache local podría tener una versión más vieja del total; usamos\n // siempre el del backend.\n const stepIndex = Math.min(state.currentStepIndex, guide.guideSteps.length - 1);\n await this.renderWalkthroughStep(guide, stepIndex, endUserId, sessionId, pageUrl);\n return true;\n }\n\n private async startWalkthrough(\n guide: ResolvedGuide,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n ): Promise<void> {\n this.walkthroughState.start(guide.guideId, guide.guideSteps.length);\n const rendered = await this.renderWalkthroughStep(guide, 0, endUserId, sessionId, pageUrl);\n if (!rendered) return; // teardown ya corrió, no reportamos shown.\n // Reportamos `shown` SOLO al arrancar (step 0). Steps siguientes\n // se cubren con `step_advanced`/`step_back`. Marcamos cache local\n // también para que `displayFrequency='once'` filtre en la próxima\n // pageview aunque la interaction aún esté en la queue.\n this.enqueueInteractionOnce(guide.guideId, endUserId, sessionId, pageUrl, 'shown', 0);\n this.frequencyCache.record(guide.guideId, 'shown');\n }\n\n /**\n * Pinta el step indicado. Reusa la guía (no fetcha): el caller debe\n * traerla. Retorna `true` si el render fue exitoso. En caso contrario\n * ya disparó el teardown — el caller no debe seguir reportando.\n */\n private async renderWalkthroughStep(\n guide: ResolvedGuide,\n stepIndex: number,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n ): Promise<boolean> {\n if (this.activeWalkthroughRenderer) {\n this.activeWalkthroughRenderer.destroy();\n this.activeWalkthroughRenderer = null;\n }\n\n this.activeWalkthroughGuide = guide;\n\n const callbacks: WalkthroughCallbacks = {\n onNext: () => this.handleWalkthroughNext(endUserId, sessionId, pageUrl),\n onBack: () => this.handleWalkthroughBack(endUserId, sessionId, pageUrl),\n onSkip: () => this.handleWalkthroughSkip(endUserId, sessionId, pageUrl),\n onComplete: () => this.handleWalkthroughComplete(endUserId, sessionId, pageUrl),\n };\n\n // Walkthrough HETEROGÉNEO: un paso puede pedir renderizarse como modal o\n // banner (via `step.style.render`). Esos renderers siempre montan (no\n // dependen de un ancla), así que reportamos éxito directo. El resto\n // (tooltip/default) usa el WalkthroughRenderer anclado.\n const step = guide.guideSteps[stepIndex];\n const render = readStepRender(step);\n if (render === 'modal' || render === 'banner') {\n const renderer = render === 'modal' ? new ModalRenderer() : new BannerRenderer();\n try {\n renderer.render({\n guide,\n onInteraction: () => {},\n onClose: () => {},\n nav: { stepIndex, totalSteps: guide.guideSteps.length, callbacks },\n });\n } catch (err) {\n if (this.debug) console.error('[veo] sequence renderer threw:', err);\n this.tearDownWalkthrough();\n return false;\n }\n this.activeWalkthroughRenderer = renderer;\n return true;\n }\n\n const renderer = new WalkthroughRenderer();\n let success = false;\n try {\n success = await renderer.render({ guide, currentStepIndex: stepIndex, callbacks });\n } catch (err) {\n if (this.debug) console.error('[veo] walkthrough renderer threw:', err);\n }\n\n if (!success) {\n if (this.debug)\n console.warn(\n `[veo] walkthrough ${guide.guideId} step ${stepIndex} could not render, cancelling`,\n );\n this.tearDownWalkthrough();\n return false;\n }\n\n this.activeWalkthroughRenderer = renderer;\n return true;\n }\n\n private handleWalkthroughNext(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n if (!guide) return;\n\n const newState = this.walkthroughState.advance();\n if (!newState) {\n // Ya estábamos en el último step. No debería pasar (el botón\n // dispara onComplete en ese caso), pero por defensa lo manejamos.\n this.handleWalkthroughComplete(endUserId, sessionId, pageUrl);\n return;\n }\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'step_advanced',\n newState.currentStepIndex,\n );\n void this.renderWalkthroughStep(\n guide,\n newState.currentStepIndex,\n endUserId,\n sessionId,\n pageUrl,\n );\n }\n\n private handleWalkthroughBack(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n if (!guide) return;\n\n const state = this.walkthroughState.current();\n if (!state || state.currentStepIndex === 0) return;\n\n const newState = this.walkthroughState.back();\n if (!newState) return;\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'step_back',\n newState.currentStepIndex,\n );\n void this.renderWalkthroughStep(\n guide,\n newState.currentStepIndex,\n endUserId,\n sessionId,\n pageUrl,\n );\n }\n\n private handleWalkthroughSkip(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n const state = this.walkthroughState.current();\n if (!guide || !state) return;\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'dismissed',\n state.currentStepIndex,\n );\n this.frequencyCache.record(guide.guideId, 'dismissed');\n this.tearDownWalkthrough();\n }\n\n private handleWalkthroughComplete(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n const state = this.walkthroughState.current();\n if (!guide || !state) return;\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'completed',\n state.currentStepIndex,\n );\n this.frequencyCache.record(guide.guideId, 'completed');\n this.tearDownWalkthrough();\n }\n\n private tearDownWalkthrough(): void {\n if (this.activeWalkthroughRenderer) {\n try {\n this.activeWalkthroughRenderer.destroy();\n } catch {\n // swallow\n }\n }\n this.activeWalkthroughRenderer = null;\n this.activeWalkthroughGuide = null;\n this.walkthroughState.clear();\n }\n\n /**\n * Tras cada interaction single-step:\n * 1. dedupe (no enviar 2× la misma `(guideId, action)` por sesión)\n * 2. actualizar el cache local si corresponde\n * 3. encolar el POST\n *\n * El endUserId se lee del client EN ESTE MOMENTO (no en el render),\n * por si el usuario se identificó después de que la guía apareció.\n */\n private handleInteraction(\n guide: ResolvedGuide,\n sessionId: string,\n pageUrl: string,\n event: GuideInteractionEvent,\n ): void {\n const dedupKey = `${guide.guideId}:${event.action}`;\n if (this.dispatched.has(dedupKey)) {\n if (this.debug) console.log(`[veo] guides: dedup hit ${dedupKey}`);\n return;\n }\n this.dispatched.add(dedupKey);\n\n const cacheStatus = STATUS_BY_ACTION[event.action];\n if (cacheStatus) this.frequencyCache.record(guide.guideId, cacheStatus);\n\n const endUserId = this.client.getEndUserId();\n if (!endUserId) {\n if (this.debug)\n console.warn('[veo] guides: interaction without endUserId — skipping enqueue');\n return;\n }\n\n this.trackerQueue.enqueue({\n guideId: guide.guideId,\n payload: {\n endUserId,\n sessionId,\n action: event.action,\n stepIndex: event.stepIndex,\n pageUrl,\n pagePath: extractPath(pageUrl),\n },\n });\n }\n\n /**\n * Encola una interacción de walkthrough SIN pasar por el dedup set.\n * Acciones como `step_advanced` se repiten naturalmente (cada next es\n * una navegación distinta) y deduplicarlas perdería datos.\n */\n private enqueueInteraction(\n guideId: string,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n action: GuideInteractionAction,\n stepIndex: number,\n ): void {\n this.trackerQueue.enqueue({\n guideId,\n payload: {\n endUserId,\n sessionId,\n action,\n stepIndex,\n pageUrl,\n pagePath: extractPath(pageUrl),\n },\n });\n }\n\n /**\n * Encola con dedup por sesión del SDK. Para `shown` del primer step:\n * no queremos re-emitirlo si el usuario navega entre dos páginas que\n * matchean el mismo step.\n */\n private enqueueInteractionOnce(\n guideId: string,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n action: GuideInteractionAction,\n stepIndex: number,\n ): void {\n const dedupKey = `${guideId}:${action}:${stepIndex}`;\n if (this.dispatched.has(dedupKey)) return;\n this.dispatched.add(dedupKey);\n this.enqueueInteraction(guideId, endUserId, sessionId, pageUrl, action, stepIndex);\n }\n\n private createSingleStepRenderer(type: GuideType): BaseRenderer | null {\n switch (type) {\n case 'modal':\n return new ModalRenderer();\n case 'banner':\n return new BannerRenderer();\n case 'tooltip':\n return new TooltipRenderer();\n case 'custom':\n return new CustomRenderer();\n case 'inline':\n return new InlineRenderer();\n case 'inline-custom':\n return new InlineCustomRenderer();\n case 'form':\n return new FormRenderer();\n case 'inline-form':\n return new InlineFormRenderer();\n case 'walkthrough':\n return null;\n }\n }\n\n /**\n * Envía las respuestas de una guía `form` al backend, que las mergea como\n * propiedades del usuario. Usa el endUserId actual (o el anónimo si aún no\n * hubo identify — el backend pre-crea la fila igual que identify).\n */\n private async submitFormResponse(\n guideId: string,\n answers: Record<string, unknown>,\n ): Promise<boolean> {\n const endUserId = this.client.getEndUserId() ?? this.client.getAnonymousId();\n try {\n const res = await fetch(`${this.apiUrl}/v1/guides/${guideId}/form-response`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Api-Key': this.apiKey },\n body: JSON.stringify({ endUserId, answers }),\n });\n if (!res.ok && this.debug) {\n console.warn('[veo] form-response respondió', res.status);\n }\n return res.ok;\n } catch (err) {\n if (this.debug) console.warn('[veo] form-response falló:', err);\n return false;\n }\n }\n}\n\nfunction extractPath(url: string): string {\n try {\n return new URL(url).pathname;\n } catch {\n return '/';\n }\n}\n\n/**\n * Cómo se presenta un paso dentro de un walkthrough. `style.render` ∈\n * `modal`/`banner` usa esos renderers (con navegación); cualquier otro valor\n * (incluido ausente o `tooltip`) usa el WalkthroughRenderer anclado.\n */\nfunction readStepRender(step: ResolvedGuide['guideSteps'][number] | undefined): string {\n const r = (step?.style as Record<string, unknown> | null | undefined)?.render;\n return typeof r === 'string' ? r : 'walkthrough';\n}\n","/**\n * Modo preview de guías. Pinta una guía con los MISMOS renderers que el\n * runtime real, pero SIN resolver, cache de frecuencia, estado de\n * walkthrough ni tracking de interacciones. Pensado para el builder\n * no-code del dashboard: ver cómo queda una guía antes de publicarla.\n *\n * No requiere un `VeoClient` ni apiKey — es una función pura sobre el DOM.\n * Solo puede haber UNA preview activa a la vez; abrir otra cierra la\n * anterior (igual que el dashboard al cambiar de guía o de step).\n *\n * Diferencias de comportamiento vs. runtime real (deliberadas):\n * - Las interacciones NO se reportan al backend.\n * - `displayFrequency`/`activationRules` (url/trigger/delay) se ignoran:\n * la preview siempre pinta de inmediato. Solo se respeta el `selector`\n * del step (o el `activationRules.selector` como fallback) para anclar\n * tooltips/walkthroughs.\n * - CTA con `ctaAction: 'url'` sigue abriendo la URL en una pestaña nueva\n * (igual que en producción) para poder probar el enlace.\n */\nimport { hasDocument } from '../../utils/safe-env';\nimport { BannerRenderer } from './renderers/banner-renderer';\nimport type { BaseRenderer } from './renderers/base-renderer';\nimport { CustomRenderer } from './renderers/custom-renderer';\nimport { FormRenderer } from './renderers/form-renderer';\nimport { InlineCustomRenderer } from './renderers/inline-custom-renderer';\nimport { InlineFormRenderer } from './renderers/inline-form-renderer';\nimport { InlineRenderer } from './renderers/inline-renderer';\nimport { ModalRenderer } from './renderers/modal-renderer';\nimport { TooltipRenderer } from './renderers/tooltip-renderer';\nimport { WalkthroughRenderer } from './renderers/walkthrough-renderer';\nimport type {\n ActivationRules,\n GuideInteractionEvent,\n GuideStep,\n GuideType,\n ResolvedGuide,\n WalkthroughCallbacks,\n} from './types';\n\n/** Entrada mínima para previsualizar una guía. */\nexport interface PreviewGuideInput {\n guideType: GuideType;\n guideSteps: GuideStep[];\n /**\n * Opcional. Solo se usa `activationRules.selector` como fallback del\n * ancla para tooltip/walkthrough cuando el step no trae su propio\n * `selector`. El resto de reglas (url/trigger/delay) se ignoran.\n */\n activationRules?: Partial<ActivationRules>;\n /** Nombre mostrado (p.ej. en el `title` del iframe de guías `custom`). */\n guideName?: string;\n /**\n * Solo walkthrough: paso inicial a mostrar (default 0). Lo usa el editor del\n * dashboard para que la preview salte al paso que se está editando.\n */\n startStepIndex?: number;\n /**\n * Solo guías form: envío REAL de respuestas. Sin esto, el submit en preview\n * es un no-op (no escribe props). Lo usa el modo preview-por-link, que sí\n * guarda en el usuario que responde.\n */\n formSubmit?: (answers: Record<string, unknown>) => Promise<boolean>;\n /** Nota bajo el \"¡Gracias!\" cuando hay `formSubmit` propio. */\n formSubmitNote?: string;\n}\n\n/** Resultado del primer render de una preview. */\nexport interface PreviewResult {\n /**\n * `false` cuando la guía no pudo pintarse — típicamente un\n * tooltip/walkthrough cuyo `selector` no existe en la página de preview.\n */\n rendered: boolean;\n}\n\n/** Handle de una preview activa. */\nexport interface PreviewHandle {\n /** Cierra y limpia la preview. Idempotente. */\n close(): void;\n /** Resuelve cuando el primer render terminó. */\n ready: Promise<PreviewResult>;\n}\n\nconst PREVIEW_GUIDE_ID = '__veo_preview__';\n\n/**\n * Orquesta una única preview activa. A diferencia del `GuidesController`,\n * no toca queue, cache ni estado persistido: instancia el renderer y lo\n * monta directo, y maneja localmente la navegación de walkthroughs.\n */\nclass GuidePreviewController {\n private singleStep: BaseRenderer | null = null;\n /** Renderer del paso de walkthrough activo (walkthrough tooltip o modal/banner). */\n private walkthrough: { destroy(): void } | null = null;\n private walkthroughGuide: ResolvedGuide | null = null;\n private walkthroughIndex = 0;\n /** Input de la preview ACTIVA (para formSubmit/nota de forms). */\n private input: PreviewGuideInput | null = null;\n\n preview(input: PreviewGuideInput): PreviewHandle {\n this.close(); // solo una preview a la vez\n this.input = input;\n\n const guide = normalize(input);\n const start = typeof input.startStepIndex === 'number' ? input.startStepIndex : 0;\n const ready =\n guide.guideType === 'walkthrough'\n ? this.startWalkthrough(guide, start)\n : this.renderSingleStep(guide);\n\n return { close: () => this.close(), ready };\n }\n\n close(): void {\n if (this.singleStep) {\n safeDestroy(this.singleStep);\n this.singleStep = null;\n }\n if (this.walkthrough) {\n safeDestroy(this.walkthrough);\n this.walkthrough = null;\n }\n this.walkthroughGuide = null;\n this.walkthroughIndex = 0;\n this.input = null;\n }\n\n private async renderSingleStep(guide: ResolvedGuide): Promise<PreviewResult> {\n const renderer = createSingleStepRenderer(guide.guideType);\n if (!renderer) return { rendered: false };\n this.singleStep = renderer;\n\n // Los renderers single-step solo emiten `shown` tras montar con éxito\n // (tooltip/custom esperan a su ancla). Lo usamos como señal de render.\n let shown = false;\n try {\n await renderer.render({\n guide,\n onInteraction: (event: GuideInteractionEvent) => {\n if (event.action === 'shown') shown = true;\n },\n onClose: () => this.close(),\n onTrack: () => {},\n // Preview de forms: por defecto simula el envío SIN escribir props;\n // el caller puede pasar `formSubmit` real (link de preview).\n onFormSubmit: this.input?.formSubmit ?? (() => Promise.resolve(true)),\n isPreview: true,\n ...(this.input?.formSubmit && this.input.formSubmitNote !== undefined\n ? { previewNote: this.input.formSubmitNote }\n : {}),\n });\n } catch {\n this.close();\n return { rendered: false };\n }\n\n // El usuario pudo haber cerrado/reemplazado la preview mientras el render\n // esperaba el ancla (los renderers async como inline/inline-custom hacen\n // `await waitForElement` ANTES de insertar su host). En ese caso este\n // renderer quedó HUÉRFANO: su host ya entró al DOM pero `singleStep` apunta\n // a otro, así que el `close()` que lo reemplazó no lo borró. Lo destruimos\n // acá para no apilar copias fantasma (causa de la guía duplicada).\n if (this.singleStep !== renderer) {\n safeDestroy(renderer);\n return { rendered: false };\n }\n\n return { rendered: shown };\n }\n\n private async startWalkthrough(guide: ResolvedGuide, startIndex = 0): Promise<PreviewResult> {\n if (guide.guideSteps.length === 0) return { rendered: false };\n this.walkthroughGuide = guide;\n const idx = Math.min(Math.max(0, Math.floor(startIndex)), guide.guideSteps.length - 1);\n this.walkthroughIndex = idx;\n const rendered = await this.renderWalkthroughStep(idx);\n return { rendered };\n }\n\n private async renderWalkthroughStep(index: number): Promise<boolean> {\n const guide = this.walkthroughGuide;\n if (!guide) return false;\n\n if (this.walkthrough) {\n safeDestroy(this.walkthrough);\n this.walkthrough = null;\n }\n\n const callbacks: WalkthroughCallbacks = {\n onNext: () => {\n const next = this.walkthroughIndex + 1;\n if (next >= guide.guideSteps.length) {\n this.close();\n return;\n }\n this.walkthroughIndex = next;\n void this.renderWalkthroughStep(next);\n },\n onBack: () => {\n const prev = this.walkthroughIndex - 1;\n if (prev < 0) return;\n this.walkthroughIndex = prev;\n void this.renderWalkthroughStep(prev);\n },\n onSkip: () => this.close(),\n onComplete: () => this.close(),\n };\n\n // Walkthrough heterogéneo: el paso puede pedir modal/banner (con navegación).\n const step = guide.guideSteps[index];\n const render = (step?.style as Record<string, unknown> | null | undefined)?.render;\n if (render === 'modal' || render === 'banner') {\n const renderer = render === 'modal' ? new ModalRenderer() : new BannerRenderer();\n try {\n renderer.render({\n guide,\n onInteraction: () => {},\n onClose: () => this.close(),\n nav: { stepIndex: index, totalSteps: guide.guideSteps.length, callbacks },\n });\n } catch {\n safeDestroy(renderer);\n return false;\n }\n if (this.walkthroughGuide !== guide) {\n safeDestroy(renderer);\n return false;\n }\n this.walkthrough = renderer;\n return true;\n }\n\n const renderer = new WalkthroughRenderer();\n let success = false;\n try {\n success = await renderer.render({ guide, currentStepIndex: index, callbacks });\n } catch {\n success = false;\n }\n\n // Misma carrera que en single-step: si otra preview reemplazó esta\n // mientras esperábamos, no adoptamos el renderer (sería huérfano).\n if (!success || this.walkthroughGuide !== guide) {\n safeDestroy(renderer);\n return false;\n }\n this.walkthrough = renderer;\n return true;\n }\n}\n\nlet activeController: GuidePreviewController | null = null;\n\n/**\n * Previsualiza una guía en la página actual usando los renderers reales\n * del SDK. Devuelve un handle con `close()` y una promesa `ready`.\n *\n * Pensado para el builder no-code: no necesita `init()` ni apiKey. Abrir\n * una nueva preview cierra automáticamente la anterior.\n *\n * @example\n * ```ts\n * import { previewGuide } from '@veo/sdk';\n *\n * const preview = previewGuide({\n * guideType: 'modal',\n * guideSteps: [{ title: 'Hola', content: 'Esto es una preview' }],\n * });\n * const { rendered } = await preview.ready;\n * // ...más tarde:\n * preview.close();\n * ```\n */\nexport function previewGuide(input: PreviewGuideInput): PreviewHandle {\n if (!hasDocument()) {\n return { close: () => {}, ready: Promise.resolve({ rendered: false }) };\n }\n if (!activeController) activeController = new GuidePreviewController();\n return activeController.preview(input);\n}\n\n/** Cierra la preview activa, si la hay. Idempotente. */\nexport function closeGuidePreview(): void {\n activeController?.close();\n}\n\n/** Construye un `ResolvedGuide` sintético con defaults inocuos para preview. */\nfunction normalize(input: PreviewGuideInput): ResolvedGuide {\n const selector = input.activationRules?.selector;\n const activationRules: ActivationRules = {\n url: input.activationRules?.url ?? { type: 'prefix', pattern: '/' },\n trigger: 'immediate',\n ...(selector !== undefined ? { selector } : {}),\n };\n\n return {\n guideId: PREVIEW_GUIDE_ID,\n guideName: input.guideName ?? 'Preview',\n guideType: input.guideType,\n guideSteps: input.guideSteps,\n activationRules,\n displayFrequency: 'always',\n displayPriority: 0,\n };\n}\n\nfunction createSingleStepRenderer(type: GuideType): BaseRenderer | null {\n switch (type) {\n case 'modal':\n return new ModalRenderer();\n case 'banner':\n return new BannerRenderer();\n case 'tooltip':\n return new TooltipRenderer();\n case 'custom':\n return new CustomRenderer();\n case 'inline':\n return new InlineRenderer();\n case 'inline-custom':\n return new InlineCustomRenderer();\n case 'form':\n return new FormRenderer();\n case 'inline-form':\n return new InlineFormRenderer();\n case 'walkthrough':\n return null;\n }\n}\n\nfunction safeDestroy(renderer: { destroy(): void }): void {\n try {\n renderer.destroy();\n } catch {\n // swallow — un cleanup roto no debe romper la preview.\n }\n}\n","/**\n * Modo PREVIEW POR LINK: la app del cliente se abre con\n * `?veoPreview=<token>` (link generado desde el dashboard) y el SDK canjea\n * el token contra `POST /v1/guides/preview-resolve` para renderizar ESA\n * guía como vista previa — aunque esté en draft — sobre la app real.\n *\n * A diferencia del modo builder no hay puente postMessage ni dashboard\n * abierto: es un link compartible para que el equipo pruebe la guía sin\n * publicarla. Reusa `previewGuide` (sin tracking/frecuencia/resolver) y\n * monta un chip flotante con \"volver a mostrar\" y \"cerrar\".\n *\n * Vive en el bundle de guías (`veo-guides.js`), NO en el `veo.js` core —\n * el core solo detecta el query param y dispara la carga del bundle.\n */\nimport { hasDocument } from '../../utils/safe-env';\nimport { previewGuide } from './guide-preview';\nimport type { ResolvedGuide } from './types';\n\nexport interface PreviewModeOptions {\n apiKey: string;\n apiUrl: string;\n /** Token firmado del link (`?veoPreview=<token>`). */\n token: string;\n debug?: boolean;\n}\n\nexport interface PreviewModeHandle {\n /** Cierra la preview y quita el chip. Idempotente. */\n teardown(): void;\n}\n\nlet active: PreviewModeHandle | null = null;\n\n/**\n * Canjea el token y renderiza la guía como vista previa + chip de control.\n * Si el token es inválido/expirado, el chip lo informa (solo quien tiene el\n * link lo ve). Solo una sesión de preview activa a la vez.\n */\nexport async function runPreviewMode(opts: PreviewModeOptions): Promise<PreviewModeHandle | null> {\n if (!hasDocument()) return null;\n active?.teardown();\n\n let guide: ResolvedGuide | null = null;\n try {\n const res = await fetch(`${opts.apiUrl}/v1/guides/preview-resolve`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Api-Key': opts.apiKey },\n body: JSON.stringify({ token: opts.token }),\n });\n if (res.ok) {\n const data = (await res.json()) as { guide?: ResolvedGuide };\n guide = data.guide ?? null;\n } else if (opts.debug) {\n console.warn('[veo] preview-resolve respondió', res.status);\n }\n } catch (err) {\n if (opts.debug) console.warn('[veo] preview-resolve falló:', err);\n }\n\n /**\n * En el link de preview el envío de forms es REAL: corre sobre la app del\n * cliente con el SDK inicializado, así que la respuesta se guarda en el\n * usuario que está probando (su propia identidad) — permite verificar el\n * flujo completo props→segmentos sin tocar a nadie más.\n */\n const submitToBackend = async (answers: Record<string, unknown>): Promise<boolean> => {\n if (!guide) return false;\n const veo = (\n window as unknown as {\n veo?: { getEndUserId?: () => string | null; getAnonymousId?: () => string };\n }\n ).veo;\n const endUserId = veo?.getEndUserId?.() ?? veo?.getAnonymousId?.() ?? null;\n if (!endUserId) return false;\n try {\n const res = await fetch(`${opts.apiUrl}/v1/guides/${guide.guideId}/form-response`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Api-Key': opts.apiKey },\n body: JSON.stringify({ endUserId, answers }),\n });\n return res.ok;\n } catch {\n return false;\n }\n };\n\n let preview: { close(): void } | null = null;\n const show = (): void => {\n if (!guide) return;\n preview?.close();\n preview = previewGuide({\n guideType: guide.guideType,\n guideSteps: guide.guideSteps,\n activationRules: guide.activationRules,\n guideName: guide.guideName,\n formSubmit: submitToBackend,\n formSubmitNote: 'Vista previa: guardado en TU usuario para probar el flujo.',\n });\n };\n\n const chip = mountChip({\n label: guide ? `Vista previa: ${guide.guideName}` : 'Link de preview inválido o vencido',\n error: !guide,\n onReshow: guide ? show : null,\n onClose: () => handle.teardown(),\n });\n\n const handle: PreviewModeHandle = {\n teardown() {\n preview?.close();\n preview = null;\n chip.remove();\n if (active === handle) active = null;\n },\n };\n active = handle;\n show();\n return handle;\n}\n\ninterface ChipOptions {\n label: string;\n error: boolean;\n onReshow: (() => void) | null;\n onClose: () => void;\n}\n\n/** Chip flotante (Shadow DOM, abajo-derecha) con re-mostrar y cerrar. */\nfunction mountChip(opts: ChipOptions): { remove(): void } {\n const host = document.createElement('div');\n host.setAttribute('data-veo-preview-chip', '');\n const root = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = `\n .chip { position: fixed; bottom: 16px; right: 16px; z-index: 2147483647;\n display: flex; align-items: center; gap: 8px; padding: 8px 12px;\n background: #111827; color: #f9fafb; border-radius: 9999px;\n font: 500 12px/1.2 system-ui, sans-serif; box-shadow: 0 4px 12px rgba(0,0,0,.25); }\n .chip.error { background: #7f1d1d; }\n .label { max-width: 240px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n button { all: unset; cursor: pointer; padding: 2px 6px; border-radius: 9999px;\n font-size: 12px; line-height: 1; }\n button:hover { background: rgba(255,255,255,.15); }\n `;\n root.appendChild(style);\n\n const chip = document.createElement('div');\n chip.className = opts.error ? 'chip error' : 'chip';\n\n const label = document.createElement('span');\n label.className = 'label';\n label.textContent = opts.label;\n chip.appendChild(label);\n\n if (opts.onReshow) {\n const reshow = document.createElement('button');\n reshow.textContent = '↻';\n reshow.title = 'Volver a mostrar la guía';\n reshow.addEventListener('click', opts.onReshow);\n chip.appendChild(reshow);\n }\n\n const close = document.createElement('button');\n close.textContent = '✕';\n close.title = 'Salir de la vista previa';\n close.addEventListener('click', opts.onClose);\n chip.appendChild(close);\n\n root.appendChild(chip);\n document.body.appendChild(host);\n return { remove: () => host.remove() };\n}\n","import type { VeoPlugin } from '../../types';\nimport { hasWindow } from '../../utils/safe-env';\nimport { definePlugin } from '../plugin';\nimport { GuidesController } from './guides-controller';\n\nexport interface GuidesPluginConfig {\n apiUrl: string;\n apiKey: string;\n debug?: boolean;\n}\n\n/** Resultado del install — expone el controller para debugging desde el demo. */\nexport interface GuidesPluginHandle {\n controller: GuidesController;\n}\n\n/**\n * Plugin que renderiza guías in-app (modal/banner/tooltip) consultando\n * `GET /v1/guides/resolve` y registra las interacciones en\n * `POST /v1/guides/:id/interactions` vía queue dedicada con retry y\n * sendBeacon en pagehide.\n *\n * Opt-in: `init({ ..., guides: true })`. El plugin escucha\n * `pageview` e `identify` del client; el payload del evento ya trae\n * `sessionId` y `endUserId` para que no necesitemos consultar al\n * client en cada disparo.\n *\n * Frequency híbrida: el backend filtra autoritariamente; el cache\n * local (`GuideFrequencyCache`) solo previene el flash visual cuando\n * la interaction aún no se persistió.\n */\nexport function guidesPlugin(config: GuidesPluginConfig): VeoPlugin {\n return definePlugin({\n name: 'guides',\n install(client) {\n if (!hasWindow()) return;\n const controller = new GuidesController(client, config);\n\n // Exponer el controller en window para que el demo y tests E2E\n // puedan inspeccionar el cache y la queue.\n (window as unknown as { __veoGuides?: GuidesPluginHandle }).__veoGuides = { controller };\n\n client.on('identify', ({ sessionId }) => {\n void controller.checkGuides(window.location.href, sessionId);\n });\n\n client.on('pageview', ({ url, sessionId }) => {\n void controller.checkGuides(url, sessionId);\n });\n\n // Como el bundle de guías se carga PEREZOSAMENTE, el plugin puede\n // instalarse DESPUÉS del pageview/identify inicial — esos eventos ya\n // pasaron. Chequeamos la página actual ahora mismo para que la guía\n // aparezca apenas se entra (sin necesitar una 2ª acción). Si todavía no\n // hay endUserId, checkGuides no hace nada y el listener de `identify` la\n // mostrará; el dedupe por guideId evita un doble render.\n void controller.checkGuides(window.location.href, client.getSessionId());\n },\n });\n}\n\nexport type { PreviewGuideInput, PreviewHandle, PreviewResult } from './guide-preview';\nexport { closeGuidePreview, previewGuide } from './guide-preview';\nexport type { PreviewModeHandle, PreviewModeOptions } from './preview-mode';\nexport { runPreviewMode } from './preview-mode';\nexport type { GuideInteractionEvent, GuideStep, ResolvedGuide } from './types';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/safe-env.ts","../src/plugins/guides/constants.ts","../src/plugins/guides/guide-frequency-cache.ts","../src/plugins/guides/guide-resolver-client.ts","../src/plugins/guides/guide-tracker-client.ts","../src/plugins/guides/guide-tracker-queue.ts","../src/plugins/guides/block-builder.ts","../src/plugins/guides/walkthrough-block-builder.ts","../src/plugins/guides/guide-design.ts","../src/plugins/guides/styles.ts","../src/plugins/guides/renderers/base-renderer.ts","../src/plugins/guides/renderers/banner-renderer.ts","../node_modules/.pnpm/@floating-ui+utils@0.2.11/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../node_modules/.pnpm/@floating-ui+core@1.7.5/node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../node_modules/.pnpm/@floating-ui+utils@0.2.11/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../node_modules/.pnpm/@floating-ui+dom@1.7.6/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../src/plugins/guides/wait-for-element.ts","../src/utils/uuid.ts","../src/plugins/guides/renderers/custom-frame.ts","../src/plugins/guides/renderers/custom-renderer.ts","../src/plugins/guides/form-content.ts","../src/plugins/guides/renderers/form-renderer.ts","../src/plugins/guides/inline-host.ts","../src/plugins/guides/renderers/inline-custom-renderer.ts","../src/plugins/guides/renderers/inline-form-renderer.ts","../src/plugins/guides/renderers/inline-renderer.ts","../src/plugins/guides/renderers/modal-renderer.ts","../src/plugins/guides/renderers/floating-arrow.ts","../src/plugins/guides/renderers/tooltip-renderer.ts","../src/plugins/guides/renderers/walkthrough-renderer.ts","../src/plugins/guides/walkthrough-state.ts","../src/plugins/guides/guides-controller.ts","../src/plugins/guides/guide-preview.ts","../src/plugins/guides/preview-mode.ts","../src/plugins/guides/index.ts"],"names":["hasWindow","hasDocument","SAFE_URL_PROTOCOLS","GUIDE_HOST_ATTR","FREQUENCY_CACHE_KEY_PREFIX","WALKTHROUGH_STATE_KEY_PREFIX","STATUS_PRIORITY","namespaceFromApiKey","apiKey","GuideFrequencyCache","namespace","guideId","displayFrequency","entry","status","existing","now","mutated","id","sorted","a","b","excess","tuple","raw","parsed","entries","item","e","serialized","GuideResolverClient","apiUrl","debug","endUserId","pageUrl","params","response","err","data","toWire","payload","wire","GuideTrackerClient","request","url","blob","GuideTrackerQueue","config","batch","results","i","result","onPagehide","onVisibility","reason","error","buildStepContent","step","doc","callbacks","container","blocks","normalizeBlocks","renderBlocks","renderLegacyStep","createCloseButton","isSafeUrl","img","heading","paragraph","actions","cta","action","ctaUrl","readCtaUrl","valid","block","rowAlign","btnBlock","buildButtonBlock","BLOCK_ALIGN_SELF","node","buildContentBlock","el","applyBlockStyle","btn","clampNum","min","max","style","kind","s","align","onClose","className","closeBtn","base","candidate","buildWalkthroughStepContent","stepIndex","totalSteps","counter","progress","dot","skipBtn","rightGroup","backBtn","isLastStep","primaryBtn","defaultLabel","DARK_THEME","ALIGN_JUSTIFY","ALIGN_SELF","ELEMENT_ALIGN_MODE","SHADOW","PRESET_POS","COLOR_RE","clamp","applyDesignVars","host","key","value","px","py","applyElementVars","prefix","GUIDE_STYLES","BaseRenderer","shadow","root","fn","BannerRenderer","context","idx","ownerDocument","position","banner","dismiss","content","round","createCoords","v","oppositeSideMap","start","end","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","getSideAxis","firstChar","getAlignmentAxis","getAlignmentSides","rects","rtl","alignment","alignmentAxis","length","mainAlignmentSide","getOppositePlacement","getExpandedPlacements","oppositePlacement","getOppositeAlignmentPlacement","lrPlacement","rlPlacement","tbPlacement","btPlacement","getSideList","side","isStart","getOppositeAxisPlacements","flipAlignment","direction","list","expandPaddingObject","padding","getPaddingObject","rectToClientRect","rect","x","y","width","height","computeCoordsFromPlacement","_ref","reference","floating","sideAxis","alignLength","isVertical","commonX","commonY","commonAlign","coords","detectOverflow","state","options","_await$platform$isEle","platform","elements","strategy","boundary","rootBoundary","elementContext","altBoundary","paddingObject","element","clippingClientRect","offsetParent","offsetScale","elementClientRect","MAX_RESET_COUNT","computePosition","middleware","platformWithDetectOverflow","statefulPlacement","resetCount","middlewareData","currentMiddleware","name","nextX","nextY","reset","arrow","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","largestPossiblePadding","minPadding","maxPadding","min$1","center","offset","shouldAddOffset","alignmentOffset","flip","_middlewareData$arrow","_middlewareData$flip","initialPlacement","checkMainAxis","checkCrossAxis","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","detectOverflowOptions","initialSideAxis","isBasePlacement","fallbackPlacements","hasFallbackAxisSideDirection","placements","overflow","overflows","overflowsData","sides","_middlewareData$flip2","_overflowsData$filter","nextIndex","nextPlacement","d","resetPlacement","_overflowsData$filter2","currentSideAxis","acc","originSides","convertValueToCoords","mainAxisMulti","crossAxisMulti","rawValue","mainAxis","crossAxis","_middlewareData$offse","diffCoords","shift","limiter","mainAxisCoord","crossAxisCoord","minSide","maxSide","limitedCoords","getNodeName","isNode","getWindow","_node$ownerDocument","getDocumentElement","isElement","isHTMLElement","isShadowRoot","isOverflowElement","overflowX","overflowY","display","getComputedStyle","isTableElement","isTopLayer","willChangeRe","containRe","isNotNone","isWebKitValue","isContainingBlock","elementOrCss","css","isWebKit","getContainingBlock","currentNode","getParentNode","isLastTraversableNode","getNodeScroll","getNearestOverflowAncestor","parentNode","getOverflowAncestors","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","getFrameElement","getCssDimensions","hasOffset","offsetWidth","offsetHeight","shouldFallback","unwrapElement","getScale","domElement","$","noOffsets","getVisualOffsets","shouldAddVisualOffsets","isFixed","floatingOffsetParent","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","left","top","getWindowScrollBarX","leftScroll","getHTMLOffset","documentElement","scroll","htmlRect","convertOffsetParentRelativeRectToViewportRelativeRect","topLayer","offsets","isOffsetParentAnElement","offsetRect","htmlOffset","getClientRects","getDocumentRect","html","body","SCROLLBAR_MAX","getViewportRect","visualViewport","visualViewportBased","windowScrollbarX","bodyStyles","bodyMarginInline","clippingStableScrollbarWidth","getInnerBoundingClientRect","getClientRectFromClippingAncestor","clippingAncestor","hasFixedPositionAncestor","stopNode","getClippingElementAncestors","cache","cachedResult","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","getClippingRect","clippingAncestors","firstRect","right","bottom","getDimensions","getRectRelativeToOffsetParent","setLeftRTLScrollbarOffset","isStaticPositioned","getTrueOffsetParent","polyfill","rawOffsetParent","getOffsetParent","svgOffsetParent","getElementRects","getOffsetParentFn","getDimensionsFn","floatingDimensions","isRTL","mergedOptions","platformWithCache","waitForElement","selector","timeoutMs","resolve","safeQuery","resolved","finish","observer","timer","uuidv7","timeHex","random","hex","mountCustomFrame","opts","iframe","hasFixedHeight","toCssSize","token","wantsTailwind","buildSrcdoc","collectHostTokens","close","onMessage","event","isRecord","rootStyle","decls","seen","bodyFont","js","bridge","tokensStyle","escapeClosing","tailwind","code","tag","rx","DEFAULT_PLACEMENT","DEFAULT_OFFSET","DEFAULT_WIDTH","CustomRenderer","anchor","wrapper","cleanup","applyFloatingPosition","update","reposition","ox","oy","vertical","horizontal","mountFormContent","card","fields","readers","form","field","read","buildField","submit","answers","ok","note","showThanks","thanks","noteEl","label","input","select","blank","opt","option","group","inputs","optionLabel","radio","text","checkbox","values","yesLabel","noLabel","optText","buildScale","btnClass","symbol","row","selected","buttons","n","active","FormRenderer","overlay","onKey","readInlinePosition","p","insertHost","keepHostAttached","InlineCustomRenderer","InlineFormRenderer","InlineRenderer","ModalRenderer","onBackdropOrEsc","STATIC_SIDE","positionArrow","arrowEl","prop","TooltipRenderer","rawSide","tooltip","updatePosition","WalkthroughRenderer","WalkthroughStateManager","next","STATUS_BY_ACTION","GuidesController","client","httpClient","sessionId","guides","guide","renderer","delayMs","onInteraction","onTrack","eventName","properties","onFormSubmit","render","readStepRender","success","newState","dedupKey","cacheStatus","extractPath","type","res","r","PREVIEW_GUIDE_ID","GuidePreviewController","normalize","ready","safeDestroy","createSingleStepRenderer","shown","startIndex","index","prev","activeController","previewGuide","closeGuidePreview","activationRules","runPreviewMode","submitToBackend","veo","preview","show","chip","mountChip","handle","reshow","guidesPlugin","controller"],"mappings":"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","file":"veo-guides.js","sourcesContent":["/**\n * Helpers para detectar el entorno de ejecución (browser vs SSR/Node) y la\n * disponibilidad de APIs del navegador. El SDK debe poder importarse en Node\n * sin romperse, por eso todo acceso a globals del browser pasa por aquí.\n */\n\n/** ¿Existe el objeto global `window`? */\nexport function hasWindow(): boolean {\n return typeof window !== 'undefined';\n}\n\n/** ¿Existe el objeto global `document`? */\nexport function hasDocument(): boolean {\n return typeof document !== 'undefined';\n}\n\n/** ¿`localStorage` está disponible y es escribible? (puede fallar en modo incógnito) */\nexport function hasLocalStorage(): boolean {\n try {\n if (typeof localStorage === 'undefined') return false;\n const testKey = '__veo_test__';\n localStorage.setItem(testKey, '1');\n localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n}\n\n/** ¿`navigator.sendBeacon` está disponible? */\nexport function hasNavigatorSendBeacon(): boolean {\n return typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function';\n}\n","/** z-index muy alto para flotar sobre cualquier UI del cliente sin tapar dev tools. */\nexport const GUIDE_Z_INDEX = 2147483640;\n\n/** Tiempo máximo esperando que aparezca el elemento ancla de un tooltip. */\nexport const DEFAULT_ANCHOR_WAIT_MS = 5000;\n\n/** Protocolos permitidos en `imageUrl` y `style.ctaUrl`. */\nexport const SAFE_URL_PROTOCOLS: ReadonlyArray<string> = ['http:', 'https:'];\n\n/** Atributo data-* que marca un host de guía en el DOM (útil para tests). */\nexport const GUIDE_HOST_ATTR = 'data-veo-guide';\n\n/**\n * Prefijo del key de localStorage donde vive el cache de frequency.\n * Se completa con un identificador derivado del apiKey para evitar\n * contaminación cuando el mismo navegador corre varios workspaces.\n */\nexport const FREQUENCY_CACHE_KEY_PREFIX = 'veo:freq:';\n\n/** Tiempo entre flushes automáticos del tracker (ms). */\nexport const DEFAULT_TRACKER_FLUSH_INTERVAL_MS = 3000;\n\n/** Cuántas interactions se acumulan antes de un flush forzado. */\nexport const DEFAULT_TRACKER_BATCH_SIZE = 5;\n\n/** Reintentos por item antes de descartar (se aplica con backoff implícito por el timer). */\nexport const DEFAULT_TRACKER_MAX_RETRIES = 3;\n\n/** Límite de entradas en el cache local — protege contra bloat de localStorage. */\nexport const FREQUENCY_CACHE_MAX_ENTRIES = 500;\n\n/** TTL para entradas del cache. Tras esto se vuelven a re-evaluar contra el backend. */\nexport const FREQUENCY_CACHE_TTL_MS = 90 * 24 * 60 * 60 * 1000;\n\n/**\n * Prefijo del key de localStorage donde vive el estado del walkthrough\n * activo. Se completa con el mismo `namespaceFromApiKey` que el frequency\n * cache para que dos workspaces en el mismo navegador no se pisen.\n */\nexport const WALKTHROUGH_STATE_KEY_PREFIX = 'veo:walkthrough_state:';\n\n/**\n * Si pasan 30 min sin progreso (`advance`/`back`), el walkthrough se\n * considera abandonado. El estado se limpia de localStorage al detectarlo\n * y NO se envía `completed` al backend (porque no se completó).\n */\nexport const WALKTHROUGH_ABANDONMENT_TIMEOUT_MS = 30 * 60 * 1000;\n\n/**\n * Tiempo máximo esperando que aparezca el selector del step actual en el\n * DOM. Más restrictivo que `DEFAULT_ANCHOR_WAIT_MS` porque en walkthroughs\n * la página correcta debería estar ya cargada al resumir.\n */\nexport const WALKTHROUGH_STEP_SELECTOR_TIMEOUT_MS = 5000;\n","import {\n FREQUENCY_CACHE_KEY_PREFIX,\n FREQUENCY_CACHE_MAX_ENTRIES,\n FREQUENCY_CACHE_TTL_MS,\n} from './constants';\nimport type { DisplayFrequency, FrequencyCacheEntry, FrequencyStatus } from './types';\n\n/** Prioridad de status para no degradar shown→dismissed→… */\nconst STATUS_PRIORITY: Record<FrequencyStatus, number> = {\n shown: 1,\n dismissed: 2,\n completed: 2,\n};\n\n/**\n * Namespace short y estable derivado del apiKey. NO es cripto: solo evita\n * que dos apps que comparten el navegador pisen sus caches. El apiKey\n * público (`pk_*`) ya es workspace-único, así que usar sus últimos 16\n * caracteres alcanza para diferenciar.\n */\nexport function namespaceFromApiKey(apiKey: string): string {\n return apiKey.slice(-16) || 'default';\n}\n\n/**\n * Cache persistente de \"qué guías ya vio/cerró este usuario\". Vive en\n * `localStorage` con key namespaceada para evitar colisión entre\n * workspaces que corren en el mismo navegador.\n *\n * No es source of truth — el backend siempre manda. Esta cache solo\n * evita el flash visual de re-pintar una guía que el usuario ya cerró\n * antes de que el roundtrip al backend termine.\n */\nexport class GuideFrequencyCache {\n private readonly storageKey: string;\n private cache: Map<string, FrequencyCacheEntry>;\n\n constructor(namespace: string) {\n this.storageKey = `${FREQUENCY_CACHE_KEY_PREFIX}${namespace}`;\n this.cache = this.load();\n this.prune();\n }\n\n /**\n * Decide si una guía debe filtrarse localmente antes de pintarla.\n *\n * - `every_visit` / `always` → nunca filtra (siempre re-pinta).\n * - `once` → cualquier entry registrada filtra (verla ya cuenta).\n * - `until_dismissed` → si fue descartada O COMPLETADA (responder un\n * form / terminar un walkthrough es más fuerte que descartar — sin\n * esto, una encuesta seguiría preguntando después de respondida).\n */\n shouldFilter(guideId: string, displayFrequency: DisplayFrequency): boolean {\n if (displayFrequency === 'every_visit' || displayFrequency === 'always') return false;\n\n const entry = this.cache.get(guideId);\n if (!entry) return false;\n\n if (displayFrequency === 'once') return true;\n if (displayFrequency === 'until_dismissed') {\n return entry.status === 'dismissed' || entry.status === 'completed';\n }\n // `until_answered` (forms): solo COMPLETAR filtra localmente. El descarte\n // no la silencia — y si las props ya tienen valor por otro medio, es el\n // BACKEND quien la excluye del resolve (acá no conocemos los traits).\n if (displayFrequency === 'until_answered') return entry.status === 'completed';\n return false;\n }\n\n /**\n * Registra/actualiza la entry de una guía. Nunca degrada un estado más\n * fuerte (no convierte `dismissed` en `shown` por un re-render). Persiste\n * cada llamada — escribir a localStorage es lo bastante barato.\n */\n record(guideId: string, status: FrequencyStatus): void {\n const existing = this.cache.get(guideId);\n if (existing && STATUS_PRIORITY[status] < STATUS_PRIORITY[existing.status]) {\n return;\n }\n this.cache.set(guideId, {\n guideId,\n status,\n lastInteractionAt: Date.now(),\n });\n this.persist();\n }\n\n /** Limpia el cache (botón \"reset\" del demo, tests). */\n clear(): void {\n this.cache.clear();\n this.persist();\n }\n\n /** Útil para debugging — devuelve un snapshot. */\n snapshot(): FrequencyCacheEntry[] {\n return Array.from(this.cache.values());\n }\n\n /**\n * Limpia entries expiradas por TTL y, si aún excede el límite, descarta\n * las más viejas hasta caber. Se ejecuta una vez en el constructor; no\n * vale la pena correrlo a cada lectura.\n */\n private prune(): void {\n const now = Date.now();\n let mutated = false;\n\n for (const [id, entry] of this.cache) {\n if (now - entry.lastInteractionAt > FREQUENCY_CACHE_TTL_MS) {\n this.cache.delete(id);\n mutated = true;\n }\n }\n\n if (this.cache.size > FREQUENCY_CACHE_MAX_ENTRIES) {\n const sorted = Array.from(this.cache.entries()).sort(\n (a, b) => a[1].lastInteractionAt - b[1].lastInteractionAt,\n );\n const excess = this.cache.size - FREQUENCY_CACHE_MAX_ENTRIES;\n for (let i = 0; i < excess; i++) {\n const tuple = sorted[i];\n if (tuple) this.cache.delete(tuple[0]);\n }\n mutated = true;\n }\n\n if (mutated) this.persist();\n }\n\n private load(): Map<string, FrequencyCacheEntry> {\n if (typeof localStorage === 'undefined') return new Map();\n try {\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) return new Map();\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) return new Map();\n const entries: Array<[string, FrequencyCacheEntry]> = [];\n for (const item of parsed) {\n if (\n item &&\n typeof item === 'object' &&\n typeof (item as FrequencyCacheEntry).guideId === 'string' &&\n typeof (item as FrequencyCacheEntry).lastInteractionAt === 'number' &&\n ['shown', 'dismissed', 'completed'].includes((item as FrequencyCacheEntry).status)\n ) {\n const e = item as FrequencyCacheEntry;\n entries.push([e.guideId, e]);\n }\n }\n return new Map(entries);\n } catch {\n return new Map();\n }\n }\n\n private persist(): void {\n if (typeof localStorage === 'undefined') return;\n try {\n const serialized = JSON.stringify(Array.from(this.cache.values()));\n localStorage.setItem(this.storageKey, serialized);\n } catch {\n // QuotaExceeded o similar — el cache es opcional, no rompemos la app.\n }\n }\n}\n","import type { ResolvedGuide, ResolveGuidesResponse } from './types';\n\n/**\n * Wrapper sobre `GET /v1/guides/resolve`. Nunca lanza: cualquier error de\n * red o de parsing devuelve un array vacío, para que el plugin no rompa\n * la app del cliente.\n *\n * Importante: el endpoint usa `?pageUrl=...` (no `?url=...`) — el backend\n * valida con class-validator `IsUrl({ require_protocol: true })`.\n */\nexport class GuideResolverClient {\n constructor(\n private readonly apiUrl: string,\n private readonly apiKey: string,\n private readonly debug = false,\n ) {}\n\n async resolve(endUserId: string, pageUrl: string): Promise<ResolvedGuide[]> {\n const params = new URLSearchParams({ endUserId, pageUrl });\n let response: Response;\n try {\n response = await fetch(`${this.apiUrl}/v1/guides/resolve?${params.toString()}`, {\n method: 'GET',\n headers: { 'X-Api-Key': this.apiKey },\n credentials: 'omit',\n });\n } catch (err) {\n if (this.debug) console.error('[veo] guides resolve fetch failed:', err);\n return [];\n }\n\n if (!response.ok) {\n if (this.debug) console.warn('[veo] guides resolve HTTP', response.status);\n return [];\n }\n\n try {\n const data = (await response.json()) as ResolveGuidesResponse;\n return Array.isArray(data.guides) ? data.guides : [];\n } catch (err) {\n if (this.debug) console.error('[veo] guides resolve parse failed:', err);\n return [];\n }\n }\n\n /**\n * Trae una guía específica por ID, sin pasar por la lógica de\n * activación. La usa el controller para resumir un walkthrough entre\n * páginas: el `resolve` no devuelve la guía si la URL actual no\n * matchea, pero el walkthrough activo debe poder consultarla igual.\n *\n * El endpoint backend (`GET /v1/guides/:guideId`) devuelve `GuideResponse`,\n * un superset de `ResolvedGuide` con campos de audit. Acá descartamos los\n * extra y nos quedamos con el shape que el resto del SDK ya consume.\n *\n * Devuelve `null` en cualquier error (404, red, parse) — el caller debe\n * tratarlo como \"guía ya no existe\" y cancelar el walkthrough limpiamente.\n */\n async fetchById(guideId: string): Promise<ResolvedGuide | null> {\n let response: Response;\n try {\n response = await fetch(`${this.apiUrl}/v1/guides/${encodeURIComponent(guideId)}`, {\n method: 'GET',\n headers: { 'X-Api-Key': this.apiKey },\n credentials: 'omit',\n });\n } catch (err) {\n if (this.debug) console.error('[veo] guides fetchById network failed:', err);\n return null;\n }\n\n if (!response.ok) {\n if (this.debug) console.warn('[veo] guides fetchById HTTP', response.status);\n return null;\n }\n\n try {\n const data = (await response.json()) as Partial<ResolvedGuide>;\n if (\n typeof data.guideId !== 'string' ||\n typeof data.guideName !== 'string' ||\n typeof data.guideType !== 'string' ||\n !Array.isArray(data.guideSteps) ||\n !data.activationRules ||\n typeof data.displayFrequency !== 'string' ||\n typeof data.displayPriority !== 'number'\n ) {\n if (this.debug) console.warn('[veo] guides fetchById: unexpected shape');\n return null;\n }\n return {\n guideId: data.guideId,\n guideName: data.guideName,\n guideType: data.guideType,\n guideSteps: data.guideSteps,\n activationRules: data.activationRules,\n displayFrequency: data.displayFrequency,\n displayPriority: data.displayPriority,\n };\n } catch (err) {\n if (this.debug) console.error('[veo] guides fetchById parse failed:', err);\n return null;\n }\n }\n}\n","import type { GuideInteractionPayload } from './types';\n\nexport interface InteractionRequest {\n guideId: string;\n payload: GuideInteractionPayload;\n}\n\n/**\n * Wire shape esperada por `POST /v1/guides/:id/interactions` en el backend.\n * Nuestro tipo interno (`GuideInteractionPayload`) usa `action`/`stepIndex`;\n * el backend exige `interactionType`/`stepPosition`. Esta función centraliza\n * la traducción.\n */\ninterface WireInteraction {\n endUserId: string;\n sessionId?: string;\n interactionType: GuideInteractionPayload['action'];\n stepPosition?: number;\n pageUrl?: string;\n pagePath?: string;\n}\n\nfunction toWire(payload: GuideInteractionPayload): WireInteraction {\n const wire: WireInteraction = {\n endUserId: payload.endUserId,\n interactionType: payload.action,\n };\n if (payload.sessionId) wire.sessionId = payload.sessionId;\n if (typeof payload.stepIndex === 'number') wire.stepPosition = payload.stepIndex;\n if (payload.pageUrl) wire.pageUrl = payload.pageUrl;\n if (payload.pagePath) wire.pagePath = payload.pagePath;\n return wire;\n}\n\n/**\n * Cliente HTTP puro para registrar interacciones de guías. No hace retry\n * ni queue — esa responsabilidad vive en `GuideTrackerQueue`.\n *\n * `send` lanza en error (queue puede reintentar). `sendBeacon` es síncrono,\n * \"best effort\", para el cierre de página: usa `navigator.sendBeacon` con\n * el apiKey como query param `?key=` (la única forma de autenticar con\n * sendBeacon, ya que no permite headers custom — el backend lo soporta\n * desde el ApiKeyGuard).\n */\nexport class GuideTrackerClient {\n constructor(\n private readonly apiUrl: string,\n private readonly apiKey: string,\n ) {}\n\n async send(request: InteractionRequest): Promise<void> {\n const url = this.buildUrl(request.guideId);\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'X-Api-Key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(toWire(request.payload)),\n credentials: 'omit',\n });\n\n if (!response.ok) {\n throw new Error(`guide interaction send failed: HTTP ${response.status}`);\n }\n }\n\n /**\n * Envío \"fire-and-forget\" en pagehide. Devuelve `false` si el navegador\n * no acepta el beacon (cola llena, no soportado) — en ese caso la queue\n * sabrá que perdió el envío.\n */\n sendBeacon(request: InteractionRequest): boolean {\n if (typeof navigator === 'undefined' || typeof navigator.sendBeacon !== 'function') {\n return false;\n }\n const url = `${this.buildUrl(request.guideId)}?key=${encodeURIComponent(this.apiKey)}`;\n const blob = new Blob([JSON.stringify(toWire(request.payload))], {\n type: 'application/json',\n });\n try {\n return navigator.sendBeacon(url, blob);\n } catch {\n return false;\n }\n }\n\n private buildUrl(guideId: string): string {\n return `${this.apiUrl}/v1/guides/${encodeURIComponent(guideId)}/interactions`;\n }\n}\n","import type { GuideTrackerClient, InteractionRequest } from './guide-tracker-client';\nimport type { QueuedInteraction } from './types';\n\nexport interface GuideTrackerQueueConfig {\n client: GuideTrackerClient;\n flushIntervalMs: number;\n batchSize: number;\n maxRetries: number;\n /**\n * Llamado cuando un item se descarta tras agotar `maxRetries`. El\n * plugin puede usarlo para `console.warn` en debug mode. Nunca debe\n * lanzar — si lo hace, se ignora silenciosamente.\n */\n onError?: (error: Error, item: QueuedInteraction) => void;\n}\n\n/**\n * Queue dedicada para `POST /v1/guides/:id/interactions`.\n *\n * Cada item es independiente (URL distinto por `guideId`), así que el\n * \"batch\" en realidad dispara N requests en paralelo. El `batchSize` es\n * el umbral para forzar un flush — no agrupa requests en uno solo.\n *\n * Retry:\n * - Si `send()` lanza, el item se devuelve al buffer con `attempts++`.\n * - El timer regular vuelve a intentar en el próximo tick.\n * - Al alcanzar `maxRetries`, se descarta llamando `onError`.\n *\n * En `pagehide`/`visibilitychange` (hidden) drena el buffer vía\n * `navigator.sendBeacon`. Best effort — no re-encola lo que el beacon\n * rechace porque la página ya se va.\n */\nexport class GuideTrackerQueue {\n private buffer: QueuedInteraction[] = [];\n private timer: ReturnType<typeof setInterval> | null = null;\n private flushing = false;\n private unloadCleanup: (() => void) | null = null;\n\n constructor(private readonly config: GuideTrackerQueueConfig) {\n this.startTimer();\n this.installUnloadHandler();\n }\n\n /** Tamaño actual del buffer (útil para debug/stats en el demo). */\n get size(): number {\n return this.buffer.length;\n }\n\n /**\n * Encola una interaction. Si el buffer alcanza `batchSize`, dispara\n * `flush()` inmediato.\n */\n enqueue(request: InteractionRequest): void {\n this.buffer.push({\n guideId: request.guideId,\n payload: request.payload,\n attempts: 0,\n enqueuedAt: Date.now(),\n });\n if (this.buffer.length >= this.config.batchSize) {\n void this.flush();\n }\n }\n\n /**\n * Envía todo el buffer en paralelo. Items que fallan vuelven al buffer\n * si todavía tienen reintentos disponibles. Idempotente con respecto a\n * flushes concurrentes (el segundo es un no-op).\n */\n async flush(): Promise<void> {\n if (this.flushing || this.buffer.length === 0) return;\n this.flushing = true;\n\n const batch = this.buffer.splice(0, this.buffer.length);\n const results = await Promise.allSettled(\n batch.map((item) =>\n this.config.client.send({ guideId: item.guideId, payload: item.payload }),\n ),\n );\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const item = batch[i];\n if (!result || !item) continue;\n if (result.status === 'fulfilled') continue;\n\n item.attempts += 1;\n if (item.attempts < this.config.maxRetries) {\n this.buffer.push(item);\n } else {\n this.safeOnError(result.reason, item);\n }\n }\n\n this.flushing = false;\n }\n\n /**\n * Drena el buffer vía `sendBeacon`. Síncrono, sin retry. Para pagehide.\n */\n flushBeacon(): void {\n if (this.buffer.length === 0) return;\n const batch = this.buffer.splice(0, this.buffer.length);\n for (const item of batch) {\n this.config.client.sendBeacon({ guideId: item.guideId, payload: item.payload });\n }\n }\n\n destroy(): void {\n if (this.timer) clearInterval(this.timer);\n this.timer = null;\n this.unloadCleanup?.();\n this.unloadCleanup = null;\n }\n\n private startTimer(): void {\n if (typeof window === 'undefined') return;\n this.timer = setInterval(() => {\n void this.flush();\n }, this.config.flushIntervalMs);\n }\n\n private installUnloadHandler(): void {\n if (typeof window === 'undefined') return;\n const onPagehide = (): void => this.flushBeacon();\n const onVisibility = (): void => {\n if (document.visibilityState === 'hidden') this.flushBeacon();\n };\n window.addEventListener('pagehide', onPagehide);\n window.addEventListener('visibilitychange', onVisibility);\n this.unloadCleanup = () => {\n window.removeEventListener('pagehide', onPagehide);\n window.removeEventListener('visibilitychange', onVisibility);\n };\n }\n\n private safeOnError(reason: unknown, item: QueuedInteraction): void {\n if (!this.config.onError) return;\n const error = reason instanceof Error ? reason : new Error(String(reason));\n try {\n this.config.onError(error, item);\n } catch {\n // Un onError roto no debe afectar al resto del flush.\n }\n }\n}\n","import { SAFE_URL_PROTOCOLS } from './constants';\nimport type { CtaAction, GuideStep, StepBlock } from './types';\n\ninterface StepCallbacks {\n onCtaClick: (action: CtaAction, url?: string) => void;\n onDismiss: () => void;\n}\n\n/**\n * Construye el subtree DOM de un step (título, contenido, imagen, CTA,\n * botón de cerrar) de forma segura.\n *\n * Reglas inmutables:\n * - **Nunca** usa `innerHTML` ni `insertAdjacentHTML`.\n * - Todo texto se asigna por `textContent` (escape HTML automático).\n * - URLs (`imageUrl`, `style.ctaUrl`) pasan por `isSafeUrl` — solo\n * `http(s):` permitido, rechaza `javascript:`, `data:`, etc.\n * - Campos opcionales ausentes simplemente no pintan su nodo. Si una\n * guía no trae `ctaText` no se pinta botón.\n *\n * El `doc` se inyecta para soportar tests con jsdom u otros documentos.\n */\nexport function buildStepContent(\n step: GuideStep,\n doc: Document,\n callbacks: StepCallbacks,\n): HTMLElement {\n const container = doc.createElement('div');\n container.className = 'veo-guide-content';\n\n const blocks = normalizeBlocks(step);\n if (blocks) {\n renderBlocks(container, blocks, doc, callbacks);\n } else {\n renderLegacyStep(container, step, doc, callbacks);\n }\n\n // Botón \"✕\" siempre presente (esquina superior derecha).\n container.appendChild(createCloseButton(doc, () => callbacks.onDismiss()));\n\n return container;\n}\n\n/** Render clásico: imagen + un título + un texto + un CTA (campos escalares). */\nfunction renderLegacyStep(\n container: HTMLElement,\n step: GuideStep,\n doc: Document,\n callbacks: StepCallbacks,\n): void {\n if (typeof step.imageUrl === 'string' && step.imageUrl && isSafeUrl(step.imageUrl)) {\n const img = doc.createElement('img');\n img.className = 'veo-guide-image';\n img.src = step.imageUrl;\n img.alt = typeof step.title === 'string' ? step.title : '';\n container.appendChild(img);\n }\n\n if (typeof step.title === 'string' && step.title) {\n const heading = doc.createElement('h2');\n heading.className = 'veo-guide-title';\n heading.textContent = step.title;\n container.appendChild(heading);\n }\n\n if (typeof step.content === 'string' && step.content) {\n const paragraph = doc.createElement('p');\n paragraph.className = 'veo-guide-text';\n paragraph.textContent = step.content;\n container.appendChild(paragraph);\n }\n\n const actions = doc.createElement('div');\n actions.className = 'veo-guide-actions';\n\n if (typeof step.ctaText === 'string' && step.ctaText) {\n const cta = doc.createElement('button');\n cta.type = 'button';\n cta.className = 'veo-guide-cta';\n cta.textContent = step.ctaText;\n cta.addEventListener('click', () => {\n const action: CtaAction = step.ctaAction ?? 'dismiss';\n const ctaUrl = readCtaUrl(step);\n callbacks.onCtaClick(action, ctaUrl);\n });\n actions.appendChild(cta);\n }\n\n container.appendChild(actions);\n}\n\n/** Devuelve los bloques válidos del paso, o `null` si no hay (usa el legacy). */\nfunction normalizeBlocks(step: GuideStep): StepBlock[] | null {\n if (!Array.isArray(step.blocks) || step.blocks.length === 0) return null;\n const valid = step.blocks.filter((b): b is StepBlock => {\n if (!b || typeof b !== 'object') return false;\n if (b.type === 'image') return typeof b.url === 'string' && isSafeUrl(b.url);\n return b.type === 'title' || b.type === 'text' || b.type === 'button';\n });\n return valid.length > 0 ? valid : null;\n}\n\n/**\n * Render por bloques: recorre en orden. Los botones consecutivos se agrupan en\n * una misma fila de acciones (para que queden lado a lado). Todo texto por\n * `textContent`; las imágenes por `isSafeUrl`.\n */\nfunction renderBlocks(\n container: HTMLElement,\n blocks: StepBlock[],\n doc: Document,\n callbacks: StepCallbacks,\n): void {\n let i = 0;\n while (i < blocks.length) {\n const block = blocks[i];\n if (block?.type === 'button') {\n const actions = doc.createElement('div');\n actions.className = 'veo-guide-actions';\n // La alineación de un botón mueve la FILA (justify-content), no el botón\n // dentro de ella (align-self sería el eje vertical y no haría nada).\n let rowAlign: string | undefined;\n while (i < blocks.length && blocks[i]?.type === 'button') {\n const btnBlock = blocks[i] as StepBlock;\n if (!rowAlign) {\n const a = (btnBlock.style as Record<string, unknown> | null | undefined)?.align;\n if (a === 'left' || a === 'center' || a === 'right') rowAlign = a;\n }\n actions.appendChild(buildButtonBlock(btnBlock, doc, callbacks));\n i++;\n }\n if (rowAlign) actions.style.justifyContent = BLOCK_ALIGN_SELF[rowAlign] as string;\n container.appendChild(actions);\n continue;\n }\n const node = buildContentBlock(block as StepBlock, doc);\n if (node) container.appendChild(node);\n i++;\n }\n}\n\nfunction buildContentBlock(block: StepBlock, doc: Document): HTMLElement | null {\n switch (block.type) {\n case 'title': {\n const el = doc.createElement('h2');\n el.className = 'veo-guide-title';\n el.textContent = typeof block.text === 'string' ? block.text : '';\n applyBlockStyle(el, block.style, 'text');\n return el;\n }\n case 'text': {\n const el = doc.createElement('p');\n el.className = 'veo-guide-text';\n el.textContent = typeof block.text === 'string' ? block.text : '';\n applyBlockStyle(el, block.style, 'text');\n return el;\n }\n case 'image': {\n if (typeof block.url !== 'string' || !isSafeUrl(block.url)) return null;\n const el = doc.createElement('img');\n el.className = 'veo-guide-image';\n el.src = block.url;\n el.alt = '';\n applyBlockStyle(el, block.style, 'image');\n return el;\n }\n default:\n return null;\n }\n}\n\nfunction buildButtonBlock(\n block: StepBlock,\n doc: Document,\n callbacks: StepCallbacks,\n): HTMLButtonElement {\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.className = 'veo-guide-cta';\n btn.textContent = typeof block.text === 'string' && block.text ? block.text : 'OK';\n applyBlockStyle(btn, block.style, 'button');\n btn.addEventListener('click', () => {\n const action: CtaAction = block.action ?? 'dismiss';\n const url =\n action === 'url' && typeof block.url === 'string' && isSafeUrl(block.url)\n ? block.url\n : undefined;\n callbacks.onCtaClick(action, url);\n });\n return btn;\n}\n\nconst BLOCK_ALIGN_SELF: Record<string, string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n};\n\nfunction clampNum(n: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, n));\n}\n\n/**\n * Aplica el estilo por-bloque como estilos INLINE (cada bloque es único, no\n * puede usar las CSS vars compartidas del host). Setear `el.style.*` es seguro:\n * el browser descarta valores inválidos (no hay inyección de CSS crudo).\n */\nfunction applyBlockStyle(\n el: HTMLElement,\n style: StepBlock['style'],\n kind: 'text' | 'image' | 'button',\n): void {\n if (!style || typeof style !== 'object') return;\n const s = style as Record<string, unknown>;\n const align = typeof s.align === 'string' ? s.align : null;\n if (align && (align === 'left' || align === 'center' || align === 'right')) {\n // text → text-align; image → align-self (se encoge y se ubica);\n // button → NO acá (la fila de acciones maneja su justify-content).\n if (kind === 'text') el.style.textAlign = align;\n else if (kind === 'image') el.style.alignSelf = BLOCK_ALIGN_SELF[align] as string;\n }\n if (kind !== 'image' && typeof s.color === 'string') el.style.color = s.color;\n if (kind === 'text' && typeof s.fontSize === 'number' && Number.isFinite(s.fontSize)) {\n el.style.fontSize = `${clampNum(s.fontSize, 8, 72)}px`;\n }\n if (kind === 'image' && typeof s.width === 'number' && Number.isFinite(s.width)) {\n el.style.width = `${clampNum(s.width, 10, 100)}%`;\n }\n if (kind === 'image' && typeof s.radius === 'number' && Number.isFinite(s.radius)) {\n el.style.borderRadius = `${clampNum(s.radius, 0, 48)}px`;\n }\n if (typeof s.marginTop === 'number' && Number.isFinite(s.marginTop)) {\n el.style.marginTop = `${clampNum(s.marginTop, 0, 64)}px`;\n }\n if (typeof s.marginBottom === 'number' && Number.isFinite(s.marginBottom)) {\n el.style.marginBottom = `${clampNum(s.marginBottom, 0, 64)}px`;\n }\n}\n\n/**\n * Botón \"✕\" de cerrar reutilizable. Universal: modal/banner/tooltip/inline (vía\n * `buildStepContent`), walkthrough, forms y guías custom lo usan, para que toda\n * guía tenga siempre una salida en la esquina superior derecha.\n *\n * `className` permite un estilo distinto por chrome (las custom usan\n * `veo-custom-close`, un botón visible sobre HTML arbitrario del cliente).\n */\nexport function createCloseButton(\n doc: Document,\n onClose: () => void,\n className = 'veo-guide-close',\n): HTMLButtonElement {\n const closeBtn = doc.createElement('button');\n closeBtn.type = 'button';\n closeBtn.className = className;\n closeBtn.setAttribute('aria-label', 'Cerrar');\n closeBtn.textContent = '×';\n closeBtn.addEventListener('click', onClose);\n return closeBtn;\n}\n\n/**\n * Acepta solo `http:` y `https:`. Resuelve relativas contra la página\n * actual cuando hay `window`; en SSR (sin window) toma la URL como\n * absoluta. Rechaza cualquier protocolo no listado y URLs malformadas.\n */\nexport function isSafeUrl(url: string): boolean {\n if (typeof url !== 'string' || url.length === 0) return false;\n try {\n const base = typeof window !== 'undefined' ? window.location.href : 'http://localhost/';\n const parsed = new URL(url, base);\n return SAFE_URL_PROTOCOLS.includes(parsed.protocol);\n } catch {\n return false;\n }\n}\n\n/**\n * El backend no tiene aún un campo `ctaUrl` en el GuideStep — la URL\n * destino para `ctaAction === 'url'` se guarda como convención en\n * `style.ctaUrl`. Esta función la extrae validando que sea una URL\n * segura. Devuelve `undefined` si falta o no pasa el chequeo.\n */\nfunction readCtaUrl(step: GuideStep): string | undefined {\n const candidate = step.style?.ctaUrl;\n if (typeof candidate !== 'string') return undefined;\n return isSafeUrl(candidate) ? candidate : undefined;\n}\n","import { createCloseButton, isSafeUrl } from './block-builder';\nimport type { GuideStep, WalkthroughCallbacks } from './types';\n\n/**\n * Construye el subtree DOM de un step de walkthrough con navegación\n * (counter, dots, contenido, botones atrás/siguiente/finalizar/omitir).\n *\n * Aplica las mismas reglas de seguridad que `buildStepContent`:\n * - `textContent` para todo string del backend (cero `innerHTML`).\n * - `imageUrl` validada con `isSafeUrl`.\n *\n * El botón primario cambia su label según el step:\n * - último step → \"Finalizar\" → llama `onComplete`\n * - otro → `step.ctaText` o \"Siguiente\" → llama `onNext`\n *\n * El botón \"Atrás\" solo se pinta a partir del segundo step. El botón\n * \"Omitir\" siempre se pinta — el usuario debe poder salir en cualquier\n * momento.\n */\nexport function buildWalkthroughStepContent(\n step: GuideStep,\n stepIndex: number,\n totalSteps: number,\n doc: Document,\n callbacks: WalkthroughCallbacks,\n): HTMLElement {\n const container = doc.createElement('div');\n container.className = 'veo-guide-content';\n\n const counter = doc.createElement('div');\n counter.className = 'veo-walkthrough-counter';\n counter.textContent = `Paso ${stepIndex + 1} de ${totalSteps}`;\n container.appendChild(counter);\n\n const progress = doc.createElement('div');\n progress.className = 'veo-walkthrough-progress';\n for (let i = 0; i < totalSteps; i++) {\n const dot = doc.createElement('span');\n dot.className = 'veo-walkthrough-progress-dot';\n if (i < stepIndex) dot.classList.add('completed');\n if (i === stepIndex) dot.classList.add('active');\n progress.appendChild(dot);\n }\n container.appendChild(progress);\n\n if (typeof step.imageUrl === 'string' && step.imageUrl && isSafeUrl(step.imageUrl)) {\n const img = doc.createElement('img');\n img.className = 'veo-guide-image';\n img.src = step.imageUrl;\n img.alt = typeof step.title === 'string' ? step.title : '';\n container.appendChild(img);\n }\n\n if (typeof step.title === 'string' && step.title) {\n const heading = doc.createElement('h2');\n heading.className = 'veo-guide-title';\n heading.textContent = step.title;\n container.appendChild(heading);\n }\n\n if (typeof step.content === 'string' && step.content) {\n const paragraph = doc.createElement('p');\n paragraph.className = 'veo-guide-text';\n paragraph.textContent = step.content;\n container.appendChild(paragraph);\n }\n\n const actions = doc.createElement('div');\n actions.className = 'veo-walkthrough-actions';\n\n const skipBtn = doc.createElement('button');\n skipBtn.type = 'button';\n skipBtn.className = 'veo-walkthrough-skip';\n skipBtn.textContent = 'Omitir';\n skipBtn.addEventListener('click', () => callbacks.onSkip());\n actions.appendChild(skipBtn);\n\n const rightGroup = doc.createElement('div');\n rightGroup.className = 'veo-walkthrough-actions-right';\n\n if (stepIndex > 0) {\n const backBtn = doc.createElement('button');\n backBtn.type = 'button';\n backBtn.className = 'veo-walkthrough-btn-secondary';\n backBtn.textContent = 'Atrás';\n backBtn.addEventListener('click', () => callbacks.onBack());\n rightGroup.appendChild(backBtn);\n }\n\n const isLastStep = stepIndex === totalSteps - 1;\n const primaryBtn = doc.createElement('button');\n primaryBtn.type = 'button';\n primaryBtn.className = 'veo-guide-cta';\n const defaultLabel = isLastStep ? 'Finalizar' : 'Siguiente';\n primaryBtn.textContent =\n typeof step.ctaText === 'string' && step.ctaText ? step.ctaText : defaultLabel;\n primaryBtn.addEventListener('click', () => {\n if (isLastStep) callbacks.onComplete();\n else callbacks.onNext();\n });\n rightGroup.appendChild(primaryBtn);\n\n actions.appendChild(rightGroup);\n container.appendChild(actions);\n\n // \"✕\" universal (esquina superior derecha): salir en cualquier momento.\n // Mismo efecto que \"Omitir\" → reporta `dismissed`.\n container.appendChild(createCloseButton(doc, () => callbacks.onSkip()));\n\n return container;\n}\n","import type { GuideStep } from './types';\n\n/**\n * Tematización de guías dirigida por datos. El autor (dashboard no-code)\n * guarda props de diseño en `step.style`; acá las traducimos a las\n * variables CSS `--veo-*` que ya define `GUIDE_STYLES`.\n *\n * Seguridad: solo asignamos *custom properties* sobre el host (valores,\n * nunca selectores ni código). Validamos cada valor; lo inválido se ignora\n * y queda el default del stylesheet. Ningún valor llega a `innerHTML` ni a\n * `eval` — coherente con las reglas del renderer.\n */\n\n/** Overrides del tema oscuro (claro = defaults del stylesheet). */\nconst DARK_THEME: Record<string, string> = {\n '--veo-bg': '#1f2937',\n '--veo-text': '#f9fafb',\n '--veo-text-secondary': '#d1d5db',\n '--veo-shadow': '0 20px 60px rgba(0, 0, 0, 0.55)',\n};\n\nconst ALIGN_JUSTIFY: Record<string, string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n};\n\n/** `align-self` en el contenedor flex del step (para elementos tipo imagen). */\nconst ALIGN_SELF: Record<string, string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n};\n\n/** Elementos con estilo propio + qué usan para alinear (text-align vs align-self). */\nconst ELEMENT_ALIGN_MODE: Record<string, 'text' | 'self'> = {\n title: 'text',\n text: 'text',\n image: 'self',\n};\n\n/** Presets de sombra → box-shadow. */\nconst SHADOW: Record<string, string> = {\n none: 'none',\n soft: '0 4px 14px rgba(0, 0, 0, 0.10)',\n medium: '0 8px 30px rgba(0, 0, 0, 0.18)',\n strong: '0 24px 60px rgba(0, 0, 0, 0.32)',\n};\n\n/** Presets de posición del modal → fracción [x, y] del overlay (0..1). */\nconst PRESET_POS: Record<string, [number, number]> = {\n center: [0.5, 0.5],\n top: [0.5, 0],\n bottom: [0.5, 1],\n left: [0, 0.5],\n right: [1, 0.5],\n 'top-left': [0, 0],\n 'top-right': [1, 0],\n 'bottom-left': [0, 1],\n 'bottom-right': [1, 1],\n};\n\n/**\n * Acepta colores CSS razonables: hex (#rgb..#rrggbbaa), funcional\n * (rgb/rgba/hsl/hsla) o keyword simple. No interpola en CSS arbitrario:\n * el valor solo se usa como valor de una custom property.\n */\nconst COLOR_RE = /^#[0-9a-f]{3,8}$|^(rgb|rgba|hsl|hsla)\\([\\d.,%/\\sdeg]+\\)$|^[a-z]{3,20}$/i;\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, n));\n}\n\n/**\n * Aplica las props de diseño de `step.style` como variables CSS sobre el\n * host del shadow root. No-op si no hay style. Idempotente.\n */\nexport function applyDesignVars(host: HTMLElement, style: GuideStep['style']): void {\n if (!style || typeof style !== 'object') return;\n const s = style as Record<string, unknown>;\n\n if (typeof s.accentColor === 'string' && COLOR_RE.test(s.accentColor.trim())) {\n host.style.setProperty('--veo-primary', s.accentColor.trim());\n }\n\n // Fuente (del design system del workspace). Sin `<>{}` para no romper el CSS.\n if (\n typeof s.fontFamily === 'string' &&\n s.fontFamily.length <= 200 &&\n !/[<>{}]/.test(s.fontFamily)\n ) {\n host.style.setProperty('--veo-font', s.fontFamily.trim());\n }\n\n if (s.theme === 'dark') {\n for (const [key, value] of Object.entries(DARK_THEME)) {\n host.style.setProperty(key, value);\n }\n }\n\n if (typeof s.radius === 'number' && Number.isFinite(s.radius)) {\n host.style.setProperty('--veo-radius', `${clamp(s.radius, 0, 48)}px`);\n }\n\n if (typeof s.width === 'number' && Number.isFinite(s.width)) {\n host.style.setProperty('--veo-width', `${clamp(s.width, 220, 720)}px`);\n }\n\n if (s.align === 'left' || s.align === 'center' || s.align === 'right') {\n host.style.setProperty('--veo-actions-justify', ALIGN_JUSTIFY[s.align] as string);\n }\n\n if (typeof s.padding === 'number' && Number.isFinite(s.padding)) {\n host.style.setProperty('--veo-pad', `${clamp(s.padding, 0, 64)}px`);\n }\n\n if (typeof s.margin === 'number' && Number.isFinite(s.margin)) {\n host.style.setProperty('--veo-margin', `${clamp(s.margin, 0, 64)}px`);\n }\n\n if (typeof s.borderWidth === 'number' && Number.isFinite(s.borderWidth)) {\n host.style.setProperty('--veo-border-width', `${clamp(s.borderWidth, 0, 16)}px`);\n }\n\n if (typeof s.borderColor === 'string' && COLOR_RE.test(s.borderColor.trim())) {\n host.style.setProperty('--veo-border-color', s.borderColor.trim());\n }\n\n if (typeof s.shadow === 'string' && SHADOW[s.shadow]) {\n host.style.setProperty('--veo-shadow', SHADOW[s.shadow] as string);\n }\n\n // Posición del modal: libre (posX/posY en 0..1) tiene prioridad sobre el preset.\n let px: number | undefined;\n let py: number | undefined;\n if (typeof s.posX === 'number' && typeof s.posY === 'number') {\n px = clamp(s.posX, 0, 1);\n py = clamp(s.posY, 0, 1);\n } else if (typeof s.overlayPosition === 'string' && PRESET_POS[s.overlayPosition]) {\n [px, py] = PRESET_POS[s.overlayPosition] as [number, number];\n }\n if (px !== undefined && py !== undefined) {\n host.style.setProperty('--veo-pos-x', `${px * 100}%`);\n host.style.setProperty('--veo-pos-y', `${py * 100}%`);\n }\n\n // Estilo POR ELEMENTO (title/text/image/cta): cada bloque puede sobrescribir\n // alineación, color, tamaño y márgenes de forma independiente del step.\n if (s.elements && typeof s.elements === 'object') {\n const el = s.elements as Record<string, unknown>;\n applyElementVars(host, 'title', el.title);\n applyElementVars(host, 'text', el.text);\n applyElementVars(host, 'image', el.image);\n // El CTA alinea la fila de acciones (reusa --veo-actions-justify).\n const cta = el.cta as Record<string, unknown> | undefined;\n if (cta && typeof cta.align === 'string' && ALIGN_JUSTIFY[cta.align]) {\n host.style.setProperty('--veo-actions-justify', ALIGN_JUSTIFY[cta.align] as string);\n }\n }\n}\n\n/**\n * Emite las variables CSS de un elemento (`--veo-{prefix}-*`). Cada prop es\n * opcional y se valida; lo inválido se ignora y queda el default del stylesheet.\n */\nfunction applyElementVars(host: HTMLElement, prefix: string, raw: unknown): void {\n if (!raw || typeof raw !== 'object') return;\n const el = raw as Record<string, unknown>;\n\n if (\n typeof el.align === 'string' &&\n (el.align === 'left' || el.align === 'center' || el.align === 'right')\n ) {\n const mode = ELEMENT_ALIGN_MODE[prefix] ?? 'text';\n const value = mode === 'self' ? (ALIGN_SELF[el.align] as string) : el.align;\n host.style.setProperty(`--veo-${prefix}-align`, value);\n }\n if (typeof el.color === 'string' && COLOR_RE.test(el.color.trim())) {\n host.style.setProperty(`--veo-${prefix}-color`, el.color.trim());\n }\n if (typeof el.fontSize === 'number' && Number.isFinite(el.fontSize)) {\n host.style.setProperty(`--veo-${prefix}-size`, `${clamp(el.fontSize, 8, 72)}px`);\n }\n if (typeof el.width === 'number' && Number.isFinite(el.width)) {\n host.style.setProperty(`--veo-${prefix}-width`, `${clamp(el.width, 10, 100)}%`);\n }\n if (typeof el.radius === 'number' && Number.isFinite(el.radius)) {\n host.style.setProperty(`--veo-${prefix}-radius`, `${clamp(el.radius, 0, 48)}px`);\n }\n if (typeof el.marginTop === 'number' && Number.isFinite(el.marginTop)) {\n host.style.setProperty(`--veo-${prefix}-mt`, `${clamp(el.marginTop, 0, 64)}px`);\n }\n if (typeof el.marginBottom === 'number' && Number.isFinite(el.marginBottom)) {\n host.style.setProperty(`--veo-${prefix}-mb`, `${clamp(el.marginBottom, 0, 64)}px`);\n }\n}\n","import { GUIDE_Z_INDEX } from './constants';\n\n/**\n * CSS inyectado en cada shadow DOM. Como `:host { all: initial }` rompe\n * con la herencia del host, todos los estilos viven aquí. Las variables\n * CSS (`--veo-*`) son los puntos de extensión para tematización futura.\n */\nexport const GUIDE_STYLES = `\n:host {\n --veo-primary: #4f46e5;\n --veo-text: #1f2937;\n --veo-text-secondary: #4b5563;\n --veo-bg: #ffffff;\n --veo-radius: 12px;\n --veo-shadow: 0 20px 60px rgba(0, 0, 0, 0.25);\n --veo-width: 420px;\n --veo-actions-justify: flex-end;\n all: initial;\n}\n* { box-sizing: border-box; font-family: var(--veo-font, -apple-system, system-ui, \"Segoe UI\", Roboto, sans-serif); }\n\n.veo-modal-overlay {\n position: fixed; inset: 0;\n background: rgba(15, 15, 30, 0.45);\n z-index: ${GUIDE_Z_INDEX};\n animation: veo-fade-in 180ms ease-out;\n}\n/*\n * Posición libre/preset: --veo-pos-x/y son porcentajes (default 50% = centro).\n * El truco translate(-pos) alinea la MISMA fracción de la tarjeta con esa\n * fracción del overlay, así la tarjeta nunca se sale (0% = pegada izquierda,\n * 100% = pegada derecha, 50% = centrada) sea cual sea su ancho.\n */\n.veo-modal-card {\n position: absolute;\n left: var(--veo-pos-x, 50%);\n top: var(--veo-pos-y, 50%);\n transform: translate(calc(var(--veo-pos-x, 50%) * -1), calc(var(--veo-pos-y, 50%) * -1));\n background: var(--veo-bg);\n border-radius: var(--veo-radius);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 24px);\n max-width: var(--veo-width); width: 90%;\n box-shadow: var(--veo-shadow);\n animation: veo-fade-in 180ms ease-out;\n}\n\n.veo-banner {\n position: fixed; left: 0; right: 0;\n background: var(--veo-bg);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 16px);\n z-index: ${GUIDE_Z_INDEX};\n box-shadow: var(--veo-shadow, 0 2px 12px rgba(0, 0, 0, 0.12));\n animation: veo-slide-down 200ms ease-out;\n}\n.veo-banner-top { top: 0; }\n.veo-banner-bottom { bottom: 0; }\n\n.veo-tooltip {\n position: absolute;\n background: var(--veo-bg);\n border-radius: var(--veo-radius);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 15px);\n max-width: 300px;\n z-index: ${GUIDE_Z_INDEX};\n box-shadow: var(--veo-shadow, 0 8px 30px rgba(0, 0, 0, 0.18));\n animation: veo-fade-in 150ms ease-out;\n}\n.veo-tooltip-arrow {\n position: absolute;\n width: 12px;\n height: 12px;\n background: var(--veo-bg);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n transform: rotate(45deg);\n pointer-events: none;\n}\n\n.veo-inline {\n background: var(--veo-bg);\n border-radius: var(--veo-radius);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 20px);\n max-width: var(--veo-width);\n margin: var(--veo-margin, 12px) 0;\n position: relative;\n box-shadow: var(--veo-shadow);\n animation: veo-fade-in 160ms ease-out;\n}\n\n.veo-guide-content {\n position: relative;\n display: flex; flex-direction: column;\n}\n/* Reserva espacio para la ✕ (esquina sup. derecha) SOLO en el primer bloque:\n así el texto alineado a la derecha no queda tapado por el botón de cerrar. */\n.veo-guide-content > .veo-guide-title:first-child,\n.veo-guide-content > .veo-guide-text:first-child {\n padding-right: 20px;\n}\n.veo-guide-image {\n display: block;\n width: var(--veo-image-width, 100%);\n max-height: 180px;\n object-fit: cover;\n align-self: var(--veo-image-align, stretch);\n border-radius: var(--veo-image-radius, 8px);\n margin: var(--veo-image-mt, 0) 0 var(--veo-image-mb, 12px);\n}\n.veo-guide-title {\n font-size: var(--veo-title-size, 18px); font-weight: 600; line-height: 1.3;\n text-align: var(--veo-title-align, left);\n margin: var(--veo-title-mt, 0) 0 var(--veo-title-mb, 6px);\n color: var(--veo-title-color, var(--veo-text));\n}\n.veo-guide-text {\n font-size: var(--veo-text-size, 14px); line-height: 1.5;\n text-align: var(--veo-text-align, left);\n margin: var(--veo-text-mt, 0) 0 var(--veo-text-mb, 16px);\n color: var(--veo-text-color, var(--veo-text-secondary));\n}\n.veo-guide-actions {\n display: flex; gap: 8px; justify-content: var(--veo-actions-justify);\n}\n.veo-guide-cta {\n background: var(--veo-primary); color: #fff; border: none;\n padding: 9px 18px; border-radius: 8px;\n font-size: 14px; font-weight: 500; cursor: pointer;\n transition: opacity 120ms ease;\n}\n.veo-guide-cta:hover { opacity: 0.9; }\n.veo-guide-cta:active { transform: translateY(1px); }\n.veo-guide-close {\n position: absolute; top: -6px; right: -6px;\n width: 24px; height: 24px;\n background: none; border: none;\n font-size: 22px; line-height: 1;\n cursor: pointer; color: #9ca3af; padding: 0;\n}\n.veo-guide-close:hover { color: var(--veo-text); }\n\n.veo-form { display: flex; flex-direction: column; gap: 14px; margin-bottom: 16px; }\n.veo-form-field { display: flex; flex-direction: column; gap: 6px; }\n.veo-form-label { font-size: 13px; font-weight: 500; color: var(--veo-text); }\n.veo-form-input {\n font-size: 14px; color: var(--veo-text);\n background: var(--veo-bg);\n border: 1px solid #d1d5db; border-radius: 8px;\n padding: 8px 10px; width: 100%;\n}\n.veo-form-input:focus { outline: 2px solid var(--veo-primary); outline-offset: -1px; border-color: transparent; }\n.veo-form-options { display: flex; flex-direction: column; gap: 6px; }\n.veo-form-option {\n display: flex; align-items: center; gap: 8px;\n font-size: 14px; color: var(--veo-text); cursor: pointer;\n}\n.veo-form-option input { accent-color: var(--veo-primary); margin: 0; cursor: pointer; }\n.veo-form-scale { display: flex; gap: 4px; flex-wrap: wrap; }\n.veo-nps-btn {\n min-width: 30px; height: 30px; padding: 0 4px;\n font-size: 13px; font-weight: 500; color: var(--veo-text);\n background: var(--veo-bg); border: 1px solid #d1d5db; border-radius: 6px;\n cursor: pointer; transition: all 100ms ease;\n}\n.veo-nps-btn:hover { border-color: var(--veo-primary); }\n.veo-rating-btn {\n background: none; border: none; padding: 0 2px;\n font-size: 26px; line-height: 1; color: #d1d5db;\n cursor: pointer; transition: color 100ms ease;\n}\n.veo-scale-active.veo-nps-btn { background: var(--veo-primary); color: #fff; border-color: var(--veo-primary); }\n.veo-scale-active.veo-rating-btn { color: #f59e0b; }\n.veo-form-error { font-size: 13px; color: #dc2626; margin: 0; }\n.veo-form-thanks {\n text-align: center; padding: 24px 8px;\n font-size: 16px; font-weight: 600; color: var(--veo-text);\n}\n.veo-form-preview-note {\n text-align: center; margin: 0 0 12px;\n font-size: 12px; color: #b45309;\n}\n\n.veo-walkthrough {\n position: absolute;\n background: var(--veo-bg);\n border-radius: var(--veo-radius);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 16px);\n max-width: 340px;\n z-index: ${GUIDE_Z_INDEX};\n box-shadow: var(--veo-shadow, 0 8px 30px rgba(0, 0, 0, 0.2));\n animation: veo-fade-in 150ms ease-out;\n}\n.veo-walkthrough-arrow {\n position: absolute;\n width: 12px;\n height: 12px;\n background: var(--veo-bg);\n transform: rotate(45deg);\n pointer-events: none;\n}\n.veo-walkthrough-counter {\n font-size: 11px; color: #9ca3af;\n margin-bottom: 8px; letter-spacing: 0.02em;\n}\n.veo-walkthrough-progress {\n display: flex; gap: 4px;\n margin-bottom: 12px;\n}\n.veo-walkthrough-progress-dot {\n width: 8px; height: 8px;\n border-radius: 50%;\n background: #e5e7eb;\n transition: background 200ms ease;\n}\n.veo-walkthrough-progress-dot.active { background: var(--veo-primary); }\n.veo-walkthrough-progress-dot.completed { background: var(--veo-primary); opacity: 0.5; }\n.veo-walkthrough-actions {\n display: flex; align-items: center;\n margin-top: 16px; gap: 8px;\n}\n.veo-walkthrough-actions-right {\n display: flex; gap: 8px;\n margin-left: auto;\n}\n.veo-walkthrough-btn-secondary {\n background: transparent; color: #6b7280;\n border: 1px solid #e5e7eb;\n padding: 8px 16px; border-radius: 8px;\n font-size: 13px; cursor: pointer;\n transition: background 120ms ease;\n}\n.veo-walkthrough-btn-secondary:hover { background: #f9fafb; }\n.veo-walkthrough-skip {\n background: transparent; color: #9ca3af;\n border: none; padding: 4px 8px;\n font-size: 12px; cursor: pointer;\n}\n.veo-walkthrough-skip:hover { color: var(--veo-text); }\n\n.veo-custom-floating {\n position: fixed;\n z-index: ${GUIDE_Z_INDEX};\n max-width: calc(100vw - 16px);\n max-height: calc(100vh - 16px);\n animation: veo-fade-in 160ms ease;\n}\n.veo-custom-anchored {\n position: fixed;\n top: 0; left: 0;\n z-index: ${GUIDE_Z_INDEX};\n max-width: calc(100vw - 16px);\n animation: veo-fade-in 160ms ease;\n}\n.veo-custom-inline {\n display: block;\n position: relative;\n margin: 12px 0;\n}\n.veo-custom-frame {\n display: block;\n border: 0;\n width: 360px;\n background: transparent;\n color-scheme: normal;\n}\n/*\n * X de cerrar de las guías custom: el HTML del cliente vive en un iframe\n * sandbox, así que el botón lo pone el host POR ENCIMA del iframe. Con fondo\n * propio para ser visible sobre cualquier contenido.\n */\n.veo-custom-close {\n position: absolute; top: 6px; right: 6px; z-index: 1;\n width: 22px; height: 22px; padding: 0;\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; line-height: 1; color: #6b7280;\n background: rgba(255, 255, 255, 0.92);\n border: 1px solid rgba(0, 0, 0, 0.08); border-radius: 50%;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.14); cursor: pointer;\n}\n.veo-custom-close:hover { color: #111827; }\n\n@keyframes veo-fade-in { from { opacity: 0; } to { opacity: 1; } }\n@keyframes veo-slide-up {\n from { transform: translateY(10px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n}\n@keyframes veo-slide-down {\n from { transform: translateY(-10px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n}\n`;\n","import { GUIDE_HOST_ATTR } from '../constants';\nimport { applyDesignVars } from '../guide-design';\nimport { GUIDE_STYLES } from '../styles';\nimport type { GuideRenderContext, GuideStep } from '../types';\n\n/**\n * Base de los renderers de guías. Encapsula:\n * - creación del host con Shadow DOM (aislamiento de estilos)\n * - inyección del CSS común\n * - limpieza del DOM y de listeners en `destroy()`\n *\n * Cada subclase implementa `render(context)`. La subclase puede registrar\n * cleanup adicional con `registerCleanup` para que se ejecute en destroy.\n *\n * Tipos genéricos:\n * - `TContext` (default `GuideRenderContext`): el shape que recibe la\n * subclase. WalkthroughRenderer usa uno propio con step + callbacks.\n * - `TResult` (default `void`): lo que `render` devuelve. El walkthrough\n * usa `boolean` para señalar éxito al controller cuando el ancla no\n * aparece. El resto sigue devolviendo `void`/`Promise<void>`.\n */\nexport abstract class BaseRenderer<TContext = GuideRenderContext, TResult = void> {\n protected host: HTMLElement | null = null;\n protected shadow: ShadowRoot | null = null;\n private cleanups: Array<() => void> = [];\n\n /**\n * Crea un `<div data-veo-guide>` adjunto a `document.body`, le adjunta\n * un ShadowRoot abierto e inyecta los estilos. Retorna el nodo raíz\n * donde la subclase puede insertar el contenido específico.\n */\n protected createHost(): { host: HTMLElement; shadow: ShadowRoot; root: HTMLElement } {\n const host = document.createElement('div');\n host.setAttribute(GUIDE_HOST_ATTR, '');\n const shadow = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = GUIDE_STYLES;\n shadow.appendChild(style);\n\n const root = document.createElement('div');\n shadow.appendChild(root);\n\n document.body.appendChild(host);\n\n this.host = host;\n this.shadow = shadow;\n return { host, shadow, root };\n }\n\n /**\n * Aplica la tematización por datos del step (`step.style`) como variables\n * CSS sobre el host. Llamar tras `createHost()`. No-op si no hay host o\n * style. Ver `guide-design.ts`.\n */\n protected applyDesign(style: GuideStep['style']): void {\n if (this.host) applyDesignVars(this.host, style);\n }\n\n /**\n * Registra una función a ejecutar en `destroy()`. Útil para limpiar\n * listeners globales (scroll, resize) o intervalos.\n */\n protected registerCleanup(fn: () => void): void {\n this.cleanups.push(fn);\n }\n\n /** Remueve el host del DOM y corre todas las funciones de cleanup. */\n destroy(): void {\n for (const fn of this.cleanups) {\n try {\n fn();\n } catch {\n // No propagar: un cleanup roto no debe romper el resto.\n }\n }\n this.cleanups = [];\n\n if (this.host?.parentNode) {\n this.host.parentNode.removeChild(this.host);\n }\n this.host = null;\n this.shadow = null;\n }\n\n abstract render(context: TContext): TResult | Promise<TResult>;\n}\n","import { buildStepContent } from '../block-builder';\nimport type { GuideRenderContext } from '../types';\nimport { buildWalkthroughStepContent } from '../walkthrough-block-builder';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía tipo `banner`: barra fija arriba o abajo. La\n * posición se lee de `step.style.position` (`top` | `bottom`); default\n * es `top`. No tiene backdrop ni atrapa el foco.\n *\n * Con `context.nav` (paso de un walkthrough heterogéneo) muestra botones de\n * navegación y delega tracking/avance al controller.\n */\nexport class BannerRenderer extends BaseRenderer {\n render(context: GuideRenderContext): void {\n const idx = context.nav?.stepIndex ?? 0;\n const step = context.guide.guideSteps[idx];\n if (!step) return;\n\n const { root } = this.createHost();\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n const position = step.style?.position === 'bottom' ? 'bottom' : 'top';\n\n const banner = ownerDocument.createElement('div');\n banner.className = `veo-banner veo-banner-${position}`;\n\n const dismiss = (action: 'dismissed' | 'cta_clicked', ctaUrl?: string) => {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: idx, action });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n\n const content = context.nav\n ? buildWalkthroughStepContent(\n step,\n context.nav.stepIndex,\n context.nav.totalSteps,\n ownerDocument,\n context.nav.callbacks,\n )\n : buildStepContent(step, ownerDocument, {\n onCtaClick: (action, url) => dismiss('cta_clicked', action === 'url' ? url : undefined),\n onDismiss: () => dismiss('dismissed'),\n });\n\n banner.appendChild(content);\n root.appendChild(banner);\n\n if (!context.nav) {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n }\n}\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nfunction getSideAxis(placement) {\n const firstChar = placement[0];\n return firstChar === 't' || firstChar === 'b' ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.includes('start') ? placement.replace('start', 'end') : placement.replace('end', 'start');\n}\nconst lrPlacement = ['left', 'right'];\nconst rlPlacement = ['right', 'left'];\nconst tbPlacement = ['top', 'bottom'];\nconst btPlacement = ['bottom', 'top'];\nfunction getSideList(side, isStart, rtl) {\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rlPlacement : lrPlacement;\n return isStart ? lrPlacement : rlPlacement;\n case 'left':\n case 'right':\n return isStart ? tbPlacement : btPlacement;\n default:\n return [];\n }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n const alignment = getAlignment(placement);\n let list = getSideList(getSide(placement), direction === 'start', rtl);\n if (alignment) {\n list = list.map(side => side + \"-\" + alignment);\n if (flipAlignment) {\n list = list.concat(list.map(getOppositeAlignmentPlacement));\n }\n }\n return list;\n}\nfunction getOppositePlacement(placement) {\n const side = getSide(placement);\n return oppositeSideMap[side] + placement.slice(side.length);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n const {\n x,\n y,\n width,\n height\n } = rect;\n return {\n width,\n height,\n top: y,\n left: x,\n right: x + width,\n bottom: y + height,\n x,\n y\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n// Maximum number of resets that can occur before bailing to avoid infinite reset loops.\nconst MAX_RESET_COUNT = 50;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const platformWithDetectOverflow = platform.detectOverflow ? platform : {\n ...platform,\n detectOverflow\n };\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let resetCount = 0;\n const middlewareData = {};\n for (let i = 0; i < middleware.length; i++) {\n const currentMiddleware = middleware[i];\n if (!currentMiddleware) {\n continue;\n }\n const {\n name,\n fn\n } = currentMiddleware;\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform: platformWithDetectOverflow,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData[name] = {\n ...middlewareData[name],\n ...data\n };\n if (reset && resetCount < MAX_RESET_COUNT) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n const ignoreCrossAxisOverflow = checkCrossAxis === 'alignment' ? initialSideAxis !== getSideAxis(nextPlacement) : false;\n if (!ignoreCrossAxisOverflow ||\n // We leave the current main axis only if every placement on that axis\n // overflows the main axis.\n overflowsData.every(d => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$filter2;\n const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n if (hasFallbackAxisSideDirection) {\n const currentSideAxis = getSideAxis(d.placement);\n return currentSideAxis === initialSideAxis ||\n // Create a bias to the `y` side axis due to horizontal\n // reading directions favoring greater width.\n currentSideAxis === 'y';\n }\n return true;\n }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n rects,\n platform\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await platform.detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await platform.detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\nconst originSides = /*#__PURE__*/new Set(['left', 'top']);\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getSideAxis(placement) === 'y';\n const mainAxisMulti = originSides.has(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = evaluate(options, state);\n\n // eslint-disable-next-line prefer-const\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: rawValue.mainAxis || 0,\n crossAxis: rawValue.crossAxis || 0,\n alignmentAxis: rawValue.alignmentAxis\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n if (options === void 0) {\n options = 0;\n }\n return {\n name: 'offset',\n options,\n async fn(state) {\n var _middlewareData$offse, _middlewareData$arrow;\n const {\n x,\n y,\n placement,\n middlewareData\n } = state;\n const diffCoords = await convertValueToCoords(state, options);\n\n // If the placement is the same and the arrow caused an alignment offset\n // then we don't need to change the positioning coordinates.\n if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: {\n ...diffCoords,\n placement\n }\n };\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n platform\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y,\n enabled: {\n [mainAxis]: checkMainAxis,\n [crossAxis]: checkCrossAxis\n }\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = originSides.has(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n var _state$middlewareData, _state$middlewareData2;\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = evaluate(options, state);\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isYAxis = getSideAxis(placement) === 'y';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n const maximumClippingWidth = width - overflow.left - overflow.right;\n const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n availableWidth = maximumClippingWidth;\n }\n if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n availableHeight = maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isYAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","function hasWindow() {\n return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n if (isNode(node)) {\n return (node.nodeName || '').toLowerCase();\n }\n // Mocked nodes in testing environments may not be instances of Node. By\n // returning `#document` an infinite loop won't occur.\n // https://github.com/floating-ui/floating-ui/issues/2317\n return '#document';\n}\nfunction getWindow(node) {\n var _node$ownerDocument;\n return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n var _ref;\n return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n return false;\n }\n return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && display !== 'inline' && display !== 'contents';\n}\nfunction isTableElement(element) {\n return /^(table|td|th)$/.test(getNodeName(element));\n}\nfunction isTopLayer(element) {\n try {\n if (element.matches(':popover-open')) {\n return true;\n }\n } catch (_e) {\n // no-op\n }\n try {\n return element.matches(':modal');\n } catch (_e) {\n return false;\n }\n}\nconst willChangeRe = /transform|translate|scale|rotate|perspective|filter/;\nconst containRe = /paint|layout|strict|content/;\nconst isNotNone = value => !!value && value !== 'none';\nlet isWebKitValue;\nfunction isContainingBlock(elementOrCss) {\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n return isNotNone(css.transform) || isNotNone(css.translate) || isNotNone(css.scale) || isNotNone(css.rotate) || isNotNone(css.perspective) || !isWebKit() && (isNotNone(css.backdropFilter) || isNotNone(css.filter)) || willChangeRe.test(css.willChange || '') || containRe.test(css.contain || '');\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (isWebKitValue == null) {\n isWebKitValue = typeof CSS !== 'undefined' && CSS.supports && CSS.supports('-webkit-backdrop-filter', 'none');\n }\n return isWebKitValue;\n}\nfunction isLastTraversableNode(node) {\n return /^(html|body|#document)$/.test(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n } else {\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n }\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","import { rectToClientRect, arrow as arrow$1, autoPlacement as autoPlacement$1, detectOverflow as detectOverflow$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle as getComputedStyle$1, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle$1(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle$1(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n const leftScroll = getNodeScroll(element).scrollLeft;\n if (!rect) {\n return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n }\n return rect.left + leftScroll;\n}\n\nfunction getHTMLOffset(documentElement, scroll) {\n const htmlRect = documentElement.getBoundingClientRect();\n const x = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect);\n const y = htmlRect.top + scroll.scrollTop;\n return {\n x,\n y\n };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle$1(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Safety check: ensure the scrollbar space is reasonable in case this\n// calculation is affected by unusual styles.\n// Most scrollbars leave 15-18px of space.\nconst SCROLLBAR_MAX = 25;\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n const windowScrollbarX = getWindowScrollBarX(html);\n // <html> `overflow: hidden` + `scrollbar-gutter: stable` reduces the\n // visual width of the <html> but this is not considered in the size\n // of `html.clientWidth`.\n if (windowScrollbarX <= 0) {\n const doc = html.ownerDocument;\n const body = doc.body;\n const bodyStyles = getComputedStyle(body);\n const bodyMarginInline = doc.compatMode === 'CSS1Compat' ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0;\n const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline);\n if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) {\n width -= clippingStableScrollbarWidth;\n }\n } else if (windowScrollbarX <= SCROLLBAR_MAX) {\n // If the <body> scrollbar is on the left, the width needs to be extended\n // by the scrollbar amount so there isn't extra space on the right.\n width += windowScrollbarX;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y,\n width: clippingAncestor.width,\n height: clippingAncestor.height\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle$1(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle$1(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle$1(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && (currentContainingBlockComputedStyle.position === 'absolute' || currentContainingBlockComputedStyle.position === 'fixed') || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstRect = getClientRectFromClippingAncestor(element, clippingAncestors[0], strategy);\n let top = firstRect.top;\n let right = firstRect.right;\n let bottom = firstRect.bottom;\n let left = firstRect.left;\n for (let i = 1; i < clippingAncestors.length; i++) {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestors[i], strategy);\n top = max(rect.top, top);\n right = min(rect.right, right);\n bottom = min(rect.bottom, bottom);\n left = max(rect.left, left);\n }\n return {\n width: right - left,\n height: bottom - top,\n x: left,\n y: top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n\n // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n function setLeftRTLScrollbarOffset() {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n setLeftRTLScrollbarOffset();\n }\n }\n if (isFixed && !isOffsetParentAnElement && documentElement) {\n setLeftRTLScrollbarOffset();\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle$1(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle$1(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the <html> element as the offsetParent if it's non-static,\n // while Chrome and Safari return the <body> element. The <body> element must\n // be used to perform the correct calculations even if the <html> element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle$1(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\nfunction rectsAreEqual(a, b) {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const elementRectForRootMargin = element.getBoundingClientRect();\n const {\n left,\n top,\n width,\n height\n } = elementRectForRootMargin;\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n // If the reference is clipped, the ratio is 0. Throttle the refresh\n // to prevent an infinite loop of updates.\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 1000);\n } else {\n refresh(false, ratio);\n }\n }\n if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n // It's possible that even though the ratio is reported as 1, the\n // element is not actually fully within the IntersectionObserver's root\n // area anymore. This can happen under performance constraints. This may\n // be a bug in the browser's IntersectionObserver implementation. To\n // work around this, we compare the element's bounding rect now with\n // what it was at the time we created the IntersectionObserver. If they\n // are not equal then the element moved, so we refresh.\n refresh();\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle <iframe>s\n root: root.ownerDocument\n });\n } catch (_e) {\n io = new IntersectionObserver(handleObserve, options);\n }\n io.observe(element);\n }\n refresh(true);\n return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n ancestorScroll = true,\n ancestorResize = true,\n elementResize = typeof ResizeObserver === 'function',\n layoutShift = typeof IntersectionObserver === 'function',\n animationFrame = false\n } = options;\n const referenceEl = unwrapElement(reference);\n const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...(floating ? getOverflowAncestors(floating) : [])] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n let reobserveFrame = -1;\n let resizeObserver = null;\n if (elementResize) {\n resizeObserver = new ResizeObserver(_ref => {\n let [firstEntry] = _ref;\n if (firstEntry && firstEntry.target === referenceEl && resizeObserver && floating) {\n // Prevent update loops when using the `size` middleware.\n // https://github.com/floating-ui/floating-ui/issues/1740\n resizeObserver.unobserve(floating);\n cancelAnimationFrame(reobserveFrame);\n reobserveFrame = requestAnimationFrame(() => {\n var _resizeObserver;\n (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n });\n }\n update();\n });\n if (referenceEl && !animationFrame) {\n resizeObserver.observe(referenceEl);\n }\n if (floating) {\n resizeObserver.observe(floating);\n }\n }\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n if (animationFrame) {\n frameLoop();\n }\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {\n update();\n }\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n update();\n return () => {\n var _resizeObserver2;\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n cleanupIo == null || cleanupIo();\n (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n resizeObserver = null;\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n // This caches the expensive `getClippingElementAncestors` function so that\n // multiple lifecycle resets re-use the same result. It only lives for a\n // single call. If other functions become expensive, we can add them as well.\n const cache = new Map();\n const mergedOptions = {\n platform,\n ...options\n };\n const platformWithCache = {\n ...mergedOptions.platform,\n _c: cache\n };\n return computePosition$1(reference, floating, {\n ...mergedOptions,\n platform: platformWithCache\n });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n","import { DEFAULT_ANCHOR_WAIT_MS } from './constants';\n\n/**\n * Resuelve un selector CSS de forma robusta para SPAs: chequea inmediato\n * y, si no existe, observa el DOM con MutationObserver hasta `timeoutMs`.\n * Devuelve `null` si no apareció antes del timeout.\n *\n * Esta función nunca lanza. Si el selector es inválido devuelve `null`\n * silenciosamente — un selector roto en la DB no debe romper la app.\n */\nexport function waitForElement(\n selector: string,\n timeoutMs: number = DEFAULT_ANCHOR_WAIT_MS,\n): Promise<Element | null> {\n return new Promise((resolve) => {\n const safeQuery = (): Element | null => {\n try {\n return document.querySelector(selector);\n } catch {\n return null;\n }\n };\n\n const existing = safeQuery();\n if (existing) {\n resolve(existing);\n return;\n }\n\n let resolved = false;\n const finish = (el: Element | null) => {\n if (resolved) return;\n resolved = true;\n observer.disconnect();\n clearTimeout(timer);\n resolve(el);\n };\n\n const observer = new MutationObserver(() => {\n const el = safeQuery();\n if (el) finish(el);\n });\n\n observer.observe(document.body, { childList: true, subtree: true });\n\n const timer = setTimeout(() => finish(null), timeoutMs);\n });\n}\n","/**\n * Genera un UUID v7 (timestamp-based, ordenable cronológicamente).\n * Spec: RFC 9562.\n *\n * Formato: tttttttt-tttt-7xxx-yxxx-xxxxxxxxxxxx\n * - 48 bits de timestamp (ms desde epoch)\n * - 4 bits de versión (7)\n * - 2 bits de variante (10)\n * - 74 bits aleatorios\n */\nexport function uuidv7(): string {\n const timestamp = Date.now();\n const timeHex = timestamp.toString(16).padStart(12, '0');\n\n // 10 bytes aleatorios para los 74 bits de entropía (+ bits de versión/variante).\n const random = new Uint8Array(10);\n if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {\n crypto.getRandomValues(random);\n } else {\n // Fallback inseguro pero funcional (no debería ocurrir en browsers modernos).\n for (let i = 0; i < random.length; i++) {\n random[i] = Math.floor(Math.random() * 256);\n }\n }\n\n // Set version (7) en el primer nibble del 3er grupo.\n random[0] = ((random[0] ?? 0) & 0x0f) | 0x70;\n // Set variant (10) en los 2 bits altos del 4to grupo.\n random[2] = ((random[2] ?? 0) & 0x3f) | 0x80;\n\n const hex = Array.from(random, (b) => b.toString(16).padStart(2, '0')).join('');\n\n return [\n timeHex.slice(0, 8),\n timeHex.slice(8, 12),\n hex.slice(0, 4),\n hex.slice(4, 8),\n hex.slice(8, 20),\n ].join('-');\n}\n","import { uuidv7 } from '../../../utils/uuid';\nimport { isSafeUrl } from '../block-builder';\nimport type { GuideRenderContext, GuideStep } from '../types';\n\ninterface VeoBridgeMessage {\n __veo?: unknown;\n type?: unknown;\n url?: unknown;\n name?: unknown;\n props?: unknown;\n height?: unknown;\n close?: unknown;\n}\n\n/**\n * Monta el `<iframe sandbox>` con el HTML/CSS/JS del cliente (origen `null`,\n * sin acceso al host) y cablea el puente postMessage (`dismiss`/`cta`/`track`/\n * `navigate`/`resize`) validando `source` + token. Compartido por las guías\n * `custom` (flotante/anclada) e `inline-custom` (embebida en el flujo).\n *\n * El caller crea el wrapper y posiciona/inserta el iframe; acá sólo va la\n * lógica del documento + el bridge. Devuelve el iframe y un cleanup.\n */\nexport function mountCustomFrame(\n doc: Document,\n step: GuideStep,\n context: GuideRenderContext,\n opts: { width: string; fixedHeight?: number | string | null },\n): { iframe: HTMLIFrameElement; cleanup: () => void } {\n const iframe = doc.createElement('iframe');\n iframe.className = 'veo-custom-frame';\n // allow-scripts SIN allow-same-origin → origen null, sin acceso al host.\n iframe.setAttribute('sandbox', 'allow-scripts');\n iframe.setAttribute('title', context.guide.guideName || 'Veo');\n iframe.style.width = opts.width;\n\n const hasFixedHeight = opts.fixedHeight !== undefined && opts.fixedHeight !== null;\n if (hasFixedHeight) iframe.style.height = toCssSize(opts.fixedHeight as number | string);\n\n const token = uuidv7();\n // fix: las apps modernas usan design tokens/Tailwind. Reenviamos las custom\n // properties del host (`:root`) al iframe para que el CSS del cliente pueda\n // usar `var(--su-token)`; y opcionalmente inyectamos Tailwind (Play CDN) si el\n // autor lo pidió en `style.tailwind` (sujeto al CSP de la app — ver más abajo).\n const wantsTailwind = (step.style as Record<string, unknown> | undefined)?.tailwind === true;\n iframe.srcdoc = buildSrcdoc(step.html ?? '', step.css ?? '', step.js ?? '', token, {\n tokens: collectHostTokens(),\n tailwind: wantsTailwind,\n });\n\n const close = (): void => context.onClose();\n\n const onMessage = (event: MessageEvent): void => {\n if (event.source !== iframe.contentWindow) return;\n const data = event.data as VeoBridgeMessage | null;\n if (!data || typeof data !== 'object' || data.__veo !== token) return;\n\n switch (data.type) {\n case 'dismiss':\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'dismissed',\n });\n close();\n break;\n case 'cta':\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'cta_clicked',\n });\n if (typeof data.url === 'string' && isSafeUrl(data.url)) {\n window.open(data.url, '_blank', 'noopener,noreferrer');\n }\n if (data.close !== false) close();\n break;\n case 'navigate':\n if (typeof data.url === 'string' && isSafeUrl(data.url)) {\n window.location.assign(data.url);\n }\n break;\n case 'track':\n if (typeof data.name === 'string' && context.onTrack) {\n context.onTrack(data.name, isRecord(data.props) ? data.props : undefined);\n }\n break;\n case 'resize':\n if (!hasFixedHeight && typeof data.height === 'number' && data.height > 0) {\n iframe.style.height = `${Math.ceil(data.height)}px`;\n }\n break;\n }\n };\n window.addEventListener('message', onMessage);\n\n return { iframe, cleanup: () => window.removeEventListener('message', onMessage) };\n}\n\nexport function toCssSize(value: number | string): string {\n return typeof value === 'number' ? `${value}px` : value;\n}\n\n/**\n * Recolecta las custom properties (`--*`) definidas en `:root` del host y las\n * devuelve como un bloque `:root{…}` para inyectar en el iframe. Así el CSS de\n * una guía custom puede usar los MISMOS design tokens que la app (`var(--…)`),\n * aunque el iframe esté aislado (origen null). También expone la fuente del host\n * como `--veo-host-font`. Acotado (≤400 vars, valores ≤200 chars, sin `<>{}`).\n */\nfunction collectHostTokens(): string {\n if (typeof window === 'undefined' || typeof document === 'undefined') return '';\n try {\n const rootStyle = getComputedStyle(document.documentElement);\n const decls: string[] = [];\n const seen = new Set<string>();\n for (let i = 0; i < rootStyle.length && decls.length < 400; i++) {\n const name = rootStyle.item(i);\n if (!name.startsWith('--') || seen.has(name)) continue;\n seen.add(name);\n const value = rootStyle.getPropertyValue(name).trim();\n if (!value || value.length > 200 || /[<>{}]/.test(value)) continue;\n decls.push(`${name}:${value}`);\n }\n const bodyFont = getComputedStyle(document.body).fontFamily;\n if (bodyFont && bodyFont.length <= 200 && !/[<>{}]/.test(bodyFont)) {\n decls.push(`--veo-host-font:${bodyFont}`);\n }\n return decls.length ? `:root{${decls.join(';')}}` : '';\n } catch {\n return '';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Arma el documento del iframe. El JS del cliente puede llamar a `window.veo`\n * (bridge inyectado). `</script>`/`</style>` dentro del código se neutralizan\n * para que no corten sus bloques.\n *\n * `opts.tokens` = bloque `:root{…}` con los design tokens del host (para que el\n * CSS del cliente use `var(--…)`). `opts.tailwind` inyecta el Play CDN de\n * Tailwind para que las clases utilitarias compilen en runtime — sujeto al CSP\n * de la app (`script-src` debe permitir `cdn.tailwindcss.com`); si el CSP lo\n * bloquea, el CDN no carga y quedan solo los tokens + CSS propio.\n */\nfunction buildSrcdoc(\n html: string,\n css: string,\n js: string,\n token: string,\n opts: { tokens: string; tailwind: boolean },\n): string {\n const bridge =\n `(function(){var T=${JSON.stringify(token)};` +\n `function P(m){m.__veo=T;parent.postMessage(m,'*');}` +\n `window.veo={` +\n `dismiss:function(){P({type:'dismiss'});},` +\n `cta:function(u){P({type:'cta',url:u});},` +\n `track:function(n,p){P({type:'track',name:n,props:p||{}});},` +\n `navigate:function(u){P({type:'navigate',url:u});}};` +\n // Los <a href> dentro del iframe sandbox navegarían el iframe (la cajita),\n // no la app del host. Interceptamos el click y reenviamos la navegación al\n // host: links normales → navigate (misma pestaña); target=_blank → nueva\n // pestaña. Así los links de una guía custom \"simplemente funcionan\".\n `document.addEventListener('click',function(e){` +\n `var a=e.target&&e.target.closest?e.target.closest('a[href]'):null;` +\n `if(!a)return;` +\n `var h=a.getAttribute('href');` +\n `if(!h||h.charAt(0)==='#'||/^(javascript|mailto|tel):/i.test(h))return;` +\n `e.preventDefault();` +\n `if(a.target==='_blank'){P({type:'cta',url:a.href,close:false});}` +\n `else{P({type:'navigate',url:h});}` +\n `},true);` +\n `function H(){P({type:'resize',height:Math.ceil(document.documentElement.scrollHeight)});}` +\n `window.addEventListener('load',H);` +\n `try{if(typeof ResizeObserver!=='undefined'){new ResizeObserver(H).observe(document.documentElement);}}catch(e){}` +\n `})();`;\n\n // Tokens del host primero (para poder usarlos), luego el CSS del autor (gana).\n const tokensStyle = opts.tokens ? `<style>${escapeClosing(opts.tokens, 'style')}</style>` : '';\n // Tailwind Play CDN (opt-in). El src remoto depende del CSP de la app.\n const tailwind = opts.tailwind ? '<script src=\"https://cdn.tailwindcss.com\"></script>' : '';\n\n return (\n '<!DOCTYPE html><html><head><meta charset=\"utf-8\">' +\n '<style>html,body{margin:0;padding:0;background:transparent;font-family:var(--veo-host-font,system-ui,sans-serif);}</style>' +\n tokensStyle +\n tailwind +\n `<style>${escapeClosing(css, 'style')}</style></head><body>${html}` +\n `<script>${bridge}</script>` +\n (js ? `<script>${escapeClosing(js, 'script')}</script>` : '') +\n '</body></html>'\n );\n}\n\nfunction escapeClosing(code: string, tag: 'script' | 'style'): string {\n const rx = tag === 'script' ? /<\\/script/gi : /<\\/style/gi;\n return code.replace(rx, `<\\\\/${tag}`);\n}\n","import { computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { createCloseButton } from '../block-builder';\nimport type { CustomPlacement, GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { mountCustomFrame, toCssSize } from './custom-frame';\n\nconst DEFAULT_PLACEMENT: CustomPlacement = { mode: 'floating', position: 'bottom-right' };\nconst DEFAULT_OFFSET = 16;\nconst DEFAULT_WIDTH = 360;\n\n/**\n * Renderiza una guía `custom` montando el HTML/CSS/JS del cliente en un\n * **iframe sandbox** (ver `custom-frame.ts`). Ubicación: `floating`\n * (esquina/centro del viewport) o `anchored` (Floating UI contra un selector\n * del host). La variante embebida en el flujo es `inline-custom`.\n */\nexport class CustomRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step || typeof step.html !== 'string' || step.html.length === 0) return;\n\n const placement: CustomPlacement = step.placement ?? DEFAULT_PLACEMENT;\n\n let anchor: Element | null = null;\n if (placement.mode === 'anchored') {\n const selector =\n placement.selector ?? step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n anchor = await waitForElement(selector);\n if (!anchor) return; // sin ancla no mostramos (guía fantasma = peor UX)\n }\n\n const { root } = this.createHost();\n const doc = root.ownerDocument ?? document;\n\n const wrapper = doc.createElement('div');\n wrapper.className =\n placement.mode === 'anchored' ? 'veo-custom-anchored' : 'veo-custom-floating';\n\n const { iframe, cleanup } = mountCustomFrame(doc, step, context, {\n width: toCssSize(placement.width ?? DEFAULT_WIDTH),\n fixedHeight: placement.height ?? null,\n });\n this.registerCleanup(cleanup);\n\n wrapper.appendChild(iframe);\n // X universal por encima del iframe (el sandbox aísla el contenido del\n // cliente, así que la salida la pone el host).\n wrapper.appendChild(\n createCloseButton(\n doc,\n () => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'dismissed',\n });\n context.onClose();\n },\n 'veo-custom-close',\n ),\n );\n root.appendChild(wrapper);\n\n if (placement.mode === 'floating') {\n applyFloatingPosition(wrapper, placement);\n } else if (anchor) {\n this.registerCleanup(await this.setupAnchoredPosition(anchor, wrapper, placement));\n }\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n\n private async setupAnchoredPosition(\n anchor: Element,\n wrapper: HTMLElement,\n placement: CustomPlacement,\n ): Promise<() => void> {\n const side = placement.side ?? 'bottom';\n const update = async (): Promise<void> => {\n const { x, y } = await computePosition(anchor, wrapper, {\n placement: side,\n strategy: 'fixed',\n middleware: [offset(placement.offsetY ?? 8), flip(), shift({ padding: 8 })],\n });\n wrapper.style.left = `${x}px`;\n wrapper.style.top = `${y}px`;\n };\n await update();\n\n const reposition = (): void => {\n void update();\n };\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n return () => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n }\n}\n\n/** Fija el wrapper en una esquina/centro del viewport según `position`. */\nfunction applyFloatingPosition(wrapper: HTMLElement, placement: CustomPlacement): void {\n const position = placement.position ?? 'bottom-right';\n const ox = `${placement.offsetX ?? DEFAULT_OFFSET}px`;\n const oy = `${placement.offsetY ?? DEFAULT_OFFSET}px`;\n const s = wrapper.style;\n\n if (position === 'center') {\n s.top = '50%';\n s.left = '50%';\n s.transform = 'translate(-50%, -50%)';\n return;\n }\n\n const [vertical, horizontal] = position.split('-');\n if (vertical === 'top') s.top = oy;\n else s.bottom = oy;\n\n if (horizontal === 'left') {\n s.left = ox;\n } else if (horizontal === 'right') {\n s.right = ox;\n } else {\n s.left = '50%';\n s.transform = 'translateX(-50%)';\n }\n}\n","import { createCloseButton } from './block-builder';\nimport type { FormField, GuideRenderContext } from './types';\n\n/**\n * Construcción COMPARTIDA del contenido de una guía `form` (overlay) e\n * `inline-form` (embebida): título/texto, campos, validación de requeridos,\n * envío vía `context.onFormSubmit`, estado \"¡Gracias!\" y cierre diferido.\n * El caller pone el chrome (modal-card u tarjeta inline) y pasa la `card`\n * donde se reemplaza el contenido por el agradecimiento.\n *\n * Mismas reglas de seguridad que block-builder: cero `innerHTML`, todo texto\n * por `textContent`.\n */\nexport function mountFormContent(\n card: HTMLElement,\n context: GuideRenderContext,\n doc: Document,\n): void {\n const step = context.guide.guideSteps[0];\n if (!step) return;\n const fields = step.fields ?? [];\n\n const dismiss = (): void => {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'dismissed' });\n context.onClose();\n };\n\n const content = doc.createElement('div');\n content.className = 'veo-guide-content';\n\n if (step.title) {\n const heading = doc.createElement('h2');\n heading.className = 'veo-guide-title';\n heading.textContent = step.title;\n content.appendChild(heading);\n }\n if (step.content) {\n const paragraph = doc.createElement('p');\n paragraph.className = 'veo-guide-text';\n paragraph.textContent = step.content;\n content.appendChild(paragraph);\n }\n\n const readers: Array<{ field: FormField; read: () => unknown }> = [];\n const form = doc.createElement('form');\n form.className = 'veo-form';\n form.noValidate = true;\n for (const field of fields) {\n const { wrapper, read } = buildField(field, doc);\n readers.push({ field, read });\n form.appendChild(wrapper);\n }\n\n const error = doc.createElement('p');\n error.className = 'veo-form-error';\n error.style.display = 'none';\n form.appendChild(error);\n\n const actions = doc.createElement('div');\n actions.className = 'veo-guide-actions';\n const submit = doc.createElement('button');\n submit.type = 'submit';\n submit.className = 'veo-guide-cta';\n submit.textContent = step.ctaText || 'Enviar';\n actions.appendChild(submit);\n form.appendChild(actions);\n\n form.addEventListener('submit', (e) => {\n e.preventDefault();\n error.style.display = 'none';\n\n const answers: Record<string, unknown> = {};\n for (const { field, read } of readers) {\n const value = read();\n const empty = value === undefined || value === null || value === '';\n if (empty) {\n if (field.required) {\n error.textContent = `Completá \"${field.label}\"`;\n error.style.display = 'block';\n return;\n }\n continue;\n }\n answers[field.key] = value;\n }\n if (Object.keys(answers).length === 0) {\n error.textContent = 'Respondé al menos un campo';\n error.style.display = 'block';\n return;\n }\n\n submit.disabled = true;\n const submitFn = context.onFormSubmit ?? (() => Promise.resolve(true));\n void submitFn(answers).then((ok) => {\n if (!ok) {\n submit.disabled = false;\n error.textContent = 'No se pudo enviar. Probá de nuevo.';\n error.style.display = 'block';\n return;\n }\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'completed' });\n const note = context.isPreview\n ? (context.previewNote ?? 'Vista previa: la respuesta NO se guardó.')\n : null;\n showThanks(card, doc, note);\n window.setTimeout(() => context.onClose(), note ? 2200 : 1400);\n });\n });\n\n content.appendChild(form);\n content.appendChild(createCloseButton(doc, dismiss));\n\n card.appendChild(content);\n}\n\n/** Reemplaza el contenido de la tarjeta por un \"¡Gracias!\" breve. */\nfunction showThanks(card: HTMLElement, doc: Document, note: string | null): void {\n while (card.firstChild) card.removeChild(card.firstChild);\n const thanks = doc.createElement('div');\n thanks.className = 'veo-form-thanks';\n thanks.textContent = '✓ ¡Gracias por tu respuesta!';\n card.appendChild(thanks);\n if (note) {\n const noteEl = doc.createElement('p');\n noteEl.className = 'veo-form-preview-note';\n noteEl.textContent = note;\n card.appendChild(noteEl);\n }\n}\n\n/** Construye el DOM de un campo y devuelve su lector de valor. */\nfunction buildField(\n field: FormField,\n doc: Document,\n): { wrapper: HTMLElement; read: () => unknown } {\n const wrapper = doc.createElement('div');\n wrapper.className = 'veo-form-field';\n\n const label = doc.createElement('label');\n label.className = 'veo-form-label';\n label.textContent = field.required ? `${field.label} *` : field.label;\n wrapper.appendChild(label);\n\n switch (field.type) {\n case 'textarea': {\n const input = doc.createElement('textarea');\n input.className = 'veo-form-input';\n input.rows = 3;\n if (field.placeholder) input.placeholder = field.placeholder;\n wrapper.appendChild(input);\n return { wrapper, read: () => input.value.trim() };\n }\n case 'number': {\n const input = doc.createElement('input');\n input.type = 'number';\n input.className = 'veo-form-input';\n if (field.placeholder) input.placeholder = field.placeholder;\n wrapper.appendChild(input);\n return {\n wrapper,\n read: () => (input.value.trim() === '' ? undefined : Number(input.value)),\n };\n }\n case 'select': {\n const select = doc.createElement('select');\n select.className = 'veo-form-input';\n const blank = doc.createElement('option');\n blank.value = '';\n blank.textContent = field.placeholder || 'Elegí una opción…';\n select.appendChild(blank);\n for (const opt of field.options ?? []) {\n const option = doc.createElement('option');\n option.value = opt;\n option.textContent = opt;\n select.appendChild(option);\n }\n wrapper.appendChild(select);\n return { wrapper, read: () => select.value || undefined };\n }\n case 'radio': {\n const group = doc.createElement('div');\n group.className = 'veo-form-options';\n const name = `veo-${field.key}`;\n const inputs: HTMLInputElement[] = [];\n for (const opt of field.options ?? []) {\n const optionLabel = doc.createElement('label');\n optionLabel.className = 'veo-form-option';\n const radio = doc.createElement('input');\n radio.type = 'radio';\n radio.name = name;\n radio.value = opt;\n inputs.push(radio);\n const text = doc.createElement('span');\n text.textContent = opt;\n optionLabel.appendChild(radio);\n optionLabel.appendChild(text);\n group.appendChild(optionLabel);\n }\n wrapper.appendChild(group);\n return { wrapper, read: () => inputs.find((i) => i.checked)?.value };\n }\n case 'multiselect': {\n // Grupo de checkboxes: la respuesta es un ARRAY con las opciones marcadas.\n const group = doc.createElement('div');\n group.className = 'veo-form-options';\n const inputs: HTMLInputElement[] = [];\n for (const opt of field.options ?? []) {\n const optionLabel = doc.createElement('label');\n optionLabel.className = 'veo-form-option';\n const checkbox = doc.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.value = opt;\n inputs.push(checkbox);\n const text = doc.createElement('span');\n text.textContent = opt;\n optionLabel.appendChild(checkbox);\n optionLabel.appendChild(text);\n group.appendChild(optionLabel);\n }\n wrapper.appendChild(group);\n return {\n wrapper,\n read: () => {\n const values = inputs.filter((i) => i.checked).map((i) => i.value);\n return values.length > 0 ? values : undefined;\n },\n };\n }\n case 'checkbox': {\n const optionLabel = doc.createElement('label');\n optionLabel.className = 'veo-form-option';\n const checkbox = doc.createElement('input');\n checkbox.type = 'checkbox';\n const text = doc.createElement('span');\n text.textContent = field.placeholder || 'Sí';\n optionLabel.appendChild(checkbox);\n optionLabel.appendChild(text);\n wrapper.appendChild(optionLabel);\n // Checkbox siempre responde true/false (no “vacío”): required pide marcarlo.\n return { wrapper, read: () => (checkbox.checked ? true : field.required ? '' : false) };\n }\n case 'yesno': {\n // Radio Sí/No: dos opciones visibles, pero la respuesta es BOOLEANA\n // (true/false) — el widget \"amigable\" para props de tipo sí/no.\n const group = doc.createElement('div');\n group.className = 'veo-form-options';\n const name = `veo-${field.key}`;\n const [yesLabel, noLabel] =\n field.options?.length === 2 ? (field.options as [string, string]) : ['Sí', 'No'];\n const inputs: Array<{ input: HTMLInputElement; value: boolean }> = [];\n for (const { label: optText, value } of [\n { label: yesLabel, value: true },\n { label: noLabel, value: false },\n ]) {\n const optionLabel = doc.createElement('label');\n optionLabel.className = 'veo-form-option';\n const radio = doc.createElement('input');\n radio.type = 'radio';\n radio.name = name;\n inputs.push({ input: radio, value });\n const text = doc.createElement('span');\n text.textContent = optText;\n optionLabel.appendChild(radio);\n optionLabel.appendChild(text);\n group.appendChild(optionLabel);\n }\n wrapper.appendChild(group);\n return { wrapper, read: () => inputs.find((i) => i.input.checked)?.value };\n }\n case 'nps':\n return buildScale(wrapper, doc, 0, 10, 'veo-nps-btn');\n case 'rating':\n return buildScale(wrapper, doc, 1, 5, 'veo-rating-btn', '★');\n default: {\n const input = doc.createElement('input');\n input.type = 'text';\n input.className = 'veo-form-input';\n if (field.placeholder) input.placeholder = field.placeholder;\n wrapper.appendChild(input);\n return { wrapper, read: () => input.value.trim() };\n }\n }\n}\n\n/** Fila de botones numerados (NPS 0-10) o de estrellas (rating 1-5). */\nfunction buildScale(\n wrapper: HTMLElement,\n doc: Document,\n min: number,\n max: number,\n btnClass: string,\n symbol?: string,\n): { wrapper: HTMLElement; read: () => unknown } {\n const row = doc.createElement('div');\n row.className = 'veo-form-scale';\n let selected: number | undefined;\n const buttons: HTMLButtonElement[] = [];\n for (let n = min; n <= max; n++) {\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.className = btnClass;\n btn.textContent = symbol ?? String(n);\n btn.setAttribute('aria-label', String(n));\n btn.addEventListener('click', () => {\n selected = n;\n buttons.forEach((b, i) => {\n // Rating pinta acumulado (★★★☆☆); NPS solo el elegido.\n const active = symbol ? i + min <= n : i + min === n;\n b.classList.toggle('veo-scale-active', active);\n });\n });\n buttons.push(btn);\n row.appendChild(btn);\n }\n wrapper.appendChild(row);\n return { wrapper, read: () => selected };\n}\n","import { mountFormContent } from '../form-content';\nimport type { GuideRenderContext } from '../types';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía `form` (encuesta/NPS estilo Pendo): backdrop + tarjeta\n * centrada (mismo chrome que el modal) con los campos de `step.fields`.\n * Al enviar, las respuestas viajan vía `context.onFormSubmit` y el backend\n * las mergea como PROPIEDADES (`user_traits`) del usuario que respondió.\n *\n * El contenido (campos/envío/gracias) es compartido con `inline-form`\n * (ver `form-content.ts`); acá solo va el chrome flotante.\n */\nexport class FormRenderer extends BaseRenderer {\n render(context: GuideRenderContext): void {\n const step = context.guide.guideSteps[0];\n if (!step || (step.fields ?? []).length === 0) return;\n\n const { root } = this.createHost();\n this.applyDesign(step.style);\n const doc = root.ownerDocument ?? document;\n\n const overlay = doc.createElement('div');\n overlay.className = 'veo-modal-overlay';\n const card = doc.createElement('div');\n card.className = 'veo-modal-card';\n\n mountFormContent(card, context, doc);\n overlay.appendChild(card);\n root.appendChild(overlay);\n\n const dismiss = (): void => {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'dismissed' });\n context.onClose();\n };\n overlay.addEventListener('click', (e) => {\n if (e.target === overlay) dismiss();\n });\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') dismiss();\n };\n document.addEventListener('keydown', onKey);\n this.registerCleanup(() => document.removeEventListener('keydown', onKey));\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n}\n","import type { GuideStep } from './types';\n\n/** Dónde insertar la guía respecto al elemento ancla. Default `after`. */\nexport type InlinePosition = 'before' | 'after' | 'prepend' | 'append';\n\nexport function readInlinePosition(style: GuideStep['style']): InlinePosition {\n const p = (style as Record<string, unknown> | null | undefined)?.inlinePosition;\n return p === 'before' || p === 'prepend' || p === 'append' ? p : 'after';\n}\n\n/** Inserta el host en el flujo del DOM relativo al ancla. */\nexport function insertHost(anchor: Element, host: HTMLElement, position: InlinePosition): void {\n switch (position) {\n case 'before':\n anchor.before(host);\n break;\n case 'after':\n anchor.after(host);\n break;\n case 'prepend':\n anchor.prepend(host);\n break;\n case 'append':\n anchor.append(host);\n break;\n }\n}\n\n/**\n * Mantiene el host PEGADO al DOM. Los frameworks del host (React/Next)\n * reconcilian sus contenedores al hidratar/re-renderizar y BORRAN nodos que\n * no reconocen — la guía inline aparecía durante la carga y desaparecía al\n * montar el contenido real. Chequea cada 1s: si el host quedó desconectado,\n * re-busca el ancla y se re-inserta. Devuelve el stop() (registrarlo como\n * cleanup del renderer para que el dismiss/destroy lo corte).\n */\nexport function keepHostAttached(\n host: HTMLElement,\n selector: string,\n position: InlinePosition,\n): () => void {\n const id = window.setInterval(() => {\n if (host.isConnected) return;\n const anchor = document.querySelector(selector);\n if (anchor) insertHost(anchor, host, position);\n }, 1000);\n return () => window.clearInterval(id);\n}\n","import { createCloseButton } from '../block-builder';\nimport { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type { GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { mountCustomFrame } from './custom-frame';\n\n/**\n * Guía `inline-custom`: HTML/CSS/JS del cliente (iframe sandbox, ver\n * `custom-frame.ts`) EMBEBIDO en el flujo del DOM, junto a un elemento ancla\n * (`step.selector` + `step.style.inlinePosition`). Como el inline estándar pero\n * con código propio en vez de bloques.\n */\nexport class InlineCustomRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step || typeof step.html !== 'string' || step.html.length === 0) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n const { host, root } = this.createHost();\n host.style.display = 'block';\n const position = readInlinePosition(step.style);\n insertHost(anchor, host, position);\n // El framework del host puede borrar el nodo al re-renderizar → watchdog.\n this.registerCleanup(keepHostAttached(host, selector, position));\n const doc = root.ownerDocument ?? document;\n\n const wrapper = doc.createElement('div');\n wrapper.className = 'veo-custom-inline';\n\n const { iframe, cleanup } = mountCustomFrame(doc, step, context, { width: '100%' });\n this.registerCleanup(cleanup);\n\n wrapper.appendChild(iframe);\n wrapper.appendChild(\n createCloseButton(\n doc,\n () => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'dismissed',\n });\n context.onClose();\n },\n 'veo-custom-close',\n ),\n );\n root.appendChild(wrapper);\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n}\n","import { mountFormContent } from '../form-content';\nimport { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type { GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía `inline-form`: el MISMO formulario que `form` (campos →\n * props del usuario) pero EMBEBIDO en el flujo del DOM junto a un elemento\n * ancla, como `inline`. `step.selector` = ancla; `step.style.inlinePosition`\n * = dónde insertarse. El contenido compartido vive en `form-content.ts`.\n */\nexport class InlineFormRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step || (step.fields ?? []).length === 0) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n const { host, root } = this.createHost();\n // createHost adjuntó el host a <body>; lo movemos al flujo del DOM, junto\n // al ancla. `display:block` vence el `:host{all:initial}` (que sería inline).\n host.style.display = 'block';\n const position = readInlinePosition(step.style);\n insertHost(anchor, host, position);\n // El framework del host puede borrar el nodo al re-renderizar → watchdog.\n this.registerCleanup(keepHostAttached(host, selector, position));\n\n this.applyDesign(step.style);\n const doc = root.ownerDocument ?? document;\n\n const card = doc.createElement('div');\n card.className = 'veo-inline';\n mountFormContent(card, context, doc);\n root.appendChild(card);\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n}\n","import { buildStepContent } from '../block-builder';\nimport { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type { GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía `inline`: EMBEBIDA en el flujo del DOM, junto a un\n * elemento ancla (no flota como overlay). A diferencia de modal/banner/tooltip\n * (host fijo/absoluto sobre `body`), acá el host se mueve al flujo del\n * documento — ocupa su propio espacio en el layout.\n *\n * `step.selector` = elemento ancla; `step.style.inlinePosition`\n * (`before`|`after`|`prepend`|`append`) = dónde insertarse. Single-step.\n */\nexport class InlineRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n const { host, root } = this.createHost();\n // createHost adjuntó el host a <body>; lo movemos al flujo del DOM, junto\n // al ancla. `display:block` vence el `:host{all:initial}` (que sería inline).\n host.style.display = 'block';\n const position = readInlinePosition(step.style);\n insertHost(anchor, host, position);\n // El framework del host puede borrar el nodo al re-renderizar → watchdog.\n this.registerCleanup(keepHostAttached(host, selector, position));\n\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const card = ownerDocument.createElement('div');\n card.className = 'veo-inline';\n\n const dismiss = (action: 'dismissed' | 'cta_clicked', ctaUrl?: string) => {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n\n const content = buildStepContent(step, ownerDocument, {\n onCtaClick: (action, url) => dismiss('cta_clicked', action === 'url' ? url : undefined),\n onDismiss: () => dismiss('dismissed'),\n });\n\n card.appendChild(content);\n root.appendChild(card);\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n}\n","import { buildStepContent } from '../block-builder';\nimport type { GuideRenderContext } from '../types';\nimport { buildWalkthroughStepContent } from '../walkthrough-block-builder';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía de tipo `modal`: backdrop oscuro + tarjeta centrada.\n * Cierra al clickear el backdrop o presionar Escape.\n *\n * Single-step normal: consume `guideSteps[0]`. Si el contexto trae `nav`\n * (paso de un walkthrough heterogéneo modal→banner→tooltip), consume\n * `guideSteps[nav.stepIndex]`, muestra botones de navegación y delega\n * tracking/avance al controller (backdrop/Esc → `nav.callbacks.onSkip`).\n */\nexport class ModalRenderer extends BaseRenderer {\n render(context: GuideRenderContext): void {\n const idx = context.nav?.stepIndex ?? 0;\n const step = context.guide.guideSteps[idx];\n if (!step) return;\n\n const { root } = this.createHost();\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const overlay = ownerDocument.createElement('div');\n overlay.className = 'veo-modal-overlay';\n\n const card = ownerDocument.createElement('div');\n card.className = 'veo-modal-card';\n\n const dismiss = (action: 'dismissed' | 'cta_clicked', ctaUrl?: string) => {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: idx, action });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n // En modo navegación el cierre lo maneja el controller vía onSkip.\n const onBackdropOrEsc = (): void => {\n if (context.nav) context.nav.callbacks.onSkip();\n else dismiss('dismissed');\n };\n\n const content = context.nav\n ? buildWalkthroughStepContent(\n step,\n context.nav.stepIndex,\n context.nav.totalSteps,\n ownerDocument,\n context.nav.callbacks,\n )\n : buildStepContent(step, ownerDocument, {\n onCtaClick: (action, url) => dismiss('cta_clicked', action === 'url' ? url : undefined),\n onDismiss: () => dismiss('dismissed'),\n });\n\n card.appendChild(content);\n overlay.appendChild(card);\n root.appendChild(overlay);\n\n overlay.addEventListener('click', (e) => {\n if (e.target === overlay) onBackdropOrEsc();\n });\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onBackdropOrEsc();\n };\n document.addEventListener('keydown', onKey);\n this.registerCleanup(() => document.removeEventListener('keydown', onKey));\n\n // El `shown` de un walkthrough lo emite el controller (step 0) / step_advanced.\n if (!context.nav) {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n }\n}\n","/**\n * Posicionamiento del caret (flecha) que apunta al elemento anclado, compartido\n * por el tooltip y el walkthrough. Floating UI (middleware `arrow`) da el\n * desplazamiento a lo largo del borde; acá lo aplicamos y \"pegamos\" el caret al\n * lado del tooltip enfrentado al ancla.\n */\n\n/** Lado del tooltip donde se \"pega\" el caret, opuesto al placement resuelto. */\nconst STATIC_SIDE: Record<string, 'top' | 'bottom' | 'left' | 'right'> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\n/**\n * Ubica el caret sobre el borde del tooltip enfrentado al ancla. Floating UI\n * da el desplazamiento a lo largo del borde (`x` o `y`); el otro eje se fija a\n * `-6px` (mitad del caret) para que sobresalga.\n */\nexport function positionArrow(\n arrowEl: HTMLElement,\n placement: string,\n data: { x?: number; y?: number } | undefined,\n): void {\n const side = STATIC_SIDE[placement.split('-')[0] ?? 'bottom'] ?? 'top';\n for (const prop of ['top', 'bottom', 'left', 'right'] as const) {\n arrowEl.style.setProperty(prop, '');\n }\n if (data?.x != null) arrowEl.style.setProperty('left', `${data.x}px`);\n if (data?.y != null) arrowEl.style.setProperty('top', `${data.y}px`);\n arrowEl.style.setProperty(side, '-6px');\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { buildStepContent } from '../block-builder';\nimport type { GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { positionArrow } from './floating-arrow';\n\n/**\n * Renderiza una guía tipo `tooltip` anclada a un elemento del host.\n * Espera el ancla con MutationObserver (selector puede no existir aún\n * en SPAs), la posiciona con Floating UI y la re-posiciona en scroll\n * y resize.\n *\n * Si el ancla no aparece dentro del timeout, no muestra nada. Esto es\n * deliberado: las guías \"fantasma\" sin destino son peor UX que no\n * mostrar.\n */\nexport class TooltipRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n // Lado preferido del tooltip respecto al ancla (arriba/abajo/izq/der).\n // `flip()` igual lo reubica si no entra; default `bottom`.\n const rawSide = (step.style as Record<string, unknown> | null | undefined)?.tooltipPlacement;\n const side: 'top' | 'bottom' | 'left' | 'right' =\n rawSide === 'top' || rawSide === 'left' || rawSide === 'right' ? rawSide : 'bottom';\n\n const { root } = this.createHost();\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const tooltip = ownerDocument.createElement('div');\n tooltip.className = 'veo-tooltip';\n\n const dismiss = (action: 'dismissed' | 'cta_clicked', ctaUrl?: string) => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action,\n });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n\n const content = buildStepContent(step, ownerDocument, {\n onCtaClick: (action, url) => {\n dismiss('cta_clicked', action === 'url' ? url : undefined);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n\n tooltip.appendChild(content);\n\n // Caret que apunta al elemento anclado (se reposiciona junto al tooltip).\n const arrowEl = ownerDocument.createElement('div');\n arrowEl.className = 'veo-tooltip-arrow';\n tooltip.appendChild(arrowEl);\n\n root.appendChild(tooltip);\n\n const updatePosition = async (): Promise<void> => {\n const { x, y, placement, middlewareData } = await computePosition(anchor, tooltip, {\n placement: side,\n middleware: [offset(10), flip(), shift({ padding: 8 }), arrow({ element: arrowEl })],\n });\n tooltip.style.left = `${x}px`;\n tooltip.style.top = `${y}px`;\n positionArrow(arrowEl, placement, middlewareData.arrow);\n };\n\n await updatePosition();\n\n const reposition = (): void => {\n void updatePosition();\n };\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n this.registerCleanup(() => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n });\n\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'shown',\n });\n }\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { WALKTHROUGH_STEP_SELECTOR_TIMEOUT_MS } from '../constants';\nimport type { ResolvedGuide, WalkthroughCallbacks } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { buildWalkthroughStepContent } from '../walkthrough-block-builder';\nimport { BaseRenderer } from './base-renderer';\nimport { positionArrow } from './floating-arrow';\n\nexport interface WalkthroughRenderContext {\n guide: ResolvedGuide;\n currentStepIndex: number;\n callbacks: WalkthroughCallbacks;\n}\n\n/**\n * Renderiza UN step de un walkthrough — variante de tooltip con\n * navegación. Se destruye y re-crea por step en lugar de actualizar el\n * DOM en sitio: como cada step puede anclarse a un selector distinto,\n * recomputar todo es más simple y barato que tracking diffs.\n *\n * `render` retorna `boolean` (a diferencia de los demás renderers) para\n * señalar al controller si el ancla apareció a tiempo. Si devuelve\n * `false`, el controller cancela el walkthrough limpiamente.\n */\nexport class WalkthroughRenderer extends BaseRenderer<WalkthroughRenderContext, boolean> {\n async render(context: WalkthroughRenderContext): Promise<boolean> {\n const step = context.guide.guideSteps[context.currentStepIndex];\n if (!step) return false;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return false;\n\n const anchor = await waitForElement(selector, WALKTHROUGH_STEP_SELECTOR_TIMEOUT_MS);\n if (!anchor) return false;\n\n const rawSide = (step.style as Record<string, unknown> | null | undefined)?.tooltipPlacement;\n const side: 'top' | 'bottom' | 'left' | 'right' =\n rawSide === 'top' || rawSide === 'left' || rawSide === 'right' ? rawSide : 'bottom';\n\n const { root } = this.createHost();\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const tooltip = ownerDocument.createElement('div');\n tooltip.className = 'veo-walkthrough';\n\n const content = buildWalkthroughStepContent(\n step,\n context.currentStepIndex,\n context.guide.guideSteps.length,\n ownerDocument,\n context.callbacks,\n );\n tooltip.appendChild(content);\n\n // Caret que apunta al elemento anclado (se reposiciona junto al tooltip).\n const arrowEl = ownerDocument.createElement('div');\n arrowEl.className = 'veo-walkthrough-arrow';\n tooltip.appendChild(arrowEl);\n\n root.appendChild(tooltip);\n\n const updatePosition = async (): Promise<void> => {\n const { x, y, placement, middlewareData } = await computePosition(anchor, tooltip, {\n placement: side,\n middleware: [offset(10), flip(), shift({ padding: 8 }), arrow({ element: arrowEl })],\n });\n tooltip.style.left = `${x}px`;\n tooltip.style.top = `${y}px`;\n positionArrow(arrowEl, placement, middlewareData.arrow);\n };\n\n await updatePosition();\n\n const reposition = (): void => {\n void updatePosition();\n };\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n this.registerCleanup(() => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n });\n\n return true;\n }\n}\n","import { WALKTHROUGH_ABANDONMENT_TIMEOUT_MS, WALKTHROUGH_STATE_KEY_PREFIX } from './constants';\nimport type { WalkthroughState } from './types';\n\n/**\n * Estado persistente del walkthrough activo. Solo permite UNO por\n * workspace (namespace de apiKey). Vive en `localStorage` para sobrevivir\n * recargas de página: el step actual + el guideId alcanzan para resumir\n * desde donde quedó el usuario.\n *\n * Si pasan más de `WALKTHROUGH_ABANDONMENT_TIMEOUT_MS` sin progreso, se\n * considera abandonado: la próxima llamada a `current()` lo limpia\n * silenciosamente. NO se reporta `dismissed` al backend en ese caso —\n * abandonarse no es un acto del usuario.\n */\nexport class WalkthroughStateManager {\n private readonly storageKey: string;\n private state: WalkthroughState | null = null;\n\n constructor(namespace: string) {\n this.storageKey = `${WALKTHROUGH_STATE_KEY_PREFIX}${namespace}`;\n this.state = this.load();\n if (this.state && this.isAbandoned(this.state)) {\n this.clear();\n }\n }\n\n /**\n * Estado del walkthrough activo. Devuelve `null` si no hay ninguno o si\n * el último progreso fue hace más del timeout (en ese caso también\n * limpia el storage como side-effect).\n */\n current(): WalkthroughState | null {\n if (!this.state) return null;\n if (this.isAbandoned(this.state)) {\n this.clear();\n return null;\n }\n return this.state;\n }\n\n /** Atajo legible para el controller. */\n hasActive(): boolean {\n return this.current() !== null;\n }\n\n /**\n * Inicia un nuevo walkthrough en step 0. Sobreescribe cualquier estado\n * previo — los callers (controller) son responsables de verificar\n * `hasActive()` antes si necesitan exclusividad.\n */\n start(guideId: string, totalSteps: number): WalkthroughState {\n const now = Date.now();\n this.state = {\n guideId,\n totalSteps,\n currentStepIndex: 0,\n startedAt: now,\n lastProgressAt: now,\n };\n this.persist();\n return this.state;\n }\n\n /**\n * Avanza al siguiente step. Si el step resultante excede `totalSteps`,\n * devuelve `null` y NO toca el estado — el controller debe interpretar\n * eso como \"ya estamos en el último, no hay próximo\" y disparar\n * `complete` vía el handler del botón \"Finalizar\".\n */\n advance(): WalkthroughState | null {\n if (!this.state) return null;\n\n const next = this.state.currentStepIndex + 1;\n if (next >= this.state.totalSteps) return null;\n\n this.state = {\n ...this.state,\n currentStepIndex: next,\n lastProgressAt: Date.now(),\n };\n this.persist();\n return this.state;\n }\n\n /**\n * Retrocede al step anterior. En step 0 no hace nada y devuelve el\n * estado tal cual (el botón \"Atrás\" no debería estar visible en el\n * primer step, pero por defensa el manager también lo guard-ea).\n */\n back(): WalkthroughState | null {\n if (!this.state) return null;\n if (this.state.currentStepIndex === 0) return this.state;\n\n this.state = {\n ...this.state,\n currentStepIndex: this.state.currentStepIndex - 1,\n lastProgressAt: Date.now(),\n };\n this.persist();\n return this.state;\n }\n\n /** Limpia el estado activo (skip, complete, abandono, guía borrada). */\n clear(): void {\n this.state = null;\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.removeItem(this.storageKey);\n } catch {\n // Storage bloqueado — no rompemos la app.\n }\n }\n\n private isAbandoned(state: WalkthroughState): boolean {\n return Date.now() - state.lastProgressAt > WALKTHROUGH_ABANDONMENT_TIMEOUT_MS;\n }\n\n private load(): WalkthroughState | null {\n if (typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== 'object') return null;\n const candidate = parsed as Partial<WalkthroughState>;\n if (\n typeof candidate.guideId !== 'string' ||\n typeof candidate.totalSteps !== 'number' ||\n typeof candidate.currentStepIndex !== 'number' ||\n typeof candidate.startedAt !== 'number' ||\n typeof candidate.lastProgressAt !== 'number'\n ) {\n return null;\n }\n return candidate as WalkthroughState;\n } catch {\n return null;\n }\n }\n\n private persist(): void {\n if (typeof localStorage === 'undefined' || !this.state) return;\n try {\n localStorage.setItem(this.storageKey, JSON.stringify(this.state));\n } catch {\n // Quota exceeded — silently fail. El walkthrough en memoria sigue.\n }\n }\n}\n","import type { VeoClient } from '../../types';\nimport {\n DEFAULT_TRACKER_BATCH_SIZE,\n DEFAULT_TRACKER_FLUSH_INTERVAL_MS,\n DEFAULT_TRACKER_MAX_RETRIES,\n} from './constants';\nimport { GuideFrequencyCache, namespaceFromApiKey } from './guide-frequency-cache';\nimport { GuideResolverClient } from './guide-resolver-client';\nimport { GuideTrackerClient } from './guide-tracker-client';\nimport { GuideTrackerQueue } from './guide-tracker-queue';\nimport { BannerRenderer } from './renderers/banner-renderer';\nimport type { BaseRenderer } from './renderers/base-renderer';\nimport { CustomRenderer } from './renderers/custom-renderer';\nimport { FormRenderer } from './renderers/form-renderer';\nimport { InlineCustomRenderer } from './renderers/inline-custom-renderer';\nimport { InlineFormRenderer } from './renderers/inline-form-renderer';\nimport { InlineRenderer } from './renderers/inline-renderer';\nimport { ModalRenderer } from './renderers/modal-renderer';\nimport { TooltipRenderer } from './renderers/tooltip-renderer';\nimport { WalkthroughRenderer } from './renderers/walkthrough-renderer';\nimport type {\n FrequencyStatus,\n GuideInteractionAction,\n GuideInteractionEvent,\n GuideType,\n ResolvedGuide,\n WalkthroughCallbacks,\n} from './types';\nimport { WalkthroughStateManager } from './walkthrough-state';\n\nexport interface GuidesControllerConfig {\n apiUrl: string;\n apiKey: string;\n debug?: boolean;\n /** Override del resolver (tests). */\n resolver?: GuideResolverClient;\n /** Override del tracker queue (tests). */\n trackerQueue?: GuideTrackerQueue;\n /** Override del cache (tests). */\n frequencyCache?: GuideFrequencyCache;\n /** Override del walkthrough state manager (tests). */\n walkthroughState?: WalkthroughStateManager;\n}\n\n/** Mapeo `action → cache status`. Solo acciones terminales mutan el cache. */\nconst STATUS_BY_ACTION: Record<GuideInteractionAction, FrequencyStatus | null> = {\n shown: 'shown',\n dismissed: 'dismissed',\n cta_clicked: null,\n step_advanced: null,\n step_back: null,\n completed: 'completed',\n};\n\n/**\n * Orquesta el ciclo de vida de las guías:\n *\n * 1. `pageview`/`identify` → `checkGuides(url, sessionId)`.\n * 2. Si hay un walkthrough activo (estado persistido en localStorage),\n * tiene prioridad: se intenta resumir en la página actual antes de\n * consultar nuevas guías. Si el selector del step actual aparece,\n * se pinta; si no, se cancela el walkthrough limpiamente.\n * 3. Si no hay walkthrough activo, se consulta `/v1/guides/resolve` y\n * se procesa cada guía:\n * - `walkthrough` con varios steps → arranca un walkthrough\n * (uno a la vez; el resto se ignora si ya hay uno).\n * - single-step → modal/banner/tooltip como antes.\n * 4. Cada interaction actualiza el cache local Y se encola para\n * `POST /v1/guides/:id/interactions`.\n *\n * Dedupe: `dispatched` guarda `${guideId}:${action}` ya encolados en la\n * sesión actual del SDK. Las acciones por-step de walkthroughs no\n * usan dedupe — cada `step_advanced` puede repetirse y representa una\n * navegación distinta.\n */\nexport class GuidesController {\n private readonly resolver: GuideResolverClient;\n private readonly trackerQueue: GuideTrackerQueue;\n private readonly frequencyCache: GuideFrequencyCache;\n private readonly walkthroughState: WalkthroughStateManager;\n private readonly debug: boolean;\n /** Para `POST /v1/guides/:id/form-response` (respuestas de guías form). */\n private readonly apiUrl: string;\n private readonly apiKey: string;\n private readonly activeRenderers = new Set<BaseRenderer>();\n /**\n * Guías single-step actualmente en pantalla, por `guideId`. Evita repintar/\n * duplicar la misma guía en cada pageview de una SPA (p.ej. una guía inline\n * anclada a un elemento persistente). Se libera al cerrarse la guía.\n */\n private readonly activeByGuideId = new Map<string, BaseRenderer>();\n private readonly dispatched = new Set<string>();\n /**\n * Renderer del paso de walkthrough activo. Puede ser el `WalkthroughRenderer`\n * (tooltip anclado) o un Modal/Banner con navegación (walkthrough heterogéneo);\n * tipamos por `destroy()`, lo único que el controller necesita.\n */\n private activeWalkthroughRenderer: { destroy(): void } | null = null;\n private activeWalkthroughGuide: ResolvedGuide | null = null;\n\n constructor(\n private readonly client: VeoClient,\n config: GuidesControllerConfig,\n ) {\n this.debug = config.debug === true;\n this.apiUrl = config.apiUrl;\n this.apiKey = config.apiKey;\n this.resolver =\n config.resolver ?? new GuideResolverClient(config.apiUrl, config.apiKey, this.debug);\n\n if (config.trackerQueue) {\n this.trackerQueue = config.trackerQueue;\n } else {\n const httpClient = new GuideTrackerClient(config.apiUrl, config.apiKey);\n this.trackerQueue = new GuideTrackerQueue({\n client: httpClient,\n flushIntervalMs: DEFAULT_TRACKER_FLUSH_INTERVAL_MS,\n batchSize: DEFAULT_TRACKER_BATCH_SIZE,\n maxRetries: DEFAULT_TRACKER_MAX_RETRIES,\n onError: (err, item) => {\n if (this.debug) {\n console.warn(\n `[veo] dropped guide interaction after retries: guideId=${item.guideId} action=${item.payload.action}`,\n err,\n );\n }\n },\n });\n }\n\n const namespace = namespaceFromApiKey(config.apiKey);\n this.frequencyCache = config.frequencyCache ?? new GuideFrequencyCache(namespace);\n this.walkthroughState = config.walkthroughState ?? new WalkthroughStateManager(namespace);\n }\n\n /** Cuántas interactions hay pendientes de envío. Útil para debug en demo. */\n get pendingInteractions(): number {\n return this.trackerQueue.size;\n }\n\n /** Limpia el cache local (botón \"reset\" del demo, tests). */\n clearFrequencyCache(): void {\n this.frequencyCache.clear();\n }\n\n /** Limpia el walkthrough activo (debug del demo). */\n clearWalkthroughState(): void {\n this.tearDownWalkthrough();\n }\n\n /** Punto de entrada principal. Llamado en cada pageview/identify. */\n async checkGuides(pageUrl: string, sessionId: string): Promise<void> {\n const endUserId = this.client.getEndUserId();\n if (!endUserId) {\n if (this.debug) console.log('[veo] guides: skipped, no endUserId yet');\n return;\n }\n\n if (await this.tryResumeWalkthrough(endUserId, sessionId, pageUrl)) {\n return;\n }\n\n let guides: ResolvedGuide[];\n try {\n guides = await this.resolver.resolve(endUserId, pageUrl);\n } catch (err) {\n if (this.debug) console.error('[veo] guides resolver threw:', err);\n return;\n }\n if (this.debug) console.log(`[veo] guides: ${guides.length} eligible at ${pageUrl}`);\n\n for (const guide of guides) {\n if (this.frequencyCache.shouldFilter(guide.guideId, guide.displayFrequency)) {\n if (this.debug) console.log(`[veo] guides: filtered locally guideId=${guide.guideId}`);\n continue;\n }\n\n // Ya está en pantalla → no repintar/duplicar (clave en SPAs: cada\n // navegación dispara un pageview, pero la guía sigue montada).\n if (this.activeByGuideId.has(guide.guideId)) {\n if (this.debug) console.log(`[veo] guides: already shown guideId=${guide.guideId}`);\n continue;\n }\n\n if (guide.guideType === 'walkthrough' && guide.guideSteps.length > 1) {\n if (this.walkthroughState.hasActive()) {\n if (this.debug)\n console.log(`[veo] guides: walkthrough ${guide.guideId} skipped (another active)`);\n continue;\n }\n await this.startWalkthrough(guide, endUserId, sessionId, pageUrl);\n // No retornamos: las guías single-step pueden seguir mostrándose\n // en paralelo. Solo bloqueamos OTROS walkthroughs vía hasActive().\n continue;\n }\n\n this.runSingleStepRender(guide, sessionId, pageUrl);\n }\n }\n\n /** Cierra todas las guías activas, limpia cache de dispatch y para timers. */\n destroy(): void {\n for (const renderer of this.activeRenderers) {\n try {\n renderer.destroy();\n } catch (err) {\n if (this.debug) console.error('[veo] renderer destroy failed:', err);\n }\n }\n this.activeRenderers.clear();\n this.activeByGuideId.clear();\n if (this.activeWalkthroughRenderer) {\n try {\n this.activeWalkthroughRenderer.destroy();\n } catch {\n // swallow — el cleanup no debe propagar\n }\n this.activeWalkthroughRenderer = null;\n this.activeWalkthroughGuide = null;\n }\n this.dispatched.clear();\n this.trackerQueue.destroy();\n }\n\n private runSingleStepRender(guide: ResolvedGuide, sessionId: string, pageUrl: string): void {\n const renderer = this.createSingleStepRenderer(guide.guideType);\n if (!renderer) return;\n\n // Reservar el slot YA (antes del delay) para que pageviews rápidos no\n // disparen dos renders de la misma guía.\n this.activeByGuideId.set(guide.guideId, renderer);\n\n const delayMs = guide.activationRules.delayMs ?? 0;\n window.setTimeout(\n () => this.mountSingleStepRenderer(guide, renderer, sessionId, pageUrl),\n delayMs,\n );\n }\n\n private mountSingleStepRenderer(\n guide: ResolvedGuide,\n renderer: BaseRenderer,\n sessionId: string,\n pageUrl: string,\n ): void {\n this.activeRenderers.add(renderer);\n this.activeByGuideId.set(guide.guideId, renderer);\n\n const onClose = (): void => {\n renderer.destroy();\n this.activeRenderers.delete(renderer);\n if (this.activeByGuideId.get(guide.guideId) === renderer) {\n this.activeByGuideId.delete(guide.guideId);\n }\n };\n\n const onInteraction = (event: GuideInteractionEvent): void => {\n this.handleInteraction(guide, sessionId, pageUrl, event);\n };\n\n const onTrack = (eventName: string, properties?: Record<string, unknown>): void => {\n this.client.track(eventName, properties);\n };\n\n const onFormSubmit = (answers: Record<string, unknown>): Promise<boolean> =>\n this.submitFormResponse(guide.guideId, answers);\n\n try {\n void renderer.render({ guide, onInteraction, onClose, onTrack, onFormSubmit });\n } catch (err) {\n if (this.debug) console.error('[veo] renderer.render threw:', err);\n this.activeRenderers.delete(renderer);\n if (this.activeByGuideId.get(guide.guideId) === renderer) {\n this.activeByGuideId.delete(guide.guideId);\n }\n }\n }\n\n /**\n * Si hay un walkthrough persistido, intenta pintar el step actual en\n * la página actual. Retorna `true` si lo intentó (sea éxito o cancel),\n * `false` si no había walkthrough activo.\n *\n * Cancela limpiamente (sin enviar `dismissed` falso) cuando:\n * - La guía fue eliminada en el backend (404 → `fetchById` devuelve null).\n * - La guía cambió de tipo y ya no es walkthrough.\n * - El selector del step actual no aparece dentro del timeout.\n */\n private async tryResumeWalkthrough(\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n ): Promise<boolean> {\n const state = this.walkthroughState.current();\n if (!state) return false;\n\n const guide = await this.resolver.fetchById(state.guideId);\n if (!guide || guide.guideType !== 'walkthrough') {\n if (this.debug)\n console.log(`[veo] guides: walkthrough ${state.guideId} no longer available, cleaning up`);\n this.tearDownWalkthrough();\n return true;\n }\n\n // El cache local podría tener una versión más vieja del total; usamos\n // siempre el del backend.\n const stepIndex = Math.min(state.currentStepIndex, guide.guideSteps.length - 1);\n await this.renderWalkthroughStep(guide, stepIndex, endUserId, sessionId, pageUrl);\n return true;\n }\n\n private async startWalkthrough(\n guide: ResolvedGuide,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n ): Promise<void> {\n this.walkthroughState.start(guide.guideId, guide.guideSteps.length);\n const rendered = await this.renderWalkthroughStep(guide, 0, endUserId, sessionId, pageUrl);\n if (!rendered) return; // teardown ya corrió, no reportamos shown.\n // Reportamos `shown` SOLO al arrancar (step 0). Steps siguientes\n // se cubren con `step_advanced`/`step_back`. Marcamos cache local\n // también para que `displayFrequency='once'` filtre en la próxima\n // pageview aunque la interaction aún esté en la queue.\n this.enqueueInteractionOnce(guide.guideId, endUserId, sessionId, pageUrl, 'shown', 0);\n this.frequencyCache.record(guide.guideId, 'shown');\n }\n\n /**\n * Pinta el step indicado. Reusa la guía (no fetcha): el caller debe\n * traerla. Retorna `true` si el render fue exitoso. En caso contrario\n * ya disparó el teardown — el caller no debe seguir reportando.\n */\n private async renderWalkthroughStep(\n guide: ResolvedGuide,\n stepIndex: number,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n ): Promise<boolean> {\n if (this.activeWalkthroughRenderer) {\n this.activeWalkthroughRenderer.destroy();\n this.activeWalkthroughRenderer = null;\n }\n\n this.activeWalkthroughGuide = guide;\n\n const callbacks: WalkthroughCallbacks = {\n onNext: () => this.handleWalkthroughNext(endUserId, sessionId, pageUrl),\n onBack: () => this.handleWalkthroughBack(endUserId, sessionId, pageUrl),\n onSkip: () => this.handleWalkthroughSkip(endUserId, sessionId, pageUrl),\n onComplete: () => this.handleWalkthroughComplete(endUserId, sessionId, pageUrl),\n };\n\n // Walkthrough HETEROGÉNEO: un paso puede pedir renderizarse como modal o\n // banner (via `step.style.render`). Esos renderers siempre montan (no\n // dependen de un ancla), así que reportamos éxito directo. El resto\n // (tooltip/default) usa el WalkthroughRenderer anclado.\n const step = guide.guideSteps[stepIndex];\n const render = readStepRender(step);\n if (render === 'modal' || render === 'banner') {\n const renderer = render === 'modal' ? new ModalRenderer() : new BannerRenderer();\n try {\n renderer.render({\n guide,\n onInteraction: () => {},\n onClose: () => {},\n nav: { stepIndex, totalSteps: guide.guideSteps.length, callbacks },\n });\n } catch (err) {\n if (this.debug) console.error('[veo] sequence renderer threw:', err);\n this.tearDownWalkthrough();\n return false;\n }\n this.activeWalkthroughRenderer = renderer;\n return true;\n }\n\n const renderer = new WalkthroughRenderer();\n let success = false;\n try {\n success = await renderer.render({ guide, currentStepIndex: stepIndex, callbacks });\n } catch (err) {\n if (this.debug) console.error('[veo] walkthrough renderer threw:', err);\n }\n\n if (!success) {\n if (this.debug)\n console.warn(\n `[veo] walkthrough ${guide.guideId} step ${stepIndex} could not render, cancelling`,\n );\n this.tearDownWalkthrough();\n return false;\n }\n\n this.activeWalkthroughRenderer = renderer;\n return true;\n }\n\n private handleWalkthroughNext(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n if (!guide) return;\n\n const newState = this.walkthroughState.advance();\n if (!newState) {\n // Ya estábamos en el último step. No debería pasar (el botón\n // dispara onComplete en ese caso), pero por defensa lo manejamos.\n this.handleWalkthroughComplete(endUserId, sessionId, pageUrl);\n return;\n }\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'step_advanced',\n newState.currentStepIndex,\n );\n void this.renderWalkthroughStep(\n guide,\n newState.currentStepIndex,\n endUserId,\n sessionId,\n pageUrl,\n );\n }\n\n private handleWalkthroughBack(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n if (!guide) return;\n\n const state = this.walkthroughState.current();\n if (!state || state.currentStepIndex === 0) return;\n\n const newState = this.walkthroughState.back();\n if (!newState) return;\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'step_back',\n newState.currentStepIndex,\n );\n void this.renderWalkthroughStep(\n guide,\n newState.currentStepIndex,\n endUserId,\n sessionId,\n pageUrl,\n );\n }\n\n private handleWalkthroughSkip(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n const state = this.walkthroughState.current();\n if (!guide || !state) return;\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'dismissed',\n state.currentStepIndex,\n );\n this.frequencyCache.record(guide.guideId, 'dismissed');\n this.tearDownWalkthrough();\n }\n\n private handleWalkthroughComplete(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n const state = this.walkthroughState.current();\n if (!guide || !state) return;\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'completed',\n state.currentStepIndex,\n );\n this.frequencyCache.record(guide.guideId, 'completed');\n this.tearDownWalkthrough();\n }\n\n private tearDownWalkthrough(): void {\n if (this.activeWalkthroughRenderer) {\n try {\n this.activeWalkthroughRenderer.destroy();\n } catch {\n // swallow\n }\n }\n this.activeWalkthroughRenderer = null;\n this.activeWalkthroughGuide = null;\n this.walkthroughState.clear();\n }\n\n /**\n * Tras cada interaction single-step:\n * 1. dedupe (no enviar 2× la misma `(guideId, action)` por sesión)\n * 2. actualizar el cache local si corresponde\n * 3. encolar el POST\n *\n * El endUserId se lee del client EN ESTE MOMENTO (no en el render),\n * por si el usuario se identificó después de que la guía apareció.\n */\n private handleInteraction(\n guide: ResolvedGuide,\n sessionId: string,\n pageUrl: string,\n event: GuideInteractionEvent,\n ): void {\n const dedupKey = `${guide.guideId}:${event.action}`;\n if (this.dispatched.has(dedupKey)) {\n if (this.debug) console.log(`[veo] guides: dedup hit ${dedupKey}`);\n return;\n }\n this.dispatched.add(dedupKey);\n\n const cacheStatus = STATUS_BY_ACTION[event.action];\n if (cacheStatus) this.frequencyCache.record(guide.guideId, cacheStatus);\n\n const endUserId = this.client.getEndUserId();\n if (!endUserId) {\n if (this.debug)\n console.warn('[veo] guides: interaction without endUserId — skipping enqueue');\n return;\n }\n\n this.trackerQueue.enqueue({\n guideId: guide.guideId,\n payload: {\n endUserId,\n sessionId,\n action: event.action,\n stepIndex: event.stepIndex,\n pageUrl,\n pagePath: extractPath(pageUrl),\n },\n });\n }\n\n /**\n * Encola una interacción de walkthrough SIN pasar por el dedup set.\n * Acciones como `step_advanced` se repiten naturalmente (cada next es\n * una navegación distinta) y deduplicarlas perdería datos.\n */\n private enqueueInteraction(\n guideId: string,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n action: GuideInteractionAction,\n stepIndex: number,\n ): void {\n this.trackerQueue.enqueue({\n guideId,\n payload: {\n endUserId,\n sessionId,\n action,\n stepIndex,\n pageUrl,\n pagePath: extractPath(pageUrl),\n },\n });\n }\n\n /**\n * Encola con dedup por sesión del SDK. Para `shown` del primer step:\n * no queremos re-emitirlo si el usuario navega entre dos páginas que\n * matchean el mismo step.\n */\n private enqueueInteractionOnce(\n guideId: string,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n action: GuideInteractionAction,\n stepIndex: number,\n ): void {\n const dedupKey = `${guideId}:${action}:${stepIndex}`;\n if (this.dispatched.has(dedupKey)) return;\n this.dispatched.add(dedupKey);\n this.enqueueInteraction(guideId, endUserId, sessionId, pageUrl, action, stepIndex);\n }\n\n private createSingleStepRenderer(type: GuideType): BaseRenderer | null {\n switch (type) {\n case 'modal':\n return new ModalRenderer();\n case 'banner':\n return new BannerRenderer();\n case 'tooltip':\n return new TooltipRenderer();\n case 'custom':\n return new CustomRenderer();\n case 'inline':\n return new InlineRenderer();\n case 'inline-custom':\n return new InlineCustomRenderer();\n case 'form':\n return new FormRenderer();\n case 'inline-form':\n return new InlineFormRenderer();\n case 'walkthrough':\n return null;\n }\n }\n\n /**\n * Envía las respuestas de una guía `form` al backend, que las mergea como\n * propiedades del usuario. Usa el endUserId actual (o el anónimo si aún no\n * hubo identify — el backend pre-crea la fila igual que identify).\n */\n private async submitFormResponse(\n guideId: string,\n answers: Record<string, unknown>,\n ): Promise<boolean> {\n const endUserId = this.client.getEndUserId() ?? this.client.getAnonymousId();\n try {\n const res = await fetch(`${this.apiUrl}/v1/guides/${guideId}/form-response`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Api-Key': this.apiKey },\n body: JSON.stringify({ endUserId, answers }),\n });\n if (!res.ok && this.debug) {\n console.warn('[veo] form-response respondió', res.status);\n }\n return res.ok;\n } catch (err) {\n if (this.debug) console.warn('[veo] form-response falló:', err);\n return false;\n }\n }\n}\n\nfunction extractPath(url: string): string {\n try {\n return new URL(url).pathname;\n } catch {\n return '/';\n }\n}\n\n/**\n * Cómo se presenta un paso dentro de un walkthrough. `style.render` ∈\n * `modal`/`banner` usa esos renderers (con navegación); cualquier otro valor\n * (incluido ausente o `tooltip`) usa el WalkthroughRenderer anclado.\n */\nfunction readStepRender(step: ResolvedGuide['guideSteps'][number] | undefined): string {\n const r = (step?.style as Record<string, unknown> | null | undefined)?.render;\n return typeof r === 'string' ? r : 'walkthrough';\n}\n","/**\n * Modo preview de guías. Pinta una guía con los MISMOS renderers que el\n * runtime real, pero SIN resolver, cache de frecuencia, estado de\n * walkthrough ni tracking de interacciones. Pensado para el builder\n * no-code del dashboard: ver cómo queda una guía antes de publicarla.\n *\n * No requiere un `VeoClient` ni apiKey — es una función pura sobre el DOM.\n * Solo puede haber UNA preview activa a la vez; abrir otra cierra la\n * anterior (igual que el dashboard al cambiar de guía o de step).\n *\n * Diferencias de comportamiento vs. runtime real (deliberadas):\n * - Las interacciones NO se reportan al backend.\n * - `displayFrequency`/`activationRules` (url/trigger/delay) se ignoran:\n * la preview siempre pinta de inmediato. Solo se respeta el `selector`\n * del step (o el `activationRules.selector` como fallback) para anclar\n * tooltips/walkthroughs.\n * - CTA con `ctaAction: 'url'` sigue abriendo la URL en una pestaña nueva\n * (igual que en producción) para poder probar el enlace.\n */\nimport { hasDocument } from '../../utils/safe-env';\nimport { BannerRenderer } from './renderers/banner-renderer';\nimport type { BaseRenderer } from './renderers/base-renderer';\nimport { CustomRenderer } from './renderers/custom-renderer';\nimport { FormRenderer } from './renderers/form-renderer';\nimport { InlineCustomRenderer } from './renderers/inline-custom-renderer';\nimport { InlineFormRenderer } from './renderers/inline-form-renderer';\nimport { InlineRenderer } from './renderers/inline-renderer';\nimport { ModalRenderer } from './renderers/modal-renderer';\nimport { TooltipRenderer } from './renderers/tooltip-renderer';\nimport { WalkthroughRenderer } from './renderers/walkthrough-renderer';\nimport type {\n ActivationRules,\n GuideInteractionEvent,\n GuideStep,\n GuideType,\n ResolvedGuide,\n WalkthroughCallbacks,\n} from './types';\n\n/** Entrada mínima para previsualizar una guía. */\nexport interface PreviewGuideInput {\n guideType: GuideType;\n guideSteps: GuideStep[];\n /**\n * Opcional. Solo se usa `activationRules.selector` como fallback del\n * ancla para tooltip/walkthrough cuando el step no trae su propio\n * `selector`. El resto de reglas (url/trigger/delay) se ignoran.\n */\n activationRules?: Partial<ActivationRules>;\n /** Nombre mostrado (p.ej. en el `title` del iframe de guías `custom`). */\n guideName?: string;\n /**\n * Solo walkthrough: paso inicial a mostrar (default 0). Lo usa el editor del\n * dashboard para que la preview salte al paso que se está editando.\n */\n startStepIndex?: number;\n /**\n * Solo guías form: envío REAL de respuestas. Sin esto, el submit en preview\n * es un no-op (no escribe props). Lo usa el modo preview-por-link, que sí\n * guarda en el usuario que responde.\n */\n formSubmit?: (answers: Record<string, unknown>) => Promise<boolean>;\n /** Nota bajo el \"¡Gracias!\" cuando hay `formSubmit` propio. */\n formSubmitNote?: string;\n}\n\n/** Resultado del primer render de una preview. */\nexport interface PreviewResult {\n /**\n * `false` cuando la guía no pudo pintarse — típicamente un\n * tooltip/walkthrough cuyo `selector` no existe en la página de preview.\n */\n rendered: boolean;\n}\n\n/** Handle de una preview activa. */\nexport interface PreviewHandle {\n /** Cierra y limpia la preview. Idempotente. */\n close(): void;\n /** Resuelve cuando el primer render terminó. */\n ready: Promise<PreviewResult>;\n}\n\nconst PREVIEW_GUIDE_ID = '__veo_preview__';\n\n/**\n * Orquesta una única preview activa. A diferencia del `GuidesController`,\n * no toca queue, cache ni estado persistido: instancia el renderer y lo\n * monta directo, y maneja localmente la navegación de walkthroughs.\n */\nclass GuidePreviewController {\n private singleStep: BaseRenderer | null = null;\n /** Renderer del paso de walkthrough activo (walkthrough tooltip o modal/banner). */\n private walkthrough: { destroy(): void } | null = null;\n private walkthroughGuide: ResolvedGuide | null = null;\n private walkthroughIndex = 0;\n /** Input de la preview ACTIVA (para formSubmit/nota de forms). */\n private input: PreviewGuideInput | null = null;\n\n preview(input: PreviewGuideInput): PreviewHandle {\n this.close(); // solo una preview a la vez\n this.input = input;\n\n const guide = normalize(input);\n const start = typeof input.startStepIndex === 'number' ? input.startStepIndex : 0;\n const ready =\n guide.guideType === 'walkthrough'\n ? this.startWalkthrough(guide, start)\n : this.renderSingleStep(guide);\n\n return { close: () => this.close(), ready };\n }\n\n close(): void {\n if (this.singleStep) {\n safeDestroy(this.singleStep);\n this.singleStep = null;\n }\n if (this.walkthrough) {\n safeDestroy(this.walkthrough);\n this.walkthrough = null;\n }\n this.walkthroughGuide = null;\n this.walkthroughIndex = 0;\n this.input = null;\n }\n\n private async renderSingleStep(guide: ResolvedGuide): Promise<PreviewResult> {\n const renderer = createSingleStepRenderer(guide.guideType);\n if (!renderer) return { rendered: false };\n this.singleStep = renderer;\n\n // Los renderers single-step solo emiten `shown` tras montar con éxito\n // (tooltip/custom esperan a su ancla). Lo usamos como señal de render.\n let shown = false;\n try {\n await renderer.render({\n guide,\n onInteraction: (event: GuideInteractionEvent) => {\n if (event.action === 'shown') shown = true;\n },\n onClose: () => this.close(),\n onTrack: () => {},\n // Preview de forms: por defecto simula el envío SIN escribir props;\n // el caller puede pasar `formSubmit` real (link de preview).\n onFormSubmit: this.input?.formSubmit ?? (() => Promise.resolve(true)),\n isPreview: true,\n ...(this.input?.formSubmit && this.input.formSubmitNote !== undefined\n ? { previewNote: this.input.formSubmitNote }\n : {}),\n });\n } catch {\n this.close();\n return { rendered: false };\n }\n\n // El usuario pudo haber cerrado/reemplazado la preview mientras el render\n // esperaba el ancla (los renderers async como inline/inline-custom hacen\n // `await waitForElement` ANTES de insertar su host). En ese caso este\n // renderer quedó HUÉRFANO: su host ya entró al DOM pero `singleStep` apunta\n // a otro, así que el `close()` que lo reemplazó no lo borró. Lo destruimos\n // acá para no apilar copias fantasma (causa de la guía duplicada).\n if (this.singleStep !== renderer) {\n safeDestroy(renderer);\n return { rendered: false };\n }\n\n return { rendered: shown };\n }\n\n private async startWalkthrough(guide: ResolvedGuide, startIndex = 0): Promise<PreviewResult> {\n if (guide.guideSteps.length === 0) return { rendered: false };\n this.walkthroughGuide = guide;\n const idx = Math.min(Math.max(0, Math.floor(startIndex)), guide.guideSteps.length - 1);\n this.walkthroughIndex = idx;\n const rendered = await this.renderWalkthroughStep(idx);\n return { rendered };\n }\n\n private async renderWalkthroughStep(index: number): Promise<boolean> {\n const guide = this.walkthroughGuide;\n if (!guide) return false;\n\n if (this.walkthrough) {\n safeDestroy(this.walkthrough);\n this.walkthrough = null;\n }\n\n const callbacks: WalkthroughCallbacks = {\n onNext: () => {\n const next = this.walkthroughIndex + 1;\n if (next >= guide.guideSteps.length) {\n this.close();\n return;\n }\n this.walkthroughIndex = next;\n void this.renderWalkthroughStep(next);\n },\n onBack: () => {\n const prev = this.walkthroughIndex - 1;\n if (prev < 0) return;\n this.walkthroughIndex = prev;\n void this.renderWalkthroughStep(prev);\n },\n onSkip: () => this.close(),\n onComplete: () => this.close(),\n };\n\n // Walkthrough heterogéneo: el paso puede pedir modal/banner (con navegación).\n const step = guide.guideSteps[index];\n const render = (step?.style as Record<string, unknown> | null | undefined)?.render;\n if (render === 'modal' || render === 'banner') {\n const renderer = render === 'modal' ? new ModalRenderer() : new BannerRenderer();\n try {\n renderer.render({\n guide,\n onInteraction: () => {},\n onClose: () => this.close(),\n nav: { stepIndex: index, totalSteps: guide.guideSteps.length, callbacks },\n });\n } catch {\n safeDestroy(renderer);\n return false;\n }\n if (this.walkthroughGuide !== guide) {\n safeDestroy(renderer);\n return false;\n }\n this.walkthrough = renderer;\n return true;\n }\n\n const renderer = new WalkthroughRenderer();\n let success = false;\n try {\n success = await renderer.render({ guide, currentStepIndex: index, callbacks });\n } catch {\n success = false;\n }\n\n // Misma carrera que en single-step: si otra preview reemplazó esta\n // mientras esperábamos, no adoptamos el renderer (sería huérfano).\n if (!success || this.walkthroughGuide !== guide) {\n safeDestroy(renderer);\n return false;\n }\n this.walkthrough = renderer;\n return true;\n }\n}\n\nlet activeController: GuidePreviewController | null = null;\n\n/**\n * Previsualiza una guía en la página actual usando los renderers reales\n * del SDK. Devuelve un handle con `close()` y una promesa `ready`.\n *\n * Pensado para el builder no-code: no necesita `init()` ni apiKey. Abrir\n * una nueva preview cierra automáticamente la anterior.\n *\n * @example\n * ```ts\n * import { previewGuide } from '@veo/sdk';\n *\n * const preview = previewGuide({\n * guideType: 'modal',\n * guideSteps: [{ title: 'Hola', content: 'Esto es una preview' }],\n * });\n * const { rendered } = await preview.ready;\n * // ...más tarde:\n * preview.close();\n * ```\n */\nexport function previewGuide(input: PreviewGuideInput): PreviewHandle {\n if (!hasDocument()) {\n return { close: () => {}, ready: Promise.resolve({ rendered: false }) };\n }\n if (!activeController) activeController = new GuidePreviewController();\n return activeController.preview(input);\n}\n\n/** Cierra la preview activa, si la hay. Idempotente. */\nexport function closeGuidePreview(): void {\n activeController?.close();\n}\n\n/** Construye un `ResolvedGuide` sintético con defaults inocuos para preview. */\nfunction normalize(input: PreviewGuideInput): ResolvedGuide {\n const selector = input.activationRules?.selector;\n const activationRules: ActivationRules = {\n url: input.activationRules?.url ?? { type: 'prefix', pattern: '/' },\n trigger: 'immediate',\n ...(selector !== undefined ? { selector } : {}),\n };\n\n return {\n guideId: PREVIEW_GUIDE_ID,\n guideName: input.guideName ?? 'Preview',\n guideType: input.guideType,\n guideSteps: input.guideSteps,\n activationRules,\n displayFrequency: 'always',\n displayPriority: 0,\n };\n}\n\nfunction createSingleStepRenderer(type: GuideType): BaseRenderer | null {\n switch (type) {\n case 'modal':\n return new ModalRenderer();\n case 'banner':\n return new BannerRenderer();\n case 'tooltip':\n return new TooltipRenderer();\n case 'custom':\n return new CustomRenderer();\n case 'inline':\n return new InlineRenderer();\n case 'inline-custom':\n return new InlineCustomRenderer();\n case 'form':\n return new FormRenderer();\n case 'inline-form':\n return new InlineFormRenderer();\n case 'walkthrough':\n return null;\n }\n}\n\nfunction safeDestroy(renderer: { destroy(): void }): void {\n try {\n renderer.destroy();\n } catch {\n // swallow — un cleanup roto no debe romper la preview.\n }\n}\n","/**\n * Modo PREVIEW POR LINK: la app del cliente se abre con\n * `?veoPreview=<token>` (link generado desde el dashboard) y el SDK canjea\n * el token contra `POST /v1/guides/preview-resolve` para renderizar ESA\n * guía como vista previa — aunque esté en draft — sobre la app real.\n *\n * A diferencia del modo builder no hay puente postMessage ni dashboard\n * abierto: es un link compartible para que el equipo pruebe la guía sin\n * publicarla. Reusa `previewGuide` (sin tracking/frecuencia/resolver) y\n * monta un chip flotante con \"volver a mostrar\" y \"cerrar\".\n *\n * Vive en el bundle de guías (`veo-guides.js`), NO en el `veo.js` core —\n * el core solo detecta el query param y dispara la carga del bundle.\n */\nimport { hasDocument } from '../../utils/safe-env';\nimport { previewGuide } from './guide-preview';\nimport type { ResolvedGuide } from './types';\n\nexport interface PreviewModeOptions {\n apiKey: string;\n apiUrl: string;\n /** Token firmado del link (`?veoPreview=<token>`). */\n token: string;\n debug?: boolean;\n}\n\nexport interface PreviewModeHandle {\n /** Cierra la preview y quita el chip. Idempotente. */\n teardown(): void;\n}\n\nlet active: PreviewModeHandle | null = null;\n\n/**\n * Canjea el token y renderiza la guía como vista previa + chip de control.\n * Si el token es inválido/expirado, el chip lo informa (solo quien tiene el\n * link lo ve). Solo una sesión de preview activa a la vez.\n */\nexport async function runPreviewMode(opts: PreviewModeOptions): Promise<PreviewModeHandle | null> {\n if (!hasDocument()) return null;\n active?.teardown();\n\n let guide: ResolvedGuide | null = null;\n try {\n const res = await fetch(`${opts.apiUrl}/v1/guides/preview-resolve`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Api-Key': opts.apiKey },\n body: JSON.stringify({ token: opts.token }),\n });\n if (res.ok) {\n const data = (await res.json()) as { guide?: ResolvedGuide };\n guide = data.guide ?? null;\n } else if (opts.debug) {\n console.warn('[veo] preview-resolve respondió', res.status);\n }\n } catch (err) {\n if (opts.debug) console.warn('[veo] preview-resolve falló:', err);\n }\n\n /**\n * En el link de preview el envío de forms es REAL: corre sobre la app del\n * cliente con el SDK inicializado, así que la respuesta se guarda en el\n * usuario que está probando (su propia identidad) — permite verificar el\n * flujo completo props→segmentos sin tocar a nadie más.\n */\n const submitToBackend = async (answers: Record<string, unknown>): Promise<boolean> => {\n if (!guide) return false;\n const veo = (\n window as unknown as {\n veo?: { getEndUserId?: () => string | null; getAnonymousId?: () => string };\n }\n ).veo;\n const endUserId = veo?.getEndUserId?.() ?? veo?.getAnonymousId?.() ?? null;\n if (!endUserId) return false;\n try {\n const res = await fetch(`${opts.apiUrl}/v1/guides/${guide.guideId}/form-response`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Api-Key': opts.apiKey },\n body: JSON.stringify({ endUserId, answers }),\n });\n return res.ok;\n } catch {\n return false;\n }\n };\n\n let preview: { close(): void } | null = null;\n const show = (): void => {\n if (!guide) return;\n preview?.close();\n preview = previewGuide({\n guideType: guide.guideType,\n guideSteps: guide.guideSteps,\n activationRules: guide.activationRules,\n guideName: guide.guideName,\n formSubmit: submitToBackend,\n formSubmitNote: 'Vista previa: guardado en TU usuario para probar el flujo.',\n });\n };\n\n const chip = mountChip({\n label: guide ? `Vista previa: ${guide.guideName}` : 'Link de preview inválido o vencido',\n error: !guide,\n onReshow: guide ? show : null,\n onClose: () => handle.teardown(),\n });\n\n const handle: PreviewModeHandle = {\n teardown() {\n preview?.close();\n preview = null;\n chip.remove();\n if (active === handle) active = null;\n },\n };\n active = handle;\n show();\n return handle;\n}\n\ninterface ChipOptions {\n label: string;\n error: boolean;\n onReshow: (() => void) | null;\n onClose: () => void;\n}\n\n/** Chip flotante (Shadow DOM, abajo-derecha) con re-mostrar y cerrar. */\nfunction mountChip(opts: ChipOptions): { remove(): void } {\n const host = document.createElement('div');\n host.setAttribute('data-veo-preview-chip', '');\n const root = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = `\n .chip { position: fixed; bottom: 16px; right: 16px; z-index: 2147483647;\n display: flex; align-items: center; gap: 8px; padding: 8px 12px;\n background: #111827; color: #f9fafb; border-radius: 9999px;\n font: 500 12px/1.2 system-ui, sans-serif; box-shadow: 0 4px 12px rgba(0,0,0,.25); }\n .chip.error { background: #7f1d1d; }\n .label { max-width: 240px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n button { all: unset; cursor: pointer; padding: 2px 6px; border-radius: 9999px;\n font-size: 12px; line-height: 1; }\n button:hover { background: rgba(255,255,255,.15); }\n `;\n root.appendChild(style);\n\n const chip = document.createElement('div');\n chip.className = opts.error ? 'chip error' : 'chip';\n\n const label = document.createElement('span');\n label.className = 'label';\n label.textContent = opts.label;\n chip.appendChild(label);\n\n if (opts.onReshow) {\n const reshow = document.createElement('button');\n reshow.textContent = '↻';\n reshow.title = 'Volver a mostrar la guía';\n reshow.addEventListener('click', opts.onReshow);\n chip.appendChild(reshow);\n }\n\n const close = document.createElement('button');\n close.textContent = '✕';\n close.title = 'Salir de la vista previa';\n close.addEventListener('click', opts.onClose);\n chip.appendChild(close);\n\n root.appendChild(chip);\n document.body.appendChild(host);\n return { remove: () => host.remove() };\n}\n","import type { VeoPlugin } from '../../types';\nimport { hasWindow } from '../../utils/safe-env';\nimport { definePlugin } from '../plugin';\nimport { GuidesController } from './guides-controller';\n\nexport interface GuidesPluginConfig {\n apiUrl: string;\n apiKey: string;\n debug?: boolean;\n}\n\n/** Resultado del install — expone el controller para debugging desde el demo. */\nexport interface GuidesPluginHandle {\n controller: GuidesController;\n}\n\n/**\n * Plugin que renderiza guías in-app (modal/banner/tooltip) consultando\n * `GET /v1/guides/resolve` y registra las interacciones en\n * `POST /v1/guides/:id/interactions` vía queue dedicada con retry y\n * sendBeacon en pagehide.\n *\n * Opt-in: `init({ ..., guides: true })`. El plugin escucha\n * `pageview` e `identify` del client; el payload del evento ya trae\n * `sessionId` y `endUserId` para que no necesitemos consultar al\n * client en cada disparo.\n *\n * Frequency híbrida: el backend filtra autoritariamente; el cache\n * local (`GuideFrequencyCache`) solo previene el flash visual cuando\n * la interaction aún no se persistió.\n */\nexport function guidesPlugin(config: GuidesPluginConfig): VeoPlugin {\n return definePlugin({\n name: 'guides',\n install(client) {\n if (!hasWindow()) return;\n const controller = new GuidesController(client, config);\n\n // Exponer el controller en window para que el demo y tests E2E\n // puedan inspeccionar el cache y la queue.\n (window as unknown as { __veoGuides?: GuidesPluginHandle }).__veoGuides = { controller };\n\n client.on('identify', ({ sessionId }) => {\n void controller.checkGuides(window.location.href, sessionId);\n });\n\n client.on('pageview', ({ url, sessionId }) => {\n void controller.checkGuides(url, sessionId);\n });\n\n // Como el bundle de guías se carga PEREZOSAMENTE, el plugin puede\n // instalarse DESPUÉS del pageview/identify inicial — esos eventos ya\n // pasaron. Chequeamos la página actual ahora mismo para que la guía\n // aparezca apenas se entra (sin necesitar una 2ª acción). Si todavía no\n // hay endUserId, checkGuides no hace nada y el listener de `identify` la\n // mostrará; el dedupe por guideId evita un doble render.\n void controller.checkGuides(window.location.href, client.getSessionId());\n },\n });\n}\n\nexport type { PreviewGuideInput, PreviewHandle, PreviewResult } from './guide-preview';\nexport { closeGuidePreview, previewGuide } from './guide-preview';\nexport type { PreviewModeHandle, PreviewModeOptions } from './preview-mode';\nexport { runPreviewMode } from './preview-mode';\nexport type { GuideInteractionEvent, GuideStep, ResolvedGuide } from './types';\n"]}
|