{
  "version": 3,
  "sources": ["/cdn/shop/t/34/assets/vode-visual-editor.js?vode=20260612-binder-rings-0327"],
  "sourcesContent": ["(() => {\n  if (window.vodeVisualEditorReady) return;\n  window.vodeVisualEditorReady = true;\n\n  const queryEnabled = (() => {\n    try {\n      return new URLSearchParams(window.location.search).get('vode_visual_edit') === '1';\n    } catch (error) {\n      return false;\n    }\n  })();\n\n  const canUseEditor = () => queryEnabled || Boolean(window.VODE_VISUAL_EDIT_DESIGN_MODE) || Boolean(window.Shopify && window.Shopify.designMode);\n  const state = new Map();\n  const selected = new Set();\n  const panelPositionKey = 'vode-visual-editor-panel-position-v1';\n  const panelHiddenKey = 'vode-visual-editor-panel-hidden-v1';\n  const snapThreshold = 6;\n  let panel;\n  let launcher;\n  let status;\n  let cssOutput;\n  let deviceMode = 'desktop';\n  let activeDrag = null;\n  let lastDragEnd = 0;\n  let copiedStyle = null;\n  const history = [];\n  const locked = new Set();\n  const guides = {};\n  let inputHistoryTimer = 0;\n\n  const selectableSelector = [\n    'a',\n    'button',\n    '[role=\"button\"]',\n    'img',\n    'picture',\n    'svg',\n    'video',\n    'iframe',\n    'h1',\n    'h2',\n    'h3',\n    'h4',\n    'h5',\n    'h6',\n    'p',\n    'span',\n    '.button',\n    '.btn',\n    '[data-vode-editable]',\n  ].join(',');\n\n  const ignoreSelector = [\n    '.vode-visual-editor-panel',\n    '.vode-visual-editor-launcher',\n    '.vode-hotspot-edit-panel',\n    'script',\n    'style',\n    'template',\n    'link',\n    'meta',\n  ].join(',');\n\n  const clamp = (value, min, max) => Math.min(max, Math.max(min, value));\n  const px = (value) => `${Math.round(value)}px`;\n  const num = (value, fallback = 0) => {\n    const parsed = Number.parseFloat(value);\n    return Number.isFinite(parsed) ? parsed : fallback;\n  };\n\n  const cssEscape = (value) => {\n    if (window.CSS && typeof window.CSS.escape === 'function') return window.CSS.escape(value);\n    return String(value).replace(/[^a-zA-Z0-9_-]/g, '\\\\$&');\n  };\n\n  const readJson = (key, fallback) => {\n    try {\n      return JSON.parse(window.localStorage.getItem(key) || '') || fallback;\n    } catch (error) {\n      return fallback;\n    }\n  };\n\n  const writeJson = (key, value) => {\n    try {\n      window.localStorage.setItem(key, JSON.stringify(value));\n    } catch (error) {\n      // Ignore blocked storage.\n    }\n  };\n\n  const cloneState = () => JSON.stringify(Array.from(state.entries()).map(([selector, record]) => [\n    selector,\n    { desktop: { ...record.desktop }, mobile: { ...record.mobile } },\n  ]));\n\n  const restoreState = (snapshot) => {\n    const next = new Map(JSON.parse(snapshot));\n    state.forEach((record) => {\n      [...Object.keys(record.desktop), ...Object.keys(record.mobile)].forEach((property) => record.element?.style.removeProperty(property));\n    });\n    state.clear();\n    next.forEach((record, selector) => {\n      const element = document.querySelector(selector);\n      state.set(selector, { element, desktop: record.desktop || {}, mobile: record.mobile || {} });\n      if (element) applyRecord(element);\n    });\n  };\n\n  const pushHistory = () => {\n    history.push(cloneState());\n    if (history.length > 40) history.shift();\n  };\n\n  const flushInputHistory = () => {\n    if (!inputHistoryTimer) return;\n    window.clearTimeout(inputHistoryTimer);\n    inputHistoryTimer = 0;\n  };\n\n  const undo = () => {\n    flushInputHistory();\n    const snapshot = history.pop();\n    if (!snapshot) {\n      setStatus('No undo');\n      return;\n    }\n    restoreState(snapshot);\n    setStatus('Undo');\n    syncPanelValues();\n    updateCssOutput();\n  };\n\n  const isVisible = (element) => {\n    if (!element || element.closest(ignoreSelector)) return false;\n    const rect = element.getBoundingClientRect();\n    const style = getComputedStyle(element);\n    return rect.width > 2 && rect.height > 2 && style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0';\n  };\n\n  const getEditable = (target) => {\n    const direct = target.closest(selectableSelector);\n    if (isVisible(direct)) return direct;\n\n    const textParent = target.closest('h1,h2,h3,h4,h5,h6,p,a,button,span,[data-vode-editable]');\n    if (isVisible(textParent)) return textParent;\n\n    return null;\n  };\n\n  const getSectionScope = (element) => element.closest('[id^=\"shopify-section-\"]') || document.body;\n\n  const nthOfType = (element) => {\n    let index = 1;\n    let sibling = element;\n    while ((sibling = sibling.previousElementSibling)) {\n      if (sibling.tagName === element.tagName) index += 1;\n    }\n    return index;\n  };\n\n  const getSelector = (element) => {\n    if (element.id) return `#${cssEscape(element.id)}`;\n\n    const scope = getSectionScope(element);\n    const prefix = scope.id ? `#${cssEscape(scope.id)} ` : '';\n    if (element.dataset.vodeEditable) return `${prefix}[data-vode-editable=\"${cssEscape(element.dataset.vodeEditable)}\"]`;\n    if (element.dataset.blockId) return `${prefix}[data-block-id=\"${cssEscape(element.dataset.blockId)}\"]`;\n\n    const parts = [];\n    let current = element;\n    while (current && current !== scope && current !== document.body) {\n      let part = current.tagName.toLowerCase();\n      const usefulClass = Array.from(current.classList || []).find((item) => !item.startsWith('shopify-') && !item.startsWith('is-') && !item.startsWith('has-'));\n      if (usefulClass) part += `.${cssEscape(usefulClass)}`;\n      part += `:nth-of-type(${nthOfType(current)})`;\n      parts.unshift(part);\n      current = current.parentElement;\n    }\n    return `${prefix}${parts.join(' > ')}`;\n  };\n\n  const getDeviceState = (element) => {\n    const selector = getSelector(element);\n    if (!state.has(selector)) {\n      state.set(selector, { element, desktop: {}, mobile: {} });\n    }\n    const record = state.get(selector);\n    record.element = element;\n    return record[deviceMode];\n  };\n\n  const applyRecord = (element) => {\n    const record = state.get(getSelector(element));\n    if (!record) return;\n    const styles = { ...record.desktop, ...(window.matchMedia('(max-width: 749px)').matches ? record.mobile : {}) };\n    Object.entries(styles).forEach(([property, value]) => {\n      if (value === '' || value == null) element.style.removeProperty(property);\n      else element.style.setProperty(property, value);\n    });\n  };\n\n  const setStyle = (element, property, value) => {\n    const styles = getDeviceState(element);\n    styles[property] = value;\n    applyRecord(element);\n    updateCssOutput();\n  };\n\n  const getTranslate = (element) => {\n    const styles = getDeviceState(element);\n    return {\n      x: num(styles['--vode-ve-x']),\n      y: num(styles['--vode-ve-y']),\n    };\n  };\n\n  const setTranslate = (element, x, y) => {\n    const styles = getDeviceState(element);\n    styles['--vode-ve-x'] = px(x);\n    styles['--vode-ve-y'] = px(y);\n    styles.position = styles.position || 'relative';\n    styles.transform = 'translate(var(--vode-ve-x, 0px), var(--vode-ve-y, 0px))';\n    applyRecord(element);\n    updateCssOutput();\n  };\n\n  const selectedElements = () => Array.from(selected).filter((element) => element.isConnected);\n\n  const setStatus = (text) => {\n    if (!status) return;\n    status.textContent = text;\n  };\n\n  const clearSelection = () => {\n    selected.forEach((element) => element.removeAttribute('data-vode-visual-selected'));\n    selected.clear();\n  };\n\n  const selectElement = (element, additive = false) => {\n    if (!additive) clearSelection();\n    if (!element) return;\n\n    if (additive && selected.has(element)) {\n      selected.delete(element);\n      element.removeAttribute('data-vode-visual-selected');\n    } else {\n      selected.add(element);\n      element.dataset.vodeVisualSelected = 'true';\n    }\n    syncPanelValues();\n    setStatus(`${selected.size} selected`);\n  };\n\n  const isLocked = (element) => locked.has(getSelector(element));\n\n  const toggleLock = () => {\n    selectedElements().forEach((element) => {\n      const selector = getSelector(element);\n      if (locked.has(selector)) {\n        locked.delete(selector);\n        element.removeAttribute('data-vode-visual-locked');\n      } else {\n        locked.add(selector);\n        element.dataset.vodeVisualLocked = 'true';\n      }\n    });\n    setStatus('Lock toggled');\n  };\n\n  const selectedBounds = () => {\n    const rects = selectedElements().map((element) => element.getBoundingClientRect());\n    if (!rects.length) return null;\n    const left = Math.min(...rects.map((rect) => rect.left));\n    const top = Math.min(...rects.map((rect) => rect.top));\n    const right = Math.max(...rects.map((rect) => rect.right));\n    const bottom = Math.max(...rects.map((rect) => rect.bottom));\n    return { left, top, right, bottom, width: right - left, height: bottom - top };\n  };\n\n  const alignSelected = (mode) => {\n    const elements = selectedElements();\n    if (elements.length < 1) return;\n    pushHistory();\n    const group = selectedBounds();\n    elements.forEach((element) => {\n      const rect = element.getBoundingClientRect();\n      const translate = getTranslate(element);\n      let dx = 0;\n      let dy = 0;\n\n      if (mode === 'left') dx = group.left - rect.left;\n      if (mode === 'hcenter') dx = group.left + group.width / 2 - (rect.left + rect.width / 2);\n      if (mode === 'right') dx = group.right - rect.right;\n      if (mode === 'top') dy = group.top - rect.top;\n      if (mode === 'vcenter') dy = group.top + group.height / 2 - (rect.top + rect.height / 2);\n      if (mode === 'bottom') dy = group.bottom - rect.bottom;\n\n      setTranslate(element, translate.x + dx, translate.y + dy);\n    });\n    setStatus(`Aligned ${mode}`);\n  };\n\n  const layerSelected = (direction) => {\n    pushHistory();\n    selectedElements().forEach((element) => {\n      if (isLocked(element)) return;\n      const styles = getDeviceState(element);\n      const current = num(styles['z-index'] || getComputedStyle(element).zIndex, 1);\n      styles.position = styles.position || 'relative';\n      styles['z-index'] = String(clamp(current + direction, 0, 9999));\n      applyRecord(element);\n    });\n    setStatus(direction > 0 ? 'Layer forward' : 'Layer back');\n    updateCssOutput();\n  };\n\n  const hideSelected = () => {\n    pushHistory();\n    selectedElements().forEach((element) => {\n      if (isLocked(element)) return;\n      setStyle(element, 'display', 'none');\n    });\n    setStatus('Hidden');\n  };\n\n  const copyStyle = () => {\n    const element = selectedElements()[0];\n    if (!element) {\n      setStatus('Select first');\n      return;\n    }\n    copiedStyle = { ...getDeviceState(element) };\n    setStatus('Style copied');\n  };\n\n  const pasteStyle = () => {\n    if (!copiedStyle) {\n      setStatus('No style');\n      return;\n    }\n    pushHistory();\n    selectedElements().forEach((element) => {\n      if (isLocked(element)) return;\n      Object.entries(copiedStyle).forEach(([property, value]) => setStyle(element, property, value));\n    });\n    setStatus('Style pasted');\n    syncPanelValues();\n  };\n\n  const ensureGuides = () => {\n    if (guides.x) return;\n    guides.x = document.createElement('div');\n    guides.y = document.createElement('div');\n    guides.x.className = 'vode-visual-editor-guide vode-visual-editor-guide--x';\n    guides.y.className = 'vode-visual-editor-guide vode-visual-editor-guide--y';\n    document.body.append(guides.x, guides.y);\n  };\n\n  const hideGuides = () => {\n    guides.x?.classList.remove('is-visible');\n    guides.y?.classList.remove('is-visible');\n  };\n\n  const getAlignmentTargets = (dragElements) => {\n    const skip = new Set(dragElements);\n    const targets = [];\n    targets.push({ axis: 'x', value: window.innerWidth / 2 });\n    targets.push({ axis: 'y', value: window.innerHeight / 2 });\n    document.querySelectorAll(selectableSelector).forEach((element) => {\n      if (skip.has(element) || !isVisible(element)) return;\n      const rect = element.getBoundingClientRect();\n      targets.push({ axis: 'x', value: rect.left }, { axis: 'x', value: rect.left + rect.width / 2 }, { axis: 'x', value: rect.right });\n      targets.push({ axis: 'y', value: rect.top }, { axis: 'y', value: rect.top + rect.height / 2 }, { axis: 'y', value: rect.bottom });\n    });\n    return targets;\n  };\n\n  const snapDelta = (rect, targets) => {\n    let snapX = 0;\n    let snapY = 0;\n    let guideX = null;\n    let guideY = null;\n    const xs = [rect.left, rect.left + rect.width / 2, rect.right];\n    const ys = [rect.top, rect.top + rect.height / 2, rect.bottom];\n\n    targets.forEach((target) => {\n      if (target.axis === 'x') {\n        xs.forEach((value) => {\n          const delta = target.value - value;\n          if (Math.abs(delta) <= snapThreshold && (guideX == null || Math.abs(delta) < Math.abs(snapX))) {\n            snapX = delta;\n            guideX = target.value;\n          }\n        });\n      }\n      if (target.axis === 'y') {\n        ys.forEach((value) => {\n          const delta = target.value - value;\n          if (Math.abs(delta) <= snapThreshold && (guideY == null || Math.abs(delta) < Math.abs(snapY))) {\n            snapY = delta;\n            guideY = target.value;\n          }\n        });\n      }\n    });\n\n    return { snapX, snapY, guideX, guideY };\n  };\n\n  const showGuides = (guideX, guideY) => {\n    ensureGuides();\n    if (guideX == null) {\n      guides.x.classList.remove('is-visible');\n    } else {\n      guides.x.style.transform = `translateX(${guideX}px)`;\n      guides.x.classList.add('is-visible');\n    }\n    if (guideY == null) {\n      guides.y.classList.remove('is-visible');\n    } else {\n      guides.y.style.transform = `translateY(${guideY}px)`;\n      guides.y.classList.add('is-visible');\n    }\n  };\n\n  const syncPanelValues = () => {\n    if (!panel) return;\n    const element = selectedElements()[0];\n    panel.querySelectorAll('[data-vode-ve-control]').forEach((input) => {\n      if (!element) {\n        input.value = input.type === 'color' ? '#000000' : '';\n        return;\n      }\n      const computed = getComputedStyle(element);\n      const property = input.dataset.vodeVeControl;\n      let value = getDeviceState(element)[property] || computed.getPropertyValue(property);\n      if (property === 'font-size') value = String(Math.round(num(value)));\n      if (property === 'opacity') value = String(num(value, 1));\n      if (property === 'width' || property === 'height' || property === 'border-width' || property === 'border-radius') value = String(Math.round(num(value)));\n      if (input.type === 'color') value = rgbToHex(value);\n      input.value = value.trim();\n    });\n  };\n\n  const rgbToHex = (value) => {\n    if (!value) return '#000000';\n    if (value.startsWith('#')) return value;\n    const parts = value.match(/\\d+/g);\n    if (!parts || parts.length < 3) return '#000000';\n    return `#${parts.slice(0, 3).map((part) => clamp(Number(part), 0, 255).toString(16).padStart(2, '0')).join('')}`;\n  };\n\n  const generateCss = () => {\n    const chunks = [];\n    state.forEach((record, selector) => {\n      ['desktop', 'mobile'].forEach((mode) => {\n        const styles = record[mode];\n        const entries = Object.entries(styles).filter(([, value]) => value !== '' && value != null);\n        if (!entries.length) return;\n        const declarations = entries.map(([property, value]) => `  ${property}: ${value} !important;`).join('\\n');\n        const rule = `${selector} {\\n${declarations}\\n}`;\n        chunks.push(mode === 'mobile' ? `@media (max-width: 749px) {\\n${rule}\\n}` : rule);\n      });\n    });\n    return chunks.join('\\n\\n');\n  };\n\n  const updateCssOutput = (css = generateCss()) => {\n    if (!cssOutput) return css;\n    cssOutput.value = css;\n    return css;\n  };\n\n  const copyCss = async () => {\n    flushInputHistory();\n    const css = updateCssOutput();\n    if (!css) {\n      setStatus('Nothing to copy');\n      return;\n    }\n\n    try {\n      await navigator.clipboard.writeText(css);\n      setStatus('Copied CSS');\n    } catch (error) {\n      window.prompt('Copy visual edit CSS:', css);\n      setStatus('Copy ready');\n    }\n  };\n\n  const setCompact = (compact) => {\n    if (!panel) return;\n    panel.classList.toggle('is-compact', compact);\n    const toggle = panel.querySelector('[data-vode-ve-toggle]');\n    if (toggle) {\n      toggle.textContent = compact ? 'Tools' : 'Mini';\n      toggle.setAttribute('aria-expanded', String(!compact));\n    }\n  };\n\n  const setPanelHidden = (hidden) => {\n    document.documentElement.classList.toggle('vode-visual-editor-panel-hidden', hidden);\n    if (launcher) launcher.setAttribute('aria-expanded', String(!hidden));\n    writeJson(panelHiddenKey, hidden);\n  };\n\n  const createLauncher = () => {\n    if (launcher) return launcher;\n    launcher = document.createElement('button');\n    launcher.type = 'button';\n    launcher.className = 'vode-visual-editor-launcher';\n    launcher.setAttribute('data-vode-ve-panel-show', '');\n    launcher.setAttribute('aria-label', 'Show VODE visual editor panel');\n    launcher.textContent = 'Editor';\n    const showPanel = (event) => {\n      event.preventDefault();\n      event.stopPropagation();\n      setPanelHidden(false);\n      if (window.matchMedia('(max-width: 749px)').matches) setCompact(true);\n      setStatus('Panel shown');\n    };\n    launcher.addEventListener('pointerdown', showPanel, true);\n    launcher.addEventListener('touchstart', showPanel, true);\n    launcher.addEventListener('click', showPanel, true);\n    document.body.append(launcher);\n    return launcher;\n  };\n\n  const resetSelected = () => {\n    selectedElements().forEach((element) => {\n      const selector = getSelector(element);\n      const record = state.get(selector);\n      if (record) {\n        [...Object.keys(record.desktop), ...Object.keys(record.mobile)].forEach((property) => {\n          element.style.removeProperty(property);\n        });\n      }\n      state.delete(selector);\n    });\n    setStatus('Reset selected');\n    syncPanelValues();\n    updateCssOutput();\n  };\n\n  const createPanel = () => {\n    if (panel) return panel;\n    panel = document.createElement('div');\n    panel.className = 'vode-visual-editor-panel';\n    panel.setAttribute('aria-label', 'VODE visual editor helper');\n    panel.innerHTML = `\n      <div class=\"vode-visual-editor-panel__row\">\n        <span class=\"vode-visual-editor-panel__handle\" data-vode-ve-panel-handle>Move</span>\n        <span class=\"vode-visual-editor-panel__status\" data-vode-ve-status>Select object</span>\n        <select data-vode-ve-device aria-label=\"Edit device\">\n          <option value=\"desktop\">Desktop</option>\n          <option value=\"mobile\">Mobile</option>\n        </select>\n        <button type=\"button\" class=\"vode-visual-editor-panel__toggle\" data-vode-ve-toggle aria-expanded=\"true\">Mini</button>\n        <button type=\"button\" class=\"vode-visual-editor-panel__hide-panel\" data-vode-ve-panel-hide aria-label=\"Hide editor panel\">Hide</button>\n      </div>\n      <div class=\"vode-visual-editor-panel__body\" data-vode-ve-body>\n        <div class=\"vode-visual-editor-panel__row vode-visual-editor-panel__row--grid\">\n          <button type=\"button\" data-vode-ve-align=\"left\">Left</button>\n          <button type=\"button\" data-vode-ve-align=\"hcenter\">Center</button>\n          <button type=\"button\" data-vode-ve-align=\"right\">Right</button>\n          <button type=\"button\" data-vode-ve-align=\"top\">Top</button>\n          <button type=\"button\" data-vode-ve-align=\"vcenter\">Middle</button>\n          <button type=\"button\" data-vode-ve-align=\"bottom\">Bottom</button>\n        </div>\n        <div class=\"vode-visual-editor-panel__row vode-visual-editor-panel__row--grid\">\n          <button type=\"button\" data-vode-ve-layer=\"-1\">Back</button>\n          <button type=\"button\" data-vode-ve-layer=\"1\">Forward</button>\n          <button type=\"button\" data-vode-ve-reset>Reset</button>\n        </div>\n        <div class=\"vode-visual-editor-panel__row vode-visual-editor-panel__row--four\">\n          <button type=\"button\" data-vode-ve-lock>Lock</button>\n          <button type=\"button\" data-vode-ve-undo>Undo</button>\n          <button type=\"button\" data-vode-ve-copy-style>Copy</button>\n          <button type=\"button\" data-vode-ve-paste-style>Paste</button>\n        </div>\n        <div class=\"vode-visual-editor-panel__row vode-visual-editor-panel__row--grid\">\n          <label class=\"vode-visual-editor-panel__field\"><span>Font</span><input data-vode-ve-control=\"font-size\" data-vode-ve-unit=\"px\" type=\"number\" min=\"6\" max=\"180\"></label>\n          <label class=\"vode-visual-editor-panel__field\"><span>Width</span><input data-vode-ve-control=\"width\" data-vode-ve-unit=\"px\" type=\"number\" min=\"0\" max=\"2200\"></label>\n          <label class=\"vode-visual-editor-panel__field\"><span>Height</span><input data-vode-ve-control=\"height\" data-vode-ve-unit=\"px\" type=\"number\" min=\"0\" max=\"2200\"></label>\n        </div>\n        <div class=\"vode-visual-editor-panel__row vode-visual-editor-panel__row--grid\">\n          <label class=\"vode-visual-editor-panel__field\"><span>Text</span><input data-vode-ve-control=\"color\" type=\"color\"></label>\n          <label class=\"vode-visual-editor-panel__field\"><span>Back</span><input data-vode-ve-control=\"background-color\" type=\"color\"></label>\n          <label class=\"vode-visual-editor-panel__field\"><span>Opacity</span><input data-vode-ve-control=\"opacity\" type=\"number\" min=\"0\" max=\"1\" step=\"0.05\"></label>\n        </div>\n        <div class=\"vode-visual-editor-panel__row vode-visual-editor-panel__row--grid\">\n          <label class=\"vode-visual-editor-panel__field\"><span>Border</span><input data-vode-ve-control=\"border-width\" data-vode-ve-unit=\"px\" type=\"number\" min=\"0\" max=\"40\"></label>\n          <label class=\"vode-visual-editor-panel__field\"><span>Radius</span><input data-vode-ve-control=\"border-radius\" data-vode-ve-unit=\"px\" type=\"number\" min=\"0\" max=\"200\"></label>\n          <label class=\"vode-visual-editor-panel__field\"><span>Line</span><input data-vode-ve-control=\"border-color\" type=\"color\"></label>\n        </div>\n        <textarea class=\"vode-visual-editor-panel__css-output\" data-vode-ve-css-output readonly spellcheck=\"false\" placeholder=\"CSS appears here after edits. Copy CSS puts this on your clipboard.\"></textarea>\n        <div class=\"vode-visual-editor-panel__row vode-visual-editor-panel__row--two\">\n          <button type=\"button\" class=\"vode-visual-editor-panel__copy\" data-vode-ve-copy>Copy CSS</button>\n          <button type=\"button\" data-vode-ve-hide>Hide Object</button>\n        </div>\n        <div class=\"vode-visual-editor-panel__row\">\n          <button type=\"button\" data-vode-ve-clear>Clear select</button>\n        </div>\n        <div class=\"vode-visual-editor-panel__hint\">Click object. Shift-click multiple. Drag selected object to move. Paste copied CSS into a Shopify custom CSS field and save.</div>\n      </div>\n    `;\n    document.body.append(panel);\n    createLauncher();\n    status = panel.querySelector('[data-vode-ve-status]');\n    cssOutput = panel.querySelector('[data-vode-ve-css-output]');\n\n    const storedPosition = readJson(panelPositionKey, null);\n    if (storedPosition) {\n      panel.style.left = px(storedPosition.left);\n      panel.style.top = px(storedPosition.top);\n    }\n\n    if (window.matchMedia('(max-width: 749px)').matches) setCompact(true);\n    else setCompact(false);\n    setPanelHidden(Boolean(readJson(panelHiddenKey, false)));\n\n    bindPanelEvents();\n    return panel;\n  };\n\n  const bindPanelEvents = () => {\n    panel.addEventListener('click', (event) => {\n      event.stopPropagation();\n      if (event.target.closest('[data-vode-ve-toggle]')) {\n        setCompact(!panel.classList.contains('is-compact'));\n        return;\n      }\n      if (event.target.closest('[data-vode-ve-panel-hide]')) {\n        setPanelHidden(true);\n        setStatus('Panel hidden');\n        return;\n      }\n      if (event.target.closest('button')) flushInputHistory();\n      const align = event.target.closest('[data-vode-ve-align]');\n      const layer = event.target.closest('[data-vode-ve-layer]');\n      if (align) alignSelected(align.dataset.vodeVeAlign);\n      if (layer) layerSelected(Number(layer.dataset.vodeVeLayer));\n      if (event.target.closest('[data-vode-ve-copy]')) copyCss();\n      if (event.target.closest('[data-vode-ve-reset]')) resetSelected();\n      if (event.target.closest('[data-vode-ve-lock]')) toggleLock();\n      if (event.target.closest('[data-vode-ve-undo]')) undo();\n      if (event.target.closest('[data-vode-ve-copy-style]')) copyStyle();\n      if (event.target.closest('[data-vode-ve-paste-style]')) pasteStyle();\n      if (event.target.closest('[data-vode-ve-hide]')) hideSelected();\n      if (event.target.closest('[data-vode-ve-clear]')) {\n        clearSelection();\n        setStatus('Select object');\n        updateCssOutput();\n      }\n    }, true);\n\n    panel.addEventListener('input', (event) => {\n      const input = event.target.closest('[data-vode-ve-control]');\n      if (!input) return;\n      if (!inputHistoryTimer) pushHistory();\n      window.clearTimeout(inputHistoryTimer);\n      inputHistoryTimer = window.setTimeout(() => {\n        inputHistoryTimer = 0;\n      }, 350);\n      selectedElements().forEach((element) => {\n        if (isLocked(element)) return;\n        let value = input.value;\n        if (input.dataset.vodeVeUnit && value !== '') value = `${value}${input.dataset.vodeVeUnit}`;\n        if (input.dataset.vodeVeControl === 'border-width' && value !== '' && getDeviceState(element)['border-style'] == null) {\n          setStyle(element, 'border-style', 'solid');\n        }\n        setStyle(element, input.dataset.vodeVeControl, value);\n      });\n      setStatus('Style updated');\n    });\n\n    panel.querySelector('[data-vode-ve-device]').addEventListener('change', (event) => {\n      deviceMode = event.target.value;\n      syncPanelValues();\n      setStatus(`${deviceMode} mode`);\n    });\n\n    panel.addEventListener('pointerdown', (event) => {\n      const handle = event.target.closest('[data-vode-ve-panel-handle]');\n      if (!handle) return;\n      event.preventDefault();\n      event.stopPropagation();\n      const rect = panel.getBoundingClientRect();\n      const start = { x: event.clientX, y: event.clientY, left: rect.left, top: rect.top };\n\n      const move = (moveEvent) => {\n        const left = clamp(start.left + moveEvent.clientX - start.x, 4, window.innerWidth - panel.offsetWidth - 4);\n        const top = clamp(start.top + moveEvent.clientY - start.y, 4, window.innerHeight - panel.offsetHeight - 4);\n        panel.style.left = px(left);\n        panel.style.top = px(top);\n        moveEvent.preventDefault();\n        moveEvent.stopPropagation();\n      };\n\n      const stop = () => {\n        document.removeEventListener('pointermove', move, true);\n        document.removeEventListener('pointerup', stop, true);\n        writeJson(panelPositionKey, { left: panel.getBoundingClientRect().left, top: panel.getBoundingClientRect().top });\n      };\n\n      document.addEventListener('pointermove', move, true);\n      document.addEventListener('pointerup', stop, true);\n    }, true);\n  };\n\n  const startElementDrag = (element, event) => {\n    if (isLocked(element)) {\n      setStatus('Locked');\n      return;\n    }\n    if (!selected.has(element)) selectElement(element, event.shiftKey);\n    pushHistory();\n    const starts = selectedElements().map((item) => ({ element: item, ...getTranslate(item) }));\n    const targets = getAlignmentTargets(starts.map((item) => item.element));\n    activeDrag = { x: event.clientX, y: event.clientY, starts, targets };\n\n    const move = (moveEvent) => {\n      if (!activeDrag) return;\n      const dx = moveEvent.clientX - activeDrag.x;\n      const dy = moveEvent.clientY - activeDrag.y;\n      if (Math.hypot(dx, dy) < 2) return;\n      const group = selectedBounds();\n      const snapped = snapDelta({\n        left: group.left + dx,\n        top: group.top + dy,\n        right: group.right + dx,\n        bottom: group.bottom + dy,\n        width: group.width,\n        height: group.height,\n      }, activeDrag.targets);\n      showGuides(snapped.guideX, snapped.guideY);\n      activeDrag.starts.forEach((item) => setTranslate(item.element, item.x + dx + snapped.snapX, item.y + dy + snapped.snapY));\n      moveEvent.preventDefault();\n      moveEvent.stopPropagation();\n    };\n\n    const stop = (upEvent) => {\n      document.removeEventListener('pointermove', move, true);\n      document.removeEventListener('pointerup', stop, true);\n      lastDragEnd = Date.now();\n      activeDrag = null;\n      hideGuides();\n      setStatus('Moved');\n      upEvent.preventDefault();\n      upEvent.stopPropagation();\n    };\n\n    document.addEventListener('pointermove', move, true);\n    document.addEventListener('pointerup', stop, true);\n  };\n\n  const bindEditorEvents = () => {\n    document.addEventListener('pointerdown', (event) => {\n      if (!canUseEditor()) return;\n      if (event.target.closest(ignoreSelector)) return;\n      const element = getEditable(event.target);\n      if (!element) return;\n      createPanel();\n      selectElement(element, event.shiftKey);\n      startElementDrag(element, event);\n      event.preventDefault();\n      event.stopPropagation();\n    }, true);\n\n    document.addEventListener('click', (event) => {\n      if (!canUseEditor()) return;\n      if (event.target.closest('.vode-visual-editor-panel')) return;\n      if (Date.now() - lastDragEnd < 260 || event.target.closest(ignoreSelector)) {\n        event.preventDefault();\n        event.stopPropagation();\n      }\n    }, true);\n  };\n\n  const activate = () => {\n    if (!canUseEditor()) return false;\n    document.documentElement.classList.add('vode-visual-editor-active');\n    createPanel();\n    bindEditorEvents();\n    setStatus('Select object');\n    return true;\n  };\n\n  if (!activate()) {\n    let attempts = 0;\n    const retry = window.setInterval(() => {\n      attempts += 1;\n      if (activate() || attempts > 24) window.clearInterval(retry);\n    }, 250);\n  }\n})();\n"],
  "mappings": "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",
  "names": []
}
