JezK
Edit File: promotion-widget.js.map
{"version":3,"file":"promotion-widget.js","mappings":"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","sources":["webpack://header-footer-elementor/webpack/bootstrap","webpack://header-footer-elementor/webpack/runtime/compat get default export","webpack://header-footer-elementor/webpack/runtime/define property getters","webpack://header-footer-elementor/webpack/runtime/hasOwnProperty shorthand","webpack://header-footer-elementor/external window [\"wp\",\"domReady\"]","webpack://header-footer-elementor/external window [\"wp\",\"element\"]","webpack://header-footer-elementor/./src/Components/PromotionWidget.jsx","webpack://header-footer-elementor/./src/promotion-widget.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","const __WEBPACK_NAMESPACE_OBJECT__ = window[\"wp\"][\"domReady\"];","const __WEBPACK_NAMESPACE_OBJECT__ = window[\"wp\"][\"element\"];","import { useEffect } from '@wordpress/element';\n\nconst PromotionWidget = () => {\n useEffect(() => {\n // Global variables to track state\n let lastClickedWidgetType = null;\n let continuousCheckInterval = null;\n let searchObserver = null;\n\n // This script runs in the Elementor editor window, where `parent` is\n // normally the window itself. When the editor is embedded in a frame\n // from another origin, reading any property of `parent` throws a\n // SecurityError — `typeof` does not guard against that, because the\n // error is raised while evaluating the property access. So probe the\n // parent once and fall back to our own window when it is unreachable.\n const getEditorWindow = () => {\n try {\n if (window.parent && window.parent !== window) {\n // The access itself is the cross-origin test.\n void window.parent.document;\n return window.parent;\n }\n } catch (e) {\n // Cross-origin parent — stay in the current window.\n }\n\n return window;\n };\n\n const editorWindow = getEditorWindow();\n const editorDocument = editorWindow.document;\n\n // Function to customize the promotion dialog\n const customizePromotionDialog = (forceUaeWidget = false) => {\n const dialog = editorDocument.querySelector('#elementor-element--promotion__dialog');\n if (!dialog) return false;\n \n const defaultBtn = dialog.querySelector('.dialog-buttons-action:not(.uae-upgrade-button)');\n if (!defaultBtn) return false;\n \n // Always show our button in search results or if forced\n const shouldShowUaeButton = forceUaeWidget || lastClickedWidgetType === 'uae';\n \n // Clean up any previous custom buttons to avoid duplicates\n const existingCustomBtns = dialog.querySelectorAll('.uae-upgrade-button');\n existingCustomBtns.forEach(btn => btn.remove());\n \n if (shouldShowUaeButton) {\n // Hide the default button\n defaultBtn.style.display = 'none';\n \n // Create our custom button\n const button = document.createElement('a');\n button.textContent = 'Upgrade Now';\n \n // Get widget name from the dialog title\n const dialogTitle = dialog.querySelector('.dialog-header');\n let widgetTitle = 'widget';\n \n if (dialogTitle && dialogTitle.textContent) {\n widgetTitle = dialogTitle.textContent.trim().toLowerCase().replace(/\\s+/g, '-');\n }\n \n // Set href with dynamic widget title in utm_medium\n button.setAttribute('href', `https://ultimateelementor.com/pricing/?utm_source=plugin-editor&utm_medium=${widgetTitle}-promo&utm_campaign=uae-upgrade`);\n button.setAttribute('target', '_blank');\n button.classList.add(\n 'dialog-button', \n 'dialog-action', \n 'dialog-buttons-action', \n 'elementor-button', \n 'go-pro', \n 'elementor-button-success', \n 'uae-upgrade-button'\n );\n \n // Insert our button\n defaultBtn.insertAdjacentElement('afterend', button);\n \n // Add event listener to prevent default behavior\n button.addEventListener('click', (e) => {\n e.stopPropagation();\n });\n \n // Mark the dialog as customized\n dialog.setAttribute('data-uae-customized', 'true');\n \n return true;\n } else {\n // Not our widget, make sure default button is visible\n defaultBtn.style.display = '';\n dialog.removeAttribute('data-uae-customized');\n return true;\n }\n };\n \n // Function to check if a widget is a UAE widget\n const isUaeWidget = (widget) => {\n if (!widget) return false;\n \n // Check if it has the hfe class in the icon\n const icon = widget.querySelector('.icon > i');\n const hasHfeClass = icon && icon.className.includes('hfe');\n \n // Check if it's in our category\n const isInUaeCategory = widget.closest('#elementor-panel-category-hfe-widgets') !== null;\n \n return hasHfeClass || isInUaeCategory;\n };\n \n // Function to start continuous checking for dialog changes\n const startContinuousCheck = () => {\n // Clear any existing interval\n if (continuousCheckInterval) {\n clearInterval(continuousCheckInterval);\n }\n \n // Set up a new interval to check every 100ms\n continuousCheckInterval = setInterval(() => {\n const dialog = editorDocument.querySelector('#elementor-element--promotion__dialog');\n if (!dialog) return;\n \n if (lastClickedWidgetType === 'uae') {\n const defaultBtn = dialog.querySelector('.dialog-buttons-action:not(.uae-upgrade-button)');\n const customBtn = dialog.querySelector('.uae-upgrade-button');\n \n // If default button is visible or our button is missing, fix it\n if ((defaultBtn && defaultBtn.style.display !== 'none') || !customBtn) {\n customizePromotionDialog(true);\n }\n }\n }, 100);\n \n // Safety timeout to stop checking after 10 seconds\n setTimeout(() => {\n if (continuousCheckInterval) {\n clearInterval(continuousCheckInterval);\n continuousCheckInterval = null;\n }\n }, 10000);\n };\n \n // Own promotion card, shown when Elementor renders no promotion UI at all\n // (its promotions module is disabled while Elementor Pro is active).\n const UAE_FALLBACK_CARD_ID = 'uae-widget-promotion-fallback';\n\n const removeFallbackCard = () => {\n const existing = editorDocument.getElementById(UAE_FALLBACK_CARD_ID);\n if (existing) {\n existing.remove();\n }\n editorDocument.removeEventListener('mousedown', handleFallbackCardOutsideClick, true);\n };\n\n const handleFallbackCardOutsideClick = (event) => {\n const card = editorDocument.getElementById(UAE_FALLBACK_CARD_ID);\n if (card && !card.contains(event.target)) {\n removeFallbackCard();\n }\n };\n\n const showFallbackCard = (detail, upgradeUrl) => {\n removeFallbackCard();\n\n const widgetTitle = (detail.widgetTitle || '').trim();\n const promoData = (editorWindow.elementor?.config?.v4Promotions || {})[detail.widgetType] || {};\n const title = promoData.title || `${widgetTitle} Widget`.trim();\n const content = promoData.content || `Use ${widgetTitle} widget and other UAE Pro features to extend your toolbox with more control and flexibility.`;\n\n const doc = editorDocument;\n const card = doc.createElement('div');\n card.id = UAE_FALLBACK_CARD_ID;\n // Mirrors the MUI WidgetPromotionCard rendered by e-react-promotions.\n card.style.cssText = [\n 'position:fixed',\n 'width:296px',\n 'z-index:99999',\n 'background:var(--e-a-bg-default, #fff)',\n 'color:var(--e-a-color-txt, #515962)',\n 'border-radius:8px',\n 'box-shadow:0 5px 5px -3px rgba(0,0,0,.2), 0 8px 10px 1px rgba(0,0,0,.14), 0 3px 14px 2px rgba(0,0,0,.12)',\n 'font-family:Roboto,Arial,Helvetica,sans-serif',\n 'font-size:13px',\n 'line-height:1.5',\n ].join(';');\n\n const header = doc.createElement('div');\n header.style.cssText = 'display:flex;align-items:center;justify-content:space-between;padding:8px 16px 0;';\n\n const titleEl = doc.createElement('div');\n titleEl.textContent = title;\n titleEl.style.cssText = 'font-weight:600;font-size:14px;line-height:22px;color:var(--e-a-color-txt-accent, #0c0d0e);';\n\n const closeBtn = doc.createElement('button');\n closeBtn.type = 'button';\n closeBtn.setAttribute('aria-label', 'Close');\n closeBtn.innerHTML = '<i class=\"eicon-close\" aria-hidden=\"true\"></i>';\n closeBtn.style.cssText = 'background:none;border:none;cursor:pointer;font-size:14px;line-height:1;padding:6px;margin-inline-end:-6px;color:var(--e-a-color-txt, #515962);';\n closeBtn.addEventListener('click', removeFallbackCard);\n\n header.append(titleEl, closeBtn);\n\n const contentEl = doc.createElement('div');\n contentEl.textContent = content;\n contentEl.style.cssText = 'padding:12px 16px 8px;font-size:13px;color:var(--e-a-color-txt, #515962);';\n\n const footer = doc.createElement('div');\n footer.style.cssText = 'display:flex;justify-content:flex-end;padding:8px 16px 12px;';\n\n const cta = doc.createElement('a');\n cta.innerHTML = '<i class=\"eicon-pro-icon\" aria-hidden=\"true\" style=\"font-size:14px;\"></i>';\n cta.appendChild(doc.createTextNode(promoData.ctaText || 'Upgrade Now'));\n cta.setAttribute('href', promoData.ctaUrl || upgradeUrl);\n cta.setAttribute('target', '_blank');\n cta.setAttribute('rel', 'noopener noreferrer');\n cta.style.cssText = 'display:inline-flex;align-items:center;gap:6px;background:#93003f;color:#fff;padding:6px 12px;border-radius:6px;text-decoration:none;font-size:13px;font-weight:500;line-height:1.6;';\n cta.addEventListener('mouseenter', () => { cta.style.background = '#7a0034'; });\n cta.addEventListener('mouseleave', () => { cta.style.background = '#93003f'; });\n\n footer.appendChild(cta);\n card.append(header, contentEl, footer);\n doc.body.appendChild(card);\n\n // Position next to the clicked panel widget, clamped to the viewport.\n const rect = detail.target?.getBoundingClientRect?.();\n const win = editorWindow;\n const left = rect ? Math.min(rect.right + 10, win.innerWidth - card.offsetWidth - 10) : 260;\n const top = rect ? Math.min(rect.top, win.innerHeight - card.offsetHeight - 10) : 100;\n card.style.left = `${Math.max(left, 10)}px`;\n card.style.top = `${Math.max(top, 10)}px`;\n\n editorDocument.addEventListener('mousedown', handleFallbackCardOutsideClick, true);\n };\n\n // Fallback for Elementor 4.x: the pro-widget promotion renders as a React\n // card (.e-widget-promotion-wrapper) whose CTA comes from the v4Promotions\n // config injected in PHP. If that injection didn't apply, rewrite the CTA\n // link on the mounted card. If no card mounts at all (Elementor Pro active,\n // promotions module disabled), render our own fallback card.\n const handleWidgetPromotionOpen = (event) => {\n const detail = event.detail || {};\n const widgetType = detail.widgetType || '';\n\n if (!widgetType.startsWith('uael-')) return;\n\n const slug = (detail.widgetTitle || widgetType.replace('uael-', ''))\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, '-');\n const upgradeUrl = `https://ultimateelementor.com/pricing/?utm_source=plugin-editor&utm_medium=${slug}-promo&utm_campaign=uae-upgrade`;\n\n // Elementor's card mounts synchronously with this event; give it a\n // beat, then take over if nothing rendered.\n setTimeout(() => {\n if (!editorDocument.querySelector('.e-widget-promotion-wrapper')) {\n showFallbackCard(detail, upgradeUrl);\n }\n }, 150);\n\n // The card content renders asynchronously after mount — retry briefly.\n const delays = [50, 150, 300, 600, 1200];\n delays.forEach(delay => {\n setTimeout(() => {\n const wrappers = editorDocument.querySelectorAll('.e-widget-promotion-wrapper');\n wrappers.forEach(wrapper => {\n const cta = wrapper.querySelector('a[href*=\"go.elementor.com\"]');\n if (cta) {\n cta.setAttribute('href', upgradeUrl);\n }\n });\n }, delay);\n });\n };\n\n // Handle clicks on promotion widgets\n const handleProWidgetClick = (e) => {\n // Find the clicked promotion widget\n let clickedWidget = null;\n const allProWidgets = editorDocument.querySelectorAll('.elementor-element--promotion');\n \n for (let i = 0; i < allProWidgets.length; i++) {\n if (allProWidgets[i].contains(e.target)) {\n clickedWidget = allProWidgets[i];\n break;\n }\n }\n \n if (!clickedWidget) return;\n \n // Check if it's our widget\n const isUae = isUaeWidget(clickedWidget);\n \n // Update the last clicked widget type\n lastClickedWidgetType = isUae ? 'uae' : 'other';\n \n // Start continuous checking for dialog changes\n startContinuousCheck();\n \n // Also set up multiple immediate checks with increasing delays\n const delays = [10, 30, 50, 100, 200, 300, 500, 1000, 1500, 2000];\n delays.forEach(delay => {\n setTimeout(() => {\n const dialog = editorDocument.querySelector('#elementor-element--promotion__dialog');\n if (dialog) {\n customizePromotionDialog(isUae);\n }\n }, delay);\n });\n };\n \n // Create a mutation observer to watch for dialog changes\n const createDialogObserver = () => {\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n // Look for added nodes that might be the dialog\n if (mutation.addedNodes.length) {\n for (const node of mutation.addedNodes) {\n if (node.id === 'elementor-element--promotion__dialog') {\n // Dialog was just added, customize it\n customizePromotionDialog(lastClickedWidgetType === 'uae');\n startContinuousCheck();\n }\n }\n }\n \n // Also check for attribute changes on the dialog\n if (mutation.type === 'attributes' && \n mutation.target.id === 'elementor-element--promotion__dialog') {\n if (lastClickedWidgetType === 'uae') {\n customizePromotionDialog(true);\n }\n }\n }\n \n // Always check if dialog exists and needs customization\n const dialog = editorDocument.querySelector('#elementor-element--promotion__dialog');\n if (dialog && lastClickedWidgetType === 'uae') {\n const defaultBtn = dialog.querySelector('.dialog-buttons-action:not(.uae-upgrade-button)');\n const customBtn = dialog.querySelector('.uae-upgrade-button');\n \n // If default button is visible or our button is missing, fix it\n if ((defaultBtn && defaultBtn.style.display !== 'none') || !customBtn) {\n customizePromotionDialog(true);\n }\n }\n });\n \n // Observe the body for changes\n if (editorDocument.body) {\n observer.observe(editorDocument.body, { \n childList: true, \n subtree: true,\n attributes: true,\n attributeFilter: ['style', 'class', 'id']\n });\n }\n \n return observer;\n };\n \n // Special function to handle search results\n const setupSearchResultsHandler = () => {\n // If we already have an observer, disconnect it\n if (searchObserver) {\n searchObserver.disconnect();\n searchObserver = null;\n }\n \n // Create a new observer specifically for search results\n searchObserver = new MutationObserver((mutations) => {\n // Check if search results are visible\n const searchWrapper = editorDocument.querySelector('#elementor-panel-elements-search-wrapper');\n if (!searchWrapper) return;\n \n // Process all promotion widgets in search results\n const searchPromoWidgets = searchWrapper.querySelectorAll('.elementor-element--promotion');\n if (searchPromoWidgets.length === 0) return;\n \n // Add click handlers to all promotion widgets in search results\n searchPromoWidgets.forEach(widget => {\n // Remove any existing click handlers\n widget.removeEventListener('click', handleSearchWidgetClick);\n \n // Add our click handler\n widget.addEventListener('click', handleSearchWidgetClick);\n \n // Mark this widget as processed\n widget.setAttribute('data-uae-processed', 'true');\n });\n });\n \n // Observe the panel for changes\n const panelElements = editorDocument.querySelector('#elementor-panel-elements');\n if (panelElements) {\n searchObserver.observe(panelElements, {\n childList: true,\n subtree: true,\n attributes: false\n });\n }\n \n // Also observe the search input\n const searchInput = editorDocument.querySelector('#elementor-panel-elements-search-input');\n if (searchInput) {\n // Add input event listener\n searchInput.addEventListener('input', handleSearchInput);\n }\n };\n \n // Handle search input changes\n const handleSearchInput = () => {\n // Wait a bit for search results to render\n setTimeout(() => {\n const searchWrapper = editorDocument.querySelector('#elementor-panel-elements-search-wrapper');\n if (!searchWrapper) return;\n \n const searchPromoWidgets = searchWrapper.querySelectorAll('.elementor-element--promotion');\n \n searchPromoWidgets.forEach(widget => {\n // Remove any existing click handlers\n widget.removeEventListener('click', handleSearchWidgetClick);\n \n // Add our click handler\n widget.addEventListener('click', handleSearchWidgetClick);\n \n // Mark this widget as processed\n widget.setAttribute('data-uae-processed', 'true');\n });\n }, 300);\n };\n \n // Handle clicks on widgets in search results\n const handleSearchWidgetClick = (e) => {\n \n // Set all widgets in search results to be treated as UAE widgets\n lastClickedWidgetType = 'uae';\n \n // Start continuous checking\n startContinuousCheck();\n \n // Set up immediate checks with increasing delays\n const delays = [10, 30, 50, 100, 200, 300, 500, 1000];\n delays.forEach(delay => {\n setTimeout(() => {\n const dialog = editorDocument.querySelector('#elementor-element--promotion__dialog');\n if (dialog) {\n customizePromotionDialog(true);\n }\n }, delay);\n });\n \n // Don't stop propagation - we want the dialog to open\n };\n \n // Initialize everything\n const initProWidgets = () => {\n if (!editorDocument) return;\n \n // Remove any existing event listeners to prevent duplicates\n editorDocument.removeEventListener('mousedown', handleProWidgetClick, true);\n editorDocument.removeEventListener('widget-promotion:open', handleWidgetPromotionOpen);\n\n // Add our event listener with capture phase to ensure it runs first\n editorDocument.addEventListener('mousedown', handleProWidgetClick, true);\n\n // Elementor 4.x promotion card (dispatched instead of the legacy dialog)\n editorDocument.addEventListener('widget-promotion:open', handleWidgetPromotionOpen);\n \n // Set up search results handler\n setupSearchResultsHandler();\n \n // Create the observer\n const observer = createDialogObserver();\n \n // Check if dialog already exists\n const existingDialog = editorDocument.querySelector('#elementor-element--promotion__dialog');\n if (existingDialog) {\n customizePromotionDialog();\n }\n \n return observer;\n };\n \n // Initialize when Elementor is ready\n let observer = null;\n if (window.elementor) {\n elementor.on('preview:loaded', () => {\n observer = initProWidgets();\n });\n } else {\n window.addEventListener('elementor/frontend/init', () => {\n observer = initProWidgets();\n });\n }\n \n // Cleanup function\n return () => {\n if (continuousCheckInterval) {\n clearInterval(continuousCheckInterval);\n }\n \n if (observer) {\n observer.disconnect();\n }\n \n if (searchObserver) {\n searchObserver.disconnect();\n }\n \n if (editorDocument) {\n editorDocument.removeEventListener('mousedown', handleProWidgetClick, true);\n editorDocument.removeEventListener('widget-promotion:open', handleWidgetPromotionOpen);\n removeFallbackCard();\n \n // Remove search input event listeners\n const searchInput = editorDocument.querySelector('#elementor-panel-elements-search-input');\n if (searchInput) {\n searchInput.removeEventListener('input', handleSearchInput);\n }\n \n // Remove click handlers from search widgets\n const searchPromoWidgets = editorDocument.querySelectorAll('#elementor-panel-elements-search-wrapper .elementor-element--promotion');\n searchPromoWidgets.forEach(widget => {\n widget.removeEventListener('click', handleSearchWidgetClick);\n });\n }\n \n if (window.elementor && elementor.off) {\n elementor.off('preview:loaded', initProWidgets);\n } else {\n window.removeEventListener('elementor/frontend/init', initProWidgets);\n }\n };\n }, []);\n\n return null;\n};\n\nexport default PromotionWidget;\n","import domReady from '@wordpress/dom-ready';\nimport { render } from '@wordpress/element';\nimport PromotionWidget from './Components/PromotionWidget';\n\ndomReady(() => {\n const container = document.createElement('div');\n document.body.appendChild(container);\n render(<PromotionWidget />, container);\n});\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","window","useEffect","lastClickedWidgetType","continuousCheckInterval","searchObserver","editorWindow","parent","document","e","getEditorWindow","editorDocument","customizePromotionDialog","forceUaeWidget","arguments","length","undefined","dialog","querySelector","defaultBtn","shouldShowUaeButton","querySelectorAll","forEach","btn","remove","style","display","button","createElement","textContent","dialogTitle","widgetTitle","trim","toLowerCase","replace","setAttribute","concat","classList","add","insertAdjacentElement","addEventListener","stopPropagation","removeAttribute","startContinuousCheck","clearInterval","setInterval","customBtn","setTimeout","UAE_FALLBACK_CARD_ID","removeFallbackCard","existing","getElementById","removeEventListener","handleFallbackCardOutsideClick","event","card","contains","target","handleWidgetPromotionOpen","detail","widgetType","startsWith","slug","upgradeUrl","_editorWindow$element","_detail$target","_detail$target$getBou","promoData","elementor","config","v4Promotions","title","content","doc","id","cssText","join","header","titleEl","closeBtn","type","innerHTML","append","contentEl","footer","cta","appendChild","createTextNode","ctaText","ctaUrl","background","body","rect","getBoundingClientRect","win","left","Math","min","right","innerWidth","offsetWidth","top","innerHeight","offsetHeight","max","showFallbackCard","delay","wrapper","handleProWidgetClick","clickedWidget","allProWidgets","i","isUae","widget","icon","hasHfeClass","className","includes","isInUaeCategory","closest","isUaeWidget","handleSearchInput","searchWrapper","handleSearchWidgetClick","initProWidgets","disconnect","MutationObserver","mutations","searchPromoWidgets","panelElements","observe","childList","subtree","attributes","searchInput","setupSearchResultsHandler","observer","_step","_iterator","_createForOfIteratorHelper","s","n","done","mutation","value","addedNodes","_step2","_iterator2","err","f","attributeFilter","createDialogObserver","on","off","domReady","container","render","React","PromotionWidget"],"sourceRoot":""}