{
  "version": 3,
  "sources": ["/cdn/shop/t/4/assets/gcz-v4-storefront-20260729-resilience-v1.js?gczv4=conversion-20261006f"],
  "sourcesContent": ["import { syncStyleGallery } from './gcz-v4-style-gallery-20261003-v1.js';\nimport { prepareCartConfirmation } from './gcz-v4-cart-confirmation-20261006-conversion-v1.js';\nimport {\n  buildPages,\n  cartItems,\n  cartDisplayProperties,\n  createInitialState,\n  restoreCustomizationState,\n  customizationEditRequest,\n  currentPageIndex,\n  nextPageId,\n  normalizeConfig,\n  pageRequiredErrors,\n  previousPageId,\n  quantityForModule,\n  reconcileStateForConfig,\n  requiredErrorsBeforePage,\n  selectOption,\n  setQuantity,\n  setText,\n  setToggle,\n  setUploadSlot\n} from \"./gcz-v4-core-20261006-conversion-v1.js\";\nimport { mountCustomizer } from \"./gcz-v4-renderer-20261006-conversion-v1.js\";\nimport { uploadFileToEndpoint, validateUploadFile, UPLOAD_TOO_LARGE_MESSAGE } from \"./gcz-v4-upload-20260924-feedback-v1.js\";\n\nconst ADMIN_PREVIEW_STATE_KEY = \"gczV4AdminPreviewState\";\nconst CART_DRAWER_ID = \"gcz-v4-cart-drawer\";\nconst CART_DRAWER_OPEN_CLASS = \"gcz-v4-cart-drawer-open\";\nconst CART_GROUP_PROPERTY_CACHE_KEY = \"gcz:v4:cart-group-properties\";\nconst CART_GROUP_PROPERTY_MEMORY_KEY = \"__gczV4CartGroupProperties\";\nconst CONFIG_FETCH_ATTEMPTS = 3;\nconst STOREFRONT_APP_VERSION = \"2026-07-29-resilience-v1\";\nconst ERROR_REPORT_ENDPOINT = \"https://customizer.gleamifyart.com/v4/api/error-report\";\n\nconst mounts = Array.from(new Set(document.querySelectorAll(\"[data-gcz-v4], [data-gleamify-customizer], .gleamify-customizer\")));\n\nmounts.forEach((mount) => {\n  if (mount.dataset.gczV4Booted === \"true\") return;\n  mount.dataset.gczV4Booted = \"true\";\n  prepareMount(mount);\n  bootMount(mount);\n});\n\nasync function bootMount(mount) {\n  try {\n    await init(mount);\n  } catch (error) {\n    console.error(\"[Gleamify Customizer V4]\", error);\n    reportTerminalError(mount, \"config\", error);\n    renderStartupError(mount);\n  }\n}\n\nfunction renderStartupError(mount) {\n  mount.innerHTML = `\n    <div class=\"gcz-v4-error\" role=\"alert\">\n      <span>Customization options are temporarily unavailable.</span>\n      <button type=\"button\" data-gcz-v4-retry>Try again</button>\n    </div>\n  `;\n  mount.querySelector(\"[data-gcz-v4-retry]\")?.addEventListener(\"click\", async (event) => {\n    const button = event.currentTarget;\n    if (button.disabled) return;\n    button.disabled = true;\n    button.setAttribute(\"aria-busy\", \"true\");\n    mount.innerHTML = `<div class=\"gcz-v4-error\" role=\"status\">Reloading customization options...</div>`;\n    await bootMount(mount);\n  }, { once: true });\n}\n\nfunction prepareMount(mount) {\n  mount.dataset.gczV4 = \"\";\n  mount.classList.remove(\"gleamify-customizer\");\n  mount.classList.add(\"gcz-v4\");\n\n  if (!mount.dataset.configUrl || /(gleamify-customizer-config|gcz-v4-config)\\.json/.test(mount.dataset.configUrl)) {\n    mount.dataset.configUrl = buildConfigUrl(mount);\n  }\n\n  if (!mount.dataset.uploadEndpoint) {\n    mount.dataset.uploadEndpoint = window.__GCZ_V4_UPLOAD_ENDPOINT__ || \"/apps/gleamify-customizer-v4/api/uploads\";\n  }\n}\n\nasync function init(mount) {\n  const fallbackConfigUrl = mount.dataset.configUrl || buildConfigUrl(mount);\n  const configUrl = mount.dataset.fastConfigUrl || buildFastConfigUrl(mount) || fallbackConfigUrl;\n  let config = normalizeConfig(await loadRuntimeConfig(configUrl, fallbackConfigUrl));\n  config = applyRuntimeProductContext(config, mount);\n  if (!customizerAppliesToProduct(config, mount)) {\n    mount.hidden = true;\n    mount.innerHTML = \"\";\n    return;\n  }\n  const adminPreview = isAdminPreviewMount(mount);\n  let mobileFooterHost = null;\n  let state = adminPreview ? restoreAdminPreviewState(config) : createInitialState(config);\n  const editGroupId = !adminPreview && new URLSearchParams(window.location.search).get('edit_customization');\n  if (editGroupId) {\n    const cart = await fetchCart();\n    const item = cart.items?.find(line => cartItemGroupId(line) === editGroupId && line.properties?._gleamify_parent_item === 'true');\n    if (!item || String(item.variant_id || item.id) !== String(mount.dataset.variantId)) throw new Error('The customization is no longer in your cart.');\n    mount.gczV4Edit = { groupId: editGroupId, variantId: mount.dataset.variantId, payload: item.properties._gleamify_customizer_payload };\n    customizationEditRequest(cart, mount.gczV4Edit, {});\n    state = restoreCustomizationState(config, item.properties);\n    state.editing = true;\n  }\n  let pendingMobileScrollSelection = null;\n  const syncProductColumnWidth = () => syncStorefrontProductColumnWidth(mount, adminPreview);\n  const syncMobileScale = () => syncMobileDesignScale(mount);\n  const syncResponsiveLayout = () => {\n    syncProductColumnWidth();\n    syncMobileScale();\n    mobileFooterHost = syncMobileFooter(mount, adminPreview, mobileFooterHost, handleClick);\n  };\n\n  const persistPreviewState = () => {\n    if (!adminPreview) return;\n    saveAdminPreviewState(state);\n  };\n\n  const render = () => {\n    const variant = mount.dataset.previewDevice === \"mobile\" ? \"admin-mobile\" : \"storefront\";\n    mountCustomizer(mount, config, state, { variant });\n    setupMobileImageLoops(mount, pendingMobileScrollSelection);\n    pendingMobileScrollSelection = null;\n    requestAnimationFrame(syncResponsiveLayout);\n  };\n  const update = (nextState) => {\n    state = typeof nextState === \"function\" ? nextState(state) : nextState;\n    persistPreviewState();\n    render();\n  };\n  const controller = {\n    getConfig: () => clone(config),\n    getState: () => clone(state),\n    setConfig: (nextConfig, nextState) => {\n      config = applyRuntimeProductContext(normalizeConfig(nextConfig), mount);\n      state = reconcileStateForConfig(config, nextState || state);\n      persistPreviewState();\n      render();\n    },\n    setState: (nextState) => {\n      state = reconcileStateForConfig(config, clone(nextState));\n      persistPreviewState();\n      render();\n    },\n    render\n  };\n\n  const handleClick = async (event) => {\n    const mobileScroll = event.target.closest(\"[data-gcz-mobile-scroll]\");\n    if (mobileScroll) {\n      scrollMobileImageGrid(mobileScroll);\n      return;\n    }\n\n    const select = event.target.closest(\"[data-gcz-select]\");\n    if (select) {\n      pendingMobileScrollSelection = {\n        moduleId: select.dataset.gczSelect || \"\",\n        value: select.dataset.gczValue || \"\"\n      };\n      update(selectOption(config, state, select.dataset.gczSelect, select.dataset.gczValue));\n      if (!adminPreview) void syncStyleGallery(mount, config, select.dataset.gczSelect, select.dataset.gczValue).catch(error => console.warn('[Gleamify style preview]', error));\n      return;\n    }\n\n    const toggle = event.target.closest(\".gcz-v4-toggle-control[data-gcz-toggle]\");\n    if (toggle) {\n      update(setToggle(config, state, toggle.dataset.gczToggle, !state.toggles?.[toggle.dataset.gczToggle]));\n      return;\n    }\n\n    const quantityAdjust = event.target.closest(\"[data-gcz-quantity-adjust]\");\n    if (quantityAdjust) {\n      const module = config.modules.find((item) => item.id === quantityAdjust.dataset.gczQuantityAdjust);\n      if (module) {\n        const delta = Number(quantityAdjust.dataset.gczQuantityDelta || 0);\n        update(setQuantity(config, state, module.id, quantityForModule(module, state) + delta * (module.step || 1)));\n      }\n      return;\n    }\n\n    const back = event.target.closest(\"[data-gcz-back]\");\n    if (back) {\n      update({ ...state, pageId: previousPageId(config, state) });\n      return;\n    }\n\n    const pageButton = event.target.closest(\"[data-gcz-page]\");\n    if (pageButton) {\n      const targetPageId = pageButton.dataset.gczPage;\n      const targetIndex = buildPages(config, state).findIndex((page) => page.id === targetPageId);\n      if (targetIndex > currentPageIndex(config, state)) {\n        const errors = requiredErrorsBeforePage(config, state, targetPageId);\n        if (errors.length) {\n          showErrors(mount, errors);\n          return;\n        }\n      }\n      update({ ...state, pageId: targetPageId });\n      return;\n    }\n\n    const next = event.target.closest(\"[data-gcz-next]\");\n    if (next) {\n      const targetPageId = nextPageId(config, state);\n      const errors = requiredErrorsBeforePage(config, state, targetPageId);\n      if (errors.length) {\n        showErrors(mount, errors);\n        return;\n      }\n      update({ ...state, pageId: targetPageId });\n      return;\n    }\n\n    const buyNow = event.target.closest(\"[data-gcz-buy-now]\");\n    if (buyNow) {\n      await submitCart(mount, config, state, true, buyNow);\n      return;\n    }\n\n    const modalClose = event.target.closest(\"[data-gcz-modal-close]\");\n    if (modalClose) closeModal(mount);\n  };\n  mount.addEventListener(\"click\", handleClick);\n\n  mount.addEventListener(\"change\", async (event) => {\n    const input = event.target.closest(\"[data-gcz-upload]\");\n    if (!input || !input.files?.[0]) return;\n    await uploadFile(mount, config, update, input.dataset.gczUpload, Number(input.dataset.gczIndex), input.files[0]);\n  });\n\n  mount.addEventListener(\"input\", (event) => {\n    const quantity = event.target.closest(\"[data-gcz-quantity]\");\n    if (quantity) {\n      update(setQuantity(config, state, quantity.dataset.gczQuantity, quantity.value));\n      return;\n    }\n\n    const input = event.target.closest(\"[data-gcz-text]\");\n    if (!input) return;\n    state = setText(state, input.dataset.gczText, input.value);\n    persistPreviewState();\n  });\n\n  mount.gczV4Controller = controller;\n  window.addEventListener(\"resize\", syncResponsiveLayout, { passive: true });\n  window.addEventListener(\"load\", syncMobileScale, { passive: true });\n  if (document.fonts?.ready) document.fonts.ready.then(syncMobileScale).catch(() => {});\n  if (window.ResizeObserver) {\n    const resizeObserver = new ResizeObserver(syncMobileScale);\n    resizeObserver.observe(mount);\n    mount.gczV4ResizeObserver = resizeObserver;\n  }\n  render();\n  window.dispatchEvent(new CustomEvent(\"gcz-v4:ready\", { detail: { mount, controller } }));\n}\n\nasync function loadRuntimeConfig(primaryUrl, fallbackUrl) {\n  const urls = Array.from(new Set([primaryUrl, fallbackUrl].filter(Boolean)));\n  let lastError = null;\n\n  for (const configUrl of urls) {\n    const prefetched = window.__GCZ_V4_CONFIG_PREFETCH__?.[configUrl];\n    if (prefetched) {\n      try {\n        return clone(await prefetched);\n      } catch (error) {\n        lastError = error;\n        console.warn(\"[Gleamify Customizer V4] Config prefetch failed; retrying.\", error);\n      }\n    }\n\n    for (let attempt = 1; attempt <= CONFIG_FETCH_ATTEMPTS; attempt += 1) {\n      try {\n        const response = await fetch(configUrl, configFetchOptions(configUrl));\n        if (!response.ok) {\n          const error = new Error(`Config request failed: ${response.status}`);\n          error.code = `CONFIG_${response.status}`;\n          throw error;\n        }\n        return response.json();\n      } catch (error) {\n        lastError = error;\n        if (attempt === CONFIG_FETCH_ATTEMPTS || !shouldRetryRequestError(error)) break;\n        await delay(350 * attempt * attempt);\n      }\n    }\n  }\n\n  throw lastError || new Error(\"Config request failed.\");\n}\n\nfunction configFetchOptions(configUrl) {\n  const sameOrigin = !/^https?:\\/\\//i.test(configUrl) || configUrl.startsWith(window.location.origin);\n  return { credentials: sameOrigin ? \"same-origin\" : \"omit\", cache: \"no-store\" };\n}\n\nfunction shouldRetryRequestError(error) {\n  const status = Number(String(error?.code || error?.message || \"\").match(/\\b(\\d{3})\\b/)?.[1] || 0);\n  return !status || [408, 425, 429, 500, 502, 503, 504].includes(status);\n}\n\nfunction reportTerminalError(mount, category, error) {\n  const endpoint = window.__GCZ_V4_ERROR_REPORT_ENDPOINT__ || ERROR_REPORT_ENDPOINT;\n  const payload = {\n    category,\n    code: terminalErrorCode(category, error),\n    message: String(error?.message || error || \"Unexpected storefront error\"),\n    path: window.location.pathname,\n    productHandle: mount?.dataset?.productHandle || \"\",\n    productId: mount?.dataset?.productId || \"\",\n    appVersion: STOREFRONT_APP_VERSION\n  };\n  fetch(endpoint, {\n    method: \"POST\",\n    headers: { \"Content-Type\": \"application/json\" },\n    body: JSON.stringify(payload),\n    keepalive: true,\n    credentials: \"omit\"\n  }).catch(() => {});\n}\n\nfunction terminalErrorCode(category, error) {\n  const supplied = String(error?.code || \"\").replace(/[^a-zA-Z0-9_-]/g, \"\").slice(0, 48);\n  if (supplied) return supplied;\n  const status = String(error?.message || \"\").match(/\\b(\\d{3})\\b/)?.[1];\n  return `${String(category || \"runtime\").toUpperCase()}_${status || \"FAILED\"}`;\n}\n\nfunction buildConfigUrl(mount) {\n  if (window.__GCZ_V4_CONFIG_URL__) return window.__GCZ_V4_CONFIG_URL__;\n  const url = new URL(\"/apps/gleamify-customizer-v4/api/config\", window.location.origin);\n  if (mount.dataset.productHandle) url.searchParams.set(\"product_handle\", mount.dataset.productHandle);\n  if (mount.dataset.productId) url.searchParams.set(\"product_id\", mount.dataset.productId);\n  return `${url.pathname}${url.search}`;\n}\n\nfunction buildFastConfigUrl(mount) {\n  if (window.__GCZ_V4_FAST_CONFIG_URL__) return window.__GCZ_V4_FAST_CONFIG_URL__;\n  if (!mount.dataset.productHandle && !mount.dataset.productId) return \"\";\n  const url = new URL(\"https://customizer.gleamifyart.com/v4/api/config\");\n  if (mount.dataset.productHandle) url.searchParams.set(\"product_handle\", mount.dataset.productHandle);\n  if (mount.dataset.productId) url.searchParams.set(\"product_id\", mount.dataset.productId);\n  return url.toString();\n}\n\nfunction clone(value) {\n  return JSON.parse(JSON.stringify(value));\n}\n\nfunction applyRuntimeProductContext(config, mount) {\n  const runtimeBasePriceCents = parseRuntimeCents(mount.dataset.basePriceCents);\n  const runtimeCurrency = String(mount.dataset.currency || \"\").trim();\n  const nextCart = { ...(config.cart || {}) };\n  let changed = false;\n\n  if (runtimeBasePriceCents > 0 && Number(nextCart.basePriceCents) !== runtimeBasePriceCents) {\n    nextCart.basePriceCents = runtimeBasePriceCents;\n    changed = true;\n  }\n\n  if (runtimeCurrency && !nextCart.currency) {\n    nextCart.currency = runtimeCurrency;\n    changed = true;\n  }\n\n  return changed ? { ...config, cart: nextCart } : config;\n}\n\nfunction parseRuntimeCents(value) {\n  const number = Number(value);\n  return Number.isFinite(number) && number >= 0 ? Math.round(number) : 0;\n}\n\nfunction isAdminPreviewMount(mount) {\n  return Boolean(mount.closest(\".gcz-v4-admin-preview-stage\")) || mount.dataset.configUrl === \"/v4/api/config\";\n}\n\nfunction syncStorefrontProductColumnWidth(mount, adminPreview) {\n  mount.style.removeProperty(\"--gcz-v4-product-column-extra-width\");\n  delete mount.dataset.gczProductColumnAlign;\n}\n\nfunction syncMobileFooter(mount, adminPreview, host, handleClick) {\n  const root = mount.querySelector(\"[data-gcz-root]\");\n  const mobile = !adminPreview && window.matchMedia(\"(max-width: 749px)\").matches;\n  if (!mobile || !root || !mount.isConnected) {\n    const footer = host?.querySelector(\".gcz-v4-footer\");\n    if (footer && root && !root.querySelector(\".gcz-v4-footer\")) root.querySelector(\".gcz-v4-shell\").append(footer);\n    root?.querySelector(\"[data-gcz-footer-spacer]\")?.remove();\n    host?.remove();\n    return null;\n  }\n  if (!host) {\n    host = document.createElement(\"div\");\n    host.className = \"gcz-v4 gcz-v4-mobile-footer-host\";\n    host.addEventListener(\"click\", handleClick);\n    document.body.append(host);\n  }\n  host.removeAttribute(\"style\");\n  for (const name of root.style) {\n    if (name.startsWith(\"--\")) host.style.setProperty(name, root.style.getPropertyValue(name));\n  }\n  const footer = root.querySelector(\".gcz-v4-footer\");\n  if (footer) host.replaceChildren(footer);\n  let spacer = root.querySelector(\"[data-gcz-footer-spacer]\");\n  if (!spacer) {\n    spacer = document.createElement(\"div\");\n    spacer.dataset.gczFooterSpacer = \"\";\n    spacer.setAttribute(\"aria-hidden\", \"true\");\n    root.querySelector(\".gcz-v4-shell\").append(spacer);\n  }\n  const scale = Number(mount.style.getPropertyValue(\"--gcz-mobile-scale\")) || 1;\n  spacer.style.height = `${Math.ceil(host.getBoundingClientRect().height / scale)}px`;\n  return host;\n}\n\nfunction syncMobileDesignScale(mount) {\n  const root = mount.querySelector(\"[data-gcz-root]\");\n  if (!root || !usesFixedMobileDesign(root)) {\n    clearMobileDesignScale(mount);\n    return;\n  }\n\n  const rootStyles = window.getComputedStyle(root);\n  const designWidth = readPositivePx(rootStyles.getPropertyValue(\"--gcz-mobile-design-width\"), 390);\n  const availableWidth = Math.floor(mount.getBoundingClientRect().width || mount.clientWidth || 0);\n  if (!designWidth || !availableWidth) return;\n\n  const scale = Math.min(1, availableWidth / designWidth);\n  mount.dataset.gczMobileScaled = \"true\";\n  mount.style.setProperty(\"--gcz-mobile-scale\", scale.toFixed(4));\n\n  requestAnimationFrame(() => {\n    const currentRoot = mount.querySelector(\"[data-gcz-root]\");\n    if (!currentRoot || !usesFixedMobileDesign(currentRoot)) {\n      clearMobileDesignScale(mount);\n      return;\n    }\n    const unscaledHeight = Math.max(currentRoot.offsetHeight || 0, currentRoot.scrollHeight || 0);\n    if (!unscaledHeight) return;\n    mount.style.setProperty(\"--gcz-mobile-scaled-height\", `${Math.ceil(unscaledHeight * scale)}px`);\n  });\n}\n\nfunction usesFixedMobileDesign(root) {\n  if (root.classList.contains(\"gcz-v4--admin-mobile\")) return true;\n  return root.classList.contains(\"gcz-v4--storefront\") && Boolean(window.matchMedia?.(\"(max-width: 749px)\")?.matches);\n}\n\nfunction clearMobileDesignScale(mount) {\n  delete mount.dataset.gczMobileScaled;\n  mount.style.removeProperty(\"--gcz-mobile-scale\");\n  mount.style.removeProperty(\"--gcz-mobile-scaled-height\");\n}\n\nfunction readPositivePx(value, fallback) {\n  const number = Number.parseFloat(value);\n  return Number.isFinite(number) && number > 0 ? number : fallback;\n}\n\nfunction restoreAdminPreviewState(config) {\n  try {\n    const raw = localStorage.getItem(ADMIN_PREVIEW_STATE_KEY);\n    if (!raw) return createInitialState(config);\n    return reconcileStateForConfig(config, JSON.parse(raw));\n  } catch {\n    return createInitialState(config);\n  }\n}\n\nfunction saveAdminPreviewState(state) {\n  try {\n    localStorage.setItem(ADMIN_PREVIEW_STATE_KEY, JSON.stringify(state));\n  } catch {\n    // Preview persistence is best-effort and must never block storefront rendering.\n  }\n}\n\nfunction setupMobileImageLoops(mount, selectedTarget = null) {\n  mount.querySelectorAll(\".gcz-v4-image-grid--mobile-scroll\").forEach((scroller) => {\n    const isLoop = scroller.dataset.gczMobileLoop === \"true\";\n    requestAnimationFrame(() => {\n      if (isLoop) initializeMobileImageLoop(scroller);\n      const selectedValue = selectedTarget?.moduleId === scroller.dataset.gczMobileScrollGrid ? selectedTarget.value : undefined;\n      scrollSelectedMobileImageOptionIntoView(scroller, selectedValue);\n    });\n    if (!isLoop) return;\n    enableMobileImageMouseDrag(scroller);\n    let frame = 0;\n    scroller.addEventListener(\"scroll\", () => {\n      if (frame) return;\n      frame = requestAnimationFrame(() => {\n        frame = 0;\n        normalizeMobileImageLoop(scroller);\n      });\n    }, { passive: true });\n  });\n}\n\nfunction enableMobileImageMouseDrag(scroller) {\n  if (scroller.dataset.gczMouseDragReady === \"true\") return;\n  scroller.dataset.gczMouseDragReady = \"true\";\n  let activePointer = null;\n  let startX = 0;\n  let startLeft = 0;\n  let dragged = false;\n\n  scroller.addEventListener(\"pointerdown\", (event) => {\n    if (event.button !== 0 || event.pointerType !== \"mouse\") return;\n    activePointer = event.pointerId;\n    startX = event.clientX;\n    startLeft = scroller.scrollLeft;\n    dragged = false;\n  });\n\n  scroller.addEventListener(\"pointermove\", (event) => {\n    if (activePointer !== event.pointerId) return;\n    const delta = event.clientX - startX;\n    if (!dragged && Math.abs(delta) > 3) {\n      dragged = true;\n      scroller.dataset.gczLoopDragging = \"true\";\n      scroller.classList.add(\"is-dragging\");\n      try {\n        scroller.setPointerCapture(event.pointerId);\n      } catch {\n        // Synthetic preview checks and older browsers may not expose an active pointer.\n      }\n    }\n    scroller.scrollLeft = startLeft - delta;\n  });\n\n  const endDrag = (event) => {\n    if (activePointer !== event.pointerId) return;\n    activePointer = null;\n    delete scroller.dataset.gczLoopDragging;\n    scroller.classList.remove(\"is-dragging\");\n    if (dragged) scroller.dataset.gczLoopSuppressClick = \"true\";\n    normalizeMobileImageLoop(scroller);\n    try {\n      scroller.releasePointerCapture(event.pointerId);\n    } catch {\n      // Pointer capture is best-effort for desktop preview dragging.\n    }\n  };\n\n  scroller.addEventListener(\"pointerup\", endDrag);\n  scroller.addEventListener(\"pointercancel\", endDrag);\n  scroller.addEventListener(\"click\", (event) => {\n    if (scroller.dataset.gczLoopSuppressClick !== \"true\") return;\n    delete scroller.dataset.gczLoopSuppressClick;\n    event.preventDefault();\n    event.stopPropagation();\n  }, true);\n}\n\nfunction scrollMobileImageGrid(button) {\n  const shell = button.closest(\".gcz-v4-image-scroll-shell\");\n  const scroller = shell?.querySelector(\".gcz-v4-image-grid--mobile-scroll\");\n  if (!scroller) return;\n\n  const direction = button.dataset.gczMobileScroll === \"previous\" ? -1 : 1;\n  initializeMobileImageLoop(scroller);\n  const visibleItems = Array.from(scroller.querySelectorAll(\".gcz-v4-image-option:not([data-gcz-hidden-mobile='true']):not([data-gcz-loop-clone])\"));\n  const firstItem = visibleItems[0];\n  if (!firstItem) return;\n\n  const firstRect = firstItem.getBoundingClientRect();\n  const secondRect = visibleItems[1]?.getBoundingClientRect();\n  const gap = secondRect ? Math.max(0, secondRect.left - firstRect.right) : 0;\n  const step = firstRect.width + gap || scroller.clientWidth;\n  const left = scroller.scrollLeft + direction * step;\n\n  scroller.scrollTo({ left, behavior: \"smooth\" });\n  window.setTimeout(() => normalizeMobileImageLoop(scroller), 520);\n}\n\nfunction initializeMobileImageLoop(scroller) {\n  const metrics = mobileImageLoopMetrics(scroller);\n  if (!metrics) return;\n\n  if (scroller.dataset.gczLoopReady === \"true\") {\n    normalizeMobileImageLoop(scroller);\n    return;\n  }\n\n  scroller.dataset.gczLoopReady = \"true\";\n  scroller.scrollLeft = metrics.loopStart;\n}\n\nfunction scrollSelectedMobileImageOptionIntoView(scroller, selectedValue) {\n  const target = findSelectedMobileImageOption(scroller, selectedValue);\n  if (!target) return;\n\n  const metrics = mobileImageLoopMetrics(scroller);\n  const centerOffset = Math.max(0, (scroller.clientWidth - target.offsetWidth) / 2);\n  let left = target.offsetLeft - centerOffset;\n  if (metrics) {\n    while (left < metrics.loopStart) left += metrics.groupWidth;\n    while (left >= metrics.loopEnd) left -= metrics.groupWidth;\n  }\n\n  scroller.dataset.gczLoopJumping = \"true\";\n  scroller.scrollLeft = Math.max(0, left);\n  window.setTimeout(() => {\n    scroller.dataset.gczLoopJumping = \"false\";\n  }, 160);\n}\n\nfunction findSelectedMobileImageOption(scroller, selectedValue) {\n  const visibleOptions = Array.from(scroller.querySelectorAll(\".gcz-v4-image-option:not([data-gcz-hidden-mobile='true'])\"));\n  const sourceOptions = visibleOptions.filter((option) => option.dataset.gczLoopOrigin === \"true\" || !option.dataset.gczLoopClone);\n  return sourceOptions.find((option) => option.dataset.gczValue === selectedValue)\n    || sourceOptions.find((option) => option.classList.contains(\"is-selected\"))\n    || visibleOptions.find((option) => option.dataset.gczValue === selectedValue)\n    || visibleOptions.find((option) => option.classList.contains(\"is-selected\"));\n}\n\nfunction normalizeMobileImageLoop(scroller) {\n  if (scroller.dataset.gczLoopDragging === \"true\") return;\n  if (scroller.dataset.gczLoopJumping === \"true\") return;\n  const metrics = mobileImageLoopMetrics(scroller);\n  if (!metrics) return;\n\n  let left = scroller.scrollLeft;\n  while (left < metrics.loopStart) left += metrics.groupWidth;\n  while (left >= metrics.loopEnd) left -= metrics.groupWidth;\n  if (Math.abs(left - scroller.scrollLeft) < 1) return;\n\n  scroller.dataset.gczLoopJumping = \"true\";\n  scroller.scrollLeft = left;\n  requestAnimationFrame(() => {\n    scroller.dataset.gczLoopJumping = \"false\";\n  });\n}\n\nfunction mobileImageLoopMetrics(scroller) {\n  if (scroller.dataset.gczMobileLoop !== \"true\") return null;\n  const firstOrigin = scroller.querySelector(\"[data-gcz-loop-origin='true']:not([data-gcz-hidden-mobile='true'])\");\n  const firstNextClone = scroller.querySelector(\"[data-gcz-loop-clone='next']:not([data-gcz-hidden-mobile='true'])\");\n  if (!firstOrigin || !firstNextClone) return null;\n\n  const loopStart = firstOrigin.offsetLeft;\n  const groupWidth = firstNextClone.offsetLeft - loopStart;\n  if (!Number.isFinite(groupWidth) || groupWidth <= 0) return null;\n\n  return {\n    loopStart,\n    loopEnd: loopStart + groupWidth,\n    groupWidth\n  };\n}\n\nfunction customizerAppliesToProduct(config, mount) {\n  const boundHandles = Array.isArray(config.productBindings?.handles) ? config.productBindings.handles.filter(Boolean) : [];\n  const productHandle = mount.dataset.productHandle || \"\";\n  if (!boundHandles.length || !productHandle) return true;\n  return boundHandles.includes(productHandle);\n}\n\nasync function uploadFile(mount, _config, update, moduleId, index, file) {\n  try {\n    validateUploadFile(file);\n  } catch (error) {\n    showErrors(mount, [{ message: error.message }]);\n    return;\n  }\n  const previewUrl = URL.createObjectURL(file);\n  update((current) => setUploadSlot(current, moduleId, index, { status: \"uploading\", name: file.name, previewUrl }));\n\n  const uploadEndpoint = mount.dataset.uploadEndpoint;\n  if (!uploadEndpoint) {\n    update((current) => setUploadSlot(current, moduleId, index, { status: \"uploaded\", name: file.name, previewUrl, url: previewUrl }));\n    return;\n  }\n\n  try {\n    const payload = await uploadFileToEndpoint(uploadEndpoint, file, {\n      productId: mount.dataset.productId,\n      productHandle: mount.dataset.productHandle\n    });\n    update((current) => setUploadSlot(current, moduleId, index, {\n      status: \"uploaded\",\n      name: file.name,\n      previewUrl,\n      url: payload.url || payload.previewUrl || previewUrl,\n      fileId: payload.fileId || \"\"\n    }));\n  } catch (error) {\n    console.error(\"[Gleamify Customizer V4 upload]\", error);\n    reportTerminalError(mount, \"upload\", error);\n    const message = error.code === \"UPLOAD_413\" ? UPLOAD_TOO_LARGE_MESSAGE : \"Upload failed. Please try again.\";\n    update((current) => setUploadSlot(current, moduleId, index, {\n      status: \"error\",\n      name: file.name,\n      previewUrl,\n      error: message\n    }));\n    showErrors(mount, [{ message }]);\n  }\n}\n\nasync function submitCart(mount, config, state, buyNow, trigger) {\n  const allErrors = [];\n  for (const page of buildPages(config, state)) allErrors.push(...pageRequiredErrors(config, { ...state, pageId: page.id }, page.id));\n  if (allErrors.length) {\n    showErrors(mount, allErrors);\n    return;\n  }\n  const items = withCartGroupProperties(cartItems(config, state, mount.dataset.variantId).filter((item) => item.id), config);\n  if (!items.length) {\n    showErrors(mount, [{ message: \"This product is not ready to add to cart.\" }]);\n    return;\n  }\n  if (trigger) {\n    trigger.disabled = true;\n    trigger.setAttribute(\"aria-busy\", \"true\");\n  }\n  try {\n    if (mount.gczV4Edit) {\n      const current = await fetchCart();\n      const nextProperties = cartItems(config, state, mount.dataset.variantId)[0].properties;\n      const request = customizationEditRequest(current, mount.gczV4Edit, nextProperties);\n      const cart = await postCartJsonWithRetry('/cart/change.js', request, 'Unable to save customization');\n      mount.gczV4Edit.payload = nextProperties._gleamify_customizer_payload;\n      rememberCartGroupProperties(mount.gczV4Edit.groupId, request.properties);\n      openCartDrawer(cart, config);\n      return;\n    }\n    const addResult = await postCartAddItems(items);\n    if (buyNow) {\n      const fallbackCart = cartWithAddedItems(null, addResult, items, config);\n      const cart = await fetchCartAfterMutation(fallbackCart);\n      openCartDrawer(cart, config);\n      return;\n    }\n    window.location.href = \"/cart\";\n  } catch (error) {\n    console.error(\"[Gleamify Customizer V4 cart]\", error);\n    reportTerminalError(mount, \"cart\", error);\n    showErrors(mount, [{ message: mount.gczV4Edit ? error.message : \"Cart update failed. Please try again.\" }]);\n  } finally {\n    if (trigger) {\n      trigger.disabled = false;\n      trigger.removeAttribute(\"aria-busy\");\n    }\n  }\n}\n\nasync function fetchCart() {\n  const response = await fetch(\"/cart.js\", {\n    headers: { Accept: \"application/json\" },\n    credentials: \"same-origin\",\n    cache: \"no-store\"\n  });\n  if (!response.ok) throw new Error(`Cart request failed: ${response.status}`);\n  return { ...(await response.json()), gczActualPrices: true };\n}\n\nfunction cartWithAddedItems(baseCart, addResult, requestedItems = [], config = {}) {\n  const addedItems = normalizedCartAddItems(addResult, requestedItems, config);\n  if (!addedItems.length) return baseCart?.items ? baseCart : null;\n  const addedKeys = new Set(addedItems.map((item) => item.key).filter(Boolean));\n  const existingItems = (baseCart?.items || []).filter((item) => !item?.key || !addedKeys.has(item.key));\n  const items = [...existingItems, ...addedItems];\n  const currency = baseCart?.currency || addResult?.currency || config?.cart?.currency || \"USD\";\n  return {\n    ...(baseCart || {}),\n    gczActualPrices: false,\n    items,\n    item_count: items.reduce((sum, item) => sum + Math.max(0, Math.floor(Number(item.quantity) || 0)), 0),\n    items_subtotal_price: cartItemsFallbackTotal(items),\n    total_price: cartItemsFallbackTotal(items),\n    original_total_price: Math.max(Number(baseCart?.original_total_price || 0), cartItemsFallbackOriginalTotal(items)),\n    currency\n  };\n}\n\nfunction normalizedCartAddItems(addResult, requestedItems = [], config = {}) {\n  const rawItems = Array.isArray(addResult?.items)\n    ? addResult.items\n    : addResult && typeof addResult === \"object\" && (addResult.id || addResult.variant_id || addResult.key)\n      ? [addResult]\n      : [];\n  const sourceItems = rawItems.length ? rawItems : requestedItems;\n  return sourceItems\n    .map((item, index) => normalizeCartAddItem(item, requestedItems[index] || requestedItems[0] || {}, config))\n    .filter(Boolean);\n}\n\nfunction normalizeCartAddItem(item = {}, requestedItem = {}, config = {}) {\n  const properties = mergeCartAddProperties(requestedItem.properties, item.properties);\n  const quantity = Math.max(1, Math.floor(Number(item.quantity ?? requestedItem.quantity) || 1));\n  const unitPrice = positiveCartMoney(\n    item.final_price,\n    item.price,\n    item.original_price,\n    requestedItem.price,\n    config?.cart?.basePriceCents,\n    properties._gleamify_bundle_unit_price_cents\n  );\n  const finalLinePrice = positiveCartMoney(item.final_line_price, item.line_price, unitPrice * quantity);\n  const originalLinePrice = Math.max(finalLinePrice, positiveCartMoney(item.original_line_price, item.line_price, unitPrice * quantity));\n  return {\n    ...item,\n    id: item.id ?? requestedItem.id ?? \"\",\n    key: item.key || requestedItem.key || `${requestedItem.id || item.id || \"line\"}:${cartItemGroupId({ properties }) || Date.now()}`,\n    variant_id: item.variant_id ?? item.id ?? requestedItem.id ?? \"\",\n    quantity,\n    properties,\n    price: positiveCartMoney(item.price, unitPrice),\n    final_price: positiveCartMoney(item.final_price, unitPrice),\n    original_price: positiveCartMoney(item.original_price, unitPrice),\n    line_price: positiveCartMoney(item.line_price, finalLinePrice),\n    final_line_price: finalLinePrice,\n    original_line_price: originalLinePrice\n  };\n}\n\nfunction mergeCartAddProperties(requestedProperties = {}, addedProperties = {}) {\n  const properties = { ...(requestedProperties || {}) };\n  for (const [name, value] of Object.entries(addedProperties || {})) {\n    if (value === null || value === undefined || value === \"\") continue;\n    properties[name] = value;\n  }\n  return properties;\n}\n\nfunction positiveCartMoney(...values) {\n  for (const value of values) {\n    const amount = Math.round(Number(value));\n    if (Number.isFinite(amount) && amount > 0) return amount;\n  }\n  return 0;\n}\n\nfunction cartItemsFallbackTotal(items) {\n  return (items || []).reduce((sum, item) => sum + Number(item.final_line_price ?? item.line_price ?? 0), 0);\n}\n\nfunction cartItemsFallbackOriginalTotal(items) {\n  return (items || []).reduce((sum, item) => sum + Number(item.original_line_price ?? item.line_price ?? item.final_line_price ?? 0), 0);\n}\n\nasync function updateCartQuantity(key, quantity, options = {}) {\n  const targetQuantity = Math.floor(Number(quantity) || 0);\n  if (targetQuantity < 1 && options.allowRemove !== true) return fetchCart();\n  const cart = await changeCartLineQuantity(key, options.allowRemove === true ? Math.max(0, targetQuantity) : Math.max(1, targetQuantity));\n  return fetchCartAfterMutation(cart);\n}\n\nasync function changeCartLineQuantity(key, quantity) {\n  return postCartJsonWithRetry(\"/cart/change.js\", {\n    id: key,\n    quantity\n  }, \"Cart quantity update failed\");\n}\n\nasync function changeCartLineQuantityByLine(line, quantity) {\n  return postCartJsonWithRetry(\"/cart/change.js\", {\n    line,\n    quantity\n  }, \"Cart quantity update failed\");\n}\n\nasync function updateCartLines(updates) {\n  return postCartJsonWithRetry(\"/cart/update.js\", { updates }, \"Cart line update failed\");\n}\n\nasync function postCartJsonWithRetry(url, payload, fallbackMessage) {\n  let lastError = null;\n  for (let attempt = 0; attempt < 5; attempt += 1) {\n    const response = await fetch(url, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n      credentials: \"same-origin\",\n      body: JSON.stringify(payload || {})\n    });\n    if (response.ok) {\n      const cart = await response.json();\n      if (Array.isArray(cart.items) && Number.isFinite(cart.total_price)) cart.gczActualPrices = true;\n      return cart;\n    }\n    const errorMessage = await cartResponseError(response, fallbackMessage);\n    lastError = new Error(errorMessage);\n    if (!shouldRetryCartMutation(response.status, errorMessage) || attempt >= 4) break;\n    await delay(Math.min(6000, 900 * (attempt + 1) * (attempt + 1)));\n  }\n  throw lastError || new Error(fallbackMessage);\n}\n\nfunction shouldRetryCartMutation(status, message) {\n  return [429, 502, 503, 504].includes(Number(status)) || /Verifying your connection|Too Many Requests|challenge/i.test(String(message || \"\"));\n}\n\nfunction isCartChallengeError(error) {\n  return /Verifying your connection|Too Many Requests|challenge|429|502|503|504/i.test(String(error?.message || error || \"\"));\n}\n\nasync function clearCart() {\n  const response = await fetch(\"/cart/clear.js\", {\n    method: \"POST\",\n    headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n    credentials: \"same-origin\"\n  });\n  if (!response.ok) throw new Error(await cartResponseError(response, \"Cart clear failed\"));\n  return response.json();\n}\n\nasync function postCartAddItems(items) {\n  return postCartJsonWithRetry(\"/cart/add.js\", { items }, \"Cart add failed\");\n}\n\nasync function updateCartLinesWithFallback(updates) {\n  try {\n    return await updateCartLines(updates);\n  } catch (bulkError) {\n    console.warn(\"[Gleamify Customizer V4 cart drawer] Bulk cart update failed; retrying lines individually.\", bulkError);\n    let cart = null;\n    for (const [key, quantity] of Object.entries(updates || {})) {\n      cart = await changeCartLineQuantity(key, quantity);\n    }\n    return cart || fetchCart();\n  }\n}\n\nasync function cartResponseError(response, fallbackMessage) {\n  const text = await response.text().catch(() => \"\");\n  if (!text) return `${fallbackMessage}: ${response.status}`;\n  try {\n    const payload = JSON.parse(text);\n    return `${fallbackMessage}: ${payload.description || payload.message || payload.status || response.status}`;\n  } catch (_error) {\n    return `${fallbackMessage}: ${text}`;\n  }\n}\n\nasync function updateCartNote(note) {\n  const response = await fetch(\"/cart/update.js\", {\n    method: \"POST\",\n    headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n    credentials: \"same-origin\",\n    body: JSON.stringify({ note: String(note || \"\") })\n  });\n  if (!response.ok) throw new Error(`Cart note update failed: ${response.status}`);\n  return response.json();\n}\n\nasync function fetchCartAfterMutation(fallbackCart = null) {\n  try {\n    return await fetchCart();\n  } catch (error) {\n    console.warn(\"[Gleamify Customizer V4 cart drawer] Fresh cart read failed after mutation; using mutation response.\", error);\n    if (fallbackCart?.items) return fallbackCart;\n    throw error;\n  }\n}\n\nasync function fetchCartUntil(predicate, fallbackCart = null) {\n  let latestCart = fallbackCart?.items ? fallbackCart : null;\n  for (let attempt = 0; attempt < 6; attempt += 1) {\n    if (attempt > 0) await delay(120 * attempt);\n    try {\n      const cart = await fetchCart();\n      latestCart = cart;\n      if (!predicate || predicate(cart)) return cart;\n    } catch (error) {\n      console.warn(\"[Gleamify Customizer V4 cart drawer] Fresh cart read attempt failed.\", error);\n    }\n  }\n  return latestCart || fetchCart();\n}\n\nfunction delay(ms) {\n  return new Promise((resolve) => window.setTimeout(resolve, ms));\n}\n\nfunction ensureCartDrawer(config) {\n  let drawer = document.getElementById(CART_DRAWER_ID);\n  if (drawer) {\n    drawer.gczV4CartConfig = config;\n    applyCartDrawerSettings(drawer, config);\n    return drawer;\n  }\n\n  drawer = document.createElement(\"div\");\n  drawer.id = CART_DRAWER_ID;\n  drawer.className = \"gcz-v4-cart-drawer\";\n  drawer.hidden = true;\n  drawer.gczV4CartConfig = config;\n  applyCartDrawerSettings(drawer, config);\n  drawer.innerHTML = `\n    <div class=\"gcz-v4-cart-drawer__overlay\" data-gcz-cart-close></div>\n    <aside class=\"gcz-v4-cart-drawer__panel\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"gcz-v4-cart-title\">\n      <header class=\"gcz-v4-cart-drawer__header\">\n        <h2 id=\"gcz-v4-cart-title\">Your cart</h2>\n        <button class=\"gcz-v4-cart-drawer__close\" type=\"button\" data-gcz-cart-close aria-label=\"Close cart\">\n          <span aria-hidden=\"true\"></span>\n        </button>\n      </header>\n      <div class=\"gcz-v4-cart-drawer__content\" data-gcz-cart-content></div>\n    </aside>\n  `;\n\n  drawer.addEventListener(\"click\", async (event) => {\n    if (event.target.closest(\"[data-gcz-cart-close]\")) {\n      closeCartDrawer();\n      return;\n    }\n\n    const checkout = event.target.closest(\"[data-gcz-cart-checkout]\");\n    if (checkout) {\n      if (!beginCartDrawerMutation(drawer)) return;\n      try {\n        drawer.gczV4Cart = await prepareCartConfirmation(drawer.gczV4Cart);\n        window.location.href = \"/checkout\";\n      } catch (error) {\n        endCartDrawerMutation(drawer);\n        checkout.textContent = \"Please try checkout again\";\n        console.error(\"[Gleamify checkout confirmation]\", error);\n      }\n      return;\n    }\n\n    const removeButton = event.target.closest(\"[data-gcz-cart-remove]\");\n    if (removeButton) {\n      if (!beginCartDrawerMutation(drawer)) return;\n      let rendered = false;\n      try {\n        const groupId = removeButton.dataset.gczCartGroup || \"\";\n        const cart = groupId\n          ? await updateCartGroupQuantity(drawer.gczV4Cart, groupId, 0, drawer.gczV4CartConfig || config, { allowRemove: true })\n          : await updateCartQuantity(removeButton.dataset.gczCartKey, 0, { allowRemove: true });\n        endCartDrawerMutation(drawer);\n        renderCartDrawer(drawer, cart, drawer.gczV4CartConfig || config);\n        rendered = true;\n      } catch (error) {\n        console.error(\"[Gleamify Customizer V4 cart drawer]\", error);\n      } finally {\n        if (!rendered) endCartDrawerMutation(drawer);\n      }\n      return;\n    }\n\n    const quantityButton = event.target.closest(\"[data-gcz-cart-quantity]\");\n    if (quantityButton) {\n      if (!beginCartDrawerMutation(drawer)) return;\n      let rendered = false;\n      try {\n        const nextQuantity = Math.floor(Number(quantityButton.dataset.gczCartQuantity) || 0);\n        if (nextQuantity < 1) {\n          endCartDrawerMutation(drawer);\n          rendered = true;\n          return;\n        }\n        const groupId = quantityButton.dataset.gczCartGroup || \"\";\n        const cart = groupId\n          ? await updateCartGroupQuantity(drawer.gczV4Cart, groupId, nextQuantity, drawer.gczV4CartConfig || config)\n          : await updateCartQuantity(quantityButton.dataset.gczCartKey, nextQuantity);\n        endCartDrawerMutation(drawer);\n        renderCartDrawer(drawer, cart, drawer.gczV4CartConfig || config);\n        rendered = true;\n      } catch (error) {\n        console.error(\"[Gleamify Customizer V4 cart drawer]\", error);\n      } finally {\n        if (!rendered) endCartDrawerMutation(drawer);\n      }\n      return;\n    }\n\n    const noteSave = event.target.closest(\"[data-gcz-cart-note-save]\");\n    if (noteSave) {\n      noteSave.disabled = true;\n      try {\n        const note = drawer.querySelector(\"[data-gcz-cart-note]\")?.value || \"\";\n        const cart = await updateCartNote(note);\n        renderCartDrawer(drawer, cart, drawer.gczV4CartConfig || config);\n      } catch (error) {\n        console.error(\"[Gleamify Customizer V4 cart note]\", error);\n      }\n    }\n  });\n\n  document.addEventListener(\"keydown\", (event) => {\n    if (event.key === \"Escape\") closeCartDrawer();\n  });\n\n  document.body.appendChild(drawer);\n  return drawer;\n}\n\nfunction beginCartDrawerMutation(drawer) {\n  if (!drawer || drawer.gczV4CartBusy) return false;\n  drawer.gczV4CartBusy = true;\n  setCartDrawerControlsBusy(drawer, true);\n  return true;\n}\n\nfunction endCartDrawerMutation(drawer) {\n  if (!drawer) return;\n  drawer.gczV4CartBusy = false;\n  setCartDrawerControlsBusy(drawer, false);\n}\n\nfunction setCartDrawerControlsBusy(drawer, busy) {\n  const controls = drawer.querySelectorAll(\"[data-gcz-cart-quantity], [data-gcz-cart-remove], [data-gcz-cart-checkout]\");\n  controls.forEach((control) => {\n    if (busy) {\n      control.dataset.gczCartWasDisabled = control.disabled ? \"true\" : \"false\";\n      control.disabled = true;\n      control.setAttribute(\"aria-busy\", \"true\");\n      return;\n    }\n    control.disabled = control.dataset.gczCartWasDisabled === \"true\";\n    control.removeAttribute(\"aria-busy\");\n    delete control.dataset.gczCartWasDisabled;\n  });\n}\n\nfunction openCartDrawer(cart, config) {\n  const drawer = ensureCartDrawer(config);\n  applyCartDrawerSettings(drawer, config);\n  renderCartDrawer(drawer, cart, config);\n  drawer.hidden = false;\n  document.body.classList.add(CART_DRAWER_OPEN_CLASS);\n  requestAnimationFrame(() => {\n    drawer.classList.add(\"is-open\");\n    drawer.querySelector(\"[data-gcz-cart-close]\")?.focus();\n  });\n}\n\nfunction closeCartDrawer() {\n  const drawer = document.getElementById(CART_DRAWER_ID);\n  if (!drawer) return;\n  drawer.classList.remove(\"is-open\");\n  document.body.classList.remove(CART_DRAWER_OPEN_CLASS);\n  window.setTimeout(() => {\n    if (!drawer.classList.contains(\"is-open\")) drawer.hidden = true;\n  }, 220);\n}\n\nfunction renderCartDrawer(drawer, cart, config) {\n  const content = drawer.querySelector(\"[data-gcz-cart-content]\");\n  if (!content) return;\n  drawer.gczV4Cart = cart;\n  const items = Array.isArray(cart.items) ? cart.items : [];\n  const groups = groupCartDrawerItems(items, config);\n  applyCartDrawerPricing(groups, config, cart);\n  const currency = cart.currency || config.cart?.currency || \"USD\";\n  if (!groups.length && !renderFreeGiftCallout(items, currency, config)) {\n    content.innerHTML = `\n      <div class=\"gcz-v4-cart-drawer__empty\">\n        <p>Your cart is empty.</p>\n      </div>\n    `;\n    return;\n  }\n\n  const thresholdCents = Math.max(0, Number(config.cart?.freeShippingThresholdCents || 0));\n  const shippingText = thresholdCents\n    ? `Free Shipping on orders over ${formatCartMoney(thresholdCents, currency)}.`\n    : \"Free Shipping unlocked.\";\n  const giftCallout = renderFreeGiftCallout(items, currency, config);\n  const visibleTotals = cartDrawerVisibleTotals(groups, cart);\n\n  content.innerHTML = `\n    <div class=\"gcz-v4-cart-drawer__scroll\">\n      <div class=\"gcz-v4-cart-drawer__items\">\n        ${groups.map((group) => renderCartDrawerItem(group, currency)).join(\"\")}\n      </div>\n    </div>\n    <div class=\"gcz-v4-cart-drawer__fixed\">\n      <div class=\"gcz-v4-cart-drawer__note\">\n        <details>\n          <summary><span>Order special instructions</span><span aria-hidden=\"true\">v</span></summary>\n          <textarea data-gcz-cart-note rows=\"3\" placeholder=\"Add a note for your order\">${escapeText(cart.note || \"\")}</textarea>\n          <button type=\"button\" data-gcz-cart-note-save>Save note</button>\n        </details>\n      </div>\n      <div class=\"gcz-v4-cart-drawer__summary\">\n        <div class=\"gcz-v4-cart-drawer__total\">\n          <strong>Estimated total</strong>\n          <span class=\"gcz-v4-cart-drawer__total-prices\">\n            ${visibleTotals.original > visibleTotals.final ? `<s>${formatCartMoney(visibleTotals.original, currency)}</s>` : \"\"}\n            <span>${formatCartMoney(visibleTotals.final, currency)}</span>\n          </span>\n        </div>\n        <p>${escapeText(shippingText)}</p>\n        ${giftCallout}\n        <button class=\"gcz-v4-cart-drawer__checkout\" type=\"button\" data-gcz-cart-checkout>\n          <span class=\"gcz-v4-cart-drawer__lock\" aria-hidden=\"true\"></span>\n          <span>Checkout</span>\n        </button>\n      </div>\n    </div>\n  `;\n}\n\nfunction renderCartDrawerItem(group, currency) {\n  const item = group.main;\n  const image = item.featured_image?.url || item.image || \"\";\n  const title = item.product_title || item.title || \"Custom portrait\";\n  const variantTitle = item.variant_title && item.variant_title !== \"Default Title\" ? item.variant_title : \"\";\n  const quantity = cartDrawerGroupQuantity(group);\n  const linePrice = Number(group.drawerLinePrice ?? cartDrawerGroupBasePrices(group).final);\n  const originalLinePrice = Number(group.drawerOriginalLinePrice ?? cartDrawerGroupBasePrices(group).original);\n  const unitPrice = quantity ? Math.round(linePrice / quantity) : Number(item.final_price ?? item.price ?? 0);\n  const key = escapeAttribute(item.key || item.id || \"\");\n  const groupAttr = group.explicitGroup ? escapeAttribute(group.groupId || \"\") : \"\";\n  const minusDisabled = quantity <= 1 ? ' disabled aria-disabled=\"true\"' : \"\";\n\n  return `\n    <article class=\"gcz-v4-cart-drawer__item\">\n      <a class=\"gcz-v4-cart-drawer__image\" href=\"${escapeAttribute(customizationEditUrl(item))}\" aria-label=\"${escapeAttribute(title)}\">\n        ${image ? `<img src=\"${escapeAttribute(image)}\" alt=\"${escapeAttribute(item.featured_image?.alt || title)}\" loading=\"lazy\">` : \"\"}\n      </a>\n      <div class=\"gcz-v4-cart-drawer__item-main\">\n        <div class=\"gcz-v4-cart-drawer__item-head\">\n          <h3>${escapeText(title)}${variantTitle ? ` <span>${escapeText(variantTitle)}</span>` : \"\"}</h3>\n          <div class=\"gcz-v4-cart-drawer__line-price\">\n            ${originalLinePrice > linePrice ? `<s>${formatCartMoney(originalLinePrice, currency)}</s>` : \"\"}\n            <span>${formatCartMoney(linePrice, currency)}</span>\n          </div>\n        </div>\n        <div class=\"gcz-v4-cart-drawer__unit\">${formatCartMoney(unitPrice, currency)}</div>\n        ${renderCartProperties(item.properties)}\n        ${item.properties?._gleamify_customizer_payload ? `<a class=\"gcz-v4-cart-edit\" href=\"${escapeAttribute(customizationEditUrl(item))}\">Edit customization</a>` : \"\"}\n        <div class=\"gcz-v4-cart-drawer__quantity\" aria-label=\"Quantity controls\">\n          <button type=\"button\" data-gcz-cart-key=\"${key}\" ${groupAttr ? `data-gcz-cart-group=\"${groupAttr}\"` : \"\"} data-gcz-cart-quantity=\"${Math.max(1, quantity - 1)}\" aria-label=\"Decrease quantity\"${minusDisabled}>-</button>\n          <span>${quantity}</span>\n          <button type=\"button\" data-gcz-cart-key=\"${key}\" ${groupAttr ? `data-gcz-cart-group=\"${groupAttr}\"` : \"\"} data-gcz-cart-quantity=\"${quantity + 1}\" aria-label=\"Increase quantity\">+</button>\n          <button class=\"gcz-v4-cart-drawer__remove\" type=\"button\" data-gcz-cart-key=\"${key}\" ${groupAttr ? `data-gcz-cart-group=\"${groupAttr}\"` : \"\"} data-gcz-cart-remove=\"true\" aria-label=\"Remove item\"><span aria-hidden=\"true\"></span></button>\n        </div>\n      </div>\n    </article>\n  `;\n}\n\nfunction customizationEditUrl(item) {\n  const url = new URL(item.url || '/', window.location.origin);\n  const groupId = cartItemGroupId(item);\n  if (groupId && item.properties?._gleamify_customizer_payload) url.searchParams.set('edit_customization', groupId);\n  return url.pathname + url.search;\n}\n\nfunction cartDrawerVisibleTotals(groups, cart) {\n  const grouped = groups.reduce(\n    (sum, group) => {\n      const prices = {\n        final: Number(group.drawerLinePrice ?? cartDrawerGroupBasePrices(group).final),\n        original: Number(group.drawerOriginalLinePrice ?? cartDrawerGroupBasePrices(group).original)\n      };\n      sum.final += prices.final;\n      sum.original += Math.max(prices.original, prices.final);\n      return sum;\n    },\n    { final: 0, original: 0 }\n  );\n  if (grouped.final > 0 || groups.length) return grouped;\n  const final = Number(cart.total_price ?? cart.items_subtotal_price ?? 0);\n  const original = Math.max(Number(cart.original_total_price ?? cart.items_subtotal_price ?? final), final);\n  return { final, original };\n}\n\nfunction withCartGroupProperties(items, config = {}) {\n  const groupId = `gcz-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n  const groupedItems = items.map((item, index) => ({\n    ...item,\n    properties: {\n      ...(item.properties || {}),\n      _gcz_cart_group: groupId,\n      _gcz_cart_role: index === 0 ? \"main\" : \"addon\",\n      _gleamify_customization_id: groupId,\n      _gleamify_customization_title: config.title || \"Gleamify Customizer V4\",\n      _gleamify_customizer_version: \"v4\",\n      _gleamify_parent_item: index === 0 ? \"true\" : \"false\",\n      _gleamify_addon_item: index === 0 ? \"false\" : \"true\"\n    }\n  }));\n  rememberCartGroupProperties(groupId, groupedItems[0]?.properties || {});\n  return groupedItems;\n}\n\nasync function updateCartGroupQuantity(cart, groupId, quantity, config = {}, options = {}) {\n  const targetQuantity = Math.floor(Number(quantity) || 0);\n  if (targetQuantity < 1 && options.allowRemove !== true) return fetchCart();\n  const drawerCartHasTargetGroup = cart?.items?.some((item) => cartItemGroupId(item) === groupId);\n  let currentCart = drawerCartHasTargetGroup ? cart : null;\n  if (!currentCart?.items) {\n    currentCart = await fetchCart().catch((error) => {\n      console.warn(\"[Gleamify Customizer V4 cart drawer] Fresh cart read failed before quantity update; using drawer state.\", error);\n      return cart?.items ? cart : null;\n    });\n  }\n  if (!currentCart?.items) throw new Error(\"Missing cart state for quantity update.\");\n  const targetItems = (currentCart?.items || []).filter((item) => cartItemGroupId(item) === groupId);\n  const updates = cartGroupQuantityUpdates(targetItems, targetQuantity, options);\n  const matchOptions = cartGroupMatchOptions(targetQuantity, options);\n  if (!Object.keys(updates).length) throw new Error(\"Missing cart group items.\");\n  if (targetQuantity === 0 && options.allowRemove === true && targetItems.length !== 1) {\n    return replaceCartGroupQuantity(currentCart, groupId, targetQuantity, config, matchOptions);\n  }\n  const optimisticCart = cartWithUpdatedGroupQuantities(currentCart, groupId, updates, matchOptions);\n  if (targetItems.length === 1) {\n    const item = targetItems[0];\n    const nextLineQuantity = updates[item.key];\n    const lineIndex = (currentCart?.items || []).findIndex((line) => line.key === item.key);\n    let nextCart = null;\n    try {\n      nextCart = await changeCartLineQuantity(item.key, nextLineQuantity);\n    } catch (primaryError) {\n      if (lineIndex < 0 || isCartChallengeError(primaryError)) throw primaryError;\n      console.warn(\"[Gleamify Customizer V4 cart drawer] Primary cart quantity update failed; retrying with alternate line identifier.\", primaryError);\n      nextCart = await changeCartLineQuantityByLine(lineIndex + 1, nextLineQuantity);\n    }\n    const immediateCart = cartGroupMutationFallbackCart(nextCart, groupId, updates, matchOptions);\n    if (immediateCart) return immediateCart;\n    const settledCart = await settleCartGroupUpdate(groupId, updates, matchOptions, nextCart, optimisticCart);\n    if (cartGroupQuantityMatches(settledCart, groupId, updates, matchOptions)) return settledCart;\n    throw new Error(\"Cart group quantity update did not reach the requested quantity.\");\n  }\n  try {\n    const nextCart = await updateCartLines(updates);\n    const immediateCart = cartGroupMutationFallbackCart(nextCart, groupId, updates, matchOptions);\n    if (immediateCart) return immediateCart;\n    const settledCart = await settleCartGroupUpdate(groupId, updates, matchOptions, nextCart, optimisticCart);\n    if (cartGroupQuantityMatches(settledCart, groupId, updates, matchOptions)) return settledCart;\n    return replaceCartGroupQuantity(settledCart, groupId, targetQuantity, config, matchOptions);\n  } catch (error) {\n    if (isCartChallengeError(error)) throw error;\n    console.warn(\"[Gleamify Customizer V4 cart drawer] Group cart update did not complete in bulk; retrying from fresh cart state.\", error);\n    try {\n      const nextCart = await updateCartGroupLinesSequentially(groupId, updates, matchOptions, currentCart);\n      const immediateCart = cartGroupMutationFallbackCart(nextCart, groupId, updates, matchOptions);\n      if (immediateCart) return immediateCart;\n      const settledCart = await settleCartGroupUpdate(groupId, updates, matchOptions, nextCart, optimisticCart);\n      if (cartGroupQuantityMatches(settledCart, groupId, updates, matchOptions)) return settledCart;\n      return replaceCartGroupQuantity(settledCart, groupId, targetQuantity, config, matchOptions);\n    } catch (retryError) {\n      if (isCartChallengeError(retryError)) throw retryError;\n      console.warn(\"[Gleamify Customizer V4 cart drawer] Sequential cart update did not fully settle; rendering latest cart state.\", retryError);\n      return replaceCartGroupQuantity(currentCart, groupId, targetQuantity, config, matchOptions);\n    }\n  }\n}\n\nfunction cartGroupMutationFallbackCart(candidateCart, groupId, updates, matchOptions) {\n  if (cartGroupQuantityMatches(candidateCart, groupId, updates, matchOptions)) return candidateCart;\n  return null;\n}\n\nasync function settleCartGroupUpdate(groupId, updates, matchOptions, candidateCart, optimisticCart) {\n  if (cartGroupQuantityMatches(candidateCart, groupId, updates, matchOptions)) return candidateCart;\n  const optimisticFallbackCart = cartGroupQuantityMatches(optimisticCart, groupId, updates, matchOptions)\n    ? optimisticCart\n    : null;\n  if (optimisticFallbackCart) return optimisticFallbackCart;\n  return candidateCart?.items ? candidateCart : optimisticCart;\n}\n\nasync function replaceCartGroupQuantity(cart, groupId, quantity, config = {}, options = {}) {\n  const sourceCart = cart?.items ? cart : await fetchCart();\n  const targetQuantity = options.allowRemove === true ? Math.max(0, Math.floor(Number(quantity) || 0)) : Math.max(1, Math.floor(Number(quantity) || 0));\n  const groupItems = (sourceCart?.items || []).filter((item) => cartItemGroupId(item) === groupId);\n  if (!groupItems.length) {\n    if (targetQuantity === 0) return sourceCart;\n    throw new Error(\"Missing cart group items for replacement.\");\n  }\n  const parent = groupItems.find((item) => cartItemRole(item) === \"main\") || groupItems[0];\n  const replacement = targetQuantity > 0 ? cartReplacementItem(parent, targetQuantity, config) : null;\n  if (targetQuantity > 0 && !replacement) throw new Error(\"Cart line cannot be rebuilt because its bundle payload is missing.\");\n  const removal = {};\n  for (const item of groupItems) {\n    if (item?.key) removal[item.key] = 0;\n  }\n  const removalOptions = { ...options, allowRemove: true, targetGroupQuantity: 0 };\n  const removedCart = await removeCartGroupBeforeReplacement(sourceCart, groupId, removal, removalOptions);\n  if (targetQuantity === 0) return removedCart;\n  const addResult = await postCartAddItems([replacement]);\n  const fallbackCart = cartWithAddedItems(removedCart, addResult, [replacement], config);\n  const replacedCart = await fetchCartUntil((nextCart) => cartGroupTargetQuantityReached((nextCart?.items || []).filter((item) => cartItemGroupId(item) === groupId), { targetGroupQuantity: targetQuantity }), fallbackCart);\n  if (cartGroupTargetQuantityReached((replacedCart?.items || []).filter((item) => cartItemGroupId(item) === groupId), { targetGroupQuantity: targetQuantity })) return replacedCart;\n  throw new Error(\"Cart group replacement did not reach the requested quantity.\");\n}\n\nasync function removeCartGroupBeforeReplacement(cart, groupId, removal, options = {}) {\n  const removeMatches = (nextCart) => cartGroupQuantityMatches(nextCart, groupId, removal, options);\n  let firstCart = cart;\n  if (Object.keys(removal).length) {\n    try {\n      firstCart = await updateCartLines(removal);\n    } catch (keyError) {\n      if (isCartChallengeError(keyError)) throw keyError;\n      console.warn(\"[Gleamify Customizer V4 cart drawer] Cart group key-based removal failed; retrying by line index.\", keyError);\n      firstCart = await removeCartGroupLinesByLine(cart, groupId);\n    }\n  }\n  const settledCart = await fetchCartUntil(removeMatches, firstCart);\n  if (removeMatches(settledCart)) return settledCart;\n  try {\n    const retryCart = await updateCartGroupLinesSequentially(groupId, removal, options, settledCart);\n    const retrySettledCart = await fetchCartUntil(removeMatches, retryCart);\n    if (removeMatches(retrySettledCart)) return retrySettledCart;\n  } catch (error) {\n    console.warn(\"[Gleamify Customizer V4 cart drawer] Cart group removal did not settle on the first replacement attempt.\", error);\n  }\n  const finalCart = await fetchCartUntil(removeMatches, settledCart);\n  if (removeMatches(finalCart)) return finalCart;\n  if (cartHasOnlyGroupItems(finalCart, groupId)) {\n    try {\n      const clearedCart = await clearCart();\n      const clearSettledCart = await fetchCartUntil(removeMatches, clearedCart);\n      if (removeMatches(clearSettledCart)) return clearSettledCart;\n    } catch (error) {\n      console.warn(\"[Gleamify Customizer V4 cart drawer] Cart clear fallback did not remove the only remaining group.\", error);\n    }\n  }\n  throw new Error(\"Cart group removal did not complete before replacement.\");\n}\n\nasync function removeCartGroupLinesByLine(cart, groupId) {\n  const indexedGroupItems = (cart?.items || [])\n    .map((item, index) => ({ item, index }))\n    .filter((entry) => cartItemGroupId(entry.item) === groupId)\n    .sort((left, right) => right.index - left.index);\n  if (!indexedGroupItems.length) return cart;\n  let nextCart = cart;\n  for (const entry of indexedGroupItems) {\n    nextCart = await changeCartLineQuantityByLine(entry.index + 1, 0);\n  }\n  return nextCart;\n}\n\nfunction cartHasOnlyGroupItems(cart, groupId) {\n  const items = cart?.items || [];\n  return !!groupId && items.length > 0 && items.every((item) => cartItemGroupId(item) === groupId);\n}\n\nfunction cartReplacementItem(item, quantity, config = {}) {\n  const variantId = cartItemVariantId(item);\n  if (!variantId) return null;\n  const groupId = cartItemGroupId(item);\n  const sourceProperties = mergedCartGroupProperties(groupId, item?.properties || {});\n  if (!sourceProperties._gleamify_bundle_components) return null;\n  const properties = {\n    ...sourceProperties,\n    _gcz_cart_group: groupId,\n    _gcz_cart_role: \"main\",\n    _gleamify_customization_id: groupId,\n    _gleamify_customization_title: sourceProperties._gleamify_customization_title || config.title || \"Gleamify Customizer V4\",\n    _gleamify_customizer_version: sourceProperties._gleamify_customizer_version || \"v4\",\n    _gleamify_parent_item: \"true\",\n    _gleamify_addon_item: \"false\"\n  };\n  if (!properties._gleamify_customizer_payload) {\n    const rebuiltPayload = cartPayloadFromVisibleProperties(properties, properties._gleamify_customization_title);\n    if (rebuiltPayload) properties._gleamify_customizer_payload = rebuiltPayload;\n  }\n  return {\n    id: variantId,\n    quantity: Math.max(1, Math.floor(Number(quantity) || 1)),\n    properties\n  };\n}\n\nfunction rememberCartGroupProperties(groupId, properties = {}) {\n  if (!groupId || !properties || typeof properties !== \"object\") return;\n  const entry = {\n    savedAt: Date.now(),\n    properties: { ...properties }\n  };\n  const memory = cartGroupPropertyMemory();\n  if (memory) memory[groupId] = entry;\n  if (typeof window === \"undefined\") return;\n  try {\n    for (const storage of cartGroupPropertyStorageBuckets()) {\n      const cache = cartGroupPropertyStorageCache(storage);\n      cache[groupId] = entry;\n      storage.setItem(CART_GROUP_PROPERTY_CACHE_KEY, JSON.stringify(trimCartGroupPropertyCache(cache)));\n    }\n  } catch (error) {\n    console.warn(\"[Gleamify Customizer V4 cart drawer] Could not remember cart group properties.\", error);\n  }\n}\n\nfunction rememberedCartGroupProperties(groupId) {\n  if (!groupId) return {};\n  try {\n    const memoryEntry = cartGroupPropertyMemory(false)?.[groupId]?.properties;\n    if (memoryEntry && typeof memoryEntry === \"object\") return memoryEntry;\n    for (const storage of cartGroupPropertyStorageBuckets()) {\n      const entry = cartGroupPropertyStorageCache(storage)?.[groupId]?.properties;\n      if (entry && typeof entry === \"object\") return entry;\n    }\n    return {};\n  } catch (error) {\n    console.warn(\"[Gleamify Customizer V4 cart drawer] Could not read remembered cart group properties.\", error);\n    return {};\n  }\n}\n\nfunction mergedCartGroupProperties(groupId, liveProperties = {}) {\n  const properties = { ...rememberedCartGroupProperties(groupId) };\n  for (const [name, value] of Object.entries(liveProperties || {})) {\n    if (value === null || value === undefined || value === \"\") continue;\n    properties[name] = value;\n  }\n  return properties;\n}\n\nfunction cartGroupPropertyMemory(create = true) {\n  if (typeof window === \"undefined\") return null;\n  const current = window[CART_GROUP_PROPERTY_MEMORY_KEY];\n  if (current && typeof current === \"object\") return current;\n  if (!create) return null;\n  window[CART_GROUP_PROPERTY_MEMORY_KEY] = {};\n  return window[CART_GROUP_PROPERTY_MEMORY_KEY];\n}\n\nfunction cartGroupPropertyStorageBuckets() {\n  if (typeof window === \"undefined\") return [];\n  const buckets = [];\n  for (const name of [\"sessionStorage\", \"localStorage\"]) {\n    try {\n      if (window[name]) buckets.push(window[name]);\n    } catch (error) {\n      console.warn(\"[Gleamify Customizer V4 cart drawer] Could not access cart group storage.\", error);\n    }\n  }\n  return buckets;\n}\n\nfunction cartGroupPropertyStorageCache(storage) {\n  try {\n    const cache = JSON.parse(storage.getItem(CART_GROUP_PROPERTY_CACHE_KEY) || \"{}\");\n    return cache && typeof cache === \"object\" ? cache : {};\n  } catch (error) {\n    console.warn(\"[Gleamify Customizer V4 cart drawer] Could not parse cart group storage cache.\", error);\n    return {};\n  }\n}\n\nfunction trimCartGroupPropertyCache(cache) {\n  return Object.fromEntries(\n    Object.entries(cache || {})\n      .sort((left, right) => Number(right[1]?.savedAt || 0) - Number(left[1]?.savedAt || 0))\n      .slice(0, 20)\n  );\n}\n\nfunction cartPayloadFromVisibleProperties(properties = {}, title = \"\") {\n  const selections = Object.entries(properties)\n    .filter(([name, value]) => value !== null && value !== undefined && value !== \"\" && !String(name).startsWith(\"_\"))\n    .map(([name, value]) => ({\n      moduleType: \"cart_property\",\n      propertyName: String(name),\n      label: String(value),\n      value: String(value),\n      index: null\n    }));\n  if (!selections.length) return \"\";\n  return JSON.stringify({\n    schemaVersion: 4,\n    title: String(title || \"\"),\n    selections\n  });\n}\n\nfunction cartGroupMatchOptions(targetQuantity, options = {}) {\n  const normalizedTarget = options.allowRemove === true\n    ? Math.max(0, Math.floor(Number(targetQuantity) || 0))\n    : Math.max(1, Math.floor(Number(targetQuantity) || 0));\n  return {\n    ...options,\n    targetGroupQuantity: normalizedTarget\n  };\n}\n\nfunction cartGroupQuantityUpdates(items, quantity, options = {}) {\n  const targetQuantity = options.allowRemove === true ? Math.max(0, Math.floor(Number(quantity) || 0)) : Math.max(1, Math.floor(Number(quantity) || 0));\n  const parentQuantity = cartGroupParentQuantity(items);\n  const updates = {};\n  for (const item of items || []) {\n    if (!item?.key) continue;\n    if (targetQuantity === 0) {\n      updates[item.key] = 0;\n      continue;\n    }\n    updates[item.key] = cartGroupTargetLineQuantity(item, parentQuantity, targetQuantity);\n  }\n  return updates;\n}\n\nfunction cartGroupParentQuantity(items) {\n  const main = (items || []).find((item) => cartItemRole(item) === \"main\");\n  const mainQuantity = positiveCartDrawerQuantity(main?.quantity);\n  if (mainQuantity) return mainQuantity;\n  const firstQuantity = positiveCartDrawerQuantity(items?.[0]?.quantity);\n  return firstQuantity || 1;\n}\n\nfunction cartGroupTargetLineQuantity(item, parentQuantity, targetQuantity) {\n  if (cartItemRole(item) !== \"addon\") return targetQuantity;\n  const currentQuantity = positiveCartDrawerQuantity(item?.quantity) || parentQuantity || 1;\n  const divisor = Math.max(1, parentQuantity || 1);\n  const componentMultiplier = Math.max(1, Math.round(currentQuantity / divisor));\n  return targetQuantity * componentMultiplier;\n}\n\nasync function updateCartGroupLinesSequentially(groupId, updates, options = {}, initialCart = null) {\n  const expected = normalizeCartQuantityUpdates(updates);\n  let cart = initialCart?.items ? initialCart : await fetchCart();\n  const initialGroupCount = (cart?.items || []).filter((item) => cartItemGroupId(item) === groupId).length;\n  const maxAttempts = Math.max(8, initialGroupCount * 4);\n  for (let attempt = 0; attempt < maxAttempts; attempt += 1) {\n    const groupItems = (cart?.items || []).filter((item) => cartItemGroupId(item) === groupId);\n    if (!groupItems.length) {\n      if (options.allowRemove === true && Object.values(expected).every((quantity) => quantity === 0)) return cart;\n      throw new Error(\"Cart group disappeared during quantity update.\");\n    }\n    if (cartGroupTargetQuantityReached(groupItems, options)) return cart;\n    const staleLine = groupItems.find((item) => Object.prototype.hasOwnProperty.call(expected, item.key) && Math.floor(Number(item.quantity) || 0) !== expected[item.key]);\n    if (!staleLine) return cart;\n    if (!staleLine.key) throw new Error(\"Missing cart line key during quantity update.\");\n    const lineIndex = (cart?.items || []).findIndex((item) => item.key === staleLine.key);\n    cart = lineIndex >= 0\n      ? await changeCartLineQuantityByLine(lineIndex + 1, expected[staleLine.key])\n      : await changeCartLineQuantity(staleLine.key, expected[staleLine.key]);\n  }\n  throw new Error(\"Cart group quantity update did not finish.\");\n}\n\nfunction cartGroupQuantityMatches(cart, groupId, updates, options = {}) {\n  const expected = normalizeCartQuantityUpdates(updates);\n  const targetQuantities = Object.values(expected);\n  const groupItems = (cart?.items || []).filter((item) => cartItemGroupId(item) === groupId);\n  if (options.allowRemove === true && targetQuantities.every((quantity) => quantity === 0)) {\n    return !groupItems.length;\n  }\n  if (!groupItems.length) return false;\n  const mismatched = groupItems.filter((item) => !Object.prototype.hasOwnProperty.call(expected, item.key) || Math.floor(Number(item.quantity) || 0) !== expected[item.key]);\n  if (!mismatched.length) return true;\n  return cartGroupTargetQuantityReached(groupItems, options);\n}\n\nfunction cartGroupTargetQuantityReached(groupItems, options = {}) {\n  const targetQuantity = Math.floor(Number(options.targetGroupQuantity) || 0);\n  if (targetQuantity < 1) return false;\n  return cartGroupParentQuantity(groupItems) === targetQuantity;\n}\n\nfunction cartWithUpdatedGroupQuantities(cart, groupId, updates, options = {}) {\n  const expected = normalizeCartQuantityUpdates(updates);\n  const removeGroup = options.allowRemove === true && Object.values(expected).every((quantity) => quantity === 0);\n  const items = (cart?.items || [])\n    .map((item) => {\n      if (cartItemGroupId(item) !== groupId) return item;\n      if (removeGroup) return null;\n      if (!Object.prototype.hasOwnProperty.call(expected, item.key)) return item;\n      return cartLineWithQuantity(item, expected[item.key]);\n    })\n    .filter(Boolean);\n  return { ...(cart || {}), items, gczActualPrices: false };\n}\n\nfunction cartLineWithQuantity(item, quantity) {\n  const nextQuantity = Math.max(0, Math.floor(Number(quantity) || 0));\n  const currentQuantity = positiveCartDrawerQuantity(item?.quantity) || 1;\n  const copy = { ...item, quantity: nextQuantity };\n  for (const field of [\"line_price\", \"final_line_price\", \"original_line_price\", \"discounted_price\"]) {\n    if (typeof copy[field] === \"number\") copy[field] = Math.round((copy[field] * nextQuantity) / currentQuantity);\n  }\n  return copy;\n}\n\nfunction normalizeCartQuantityUpdates(updates) {\n  return Object.fromEntries(\n    Object.entries(updates || {}).map(([key, value]) => [key, Math.max(0, Math.floor(Number(value) || 0))])\n  );\n}\n\nfunction groupCartDrawerItems(items, config) {\n  const groups = [];\n  const byGroupId = new Map();\n  const addonVariantIds = configuredAddonVariantIds(config);\n  const pendingAddons = [];\n  items.forEach((item, index) => {\n    if (isGiftCartItem(item, config)) return;\n    const groupId = cartItemGroupId(item);\n    const role = cartItemRole(item);\n    const addonCandidate = isConfiguredAddonCartItem(item, addonVariantIds);\n    if (!groupId && addonCandidate) {\n      pendingAddons.push({ item, index });\n      return;\n    }\n    if (groupId) {\n      let group = byGroupId.get(groupId);\n      if (!group) {\n        group = { groupId, main: null, items: [], discountEligible: true, explicitGroup: true, firstIndex: index };\n        byGroupId.set(groupId, group);\n        groups.push(group);\n      }\n      group.firstIndex = Math.min(group.firstIndex ?? index, index);\n      if (role !== \"addon\" && !group.main) group.main = item;\n      group.items.push(item);\n      return;\n    }\n    const syntheticGroupId = syntheticCartGroupId(item, groups.length);\n    const group = {\n      groupId: syntheticGroupId,\n      main: item,\n      items: [item],\n      discountEligible: isLikelyCustomizerCartItem(item, config, addonVariantIds),\n      explicitGroup: false,\n      firstIndex: index\n    };\n    groups.push(group);\n  });\n  const eligibleGroups = groups.filter((group) => group.discountEligible);\n  for (const pending of pendingAddons) {\n    const targetGroup = nearestCartDrawerGroup(eligibleGroups, pending.index);\n    if (targetGroup) {\n      targetGroup.items.push(pending.item);\n      targetGroup.firstIndex = Math.min(targetGroup.firstIndex ?? pending.index, pending.index);\n    } else {\n      groups.push({\n        groupId: syntheticCartGroupId(pending.item, groups.length),\n        main: pending.item,\n        items: [pending.item],\n        discountEligible: false,\n        explicitGroup: false,\n        firstIndex: pending.index\n      });\n    }\n  }\n  return groups\n    .sort((left, right) => (left.firstIndex ?? 0) - (right.firstIndex ?? 0))\n    .map((group) => {\n      if (!group.main) group.main = group.items[0];\n      const mainKey = group.main?.key;\n      group.items = [\n        group.main,\n        ...group.items.filter((item) => item.key !== mainKey)\n      ];\n      return group;\n    })\n    .filter((group) => group.main);\n}\n\nfunction nearestCartDrawerGroup(groups, itemIndex) {\n  if (!groups.length) return null;\n  return groups.reduce((best, group) => {\n    if (!best) return group;\n    const bestDistance = Math.abs((best.firstIndex ?? 0) - itemIndex);\n    const distance = Math.abs((group.firstIndex ?? 0) - itemIndex);\n    return distance < bestDistance ? group : best;\n  }, null);\n}\n\nfunction configuredAddonVariantIds(config) {\n  const ids = new Set();\n  for (const module of config?.modules || []) {\n    if (module?.variantId) ids.add(String(module.variantId));\n    for (const option of module?.options || []) {\n      if (option?.variantId) ids.add(String(option.variantId));\n    }\n  }\n  return ids;\n}\n\nfunction isConfiguredAddonCartItem(item, addonVariantIds) {\n  return addonVariantIds.has(cartItemVariantId(item));\n}\n\nfunction cartItemVariantId(item) {\n  if (item?.variant_id || item?.variant_id === 0) return String(item.variant_id);\n  return String(item?.id || \"\");\n}\n\nfunction syntheticCartGroupId(item, index) {\n  return `line:${String(item?.key || item?.id || index)}`;\n}\n\nfunction isLikelyCustomizerCartItem(item, config, addonVariantIds) {\n  if (cartItemGroupId(item)) return true;\n  if (isConfiguredAddonCartItem(item, addonVariantIds)) return true;\n  const baseVariantId = String(config?.cart?.baseVariantId || \"\");\n  if (baseVariantId && cartItemVariantId(item) === baseVariantId) return true;\n  return Object.keys(item?.properties || {}).some((name) =>\n    /gleamify|select|photo|number of|custom|size|frame|artwork|gift/i.test(String(name || \"\"))\n  );\n}\n\nfunction applyCartDrawerPricing(groups, config, cart) {\n  const tier = cartDrawerDiscountTier(groups, config);\n  for (const group of groups) {\n    const base = cartDrawerGroupBasePrices(group);\n    if (group.items.length === 1 && cart?.gczActualPrices === true && Number.isFinite(group.main.final_line_price)) {\n      // Shopify rounds each expanded component. Do not estimate the percentage\n      // again from the parent subtotal once the actual cart price is available.\n      group.drawerLinePrice = group.main.final_line_price;\n      group.drawerOriginalLinePrice = Math.max(base.original, group.drawerLinePrice);\n      continue;\n    }\n    const nativeDiscounted = base.original > base.final;\n    const nativeDiscountPresent = cartHasNativeDiscount(cart, group) || Boolean(group.main?.has_components);\n    const bundlePriceOwnedByV4 = cartDrawerBundleUnitPriceCents(group.main) > 0;\n    const applyEstimatedDiscount = tier && group.discountEligible && (bundlePriceOwnedByV4 || (!nativeDiscounted && !nativeDiscountPresent));\n    const final = applyEstimatedDiscount ? Math.round(base.final * (100 - tier.percentage) / 100) : base.final;\n    const estimatedOriginal = tier && group.discountEligible && nativeDiscountPresent && !nativeDiscounted\n      ? estimatedOriginalFromDiscount(base.final, tier.percentage)\n      : base.original;\n    group.drawerLinePrice = final;\n    group.drawerOriginalLinePrice = applyEstimatedDiscount ? Math.max(base.original, base.final) : Math.max(base.original, estimatedOriginal);\n  }\n}\n\nfunction cartHasNativeDiscount(cart, group) {\n  if (Number(cart?.total_discount || 0) > 0) return true;\n  if (Array.isArray(cart?.cart_level_discount_applications) && cart.cart_level_discount_applications.length) return true;\n  if (Array.isArray(cart?.discount_applications) && cart.discount_applications.length) return true;\n  return group.items.some(cartLineHasNativeDiscount);\n}\n\nfunction cartLineHasNativeDiscount(line) {\n  if (Number(line?.total_discount || 0) > 0) return true;\n  if (Number(line?.line_level_total_discount || 0) > 0) return true;\n  if (Array.isArray(line?.discounts) && line.discounts.length) return true;\n  if (Array.isArray(line?.discount_allocations) && line.discount_allocations.length) return true;\n  if (Array.isArray(line?.line_level_discount_allocations) && line.line_level_discount_allocations.length) return true;\n  return false;\n}\n\nfunction estimatedOriginalFromDiscount(finalPrice, percentage) {\n  const percent = Math.max(0, Math.min(99, Number(percentage) || 0));\n  if (!percent) return Number(finalPrice) || 0;\n  return Math.round((Number(finalPrice) || 0) / (1 - percent / 100));\n}\n\nfunction cartDrawerGroupBasePrices(group) {\n  const bundleUnitPrice = cartDrawerBundleUnitPriceCents(group.main);\n  if (bundleUnitPrice > 0) {\n    const quantity = cartDrawerGroupQuantity(group);\n    const full = bundleUnitPrice * quantity;\n    return { final: full, original: full };\n  }\n  return group.items.reduce(\n    (sum, line) => {\n      const finalLine = Number(line.final_line_price ?? line.line_price ?? 0);\n      const originalLine = Number(line.original_line_price ?? line.line_price ?? finalLine);\n      sum.final += finalLine;\n      sum.original += Math.max(originalLine, finalLine);\n      return sum;\n    },\n    { final: 0, original: 0 }\n  );\n}\n\nfunction cartDrawerBundleUnitPriceCents(item) {\n  const value = item?.properties?._gleamify_bundle_unit_price_cents;\n  const cents = Math.round(Number(value));\n  return Number.isFinite(cents) && cents > 0 ? cents : 0;\n}\n\nfunction cartDrawerGroupQuantity(group) {\n  const explicitMain = (group?.items || []).find((item) => cartItemRole(item) === \"main\");\n  const explicitMainQuantity = positiveCartDrawerQuantity(explicitMain?.quantity);\n  if (explicitMainQuantity) return explicitMainQuantity;\n  const mainQuantity = positiveCartDrawerQuantity(group?.main?.quantity);\n  if (mainQuantity) return mainQuantity;\n  for (const item of group?.items || []) {\n    const quantity = positiveCartDrawerQuantity(item?.quantity);\n    if (quantity) return quantity;\n  }\n  return 1;\n}\n\nfunction positiveCartDrawerQuantity(value) {\n  const quantity = Math.floor(Number(value));\n  return Number.isFinite(quantity) && quantity > 0 ? quantity : 0;\n}\n\nfunction cartDrawerDiscountTier(groups, config) {\n  const discount = config?.discount || {};\n  if (discount.enabled === false) return null;\n  const quantity = groups\n    .filter((group) => group.discountEligible)\n    .reduce((sum, group) => sum + cartDrawerGroupQuantity(group), 0);\n  const tiers = Array.isArray(discount.tiers) ? discount.tiers : [];\n  return tiers\n    .filter((tier) => Number(tier?.minQuantity) > 0 && Number(tier?.percentage) > 0)\n    .sort((left, right) => Number(right.minQuantity) - Number(left.minQuantity))\n    .find((tier) => quantity >= Number(tier.minQuantity)) || null;\n}\n\nfunction cartItemGroupId(item) {\n  return String(item?.properties?._gcz_cart_group || item?.properties?._gleamify_customization_id || \"\");\n}\n\nfunction cartItemRole(item) {\n  const properties = item?.properties || {};\n  if (properties._gcz_cart_role) return String(properties._gcz_cart_role);\n  if (properties._gleamify_parent_item === \"true\") return \"main\";\n  if (properties._gleamify_addon_item === \"true\") return \"addon\";\n  return \"\";\n}\n\nfunction renderCartProperties(properties) {\n  properties = cartDisplayProperties(properties);\n  let selections = [];\n  try { selections = JSON.parse(properties?._gleamify_customizer_payload || \"{}\").selections || []; } catch {}\n  const entries = Object.entries(properties || {})\n    .filter(([name, value]) => value !== null && value !== undefined && value !== \"\" && !String(name).startsWith(\"_\"))\n    .map(([name, value]) => {\n      const clean = cleanPropertyName(name);\n      const selected = selections.find(entry => entry.propertyName === clean && String(entry.value) === String(value));\n      if (selected && [\"choice\", \"image_choice\"].includes(selected.moduleType) && selected.label) value = selected.label;\n      if (/^Number of Pets(?:\\s|$)/i.test(clean)) {\n        const count = String(value).trim().match(/^(\\d+)\\s*(?:P|Pets?)?$/i);\n        if (count) value = `${Number(count[1])}P`;\n      }\n      return [name, value];\n    });\n  if (!entries.length) return \"\";\n  return `\n    <dl class=\"gcz-v4-cart-drawer__properties\">\n      ${entries.map(([name, value]) => renderCartProperty(name, value)).join(\"\")}\n    </dl>\n  `;\n}\n\nfunction renderCartProperty(name, value) {\n  const cleanName = cleanPropertyName(name);\n  const stringValue = Array.isArray(value) ? value.join(\", \") : String(value);\n  if (isImageLikeProperty(cleanName, stringValue)) {\n    return `\n      <div class=\"gcz-v4-cart-drawer__property gcz-v4-cart-drawer__property--image\">\n        <dt>${escapeText(cleanName)}:</dt>\n        <dd><img src=\"${escapeAttribute(stringValue)}\" alt=\"${escapeAttribute(cleanName)}\" loading=\"lazy\"></dd>\n      </div>\n    `;\n  }\n  return `\n    <div class=\"gcz-v4-cart-drawer__property\">\n      <dt>${escapeText(cleanName)}:</dt>\n      <dd>${escapeText(stringValue)}</dd>\n    </div>\n  `;\n}\n\nfunction renderFreeGiftCallout(items, currency, config) {\n  const settings = freeGiftSettings(config);\n  if (!settings.enabled || !settings.imageUrl) return \"\";\n  return `\n    <div class=\"gcz-v4-cart-drawer__gift\">\n      <img src=\"${escapeAttribute(settings.imageUrl)}\" alt=\"\" loading=\"lazy\">\n    </div>\n  `;\n}\n\nfunction isGiftCartItem(item, config) {\n  const title = `${item?.product_title || \"\"} ${item?.title || \"\"}`.toLowerCase();\n  const price = Number(item?.final_line_price ?? item?.line_price ?? 0);\n  const settings = freeGiftSettings(config);\n  const configuredTitle = settings.title ? String(settings.title).toLowerCase() : \"\";\n  return price === 0 && (/gift|free|welcome|tote/.test(title) || (configuredTitle && title.includes(configuredTitle)));\n}\n\nfunction freeGiftSettings(config) {\n  const gift = config?.cart?.freeGift || {};\n  return {\n    enabled: gift.enabled === true,\n    imageUrl: String(gift.imageUrl || \"\")\n  };\n}\n\nfunction applyCartDrawerSettings(drawer, config) {\n  const cart = config?.cart || {};\n  const width = Math.max(320, Number(cart.drawerWidthPx) || 560);\n  const fontScale = Math.max(60, Math.min(120, Number(cart.drawerFontScalePercent) || 86)) / 100;\n  const imageSize = Math.max(72, Number(cart.drawerImageSizePx) || 118);\n  const iconSize = Math.max(24, Number(cart.drawerIconSizePx) || 34);\n  const footerColors = config?.design?.colors?.footer || {};\n  drawer.style.setProperty(\"--gcz-cart-drawer-width\", `${width}px`);\n  drawer.style.setProperty(\"--gcz-cart-drawer-font-scale\", String(fontScale));\n  drawer.style.setProperty(\"--gcz-cart-drawer-image-size\", `${imageSize}px`);\n  drawer.style.setProperty(\"--gcz-cart-drawer-close-size\", `${iconSize}px`);\n  drawer.style.setProperty(\"--gcz-cart-drawer-checkout-bg\", footerColors.cartCheckoutBg || \"#e1b873\");\n  drawer.style.setProperty(\"--gcz-cart-drawer-checkout-text\", footerColors.cartCheckoutText || \"#ffffff\");\n}\n\nfunction cleanPropertyName(name) {\n  return String(name || \"\").replace(/^Gleamify\\s*-\\s*/i, \"\");\n}\n\nfunction isImageLikeProperty(name, value) {\n  const text = String(value || \"\");\n  return /^(https?:|blob:|data:image)/i.test(text) && (/\\.(png|jpe?g|webp|gif)(\\?|#|$)/i.test(text) || /photo|image|upload|picture|pet/i.test(name));\n}\n\nfunction formatCartMoney(cents, currency = \"USD\") {\n  const normalizedCurrency = String(currency || \"USD\").toUpperCase();\n  const amount = Math.max(0, Number(cents) || 0) / 100;\n  try {\n    return new Intl.NumberFormat(undefined, { style: \"currency\", currency: normalizedCurrency }).format(amount);\n  } catch {\n    return normalizedCurrency === \"USD\" ? `$${amount.toFixed(2)}` : `${normalizedCurrency} ${amount.toFixed(2)}`;\n  }\n}\n\nfunction showErrors(mount, errors) {\n  const modal = mount.querySelector(\"[data-gcz-modal]\");\n  const list = mount.querySelector(\"[data-gcz-modal-list]\");\n  if (!modal || !list) return;\n  list.innerHTML = errors.map((error) => `<li>${escapeText(error.type === \"upload_pending\" ? \"Your image is still uploading. Please wait.\" : error.message)}</li>`).join(\"\");\n  modal.hidden = false;\n}\n\nfunction closeModal(mount) {\n  const modal = mount.querySelector(\"[data-gcz-modal]\");\n  if (modal) modal.hidden = true;\n}\n\nfunction escapeText(value) {\n  return String(value || \"\")\n    .replace(/&/g, \"&amp;\")\n    .replace(/</g, \"&lt;\")\n    .replace(/>/g, \"&gt;\");\n}\n\nfunction escapeAttribute(value) {\n  return escapeText(value).replace(/\"/g, \"&quot;\").replace(/'/g, \"&#039;\");\n}\n"],
  "mappings": "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",
  "names": ["footer", "group"]
}
