/*
 * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
 * This devtool is neither made for production nor for readable output files.
 * It uses "eval()" calls to create a separate source file in the browser devtools.
 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
 * or disable the default devtool with "devtool: false".
 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
 */
/******/ (() => { // webpackBootstrap
/******/ 	"use strict";
/******/ 	var __webpack_modules__ = ({

/***/ "./packages/extensions/image-parallax/init-frontend.js"
/*!*************************************************************************!*\
  !*** ./packages/extensions/image-parallax/init-frontend.js + 8 modules ***!
  \*************************************************************************/
() {

eval("{\n;// ./packages/extensions/image-parallax/image-parallax.scss\n// extracted by mini-css-extract-plugin\n\n;// ./node_modules/simple-parallax-js/dist/vanilla/simpleParallaxVanilla.es.js\nconst h = (i) => NodeList.prototype.isPrototypeOf(i) || HTMLCollection.prototype.isPrototypeOf(i) ? Array.from(i) : typeof i == \"string\" || i instanceof String ? document.querySelectorAll(i) : [i], d = () => Element.prototype.closest && \"IntersectionObserver\" in window;\nclass c {\n  constructor() {\n    this.positions = {\n      top: 0,\n      bottom: 0,\n      height: 0\n    };\n  }\n  setViewportTop(t) {\n    return this.positions.top = t ? t.scrollTop : window.pageYOffset, this.positions;\n  }\n  setViewportBottom() {\n    return this.positions.bottom = this.positions.top + this.positions.height, this.positions;\n  }\n  setViewportAll(t) {\n    return this.positions.top = t ? t.scrollTop : window.pageYOffset, this.positions.height = t ? t.clientHeight : document.documentElement.clientHeight, this.positions.bottom = this.positions.top + this.positions.height, this.positions;\n  }\n}\nconst s = new c(), m = () => {\n  const i = \"transform webkitTransform mozTransform oTransform msTransform\".split(\" \");\n  let t, e = 0;\n  for (; t === void 0; )\n    t = document.createElement(\"div\").style[i[e]] !== void 0 ? i[e] : void 0, e += 1;\n  return t;\n}, r = m(), p = (i) => i.tagName.toLowerCase() !== \"img\" && i.tagName.toLowerCase() !== \"picture\" ? !0 : !(!i || !i.complete || typeof i.naturalWidth < \"u\" && i.naturalWidth === 0);\nclass f {\n  constructor(t, e, n = !1) {\n    this.element = t, this.elementContainer = t, this.settings = e, this.isVisible = !0, this.isInit = !1, this.oldTranslateValue = -1, this.prefersReducedMotion = n, this.init = this.init.bind(this), this.customWrapper = this.settings.customWrapper && this.element.closest(this.settings.customWrapper) ? this.element.closest(this.settings.customWrapper) : null, !this.prefersReducedMotion && (p(t) ? this.init() : this.element.addEventListener(\"load\", () => {\n      setTimeout(() => {\n        this.init(!0);\n      }, 50);\n    }));\n  }\n  init(t) {\n    this.prefersReducedMotion || this.isInit || (t && (this.rangeMax = null), !this.element.closest(\".simpleParallax\") && (this.settings.overflow === !1 && this.wrapElement(this.element), this.setTransformCSS(), this.getElementOffset(), this.intersectionObserver(), this.getTranslateValue(), this.animate(), this.settings.delay > 0 ? setTimeout(() => {\n      this.setTransitionCSS(), this.elementContainer.classList.add(\"simple-parallax-initialized\");\n    }, 10) : this.elementContainer.classList.add(\"simple-parallax-initialized\"), this.isInit = !0));\n  }\n  // if overflow option is set to false\n  // wrap the element into a .simpleParallax div and apply overflow hidden to hide the image excedant (result of the scale)\n  wrapElement() {\n    const t = this.element.closest(\"picture\") || this.element;\n    let e = this.customWrapper || document.createElement(\"div\");\n    e.classList.add(\"simpleParallax\"), e.style.overflow = \"hidden\", this.customWrapper || (t.parentNode.insertBefore(e, t), e.appendChild(t)), this.elementContainer = e;\n  }\n  // unwrap the element from .simpleParallax wrapper container\n  unWrapElement() {\n    const t = this.elementContainer;\n    this.customWrapper ? (t.classList.remove(\"simpleParallax\"), t.style.overflow = \"\") : t.replaceWith(...t.childNodes);\n  }\n  // apply default style on element\n  setTransformCSS() {\n    this.settings.overflow === !1 && (this.element.style[r] = `scale(${this.settings.scale})`), this.element.style.willChange = \"transform\";\n  }\n  // apply the transition effect\n  setTransitionCSS() {\n    this.element.style.transition = `transform ${this.settings.delay}s ${this.settings.transition}`;\n  }\n  // remove style of the element\n  unSetStyle() {\n    this.element.style.willChange = \"\", this.element.style[r] = \"\", this.element.style.transition = \"\";\n  }\n  // get the current element offset\n  getElementOffset() {\n    const t = this.elementContainer.getBoundingClientRect();\n    if (this.elementHeight = t.height, this.elementTop = t.top + s.positions.top, this.settings.customContainer) {\n      const e = this.settings.customContainer.getBoundingClientRect();\n      this.elementTop = t.top - e.top + s.positions.top;\n    }\n    this.elementBottom = this.elementHeight + this.elementTop;\n  }\n  // build the Threshold array to cater change for every pixel scrolled\n  buildThresholdList() {\n    const t = [];\n    for (let e = 1; e <= this.elementHeight; e++) {\n      const n = e / this.elementHeight;\n      t.push(n);\n    }\n    return t;\n  }\n  // create the Intersection Observer\n  intersectionObserver() {\n    const t = {\n      root: null,\n      threshold: this.buildThresholdList()\n    };\n    this.observer = new IntersectionObserver(\n      this.intersectionObserverCallback.bind(this),\n      t\n    ), this.observer.observe(this.element);\n  }\n  // Intersection Observer Callback to set the element at visible state or not\n  intersectionObserverCallback(t) {\n    t.forEach((e) => {\n      e.isIntersecting ? this.isVisible = !0 : this.isVisible = !1;\n    });\n  }\n  // check if the current element is visible in the Viewport\n  // for browser that not support Intersection Observer API\n  checkIfVisible() {\n    return this.elementBottom > s.positions.top && this.elementTop < s.positions.bottom;\n  }\n  // calculate the range between image will be translated\n  getRangeMax() {\n    const t = this.element.clientHeight;\n    this.rangeMax = t * this.settings.scale - t;\n  }\n  // get the percentage and the translate value to apply on the element\n  getTranslateValue() {\n    let t = ((s.positions.bottom - this.elementTop) / ((s.positions.height + this.elementHeight) / 100)).toFixed(1);\n    return t = Math.min(100, Math.max(0, t)), this.settings.maxTransition !== 0 && t > this.settings.maxTransition && (t = this.settings.maxTransition), this.oldPercentage === t || (this.rangeMax || this.getRangeMax(), this.translateValue = (t / 100 * this.rangeMax - this.rangeMax / 2).toFixed(0), this.oldTranslateValue === this.translateValue) ? !1 : (this.oldPercentage = t, this.oldTranslateValue = this.translateValue, !0);\n  }\n  // animate the image\n  animate() {\n    let t = 0, e = 0, n;\n    (this.settings.orientation.includes(\"left\") || this.settings.orientation.includes(\"right\")) && (e = `${this.settings.orientation.includes(\"left\") ? this.translateValue * -1 : this.translateValue}px`), (this.settings.orientation.includes(\"up\") || this.settings.orientation.includes(\"down\")) && (t = `${this.settings.orientation.includes(\"up\") ? this.translateValue * -1 : this.translateValue}px`), this.settings.overflow === !1 ? n = `translate3d(${e}, ${t}, 0) scale(${this.settings.scale})` : n = `translate3d(${e}, ${t}, 0)`, this.element.style[r] = n;\n  }\n}\nlet a = !1, o = [], l, u;\nclass g {\n  constructor(t, e) {\n    t && d() && (this.prefersReducedMotion = window.matchMedia(\n      \"(prefers-reduced-motion: reduce)\"\n    ).matches, this.reducedMotionMediaQuery = window.matchMedia(\n      \"(prefers-reduced-motion: reduce)\"\n    ), this.handleReducedMotionChange = this.handleReducedMotionChange.bind(this), this.reducedMotionMediaQuery.addEventListener(\n      \"change\",\n      this.handleReducedMotionChange\n    ), !this.prefersReducedMotion && (this.elements = h(t), this.defaults = {\n      delay: 0,\n      orientation: \"up\",\n      scale: 1.3,\n      overflow: !1,\n      transition: \"cubic-bezier(0,0,0,1)\",\n      customContainer: \"\",\n      customWrapper: \"\",\n      maxTransition: 0\n    }, this.settings = Object.assign(this.defaults, e), this.settings.customContainer && ([this.customContainer] = h(this.settings.customContainer)), this.lastPosition = -1, this.resizeIsDone = this.resizeIsDone.bind(this), this.refresh = this.refresh.bind(this), this.proceedRequestAnimationFrame = this.proceedRequestAnimationFrame.bind(this), this.init()));\n  }\n  // Handle changes to reduced motion preference\n  handleReducedMotionChange(t) {\n    this.prefersReducedMotion = t.matches, this.prefersReducedMotion ? this.destroy() : this.init();\n  }\n  init() {\n    this.prefersReducedMotion || (s.setViewportAll(this.customContainer), o = [\n      ...this.elements.map(\n        (t) => new f(\n          t,\n          this.settings,\n          this.prefersReducedMotion\n        )\n      ),\n      ...o\n    ], a || (this.proceedRequestAnimationFrame(), window.addEventListener(\"resize\", this.resizeIsDone), a = !0));\n  }\n  // wait for resize to be completely done\n  resizeIsDone() {\n    clearTimeout(u), u = setTimeout(this.refresh, 200);\n  }\n  // animation frame\n  proceedRequestAnimationFrame() {\n    if (s.setViewportTop(this.customContainer), this.lastPosition === s.positions.top) {\n      l = window.requestAnimationFrame(this.proceedRequestAnimationFrame);\n      return;\n    }\n    s.setViewportBottom(), o.forEach((t) => {\n      this.proceedElement(t);\n    }), l = window.requestAnimationFrame(this.proceedRequestAnimationFrame), this.lastPosition = s.positions.top;\n  }\n  // proceed the element\n  proceedElement(t) {\n    let e = !1;\n    this.customContainer ? e = t.checkIfVisible() : e = t.isVisible, e && t.getTranslateValue() && t.animate();\n  }\n  refresh() {\n    s.setViewportAll(this.customContainer), o.forEach((t) => {\n      t.getElementOffset(), t.getRangeMax();\n    }), this.lastPosition = -1;\n  }\n  destroy() {\n    this.reducedMotionMediaQuery && this.reducedMotionMediaQuery.removeEventListener(\n      \"change\",\n      this.handleReducedMotionChange\n    );\n    const t = [];\n    o = o.filter((e) => this.elements && this.elements.includes(e.element) ? (t.push(e), !1) : e), t.forEach((e) => {\n      e.unSetStyle(), this.settings && this.settings.overflow === !1 && e.unWrapElement();\n    }), o.length || (window.cancelAnimationFrame(l), window.removeEventListener(\"resize\", this.refresh), a = !1);\n  }\n}\n\n\n;// ./packages/extensions/image-parallax/defaults.js\n/**\n * Image Parallax — defaults aligned with simpleParallax.js.\n *\n * @see https://github.com/geosigno/simpleParallax.js/#settings\n *\n * @package DiviSupreme\n */\n\n/**\n * simpleParallax.js default orientation (`orientation` setting).\n *\n * @type {'up'}\n */\nconst DSM_IPX_DEFAULT_ORIENTATION = 'up';\n\n/** @type {readonly string[]} */\nconst DSM_IPX_ORIENTATIONS = /** @type {const} */['up', 'right', 'down', 'left', 'up left', 'up right', 'down left', 'down right'];\n\n/**\n * Capitalize orientation labels for UI (stored values stay lowercase for simpleParallax.js).\n *\n * @param {string} orientation\n * @return {string}\n */\nfunction dsmIpxFormatOrientationLabel(orientation) {\n  return String(orientation).split(' ').filter(part => part.length > 0).map(part => part.charAt(0).toUpperCase() + part.slice(1)).join(' ');\n}\n\n/** @type {Record<string, { label: string }>} */\nconst DSM_IPX_ORIENTATION_SELECT_OPTIONS = Object.fromEntries(DSM_IPX_ORIENTATIONS.map(orientation => [orientation, {\n  label: dsmIpxFormatOrientationLabel(orientation)\n}]));\n\n/**\n * Stored select value when the parallax engine should use its built-in curve.\n *\n * @type {'default'}\n */\nconst DSM_IPX_TRANSITION_DEFAULT = 'default';\n\n/**\n * Placeholder / label for the default transition curve in the Visual Builder.\n *\n * @type {'Smooth default'}\n */\nconst DSM_IPX_TRANSITION_PLACEHOLDER = 'Smooth default';\n\n/**\n * CSS transition timing values for the Parallax Transition dropdown.\n *\n * @type {readonly string[]}\n */\nconst DSM_IPX_TRANSITIONS = /** @type {const} */['ease', 'ease-in', 'ease-out', 'ease-in-out', 'linear', 'cubic-bezier(0,0,0,1)', DSM_IPX_TRANSITION_DEFAULT];\n\n/** @type {Record<string, string>} */\nconst DSM_IPX_TRANSITION_LABELS = {\n  ease: 'Ease',\n  'ease-in': 'Ease In',\n  'ease-out': 'Ease Out',\n  'ease-in-out': 'Ease In Out',\n  linear: 'Linear',\n  'cubic-bezier(0,0,0,1)': 'Cubic Bezier',\n  default: DSM_IPX_TRANSITION_PLACEHOLDER\n};\n\n/** @type {Record<string, { label: string }>} */\nconst DSM_IPX_TRANSITION_SELECT_OPTIONS = Object.fromEntries(DSM_IPX_TRANSITIONS.map(transition => {\n  var _DSM_IPX_TRANSITION_L;\n  return [transition, {\n    label: (_DSM_IPX_TRANSITION_L = DSM_IPX_TRANSITION_LABELS[transition]) !== null && _DSM_IPX_TRANSITION_L !== void 0 ? _DSM_IPX_TRANSITION_L : transition\n  }];\n}));\n\n/**\n * @param {string} transition Stored dropdown value.\n * @return {boolean}\n */\nfunction dsmIpxTransitionIsAllowed(transition) {\n  return DSM_IPX_TRANSITIONS.includes(/** @type {typeof DSM_IPX_TRANSITIONS[number]} */transition);\n}\n\n/**\n * @param {unknown} raw Stored or legacy value.\n * @return {string}\n */\nfunction dsmIpxNormalizeTransitionStored(raw) {\n  const trimmed = String(raw !== null && raw !== void 0 ? raw : '').trim();\n  if (trimmed === '' || trimmed === DSM_IPX_TRANSITION_DEFAULT) {\n    return DSM_IPX_TRANSITION_DEFAULT;\n  }\n  return dsmIpxTransitionIsAllowed(trimmed) ? trimmed : DSM_IPX_TRANSITION_DEFAULT;\n}\n\n/**\n * @param {string} stored Stored dropdown value.\n * @return {string} Value for the parallax engine (`''` = library default).\n */\nfunction dsmIpxTransitionToEngineValue(stored) {\n  if (stored === DSM_IPX_TRANSITION_DEFAULT || stored.trim() === '') {\n    return '';\n  }\n  return stored;\n}\n\n/**\n * @typedef {{\n *   on: 'on'|'off',\n *   orientation: string,\n *   scale: string,\n *   delay: string,\n *   transition: string,\n *   overflow: 'on'|'off',\n *   maxTransition: string,\n * }} DsmIpxFieldConfig\n */\n\n/** @type {DsmIpxFieldConfig} */\nconst DSM_IPX_FIELD_DEFAULTS = Object.freeze({\n  on: 'off',\n  orientation: DSM_IPX_DEFAULT_ORIENTATION,\n  scale: '1.3',\n  delay: '0',\n  transition: DSM_IPX_TRANSITION_DEFAULT,\n  overflow: 'off',\n  maxTransition: '0'\n});\n\n/**\n * @param {Record<string, unknown>|null|undefined} raw\n * @return {DsmIpxFieldConfig}\n */\nfunction dsmIpxNormalizeFieldConfig(raw) {\n  var _src$orientation, _src$on, _src$scale, _src$delay, _src$overflow, _src$maxTransition;\n  const src = raw && typeof raw === 'object' ? raw : {};\n  const orientationRaw = String((_src$orientation = src.orientation) !== null && _src$orientation !== void 0 ? _src$orientation : DSM_IPX_DEFAULT_ORIENTATION).trim();\n  const transitionNorm = dsmIpxNormalizeTransitionStored(src.transition);\n\n  /** @type {DsmIpxFieldConfig} */\n  const normalized = {\n    on: String((_src$on = src.on) !== null && _src$on !== void 0 ? _src$on : 'off').toLowerCase() === 'on' ? 'on' : 'off',\n    orientation: DSM_IPX_ORIENTATIONS.includes(/** @type {typeof DSM_IPX_ORIENTATIONS[number]} */orientationRaw) ? orientationRaw : DSM_IPX_DEFAULT_ORIENTATION,\n    scale: String((_src$scale = src.scale) !== null && _src$scale !== void 0 ? _src$scale : DSM_IPX_FIELD_DEFAULTS.scale),\n    delay: String((_src$delay = src.delay) !== null && _src$delay !== void 0 ? _src$delay : DSM_IPX_FIELD_DEFAULTS.delay),\n    transition: transitionNorm,\n    overflow: String((_src$overflow = src.overflow) !== null && _src$overflow !== void 0 ? _src$overflow : 'off').toLowerCase() === 'on' ? 'on' : 'off',\n    maxTransition: String((_src$maxTransition = src.maxTransition) !== null && _src$maxTransition !== void 0 ? _src$maxTransition : DSM_IPX_FIELD_DEFAULTS.maxTransition)\n  };\n  return normalized;\n}\n\n/**\n * @param {DsmIpxFieldConfig} config\n * @return {Record<string, string|number|boolean>}\n */\nfunction dsmIpxFieldConfigToSimpleParallaxOptions(config) {\n  const scale = parseFloat(config.scale);\n  const delay = parseFloat(config.delay);\n  const maxTransition = parseFloat(config.maxTransition);\n\n  /** @type {Record<string, string|number|boolean>} */\n  const opts = {\n    orientation: config.orientation,\n    scale: Number.isFinite(scale) && scale > 1 ? scale : 1.3,\n    delay: Number.isFinite(delay) && delay >= 0 ? delay : 0,\n    overflow: config.overflow === 'on'\n  };\n  const engineTransition = dsmIpxTransitionToEngineValue(config.transition);\n  if (engineTransition !== '') {\n    opts.transition = engineTransition;\n  }\n  if (Number.isFinite(maxTransition) && maxTransition >= 1 && maxTransition <= 99) {\n    opts.maxTransition = maxTransition;\n  }\n  return opts;\n}\n;// ./packages/extensions/image-parallax/vb-scroll-container.js\n/**\n * Visual Builder: find the overflow scroll parent for the canvas (window.scrollY stays 0).\n *\n * @package DiviSupreme\n */\n\n/**\n * @param {HTMLElement} el\n * @param {Window}      win\n * @return {boolean}\n */\nfunction dsmIpxElementIsScrollCarrier(el, win) {\n  const computed = win.getComputedStyle(el);\n  const overflowY = computed.overflowY || '';\n  const overflow = computed.overflow || '';\n  if (overflowY !== 'scroll' && overflowY !== 'auto' && overflowY !== 'overlay' && !/(?:auto|scroll|overlay)/.test(overflow)) {\n    return false;\n  }\n  return el.scrollHeight > el.clientHeight + 1;\n}\n\n/**\n * @param {Document} doc\n * @param {Window}   win\n * @return {HTMLElement|null}\n */\nfunction dsmIpxFindDocumentScrollCarrier(doc, win) {\n  /** @type {readonly string[]} */\n  const selectors = ['#et-boc', '.et-l', '#page-container', 'body'];\n  for (const selector of selectors) {\n    const candidate = doc.querySelector(selector);\n    if (candidate instanceof HTMLElement && dsmIpxElementIsScrollCarrier(candidate, win)) {\n      return candidate;\n    }\n  }\n  const root = doc.documentElement;\n  if (root instanceof HTMLElement && dsmIpxElementIsScrollCarrier(root, win)) {\n    return root;\n  }\n  return null;\n}\n\n/**\n * @param {HTMLElement} node Canvas element (e.g. parallax `<img>`).\n * @return {HTMLElement|null}\n */\nfunction dsmIpxFindVbScrollCarrier(node) {\n  if (!(node instanceof HTMLElement)) {\n    return null;\n  }\n  const doc = node.ownerDocument;\n  const win = doc?.defaultView;\n  if (!doc || !win) {\n    return null;\n  }\n  let current = node.parentElement;\n  while (current && current.nodeType === 1) {\n    if (dsmIpxElementIsScrollCarrier(current, win)) {\n      return current;\n    }\n    current = current.parentElement;\n  }\n  return dsmIpxFindDocumentScrollCarrier(doc, win);\n}\n;// ./packages/extensions/image-parallax/vb-canvas-managed.js\n/**\n * Module ids handled by live VB canvas wrapper (skip global dom-sync double-init).\n *\n * @package DiviSupreme\n */\n\n/** @type {Set<string>} */\nconst dsmIpxCanvasManagedModuleIds = new Set();\n\n/**\n * @param {string} moduleId\n * @return {void}\n */\nfunction dsmIpxRegisterCanvasManagedModule(moduleId) {\n  if (moduleId !== '') {\n    dsmIpxCanvasManagedModuleIds.add(moduleId);\n  }\n}\n\n/**\n * @param {string} moduleId\n * @return {void}\n */\nfunction dsmIpxUnregisterCanvasManagedModule(moduleId) {\n  if (moduleId !== '') {\n    dsmIpxCanvasManagedModuleIds.delete(moduleId);\n  }\n}\n\n/**\n * @param {string} moduleId\n * @return {boolean}\n */\nfunction dsmIpxIsCanvasManagedModule(moduleId) {\n  return dsmIpxCanvasManagedModuleIds.has(moduleId);\n}\n;// ./packages/extensions/image-parallax/vb-recursive-scan.js\n/**\n * Deep DOM scan for VB settings fields (shadow roots, iframes, parent window).\n *\n * @package DiviSupreme\n */\n\n/**\n * @param {Document|ShadowRoot|Element} root\n * @param {string}                       selector\n * @param {number}                       depth\n * @param {(field: HTMLElement) => void} onField\n * @return {void}\n */\nfunction dsmIpxRecursiveScanFields(root, selector, depth, onField) {\n  if (depth > 24 || !root || typeof root.querySelectorAll !== 'function') {\n    return;\n  }\n  try {\n    root.querySelectorAll(selector).forEach(node => {\n      if (node instanceof HTMLElement) {\n        onField(node);\n      }\n    });\n    root.querySelectorAll('*').forEach(el => {\n      if (el instanceof HTMLElement && el.shadowRoot) {\n        dsmIpxRecursiveScanFields(el.shadowRoot, selector, depth + 1, onField);\n      }\n      if (el instanceof HTMLIFrameElement) {\n        try {\n          const idoc = el.contentDocument;\n          if (idoc) {\n            dsmIpxRecursiveScanFields(idoc, selector, depth + 1, onField);\n          }\n        } catch (_err) {\n          /* cross-origin */\n        }\n      }\n    });\n  } catch (_err) {\n    /* partial documents */\n  }\n}\n\n/**\n * Query within `root` and pierce open shadow roots (VB canvas modules may live under shadow trees).\n *\n * @param {Document|ShadowRoot|Element} root\n * @param {string}                       selector\n * @return {Element[]}\n */\nfunction dsmIpxQuerySelectorAllDeep(root, selector) {\n  /** @type {Element[]} */\n  const out = [];\n\n  /**\n   * @param {Document|ShadowRoot|Element} scanRoot\n   */\n  function scan(scanRoot) {\n    if (!scanRoot || typeof scanRoot.querySelectorAll !== 'function') {\n      return;\n    }\n    try {\n      scanRoot.querySelectorAll(selector).forEach(el => {\n        out.push(el);\n      });\n      scanRoot.querySelectorAll('*').forEach(host => {\n        if (host instanceof HTMLElement && host.shadowRoot instanceof ShadowRoot) {\n          scan(host.shadowRoot);\n        }\n      });\n    } catch (_err) {\n      /* fenced frames / partial documents */\n    }\n  }\n  scan(root);\n  return out;\n}\n\n/**\n * @return {Window[]}\n */\nfunction dsmIpxAccessibleVbWindows() {\n  /** @type {Window[]} */\n  const wins = [window];\n  const origin = window.location.origin;\n\n  /**\n   * @param {Window} candidate\n   */\n  function pushWin(candidate) {\n    if (!candidate || candidate === window) {\n      return;\n    }\n    if (wins.includes(candidate)) {\n      return;\n    }\n    try {\n      if (candidate.location.origin !== origin) {\n        return;\n      }\n    } catch (_err) {\n      return;\n    }\n    wins.push(candidate);\n  }\n  pushWin(window.parent);\n  pushWin(window.top);\n  return wins;\n}\n\n/**\n * @param {(field: HTMLElement) => void} onField\n * @return {void}\n */\nfunction dsmIpxScanAllVbSurfaces(onField) {\n  for (const win of dsmIpxAccessibleVbWindows()) {\n    try {\n      dsmIpxRecursiveScanFields(win.document, '.et-vb-field', 0, onField);\n    } catch (_err) {\n      /* inaccessible */\n    }\n  }\n}\n;// ./packages/extensions/image-parallax/vb-canvas-locate.js\n/**\n * Locate VB canvas module roots by `data-id`.\n *\n * @package DiviSupreme\n */\n\n\n\n/**\n * @param {string} moduleId\n * @return {HTMLElement|null}\n */\nfunction dsmIpxFindCanvasModuleRootById(moduleId) {\n  if (moduleId === '') {\n    return null;\n  }\n  const selector = `[data-id=\"${CSS.escape(moduleId)}\"]`;\n  /** @type {Document[]} */\n  const documents = [document];\n  document.querySelectorAll('iframe').forEach(frame => {\n    if (!(frame instanceof HTMLIFrameElement)) {\n      return;\n    }\n    try {\n      const idoc = frame.contentDocument;\n      if (idoc) {\n        documents.push(idoc);\n      }\n    } catch (_err) {\n      /* cross-origin iframe */\n    }\n  });\n  for (const doc of documents) {\n    const nodes = dsmIpxQuerySelectorAllDeep(doc, selector);\n    for (const node of nodes) {\n      if (node instanceof HTMLElement && !node.closest('.et-vb-wireframe')) {\n        return node;\n      }\n    }\n  }\n  return null;\n}\n\n/**\n * @param {Element} node\n * @return {string}\n */\nfunction dsmIpxCanvasModuleIdForNode(node) {\n  var _root$getAttribute;\n  const root = node.closest('[data-id]');\n  if (!(root instanceof HTMLElement)) {\n    return '';\n  }\n  return (_root$getAttribute = root.getAttribute('data-id')) !== null && _root$getAttribute !== void 0 ? _root$getAttribute : '';\n}\n;// ./packages/extensions/image-parallax/engine.js\n/**\n * Image Parallax frontend engine (simpleParallax.js vanilla).\n *\n * @package DiviSupreme\n */\n\n\n\n\n\n\n\n/** @type {WeakMap<HTMLImageElement, import('simple-parallax-js/vanilla').default>} */\nconst dsmIpxInstancesByImage = new WeakMap();\n\n/** @type {readonly string[]} */\nconst DSM_IPX_PARALLAX_WRAPPER_HOST_SELECTORS = ['.et_pb_image_wrap', '.dsm-pricelist-image', '.dsm_card_image_wrapper', '.dsm_icon_list_image', '.dsm_image_wrapper', '.dsm-image', '.dsm-image-wrapper', '.dsm-image-wrap', '.dsm_flipbox_child_image_wrap', '.dsm-icon-divider-image-wrap'];\n\n/**\n * True when `.simpleParallax` was applied to a React/module host (customWrapper), not an inserted div.\n *\n * @param {HTMLElement} wrapper\n * @return {boolean}\n */\nfunction dsmIpxIsParallaxWrapperHost(wrapper) {\n  return DSM_IPX_PARALLAX_WRAPPER_HOST_SELECTORS.some(selector => wrapper.matches(selector));\n}\n\n/**\n * Strip parallax class/overflow from a module host without moving children (React-safe).\n *\n * @param {HTMLElement}      wrapper\n * @param {HTMLImageElement} img\n * @return {void}\n */\nfunction dsmIpxCleanupParallaxWrapperHost(wrapper, img) {\n  dsmIpxRestoreImgBoxSpacingFromParallaxWrapper(img);\n  wrapper.classList.remove('simpleParallax', 'simple-parallax-initialized');\n  wrapper.style.removeProperty('overflow');\n  wrapper.removeAttribute('data-dsm-ipx-margins-preserved');\n}\n\n/**\n * Move computed box spacing from `<img>` onto `.simpleParallax` so overflow:hidden does not clip it.\n *\n * @param {HTMLImageElement} img\n * @return {void}\n */\nfunction dsmIpxTransferImgBoxSpacingToParallaxWrapper(img) {\n  const wrapper = img.parentElement;\n  if (!wrapper || !wrapper.classList.contains('simpleParallax') || wrapper.getAttribute('data-dsm-ipx-margins-preserved') === '1') {\n    return;\n  }\n  const computed = window.getComputedStyle(img);\n  let transferred = false;\n  for (const side of ['top', 'right', 'bottom', 'left']) {\n    for (const box of ['margin', 'padding']) {\n      const prop = `${box}-${side}`;\n      const value = computed.getPropertyValue(prop);\n      if (value && value !== '0px') {\n        wrapper.style.setProperty(prop, value);\n        img.style.setProperty(prop, '0');\n        transferred = true;\n      }\n    }\n  }\n  if (transferred) {\n    wrapper.setAttribute('data-dsm-ipx-margins-preserved', '1');\n  }\n}\n\n/**\n * Restore box spacing moved onto `.simpleParallax` back to the `<img>` before unwrap.\n *\n * @param {HTMLImageElement} img\n * @return {void}\n */\nfunction dsmIpxRestoreImgBoxSpacingFromParallaxWrapper(img) {\n  const wrapper = img.parentElement;\n  if (!wrapper || !wrapper.classList.contains('simpleParallax') || wrapper.getAttribute('data-dsm-ipx-margins-preserved') !== '1') {\n    return;\n  }\n  for (const side of ['top', 'right', 'bottom', 'left']) {\n    for (const box of ['margin', 'padding']) {\n      const prop = `${box}-${side}`;\n      const value = wrapper.style.getPropertyValue(prop);\n      if (value) {\n        img.style.setProperty(prop, value);\n        wrapper.style.removeProperty(prop);\n      }\n    }\n  }\n  wrapper.removeAttribute('data-dsm-ipx-margins-preserved');\n}\n\n/**\n * Manually unwrap `.simpleParallax` without `replaceWith` (safer when React owns the tree).\n *\n * @param {HTMLImageElement} img\n * @return {void}\n */\nfunction dsmIpxSafeUnwrapSimpleParallaxWrapper(img) {\n  if (!img.isConnected) {\n    return;\n  }\n  const wrapper = img.closest('.simpleParallax');\n  if (!wrapper || wrapper === img || !(wrapper instanceof HTMLElement) || !wrapper.contains(img)) {\n    return;\n  }\n  const parent = wrapper.parentNode;\n  if (!parent) {\n    return;\n  }\n  if (dsmIpxIsParallaxWrapperHost(wrapper)) {\n    dsmIpxCleanupParallaxWrapperHost(wrapper, img);\n    return;\n  }\n  try {\n    img.style.transform = '';\n    img.style.willChange = '';\n    img.style.transition = '';\n    if (img.parentElement === wrapper) {\n      parent.insertBefore(img, wrapper);\n    }\n    if (wrapper.parentNode === parent) {\n      parent.removeChild(wrapper);\n    }\n  } catch (_err) {\n    /* React may be committing the same subtree. */\n  }\n}\n\n/**\n * @return {boolean}\n */\nfunction dsmIpxPrefersReducedMotion() {\n  try {\n    return typeof window.matchMedia === 'function' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n  } catch (_err) {\n    return false;\n  }\n}\n\n/**\n * @param {HTMLImageElement} img\n * @return {void}\n */\nfunction dsmIpxClearImageParallaxAttributes(img) {\n  img.removeAttribute('data-dsm-ipx-initialized');\n  img.removeAttribute('data-dsm-ipx-vb-scroll-retries');\n}\n\n/**\n * @param {HTMLImageElement} img\n * @return {void}\n */\nfunction dsmIpxDestroyForImage(img) {\n  dsmIpxRestoreImgBoxSpacingFromParallaxWrapper(img);\n  const inst = dsmIpxInstancesByImage.get(img);\n  const wrapper = img.closest('.simpleParallax');\n  const wrapperIsHost = wrapper instanceof HTMLElement && dsmIpxIsParallaxWrapperHost(wrapper);\n  if (inst && typeof inst.destroy === 'function') {\n    if (window.__dsmIpxVbMode === true) {\n      if (inst.settings && typeof inst.settings === 'object') {\n        inst.settings.overflow = true;\n      }\n      try {\n        if (img.isConnected) {\n          inst.destroy();\n        }\n      } catch (_err) {\n        /* simpleParallax teardown can race React commit. */\n      }\n    } else if (!wrapperIsHost) {\n      try {\n        if (img.isConnected) {\n          inst.destroy();\n        }\n      } catch (_err) {\n        /* simpleParallax unwrap can race React commit. */\n      }\n    }\n  }\n  if (wrapperIsHost && wrapper instanceof HTMLElement) {\n    dsmIpxCleanupParallaxWrapperHost(wrapper, img);\n  }\n  dsmIpxInstancesByImage.delete(img);\n  dsmIpxClearImageParallaxAttributes(img);\n  dsmIpxSafeUnwrapSimpleParallaxWrapper(img);\n}\n\n/**\n * @param {HTMLImageElement} img\n * @return {Record<string, unknown>|null}\n */\nfunction dsmIpxReadOptsFromImage(img) {\n  const raw = img.getAttribute('data-dsm-ipx-opts');\n  if (!raw || raw === '') {\n    return null;\n  }\n  try {\n    const parsed = JSON.parse(raw);\n    return parsed && typeof parsed === 'object' ? parsed : null;\n  } catch (_err) {\n    return null;\n  }\n}\n\n/**\n * @param {HTMLImageElement} img\n * @return {void}\n */\nfunction dsmIpxInitSingleImage(img) {\n  var _img$getAttribute, _img$getAttribute2;\n  if (!(img instanceof HTMLImageElement)) {\n    return;\n  }\n  if (img.getAttribute('data-dsm-ipx-on') !== '1') {\n    dsmIpxDestroyForImage(img);\n    return;\n  }\n  if (dsmIpxPrefersReducedMotion()) {\n    dsmIpxDestroyForImage(img);\n    return;\n  }\n  const optsRaw = dsmIpxReadOptsFromImage(img);\n  if (!optsRaw) {\n    return;\n  }\n  const optsJson = (_img$getAttribute = img.getAttribute('data-dsm-ipx-opts')) !== null && _img$getAttribute !== void 0 ? _img$getAttribute : '';\n  const appliedOpts = (_img$getAttribute2 = img.getAttribute('data-dsm-ipx-applied-opts')) !== null && _img$getAttribute2 !== void 0 ? _img$getAttribute2 : '';\n  if (appliedOpts === optsJson && optsJson !== '' && img.getAttribute('data-dsm-ipx-initialized') === '1') {\n    return;\n  }\n  const waitForLoad = () => {\n    if (!img.complete || img.naturalWidth === 0) {\n      img.addEventListener('load', waitForLoad, {\n        once: true\n      });\n      return;\n    }\n    if (window.__dsmIpxVbMode === true) {\n      const scrollCarrier = dsmIpxFindVbScrollCarrier(img);\n      if (!scrollCarrier) {\n        var _img$getAttribute3;\n        const retries = Number((_img$getAttribute3 = img.getAttribute('data-dsm-ipx-vb-scroll-retries')) !== null && _img$getAttribute3 !== void 0 ? _img$getAttribute3 : '0');\n        if (retries < 8) {\n          img.setAttribute('data-dsm-ipx-vb-scroll-retries', String(retries + 1));\n          requestAnimationFrame(waitForLoad);\n          return;\n        }\n        img.removeAttribute('data-dsm-ipx-vb-scroll-retries');\n      } else {\n        img.removeAttribute('data-dsm-ipx-vb-scroll-retries');\n      }\n    }\n    if (!img.isConnected) {\n      dsmIpxInstancesByImage.delete(img);\n      dsmIpxClearImageParallaxAttributes(img);\n      return;\n    }\n    dsmIpxDestroyForImage(img);\n    try {\n      /** @type {Record<string, unknown>} */\n      const instanceOpts = {\n        ...optsRaw\n      };\n      if (window.__dsmIpxVbMode === true) {\n        const scrollCarrier = dsmIpxFindVbScrollCarrier(img);\n        if (scrollCarrier) {\n          instanceOpts.customContainer = scrollCarrier;\n        }\n      }\n      const instance = new g(img, instanceOpts);\n      dsmIpxTransferImgBoxSpacingToParallaxWrapper(img);\n      dsmIpxInstancesByImage.set(img, instance);\n      img.setAttribute('data-dsm-ipx-initialized', '1');\n      img.setAttribute('data-dsm-ipx-applied-opts', optsJson);\n    } catch (_err) {\n      /* invalid image / already wrapped */\n    }\n  };\n  waitForLoad();\n}\n\n/**\n * @param {Document|Element} root\n * @param {{ skipCanvasManaged?: boolean }} [options]\n * @return {void}\n */\nfunction dsmIpxInitInRoot(root, options = {}) {\n  if (!root || typeof root.querySelectorAll !== 'function') {\n    return;\n  }\n  const skipCanvasManaged = options.skipCanvasManaged === true;\n  root.querySelectorAll('img[data-dsm-ipx-on=\"1\"]').forEach(node => {\n    if (!(node instanceof HTMLImageElement)) {\n      return;\n    }\n    if (skipCanvasManaged && window.__dsmIpxVbMode === true) {\n      const moduleId = dsmIpxCanvasModuleIdForNode(node);\n      if (moduleId !== '' && dsmIpxIsCanvasManagedModule(moduleId)) {\n        return;\n      }\n    }\n    dsmIpxInitSingleImage(node);\n  });\n}\n\n/**\n * Remove Image Parallax markers and destroy a wired simpleParallax instance.\n *\n * @param {HTMLImageElement} img\n * @return {void}\n */\nfunction dsmIpxStripImageParallaxMarkers(img) {\n  if (!(img instanceof HTMLImageElement)) {\n    return;\n  }\n  dsmIpxDestroyForImage(img);\n  if (!img.isConnected) {\n    return;\n  }\n  img.removeAttribute('data-dsm-ipx-on');\n  img.removeAttribute('data-dsm-ipx-field');\n  img.removeAttribute('data-dsm-ipx-opts');\n  img.removeAttribute('data-dsm-ipx-applied-opts');\n}\n\n/**\n * @param {Document|Element} root\n * @return {void}\n */\nfunction dsmIpxRefreshInRoot(root) {\n  dsmIpxInitInRoot(root);\n}\n\n/**\n * @param {import('./defaults.js').DsmIpxFieldConfig} config\n * @return {string}\n */\nfunction dsmIpxSerializeOptsAttr(config) {\n  return JSON.stringify(dsmIpxFieldConfigToSimpleParallaxOptions(config));\n}\n;// ./packages/extensions/image-parallax/init-frontend.js\n/**\n * Frontend bootstrap: Image Parallax (simpleParallax.js).\n *\n * @package DiviSupreme\n */\n\n\n\nfunction boot() {\n  dsmIpxInitInRoot(document);\n}\nif (document.readyState === 'loading') {\n  document.addEventListener('DOMContentLoaded', boot, {\n    once: true\n  });\n} else {\n  boot();\n}\nwindow.dsmImageParallaxInit = function dsmImageParallaxInit() {\n  dsmIpxInitInRoot(document);\n};\n\n//# sourceURL=webpack://divi-supreme/./packages/extensions/image-parallax/init-frontend.js_+_8_modules?\n}");

/***/ }

/******/ 	});
/************************************************************************/
/******/ 	
/******/ 	// startup
/******/ 	// Load entry module and return exports
/******/ 	// This entry module can't be inlined because the eval devtool is used.
/******/ 	var __webpack_exports__ = {};
/******/ 	__webpack_modules__["./packages/extensions/image-parallax/init-frontend.js"]();
/******/ 	
/******/ })()
;