{
  "version": 3,
  "sources": ["/cdn/shop/t/35/assets/vonili-tryon.js?vonili=20261110p"],
  "sourcesContent": ["(function () {\n  var STATUS_TEXT = {\n    pending: 'Preparing your fitting session\u2026',\n    uploaded: 'Uploading your photo securely\u2026',\n    queued: 'Reserving a render slot\u2026',\n    preprocessing: 'Checking pose and garment alignment\u2026',\n    rendering: 'Refining your try-on preview\u2026',\n    completed: 'Your try-on is ready.',\n    failed: 'Something went wrong. Please try another photo.',\n  };\n\n  var STATUS_PROGRESS = { pending: 10, uploaded: 25, queued: 40, preprocessing: 60, rendering: 82, completed: 100, failed: 0 };\n  var STATUS_HINTS = {\n    pending: 'We create a private session before any image processing begins.',\n    uploaded: 'Your photo is on its way. This usually only takes a moment.',\n    queued: 'Your preview is in line now. You can keep browsing while we prepare it.',\n    preprocessing: 'We are checking framing, crop, and fit points for a cleaner result.',\n    rendering: 'We are refining fit, edges, and lighting on your preview now.',\n    completed: 'Save your preview or try another angle to compare.',\n    failed: 'Try a vertical full-body photo from head to feet, arms relaxed, one person in frame, with clean lighting.',\n  };\n\n  function initAll(root) {\n    var scope = root || document;\n    scope.querySelectorAll('[data-vonili-tryon]').forEach(initRoot);\n  }\n\n  window.VoniliTryOnInit = initAll;\n\n  function readVariantData(root) {\n    var node = root.querySelector('[data-tryon-variant-data]');\n    if (node && node.textContent) return parseJson(node.textContent);\n    return parseJson(root.dataset.variantData || '{}');\n  }\n\n  function initRoot(root) {\n    if (root.dataset.tryonReady === 'true') return;\n\n    var launchBtn = root.querySelector('[data-tryon-launch]');\n    var launchNote = root.querySelector('[data-tryon-launch-note]');\n    var panel = root.querySelector('[data-tryon-panel]');\n    var consentStep = root.querySelector('[data-tryon-step=\"consent\"]');\n    var uploadZone = root.querySelector('[data-tryon-upload-zone]');\n    var dropzone = root.querySelector('[data-tryon-dropzone]');\n    var fileInput = root.querySelector('[data-tryon-file]');\n    var cameraInput = root.querySelector('[data-tryon-camera-file]');\n    var cameraBtn = root.querySelector('[data-tryon-camera]');\n    var galleryBtn = root.querySelector('[data-tryon-gallery]');\n    var mobilePhotoSources = root.querySelector('.vto__mobile-photo-sources');\n    var photoPreview = root.querySelector('[data-tryon-photo-preview]');\n    var previewImg = root.querySelector('[data-tryon-preview-img]');\n    var previewName = root.querySelector('[data-tryon-preview-name]');\n    var previewSize = root.querySelector('[data-tryon-preview-size]');\n    var changePhotoBtn = root.querySelector('[data-tryon-change-photo]');\n    var submitWrap = root.querySelector('[data-tryon-submit-wrap]');\n    var submitBtn = root.querySelector('[data-tryon-submit]');\n    var statusWrap = root.querySelector('[data-tryon-status-wrap]');\n    var statusText = root.querySelector('[data-tryon-status]');\n    var statusHint = root.querySelector('[data-tryon-hint]');\n    var progressBar = root.querySelector('[data-tryon-progress]');\n    var resultWrap = root.querySelector('[data-tryon-result]');\n    var resultImage = root.querySelector('[data-tryon-image]');\n    var resultSkeleton = root.querySelector('[data-tryon-skeleton]');\n    var retryBtn = root.querySelector('[data-tryon-retry]');\n    var newPhotoBtn = root.querySelector('[data-tryon-new-photo]');\n    var chooseViewBtn = root.querySelector('[data-tryon-choose-view]');\n    var uploadErrorEl = root.querySelector('[data-tryon-upload-error]');\n    var consentBtn = root.querySelector('[data-tryon-consent]');\n    var closeBtn = root.querySelector('[data-tryon-close]');\n    var saveBtn = root.querySelector('[data-tryon-save]');\n    var loginBtn = root.querySelector('[data-tryon-login]');\n    var resultActions = root.querySelector('[data-tryon-result-actions]');\n    var resultNote = root.querySelector('[data-tryon-result-note]');\n    var resultPolicy = root.querySelector('[data-tryon-result-policy]');\n    var resultTitle = root.querySelector('[data-tryon-result-title]');\n    var keepPhotoToggle = root.querySelector('[data-tryon-keep-photo]');\n    var reuseWrap = root.querySelector('[data-tryon-reuse-wrap]');\n    var reuseNote = root.querySelector('[data-tryon-reuse-note]');\n    var useRecentPhotoBtn = root.querySelector('[data-tryon-use-recent-photo]');\n    var dismissReuseBtn = root.querySelector('[data-tryon-dismiss-reuse]');\n    var garmentToggleBtn = root.querySelector('[data-tryon-toggle-garment-chooser]');\n    var garmentChooser = root.querySelector('[data-tryon-garment-chooser]');\n    var garmentLabel = root.querySelector('[data-tryon-garment-label]');\n    var garmentHint = root.querySelector('[data-tryon-garment-hint]');\n    var garmentGridShell = root.querySelector('.vto__garment-grid-shell');\n    var garmentMoreBtn = root.querySelector('[data-tryon-garment-more]');\n    var variantPicker = root.querySelector('[data-tryon-variant-picker]');\n    var variantSelectedLabel = root.querySelector('[data-tryon-variant-selected-label]');\n    var selectionWorkspace = root.querySelector('[data-tryon-selection-workspace]');\n    var selectionControls = root.querySelector('[data-tryon-selection-controls]');\n    var lookSummary = root.querySelector('[data-tryon-look-summary]');\n    var variantOptionButtons = Array.prototype.slice.call(root.querySelectorAll('[data-tryon-variant-option]'));\n    var garmentOptionButtons = Array.prototype.slice.call(root.querySelectorAll('[data-tryon-garment-option]'));\n    var dots = Array.prototype.slice.call(root.querySelectorAll('[data-tryon-dot]'));\n    var stepperItems = Array.prototype.slice.call(root.querySelectorAll('[data-tryon-stepper]'));\n    var stepperFill = root.querySelector('[data-tryon-stepper-fill]');\n    var backdrop = root.querySelector('[data-tryon-backdrop]');\n    var copy = getTryOnCopy(root);\n    var inventoryConfig = resolveInventoryConfig(root, readVariantData(root));\n\n    var state = {\n      apiBase: normalizeBaseUrl(root.dataset.apiBase || ''),\n      sessionId: null,\n      pollId: null,\n      pollRetryCount: 0,\n      isBusy: false,\n      liveSocket: null,\n      liveSocketHealthy: false,\n      manualSocketClose: false,\n      terminalSessionHandled: false,\n      selectedFile: null,\n      variantData: readVariantData(root),\n      selectedVariantId: root.dataset.variantId || '',\n      productTitle: root.dataset.productTitle || '',\n      productType: root.dataset.productType || '',\n      productTags: (root.dataset.productTags || '').split('|').filter(Boolean),\n      productCategory: detectProductCategory(root),\n      colorIndex: parseInt(root.dataset.colorIndex || '0', 10),\n      hasColorOption: root.dataset.hasColorOption === 'true',\n      renderStrategy: null,\n      productForm: findProductForm(root),\n      garmentOptions: parseGarmentOptions(garmentOptionButtons),\n      activeGarmentSelection: null,\n      garmentChooserExpanded: false,\n      sourceRetentionMode: 'delete_after_render',\n      sourceExpiresAt: 0,\n      resultExpiresAt: 0,\n      sourceDeletedAt: null,\n      usageSummary: null,\n      inventory: {\n        apiBase: inventoryConfig.apiBase,\n        variantIdToSku: inventoryConfig.variantIdToSku,\n        summary: null,\n        liveBySku: {},\n        blocked: false,\n        loading: false,\n      },\n      identity: {\n        ready: false,\n        customerId: '',\n        isGuest: true,\n        claimedCustomerId: getClaimedCustomerId(root),\n      },\n      lastFocusedElement: null,\n      lastFailure: null,\n    };\n\n    function txt(path, fallback, replacements) {\n      return getTryOnText(root, path, fallback, replacements);\n    }\n\n    /* Funnel events carry ids only: no photos, names or contact details. */\n    function track(event, extra) {\n      try {\n        var body = Object.assign({\n          event: event,\n          productId: root.dataset.garmentId || '',\n          variantId: root.dataset.variantId || '',\n          sessionId: state.sessionId || '',\n        }, extra || {});\n        /* text/plain keeps this a simple request, so keepalive works without a preflight. */\n        fetch(joinUrl(state.apiBase, '/v1/tryon/track'), {\n          method: 'POST',\n          credentials: 'include',\n          keepalive: true,\n          headers: { 'Content-Type': 'text/plain' },\n          body: JSON.stringify(body),\n        }).catch(function () {});\n      } catch (_) {}\n    }\n\n    var ATTRIBUTION_KEY = 'vonili:tryon:attribution';\n    var ATTRIBUTION_WINDOW_MS = 7 * 24 * 60 * 60 * 1000;\n    function readAttribution() {\n      try {\n        var list = JSON.parse(window.localStorage.getItem(ATTRIBUTION_KEY) || '[]');\n        var cutoff = Date.now() - ATTRIBUTION_WINDOW_MS;\n        return Array.isArray(list) ? list.filter(function (a) { return a && a.s && a.p && a.t > cutoff; }) : [];\n      } catch (_) {\n        return [];\n      }\n    }\n    function syncCartAttribution(list) {\n      if (!list.length) return;\n      var rootPath = (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || '/';\n      fetch(rootPath + 'cart/update.js', {\n        method: 'POST',\n        credentials: 'same-origin',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ attributes: { _vonili_tryon: list.map(function (a) { return a.s + ':' + a.p; }).join(',') } }),\n      }).catch(function () {});\n    }\n    function rememberTryOnForCart() {\n      var productId = root.dataset.garmentId || '';\n      if (!state.sessionId || !productId) return;\n      var list = readAttribution().filter(function (a) { return a.p !== productId; });\n      list.unshift({ s: state.sessionId, p: productId, t: Date.now() });\n      list = list.slice(0, 5);\n      try {\n        window.localStorage.setItem(ATTRIBUTION_KEY, JSON.stringify(list));\n      } catch (_) {}\n      syncCartAttribution(list);\n    }\n    function installCartWatch() {\n      if (window.__voniliTryOnCartWatch) return;\n      window.__voniliTryOnCartWatch = true;\n      var lastSentAt = 0;\n      function isCartAdd(url) {\n        return /\\/cart\\/add(\\.js)?(\\?|$)/.test(String(url || ''));\n      }\n      function onCartAdd() {\n        var productId = root.dataset.garmentId || '';\n        var hit = readAttribution().filter(function (a) { return a.p === productId; })[0];\n        if (!hit || Date.now() - lastSentAt < 2000) return;\n        lastSentAt = Date.now();\n        var price = Number(root.dataset.productPrice);\n        track('add_to_cart', {\n          sessionId: hit.s,\n          valueCents: isFinite(price) ? price : undefined,\n          currency: root.dataset.currency || undefined,\n          detail: Math.round((Date.now() - hit.t) / 60000) + 'min_after_tryon',\n        });\n        syncCartAttribution(readAttribution());\n      }\n      var nativeFetch = window.fetch;\n      window.fetch = function (input) {\n        var url = typeof input === 'string' ? input : input && input.url;\n        var pending = nativeFetch.apply(this, arguments);\n        if (isCartAdd(url)) {\n          pending.then(function (res) { if (res && res.ok) onCartAdd(); }).catch(function () {});\n        }\n        return pending;\n      };\n      var nativeOpen = XMLHttpRequest.prototype.open;\n      XMLHttpRequest.prototype.open = function (method, url) {\n        if (isCartAdd(url)) {\n          this.addEventListener('load', function () { if (this.status >= 200 && this.status < 300) onCartAdd(); });\n        }\n        return nativeOpen.apply(this, arguments);\n      };\n      document.addEventListener('submit', function (e) {\n        var form = e.target;\n        if (!form || !isCartAdd(form.getAttribute && form.getAttribute('action'))) return;\n        /* AJAX themes cancel the submit and are counted by the fetch/XHR hooks instead. */\n        window.setTimeout(function () { if (!e.defaultPrevented) onCartAdd(); }, 0);\n      });\n    }\n    installCartWatch();\n\n    var stageYou = root.querySelector('[data-tryon-stage-you]');\n    var stageEl = root.querySelector('[data-tryon-stage]');\n    var stageDraft = root.querySelector('[data-tryon-draft]');\n    var stageLabel = root.querySelector('[data-tryon-stage-label]');\n    var stageTimer = root.querySelector('[data-tryon-timer]');\n    var noteBox = root.querySelector('[data-tryon-note]');\n    var noteText = root.querySelector('[data-tryon-note-text]');\n    var phaseSteps = Array.prototype.slice.call(root.querySelectorAll('[data-phase-step]'));\n    var waitClock = null;\n    var STYLIST_NOTES = {\n      dress: [\n        'A slim belt at the natural waist gives a relaxed dress more shape.',\n        'Clean white sneakers make a dress easy for daytime.',\n        'A cropped jacket on top carries this into cooler evenings.',\n      ],\n      top: [\n        'Half-tuck the front into high-waisted bottoms for a balanced line.',\n        'Roll the sleeves twice for a relaxed, finished look.',\n        'Straight-leg denim and loafers turn this into an easy weekday outfit.',\n      ],\n      outer: [\n        'Wear it open over a fine knit so the layers show.',\n        'Push the sleeves up a little to lighten the look.',\n        'A tonal outfit underneath keeps this piece the focus.',\n      ],\n      bottom: [\n        'A tucked-in top shows off the waistline of this piece.',\n        'Matching your shoes to the hem tone lengthens the leg line.',\n        'Balance a wider leg with a closer-fitting top.',\n      ],\n      knit: [\n        'Let a shirt collar peek out at the neckline for a polished layer.',\n        'Tuck just the front into a skirt to keep the shape soft.',\n        'Knits look richest next to one contrasting texture, like denim or leather.',\n      ],\n      bag: [\n        'Match the bag tone to your shoes or belt to tie the outfit together.',\n        'A neutral outfit lets the bag become the statement.',\n        'Crossbody on the hip keeps your hands free and the line clean.',\n      ],\n      generic: [\n        'Neutral basics underneath let a new piece do the talking.',\n        'One statement piece per outfit always reads intentional.',\n        'Good posture is the best accessory. Our tailor says so.',\n      ],\n    };\n    function pickStylistNotes() {\n      var hay = (state.productTitle + ' ' + state.productType + ' ' + state.productTags.join(' ')).toLowerCase();\n      var key = /\\b(bag|tote|handbag|clutch|purse|crossbody)\\b/.test(hay) ? 'bag'\n        : /\\b(dress|gown|jumpsuit|romper)\\b/.test(hay) ? 'dress'\n        : /\\b(jacket|coat|blazer|outerwear|vest|trench)\\b/.test(hay) ? 'outer'\n        : /\\b(sweater|cardigan|knit|pullover|hoodie|sweatshirt)\\b/.test(hay) ? 'knit'\n        : /\\b(pants|jeans|trousers|skirt|shorts|leggings)\\b/.test(hay) ? 'bottom'\n        : /\\b(shirt|blouse|top|tee|t-shirt|tank|polo)\\b/.test(hay) ? 'top'\n        : 'generic';\n      return STYLIST_NOTES[key].map(function (note, i) { return txt('stylist.' + key + '.' + i, note); });\n    }\n    /* CSS rotates the notes and counts the seconds; restarting the class restarts both animations. */\n    function restartCssAnimation(el) {\n      if (!el) return;\n      el.classList.remove('is-in');\n      void el.offsetWidth;\n      el.classList.add('is-in');\n    }\n    function renderStylistNotes(notes) {\n      if (!noteText || !noteBox) return;\n      noteText.textContent = '';\n      notes.forEach(function (note) {\n        var line = document.createElement('span');\n        line.textContent = note;\n        noteText.appendChild(line);\n      });\n      restartCssAnimation(noteBox);\n    }\n    function setWaitPhase(phase) {\n      state.waitPhase = phase;\n      if (stageEl) stageEl.setAttribute('data-phase', phase);\n      var order = ['check', 'drape', 'refine'];\n      var at = order.indexOf(phase);\n      phaseSteps.forEach(function (li) {\n        var i = order.indexOf(li.getAttribute('data-phase-step'));\n        li.classList.toggle('is-done', i < at);\n        li.classList.toggle('is-active', i === at);\n      });\n    }\n    function startWaitingRoom(photoUrl) {\n      stopWaitingRoom();\n      state.waitStartedAt = Date.now();\n      state.previewShown = 0;\n      if (stageYou) stageYou.src = photoUrl || stageYou.getAttribute('data-fallback-src') || stageYou.src;\n      if (stageDraft) {\n        stageDraft.hidden = true;\n        stageDraft.classList.remove('is-in', 'is-sharp');\n        stageDraft.removeAttribute('src');\n      }\n      if (stageLabel) stageLabel.hidden = true;\n      restartCssAnimation(stageTimer);\n      setWaitPhase('check');\n      renderStylistNotes(pickStylistNotes());\n      waitClock = window.setTimeout(function () {\n        if (state.waitPhase === 'check') setWaitPhase('drape');\n      }, 6000);\n    }\n    function stopWaitingRoom() {\n      if (waitClock) window.clearTimeout(waitClock);\n      waitClock = null;\n      if (stageTimer) stageTimer.classList.remove('is-in');\n    }\n    /* The first look came from a render that was then discarded; a second engine is drawing the final. */\n    function clearDraftPreview(resetAt) {\n      if (!resetAt || state.previewResetSeen === resetAt) return;\n      state.previewResetSeen = resetAt;\n      state.previewShown = Infinity;\n      if (stageDraft) {\n        stageDraft.classList.remove('is-in', 'is-sharp');\n        stageDraft.hidden = true;\n        stageDraft.removeAttribute('src');\n      }\n      if (stageLabel) stageLabel.hidden = true;\n      setWaitPhase('drape');\n    }\n    function showDraftPreview(version) {\n      if (!stageDraft || !state.sessionId || !(version > (state.previewShown || 0))) return;\n      state.previewShown = version;\n      var sessionAtRequest = state.sessionId;\n      var img = new Image();\n      img.onload = function () {\n        if (state.sessionId !== sessionAtRequest || state.terminalSessionHandled || state.previewShown !== version) return;\n        stageDraft.src = img.src;\n        stageDraft.hidden = false;\n        window.requestAnimationFrame(function () {\n          stageDraft.classList.add('is-in');\n          if (version >= 2) stageDraft.classList.add('is-sharp');\n        });\n        if (stageLabel) stageLabel.hidden = false;\n        setWaitPhase('refine');\n        if (version === 1) track('preview_shown', { detail: Math.round((Date.now() - state.waitStartedAt) / 1000) + 's' });\n      };\n      img.src = joinUrl(state.apiBase, '/api/result/' + state.sessionId + '/preview') + '?v=' + version;\n    }\n\n    function syncUsageSummary(usage) {\n      if (usage && typeof usage === 'object') {\n        state.usageSummary = usage;\n      }\n    }\n\n    function requestTryOnJson(path, opts) {\n      opts = opts || {};\n      opts.credentials = 'include';\n      return requestJson(joinUrl(state.apiBase, path), opts);\n    }\n\n    function syncIdentity(identity) {\n      state.identity = {\n        ready: true,\n        customerId: identity && identity.customerId ? String(identity.customerId) : '',\n        isGuest: !(identity && identity.isGuest === false),\n        claimedCustomerId: getClaimedCustomerId(root),\n      };\n      root.__voniliTryOnIdentity = state.identity;\n    }\n\n    async function ensureIdentity(forceRefresh) {\n      var claimedCustomerId = getClaimedCustomerId(root);\n      if (!forceRefresh && state.identity.ready && state.identity.customerId && state.identity.claimedCustomerId === claimedCustomerId) {\n        return state.identity.customerId;\n      }\n\n      var customerAuth = claimedCustomerId ? await fetchStorefrontCustomerAuth() : null;\n      var identity = await requestTryOnJson('/v1/tryon/identity', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({\n          customerAuth: customerAuth,\n          storefrontSession: claimedCustomerId ? 'customer' : 'guest',\n        }),\n      });\n\n      syncIdentity(identity || {});\n      return state.identity.customerId;\n    }\n\n    async function fetchStorefrontCustomerAuth() {\n      try {\n        var rootPath = (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || '/';\n        var res = await fetch(rootPath + '?section_id=vonili-tryon-identity&_vti=' + Date.now(), {\n          credentials: 'same-origin',\n          cache: 'no-store',\n        });\n        if (!res.ok) return null;\n        var holder = document.createElement('div');\n        holder.innerHTML = await res.text();\n        var node = holder.querySelector('[data-vonili-tryon-identity]');\n        var auth = node ? JSON.parse(node.textContent || '{}') : null;\n        return auth && auth.sig ? auth : null;\n      } catch (_) {\n        return null;\n      }\n    }\n\n    if (!launchBtn || !panel || !consentStep || !uploadZone || !dropzone || !fileInput || !statusWrap || !resultWrap || !consentBtn) {\n      console.error('[Vonili TryOn] Missing required widget elements');\n      return;\n    }\n\n    function clearPhotoInputs() {\n      fileInput.value = '';\n      if (cameraInput) cameraInput.value = '';\n    }\n\n    if (selectionControls) {\n      [variantPicker, garmentToggleBtn && garmentToggleBtn.closest('.vto__garment-tools'), garmentChooser]\n        .filter(Boolean)\n        .forEach(function (element) {\n          selectionControls.appendChild(element);\n        });\n      if (selectionWorkspace) selectionWorkspace.classList.add('is-ready');\n    }\n\n    try {\n    state.onVariantChanged = applyInventoryGateState;\n\n    function setLaunchNote(message, tone) {\n      if (!launchNote) return;\n      if (!message) {\n        launchNote.hidden = true;\n        launchNote.textContent = '';\n        launchNote.classList.remove('is-warning', 'is-danger');\n        return;\n      }\n      launchNote.hidden = false;\n      launchNote.textContent = message;\n      launchNote.classList.toggle('is-warning', tone === 'warning');\n      launchNote.classList.toggle('is-danger', tone === 'danger');\n    }\n\n    function setLaunchBlocked(blocked, message, tone) {\n      state.inventory.blocked = !!blocked;\n      launchBtn.disabled = !!blocked;\n      launchBtn.classList.toggle('is-disabled', !!blocked);\n      setLaunchNote(message || '', tone || '');\n    }\n\n    function setLaunchLoading(loading) {\n      launchBtn.classList.toggle('is-booting', !!loading);\n      launchBtn.setAttribute('aria-busy', loading ? 'true' : 'false');\n    }\n\n    function isMobileSheet() {\n      return window.matchMedia && window.matchMedia('(max-width: 767px)').matches;\n    }\n\n    function getPortalRoot() {\n      var existing = document.getElementById('vonili-vto-portal-root');\n      if (existing) return existing;\n      var el = document.createElement('div');\n      el.id = 'vonili-vto-portal-root';\n      el.className = 'vto vto--portaled';\n      el.setAttribute('data-vonili-vto-portal', '');\n      el.hidden = true;\n      document.body.appendChild(el);\n      return el;\n    }\n\n    function mountMobileSheet(open) {\n      if (!isMobileSheet()) return;\n      var portalRoot = getPortalRoot();\n      var anchor = root.querySelector('[data-tryon-portal-anchor]');\n      if (open) {\n        portalRoot.hidden = false;\n        portalRoot.classList.add('is-sheet-open');\n        if (backdrop && backdrop.parentElement !== portalRoot) {\n          portalRoot.appendChild(backdrop);\n        }\n        if (panel && panel.parentElement !== portalRoot) {\n          portalRoot.appendChild(panel);\n        }\n        return;\n      }\n      portalRoot.classList.remove('is-sheet-open');\n      portalRoot.hidden = true;\n      if (!anchor) return;\n      if (panel && panel.parentElement !== root) {\n        root.insertBefore(panel, anchor);\n      }\n      if (backdrop && backdrop.parentElement !== root) {\n        root.insertBefore(backdrop, panel || anchor);\n      }\n    }\n\n    function setPanelOpen(open) {\n      if (open) {\n        state.lastFocusedElement = document.activeElement;\n      }\n      if (open && isMobileSheet()) {\n        mountMobileSheet(true);\n      }\n      panel.classList.toggle('is-open', open);\n      panel.classList.toggle('is-visible', open);\n      panel.hidden = !open;\n      panel.setAttribute('aria-hidden', open ? 'false' : 'true');\n      launchBtn.setAttribute('aria-expanded', open ? 'true' : 'false');\n      launchBtn.classList.toggle('is-open', open);\n      setBackdropVisible(open);\n      setBodyScrollLocked(open);\n      if (!open) {\n        setGarmentChooserOpen(false);\n        panel.removeAttribute('data-vto-active-step');\n        mountMobileSheet(false);\n      } else if (!isMobileSheet() && typeof panel.scrollIntoView === 'function') {\n        window.requestAnimationFrame(function () {\n          panel.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n        });\n      }\n    }\n\n    function setGarmentChooserOpen(open) {\n      if (!garmentChooser) return;\n      garmentChooser.hidden = !open;\n      garmentChooser.classList.toggle('is-visible', open);\n      if (selectionWorkspace) selectionWorkspace.classList.toggle('is-choosing-view', open);\n      if (garmentToggleBtn) garmentToggleBtn.setAttribute('aria-expanded', open ? 'true' : 'false');\n      setGarmentListExpanded(!!open);\n      if (open) {\n        window.requestAnimationFrame(function () {\n          revealActiveGarmentInRail('auto');\n        });\n      }\n    }\n\n    function revealActiveGarmentInRail(behavior) {\n      if (!garmentGridShell) return;\n      var active = garmentGridShell.querySelector('[data-tryon-garment-option].is-active');\n      if (!active || active.hidden) return;\n      var targetLeft = active.offsetLeft - Math.max(0, (garmentGridShell.clientWidth - active.offsetWidth) / 2);\n      garmentGridShell.scrollTo({\n        left: Math.max(0, targetLeft),\n        behavior: behavior || 'smooth',\n      });\n    }\n\n    function setGarmentListExpanded(expanded) {\n      state.garmentChooserExpanded = !!expanded;\n      if (garmentGridShell) garmentGridShell.classList.toggle('is-collapsed', expanded);\n      garmentOptionButtons.forEach(function (button, index) {\n        button.hidden = !expanded && index >= 6;\n      });\n      if (garmentMoreBtn) {\n        garmentMoreBtn.setAttribute('aria-expanded', expanded ? 'true' : 'false');\n        garmentMoreBtn.textContent = expanded\n          ? (garmentMoreBtn.getAttribute('data-expanded-label') || txt('ui.showFewerViews', 'Show fewer views'))\n          : (garmentMoreBtn.getAttribute('data-collapsed-label') || 'Show more views');\n      }\n    }\n\n    function updateDots(activeIndex) {\n      dots.forEach(function (dot, index) {\n        dot.classList.toggle('is-active', index === activeIndex);\n      });\n      stepperItems.forEach(function (item, index) {\n        item.classList.toggle('is-active', index === activeIndex);\n        item.classList.toggle('is-complete', index < activeIndex);\n      });\n      if (stepperFill) {\n        stepperFill.style.width = ((activeIndex + 1) / Math.max(stepperItems.length || 4, 1) * 100).toFixed(2) + '%';\n      }\n    }\n\n    function setResultSkeletonVisible(visible) {\n      if (!resultSkeleton) return;\n      resultSkeleton.hidden = !visible;\n      resultSkeleton.classList.toggle('is-visible', !!visible);\n      resultSkeleton.setAttribute('aria-hidden', visible ? 'false' : 'true');\n    }\n\n    function setBodyScrollLocked(locked) {\n      if (!isMobileSheet()) return;\n      document.body.classList.toggle('vto-body-locked', !!locked);\n      document.documentElement.classList.toggle('vto-ui-open', !!locked);\n      if (locked) {\n        document.documentElement.setAttribute('scroll-lock', '');\n      } else {\n        document.documentElement.removeAttribute('scroll-lock');\n      }\n    }\n\n    function setBackdropVisible(visible) {\n      if (!backdrop) return;\n      backdrop.hidden = !visible;\n      backdrop.classList.toggle('is-visible', !!visible);\n      backdrop.setAttribute('aria-hidden', visible ? 'false' : 'true');\n    }\n\n    function setResultActions(options) {\n      if (!resultActions) return;\n      options = typeof options === 'object'\n        ? options\n        : { showRetry: true, showSave: !!options, showLogin: false };\n      var showRetry = !!options.showRetry;\n      var showSave = !!options.showSave;\n      var showLogin = !!options.showLogin;\n      var showNewPhoto = !!options.showNewPhoto;\n      var showChooseView = !!options.showChooseView;\n      resultActions.hidden = !showRetry && !showSave && !showLogin && !showNewPhoto && !showChooseView;\n      resultActions.classList.toggle(\n        'vto__result-actions--recovery',\n        showNewPhoto || showChooseView\n      );\n      if (retryBtn) retryBtn.hidden = !showRetry;\n      if (newPhotoBtn) newPhotoBtn.hidden = !showNewPhoto;\n      if (chooseViewBtn) chooseViewBtn.hidden = !showChooseView;\n      if (saveBtn) saveBtn.hidden = !showSave;\n      if (loginBtn) loginBtn.hidden = !showLogin;\n    }\n\n    function buildGarmentSessionQuality() {\n      var selection = state.activeGarmentSelection;\n      var tier = (selection && selection.qualityTier) || root.dataset.garmentQualityTier || 'standard';\n      var score = selection && Number.isFinite(selection.qualityScore)\n        ? selection.qualityScore\n        : parseInt(root.dataset.garmentQualityScore || '50', 10);\n      var flags = (selection && selection.qualityFlags)\n        ? selection.qualityFlags.slice()\n        : (root.dataset.garmentQualityFlags || '').split(',').filter(Boolean);\n      if (tier === 'blocked') tier = 'standard';\n      score = Math.max(30, Math.min(100, score || 50));\n      return {\n        tier: tier === 'premium' ? 'premium' : 'standard',\n        score: score,\n        flags: flags,\n      };\n    }\n\n    function returnToGarmentChooser() {\n      state.isBusy = false;\n      state.terminalSessionHandled = false;\n      state.lastFailure = null;\n      if (resultActions) resultActions.hidden = true;\n      showStep(uploadZone, [consentStep, uploadZone, statusWrap, resultWrap]);\n      updateDots(1);\n      setGarmentChooserOpen(true);\n      setGarmentListExpanded(true);\n      focusFirstInteractive(garmentChooser || garmentToggleBtn || uploadZone);\n    }\n\n    function clearUploadError() {\n      if (!uploadErrorEl) return;\n      uploadErrorEl.textContent = '';\n      uploadErrorEl.hidden = true;\n      uploadErrorEl.classList.remove('is-warning');\n    }\n\n    function showUploadError(message) {\n      if (!uploadErrorEl) return;\n      uploadErrorEl.textContent = message;\n      uploadErrorEl.hidden = false;\n      uploadErrorEl.classList.remove('is-warning');\n    }\n\n    function returnToUploadStep(options) {\n      options = options || {};\n      stopPolling();\n      stopLiveStatusChannel();\n      state.isBusy = false;\n      state.terminalSessionHandled = false;\n      state.lastFailure = null;\n      state.selectedFile = null;\n      clearPhotoInputs();\n      if (mobilePhotoSources) mobilePhotoSources.hidden = false;\n      photoPreview.classList.remove('is-visible');\n      submitWrap.style.display = 'none';\n      dropzone.style.display = 'flex';\n      hideStatus();\n      clearUploadError();\n      if (resultActions) resultActions.hidden = true;\n      if (resultImage) {\n        resultImage.style.display = 'none';\n        resultImage.removeAttribute('src');\n      }\n      showStep(uploadZone, [consentStep, uploadZone, statusWrap, resultWrap]);\n      updateDots(1);\n      setGarmentChooserOpen(true);\n      if (options.focus !== false) focusFirstInteractive(dropzone || uploadZone);\n    }\n\n    var PHOTO_MIN_WIDTH = 400;\n    var PHOTO_MIN_HEIGHT = 520;\n    var PHOTO_MIN_ASPECT = 1.18;\n    var PHOTO_IDEAL_ASPECT = 1.32;\n    var PHOTO_LANDSCAPE_ASPECT = 0.9;\n    var PHOTO_MAX_RAW_BYTES = 40 * 1024 * 1024;\n    var PHOTO_MAX_SERVER_BYTES = 10000000;\n    var PHOTO_MAX_EDGE = 2048;\n    var PHOTO_JPEG_QUALITY = 0.9;\n\n    function decodePhoto(file) {\n      return new Promise(function (resolve, reject) {\n        var url = URL.createObjectURL(file);\n        var img = new Image();\n        img.onload = function () {\n          resolve({ img: img, url: url });\n        };\n        img.onerror = function () {\n          URL.revokeObjectURL(url);\n          reject(new Error('Photo could not be decoded'));\n        };\n        img.src = url;\n      });\n    }\n\n    function encodePhotoAsJpeg(img, width, height) {\n      return new Promise(function (resolve) {\n        try {\n          var canvas = document.createElement('canvas');\n          canvas.width = width;\n          canvas.height = height;\n          var ctx = canvas.getContext('2d');\n          if (!ctx) {\n            resolve(null);\n            return;\n          }\n          ctx.fillStyle = '#ffffff';\n          ctx.fillRect(0, 0, width, height);\n          ctx.drawImage(img, 0, 0, width, height);\n          canvas.toBlob(function (blob) {\n            canvas.width = 0;\n            canvas.height = 0;\n            resolve(blob && blob.size > 0 ? blob : null);\n          }, 'image/jpeg', PHOTO_JPEG_QUALITY);\n        } catch (_) {\n          resolve(null);\n        }\n      });\n    }\n\n    /* Every photo is re-encoded in the browser as an upright JPEG (max 2048px) so HEIC,\n       huge camera files and rotated EXIF photos reach the Worker in a format Vertex accepts. */\n    async function preparePhotoForUpload(file) {\n      var unreadable = txt('ui.photoUnreadable', 'We could not read that image. Save as JPG or PNG, or take a new photo with your camera app.');\n      if (!file || !file.size) throw new Error(unreadable);\n      if (file.size > PHOTO_MAX_RAW_BYTES) {\n        throw new Error(txt('ui.photoTooLarge', 'Photo too large. Max 40 MB.'));\n      }\n\n      var decoded;\n      try {\n        decoded = await decodePhoto(file);\n      } catch (_) {\n        /* Browsers without HEIC support still upload the original; the Worker converts it. */\n        if (file.size > PHOTO_MAX_SERVER_BYTES) throw new Error(unreadable);\n        var rawFile = file;\n        if (!file.type && /\\.(heic|heif)$/i.test(file.name || '')) {\n          rawFile = new File([file], file.name, { type: 'image/heic' });\n        }\n        return { file: rawFile, meta: null, previewUrl: '' };\n      }\n\n      try {\n        var width = decoded.img.naturalWidth;\n        var height = decoded.img.naturalHeight;\n        var aspect = height / width;\n        if (width < PHOTO_MIN_WIDTH || height < PHOTO_MIN_HEIGHT) {\n          throw new Error(\n            txt(\n              'ui.photoTooSmall',\n              'Photo is too small ({{ size }}). Use at least {{ minW }}\u00D7{{ minH }} px \u2014 a normal phone photo works.',\n              { size: width + '\u00D7' + height, minW: PHOTO_MIN_WIDTH, minH: PHOTO_MIN_HEIGHT }\n            )\n          );\n        }\n        if (aspect < PHOTO_LANDSCAPE_ASPECT) {\n          throw new Error(txt('ui.photoPortraitRequired', 'Use a vertical portrait photo. Turn your phone upright or rotate the image before uploading.'));\n        }\n\n        var scale = Math.min(1, PHOTO_MAX_EDGE / Math.max(width, height));\n        var blob = await encodePhotoAsJpeg(decoded.img, Math.round(width * scale), Math.round(height * scale));\n        var uploadFile = blob ? new File([blob], 'photo.jpg', { type: 'image/jpeg' }) : file;\n        if (uploadFile.size > PHOTO_MAX_SERVER_BYTES) {\n          throw new Error(txt('ui.photoTooLarge', 'Photo too large. Max 40 MB.'));\n        }\n        return {\n          file: uploadFile,\n          meta: {\n            width: width,\n            height: height,\n            aspect: aspect,\n            quality: aspect >= PHOTO_IDEAL_ASPECT ? 'good' : aspect >= PHOTO_MIN_ASPECT ? 'ok' : 'tight',\n          },\n          previewUrl: URL.createObjectURL(uploadFile),\n        };\n      } finally {\n        URL.revokeObjectURL(decoded.url);\n      }\n    }\n\n    function showUploadWarning(message) {\n      if (!uploadErrorEl) return;\n      if (!message) {\n        uploadErrorEl.classList.remove('is-warning');\n        return;\n      }\n      uploadErrorEl.textContent = message;\n      uploadErrorEl.hidden = false;\n      uploadErrorEl.classList.add('is-warning');\n    }\n\n    function formatPhotoMeta(meta, file) {\n      if (!meta) return formatSize(file.size);\n      var label = meta.width + ' \u00D7 ' + meta.height + ' px';\n      if (meta.quality === 'good') {\n        return label + ' \u00B7 ' + txt('ui.photoMetaGood', 'Good size for try-on');\n      }\n      return label + ' \u00B7 ' + txt('ui.photoMetaOk', 'Accepted \u2014 full-length photos work best');\n    }\n\n    function classifyFailure(err, message) {\n      var status = err && typeof err.status === 'number' ? err.status : 0;\n      var payload = err && err.payload ? err.payload : null;\n      var code = payload && payload.code ? String(payload.code) : '';\n      var text = String(message || '').toLowerCase();\n\n      if (\n        text.indexOf('product view') !== -1 ||\n        text.indexOf('front product image') !== -1 ||\n        text.indexOf('suitable for try-on') !== -1\n      ) {\n        return { kind: 'garment', showRetry: false, showNewPhoto: true, showChooseView: true };\n      }\n\n      if (code === 'TRYON_BUSY') {\n        return { kind: 'temporary', showRetry: true, showNewPhoto: false };\n      }\n\n      if (code === 'KIDS_NOT_SUPPORTED' || code === 'REGION_UNAVAILABLE') {\n        return { kind: 'account', showRetry: false, showNewPhoto: false };\n      }\n\n      if (code === 'RESULT_EXPIRED' || code === 'SESSION_USED') {\n        return { kind: 'photo', showRetry: false, showNewPhoto: true };\n      }\n\n      if (code === 'TRYON_DAILY_CAPACITY') {\n        return { kind: 'account', showRetry: false, showNewPhoto: false };\n      }\n\n      if (code === 'PHOTO_FORMAT_UNSUPPORTED') {\n        return { kind: 'photo', showRetry: false, showNewPhoto: true };\n      }\n\n      if (\n        status === 401 ||\n        status === 403 ||\n        status === 429 ||\n        code === 'LOGIN_REQUIRED' ||\n        code === 'ACCOUNT_USAGE_LIMIT' ||\n        text.indexOf('login') !== -1 ||\n        text.indexOf('limit') !== -1 ||\n        text.indexOf('rate limit') !== -1\n      ) {\n        return { kind: 'account', showRetry: false, showNewPhoto: false };\n      }\n\n      if (\n        status >= 500 ||\n        text.indexOf('network') !== -1 ||\n        text.indexOf('timeout') !== -1 ||\n        text.indexOf('temporarily') !== -1 ||\n        text.indexOf('busy') !== -1\n      ) {\n        return { kind: 'temporary', showRetry: true, showNewPhoto: true };\n      }\n\n      if (shouldAddPhotoFailureHint(err, message)) {\n        return { kind: 'photo', showRetry: false, showNewPhoto: true };\n      }\n\n      return { kind: 'unknown', showRetry: true, showNewPhoto: true };\n    }\n\n    function setResultCopy(title, note) {\n      if (resultTitle) resultTitle.textContent = title;\n      if (resultNote) resultNote.textContent = note;\n    }\n\n    function setResultPolicy(text) {\n      if (!resultPolicy) return;\n      var value = String(text || '').trim();\n      resultPolicy.hidden = !value;\n      resultPolicy.textContent = value;\n    }\n\n    function buildDownloadFileName() {\n      var productSlug = (state.productTitle || 'try-on')\n        .toLowerCase()\n        .replace(/[^a-z0-9]+/g, '-')\n        .replace(/^-|-$/g, '');\n      return productSlug + '-virtual-try-on.jpg';\n    }\n\n    async function downloadResultImage(url) {\n      var response = await fetch(url, { credentials: 'include' });\n      if (!response.ok) {\n        var payload = await response.json().catch(function () { return {}; });\n        throw new Error(payload.error || txt('ui.downloadFailed', 'Download did not start. Please try again.'));\n      }\n\n      var blob = await response.blob();\n      var blobUrl = window.URL.createObjectURL(blob);\n      var link = document.createElement('a');\n      link.href = blobUrl;\n      link.download = buildDownloadFileName();\n      document.body.appendChild(link);\n      link.click();\n      document.body.removeChild(link);\n      window.setTimeout(function () {\n        window.URL.revokeObjectURL(blobUrl);\n      }, 1000);\n    }\n\n    function joinCopyParts(parts) {\n      return (parts || [])\n        .map(function (part) { return String(part || '').trim(); })\n        .filter(Boolean)\n        .join(' ');\n    }\n\n    function canReuseCurrentSessionSource() {\n      return !!state.sessionId && !state.sourceDeletedAt && state.sourceExpiresAt > Date.now();\n    }\n\n    function buildSourcePrivacyLine() {\n      if (!state.sessionId) return '';\n\n      if (state.sourceDeletedAt) {\n        return txt('ui.sourceDeletedTrust', 'Your uploaded photo was deleted automatically after render.');\n      }\n\n      if (canReuseCurrentSessionSource()) {\n        if (state.sourceRetentionMode === 'keep_for_20_minutes') {\n          return txt(\n            'ui.sourceKeptTrust',\n            'Your uploaded photo stays private and can be reused for about {{ time }}.',\n            { time: formatRemainingTime(state.sourceExpiresAt - Date.now()) }\n          );\n        }\n\n        return txt(\n          'ui.sourceRetryWindowTrust',\n          'We kept this photo privately for a short retry window. It can be reused for about {{ time }}.',\n          { time: formatRemainingTime(state.sourceExpiresAt - Date.now()) }\n        );\n      }\n\n      if (state.sourceRetentionMode === 'keep_for_20_minutes') {\n        return txt('ui.sourceWillBeKeptTrust', 'Your uploaded photo stays private and is kept for up to 20 minutes for quick retry.');\n      }\n\n      return txt('ui.sourceWillDeleteTrust', 'Your uploaded photo stays private and is deleted automatically after a successful render.');\n    }\n\n    function buildResultAvailabilityLine() {\n      if (state.resultExpiresAt > Date.now()) {\n        return txt(\n          'ui.resultAvailabilityTrust',\n          'This preview stays available in this tab for about {{ time }}.',\n          { time: formatRemainingTime(state.resultExpiresAt - Date.now()) }\n        );\n      }\n\n      return txt('ui.resultReadyNote', 'Save it now or keep browsing. This preview stays available for 30 minutes in this tab.');\n    }\n\n    function buildUsageTrustLine() {\n      if (!state.usageSummary) return '';\n      if (state.usageSummary.isGuest) {\n        var guestLimit = parseInt(String(state.usageSummary.guestRenderLimit || 3), 10);\n        if (!(guestLimit > 0)) guestLimit = 3;\n        return txt(\n          'ui.guestQuotaTrust',\n          'Guest try-on includes up to {{ count }} previews before sign-in is required.',\n          { count: String(guestLimit) }\n        );\n      }\n      if (state.usageSummary.usagePolicy === 'preorder_render_limit') {\n        var accountLimit = parseInt(String(state.usageSummary.accountRenderLimit || 7), 10);\n        if (!(accountLimit > 0)) accountLimit = 7;\n        return txt(\n          'ui.preorderQuotaTrust',\n          'Signed-in customers can use up to {{ count }} try-ons before their first order.',\n          { count: String(accountLimit) }\n        );\n      }\n      if (state.usageSummary.usagePolicy === 'postorder_render_limit') {\n        var memberLimit = parseInt(String(state.usageSummary.postOrderRenderLimit || 12), 10);\n        if (!(memberLimit > 0)) memberLimit = 12;\n        var memberWindow = parseInt(String(state.usageSummary.policyWindowDays || 30), 10);\n        if (!(memberWindow > 0)) memberWindow = 30;\n        return txt(\n          'ui.postorderQuotaTrust',\n          'After your first order, your account includes up to {{ count }} previews every {{ days }} days.',\n          { count: String(memberLimit), days: String(memberWindow) }\n        );\n      }\n      return '';\n    }\n\n    function buildUsagePolicyLabel(usage) {\n      if (!usage) return '';\n      if (usage.isGuest) {\n        var guestLimit = parseInt(String(usage.guestRenderLimit || 3), 10);\n        if (!(guestLimit > 0)) guestLimit = 3;\n        return txt(\n          'ui.guestPolicyLabel',\n          'Guest preview: {{ count }} looks before sign-in.',\n          { count: String(guestLimit) }\n        );\n      }\n      if (usage.usagePolicy === 'preorder_render_limit') {\n        var accountLimit = parseInt(String(usage.accountRenderLimit || 7), 10);\n        if (!(accountLimit > 0)) accountLimit = 7;\n        return txt(\n          'ui.preorderPolicyLabel',\n          'Account preview: {{ count }} looks before first order.',\n          { count: String(accountLimit) }\n        );\n      }\n      var memberLimit = parseInt(String(usage.postOrderRenderLimit || 12), 10);\n      if (!(memberLimit > 0)) memberLimit = 12;\n      var memberWindow = parseInt(String(usage.policyWindowDays || 30), 10);\n      if (!(memberWindow > 0)) memberWindow = 30;\n      return txt(\n        'ui.postorderPolicyLabel',\n        'Member preview: {{ count }} looks every {{ days }} days.',\n        { count: String(memberLimit), days: String(memberWindow) }\n      );\n    }\n\n    function buildLoginRequiredNote(payload) {\n      var usage = payload && payload.usage ? payload.usage : null;\n      if (usage && usage.isGuest) {\n        return txt(\n          'ui.loginRequiredGuestNote',\n          'Guest preview is designed as a quick first look. Sign in with your Vonili account to continue with your saved allowance.'\n        );\n      }\n      return (payload && payload.error) || txt(\n        'ui.loginRequiredNote',\n        'Sign in with your Vonili account to continue your try-on.'\n      );\n    }\n\n    function buildAccountLimitTitle(payload) {\n      var usage = payload && payload.usage ? payload.usage : null;\n      if (usage && usage.usagePolicy === 'preorder_render_limit') {\n        return txt('ui.accountPreorderLimitTitle', 'Preview allowance used');\n      }\n      if (usage && usage.usagePolicy === 'postorder_render_limit') {\n        return txt('ui.accountPostorderLimitTitle', 'Preview window used');\n      }\n      return txt('ui.accountLimitTitle', 'Account try-on limit reached');\n    }\n\n    function buildAccountLimitNote(payload) {\n      var usage = payload && payload.usage ? payload.usage : null;\n      if (usage && usage.usagePolicy === 'preorder_render_limit') {\n        return txt(\n          'ui.accountPreorderLimitNote',\n          'This account has used its pre-order previews. Place your first order to move into the next allowance, or contact Vonili support if you need more access.'\n        );\n      }\n      if (usage && usage.usagePolicy === 'postorder_render_limit') {\n        var memberLimit = parseInt(String(usage.postOrderRenderLimit || 12), 10);\n        if (!(memberLimit > 0)) memberLimit = 12;\n        var memberWindow = parseInt(String(usage.policyWindowDays || 30), 10);\n        if (!(memberWindow > 0)) memberWindow = 30;\n        return txt(\n          'ui.accountPostorderLimitNote',\n          'This account has used its {{ count }} previews for the current {{ days }}-day window. Your next allowance unlocks automatically, or Vonili support can help sooner.',\n          { count: String(memberLimit), days: String(memberWindow) }\n        );\n      }\n      return (payload && payload.error) || txt(\n        'ui.accountLimitNote',\n        'This account has reached the current try-on usage limit. Please contact support if you need more access.'\n      );\n    }\n\n    function hasMultipleGarmentViews() {\n      return garmentOptionButtons.length > 1;\n    }\n\n    function buildSuccessResultActions() {\n      return {\n        showRetry: true,\n        showSave: true,\n        showLogin: false,\n        showNewPhoto: true,\n        showChooseView: hasMultipleGarmentViews(),\n      };\n    }\n\n    function buildCompletedResultNote() {\n      return joinCopyParts([\n        hasMultipleGarmentViews()\n          ? txt(\n              'ui.resultExploreHint',\n              'Try another product view or upload a new photo to compare.'\n            )\n          : txt(\n              'ui.resultNewPhotoHint',\n              'Upload a new photo to compare another look.'\n            ),\n        buildResultAvailabilityLine(),\n        buildSourcePrivacyLine(),\n        buildUsageTrustLine()\n      ]);\n    }\n\n    function buildRecoveredResultNote() {\n      return joinCopyParts([\n        txt('ui.recoveredNote', 'Recovered from this tab.'),\n        buildResultAvailabilityLine(),\n        buildSourcePrivacyLine(),\n        buildUsageTrustLine()\n      ]);\n    }\n\n    function buildFailedResultNote(message) {\n      return joinCopyParts([\n        message,\n        canReuseCurrentSessionSource()\n          ? txt(\n              'ui.samePhotoRetryNote',\n              'Retry now with the same photo. Available for about {{ time }}.',\n              { time: formatRemainingTime(state.sourceExpiresAt - Date.now()) }\n            )\n          : '',\n        buildSourcePrivacyLine()\n      ]);\n    }\n\n    function buildProcessingTrustLine() {\n      if (state.sourceRetentionMode === 'keep_for_20_minutes') {\n        return txt(\n          'ui.processingTrustKeep',\n          'Your photo stays private and is kept briefly so you can retry without uploading again.'\n        );\n      }\n\n      return txt(\n        'ui.processingTrustDelete',\n        'Your photo stays private and will be deleted automatically after a successful render.'\n      );\n    }\n\n    function clearSessionRuntimeState() {\n      state.sessionId = null;\n      state.sourceExpiresAt = 0;\n      state.resultExpiresAt = 0;\n      state.sourceDeletedAt = null;\n      state.terminalSessionHandled = false;\n    }\n\n    function closePanel() {\n      resetState();\n      setPanelOpen(false);\n      showStep(consentStep, [consentStep, uploadZone, statusWrap, resultWrap]);\n      updateDots(0);\n      if (state.lastFocusedElement && typeof state.lastFocusedElement.focus === 'function') {\n        state.lastFocusedElement.focus();\n      } else {\n        launchBtn.focus();\n      }\n    }\n\n    if (!panel.classList.contains('is-open') && !panel.classList.contains('is-visible')) {\n      setPanelOpen(false);\n    }\n    showStep(consentStep, [consentStep, uploadZone, statusWrap, resultWrap]);\n    updateDots(0);\n    hydrateRetentionPreference();\n    updateReusablePhotoUI();\n    setGarmentListExpanded(false);\n    syncVariant(root, state);\n    refreshInventoryGate(false);\n\n    function openTryOnPanelFromLaunch() {\n      setPanelOpen(true);\n      track('panel_open');\n      syncVariant(root, state);\n      if (restoreActiveSession()) return;\n      updateReusablePhotoUI();\n      /* A fresh fitting-room visit always starts with explicit approval.\n         Stored consent is still retained for API bookkeeping, but must not\n         silently skip the customer-facing privacy step after close/reopen. */\n      showStep(consentStep, [consentStep, uploadZone, statusWrap, resultWrap]);\n      updateDots(0);\n      focusFirstInteractive(consentStep);\n      ensureIdentity().catch(function () {});\n    }\n\n    launchBtn.addEventListener('click', function () {\n      if (state.inventory.blocked) return;\n      openTryOnPanelFromLaunch();\n    });\n\n    launchBtn.addEventListener('pointerenter', function () {\n      ensureIdentity().catch(function () {});\n    }, { once: true, passive: true });\n\n    if (closeBtn) {\n      closeBtn.addEventListener('click', closePanel);\n    }\n    if (backdrop) {\n      backdrop.addEventListener('click', closePanel);\n    }\n    panel.addEventListener('click', function (e) {\n      e.stopPropagation();\n    });\n    panel.addEventListener('touchend', function (e) {\n      e.stopPropagation();\n    }, { passive: true });\n    if (garmentToggleBtn) {\n      garmentToggleBtn.addEventListener('click', function () {\n        if (!garmentChooser) return;\n        setGarmentChooserOpen(garmentChooser.hidden);\n      });\n    }\n    if (garmentMoreBtn) {\n      garmentMoreBtn.addEventListener('click', function () {\n        setGarmentListExpanded(!state.garmentChooserExpanded);\n      });\n    }\n    if (keepPhotoToggle) {\n      keepPhotoToggle.addEventListener('change', function () {\n        state.sourceRetentionMode = getSelectedRetentionMode();\n        persistSessionMemory({ keepSourceOptIn: keepPhotoToggle.checked });\n        updateReusablePhotoUI();\n      });\n    }\n    if (useRecentPhotoBtn) {\n      useRecentPhotoBtn.addEventListener('click', function () {\n        var memory = readTryOnMemory();\n        if (memory && memory.reusableSourceSessionId) {\n          startTryOnWithRecentPhoto(memory.reusableSourceSessionId);\n        }\n      });\n    }\n    if (dismissReuseBtn) {\n      dismissReuseBtn.addEventListener('click', function () {\n        var memory = readTryOnMemory();\n        if (memory && memory.reusableSourceSessionId) {\n          persistSessionMemory({ dismissedReusableSourceSessionId: memory.reusableSourceSessionId });\n        }\n        updateReusablePhotoUI();\n      });\n    }\n    garmentOptionButtons.forEach(function (button) {\n      button.addEventListener('click', function () {\n        var selection = findGarmentOptionById(state.garmentOptions, button.getAttribute('data-image-id'));\n        if (!selection) return;\n        applyGarmentSelection(root, state, selection, {\n          persist: true,\n          garmentLabelEl: garmentLabel,\n          garmentHintEl: garmentHint,\n        });\n        updateLookSelectionSummary(root, state, lookSummary);\n        revealActiveGarmentInRail('smooth');\n      });\n    });\n    document.addEventListener('keydown', function (e) {\n      if (panel.hidden) return;\n      if (e.key === 'Escape') {\n        closePanel();\n        return;\n      }\n      if (e.key === 'Tab') {\n        trapFocusWithin(panel, e);\n      }\n    });\n    document.addEventListener('visibilitychange', function () {\n      if (!state.sessionId || state.terminalSessionHandled) return;\n      if (state.pollId) {\n        stopPolling();\n        startPolling();\n      }\n    });\n\n    var confirmBox = root.querySelector('[data-tryon-confirm]');\n    function syncConfirmGate() {\n      var ready = !confirmBox || confirmBox.checked;\n      consentBtn.disabled = !ready;\n      consentBtn.setAttribute('aria-disabled', ready ? 'false' : 'true');\n    }\n    if (confirmBox) confirmBox.addEventListener('change', syncConfirmGate);\n    syncConfirmGate();\n\n    consentBtn.addEventListener('click', async function () {\n      if (consentBtn.disabled) return;\n      if (confirmBox && !confirmBox.checked) return;\n      state.guardianConfirmed = !!(confirmBox && confirmBox.hasAttribute('data-tryon-guardian') && confirmBox.checked);\n      consentBtn.disabled = true;\n      var consentLabel = consentBtn.innerHTML;\n      consentBtn.textContent = txt('ui.savingConsent', 'Saving consent\u2026');\n      try {\n        var shopperId = await ensureIdentity();\n        await requestTryOnJson('/v1/tryon/consent', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({ customerId: shopperId }),\n        });\n        setConsent();\n        track('consent', { detail: state.guardianConfirmed ? 'guardian' : '' });\n        showStep(uploadZone, [consentStep, uploadZone, statusWrap, resultWrap]);\n        updateDots(1);\n        setGarmentChooserOpen(true);\n        focusFirstInteractive(selectionWorkspace || uploadZone);\n      } catch (err) {\n        showError(err);\n      } finally {\n        consentBtn.innerHTML = consentLabel;\n        syncConfirmGate();\n      }\n    });\n\n    dropzone.addEventListener('click', function () {\n      if (!state.isBusy) fileInput.click();\n    });\n    dropzone.addEventListener('keydown', function (e) {\n      if (state.isBusy) return;\n      if (e.key === 'Enter' || e.key === ' ') {\n        e.preventDefault();\n        fileInput.click();\n      }\n    });\n\n    dropzone.addEventListener('dragover', function (e) {\n      e.preventDefault();\n      e.stopPropagation();\n      dropzone.classList.add('is-over');\n    });\n    dropzone.addEventListener('dragleave', function (e) {\n      e.preventDefault();\n      dropzone.classList.remove('is-over');\n    });\n    dropzone.addEventListener('drop', function (e) {\n      e.preventDefault();\n      e.stopPropagation();\n      dropzone.classList.remove('is-over');\n      var files = e.dataTransfer?.files;\n      if (files && files[0]) handleFileSelect(files[0]);\n    });\n\n    if (cameraBtn && cameraInput) {\n      cameraBtn.addEventListener('click', function () {\n        if (!state.isBusy) cameraInput.click();\n      });\n      cameraInput.addEventListener('change', function () {\n        if (cameraInput.files && cameraInput.files[0]) handleFileSelect(cameraInput.files[0]);\n      });\n    }\n\n    if (galleryBtn) {\n      galleryBtn.addEventListener('click', function () {\n        if (!state.isBusy) fileInput.click();\n      });\n    }\n\n    fileInput.addEventListener('change', function () {\n      if (fileInput.files && fileInput.files[0]) handleFileSelect(fileInput.files[0]);\n    });\n\n    if (changePhotoBtn) {\n      changePhotoBtn.addEventListener('click', function () {\n        state.selectedFile = null;\n        clearPhotoInputs();\n        if (mobilePhotoSources) mobilePhotoSources.hidden = false;\n        photoPreview.classList.remove('is-visible');\n        submitWrap.style.display = 'none';\n        dropzone.style.display = 'flex';\n        clearUploadError();\n        focusFirstInteractive(uploadZone);\n      });\n    }\n\n    if (submitBtn) {\n      submitBtn.addEventListener('click', function () {\n        if (state.selectedFile) startTryOn(state.selectedFile);\n      });\n    }\n\n    if (retryBtn) {\n      retryBtn.addEventListener('click', function () {\n        track('retry');\n        if (canReuseCurrentSessionSource()) {\n          startTryOnWithRecentPhoto(state.sessionId);\n          return;\n        }\n        if (state.selectedFile) {\n          startTryOn(state.selectedFile);\n          return;\n        }\n        returnToUploadStep();\n      });\n    }\n\n    if (newPhotoBtn) {\n      newPhotoBtn.addEventListener('click', function () {\n        returnToUploadStep();\n      });\n    }\n\n    if (chooseViewBtn) {\n      chooseViewBtn.addEventListener('click', function () {\n        returnToGarmentChooser();\n      });\n    }\n\n    if (saveBtn) {\n      saveBtn.addEventListener('click', async function () {\n        if (!resultImage || !resultImage.src) return;\n        if (saveBtn.disabled) return;\n        var originalLabel = saveBtn.innerHTML;\n        saveBtn.disabled = true;\n        saveBtn.textContent = txt('ui.preparingDownload', 'Preparing download\u2026');\n        try {\n          await downloadResultImage(resultImage.src);\n          track('download');\n          setResultPolicy(buildUsagePolicyLabel(state.usageSummary));\n        } catch (err) {\n          setResultPolicy(\n            txt('ui.downloadFallbackHint', 'Download did not start. Try again, or press and hold the image to save it.')\n          );\n          console.error('Try-on download failed', err);\n        } finally {\n          saveBtn.disabled = false;\n          saveBtn.innerHTML = originalLabel;\n        }\n      });\n    }\n\n    variantOptionButtons.forEach(function (button) {\n      button.addEventListener('click', function () {\n        var requestedVariantId = button.getAttribute('data-variant-id') || '';\n        var requestedLabel = button.getAttribute('data-variant-label') || '';\n        var currentVariantId = root.dataset.variantId || getSelectedVariantId(root) || '';\n        var nextVariantId = findMatchingVariantId(state.variantData, currentVariantId, requestedLabel, state.colorIndex) || requestedVariantId;\n        setActiveVariant(root, state.variantData, nextVariantId, {\n          syncForm: false,\n          source: 'widget',\n        }, state);\n        window.requestAnimationFrame(function () {\n          revealActiveGarmentInRail('smooth');\n        });\n      });\n    });\n\n    listenVariantChanges(root, state, function () {\n      syncVariant(root, state);\n    });\n\n    syncVariant(root, state);\n\n    async function handleFileSelect(file) {\n      clearUploadError();\n      var prepared = null;\n      try {\n        prepared = await preparePhotoForUpload(file);\n      } catch (err) {\n        showUploadError(err && err.message ? err.message : txt('ui.photoUnreadable', 'We could not read that image. Save as JPG or PNG, or take a new photo with your camera app.'));\n        state.selectedFile = null;\n        clearPhotoInputs();\n        return;\n      }\n      var photoMeta = prepared.meta;\n      state.selectedFile = prepared.file;\n      track('photo_selected', { detail: photoMeta && photoMeta.quality ? String(photoMeta.quality) : '' });\n      if (photoMeta && photoMeta.quality === 'tight') {\n        showUploadWarning(txt('ui.photoCropTooTight', 'This looks too cropped. Step back so your full body from head to feet is in frame.'));\n      } else if (photoMeta && photoMeta.quality === 'ok') {\n        showUploadWarning(txt('ui.photoAspectHint', 'Tip: step back a little so head and feet both fit in frame for a cleaner preview.'));\n      } else {\n        clearUploadError();\n      }\n      if (previewImg) {\n        if (!previewImg.dataset.placeholderSrc) previewImg.dataset.placeholderSrc = previewImg.getAttribute('src') || '';\n        if (previewImg.src && previewImg.src.indexOf('blob:') === 0) URL.revokeObjectURL(previewImg.src);\n        previewImg.src = prepared.previewUrl || previewImg.dataset.placeholderSrc;\n        previewImg.alt = txt('ui.uploadedPreviewPrefix', 'Preview of uploaded photo', { file: file.name }) + ' ' + file.name;\n      }\n      if (previewName) previewName.textContent = file.name;\n      if (previewSize) previewSize.textContent = formatPhotoMeta(photoMeta, prepared.file);\n      photoPreview.classList.add('is-visible');\n      submitWrap.style.display = 'block';\n      dropzone.style.display = 'none';\n      if (mobilePhotoSources) mobilePhotoSources.hidden = true;\n    }\n\n    async function startTryOn(file) {\n      if (state.isBusy) return;\n      if (state.inventory.blocked) {\n        showStockBlockedState();\n        return;\n      }\n      state.isBusy = true;\n      clearSessionRuntimeState();\n      state.sourceRetentionMode = getSelectedRetentionMode();\n      syncVariant(root, state, { preserveGarmentSelection: true, preserveWidgetSelection: true });\n      var garmentQuality = buildGarmentSessionQuality();\n      showStep(statusWrap, [consentStep, uploadZone, statusWrap, resultWrap]);\n      updateDots(2);\n      resultImage.style.display = 'none';\n      resultImage.removeAttribute('src');\n      if (resultActions) resultActions.hidden = true;\n      updateStatus('pending');\n      startWaitingRoom(previewImg && previewImg.src && previewImg.src.indexOf('blob:') === 0 ? previewImg.src : '');\n\n      try {\n        var shopperId = await ensureIdentity();\n        var sessionRes = await requestTryOnJson('/v1/tryon/session', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({\n            customerId: shopperId,\n            garmentId: root.dataset.garmentId,\n            variantId: root.dataset.variantId,\n            garmentImageUrl: root.dataset.garmentImageUrl,\n            garmentQualityTier: garmentQuality.tier,\n            garmentQualityScore: garmentQuality.score,\n            garmentQualityFlags: garmentQuality.flags,\n            inputMode: 'full_body',\n            productTitle: state.productTitle,\n            productType: state.productType,\n            productTags: state.productTags,\n            productCategory: state.productCategory,\n            sourceRetentionMode: state.sourceRetentionMode,\n            guardianConfirmed: state.guardianConfirmed === true,\n            productHandle: root.dataset.productHandle || '',\n          }),\n        });\n\n        state.sessionId = sessionRes.sessionId;\n        state.productCategory = sessionRes.productCategory || state.productCategory;\n        state.renderStrategy = sessionRes.renderStrategy || state.renderStrategy;\n        syncSessionState(sessionRes);\n        syncUsageSummary(sessionRes.usage);\n        persistSessionMemory(buildSessionMemoryPatch('pending'));\n\n        updateStatus('uploaded', txt('ui.uploadingShort', 'Uploading\u2026'));\n        await uploadSessionPhoto(state.sessionId, file);\n        persistSessionMemory(buildSessionMemoryPatch('uploaded'));\n\n        updateStatus('queued');\n        var submitRes = await requestTryOnJson('/v1/tryon/submit', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({ sessionId: state.sessionId }),\n        });\n        syncSessionState(submitRes || {});\n        syncUsageSummary(submitRes && submitRes.usage);\n        persistSessionMemory(buildSessionMemoryPatch('queued'));\n        track('submit');\n\n        state.terminalSessionHandled = false;\n        startLiveStatusChannel();\n        startPolling();\n      } catch (err) {\n        if (!handleTryOnBoundaryError(err)) showError(err);\n        state.isBusy = false;\n      }\n    }\n\n    async function uploadSessionPhoto(sessionId, file) {\n      for (var attempt = 0; ; attempt += 1) {\n        var formData = new FormData();\n        formData.append('photo', file, file.name || 'photo.jpg');\n        try {\n          return await requestTryOnJson('/v1/tryon/upload/' + sessionId, {\n            method: 'POST',\n            body: formData,\n          });\n        } catch (err) {\n          /* Only fetch-level failures (no HTTP status) are retried; the server rejected the photo otherwise. */\n          if (attempt >= 1 || (err && err.status)) throw err;\n          await new Promise(function (resolve) { window.setTimeout(resolve, 1200); });\n        }\n      }\n    }\n\n    function startPolling(options) {\n      options = options || {};\n      stopPolling();\n      state.pollRetryCount = 0;\n      scheduleNextPoll(options.immediate ? 0 : getPollingDelayMs());\n    }\n\n    function scheduleNextPoll(delayMs) {\n      if (!state.sessionId || state.terminalSessionHandled) return;\n      state.pollId = window.setTimeout(async function () {\n        state.pollId = null;\n        if (!state.sessionId || state.terminalSessionHandled) return;\n        try {\n          var session = await fetchLatestSession();\n          if (!session) return;\n          state.pollRetryCount = 0;\n          handleSessionUpdate(session);\n          if (!state.terminalSessionHandled) {\n            scheduleNextPoll(getPollingDelayMs());\n          }\n        } catch (err) {\n          if (state.liveSocketHealthy) {\n            scheduleNextPoll(getPollingDelayMs() + 2000);\n            return;\n          }\n          state.pollRetryCount += 1;\n          if (state.pollRetryCount <= 2) {\n            scheduleNextPoll(getPollingDelayMs() + state.pollRetryCount * 1000);\n            return;\n          }\n          stopPolling();\n          showError(err);\n          state.isBusy = false;\n        }\n      }, Math.max(0, delayMs || 0));\n    }\n\n    function getPollingDelayMs() {\n      if (state.liveSocketHealthy) {\n        return document.hidden ? 12000 : 8000;\n      }\n      return document.hidden ? 5000 : 2500;\n    }\n\n    function stopPolling() {\n      if (state.pollId) {\n        window.clearTimeout(state.pollId);\n        state.pollId = null;\n      }\n    }\n\n    function startLiveStatusChannel() {\n      if (!state.sessionId || typeof window.WebSocket !== 'function') return false;\n      stopLiveStatusChannel();\n\n      var liveUrl;\n      try {\n        liveUrl = new URL(joinUrl(state.apiBase, '/v1/tryon/live/' + state.sessionId), window.location.href);\n      } catch (_) {\n        return false;\n      }\n      liveUrl.protocol = liveUrl.protocol === 'https:' ? 'wss:' : 'ws:';\n\n      try {\n        state.manualSocketClose = false;\n        state.liveSocketHealthy = false;\n        state.liveSocket = new WebSocket(liveUrl.toString());\n      } catch (_) {\n        state.liveSocket = null;\n        return false;\n      }\n\n      state.liveSocket.addEventListener('open', function () {\n        state.liveSocketHealthy = true;\n        state.pollRetryCount = 0;\n        startPolling();\n      });\n      state.liveSocket.addEventListener('message', handleLiveStatusMessage);\n      state.liveSocket.addEventListener('error', function () {\n        state.liveSocketHealthy = false;\n      });\n      state.liveSocket.addEventListener('close', function () {\n        var shouldResumePolling = !state.manualSocketClose && !!state.sessionId && state.isBusy && !state.terminalSessionHandled;\n        state.liveSocket = null;\n        state.liveSocketHealthy = false;\n        if (shouldResumePolling) {\n          startPolling({ immediate: true });\n        }\n      });\n      return true;\n    }\n\n    function stopLiveStatusChannel() {\n      state.manualSocketClose = true;\n      state.liveSocketHealthy = false;\n      if (state.liveSocket) {\n        try {\n          state.liveSocket.close();\n        } catch (_) {}\n        state.liveSocket = null;\n      }\n    }\n\n    async function handleLiveStatusMessage(event) {\n      var payload = parseJson(event && event.data ? event.data : '{}');\n      if (!payload || payload.sessionId !== state.sessionId) return;\n\n      if (payload.type === 'preview' && payload.previewVersion) {\n        showDraftPreview(payload.previewVersion);\n        return;\n      }\n      if (payload.type === 'preview_reset') {\n        clearDraftPreview(payload.previewReset);\n        return;\n      }\n\n      if (payload.type === 'status' && payload.status) {\n        updateStatus(payload.status, null, false, typeof payload.progress === 'number' ? payload.progress : null);\n        persistSessionMemory(buildSessionMemoryPatch(payload.status));\n        return;\n      }\n\n      if (\n        payload.type === 'completed'\n        || payload.type === 'error'\n        || payload.status === 'completed'\n        || payload.status === 'failed'\n      ) {\n        try {\n          var session = await fetchLatestSession();\n          if (session) handleSessionUpdate(session);\n        } catch (_) {\n          startPolling({ immediate: true });\n        }\n      }\n    }\n\n    async function fetchLatestSession() {\n      if (!state.sessionId) return null;\n      var session = await requestTryOnJson('/v1/tryon/status/' + state.sessionId);\n      syncSessionState(session);\n      return session;\n    }\n\n    function handleSessionUpdate(session) {\n      if (!session) return;\n      syncSessionState(session);\n\n      if (session.status === 'completed') {\n        handleCompletedSession(session);\n        return;\n      }\n      if (session.status === 'failed') {\n        handleFailedSession(session.errorMessage || STATUS_TEXT.failed);\n        return;\n      }\n      if (session.previewReset) clearDraftPreview(session.previewReset);\n      if (session.previewVersion && !session.previewReset) showDraftPreview(session.previewVersion);\n\n      updateStatus(session.status);\n      persistSessionMemory(buildSessionMemoryPatch(session.status));\n    }\n\n    function handleCompletedSession(session) {\n      state.terminalSessionHandled = true;\n      stopPolling();\n      stopLiveStatusChannel();\n      stopWaitingRoom();\n      var waitedSeconds = state.waitStartedAt ? Math.round((Date.now() - state.waitStartedAt) / 1000) : 0;\n      showStep(resultWrap, [consentStep, uploadZone, statusWrap, resultWrap]);\n      updateDots(3);\n      updateStatus('completed', null, false, 100);\n      setResultPolicy(buildUsagePolicyLabel(state.usageSummary));\n      setResultSkeletonVisible(true);\n      if (resultImage) {\n        resultImage.style.display = 'none';\n      }\n      var resultUrl = joinUrl(state.apiBase, '/api/result/' + state.sessionId) + '?t=' + Date.now();\n      resultImage.onload = function () {\n        setResultSkeletonVisible(false);\n        resultImage.style.display = 'block';\n        setResultActions(buildSuccessResultActions());\n        setResultCopy(\n          txt('ui.resultReadyTitle', 'Your preview is ready'),\n          buildCompletedResultNote()\n        );\n        if (state.resultTrackedFor !== state.sessionId) {\n          state.resultTrackedFor = state.sessionId;\n          track('result_shown', { detail: waitedSeconds ? waitedSeconds + 's' : '' });\n          rememberTryOnForCart();\n        }\n      };\n      resultImage.onerror = function () {\n        setResultSkeletonVisible(false);\n        showError(new Error(txt('ui.errorDefault', 'Unable to complete the try-on.')));\n      };\n      resultImage.src = resultUrl;\n      state.isBusy = false;\n      persistSessionMemory(buildSessionMemoryPatch('completed', {\n        resultUrl: resultUrl,\n        sourceDeletedAt: session.sourceDeletedAt || null\n      }));\n      updateReusablePhotoUI();\n    }\n\n    function handleFailedSession(message) {\n      state.terminalSessionHandled = true;\n      stopPolling();\n      stopLiveStatusChannel();\n      setResultPolicy('');\n      showError(new Error(message || STATUS_TEXT.failed));\n      state.isBusy = false;\n    }\n\n    function resetState() {\n      stopPolling();\n      stopLiveStatusChannel();\n      stopWaitingRoom();\n      state.isBusy = false;\n      clearSessionRuntimeState();\n      state.pollRetryCount = 0;\n      state.selectedFile = null;\n      state.activeGarmentSelection = null;\n      state.lastFailure = null;\n      clearPhotoInputs();\n      if (mobilePhotoSources) mobilePhotoSources.hidden = false;\n      photoPreview.classList.remove('is-visible');\n      submitWrap.style.display = 'none';\n      dropzone.style.display = 'flex';\n      hideStatus();\n      clearUploadError();\n      showStep(uploadZone, [consentStep, uploadZone, statusWrap, resultWrap]);\n      updateDots(1);\n      if (resultActions) resultActions.hidden = true;\n      resultImage.removeAttribute('src');\n      resultImage.style.display = 'none';\n      setResultCopy(\n        txt('ui.resultReadyTitle', 'Your preview is ready'),\n        txt('ui.resultReadyNote', 'Save it now or keep browsing. This preview stays available for 30 minutes in this tab.')\n      );\n      setResultPolicy('');\n      clearActiveSessionMemory();\n      syncVariant(root, state, { preserveWidgetSelection: true });\n      updateReusablePhotoUI();\n    }\n\n    function showError(err) {\n      setPanelOpen(true);\n      stopPolling();\n      stopLiveStatusChannel();\n      stopWaitingRoom();\n      state.terminalSessionHandled = true;\n      var msg = err && err.message ? err.message : txt('ui.errorDefault', 'Unable to complete the try-on.');\n      var addPhotoHint = shouldAddPhotoFailureHint(err, msg);\n      var failure = classifyFailure(err, msg);\n      state.lastFailure = failure;\n      track('result_error', {\n        detail: String((err && err.payload && err.payload.code) || (err && err.status) || (failure && failure.kind) || 'error'),\n      });\n      showStep(resultWrap, [consentStep, uploadZone, statusWrap, resultWrap]);\n      updateDots(3);\n      setResultActions({\n        showRetry: failure.showRetry,\n        showNewPhoto: failure.showNewPhoto,\n        showChooseView: failure.showChooseView,\n        showSave: false,\n        showLogin: false,\n      });\n      if (resultImage) {\n        resultImage.style.display = 'none';\n        resultImage.removeAttribute('src');\n      }\n      setResultSkeletonVisible(false);\n      setResultPolicy('');\n      setResultCopy(\n        txt('ui.errorTitle', 'We could not create your preview'),\n        buildFailedResultNote(addPhotoHint ? (msg + ' ' + txt('hint.failed', STATUS_HINTS.failed)) : msg)\n      );\n      persistSessionMemory(buildSessionMemoryPatch('failed'));\n      clearActiveSessionMemory();\n      updateReusablePhotoUI();\n    }\n\n    function shouldAddPhotoFailureHint(err, message) {\n      var status = err && typeof err.status === 'number' ? err.status : 0;\n      var payload = err && err.payload ? err.payload : null;\n      var code = payload && payload.code ? String(payload.code) : '';\n      var text = String(message || '').toLowerCase();\n\n      if (status === 401 || status === 403 || status === 429) return false;\n      if (code === 'LOGIN_REQUIRED' || code === 'ACCOUNT_USAGE_LIMIT') return false;\n      if (\n        text.indexOf('consent') !== -1 ||\n        text.indexOf('unauthorized') !== -1 ||\n        text.indexOf('access denied') !== -1 ||\n        text.indexOf('identity missing') !== -1 ||\n        text.indexOf('login') !== -1 ||\n        text.indexOf('limit') !== -1 ||\n        text.indexOf('rate limit') !== -1 ||\n        text.indexOf('product view') !== -1 ||\n        text.indexOf('front product image') !== -1 ||\n        text.indexOf('suitable for try-on') !== -1 ||\n        text.indexOf('preview from this photo') !== -1 ||\n        text.indexOf('one person in frame') !== -1\n      ) {\n        return false;\n      }\n\n      if (status === 400 || status === 413 || status === 415) return true;\n      if (\n        text.indexOf('photo') !== -1 ||\n        text.indexOf('image') !== -1 ||\n        text.indexOf('full-body') !== -1 ||\n        text.indexOf('lighting') !== -1 ||\n        text.indexOf('front-facing') !== -1 ||\n        text.indexOf('upload') !== -1\n      ) {\n        return true;\n      }\n\n      return false;\n    }\n\n    function updateStatus(status, overrideText, isError, progressOverride) {\n      statusWrap.classList.add('is-visible');\n      statusText.textContent = overrideText || readCopyValue(copy, 'status.' + status) || STATUS_TEXT[status] || txt('ui.working', 'Working\u2026');\n      statusText.style.color = isError ? '#B94A2A' : '#1C1814';\n      var progressValue = typeof progressOverride === 'number' ? progressOverride : (STATUS_PROGRESS[status] || 0);\n      progressBar.style.width = progressValue + '%';\n      if (statusHint) {\n        statusHint.textContent = isError\n          ? txt('hint.failed', STATUS_HINTS.failed)\n          : joinCopyParts([\n              readCopyValue(copy, 'hint.' + status) || STATUS_HINTS[status] || txt('ui.tailoringHint', 'Tailoring the fit to your shape'),\n              status === 'completed' || status === 'failed' ? '' : buildProcessingTrustLine()\n            ]);\n      }\n      \n      var errEl = root.querySelector('[data-tryon-error-msg]');\n      if (errEl) {\n        if (isError) {\n          errEl.textContent = overrideText;\n          errEl.style.display = 'block';\n          statusText.textContent = txt('ui.failedStatusLabel', 'Try-On Failed');\n        } else {\n          errEl.style.display = 'none';\n        }\n      }\n    }\n\n    function hideStatus() {\n      statusWrap.classList.remove('is-visible');\n      statusText.classList.remove('vonili-tryon__error');\n      progressBar.style.width = '0%';\n      var errEl = root.querySelector('[data-tryon-error-msg]');\n      if (errEl) errEl.style.display = 'none';\n    }\n\n    function hasConsent() {\n      return readStorage(consentStorageKey(getShopperId(root), state.apiBase)) === 'true';\n    }\n\n    function setConsent() {\n      writeStorage(consentStorageKey(getShopperId(root), state.apiBase), 'true');\n    }\n\n    async function startTryOnWithRecentPhoto(reuseSourceSessionId) {\n      if (state.isBusy) return;\n      if (state.inventory.blocked) {\n        showStockBlockedState();\n        return;\n      }\n      var requestedReuseSourceSessionId = reuseSourceSessionId;\n      state.isBusy = true;\n      clearSessionRuntimeState();\n      state.sourceRetentionMode = getSelectedRetentionMode();\n      syncVariant(root, state, { preserveGarmentSelection: true, preserveWidgetSelection: true });\n      var garmentQuality = buildGarmentSessionQuality();\n      showStep(statusWrap, [consentStep, uploadZone, statusWrap, resultWrap]);\n      updateDots(2);\n      if (resultActions) resultActions.hidden = true;\n      resultImage.style.display = 'none';\n      resultImage.removeAttribute('src');\n      updateStatus('pending', txt('ui.reusingRecent', 'Reusing your recent photo\u2026'));\n      startWaitingRoom('');\n\n      try {\n        var shopperId = await ensureIdentity();\n        var sessionRes = await requestTryOnJson('/v1/tryon/session', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({\n            customerId: shopperId,\n            garmentId: root.dataset.garmentId,\n            variantId: root.dataset.variantId,\n            garmentImageUrl: root.dataset.garmentImageUrl,\n            garmentQualityTier: garmentQuality.tier,\n            garmentQualityScore: garmentQuality.score,\n            garmentQualityFlags: garmentQuality.flags,\n            inputMode: 'full_body',\n            productTitle: state.productTitle,\n            productType: state.productType,\n            productTags: state.productTags,\n            productCategory: state.productCategory,\n            sourceRetentionMode: state.sourceRetentionMode,\n            reuseSourceSessionId: requestedReuseSourceSessionId,\n            guardianConfirmed: state.guardianConfirmed === true,\n            productHandle: root.dataset.productHandle || '',\n          }),\n        });\n\n        state.sessionId = sessionRes.sessionId;\n        state.productCategory = sessionRes.productCategory || state.productCategory;\n        state.renderStrategy = sessionRes.renderStrategy || state.renderStrategy;\n        syncSessionState(sessionRes);\n        syncUsageSummary(sessionRes.usage);\n        persistSessionMemory(buildSessionMemoryPatch('queued'));\n\n        updateStatus('queued', txt('ui.startingRecent', 'Starting your try-on with your recent photo\u2026'));\n        var submitRes = await requestTryOnJson('/v1/tryon/submit', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({ sessionId: state.sessionId }),\n        });\n        syncSessionState(submitRes || {});\n        syncUsageSummary(submitRes && submitRes.usage);\n        track('submit', { detail: 'recent_photo' });\n\n        state.terminalSessionHandled = false;\n        startLiveStatusChannel();\n        startPolling();\n      } catch (err) {\n        if (!handleTryOnBoundaryError(err)) showError(err);\n        state.isBusy = false;\n      }\n    }\n\n    function hydrateRetentionPreference() {\n      var memory = readTryOnMemory();\n      if (keepPhotoToggle && memory && memory.keepSourceOptIn) {\n        keepPhotoToggle.checked = true;\n      }\n      state.sourceRetentionMode = getSelectedRetentionMode();\n    }\n\n    function getSelectedRetentionMode() {\n      return keepPhotoToggle && keepPhotoToggle.checked ? 'keep_for_20_minutes' : 'delete_after_render';\n    }\n\n    function syncSessionState(session) {\n      state.sessionId = session.sessionId || session.id || state.sessionId;\n      state.sourceRetentionMode = session.sourceRetentionMode || state.sourceRetentionMode;\n      state.sourceExpiresAt = session.sourceExpiresAt || state.sourceExpiresAt || 0;\n      state.resultExpiresAt = session.resultExpiresAt || state.resultExpiresAt || 0;\n      state.sourceDeletedAt = session.sourceDeletedAt || null;\n      syncUsageSummary(session.usage);\n    }\n\n    function restoreActiveSession() {\n      var memory = readTryOnMemory();\n      if (!memory || !memory.activeSessionId) return false;\n      if (memory.shopperId && memory.shopperId !== getShopperId(root)) return false;\n\n      if (memory.activeProductId !== (root.dataset.garmentId || '')) {\n        return false;\n      }\n\n      if (!memory.resultExpiresAt || memory.resultExpiresAt <= Date.now()) {\n        clearActiveSessionMemory();\n        return false;\n      }\n\n      state.sessionId = memory.activeSessionId;\n      state.sourceRetentionMode = memory.sourceRetentionMode || getSelectedRetentionMode();\n      state.sourceExpiresAt = memory.sourceExpiresAt || 0;\n      state.resultExpiresAt = memory.resultExpiresAt || 0;\n      state.sourceDeletedAt = memory.sourceDeletedAt || null;\n\n      if (memory.activeStatus === 'completed' && memory.resultUrl) {\n        showStep(resultWrap, [consentStep, uploadZone, statusWrap, resultWrap]);\n        updateDots(3);\n        resultImage.onload = function () {\n          resultImage.style.display = 'block';\n          setResultActions(buildSuccessResultActions());\n        };\n        resultImage.src = memory.resultUrl;\n        setResultCopy(\n          txt('ui.resultReadyTitle', 'Your preview is ready'),\n          buildRecoveredResultNote()\n        );\n        setResultPolicy(buildUsagePolicyLabel(state.usageSummary));\n        return true;\n      }\n\n      showStep(statusWrap, [consentStep, uploadZone, statusWrap, resultWrap]);\n      updateDots(2);\n      updateStatus(memory.activeStatus || 'pending', txt('ui.continuingPreview', 'Continuing your preview\u2026'));\n      startWaitingRoom('');\n      state.isBusy = true;\n      state.terminalSessionHandled = false;\n      startLiveStatusChannel();\n      startPolling();\n      return true;\n    }\n\n    function updateReusablePhotoUI() {\n      if (!reuseWrap || !reuseNote) return;\n\n      var memory = readTryOnMemory();\n      if (memory && memory.shopperId && memory.shopperId !== getShopperId(root)) {\n        reuseWrap.hidden = true;\n        reuseWrap.classList.remove('is-visible');\n        return;\n      }\n      var sameProduct = memory && memory.activeProductId === (root.dataset.garmentId || '');\n      var reusableValid = memory\n        && memory.reusableSourceSessionId\n        && memory.sourceExpiresAt\n        && memory.sourceExpiresAt > Date.now()\n        && !memory.sourceDeletedAt\n        && memory.dismissedReusableSourceSessionId !== memory.reusableSourceSessionId;\n\n      if (!reusableValid || sameProduct) {\n        reuseWrap.hidden = true;\n        reuseWrap.classList.remove('is-visible');\n        return;\n      }\n\n      reuseWrap.hidden = false;\n      reuseWrap.classList.add('is-visible');\n      reuseNote.textContent = txt(\n        'ui.recentPhotoAvailable',\n        'Use your recent photo for this product without uploading again. Available for {{ time }}.',\n        { time: formatRemainingTime(memory.sourceExpiresAt - Date.now()) }\n      );\n    }\n\n    function buildSessionMemoryPatch(status, extra) {\n      extra = extra || {};\n      var reusableSourceSessionId = null;\n      if (state.sourceRetentionMode === 'keep_for_20_minutes' && !state.sourceDeletedAt && state.sourceExpiresAt > Date.now()) {\n        reusableSourceSessionId = state.sessionId;\n      } else if (status === 'failed' && canReuseCurrentSessionSource()) {\n        reusableSourceSessionId = state.sessionId;\n      }\n\n      return {\n        activeSessionId: state.sessionId,\n        activeProductId: root.dataset.garmentId || '',\n        activeVariantId: root.dataset.variantId || '',\n        shopperId: getShopperId(root),\n        activeStatus: status,\n        sourceRetentionMode: state.sourceRetentionMode,\n        sourceExpiresAt: state.sourceExpiresAt,\n        resultExpiresAt: state.resultExpiresAt,\n        sourceDeletedAt: state.sourceDeletedAt,\n        keepSourceOptIn: keepPhotoToggle ? keepPhotoToggle.checked : false,\n        reusableSourceSessionId: reusableSourceSessionId,\n        dismissedReusableSourceSessionId: reusableSourceSessionId ? null : undefined,\n        resultUrl: extra.resultUrl || null,\n      };\n    }\n\n    function readTryOnMemory() {\n      var raw = readSessionStorage(tryOnSessionStorageKey(getShopperId(root), state.apiBase));\n      return raw ? parseJson(raw) : null;\n    }\n\n    function persistSessionMemory(patch) {\n      var current = readTryOnMemory() || {};\n      writeSessionStorage(\n        tryOnSessionStorageKey(getShopperId(root), state.apiBase),\n        JSON.stringify(mergeDefined(current, patch))\n      );\n    }\n\n    function clearActiveSessionMemory() {\n      var current = readTryOnMemory();\n      if (!current) return;\n\n      var next = {\n        keepSourceOptIn: current.keepSourceOptIn,\n        reusableSourceSessionId: current.reusableSourceSessionId,\n        sourceExpiresAt: current.sourceExpiresAt,\n        sourceDeletedAt: current.sourceDeletedAt,\n        sourceRetentionMode: current.sourceRetentionMode,\n        dismissedReusableSourceSessionId: current.dismissedReusableSourceSessionId,\n      };\n      writeSessionStorage(tryOnSessionStorageKey(getShopperId(root), state.apiBase), JSON.stringify(next));\n    }\n\n    function handleTryOnBoundaryError(err) {\n      var payload = err && err.payload ? err.payload : null;\n      if (!payload || !payload.code) return false;\n\n      if (payload.code === 'LOGIN_REQUIRED') {\n        showLoginRequiredState(payload);\n        return true;\n      }\n\n      if (payload.code === 'ACCOUNT_USAGE_LIMIT') {\n        showAccountLimitState(payload);\n        return true;\n      }\n\n      if (payload.code === 'CONSENT_REQUIRED' || payload.code === 'GUARDIAN_REQUIRED') {\n        state.guardianConfirmed = false;\n        if (confirmBox) confirmBox.checked = false;\n        syncConfirmGate();\n        state.isBusy = false;\n        showStep(consentStep, [consentStep, uploadZone, statusWrap, resultWrap]);\n        updateDots(0);\n        focusFirstInteractive(consentStep);\n        return true;\n      }\n\n      return false;\n    }\n\n    function showLoginRequiredState(payload) {\n      showStep(resultWrap, [consentStep, uploadZone, statusWrap, resultWrap]);\n      updateDots(3);\n      setResultSkeletonVisible(false);\n      if (resultImage) {\n        resultImage.style.display = 'none';\n        resultImage.removeAttribute('src');\n      }\n      if (loginBtn) {\n        loginBtn.href = root.dataset.loginUrl || loginBtn.getAttribute('href') || '/account/login';\n        loginBtn.textContent = txt('ui.loginRequiredCta', 'Continue securely');\n      }\n      setResultActions({ showRetry: false, showSave: false, showLogin: true });\n      setResultPolicy(buildUsagePolicyLabel(payload && payload.usage));\n      setResultCopy(\n        txt('ui.loginRequiredTitle', 'Continue with your account'),\n        buildLoginRequiredNote(payload)\n      );\n      clearActiveSessionMemory();\n      updateReusablePhotoUI();\n    }\n\n    function showAccountLimitState(payload) {\n      showStep(resultWrap, [consentStep, uploadZone, statusWrap, resultWrap]);\n      updateDots(3);\n      setResultSkeletonVisible(false);\n      if (resultImage) {\n        resultImage.style.display = 'none';\n        resultImage.removeAttribute('src');\n      }\n      setResultActions({ showRetry: false, showSave: false, showLogin: false });\n      setResultPolicy(buildUsagePolicyLabel(payload && payload.usage));\n      setResultCopy(\n        buildAccountLimitTitle(payload),\n        buildAccountLimitNote(payload)\n      );\n      clearActiveSessionMemory();\n      updateReusablePhotoUI();\n    }\n\n    function showStockBlockedState() {\n      var message = txt('ui.stockBlockedNote', 'Try-on is unavailable right now because this item is currently unavailable.');\n      setLaunchBlocked(true, message, 'danger');\n      showStep(resultWrap, [consentStep, uploadZone, statusWrap, resultWrap]);\n      updateDots(3);\n      if (resultImage) {\n        resultImage.style.display = 'none';\n        resultImage.removeAttribute('src');\n      }\n      setResultActions({ showRetry: false, showSave: false, showLogin: false });\n      setResultCopy(txt('ui.errorTitle', 'We could not create your preview'), message);\n      clearActiveSessionMemory();\n      updateReusablePhotoUI();\n    }\n\n    function selectedVariantSku() {\n      var variantId = root.dataset.variantId || getSelectedVariantId(root) || '';\n      var sku = state.inventory.variantIdToSku[variantId];\n      if (!sku && state.variantData[variantId]) {\n        sku = state.variantData[variantId].sku || '';\n      }\n      return sku || '';\n    }\n\n    var TRYON_TRANSIENT_REASONS = {\n      search_transient_failure: true,\n      transient_error: true,\n      parse_error: true,\n      lookup_failed: true,\n      family_refresh_failed: true,\n      nuxt_variant_payload_not_found: true,\n    };\n\n    function isTransientTryonReason(reason) {\n      return TRYON_TRANSIENT_REASONS[String(reason || '')] === true;\n    }\n\n    function getShopifyVariantAvailability() {\n      var selectedId = getSelectedVariantId(root) || root.dataset.variantId || '';\n      var anyAvailable = false;\n      var selectedAvailable = false;\n      Object.keys(state.variantData || {}).forEach(function (variantId) {\n        var row = state.variantData[variantId];\n        if (!row) return;\n        if (row.available === true || row.available === 'true') anyAvailable = true;\n        if (String(variantId) === String(selectedId) && (row.available === true || row.available === 'true')) {\n          selectedAvailable = true;\n        }\n      });\n      return { anyAvailable: anyAvailable, selectedAvailable: selectedAvailable };\n    }\n\n    function summaryLooksTransientOnly(summary) {\n      if (!summary || !summary.allOutOfStock) return false;\n      if (summary.transientOnlyUnavailable === true) return true;\n      var rows = Array.isArray(summary.results) ? summary.results : [];\n      if (!rows.length) return false;\n      return rows.every(function (row) {\n        if (!row || row.eligible === false || row.available === true) return false;\n        return row.available == null || isTransientTryonReason(row.reason);\n      });\n    }\n\n    function ingestLiveInventoryDetail(detail) {\n      if (!detail || !detail.sku) return;\n      if (detail.sectionId && root.dataset.sectionId && detail.sectionId !== root.dataset.sectionId) return;\n      state.inventory.liveBySku[detail.sku] = detail;\n    }\n\n    function mergeSummaryIntoLiveBySku(summary) {\n      if (!summary || !Array.isArray(summary.results)) return;\n      summary.results.forEach(function (row) {\n        if (!row || !row.sku) return;\n        var authoritative = row.available !== null && !isTransientTryonReason(row.reason);\n        var existing = state.inventory.liveBySku[row.sku];\n        if (existing && existing.authoritative && existing.at > Date.now() - 15000) return;\n        state.inventory.liveBySku[row.sku] = {\n          sku: row.sku,\n          available: row.available === true,\n          quantity: row.maxMatchedStock == null ? 0 : (row.maxMatchedStock | 0),\n          authoritative: authoritative,\n          at: Date.now()\n        };\n      });\n    }\n\n    function getLiveStockSnapshot() {\n      var selectedSku = selectedVariantSku();\n      var selectedLive = selectedSku ? state.inventory.liveBySku[selectedSku] : null;\n      var anyLiveAvailable = false;\n      var anyAuthoritativeOos = false;\n      Object.keys(state.inventory.liveBySku).forEach(function (sku) {\n        var row = state.inventory.liveBySku[sku];\n        if (!row) return;\n        if (row.available) anyLiveAvailable = true;\n        if (row.authoritative && !row.available) anyAuthoritativeOos = true;\n      });\n      return {\n        selectedSku: selectedSku,\n        selectedLive: selectedLive,\n        anyLiveAvailable: anyLiveAvailable,\n        anyAuthoritativeOos: anyAuthoritativeOos\n      };\n    }\n\n    function applyInventoryGateState() {\n      var summary = state.inventory.summary;\n      var shopifyStock = getShopifyVariantAvailability();\n      var live = getLiveStockSnapshot();\n      var selectedLive = live.selectedLive;\n      var liveFresh = selectedLive && selectedLive.at > Date.now() - 60000;\n\n      if (liveFresh && selectedLive.authoritative) {\n        if (selectedLive.available) {\n          setLaunchBlocked(false, '', '');\n          return;\n        }\n        if (live.anyLiveAvailable) {\n          setLaunchBlocked(false, '', '');\n          setLaunchNote(\n            txt('ui.stockTryonPreviewNote', 'This size is sold out. You can still preview the look, or switch to an in-stock color or size.'),\n            'warning'\n          );\n          return;\n        }\n        setLaunchBlocked(true, txt('ui.stockBlockedNote', 'Try-on is unavailable because this style is sold out.'), 'danger');\n        return;\n      }\n\n      if (liveFresh && !selectedLive.authoritative && shopifyStock.anyAvailable) {\n        setLaunchBlocked(false, '', '');\n        setLaunchNote('', '');\n        return;\n      }\n\n      if (!summary) {\n        if (shopifyStock.anyAvailable) {\n          setLaunchBlocked(false, '', '');\n          if (!shopifyStock.selectedAvailable) {\n            setLaunchNote(\n              txt('ui.stockTryonPreviewNote', 'This size is sold out. You can still preview the look, or switch to an in-stock color or size.'),\n              'warning'\n            );\n          }\n        } else {\n          setLaunchBlocked(true, txt('ui.stockBlockedNote', 'Try-on is unavailable because this style is sold out.'), 'danger');\n        }\n        return;\n      }\n\n      if (summary.shouldDisableTryOn && summaryLooksTransientOnly(summary) && shopifyStock.anyAvailable) {\n        setLaunchBlocked(false, '', '');\n        if (!shopifyStock.selectedAvailable) {\n          setLaunchNote(\n            txt('ui.stockTryonPreviewNote', 'This size is sold out. You can still preview the look, or switch to an in-stock color or size.'),\n            'warning'\n          );\n        }\n        return;\n      }\n\n      if (summary.shouldDisableTryOn) {\n        setLaunchBlocked(true, txt('ui.stockBlockedNote', 'Try-on is unavailable because this style is sold out.'), 'danger');\n        return;\n      }\n\n      var selected = findInventoryResult(summary, live.selectedSku);\n      setLaunchBlocked(false, '', '');\n\n      if (selected && selected.available === false && (summary.anyAvailable || live.anyLiveAvailable)) {\n        setLaunchNote(\n          txt('ui.stockTryonPreviewNote', 'This size is sold out. You can still preview the look, or switch to an in-stock color or size.'),\n          'warning'\n        );\n      }\n    }\n\n    document.addEventListener('vonili:stock-update', function (event) {\n      if (!event || !event.detail) return;\n      ingestLiveInventoryDetail(event.detail);\n      applyInventoryGateState();\n    });\n\n    if (window.__voniliStockBySku) {\n      Object.keys(window.__voniliStockBySku).forEach(function (sku) {\n        ingestLiveInventoryDetail(window.__voniliStockBySku[sku]);\n      });\n    }\n\n    function refreshInventoryGate(force) {\n      var skus = dedupeStrings(Object.keys(state.inventory.variantIdToSku || {}).map(function (variantId) {\n        return state.inventory.variantIdToSku[variantId];\n      }).filter(Boolean));\n\n      if (!state.inventory.apiBase || !skus.length) return;\n      if (state.inventory.loading) return;\n      if (state.inventory.summary && !force) {\n        applyInventoryGateState();\n        return;\n      }\n\n      state.inventory.loading = true;\n      requestJson(joinUrl(state.inventory.apiBase, '/storefront/tryon-availability'), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({\n          skus: skus,\n          selectedSku: selectedVariantSku(),\n          qty: 1\n        }),\n      }).then(function (summary) {\n        state.inventory.summary = summary || null;\n        mergeSummaryIntoLiveBySku(summary);\n      }).catch(function () {\n        state.inventory.summary = null;\n        setLaunchBlocked(false, '', '');\n      }).finally(function () {\n        state.inventory.loading = false;\n        applyInventoryGateState();\n      });\n    }\n\n    root.dataset.tryonReady = 'true';\n    enablePanelInteraction(root);\n    if (root.dataset.tryonPendingOpen === 'true') {\n      root.dataset.tryonPendingOpen = 'false';\n      openTryOnPanelFromLaunch();\n    }\n    } catch (initErr) {\n      console.error('[Vonili TryOn] init failed', initErr);\n      if (launchNote) {\n        launchNote.hidden = false;\n        launchNote.textContent = txt('ui.loadFailed', 'Virtual fitting could not load. Please refresh and try again.');\n        launchNote.classList.add('is-danger');\n      }\n    }\n  }\n\n  function enablePanelInteraction(root) {\n    if (!root) return;\n    var boot = root.querySelector('[data-tryon-panel-boot]');\n    var consent = root.querySelector('[data-tryon-consent]');\n    if (boot) boot.hidden = true;\n    if (consent) {\n      var confirm = root.querySelector('[data-tryon-confirm]');\n      var ready = !confirm || confirm.checked;\n      consent.disabled = !ready;\n      consent.setAttribute('aria-disabled', ready ? 'false' : 'true');\n    }\n  }\n\n  function resolveStepKey(el) {\n    if (!el) return '';\n    if (el.dataset.tryonStep) return el.dataset.tryonStep;\n    if (el.hasAttribute('data-tryon-upload-zone')) return 'upload';\n    if (el.hasAttribute('data-tryon-status-wrap')) return 'status';\n    if (el.hasAttribute('data-tryon-result')) return 'result';\n    return '';\n  }\n\n  function showStep(active, all) {\n    all.forEach(function (el) {\n      if (el) {\n        el.classList.toggle('is-visible', el === active);\n        el.hidden = el !== active;\n        el.setAttribute('aria-hidden', el === active ? 'false' : 'true');\n      }\n    });\n\n    var panelEl =\n      (active && active.closest && active.closest('[data-tryon-panel]')) ||\n      document.querySelector('[data-tryon-panel].is-open, [data-tryon-panel].is-visible');\n\n    if (panelEl) {\n      if (active) {\n        panelEl.dataset.vtoActiveStep = resolveStepKey(active);\n      } else {\n        panelEl.removeAttribute('data-vto-active-step');\n      }\n    }\n  }\n\n  function syncVariant(root, state, syncOptions) {\n    syncOptions = syncOptions || {};\n    var variantId = syncOptions.preserveWidgetSelection && state.selectedVariantId\n      ? state.selectedVariantId\n      : getSelectedVariantId(root) || root.dataset.variantId || '';\n    setActiveVariant(root, state.variantData, variantId, {\n      syncForm: false,\n      source: 'external',\n      preserveGarmentSelection: !!syncOptions.preserveGarmentSelection,\n    }, state);\n    if (state && state.inventory) {\n      state.inventory.selectedSku = selectedVariantSkuFromState(state, variantId);\n    }\n    if (state && typeof state.onVariantChanged === 'function') {\n      state.onVariantChanged();\n    }\n  }\n\n  function focusFirstInteractive(container) {\n    if (!container) return;\n    var target = container.querySelector('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])');\n    if (target) target.focus();\n  }\n\n  function buildProductPreviewAlt(root, data) {\n    var base = root.dataset.productTitle || 'Product';\n    if (data && data.title && data.title !== 'Default Title') return base + ' in ' + data.title;\n    return base + ' preview';\n  }\n\n  function resolveTryOnUiScope(root) {\n    var launch = root.querySelector('[data-tryon-launch]');\n    var panelId = launch ? launch.getAttribute('aria-controls') : '';\n    return root.querySelector('[data-tryon-panel]') ||\n      (panelId ? document.getElementById(panelId) : null) ||\n      root;\n  }\n\n  function updateLookSelectionSummary(root, state, summaryEl) {\n    var uiScope = resolveTryOnUiScope(root);\n    var summary = summaryEl || uiScope.querySelector('[data-tryon-look-summary]');\n    if (!summary) return;\n    var color = uiScope.querySelector('[data-tryon-variant-selected-label]');\n    var colorLabel = color && color.textContent ? color.textContent.trim() : '';\n    var viewLabel = state && state.activeGarmentSelection && state.activeGarmentSelection.label\n      ? state.activeGarmentSelection.label\n      : getTryOnText(root, 'ui.usingBestView', 'Best view selected');\n    summary.textContent = [colorLabel, viewLabel].filter(Boolean).join(' \u00B7 ');\n  }\n\n  function parseGarmentOptions(buttons) {\n    return (buttons || []).map(function (button) {\n      return {\n        id: String(button.getAttribute('data-image-id') || ''),\n        image: button.getAttribute('data-image-url') || '',\n        thumb: button.getAttribute('data-thumb-url') || '',\n        label: button.getAttribute('data-label') || 'Selected view',\n        alt: button.getAttribute('data-alt') || '',\n        isRecommended: button.getAttribute('data-recommended') === 'true',\n        isBackLike: button.getAttribute('data-back-like') === 'true',\n        isDetailLike: button.getAttribute('data-detail-like') === 'true',\n        isFrontLike: button.getAttribute('data-front-like') === 'true',\n        qualityTier: button.getAttribute('data-quality-tier') || 'standard',\n        qualityScore: parseInt(button.getAttribute('data-quality-score') || '50', 10),\n        qualityFlags: (button.getAttribute('data-quality-flags') || '').split(',').filter(Boolean),\n      };\n    });\n  }\n\n  function findGarmentOptionById(options, imageId) {\n    var wanted = String(imageId || '');\n    if (!wanted) return null;\n    return (options || []).find(function (option) {\n      return option.id === wanted;\n    }) || null;\n  }\n\n  function garmentSelectionStorageKey(root, variantId) {\n    return [\n      'vonili-tryon-garment-choice',\n      'v2',\n      root.dataset.apiBase || '',\n      root.dataset.garmentId || '',\n      variantId || '',\n    ].join(':');\n  }\n\n  function readStoredGarmentSelection(root, variantId, options) {\n    var stored = readSessionStorage(garmentSelectionStorageKey(root, variantId));\n    return findGarmentOptionById(options, stored);\n  }\n\n  function writeStoredGarmentSelection(root, variantId, imageId) {\n    var key = garmentSelectionStorageKey(root, variantId);\n    if (imageId) {\n      writeSessionStorage(key, String(imageId));\n      return;\n    }\n    try {\n      sessionStorage.removeItem(key);\n    } catch (err) {\n      // Ignore storage cleanup issues in restrictive browsing contexts.\n    }\n  }\n\n  function buildFallbackGarmentSelection(root, data) {\n    if (!data || !data.image) return null;\n    var score = parseInt(data.qualityScore || root.dataset.garmentQualityScore || '50', 10);\n    return {\n      id: String(data.imageId || ''),\n      image: data.image,\n      thumb: data.thumb || data.image,\n      label: getTryOnText(root, 'ui.selectedView', 'Selected view'),\n      alt: '',\n      isRecommended: true,\n      isBackLike: false,\n      isDetailLike: false,\n      qualityTier: data.qualityTier || root.dataset.garmentQualityTier || 'standard',\n      qualityScore: Number.isFinite(score) ? score : 50,\n      qualityFlags: (data.qualityFlags || root.dataset.garmentQualityFlags || '').split(',').filter(Boolean),\n    };\n  }\n\n  function garmentTierRank(tier) {\n    if (tier === 'premium') return 3;\n    if (tier === 'standard') return 2;\n    if (tier === 'blocked') return 0;\n    return 1;\n  }\n\n  function isBlockedGarmentSelection(selection) {\n    return false;\n  }\n\n  function normalizeGarmentSelectionForTryOn(selection) {\n    if (!selection) return selection;\n    var normalized = {\n      id: selection.id,\n      image: selection.image,\n      thumb: selection.thumb,\n      label: selection.label,\n      alt: selection.alt,\n      isRecommended: selection.isRecommended,\n      isBackLike: selection.isBackLike,\n      isDetailLike: selection.isDetailLike,\n      isFrontLike: selection.isFrontLike,\n      qualityTier: selection.qualityTier || 'standard',\n      qualityScore: Number.isFinite(selection.qualityScore) ? selection.qualityScore : 50,\n      qualityFlags: (selection.qualityFlags || []).slice(),\n    };\n    if (normalized.qualityTier === 'blocked') normalized.qualityTier = 'standard';\n    normalized.qualityScore = Math.max(30, Math.min(100, normalized.qualityScore));\n    return normalized;\n  }\n\n  function buildGarmentQualityHint(root, selection) {\n    var flags = selection.qualityFlags || [];\n    if (selection.isBackLike || flags.indexOf('back') > -1) {\n      return getTryOnText(root, 'ui.hintBackView', 'Back view selected. We will generate your preview from this angle.');\n    }\n    if (selection.isDetailLike || flags.indexOf('detail') > -1) {\n      return getTryOnText(root, 'ui.hintDetailView', 'Detail view selected. Close-up product shots may look less natural on body.');\n    }\n    if (selection.qualityTier === 'premium') {\n      return getTryOnText(root, 'ui.hintSwitchView', 'Clean product view selected for try-on.');\n    }\n    if (flags.indexOf('structure_risk') > -1) {\n      return getTryOnText(root, 'ui.hintStructure', 'We will try this view. Flat front photos usually look sharpest on structured items.');\n    }\n    if (flags.indexOf('side') > -1) {\n      return getTryOnText(root, 'ui.hintSideView', 'Side view selected. Front views usually show fit more clearly.');\n    }\n    return getTryOnText(root, 'ui.hintAnyView', 'Any product photo works. Switch views any time before generating.');\n  }\n\n  function getDefaultGarmentSelection(root, state, data) {\n    var matched = findGarmentOptionById(state.garmentOptions, data && data.imageId);\n    var recommended = (state.garmentOptions || []).filter(function (option) {\n      return option.isRecommended;\n    }).sort(function (a, b) {\n      return (garmentTierRank(b.qualityTier) - garmentTierRank(a.qualityTier)) || ((b.qualityScore || 0) - (a.qualityScore || 0));\n    })[0] || null;\n\n    if (matched) return matched;\n    if (recommended) return recommended;\n    return buildFallbackGarmentSelection(root, data) || state.garmentOptions[0] || null;\n  }\n\n  function applyGarmentSelection(root, state, selection, options) {\n    options = options || {};\n    if (!selection) return;\n\n    selection = normalizeGarmentSelectionForTryOn(selection);\n    var uiScope = resolveTryOnUiScope(root);\n    state.activeGarmentSelection = selection;\n    root.dataset.garmentImageUrl = selection.image || root.dataset.garmentImageUrl || '';\n    root.dataset.garmentQualityTier = selection.qualityTier || 'standard';\n    root.dataset.garmentQualityScore = String(Number.isFinite(selection.qualityScore) ? selection.qualityScore : 50);\n    root.dataset.garmentQualityFlags = (selection.qualityFlags || []).join(',');\n\n    var thumb = uiScope.querySelector('[data-tryon-selected-image]');\n    if (thumb && selection.thumb) {\n      thumb.src = selection.thumb;\n      thumb.alt = selection.alt || buildProductPreviewAlt(root, { title: selection.label });\n    }\n\n    var labelEl = options.garmentLabelEl || uiScope.querySelector('[data-tryon-garment-label]');\n    var hintEl = options.garmentHintEl || uiScope.querySelector('[data-tryon-garment-hint]');\n    if (labelEl) {\n      labelEl.textContent = selection.label === getTryOnText(root, 'ui.selectedView', 'Selected view')\n        ? getTryOnText(root, 'ui.usingSelectedView', 'Using the selected view for try-on')\n        : getTryOnText(root, 'ui.usingNamedView', 'Using {{ label }} for try-on', { label: selection.label.toLowerCase() });\n    }\n    if (hintEl) {\n      hintEl.textContent = buildGarmentQualityHint(root, selection);\n    }\n    updateLookSelectionSummary(root, state);\n\n    Array.prototype.slice.call(uiScope.querySelectorAll('[data-tryon-garment-option]')).forEach(function (button) {\n      var isActive = button.getAttribute('data-image-id') === selection.id;\n      button.classList.toggle('is-active', isActive);\n      button.setAttribute('aria-pressed', isActive ? 'true' : 'false');\n    });\n\n    if (options.persist) {\n      writeStoredGarmentSelection(root, root.dataset.variantId || '', selection.id);\n    }\n  }\n\n  function applyStoredOrDefaultGarmentSelection(root, state, data, variantId, options) {\n    options = options || {};\n    var selection = null;\n    if (options.preserveActive && state.activeGarmentSelection && state.activeGarmentSelection.id) {\n      selection = findGarmentOptionById(state.garmentOptions, state.activeGarmentSelection.id);\n    }\n    if (!selection) {\n      selection = readStoredGarmentSelection(root, variantId, state.garmentOptions);\n    }\n    if (!selection) {\n      selection = getDefaultGarmentSelection(root, state, data);\n    }\n    if (!selection && state.activeGarmentSelection && state.activeGarmentSelection.id) {\n      selection = findGarmentOptionById(state.garmentOptions, state.activeGarmentSelection.id);\n    }\n    applyGarmentSelection(root, state, selection, { persist: false });\n  }\n\n  function findProductForm(root) {\n    var explicitId = root.dataset.productFormId || '';\n    if (explicitId) {\n      var explicitForm = document.getElementById(explicitId);\n      if (explicitForm && explicitForm.tagName === 'FORM') return explicitForm;\n    }\n\n    var section = root.closest('.shopify-section');\n    if (section) {\n      var scopedForm = section.querySelector('form[id^=\"product-form-\"], form[action*=\"/cart/add\"], form[data-product-form]');\n      if (scopedForm) return scopedForm;\n    }\n\n    var p = root.parentElement;\n    while (p) {\n      if (p.tagName === 'FORM' && ((p.id && p.id.indexOf('product') !== -1) || (p.getAttribute('action') && p.getAttribute('action').indexOf('cart') !== -1))) return p;\n      p = p.parentElement;\n    }\n\n    return document.querySelector('form[id^=\"product-form-\"], form[action*=\"/cart/add\"], form[data-product-form]');\n  }\n\n  function getSelectedVariantId(root) {\n    var form = findProductForm(root);\n    var scope = form || document;\n\n    var select = scope.querySelector('select[name=\"id\"]');\n    if (select && select.value) return select.value;\n\n    var checked = scope.querySelector('input[name=\"id\"]:checked');\n    if (checked && checked.value) return checked.value;\n\n    var hidden = scope.querySelector('input[name=\"id\"][type=\"hidden\"]');\n    if (hidden && hidden.value) return hidden.value;\n\n    if (root.dataset.variantId) return root.dataset.variantId;\n\n    var urlParams = new URLSearchParams(window.location.search);\n    var urlVar = urlParams.get('variant');\n    if (urlVar) return urlVar;\n\n    return '';\n  }\n\n  function setActiveVariant(root, variantData, variantId, options, state) {\n    options = options || {};\n    var data = variantData[variantId];\n    if (!data) return;\n\n    root.dataset.variantId = variantId;\n    if (state) state.selectedVariantId = variantId;\n\n    var uiScope = resolveTryOnUiScope(root);\n    var thumb = uiScope.querySelector('[data-tryon-selected-image]');\n    var title = uiScope.querySelector('[data-tryon-selected-title]');\n    var selectedLabel = uiScope.querySelector('[data-tryon-variant-selected-label]');\n    var variantButtons = uiScope.querySelectorAll('[data-tryon-variant-option]');\n\n    if (thumb && data.thumb) {\n      thumb.src = data.thumb;\n      thumb.alt = buildProductPreviewAlt(root, data);\n    }\n\n    if (title) {\n      var base = root.dataset.productTitle || '';\n      title.textContent = data.title && data.title !== 'Default Title' ? base + ' \u2014 ' + data.title : base;\n    }\n\n    if (selectedLabel) {\n      selectedLabel.textContent = data.color || data.title || 'Selected';\n    }\n\n    variantButtons.forEach(function (button) {\n      var isActive = button.getAttribute('data-variant-label') === (data.color || data.title || '');\n      button.classList.toggle('is-active', isActive);\n      button.setAttribute('aria-pressed', isActive ? 'true' : 'false');\n    });\n\n    if (options.syncForm) {\n      syncProductFormVariant(root, variantId);\n    }\n    if (state) {\n      applyStoredOrDefaultGarmentSelection(root, state, data, variantId, {\n        preserveActive: !!options.preserveGarmentSelection,\n      });\n      updateLookSelectionSummary(root, state);\n      if (state.inventory) {\n        state.inventory.selectedSku = selectedVariantSkuFromState(state, variantId);\n      }\n      if (typeof state.onVariantChanged === 'function') {\n        state.onVariantChanged();\n      }\n    } else if (thumb && data.thumb) {\n      thumb.src = data.thumb;\n      thumb.alt = buildProductPreviewAlt(root, data);\n      root.dataset.garmentImageUrl = data.image || root.dataset.garmentImageUrl || '';\n    }\n  }\n\n  function syncProductFormVariant(root, variantId) {\n    var form = findProductForm(root);\n    if (!form || !variantId) return;\n\n    var select = form.querySelector('select[name=\"id\"]');\n    if (select) {\n      select.value = variantId;\n      select.dispatchEvent(new Event('change', { bubbles: true }));\n      return;\n    }\n\n    var radio = form.querySelector('input[name=\"id\"][type=\"radio\"][value=\"' + variantId + '\"]');\n    if (radio) {\n      radio.checked = true;\n      radio.dispatchEvent(new Event('change', { bubbles: true }));\n      return;\n    }\n\n    var hidden = form.querySelector('input[name=\"id\"][type=\"hidden\"]');\n    if (hidden) {\n      hidden.value = variantId;\n      hidden.dispatchEvent(new Event('input', { bubbles: true }));\n      hidden.dispatchEvent(new Event('change', { bubbles: true }));\n    }\n  }\n\n  function findMatchingVariantId(variantData, currentVariantId, requestedLabel, colorIndex) {\n    var current = variantData[currentVariantId];\n    var entries = Object.entries(variantData);\n    var sameColor = entries.filter(function (entry) {\n      return (entry[1].color || entry[1].title) === requestedLabel;\n    });\n\n    if (!sameColor.length) return '';\n    if (!current || !Array.isArray(current.options) || colorIndex < 0) return sameColor[0][0];\n\n    var currentOptions = current.options.slice();\n    return sameColor.find(function (entry) {\n      var nextOptions = Array.isArray(entry[1].options) ? entry[1].options : [];\n      return nextOptions.every(function (value, index) {\n        if (index === colorIndex) return true;\n        return currentOptions[index] === value;\n      });\n    })?.[0] || sameColor[0][0];\n  }\n\n  function listenVariantChanges(root, state, cb) {\n    var syncTimer = null;\n\n    function scheduleSync() {\n      state.productForm = findProductForm(root);\n      window.clearTimeout(syncTimer);\n      syncTimer = window.setTimeout(cb, 50);\n    }\n\n    var form = state.productForm || findProductForm(root);\n    state.productForm = form;\n    if (form) {\n      form.addEventListener('change', scheduleSync);\n      form.addEventListener('input', scheduleSync);\n    }\n\n    document.addEventListener('variant:change', function (e) {\n      if (e.target && form && !form.contains(e.target) && e.target !== form) return;\n      if (e.detail && e.detail.variant && e.detail.variant.id) {\n        root.dataset.variantId = String(e.detail.variant.id);\n      }\n      scheduleSync();\n    });\n\n    window.addEventListener('popstate', scheduleSync);\n  }\n\n  function formatSize(bytes) {\n    if (bytes < 1024) return bytes + ' B';\n    if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n    return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\n  }\n\n  function requestJson(url, opts) {\n    opts = opts || {};\n    return fetch(url, opts).then(async function (res) {\n      if (!res.ok) {\n        var payload = await res.json().catch(function () { return {}; });\n        var error = new Error(payload.error || 'Request failed.');\n        error.payload = payload;\n        error.status = res.status;\n        throw error;\n      }\n      return res.json().catch(function () { return {}; });\n    });\n  }\n\n  function getClaimedCustomerId(root) {\n    var raw = root && root.dataset && root.dataset.customerId ? String(root.dataset.customerId).trim() : '';\n    return /^\\d+$/.test(raw) ? raw : '';\n  }\n\n  function getShopperId(root) {\n    if (root && root.__voniliTryOnIdentity && root.__voniliTryOnIdentity.customerId) {\n      return root.__voniliTryOnIdentity.customerId;\n    }\n    if (root.dataset.customerId) return root.dataset.customerId;\n    var key = 'vonili-tryon-shopper-id';\n    var existing = readStorage(key);\n    if (existing) return existing;\n    var bytes = new Uint8Array(8);\n    window.crypto.getRandomValues(bytes);\n    var id = 'guest-' + Array.from(bytes).map(function (b) { return b.toString(16).padStart(2, '0'); }).join('');\n    writeStorage(key, id);\n    return id;\n  }\n\n  function consentStorageKey(shopperId, apiBase) {\n    return 'vonili-tryon-consent:' + apiBase + ':' + shopperId;\n  }\n\n  function parseJson(s) {\n    try {\n      return JSON.parse(s);\n    } catch (_) {\n      return {};\n    }\n  }\n\n  function getTryOnCopy(root) {\n    if (!root) return {};\n    if (root.__voniliTryOnCopy) return root.__voniliTryOnCopy;\n    var node = root.querySelector('[data-tryon-copy-json]');\n    root.__voniliTryOnCopy = node ? parseJson(node.textContent || '{}') : {};\n    return root.__voniliTryOnCopy;\n  }\n\n  function readCopyValue(source, path) {\n    return String(path || '').split('.').reduce(function (value, key) {\n      if (!value || typeof value !== 'object') return undefined;\n      return value[key];\n    }, source);\n  }\n\n  function escapeRegExp(value) {\n    return String(value || '').replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n  }\n\n  function interpolateCopy(template, replacements) {\n    if (typeof template !== 'string' || !replacements) return template;\n    return Object.keys(replacements).reduce(function (result, key) {\n      var tokenKey = String(key || '');\n      var safeKey = escapeRegExp(tokenKey);\n      var tokenValue = String(replacements[key]);\n      return result\n        .replace(new RegExp('\\\\{\\\\{\\\\s*' + safeKey + '\\\\s*\\\\}\\\\}', 'gi'), tokenValue)\n        .replace(new RegExp('__' + escapeRegExp(tokenKey.toUpperCase()) + '__', 'g'), tokenValue);\n    }, template);\n  }\n\n  function getTryOnText(root, path, fallback, replacements) {\n    var value = readCopyValue(getTryOnCopy(root), path);\n    if (typeof value !== 'string' || !value) value = fallback;\n    return interpolateCopy(value, replacements);\n  }\n\n  function normalizeBaseUrl(url) {\n    return (url || '').replace(/\\/+$/, '');\n  }\n\n  function resolveInventoryConfig(root, variantData) {\n    var config = {};\n    var configEl = null;\n    var sectionId = root && root.dataset ? root.dataset.sectionId : '';\n    if (sectionId) {\n      configEl = document.getElementById('vonili-live-inventory-config-' + sectionId);\n    }\n    if (!configEl) {\n      var section = root ? root.closest('.shopify-section') : null;\n      if (section) {\n        configEl = section.querySelector('[id^=\"vonili-live-inventory-config-\"]');\n      }\n    }\n    if (configEl) {\n      config = parseJson(configEl.textContent || '{}');\n    }\n\n    var variantIdToSku = {};\n    if (config && Array.isArray(config.variants)) {\n      config.variants.forEach(function (variant) {\n        if (variant && variant.id && variant.sku) {\n          variantIdToSku[String(variant.id)] = String(variant.sku);\n        }\n      });\n    }\n\n    if (!Object.keys(variantIdToSku).length) {\n      Object.keys(variantData || {}).forEach(function (variantId) {\n        if (variantData[variantId] && variantData[variantId].sku) {\n          variantIdToSku[String(variantId)] = String(variantData[variantId].sku);\n        }\n      });\n    }\n\n    return {\n      apiBase: normalizeBaseUrl(config.apiBase || ''),\n      variantIdToSku: variantIdToSku\n    };\n  }\n\n  function findInventoryResult(summary, sku) {\n    if (!summary || !Array.isArray(summary.results) || !sku) return null;\n    return summary.results.find(function (entry) {\n      return entry && entry.sku === sku;\n    }) || null;\n  }\n\n  function selectedVariantSkuFromState(state, variantId) {\n    if (!state || !variantId) return '';\n    var sku = state.inventory && state.inventory.variantIdToSku\n      ? state.inventory.variantIdToSku[variantId]\n      : '';\n    if (!sku && state.variantData && state.variantData[variantId]) {\n      sku = state.variantData[variantId].sku || '';\n    }\n    return sku || '';\n  }\n\n  function detectProductCategory(root) {\n    var override = (root.dataset.productCategoryOverride || '').toLowerCase();\n    if (override) {\n      if (['clothing', 'eyewear', 'bag', 'shoe', 'jewelry', 'watch', 'hat', 'accessory', 'generic'].indexOf(override) > -1) {\n        return override;\n      }\n    }\n\n    var type = (root.dataset.productType || '').toLowerCase();\n    if (matches(type, ['clothing accessories', 'jewelry', 'jewellery', 'shoes', 'handbags', 'luggage & bags', 'watches'])) return 'generic';\n    if (type.indexOf('clothing') > -1) return 'clothing';\n\n    var hay = [\n      root.dataset.productTitle || '',\n      root.dataset.productTags || '',\n    ].join(' ').toLowerCase();\n    if (matches(hay, ['sunglass', 'eyewear', 'glasses', 'optical'])) return 'eyewear';\n    if (matches(hay, ['bag', 'handbag', 'tote', 'backpack', 'purse', 'clutch', 'satchel'])) return 'bag';\n    if (matches(hay, ['shoe', 'sneaker', 'boot', 'heel', 'loafer', 'sandals'])) return 'shoe';\n    if (matches(hay, ['watch', 'timepiece'])) return 'watch';\n    if (matches(hay, ['jewelry', 'earring', 'necklace', 'bracelet', 'ring', 'pendant'])) return 'jewelry';\n    if (matches(hay, ['hat', 'cap', 'beanie', 'beret', 'visor'])) return 'hat';\n    if (matches(hay, ['belt', 'wallet', 'scarf', 'glove', 'sock', 'tie', 'accessory'])) return 'accessory';\n    if (matches(hay, ['dress', 'top', 'shirt', 'tee', 'blouse', 'hoodie', 'jacket', 'coat', 'pants', 'jean', 'skirt', 'shorts', 'sweater', 'jumpsuit', 'romper', 'abaya', 'kaftan'])) return 'clothing';\n    return 'generic';\n  }\n\n  function matches(haystack, keywords) {\n    return keywords.some(function (k) { return haystack.indexOf(k) > -1; });\n  }\n\n  function joinUrl(base, path) {\n    return normalizeBaseUrl(base) + path;\n  }\n\n  function trapFocusWithin(container, event) {\n    if (!container || !event) return;\n    var focusables = Array.prototype.slice.call(\n      container.querySelectorAll('button:not([disabled]), [href]:not([tabindex=\"-1\"]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])')\n    ).filter(function (node) {\n      return node.offsetParent !== null;\n    });\n\n    if (!focusables.length) return;\n\n    var first = focusables[0];\n    var last = focusables[focusables.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  function dedupeStrings(values) {\n    var out = [];\n    var seen = {};\n    (values || []).forEach(function (value) {\n      var key = String(value || '');\n      if (!key || seen[key]) return;\n      seen[key] = true;\n      out.push(key);\n    });\n    return out;\n  }\n\n  function readStorage(k) {\n    try { return localStorage.getItem(k); } catch (_) { return null; }\n  }\n\n  function writeStorage(k, v) {\n    try { localStorage.setItem(k, v); } catch (_) {}\n  }\n\n  function tryOnSessionStorageKey(shopperId, apiBase) {\n    return 'vonili-tryon-session:' + apiBase + ':' + shopperId;\n  }\n\n  function readSessionStorage(k) {\n    try { return sessionStorage.getItem(k); } catch (_) { return null; }\n  }\n\n  function writeSessionStorage(k, v) {\n    try { sessionStorage.setItem(k, v); } catch (_) {}\n  }\n\n  function mergeDefined(base, patch) {\n    var next = Object.assign({}, base);\n    Object.keys(patch || {}).forEach(function (key) {\n      if (patch[key] === undefined) return;\n      next[key] = patch[key];\n    });\n    return next;\n  }\n\n  function formatRemainingTime(ms) {\n    var safeMs = Math.max(0, ms);\n    var minutes = Math.ceil(safeMs / 60000);\n    if (minutes <= 1) return 'about 1 minute';\n    return minutes + ' minutes';\n  }\n\n  if (!document.querySelector('[data-vonili-tryon-lazy]')) {\n    if (document.readyState === 'loading') {\n      document.addEventListener('DOMContentLoaded', function () { initAll(); }, { once: true });\n    } else {\n      initAll();\n    }\n  }\n})();\n"],
  "mappings": "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",
  "names": ["setLaunchNote", "setLaunchBlocked", "setLaunchLoading", "isMobileSheet", "getPortalRoot", "mountMobileSheet", "setPanelOpen", "setBackdropVisible", "setBodyScrollLocked", "setGarmentChooserOpen", "setGarmentListExpanded", "revealActiveGarmentInRail", "updateDots", "setResultSkeletonVisible", "setResultActions", "buildGarmentSessionQuality", "returnToGarmentChooser", "clearUploadError", "showUploadError", "returnToUploadStep", "stopPolling", "stopLiveStatusChannel", "hideStatus", "decodePhoto", "encodePhotoAsJpeg", "showUploadWarning", "formatPhotoMeta", "classifyFailure", "shouldAddPhotoFailureHint", "setResultCopy", "setResultPolicy", "buildDownloadFileName", "joinCopyParts", "canReuseCurrentSessionSource", "buildSourcePrivacyLine", "buildResultAvailabilityLine", "buildUsageTrustLine", "buildUsagePolicyLabel", "buildLoginRequiredNote", "buildAccountLimitTitle", "buildAccountLimitNote", "hasMultipleGarmentViews", "buildSuccessResultActions", "buildCompletedResultNote", "buildRecoveredResultNote", "buildFailedResultNote", "buildProcessingTrustLine", "clearSessionRuntimeState", "closePanel", "resetState", "openTryOnPanelFromLaunch", "restoreActiveSession", "updateReusablePhotoUI", "syncConfirmGate", "startPolling", "scheduleNextPoll", "getPollingDelayMs", "handleSessionUpdate", "showError", "startLiveStatusChannel", "syncSessionState", "handleCompletedSession", "handleFailedSession", "updateStatus", "persistSessionMemory", "buildSessionMemoryPatch", "clearActiveSessionMemory", "hasConsent", "setConsent", "hydrateRetentionPreference", "readTryOnMemory", "getSelectedRetentionMode", "handleTryOnBoundaryError", "showLoginRequiredState", "showAccountLimitState", "showStockBlockedState", "selectedVariantSku", "isTransientTryonReason", "getShopifyVariantAvailability", "summaryLooksTransientOnly", "ingestLiveInventoryDetail", "mergeSummaryIntoLiveBySku", "getLiveStockSnapshot", "applyInventoryGateState", "refreshInventoryGate"]
}
