{"version":3,"file":"previewScript.mjs","sources":["../../../../admin/src/preview/utils/previewScript.ts"],"sourcesContent":["// NOTE: This override is for the properties on _user's site_, it's not about Strapi Admin.\ndeclare global {\n  interface Window {\n    __strapi_previewCleanup?: () => void;\n    STRAPI_HIGHLIGHT_HOVER_COLOR?: string;\n    STRAPI_HIGHLIGHT_ACTIVE_COLOR?: string;\n    STRAPI_DISABLE_STEGA_DECODING?: boolean;\n  }\n}\n\n/**\n * previewScript will be injected into the preview iframe after being stringified.\n * Therefore it CANNOT use any imports, or refer to any variables outside of its own scope.\n * It's why many functions are defined within previewScript, it's the only way to avoid going full spaghetti.\n * To get a better overview of everything previewScript does, go to the orchestration part at its end.\n */\ntype PreviewScriptColors = {\n  highlightHoverColor: string;\n  highlightActiveColor: string;\n};\n\ntype PreviewScriptConfig = {\n  shouldRun?: boolean;\n  colors: PreviewScriptColors;\n};\n\nconst previewScript = (config: PreviewScriptConfig) => {\n  const { shouldRun = true, colors } = config;\n\n  /* -----------------------------------------------------------------------------------------------\n   * Params\n   * ---------------------------------------------------------------------------------------------*/\n  const HIGHLIGHT_PADDING = 2; // in pixels\n  const HIGHLIGHT_HOVER_COLOR = window.STRAPI_HIGHLIGHT_HOVER_COLOR ?? colors.highlightHoverColor;\n  const HIGHLIGHT_ACTIVE_COLOR =\n    window.STRAPI_HIGHLIGHT_ACTIVE_COLOR ?? colors.highlightActiveColor;\n  const HIGHLIGHT_STYLES_ID = 'strapi-preview-highlight-styles';\n  const DOUBLE_CLICK_TIMEOUT = 300; // milliseconds to wait for potential double-click\n\n  const DISABLE_STEGA_DECODING = window.STRAPI_DISABLE_STEGA_DECODING ?? false;\n  const SOURCE_ATTRIBUTE = 'data-strapi-source';\n  const OVERLAY_ID = 'strapi-preview-overlay';\n  const INTERNAL_EVENTS = {\n    STRAPI_FIELD_FOCUS: 'strapiFieldFocus',\n    STRAPI_FIELD_BLUR: 'strapiFieldBlur',\n    STRAPI_FIELD_CHANGE: 'strapiFieldChange',\n    STRAPI_FIELD_FOCUS_INTENT: 'strapiFieldFocusIntent',\n    STRAPI_FIELD_SINGLE_CLICK_HINT: 'strapiFieldSingleClickHint',\n  } as const;\n\n  /**\n   * Calling the function in no-run mode lets us retrieve the constants from other files and keep\n   * a single source of truth for them. It's the only way to do this because this script can't\n   * refer to any variables outside of its own scope, because it's stringified before it's run.\n   */\n  if (!shouldRun) {\n    return { INTERNAL_EVENTS };\n  }\n\n  /* -----------------------------------------------------------------------------------------------\n   * Utils\n   * ---------------------------------------------------------------------------------------------*/\n\n  const sendMessage = (\n    type: (typeof INTERNAL_EVENTS)[keyof typeof INTERNAL_EVENTS],\n    payload: unknown\n  ) => {\n    window.parent.postMessage({ type, payload }, '*');\n  };\n\n  const getElementsByPath = (path: string) => {\n    return document.querySelectorAll(`[${SOURCE_ATTRIBUTE}*=\"path=${path}\"]`);\n  };\n\n  const isMediaElement = (element: Element): boolean => {\n    return element.tagName === 'IMG' || element.tagName === 'VIDEO' || element.tagName === 'AUDIO';\n  };\n\n  /**\n   * When a media field's mime type changes (e.g. image -> video), we can't\n   * swap the rendered DOM tag in place — the host framework (e.g. React)\n   * owns the original element and throws on removeChild if we replaceChild\n   * it. Instead we leave the original where it is, hide it, and insert our\n   * own sibling element of the correct tag. The injection lives outside the\n   * host framework's virtual DOM, so reconciliation never touches it.\n   *\n   * On save the host framework re-renders with the saved data and unmounts\n   * the original, leaving our injection orphaned next to its replacement —\n   * which is what was producing duplicate previews. The childList observer\n   * below uses these maps to drop the injection whenever its associated\n   * original is removed.\n   */\n  const originalToInjection = new Map<HTMLElement, HTMLElement>();\n  const injectionToOriginal = new Map<HTMLElement, HTMLElement>();\n\n  const trackInjection = (original: HTMLElement, injection: HTMLElement) => {\n    originalToInjection.set(original, injection);\n    injectionToOriginal.set(injection, original);\n  };\n\n  const untrackInjection = (injection: HTMLElement) => {\n    const original = injectionToOriginal.get(injection);\n    if (original) originalToInjection.delete(original);\n    injectionToOriginal.delete(injection);\n  };\n\n  /**\n   * When a media field is cleared, the original media element gets hidden and\n   * has no bounding box, so the highlight system stops drawing a clickable\n   * area for it. That leaves the user no way to re-add media from the preview.\n   * We insert a sized placeholder div carrying the original's source attribute\n   * so the highlight system keeps tracking the spot. The placeholder is\n   * tracked in the same injection maps as a real injection, so the next\n   * `setMediaElement` call (when the user picks new media) tears it down and\n   * restores/replaces the original element via the existing flow.\n   */\n  const PLACEHOLDER_ATTRIBUTE = 'data-strapi-media-placeholder';\n  /**\n   * For a multi-media field, growing the rendered DOM (e.g. 1 image → 2)\n   * needs a slot for the new item, but the host framework only re-renders\n   * the gallery on save. We synthesize the missing slots by cloning the\n   * last rendered item and marking each clone with this attribute so the\n   * ghost-sweep below can drop them once the framework eventually re-renders\n   * with the saved value.\n   */\n  const CLONE_ATTRIBUTE = 'data-strapi-media-clone';\n  /**\n   * Galleries commonly wrap each media element in its own layout cell\n   * (e.g. `<div class=\"grid\"><div><img/></div><div><img/></div></div>`),\n   * so cloning just the IMG makes the new item stack inside the existing\n   * wrapper. We walk up to the closest ancestor whose parent uses a sibling\n   * layout (flex/grid) and clone that instead, marking the cloned wrapper\n   * so cleanup removes the wrapper rather than leaving an empty cell.\n   */\n  const CLONE_WRAPPER_ATTRIBUTE = 'data-strapi-media-clone-wrapper';\n  const createMediaPlaceholder = (sourceAttr: string, rect: DOMRect): HTMLElement => {\n    const placeholder = document.createElement('div');\n    placeholder.setAttribute(PLACEHOLDER_ATTRIBUTE, '');\n    placeholder.setAttribute(SOURCE_ATTRIBUTE, sourceAttr);\n\n    const width = rect.width > 0 ? rect.width : 200;\n    const height = rect.height > 0 ? rect.height : 200;\n    placeholder.style.cssText = `\n      display: inline-block;\n      width: ${width}px;\n      height: ${height}px;\n      background-color: rgba(0, 0, 0, 0.04);\n      border: 2px dashed rgba(0, 0, 0, 0.15);\n      border-radius: 4px;\n      box-sizing: border-box;\n      vertical-align: top;\n    `;\n    return placeholder;\n  };\n\n  /**\n   * Form values for media fields carry the raw Strapi URL (often relative,\n   * e.g. \"/uploads/foo.jpg\"). The host framework typically renders the\n   * original element with an absolute URL (resolved against the Strapi\n   * backend, not the iframe origin). If we naively set the relative form\n   * value as src, the browser resolves it against the iframe origin and\n   * fails to load. Resolve against the original element's existing src\n   * origin so the swap targets the same backend.\n   */\n  const resolveMediaUrl = (originalEl: HTMLElement, rawUrl: string): string => {\n    if (/^(?:[a-z]+:)?\\/\\//i.test(rawUrl) || rawUrl.startsWith('data:')) {\n      return rawUrl;\n    }\n    const currentSrc = originalEl.getAttribute('src');\n    if (!currentSrc) return rawUrl;\n    try {\n      const currentUrl = new URL(currentSrc, window.location.href);\n      return new URL(rawUrl, currentUrl.origin).href;\n    } catch {\n      return rawUrl;\n    }\n  };\n\n  /**\n   * Extract a recognizable media filename from a URL string. Works for\n   * direct backend URLs, relative paths, and proxy URLs that embed the\n   * real path in a query parameter (e.g. Next.js's \"/_next/image?url=...\").\n   * Used to detect whether the rendered element already shows the same\n   * asset as the form value, so we can skip src updates that would only\n   * substitute one URL representation for another.\n   */\n  const getMediaFilename = (raw: string): string => {\n    if (!raw) return '';\n    let decoded = raw;\n    try {\n      decoded = decodeURIComponent(raw);\n    } catch {}\n    const match = decoded.match(\n      /([^/?#&=\\s]+\\.(?:jpg|jpeg|png|gif|webp|avif|svg|mp4|mov|webm|ogg|m4v|mp3|wav|m4a|aac|flac|opus))(?:[?#&]|$)/i\n    );\n    return match ? match[1].toLowerCase() : '';\n  };\n\n  /**\n   * Get the field path to use for focusing a media field.\n   * - For IMG/VIDEO elements: the path was already normalized (stripped of .url) during stega decoding\n   * - For tracked injections (e.g., placeholder divs we insert when media is cleared): the source\n   *   attribute was copied from the post-normalization media element, so it's already correct\n   * - For non-media elements with model=plugin::upload.file (e.g., caption text): strip the last\n   *   segment to focus the parent media field (e.g., \"hero.caption\" -> \"hero\")\n   */\n  const getFieldPathForMedia = (sourceAttr: string, element: Element): string => {\n    if (isMediaElement(element) || injectionToOriginal.has(element as HTMLElement)) {\n      return sourceAttr;\n    }\n\n    // For non-media elements, check if it's a media asset field\n    const params = new URLSearchParams(sourceAttr);\n    if (params.get('model') === 'plugin::upload.file') {\n      const elementPath = params.get('path');\n      if (elementPath) {\n        // Strip the last segment (e.g., \"hero.caption\" -> \"hero\")\n        const parentPath = elementPath.split('.').slice(0, -1).join('.');\n        params.set('path', parentPath);\n        return params.toString();\n      }\n    }\n\n    return sourceAttr;\n  };\n\n  /* -----------------------------------------------------------------------------------------------\n   * Functionality pieces\n   * ---------------------------------------------------------------------------------------------*/\n\n  const setupStegaDOMObserver = async () => {\n    if (DISABLE_STEGA_DECODING) {\n      return;\n    }\n\n    const { vercelStegaDecode: stegaDecode, vercelStegaClean: stegaClean } = await import(\n      // @ts-expect-error it's not a local dependency\n      // eslint-disable-next-line import/no-unresolved\n      'https://cdn.jsdelivr.net/npm/@vercel/stega@0.1.2/+esm'\n    );\n\n    const applyStegaToElement = (element: Element) => {\n      // Handle img and video tags - check src attribute for stega encoding\n      if (isMediaElement(element)) {\n        const src = element.getAttribute('src');\n        if (src) {\n          try {\n            const result = stegaDecode(src);\n            if (result && 'strapiSource' in result) {\n              // Parse the source and remove .url suffix to point to the media field\n              const sourceValue = result.strapiSource as string;\n              const pathMatch = sourceValue.match(/path=([^&]+)/);\n              if (pathMatch) {\n                const originalPath = pathMatch[1];\n                // Remove .url to get the media field path\n                const mediaPath = originalPath.replace(/\\.url$/, '');\n                const newSource = sourceValue.replace(`path=${originalPath}`, `path=${mediaPath}`);\n                element.setAttribute(SOURCE_ATTRIBUTE, newSource);\n              }\n            }\n            // Clean the src attribute so the resource can load\n            const cleanedSrc = stegaClean(src);\n            if (cleanedSrc !== src) {\n              element.setAttribute('src', cleanedSrc);\n            }\n          } catch (error) {}\n        }\n        return;\n      }\n\n      const directTextNodes = Array.from(element.childNodes).filter(\n        (node) => node.nodeType === Node.TEXT_NODE\n      );\n\n      const directTextContent = directTextNodes.map((node) => node.textContent || '').join('');\n\n      if (directTextContent) {\n        try {\n          // TODO: check if we can call split instead of decode+clean\n          const result = stegaDecode(directTextContent);\n          if (result && 'strapiSource' in result) {\n            element.setAttribute(SOURCE_ATTRIBUTE, result.strapiSource);\n\n            // Remove encoded part from DOM text content (to avoid breaking links for example)\n            directTextNodes.forEach((node) => {\n              if (node.textContent) {\n                const cleanedText = stegaClean(node.textContent);\n                if (cleanedText !== node.textContent) {\n                  node.textContent = cleanedText;\n                }\n              }\n            });\n          }\n        } catch (error) {}\n      }\n    };\n\n    // Process all existing elements\n    const allElements = document.querySelectorAll('*');\n    Array.from(allElements).forEach(applyStegaToElement);\n\n    // Create observer for new elements and text changes\n    const observer = new MutationObserver((mutations) => {\n      mutations.forEach((mutation) => {\n        // Handle added nodes\n        if (mutation.type === 'childList') {\n          mutation.addedNodes.forEach((node) => {\n            if (node.nodeType === Node.ELEMENT_NODE) {\n              const element = node as Element;\n              // Process the added element\n              applyStegaToElement(element);\n              // Process all child elements\n              const childElements = element.querySelectorAll('*');\n              Array.from(childElements).forEach(applyStegaToElement);\n            }\n          });\n        }\n\n        // Handle text content changes\n        if (mutation.type === 'characterData' && mutation.target.parentElement) {\n          applyStegaToElement(mutation.target.parentElement);\n        }\n\n        // Handle src attribute changes for img/video elements\n        if (mutation.type === 'attributes' && mutation.attributeName === 'src') {\n          const target = mutation.target as Element;\n          if (isMediaElement(target)) {\n            applyStegaToElement(target);\n          }\n        }\n      });\n    });\n\n    observer.observe(document, {\n      childList: true,\n      subtree: true,\n      characterData: true,\n      attributes: true,\n      attributeFilter: ['src'],\n    });\n\n    return observer;\n  };\n\n  const createHighlightStyles = () => {\n    const existingStyles = document.getElementById(HIGHLIGHT_STYLES_ID);\n    // Remove existing styles to avoid duplicates\n    if (existingStyles) {\n      existingStyles.remove();\n    }\n\n    const styleElement = document.createElement('style');\n    styleElement.id = HIGHLIGHT_STYLES_ID;\n    styleElement.textContent = `\n      .strapi-highlight {\n        position: absolute;\n        outline: 2px solid transparent;\n        pointer-events: auto;\n        border-radius: 2px;\n        background-color: transparent;\n        will-change: transform;\n        transition: outline-color 0.1s ease-in-out;\n      }\n\n      .strapi-highlight:hover {\n        outline-color: ${HIGHLIGHT_HOVER_COLOR} !important;\n      }\n\n      .strapi-highlight.strapi-highlight-focused {\n        outline-color: ${HIGHLIGHT_ACTIVE_COLOR} !important;\n        outline-width: 3px !important;\n      }\n    `;\n\n    document.head.appendChild(styleElement);\n    return styleElement;\n  };\n\n  const createOverlaySystem = () => {\n    // Clean up before creating a new overlay so we can safely call previewScript multiple times\n    window.__strapi_previewCleanup?.();\n    document.getElementById(OVERLAY_ID)?.remove();\n\n    const overlay = document.createElement('div');\n    overlay.id = OVERLAY_ID;\n    overlay.style.cssText = `\n      position: fixed;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      pointer-events: none;\n      z-index: 9999;\n    `;\n\n    window.document.body.appendChild(overlay);\n    return overlay;\n  };\n\n  type EventListenersList = Array<{\n    element: HTMLElement | Window;\n    type: keyof HTMLElementEventMap | 'message';\n    handler: EventListener;\n  }>;\n\n  /**\n   * Group all elements that share the exact same `data-strapi-source` value\n   * under one highlight. This is what makes a multi-media field render as a\n   * single bounding box in the preview (and what makes the popover open the\n   * multi-media input rather than treating each item as its own field). The\n   * grouping is keyed off the source string so other accidental same-source\n   * renders (e.g. the title rendered twice) also collapse to one highlight,\n   * which matches how the focused state already behaves.\n   */\n  type HighlightGroup = {\n    highlight: HTMLElement;\n    elements: Set<HTMLElement>;\n  };\n\n  const createHighlightManager = (overlay: HTMLElement) => {\n    const groups = new Map<string, HighlightGroup>();\n    const elementToGroupKey = new Map<HTMLElement, string>();\n    const eventListeners: EventListenersList = [];\n    const focusedHighlights: HTMLElement[] = [];\n    const pendingClicks = new Map<HighlightGroup, number>();\n    let focusedField: string | null = null;\n\n    const computeGroupRect = (group: HighlightGroup) => {\n      let minLeft = Infinity;\n      let minTop = Infinity;\n      let maxRight = -Infinity;\n      let maxBottom = -Infinity;\n      let any = false;\n      group.elements.forEach((el) => {\n        const r = el.getBoundingClientRect();\n        if (r.width === 0 && r.height === 0) return;\n        any = true;\n        if (r.left < minLeft) minLeft = r.left;\n        if (r.top < minTop) minTop = r.top;\n        if (r.right > maxRight) maxRight = r.right;\n        if (r.bottom > maxBottom) maxBottom = r.bottom;\n      });\n      if (!any) return null;\n      return {\n        left: minLeft,\n        top: minTop,\n        width: maxRight - minLeft,\n        height: maxBottom - minTop,\n      };\n    };\n\n    const drawGroup = (group: HighlightGroup) => {\n      const rect = computeGroupRect(group);\n      if (!rect) {\n        group.highlight.style.display = 'none';\n        return;\n      }\n      group.highlight.style.display = '';\n      group.highlight.style.width = `${rect.width + HIGHLIGHT_PADDING * 2}px`;\n      group.highlight.style.height = `${rect.height + HIGHLIGHT_PADDING * 2}px`;\n      group.highlight.style.transform = `translate(${rect.left - HIGHLIGHT_PADDING}px, ${rect.top - HIGHLIGHT_PADDING}px)`;\n    };\n\n    const updateAllHighlights = () => {\n      groups.forEach(drawGroup);\n    };\n\n    /**\n     * Pick the underlying source element under the pointer so single-click\n     * redispatch hits the specific item the user clicked, even when the group\n     * highlight covers several elements (multi-media gallery).\n     */\n    const pickElementAtPoint = (\n      group: HighlightGroup,\n      x: number,\n      y: number\n    ): HTMLElement | null => {\n      for (const el of group.elements) {\n        const r = el.getBoundingClientRect();\n        if (x >= r.left && x <= r.right && y >= r.top && y <= r.bottom) {\n          return el;\n        }\n      }\n      const first = group.elements.values().next().value;\n      return first ?? null;\n    };\n\n    const createGroup = (groupKey: string): HighlightGroup => {\n      const highlight = document.createElement('div');\n      highlight.className = 'strapi-highlight';\n      const group: HighlightGroup = { highlight, elements: new Set() };\n\n      const clickHandler = (event: MouseEvent) => {\n        if ((event as any).__strapi_redispatched) {\n          return;\n        }\n\n        event.preventDefault();\n        event.stopPropagation();\n\n        const existingTimeout = pendingClicks.get(group);\n        if (existingTimeout) {\n          window.clearTimeout(existingTimeout);\n          pendingClicks.delete(group);\n        }\n\n        const timeout = window.setTimeout(() => {\n          pendingClicks.delete(group);\n\n          sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_SINGLE_CLICK_HINT, null);\n\n          // Pick the specific underlying element under the pointer so the\n          // redispatched click targets the right item in a multi-element group\n          const underlying = pickElementAtPoint(group, event.clientX, event.clientY);\n          if (!underlying) return;\n\n          let targetElement: HTMLElement = underlying;\n          if (isMediaElement(underlying)) {\n            let parent = underlying.parentElement;\n            while (parent) {\n              if (\n                parent.tagName === 'A' ||\n                parent.tagName === 'BUTTON' ||\n                parent.hasAttribute('onclick') ||\n                parent.getAttribute('role') === 'button' ||\n                parent.getAttribute('role') === 'link'\n              ) {\n                targetElement = parent;\n                break;\n              }\n              parent = parent.parentElement;\n            }\n          }\n\n          const newEvent = new MouseEvent('click', {\n            bubbles: true,\n            cancelable: true,\n            view: window,\n            detail: 1,\n            button: event.button,\n            buttons: event.buttons,\n            clientX: event.clientX,\n            clientY: event.clientY,\n            ctrlKey: event.ctrlKey,\n            altKey: event.altKey,\n            shiftKey: event.shiftKey,\n            metaKey: event.metaKey,\n          });\n          (newEvent as any).__strapi_redispatched = true;\n          targetElement.dispatchEvent(newEvent);\n        }, DOUBLE_CLICK_TIMEOUT);\n\n        pendingClicks.set(group, timeout);\n      };\n\n      const doubleClickHandler = (event: MouseEvent) => {\n        event.preventDefault();\n        event.stopPropagation();\n\n        const existingTimeout = pendingClicks.get(group);\n        if (existingTimeout) {\n          clearTimeout(existingTimeout);\n          pendingClicks.delete(group);\n        }\n\n        const anchor = pickElementAtPoint(group, event.clientX, event.clientY);\n        if (!anchor) return;\n        const sourceAttribute = anchor.getAttribute(SOURCE_ATTRIBUTE);\n        if (!sourceAttribute) return;\n        const path = getFieldPathForMedia(sourceAttribute, anchor);\n        const rect = computeGroupRect(group);\n        if (!rect) return;\n        sendMessage(INTERNAL_EVENTS.STRAPI_FIELD_FOCUS_INTENT, {\n          path,\n          position: {\n            top: rect.top,\n            left: rect.left,\n            right: rect.left + rect.width,\n            bottom: rect.top + rect.height,\n            width: rect.width,\n            height: rect.height,\n          },\n        });\n      };\n\n      const mouseDownHandler = (event: MouseEvent) => {\n        if (event.detail >= 2) {\n          event.preventDefault();\n        }\n      };\n\n      highlight.addEventListener('click', clickHandler);\n      highlight.addEventListener('dblclick', doubleClickHandler);\n      highlight.addEventListener('mousedown', mouseDownHandler);\n\n      eventListeners.push(\n        { element: highlight, type: 'click', handler: clickHandler as EventListener },\n        { element: highlight, type: 'dblclick', handler: doubleClickHandler as EventListener },\n        { element: highlight, type: 'mousedown', handler: mouseDownHandler as EventListener }\n      );\n\n      overlay.appendChild(highlight);\n      groups.set(groupKey, group);\n      return group;\n    };\n\n    const destroyGroup = (groupKey: string, group: HighlightGroup) => {\n      const pendingTimeout = pendingClicks.get(group);\n      if (pendingTimeout) {\n        window.clearTimeout(pendingTimeout);\n        pendingClicks.delete(group);\n      }\n\n      const focusedIndex = focusedHighlights.indexOf(group.highlight);\n      if (focusedIndex !== -1) {\n        focusedHighlights.splice(focusedIndex, 1);\n      }\n\n      group.highlight.remove();\n\n      const listenersToRemove = eventListeners.filter(\n        (listener) => listener.element === group.highlight\n      );\n      listenersToRemove.forEach(({ element, type, handler }) => {\n        element.removeEventListener(type, handler);\n      });\n      eventListeners.splice(\n        0,\n        eventListeners.length,\n        ...eventListeners.filter((listener) => listener.element !== group.highlight)\n      );\n\n      groups.delete(groupKey);\n    };\n\n    const createHighlightForElement = (element: HTMLElement) => {\n      if (elementToGroupKey.has(element)) {\n        return;\n      }\n      const groupKey = element.getAttribute(SOURCE_ATTRIBUTE);\n      if (!groupKey) return;\n\n      let group = groups.get(groupKey);\n\n      // When a framework-rendered media element joins a group that still\n      // holds stale ghosts from a previous clear (a standalone placeholder,\n      // our injection paired with a hidden placeholder, or a clone we\n      // synthesized to give an added array item a slot), sweep the ghosts\n      // so we don't end up with two visible elements stacked on top of\n      // each other after a save commits a real value.\n      if (\n        group &&\n        isMediaElement(element) &&\n        !injectionToOriginal.has(element) &&\n        !element.hasAttribute(CLONE_ATTRIBUTE)\n      ) {\n        const ghostInjections: HTMLElement[] = [];\n        const ghostPlaceholders: HTMLElement[] = [];\n        const ghostClones: HTMLElement[] = [];\n        group.elements.forEach((el) => {\n          if (injectionToOriginal.has(el)) {\n            ghostInjections.push(el);\n          } else if (el.hasAttribute(CLONE_ATTRIBUTE)) {\n            ghostClones.push(el);\n          } else if (el.hasAttribute(PLACEHOLDER_ATTRIBUTE)) {\n            ghostPlaceholders.push(el);\n          }\n        });\n        ghostInjections.forEach((injection) => {\n          const orig = injectionToOriginal.get(injection);\n          untrackInjection(injection);\n          if (orig?.hasAttribute(CLONE_ATTRIBUTE)) {\n            // Tag-swap injection of a clone (e.g. user added a video as\n            // the new item, swapping our cloned IMG for a VIDEO). Remove\n            // the wrapper so we don't leave an empty layout cell behind.\n            const wrapper = orig.closest(`[${CLONE_WRAPPER_ATTRIBUTE}]`) as HTMLElement | null;\n            (wrapper ?? orig).remove();\n          } else if (orig?.hasAttribute(PLACEHOLDER_ATTRIBUTE)) {\n            orig.remove();\n          }\n          group?.elements.delete(injection);\n          elementToGroupKey.delete(injection);\n          injection.remove();\n        });\n        ghostPlaceholders.forEach((placeholder) => {\n          group?.elements.delete(placeholder);\n          elementToGroupKey.delete(placeholder);\n          placeholder.remove();\n        });\n        // Remove the wrapper if we cloned an ancestor for layout — falling\n        // back to the clone itself when it's its own root. Removing via\n        // .remove() also triggers the mutation observer's removedNodes\n        // branch, which untracks any injection paired with descendants.\n        ghostClones.forEach((clone) => {\n          group?.elements.delete(clone);\n          elementToGroupKey.delete(clone);\n          const wrapper = clone.closest(`[${CLONE_WRAPPER_ATTRIBUTE}]`) as HTMLElement | null;\n          (wrapper ?? clone).remove();\n        });\n      }\n\n      if (!group) {\n        group = createGroup(groupKey);\n      }\n      group.elements.add(element);\n      elementToGroupKey.set(element, groupKey);\n      drawGroup(group);\n    };\n\n    const removeHighlightForElement = (element: Element) => {\n      const groupKey = elementToGroupKey.get(element as HTMLElement);\n      if (!groupKey) return;\n      const group = groups.get(groupKey);\n      if (!group) return;\n\n      group.elements.delete(element as HTMLElement);\n      elementToGroupKey.delete(element as HTMLElement);\n\n      if (group.elements.size === 0) {\n        destroyGroup(groupKey, group);\n      } else {\n        drawGroup(group);\n      }\n    };\n\n    /**\n     * Resolve groups whose elements match a focused field path. We delegate\n     * to `getElementsByPath` so this preserves the same loose substring match\n     * the highlight system has always used (e.g. focusing `hero` matches\n     * `hero.caption` too).\n     */\n    const findGroupForPath = (path: string): HighlightGroup[] => {\n      const matched = new Set<HighlightGroup>();\n      getElementsByPath(path).forEach((el) => {\n        const key = elementToGroupKey.get(el as HTMLElement);\n        if (!key) return;\n        const group = groups.get(key);\n        if (group) matched.add(group);\n      });\n      return Array.from(matched);\n    };\n\n    // Process all existing elements with source attributes\n    const initialElements = window.document.querySelectorAll(`[${SOURCE_ATTRIBUTE}]`);\n    Array.from(initialElements).forEach((element) => {\n      if (element instanceof HTMLElement) {\n        createHighlightForElement(element);\n      }\n    });\n\n    return {\n      get elements() {\n        return Array.from(elementToGroupKey.keys());\n      },\n      get groups() {\n        return Array.from(groups.values());\n      },\n      updateAllHighlights,\n      eventListeners,\n      focusedHighlights,\n      createHighlightForElement,\n      removeHighlightForElement,\n      findGroupForPath,\n      setFocusedField: (field: string | null) => {\n        focusedField = field;\n      },\n      getFocusedField: () => focusedField,\n      clearAllPendingClicks: () => {\n        pendingClicks.forEach((timeout) => clearTimeout(timeout));\n        pendingClicks.clear();\n      },\n    };\n  };\n\n  type HighlightManager = ReturnType<typeof createHighlightManager>;\n\n  /**\n   * We need to track scroll in all the element parents in order to keep the highlight position\n   * in sync with the element position. Listening to window scroll is not enough because the\n   * element can be inside one or more scrollable containers.\n   */\n  const setupScrollManagement = (highlightManager: HighlightManager) => {\n    const updateOnScroll = () => {\n      highlightManager.updateAllHighlights();\n    };\n\n    const scrollableElements = new Set<Element | Window>();\n    scrollableElements.add(window);\n\n    // Find all scrollable ancestors for all tracked elements and set up scroll listeners\n    highlightManager.elements.forEach((element) => {\n      let parent = element.parentElement;\n      while (parent) {\n        const computedStyle = window.getComputedStyle(parent);\n        const overflow = computedStyle.overflow + computedStyle.overflowX + computedStyle.overflowY;\n\n        if (overflow.includes('scroll') || overflow.includes('auto')) {\n          scrollableElements.add(parent);\n        }\n\n        parent = parent.parentElement;\n      }\n    });\n\n    // Add scroll listeners to all scrollable elements\n    scrollableElements.forEach((element) => {\n      if (element === window) {\n        window.addEventListener('scroll', updateOnScroll);\n        window.addEventListener('resize', updateOnScroll);\n      } else {\n        element.addEventListener('scroll', updateOnScroll);\n      }\n    });\n\n    const cleanup = () => {\n      scrollableElements.forEach((element) => {\n        if (element === window) {\n          window.removeEventListener('scroll', updateOnScroll);\n          window.removeEventListener('resize', updateOnScroll);\n        } else {\n          (element as Element).removeEventListener('scroll', updateOnScroll);\n        }\n      });\n    };\n\n    return { cleanup };\n  };\n\n  const setupObservers = (\n    highlightManager: HighlightManager,\n    stegaObserver: MutationObserver | undefined\n  ) => {\n    const resizeObserver = new ResizeObserver(() => {\n      highlightManager.updateAllHighlights();\n    });\n\n    const observeElementForResize = (element: Element) => {\n      resizeObserver.observe(element);\n    };\n\n    // Observe existing elements\n    highlightManager.elements.forEach(observeElementForResize);\n    resizeObserver.observe(document.documentElement);\n\n    // Create highlight observer to watch for new elements with source attributes\n    const highlightObserver = new MutationObserver((mutations) => {\n      mutations.forEach((mutation) => {\n        if (mutation.type === 'attributes' && mutation.attributeName === SOURCE_ATTRIBUTE) {\n          const target = mutation.target as HTMLElement;\n          if (target.hasAttribute(SOURCE_ATTRIBUTE)) {\n            highlightManager.createHighlightForElement(target);\n            observeElementForResize(target);\n          } else {\n            highlightManager.removeHighlightForElement(target);\n          }\n        }\n\n        if (mutation.type === 'childList') {\n          mutation.addedNodes.forEach((node) => {\n            if (node.nodeType === Node.ELEMENT_NODE) {\n              const element = node as Element;\n              // Check if the added element has source attribute\n              if (element.hasAttribute(SOURCE_ATTRIBUTE) && element instanceof HTMLElement) {\n                highlightManager.createHighlightForElement(element);\n                observeElementForResize(element);\n              }\n              // Check all child elements for source attributes\n              const elementsWithSource = element.querySelectorAll(`[${SOURCE_ATTRIBUTE}]`);\n              Array.from(elementsWithSource).forEach((childElement) => {\n                if (childElement instanceof HTMLElement) {\n                  highlightManager.createHighlightForElement(childElement);\n                  observeElementForResize(childElement);\n                }\n              });\n            }\n          });\n\n          mutation.removedNodes.forEach((node) => {\n            if (node.nodeType === Node.ELEMENT_NODE) {\n              const element = node as Element;\n              highlightManager.removeHighlightForElement(element);\n\n              // If a tracked media original (or its ancestor) was removed —\n              // typically when the host framework re-renders after save and\n              // unmounts the previous element — drop our matching injection\n              // so we don't end up with duplicate previews next to the new one.\n              // This applies to placeholders too: once the framework owns\n              // the layout for a cleared field (and likely renders its own\n              // empty state), our placeholder would just stack next to it.\n              originalToInjection.forEach((injection, original) => {\n                if (element === original || element.contains(original)) {\n                  untrackInjection(injection);\n                  injection.remove();\n                } else if (element === injection || element.contains(injection)) {\n                  // Our injection itself was removed (e.g. parent unmounted)\n                  untrackInjection(injection);\n                }\n              });\n            }\n          });\n        }\n      });\n    });\n\n    highlightObserver.observe(document, {\n      childList: true,\n      subtree: true,\n      attributes: true,\n      attributeFilter: [SOURCE_ATTRIBUTE],\n    });\n\n    return {\n      resizeObserver,\n      highlightObserver,\n      stegaObserver,\n    };\n  };\n\n  const setupEventHandlers = (highlightManager: HighlightManager) => {\n    const setMediaElement = (el: HTMLElement, url: string | null, mime?: string) => {\n      const original = injectionToOriginal.get(el) ?? el;\n      const injection = originalToInjection.get(original) ?? null;\n\n      const removeInjection = () => {\n        if (!injection) return;\n        // Move the source attribute back to the original so highlights track it again\n        const sourceAttr = injection.getAttribute(SOURCE_ATTRIBUTE);\n        if (sourceAttr) original.setAttribute(SOURCE_ATTRIBUTE, sourceAttr);\n        untrackInjection(injection);\n        injection.remove();\n      };\n\n      if (!url) {\n        // Capture rect from whatever's currently visible before any DOM\n        // changes, so the placeholder can be sized to match.\n        const visibleEl = injection ?? original;\n        const rect = visibleEl.getBoundingClientRect();\n\n        // removeInjection moves the source attr back to original, so we read\n        // it after.\n        removeInjection();\n\n        const sourceAttr = original.getAttribute(SOURCE_ATTRIBUTE);\n        if (!sourceAttr) {\n          original.style.display = 'none';\n          return;\n        }\n\n        // Hide the host-framework-managed original. We deliberately keep\n        // its `src` attribute around so `resolveMediaUrl` can still derive\n        // the backend origin when the user later picks a new media file\n        // with a relative URL.\n        original.style.display = 'none';\n\n        // Move the source attr onto a placeholder div so the highlight\n        // system keeps tracking the spot and the user can click to re-add\n        // media.\n        original.removeAttribute(SOURCE_ATTRIBUTE);\n        const placeholder = createMediaPlaceholder(sourceAttr, rect);\n        original.parentNode?.insertBefore(placeholder, original.nextSibling);\n        trackInjection(original, placeholder);\n        return;\n      }\n\n      const desiredTag = mime?.startsWith('image/')\n        ? 'IMG'\n        : mime?.startsWith('video/')\n          ? 'VIDEO'\n          : mime?.startsWith('audio/')\n            ? 'AUDIO'\n            : null;\n\n      // If the rendered element already shows the same media file as the\n      // form value, do nothing. Compare by filename so we're agnostic to\n      // URL representation — the host framework may have rendered a proxy\n      // URL (e.g. Next.js's \"/_next/image?url=...\") that wouldn't match a\n      // raw form-value URL string-wise but resolves to the same asset.\n      const active = injection ?? original;\n      const newFilename = getMediaFilename(url);\n      const currentFilename = getMediaFilename(active.getAttribute('src') ?? '');\n      const tagAlreadyMatches = !desiredTag || active.tagName === desiredTag;\n      if (tagAlreadyMatches && newFilename && newFilename === currentFilename) {\n        active.style.display = '';\n        return;\n      }\n\n      // Resolve relative form-value URLs against the existing src's origin\n      // so the swap targets the Strapi backend, not the iframe origin.\n      const resolvedUrl = resolveMediaUrl(original, url);\n\n      // No mime info — fall back to updating whatever's active\n      if (!desiredTag) {\n        if (active.getAttribute('src') !== resolvedUrl) {\n          active.setAttribute('src', resolvedUrl);\n        }\n        active.style.display = '';\n        return;\n      }\n\n      // Original's tag matches: restore it (removing any previous injection)\n      if (original.tagName === desiredTag) {\n        removeInjection();\n        if (original.getAttribute('src') !== resolvedUrl) {\n          original.setAttribute('src', resolvedUrl);\n        }\n        original.style.display = '';\n        return;\n      }\n\n      // Existing injection of the right tag: just update its src\n      if (injection && injection.tagName === desiredTag) {\n        if (injection.getAttribute('src') !== resolvedUrl) {\n          injection.setAttribute('src', resolvedUrl);\n        }\n        return;\n      }\n\n      // Need a fresh injection of the correct tag\n      removeInjection();\n\n      const newInjection = document.createElement(desiredTag) as HTMLElement;\n      // Mirror the original's attributes so styling/classes carry over.\n      // Skip src/srcset — those carry the *previous* media's URL and would\n      // make the new element try to load it (a video element fed an image\n      // URL renders a permanent \"No supported format\" error). We set src\n      // explicitly below.\n      // For audio, skip visual-sizing attributes too — image/video classes\n      // (e.g. aspect-square, h-96) don't suit a horizontal audio control\n      // and produce a giant empty box around the player.\n      const isAudio = desiredTag === 'AUDIO';\n      const skipForAudio = new Set(['class', 'style', 'width', 'height']);\n      Array.from(original.attributes).forEach((attr) => {\n        if (attr.name === 'id' || attr.name === 'src' || attr.name === 'srcset') return;\n        if (isAudio && skipForAudio.has(attr.name)) return;\n        newInjection.setAttribute(attr.name, attr.value);\n      });\n      newInjection.setAttribute('src', resolvedUrl);\n      if (desiredTag === 'VIDEO' || desiredTag === 'AUDIO') {\n        newInjection.setAttribute('controls', '');\n      }\n      if (!isAudio) {\n        newInjection.style.cssText = original.style.cssText;\n      }\n      newInjection.style.display = '';\n\n      // Hide the host-framework-managed original and let highlights track our injection\n      original.style.display = 'none';\n      original.removeAttribute(SOURCE_ATTRIBUTE);\n      original.parentNode?.insertBefore(newInjection, original.nextSibling);\n      trackInjection(original, newInjection);\n    };\n\n    const handleMessage = (event: MessageEvent) => {\n      if (!event.data?.type) return;\n\n      // The user typed in an input, reflect the change in the preview\n      if (event.data.type === INTERNAL_EVENTS.STRAPI_FIELD_CHANGE) {\n        const { field, value } = event.data.payload;\n        if (!field) return;\n\n        const matchedElements = Array.from(getElementsByPath(field)).filter(\n          (el): el is HTMLElement => el instanceof HTMLElement\n        );\n\n        // A cleared media field is represented by a placeholder div sitting\n        // where the (hidden or unmounted) original used to be. Treat it like\n        // a media element here so the next change routes through\n        // setMediaElement and tears the placeholder down. Standalone\n        // placeholders (those whose original was unmounted by the host\n        // framework after save) are not in the injection maps but still\n        // need to be matchable.\n        const isMediaTarget = (el: Element) =>\n          isMediaElement(el) ||\n          injectionToOriginal.has(el as HTMLElement) ||\n          el.hasAttribute(PLACEHOLDER_ATTRIBUTE);\n\n        // Multi-media field: value is an array of media items. After the\n        // server change, every item shares `path=<field>`, so we map array\n        // items to media elements in DOM order. Removing items reuses\n        // existing elements (extras get cleared into placeholders); adding\n        // items synthesizes new slots by cloning the last rendered element,\n        // since the host framework only re-renders the gallery on save.\n        if (Array.isArray(value)) {\n          const mediaEls = matchedElements.filter(isMediaTarget);\n          if (mediaEls.length > 0 && mediaEls.length < value.length) {\n            const lastEl = mediaEls[mediaEls.length - 1];\n            // Walk up until we reach an ancestor whose parent lays out\n            // children as siblings (flex/grid). Record indices so we can\n            // re-find the media element inside each cloned wrapper.\n            const indices: number[] = [];\n            let template: HTMLElement = lastEl;\n            let parent = template.parentElement;\n            const SIBLING_LAYOUTS = new Set(['flex', 'inline-flex', 'grid', 'inline-grid']);\n            const MAX_DEPTH = 5;\n            for (let depth = 0; parent && depth < MAX_DEPTH; depth++) {\n              if (SIBLING_LAYOUTS.has(window.getComputedStyle(parent).display)) {\n                break;\n              }\n              indices.push(Array.prototype.indexOf.call(parent.children, template));\n              template = parent;\n              parent = parent.parentElement;\n            }\n\n            let insertAfter: HTMLElement = template;\n            for (let i = mediaEls.length; i < value.length; i++) {\n              const wrapperClone = template.cloneNode(true) as HTMLElement;\n              let cloneMedia: HTMLElement = wrapperClone;\n              for (let j = indices.length - 1; j >= 0; j--) {\n                cloneMedia = cloneMedia.children[indices[j]] as HTMLElement;\n              }\n              cloneMedia.setAttribute(CLONE_ATTRIBUTE, '');\n              cloneMedia.removeAttribute('id');\n              if (wrapperClone !== cloneMedia) {\n                wrapperClone.setAttribute(CLONE_WRAPPER_ATTRIBUTE, '');\n              }\n              insertAfter.parentNode?.insertBefore(wrapperClone, insertAfter.nextSibling);\n              mediaEls.push(cloneMedia);\n              insertAfter = wrapperClone;\n            }\n          }\n          mediaEls.forEach((el, index) => {\n            const item = value[index];\n            if (item && typeof item === 'object') {\n              const url = (item as any).url as string | undefined;\n              const mime = (item as any).mime as string | undefined;\n              setMediaElement(el, url || null, mime);\n            } else {\n              setMediaElement(el, null);\n            }\n          });\n        } else {\n          matchedElements.forEach((element) => {\n            if (isMediaTarget(element)) {\n              const url = typeof value === 'object' && value !== null ? value.url : value;\n              const mime =\n                typeof value === 'object' && value !== null\n                  ? (value.mime as string | undefined)\n                  : undefined;\n              setMediaElement(element, url || null, mime);\n            } else {\n              element.textContent = value || '';\n            }\n          });\n        }\n\n        // Handle nested media asset fields (caption, alt, etc.)\n        // These are identified by model=plugin::upload.file in the source attribute\n        if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n          const allSourceElements = document.querySelectorAll(`[${SOURCE_ATTRIBUTE}]`);\n\n          allSourceElements.forEach((element) => {\n            const sourceAttr = element.getAttribute(SOURCE_ATTRIBUTE);\n            if (!sourceAttr) return;\n\n            // Parse the source attribute as URL search params\n            const params = new URLSearchParams(sourceAttr);\n            const model = params.get('model');\n            const elementPath = params.get('path');\n\n            // Only process media asset fields\n            if (model !== 'plugin::upload.file' || !elementPath) return;\n\n            // Check if this element's path starts with the field path (e.g., \"hero.caption\" starts with \"hero\")\n            if (elementPath.startsWith(`${field}.`)) {\n              // Extract the property name (e.g., \"caption\" from \"hero.caption\")\n              const propertyName = elementPath.slice(field.length + 1);\n              const propertyValue = value[propertyName];\n              if (element instanceof HTMLElement && propertyValue !== undefined) {\n                element.textContent = propertyValue || '';\n              }\n            }\n          });\n        }\n\n        // Update highlight dimensions since the new text content may affect them\n        highlightManager.updateAllHighlights();\n        return;\n      }\n\n      // The user focused a new input, update the highlights in the preview\n      if (event.data.type === INTERNAL_EVENTS.STRAPI_FIELD_FOCUS) {\n        const { field } = event.data.payload;\n        if (!field) return;\n\n        // Clear existing focused highlights\n        highlightManager.focusedHighlights.forEach((highlight: HTMLElement) => {\n          highlight.classList.remove('strapi-highlight-focused');\n        });\n        highlightManager.focusedHighlights.length = 0;\n\n        // Set new focused field and highlight matching groups\n        highlightManager.setFocusedField(field);\n        const matchingGroups = highlightManager.findGroupForPath(field);\n        matchingGroups.forEach((group, index) => {\n          if (index === 0) {\n            const first = group.elements.values().next().value;\n            first?.scrollIntoView({ behavior: 'smooth', block: 'center' });\n          }\n          group.highlight.classList.add('strapi-highlight-focused');\n          highlightManager.focusedHighlights.push(group.highlight);\n        });\n        return;\n      }\n\n      // The user is no longer focusing an input, remove the highlights\n      if (event.data.type === INTERNAL_EVENTS.STRAPI_FIELD_BLUR) {\n        const { field } = event.data.payload;\n        if (field !== highlightManager.getFocusedField()) return;\n\n        highlightManager.focusedHighlights.forEach((highlight: HTMLElement) => {\n          highlight.classList.remove('strapi-highlight-focused');\n        });\n        highlightManager.focusedHighlights.length = 0;\n        highlightManager.setFocusedField(null);\n      }\n    };\n\n    window.addEventListener('message', handleMessage);\n\n    // Add the message handler to the cleanup list\n    const messageEventListener = {\n      element: window,\n      type: 'message' as keyof HTMLElementEventMap,\n      handler: handleMessage as EventListener,\n    };\n\n    return [...highlightManager.eventListeners, messageEventListener];\n  };\n\n  const createCleanupSystem = (\n    overlay: HTMLElement,\n    observers: ReturnType<typeof setupObservers>,\n    scrollManager: ReturnType<typeof setupScrollManagement>,\n    eventHandlers: EventListenersList,\n    highlightManager: HighlightManager\n  ) => {\n    window.__strapi_previewCleanup = () => {\n      observers.resizeObserver.disconnect();\n      observers.highlightObserver.disconnect();\n      observers.stegaObserver?.disconnect();\n\n      // Clean up scroll listeners\n      scrollManager.cleanup();\n\n      // Clear all pending click timeouts\n      highlightManager.clearAllPendingClicks();\n\n      // Remove highlight event listeners\n      eventHandlers.forEach(({ element, type, handler }) => {\n        element.removeEventListener(type, handler);\n      });\n\n      // Clean up CSS styles\n      const existingStyles = document.getElementById(HIGHLIGHT_STYLES_ID);\n      if (existingStyles) {\n        existingStyles.remove();\n      }\n\n      overlay.remove();\n    };\n  };\n\n  /* -----------------------------------------------------------------------------------------------\n   * Orchestration\n   * ---------------------------------------------------------------------------------------------*/\n\n  setupStegaDOMObserver().then((stegaObserver) => {\n    createHighlightStyles();\n    const overlay = createOverlaySystem();\n    const highlightManager = createHighlightManager(overlay);\n    const observers = setupObservers(highlightManager, stegaObserver);\n    const scrollManager = setupScrollManagement(highlightManager);\n    const eventHandlers = setupEventHandlers(highlightManager);\n    createCleanupSystem(overlay, observers, scrollManager, eventHandlers, highlightManager);\n  });\n};\n\nexport { previewScript };\n"],"names":["previewScript","config","shouldRun","colors","HIGHLIGHT_PADDING","HIGHLIGHT_HOVER_COLOR","window","STRAPI_HIGHLIGHT_HOVER_COLOR","highlightHoverColor","HIGHLIGHT_ACTIVE_COLOR","STRAPI_HIGHLIGHT_ACTIVE_COLOR","highlightActiveColor","HIGHLIGHT_STYLES_ID","DOUBLE_CLICK_TIMEOUT","DISABLE_STEGA_DECODING","STRAPI_DISABLE_STEGA_DECODING","SOURCE_ATTRIBUTE","OVERLAY_ID","INTERNAL_EVENTS","STRAPI_FIELD_FOCUS","STRAPI_FIELD_BLUR","STRAPI_FIELD_CHANGE","STRAPI_FIELD_FOCUS_INTENT","STRAPI_FIELD_SINGLE_CLICK_HINT","sendMessage","type","payload","parent","postMessage","getElementsByPath","path","document","querySelectorAll","isMediaElement","element","tagName","originalToInjection","Map","injectionToOriginal","trackInjection","original","injection","set","untrackInjection","get","delete","PLACEHOLDER_ATTRIBUTE","CLONE_ATTRIBUTE","CLONE_WRAPPER_ATTRIBUTE","createMediaPlaceholder","sourceAttr","rect","placeholder","createElement","setAttribute","width","height","style","cssText","resolveMediaUrl","originalEl","rawUrl","test","startsWith","currentSrc","getAttribute","currentUrl","URL","location","href","origin","getMediaFilename","raw","decoded","decodeURIComponent","match","toLowerCase","getFieldPathForMedia","has","params","URLSearchParams","elementPath","parentPath","split","slice","join","toString","setupStegaDOMObserver","vercelStegaDecode","stegaDecode","vercelStegaClean","stegaClean","applyStegaToElement","src","result","sourceValue","strapiSource","pathMatch","originalPath","mediaPath","replace","newSource","cleanedSrc","error","directTextNodes","Array","from","childNodes","filter","node","nodeType","Node","TEXT_NODE","directTextContent","map","textContent","forEach","cleanedText","allElements","observer","MutationObserver","mutations","mutation","addedNodes","ELEMENT_NODE","childElements","target","parentElement","attributeName","observe","childList","subtree","characterData","attributes","attributeFilter","createHighlightStyles","existingStyles","getElementById","remove","styleElement","id","head","appendChild","createOverlaySystem","__strapi_previewCleanup","overlay","body","createHighlightManager","groups","elementToGroupKey","eventListeners","focusedHighlights","pendingClicks","focusedField","computeGroupRect","group","minLeft","Infinity","minTop","maxRight","maxBottom","any","elements","el","r","getBoundingClientRect","left","top","right","bottom","drawGroup","highlight","display","transform","updateAllHighlights","pickElementAtPoint","x","y","first","values","next","value","createGroup","groupKey","className","Set","clickHandler","event","__strapi_redispatched","preventDefault","stopPropagation","existingTimeout","clearTimeout","timeout","setTimeout","underlying","clientX","clientY","targetElement","hasAttribute","newEvent","MouseEvent","bubbles","cancelable","view","detail","button","buttons","ctrlKey","altKey","shiftKey","metaKey","dispatchEvent","doubleClickHandler","anchor","sourceAttribute","position","mouseDownHandler","addEventListener","push","handler","destroyGroup","pendingTimeout","focusedIndex","indexOf","splice","listenersToRemove","listener","removeEventListener","length","createHighlightForElement","ghostInjections","ghostPlaceholders","ghostClones","orig","wrapper","closest","clone","add","removeHighlightForElement","size","findGroupForPath","matched","key","initialElements","HTMLElement","keys","setFocusedField","field","getFocusedField","clearAllPendingClicks","clear","setupScrollManagement","highlightManager","updateOnScroll","scrollableElements","computedStyle","getComputedStyle","overflow","overflowX","overflowY","includes","cleanup","setupObservers","stegaObserver","resizeObserver","ResizeObserver","observeElementForResize","documentElement","highlightObserver","elementsWithSource","childElement","removedNodes","contains","setupEventHandlers","setMediaElement","url","mime","removeInjection","visibleEl","removeAttribute","parentNode","insertBefore","nextSibling","desiredTag","active","newFilename","currentFilename","tagAlreadyMatches","resolvedUrl","newInjection","isAudio","skipForAudio","attr","name","handleMessage","data","matchedElements","isMediaTarget","isArray","mediaEls","lastEl","indices","template","SIBLING_LAYOUTS","MAX_DEPTH","depth","prototype","call","children","insertAfter","i","wrapperClone","cloneNode","cloneMedia","j","index","item","undefined","allSourceElements","model","propertyName","propertyValue","classList","matchingGroups","scrollIntoView","behavior","block","messageEventListener","createCleanupSystem","observers","scrollManager","eventHandlers","disconnect","then"],"mappings":"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"}