{
  "version": 3,
  "sources": ["/cdn/shop/t/64/assets/stackhouse-beta-builder-invite.js?codex_v=20260814a"],
  "sourcesContent": ["(function initializeBetaBuilderInvite(global) {\n  'use strict';\n\n  if (!global || !global.document || global.StackhouseBetaBuilderInvite) return;\n\n  var document = global.document;\n  var rollout = document.getElementById('StackhouseOrderBuilderRoutingScript');\n  if (rollout && rollout.getAttribute('data-classic-builder-sunset-enabled') === 'true') return;\n  var storageKey = 'stackhouse:beta-builder-invite-shown:v1';\n  var builderChoiceKey = 'stackhouse:order-builder-choice:v1';\n  var displayIntervalMs = 7 * 24 * 60 * 60 * 1000;\n  var showDelayMs = 360;\n  var eligibleHandles = {\n    'test-print': true,\n    'clear-bagged-prints': true,\n    'gallery-wrapped-canvas-prints': true,\n    'giclee-fine-art-prints': true,\n    'matting-package-prints': true,\n    'mini-prints': true,\n    'mounted-prints': true,\n    'professional-photo-prints': true,\n    'retail-ready-prints': true,\n    'rolled-canvas-prints': true\n  };\n  var handleAliases = {\n    'loose-canvas-prints': 'rolled-canvas-prints',\n    'photo-prints': 'professional-photo-prints'\n  };\n  var shownThisPage = false;\n  var activeInvite = null;\n  var activeModal = null;\n  var suppressedModalContent = [];\n  var showTimer = null;\n\n  function canonicalHandle(handle) {\n    var normalized = String(handle || '').trim().toLowerCase();\n    if (normalized.indexOf('test-print-') === 0) return 'test-print';\n    return handleAliases[normalized] || normalized;\n  }\n\n  function modalHandle(modal) {\n    return canonicalHandle(modal && modal.getAttribute('data-product-handle'));\n  }\n\n  function safeStorageGet() {\n    try {\n      return Number(global.localStorage.getItem(storageKey) || 0);\n    } catch (error) {\n      return 0;\n    }\n  }\n\n  function safeStorageSet() {\n    try {\n      global.localStorage.setItem(storageKey, String(Date.now()));\n    } catch (error) {\n      return;\n    }\n  }\n\n  function qaPreviewRequested() {\n    try {\n      return new URLSearchParams(global.location.search).get('beta_invite_qa') === '1';\n    } catch (error) {\n      return false;\n    }\n  }\n\n  function classicFallbackRequested() {\n    var parameters;\n    var storedChoice = '';\n\n    try {\n      parameters = new URLSearchParams(global.location.search || '');\n      if (parameters.get('builder') === 'classic' || parameters.get('source') === 'classic_fallback') {\n        return true;\n      }\n    } catch (error) {}\n\n    try {\n      storedChoice = global.sessionStorage.getItem(builderChoiceKey) || '';\n    } catch (error) {}\n\n    return storedChoice === 'classic';\n  }\n\n  function recentlyShown() {\n    if (qaPreviewRequested()) return shownThisPage;\n    var shownAt = safeStorageGet();\n    return shownThisPage || (shownAt > 0 && Date.now() - shownAt < displayIntervalMs);\n  }\n\n  function track(eventName, handle, details) {\n    var tracking = global.stackhouseBuilderAnalytics || global.stackhouseTracking;\n    var payload = Object.assign({\n      builder: 'product_modal',\n      product_handle: handle,\n      source: 'modal_beta_invite'\n    }, details || {});\n\n    if (tracking && typeof tracking.emit === 'function') {\n      tracking.emit(eventName, payload);\n      return;\n    }\n\n    global.pendingStackhouseEmitQueue = Array.isArray(global.pendingStackhouseEmitQueue)\n      ? global.pendingStackhouseEmitQueue\n      : [];\n    global.pendingStackhouseEmitQueue.push({ eventName: eventName, details: payload });\n  }\n\n  function betaBuilderUrl(handle) {\n    return '/pages/start-order?product=' + encodeURIComponent(handle) + '&source=modal_beta_invite';\n  }\n\n  function focusableControls(invite) {\n    return Array.prototype.slice.call(invite.querySelectorAll('a[href], button:not([disabled])'));\n  }\n\n  function suppressModalContent(modal, invite) {\n    var mount = invite && invite.parentElement;\n    if (!modal || !mount) return;\n    suppressedModalContent = [];\n    Array.prototype.forEach.call(mount.children, function suppressElement(element) {\n      if (element === invite) return;\n      suppressedModalContent.push({\n        ariaHidden: element.getAttribute('aria-hidden'),\n        element: element,\n        inert: Boolean(element.inert),\n        inertAttribute: element.getAttribute('inert')\n      });\n      element.inert = true;\n      element.setAttribute('inert', '');\n      element.setAttribute('aria-hidden', 'true');\n    });\n  }\n\n  function restoreModalContent() {\n    suppressedModalContent.forEach(function restoreElement(record) {\n      var element = record.element;\n      if (!element || !element.isConnected) return;\n      element.inert = record.inert;\n      if (record.inertAttribute === null) element.removeAttribute('inert');\n      else element.setAttribute('inert', record.inertAttribute);\n      if (record.ariaHidden === null) element.removeAttribute('aria-hidden');\n      else element.setAttribute('aria-hidden', record.ariaHidden);\n    });\n    suppressedModalContent = [];\n  }\n\n  function hideInvite(method) {\n    if (!activeInvite || !activeModal) return;\n\n    var invite = activeInvite;\n    var modal = activeModal;\n    var handle = modalHandle(modal);\n    invite.hidden = true;\n    restoreModalContent();\n    activeInvite = null;\n    activeModal = null;\n\n    track('beta_builder_invite_dismissed', handle, {\n      dismiss_method: method || 'continue'\n    });\n\n    var nextFocus = modal.querySelector('[data-stackhouse-modal-title], [data-modal-step-title], [data-stackhouse-upload-input]');\n    if (nextFocus && typeof nextFocus.focus === 'function') {\n      global.setTimeout(function focusModalContent() {\n        nextFocus.focus({ preventScroll: true });\n      }, 20);\n    }\n  }\n\n  function createInvite(modal, handle) {\n    var invite = modal.querySelector('[data-beta-builder-invite]');\n    if (invite) return invite;\n\n    invite = document.createElement('div');\n    invite.className = 'stackhouse-beta-invite';\n    invite.hidden = true;\n    invite.setAttribute('data-beta-builder-invite', '');\n    invite.innerHTML = [\n      '<div class=\"stackhouse-beta-invite__backdrop\" data-beta-builder-invite-dismiss=\"backdrop\" aria-hidden=\"true\"></div>',\n      '<section class=\"stackhouse-beta-invite__card\" role=\"region\" aria-labelledby=\"stackhouse-beta-invite-title\">',\n      '<button type=\"button\" class=\"stackhouse-beta-invite__close\" id=\"stackhouse-beta-invite-close\" data-beta-builder-invite-dismiss=\"close\" aria-label=\"Continue with the current builder\"><span aria-hidden=\"true\">&times;</span></button>',\n      '<p class=\"stackhouse-beta-invite__eyebrow\">Help us test</p>',\n      '<h2 class=\"stackhouse-beta-invite__title\" id=\"stackhouse-beta-invite-title\">Try our new order builder</h2>',\n      '<p class=\"stackhouse-beta-invite__copy\">We\\'re testing a simpler way to upload, crop, and order your prints. Your cart and checkout work the same.</p>',\n      '<div class=\"stackhouse-beta-invite__actions\">',\n      '<a class=\"stackhouse-beta-invite__primary\" data-beta-builder-invite-try href=\"' + betaBuilderUrl(handle) + '\">Try the beta builder</a>',\n      '<button type=\"button\" class=\"stackhouse-beta-invite__secondary\" id=\"stackhouse-beta-invite-continue\" data-beta-builder-invite-dismiss=\"continue\">Continue with this builder</button>',\n      '</div>',\n      '</section>'\n    ].join('');\n\n    invite.addEventListener('click', function handleInviteClick(event) {\n      var tryButton = event.target.closest('[data-beta-builder-invite-try]');\n      if (tryButton) {\n        track('beta_builder_invite_clicked', handle, {\n          destination: tryButton.getAttribute('href')\n        });\n        return;\n      }\n\n      var dismissButton = event.target.closest('[data-beta-builder-invite-dismiss]');\n      if (dismissButton) hideInvite(dismissButton.getAttribute('data-beta-builder-invite-dismiss'));\n    });\n\n    invite.addEventListener('keydown', function trapInviteFocus(event) {\n      if (event.key !== 'Tab') return;\n      var controls = focusableControls(invite);\n      if (!controls.length) return;\n      var first = controls[0];\n      var last = controls[controls.length - 1];\n      if (event.shiftKey && document.activeElement === first) {\n        event.preventDefault();\n        last.focus();\n      } else if (!event.shiftKey && document.activeElement === last) {\n        event.preventDefault();\n        first.focus();\n      }\n    });\n\n    var mount = modal.querySelector('.inner__modal') || modal;\n    mount.appendChild(invite);\n    return invite;\n  }\n\n  function showInvite(modal) {\n    if (!modal || recentlyShown() || classicFallbackRequested()) return;\n    var handle = modalHandle(modal);\n    if (!eligibleHandles[handle]) return;\n    if (modal.getAttribute('aria-hidden') === 'true' || global.getComputedStyle(modal).display === 'none') return;\n\n    var invite = createInvite(modal, handle);\n    suppressModalContent(modal, invite);\n\n    shownThisPage = true;\n    safeStorageSet();\n    activeInvite = invite;\n    activeModal = modal;\n    invite.hidden = false;\n    track('beta_builder_invite_shown', handle);\n\n    var primary = invite.querySelector('[data-beta-builder-invite-try]');\n    if (primary && typeof primary.focus === 'function') {\n      global.setTimeout(function focusPrimaryAction() {\n        primary.focus({ preventScroll: true });\n      }, 20);\n    }\n  }\n\n  function scheduleInvite(modal) {\n    if (!modal || recentlyShown() || classicFallbackRequested()) return;\n    global.clearTimeout(showTimer);\n    showTimer = global.setTimeout(function showScheduledInvite() {\n      showInvite(modal);\n    }, showDelayMs);\n  }\n\n  function observeModal(modal) {\n    if (!modal || modal.dataset.betaBuilderInviteObserved === 'true') return;\n    modal.dataset.betaBuilderInviteObserved = 'true';\n    var observer = new MutationObserver(function modalChanged() {\n      if (modal.getAttribute('aria-hidden') !== 'true' && global.getComputedStyle(modal).display !== 'none') {\n        scheduleInvite(modal);\n      }\n    });\n    observer.observe(modal, {\n      attributes: true,\n      attributeFilter: ['aria-hidden', 'class', 'style']\n    });\n  }\n\n  function initialize() {\n    if (classicFallbackRequested()) return;\n    var modal = document.querySelector('.form__modal[data-stackhouse-modal][data-product-handle]');\n    if (!modal || !eligibleHandles[modalHandle(modal)]) return;\n    observeModal(modal);\n    if (modal.getAttribute('aria-hidden') !== 'true' && global.getComputedStyle(modal).display !== 'none') {\n      scheduleInvite(modal);\n    }\n  }\n\n  global.addEventListener('keydown', function handleInviteEscape(event) {\n    if (!activeInvite || event.key !== 'Escape') return;\n    event.preventDefault();\n    event.stopImmediatePropagation();\n    hideInvite('escape');\n  }, true);\n\n  global.StackhouseBetaBuilderInvite = {\n    initialize: initialize,\n    show: showInvite\n  };\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', initialize, { once: true });\n  } else {\n    initialize();\n  }\n})(window);\n"],
  "mappings": "CAAC,SAAqC,OAAQ,CAC5C,aAEA,GAAI,CAAC,QAAU,CAAC,OAAO,UAAY,OAAO,4BAA6B,OAEvE,IAAI,SAAW,OAAO,SAClB,QAAU,SAAS,eAAe,qCAAqC,EAC3E,GAAI,SAAW,QAAQ,aAAa,qCAAqC,IAAM,OAAQ,OACvF,IAAI,WAAa,0CACb,iBAAmB,qCACnB,kBAAoB,MAAc,GAAK,IACvC,YAAc,IACd,gBAAkB,CACpB,aAAc,GACd,sBAAuB,GACvB,gCAAiC,GACjC,yBAA0B,GAC1B,yBAA0B,GAC1B,cAAe,GACf,iBAAkB,GAClB,4BAA6B,GAC7B,sBAAuB,GACvB,uBAAwB,EAC1B,EACI,cAAgB,CAClB,sBAAuB,uBACvB,eAAgB,2BAClB,EACI,cAAgB,GAChB,aAAe,KACf,YAAc,KACd,uBAAyB,CAAC,EAC1B,UAAY,KAEhB,SAAS,gBAAgB,OAAQ,CAC/B,IAAI,WAAa,OAAO,QAAU,EAAE,EAAE,KAAK,EAAE,YAAY,EACzD,OAAI,WAAW,QAAQ,aAAa,IAAM,EAAU,aAC7C,cAAc,UAAU,GAAK,UACtC,CAEA,SAAS,YAAY,MAAO,CAC1B,OAAO,gBAAgB,OAAS,MAAM,aAAa,qBAAqB,CAAC,CAC3E,CAEA,SAAS,gBAAiB,CACxB,GAAI,CACF,OAAO,OAAO,OAAO,aAAa,QAAQ,UAAU,GAAK,CAAC,CAC5D,OAAS,MAAO,CACd,MAAO,EACT,CACF,CAEA,SAAS,gBAAiB,CACxB,GAAI,CACF,OAAO,aAAa,QAAQ,WAAY,OAAO,KAAK,IAAI,CAAC,CAAC,CAC5D,OAAS,MAAO,CACd,MACF,CACF,CAEA,SAAS,oBAAqB,CAC5B,GAAI,CACF,OAAO,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,gBAAgB,IAAM,GAC/E,OAAS,MAAO,CACd,MAAO,EACT,CACF,CAEA,SAAS,0BAA2B,CAClC,IAAI,WACA,aAAe,GAEnB,GAAI,CAEF,GADA,WAAa,IAAI,gBAAgB,OAAO,SAAS,QAAU,EAAE,EACzD,WAAW,IAAI,SAAS,IAAM,WAAa,WAAW,IAAI,QAAQ,IAAM,mBAC1E,MAAO,EAEX,OAAS,MAAO,CAAC,CAEjB,GAAI,CACF,aAAe,OAAO,eAAe,QAAQ,gBAAgB,GAAK,EACpE,OAAS,MAAO,CAAC,CAEjB,OAAO,eAAiB,SAC1B,CAEA,SAAS,eAAgB,CACvB,GAAI,mBAAmB,EAAG,OAAO,cACjC,IAAI,QAAU,eAAe,EAC7B,OAAO,eAAkB,QAAU,GAAK,KAAK,IAAI,EAAI,QAAU,iBACjE,CAEA,SAAS,MAAM,UAAW,OAAQ,QAAS,CACzC,IAAI,SAAW,OAAO,4BAA8B,OAAO,mBACvD,QAAU,OAAO,OAAO,CAC1B,QAAS,gBACT,eAAgB,OAChB,OAAQ,mBACV,EAAG,SAAW,CAAC,CAAC,EAEhB,GAAI,UAAY,OAAO,SAAS,MAAS,WAAY,CACnD,SAAS,KAAK,UAAW,OAAO,EAChC,MACF,CAEA,OAAO,2BAA6B,MAAM,QAAQ,OAAO,0BAA0B,EAC/E,OAAO,2BACP,CAAC,EACL,OAAO,2BAA2B,KAAK,CAAE,UAAW,UAAW,QAAS,OAAQ,CAAC,CACnF,CAEA,SAAS,eAAe,OAAQ,CAC9B,MAAO,8BAAgC,mBAAmB,MAAM,EAAI,2BACtE,CAEA,SAAS,kBAAkB,OAAQ,CACjC,OAAO,MAAM,UAAU,MAAM,KAAK,OAAO,iBAAiB,iCAAiC,CAAC,CAC9F,CAEA,SAAS,qBAAqB,MAAO,OAAQ,CAC3C,IAAI,MAAQ,QAAU,OAAO,cACzB,CAAC,OAAS,CAAC,QACf,uBAAyB,CAAC,EAC1B,MAAM,UAAU,QAAQ,KAAK,MAAM,SAAU,SAAyB,QAAS,CACzE,UAAY,SAChB,uBAAuB,KAAK,CAC1B,WAAY,QAAQ,aAAa,aAAa,EAC9C,QAAS,QACT,MAAO,EAAQ,QAAQ,MACvB,eAAgB,QAAQ,aAAa,OAAO,CAC9C,CAAC,EACD,QAAQ,MAAQ,GAChB,QAAQ,aAAa,QAAS,EAAE,EAChC,QAAQ,aAAa,cAAe,MAAM,EAC5C,CAAC,EACH,CAEA,SAAS,qBAAsB,CAC7B,uBAAuB,QAAQ,SAAwB,OAAQ,CAC7D,IAAI,QAAU,OAAO,QACjB,CAAC,SAAW,CAAC,QAAQ,cACzB,QAAQ,MAAQ,OAAO,MACnB,OAAO,iBAAmB,KAAM,QAAQ,gBAAgB,OAAO,EAC9D,QAAQ,aAAa,QAAS,OAAO,cAAc,EACpD,OAAO,aAAe,KAAM,QAAQ,gBAAgB,aAAa,EAChE,QAAQ,aAAa,cAAe,OAAO,UAAU,EAC5D,CAAC,EACD,uBAAyB,CAAC,CAC5B,CAEA,SAAS,WAAW,OAAQ,CAC1B,GAAI,GAAC,cAAgB,CAAC,aAEtB,KAAI,OAAS,aACT,MAAQ,YACR,OAAS,YAAY,KAAK,EAC9B,OAAO,OAAS,GAChB,oBAAoB,EACpB,aAAe,KACf,YAAc,KAEd,MAAM,gCAAiC,OAAQ,CAC7C,eAAgB,QAAU,UAC5B,CAAC,EAED,IAAI,UAAY,MAAM,cAAc,wFAAwF,EACxH,WAAa,OAAO,UAAU,OAAU,YAC1C,OAAO,WAAW,UAA6B,CAC7C,UAAU,MAAM,CAAE,cAAe,EAAK,CAAC,CACzC,EAAG,EAAE,EAET,CAEA,SAAS,aAAa,MAAO,OAAQ,CACnC,IAAI,OAAS,MAAM,cAAc,4BAA4B,EAC7D,GAAI,OAAQ,OAAO,OAEnB,OAAS,SAAS,cAAc,KAAK,EACrC,OAAO,UAAY,yBACnB,OAAO,OAAS,GAChB,OAAO,aAAa,2BAA4B,EAAE,EAClD,OAAO,UAAY,CACjB,sHACA,8GACA,yOACA,8DACA,6GACA,yJACA,gDACA,iFAAmF,eAAe,MAAM,EAAI,6BAC5G,uLACA,SACA,YACF,EAAE,KAAK,EAAE,EAET,OAAO,iBAAiB,QAAS,SAA2B,MAAO,CACjE,IAAI,UAAY,MAAM,OAAO,QAAQ,gCAAgC,EACrE,GAAI,UAAW,CACb,MAAM,8BAA+B,OAAQ,CAC3C,YAAa,UAAU,aAAa,MAAM,CAC5C,CAAC,EACD,MACF,CAEA,IAAI,cAAgB,MAAM,OAAO,QAAQ,oCAAoC,EACzE,eAAe,WAAW,cAAc,aAAa,kCAAkC,CAAC,CAC9F,CAAC,EAED,OAAO,iBAAiB,UAAW,SAAyB,MAAO,CACjE,GAAI,MAAM,MAAQ,MAClB,KAAI,SAAW,kBAAkB,MAAM,EACvC,GAAK,SAAS,OACd,KAAI,MAAQ,SAAS,CAAC,EAClB,KAAO,SAAS,SAAS,OAAS,CAAC,EACnC,MAAM,UAAY,SAAS,gBAAkB,OAC/C,MAAM,eAAe,EACrB,KAAK,MAAM,GACF,CAAC,MAAM,UAAY,SAAS,gBAAkB,OACvD,MAAM,eAAe,EACrB,MAAM,MAAM,IAEhB,CAAC,EAED,IAAI,MAAQ,MAAM,cAAc,eAAe,GAAK,MACpD,aAAM,YAAY,MAAM,EACjB,MACT,CAEA,SAAS,WAAW,MAAO,CACzB,GAAI,GAAC,OAAS,cAAc,GAAK,yBAAyB,GAC1D,KAAI,OAAS,YAAY,KAAK,EAC9B,GAAK,gBAAgB,MAAM,GACvB,QAAM,aAAa,aAAa,IAAM,QAAU,OAAO,iBAAiB,KAAK,EAAE,UAAY,QAE/F,KAAI,OAAS,aAAa,MAAO,MAAM,EACvC,qBAAqB,MAAO,MAAM,EAElC,cAAgB,GAChB,eAAe,EACf,aAAe,OACf,YAAc,MACd,OAAO,OAAS,GAChB,MAAM,4BAA6B,MAAM,EAEzC,IAAI,QAAU,OAAO,cAAc,gCAAgC,EAC/D,SAAW,OAAO,QAAQ,OAAU,YACtC,OAAO,WAAW,UAA8B,CAC9C,QAAQ,MAAM,CAAE,cAAe,EAAK,CAAC,CACvC,EAAG,EAAE,GAET,CAEA,SAAS,eAAe,MAAO,CACzB,CAAC,OAAS,cAAc,GAAK,yBAAyB,IAC1D,OAAO,aAAa,SAAS,EAC7B,UAAY,OAAO,WAAW,UAA+B,CAC3D,WAAW,KAAK,CAClB,EAAG,WAAW,EAChB,CAEA,SAAS,aAAa,MAAO,CAC3B,GAAI,GAAC,OAAS,MAAM,QAAQ,4BAA8B,QAC1D,OAAM,QAAQ,0BAA4B,OAC1C,IAAI,SAAW,IAAI,iBAAiB,UAAwB,CACtD,MAAM,aAAa,aAAa,IAAM,QAAU,OAAO,iBAAiB,KAAK,EAAE,UAAY,QAC7F,eAAe,KAAK,CAExB,CAAC,EACD,SAAS,QAAQ,MAAO,CACtB,WAAY,GACZ,gBAAiB,CAAC,cAAe,QAAS,OAAO,CACnD,CAAC,EACH,CAEA,SAAS,YAAa,CACpB,GAAI,0BAAyB,EAC7B,KAAI,MAAQ,SAAS,cAAc,0DAA0D,EACzF,CAAC,OAAS,CAAC,gBAAgB,YAAY,KAAK,CAAC,IACjD,aAAa,KAAK,EACd,MAAM,aAAa,aAAa,IAAM,QAAU,OAAO,iBAAiB,KAAK,EAAE,UAAY,QAC7F,eAAe,KAAK,GAExB,CAEA,OAAO,iBAAiB,UAAW,SAA4B,MAAO,CAChE,CAAC,cAAgB,MAAM,MAAQ,WACnC,MAAM,eAAe,EACrB,MAAM,yBAAyB,EAC/B,WAAW,QAAQ,EACrB,EAAG,EAAI,EAEP,OAAO,4BAA8B,CACnC,WAAY,WACZ,KAAM,UACR,EAEI,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,WAAY,CAAE,KAAM,EAAK,CAAC,EAExE,WAAW,CAEf,GAAG,MAAM",
  "names": []
}
