{
  "version": 3,
  "sources": ["/cdn/shop/t/73/assets/hugfig-rebuild.js?hf=20260821-preview-2-1-merge"],
  "sourcesContent": ["(() => {\n  if (window.HugfigRebuildLoaded) return;\n  window.HugfigRebuildLoaded = true;\n\n  const DAY_MS = 24 * 60 * 60 * 1000;\n  const CLIENT_WAIT_MS = 15 * 60 * 1000;\n  const SUBMISSION_CONFIRM_WAIT_MS = 2 * 60 * 1000;\n  const PENDING_KEY = 'hf_rebuild_generation_pending_v2';\n  const EVENT_QUEUE_KEY = 'hf_rebuild_generation_events_v2';\n  const CLIENT_VERSION = 'rebuild-upload-confirmation-v13';\n  const HISTORY_KEY = 'hf_rebuild_preview_history_v1';\n  const CACHE_KEY = 'hf_rebuild_preview_cache_v1';\n  // One bounded photo per tab, only during the ten-minute upload registration.\n  // Storage denial/timeouts never block the normal upload path.\n  function pendingPhoto(operation, id, file) {\n    return new Promise(resolve => {\n      let db, tx, done = false;\n      const finish = value => { if (done) return; done = true; clearTimeout(timer); db?.close(); resolve(value); };\n      const timer = setTimeout(() => { try { tx?.abort(); } catch {} finish(null); }, 2000);\n      try {\n        const request = indexedDB.open('hugfig-upload-recovery-v1', 1);\n        request.onupgradeneeded = () => request.result.createObjectStore('photos');\n        request.onerror = () => finish(null);\n        request.onblocked = () => finish(null);\n        request.onsuccess = () => {\n          db = request.result; if (done) { db.close(); return; }\n          try {\n          tx = db.transaction('photos', 'readwrite');\n          const store = tx.objectStore('photos');\n          const cursor = store.openCursor();\n          cursor.onsuccess = () => { const item = cursor.result; if (!item) return;\n            if (item.value.expiresAt < Date.now()) item.delete(); item.continue(); };\n          let result = null;\n          if (operation === 'put') {\n            if (!file || file.size > 20 * 1024 * 1024) { finish(null); return; }\n            store.put({ file, expiresAt: Date.now() + 10 * 60 * 1000 }, id); result = true;\n            const keys = store.getAllKeys();\n            keys.onsuccess = () => { const others = keys.result.filter(key => key !== id);\n              for (const key of others.slice(0, Math.max(0, others.length - 2))) store.delete(key); };\n          } else if (operation === 'delete') store.delete(id);\n          else { const read = store.get(id); read.onsuccess = () => { if (read.result?.expiresAt > Date.now()) result = read.result.file; }; }\n          tx.oncomplete = () => finish(result); tx.onerror = tx.onabort = () => finish(null);\n          } catch { try { tx?.abort(); } catch {} finish(null); }\n        };\n      } catch { finish(null); }\n    });\n  }\n  const TYPE_DATA = {\n    person: { label: 'Person', legacy: '1 Person', generationClass: 'HUMAN_1', uploadTitle: 'Upload One Person Photo', instruction: 'Choose one clear photo of one person.' },\n    pet: { label: 'Pet', legacy: '1 Pet', generationClass: 'PET_1', uploadTitle: 'Upload One Pet Photo', instruction: 'Choose one clear photo of one pet.' },\n    person_pet: { label: 'Person + Pet', legacy: '1 Person + 1 Pet', generationClass: 'HUMAN_1_PET_1', uploadTitle: 'Upload One Person + Pet Photo', instruction: 'Choose one photo with one person and one pet together.' },\n    two_people: { label: 'Two People', legacy: '2 People (Together)', generationClass: 'HUMAN_2_TOGETHER', uploadTitle: 'Upload One Two-Person Photo', instruction: 'Choose one photo with both people together.' }\n  };\n  const FALLBACK = {\n    person: { chibi: [3895, 7595, 10900], realistic: [6395, 10095, 13400] },\n    pet: { chibi: [5900, 9900, 20900], realistic: [8400, 12400, 23400] },\n    person_pet: { chibi: [9900, 19900, 33900], realistic: [12400, 22400, 36400] },\n    two_people: { chibi: [8900, 13900, 19900], realistic: [11400, 16400, 22400] }\n  };\n  const FALLBACK_SIZES = ['6 cm', '8 cm', '10 cm'];\n  const imagePreloadCache = new Map();\n  let dialogScrollY = 0;\n  let dialogScrollLocked = false;\n\n  const parseJSON = (element, fallback) => {\n    try { return JSON.parse(element?.textContent || '') ?? fallback; } catch (_) { return fallback; }\n  };\n  const normalize = (value) => String(value || '').trim().toLowerCase().replace(/[()+]/g, ' ').replace(/\\s+/g, ' ');\n  const money = (cents, currency = '$') => `${currency}${(Number(cents || 0) / 100).toFixed(2)}`;\n  const displaySize = (value) => {\n    const label = String(value || '').split('=')[0].trim();\n    const match = label.match(/(\\d+(?:\\.\\d+)?)\\s*cm/i);\n    if (!match) return label;\n    const centimeters = Number(match[1]);\n    const centimeterLabel = Number.isInteger(centimeters) ? String(centimeters) : String(centimeters).replace(/\\.0+$/, '');\n    return `${(centimeters / 2.54).toFixed(1)} in (${centimeterLabel} cm)`;\n  };\n  const uuid = () => window.crypto?.randomUUID?.() || `hf_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n  const delay = (milliseconds) => new Promise((resolve) => window.setTimeout(resolve, milliseconds));\n  const safeURL = (value) => typeof value === 'string' && /^(https:|\\/\\/|blob:|data:image)/.test(value) ? value : '';\n  const durableAssetURL = (value) => typeof value === 'string' && /^https?:\\/\\//i.test(value.trim()) ? value.trim() : '';\n  const originalAssetURL = (data) => {\n    const candidates = [\n      data?.sourceUrls?.[0],\n      data?.sourceUrl,\n      data?.originalUrl,\n      data?.originalImageUrl,\n      data?.task?.sourceUrls?.[0],\n      data?.tasks?.[0]?.sourceUrls?.[0]\n    ];\n    return candidates.map(durableAssetURL).find(Boolean) || '';\n  };\n  // Browser-compatible copies are only for display. Orders retain the exact\n  // original upload even when the browser cannot decode its HEIC format.\n  const sourcePreviewAssetURL = (data) => [data?.sourcePreviewUrls?.[0], data?.task?.sourcePreviewUrls?.[0], data?.tasks?.[0]?.sourcePreviewUrls?.[0]]\n    .map(durableAssetURL).find(Boolean) || '';\n  const selected = (root, group) => root.querySelector(`[data-hf-option=\"${group}\"]:checked`)?.value || '';\n  const REBUILD_UI_VERSION = 'rebuild_configurator_v1';\n  const track = (name, data = {}) => {\n    const attribution = window.HugfigNewUiTracking?.getAttribution?.() || {};\n    return window.HugfigAnalytics?.track?.(name, {\n      ui_version: REBUILD_UI_VERSION,\n      ...attribution,\n      ...data\n    });\n  };\n\n  let activeReviewFlow = null;\n\n  function reviewEventEndpoint(flow) {\n    const endpoint = flow?.root?.dataset?.apiEndpoint;\n    if (!endpoint) return '';\n    try {\n      return new URL('/events', new URL(endpoint, window.location.href).origin).toString();\n    } catch {\n      return '';\n    }\n  }\n\n  const EVENT_FLAGS = { preview_seen: 'previewSeenRecorded', generation_failed: 'failureRecorded', wait_hidden: 'waitHiddenRecorded', wait_resumed: 'waitResumedRecorded' };\n  const eventDeliveries = new Map();\n  let pendingClientEvents = null;\n  const diagnosticText = (value, length = 400) => String(value || '').replace(/https?:\\/\\/[^\\s]+/gi, '[url]').replace(/(?:sk-|SEC)[a-z0-9_-]{12,}/gi, '[redacted]').replace(/\\bBearer\\s+[a-z0-9._~+/-]+=*/gi, 'Bearer [redacted]').replace(/(?:token|secret|authorization|password|api[_-]?key)\\s*[:=]\\s*[^\\s,;]+/gi, '[redacted]').slice(0, length);\n  function readSession(key, fallback) {\n    try { return JSON.parse(sessionStorage.getItem(key) || 'null') || fallback; } catch (_) { return fallback; }\n  }\n  function writeSession(key, value) {\n    try { if (value == null) sessionStorage.removeItem(key); else sessionStorage.setItem(key, JSON.stringify(value)); } catch (_) { /* Private browsing can disallow storage; the current page still works. */ }\n  }\n  function eventQueue() {\n    pendingClientEvents ||= readSession(EVENT_QUEUE_KEY, []);\n    pendingClientEvents = pendingClientEvents.filter((item) => item?.createdAt > Date.now() - DAY_MS).slice(-64);\n    return pendingClientEvents;\n  }\n  function updateQueuedEvent(item, remove = false) {\n    const queue = eventQueue().filter((entry) => entry.payload?.eventId !== item.payload.eventId);\n    if (!remove) queue.push(item);\n    pendingClientEvents = queue.slice(-64);\n    writeSession(EVENT_QUEUE_KEY, pendingClientEvents);\n  }\n  async function deliverGenerationEvent(item, flow, retry = 0) {\n    const eventId = item.payload.eventId;\n    if (eventDeliveries.has(eventId)) return eventDeliveries.get(eventId);\n    if (!eventQueue().some((entry) => entry.payload.eventId === eventId)) return true;\n    const delivery = (async () => {\n      const controller = new AbortController();\n      const timer = window.setTimeout(() => controller.abort(), 15000);\n      try {\n        const response = await fetch(item.endpoint, {\n          method: 'POST', headers: { 'Content-Type': 'text/plain;charset=UTF-8' },\n          body: JSON.stringify(item.payload), keepalive: true, credentials: 'omit', signal: controller.signal,\n        });\n        if (!response.ok) throw new Error(`Event delivery returned ${response.status}`);\n        updateQueuedEvent(item, true);\n        if (flow?.attemptId === item.payload.attemptId) {\n          flow.deliveredEvents?.add(eventId);\n          if (EVENT_FLAGS[item.payload.event]) flow[EVENT_FLAGS[item.payload.event]] = true;\n        }\n        return true;\n      } catch (_) {\n        if (retry < 4) window.setTimeout(() => deliverGenerationEvent(item, flow, retry + 1), Math.min(30000, 1000 * (2 ** retry)));\n        return false;\n      } finally {\n        window.clearTimeout(timer);\n        eventDeliveries.delete(eventId);\n      }\n    })();\n    eventDeliveries.set(eventId, delivery);\n    return delivery;\n  }\n  function flushGenerationEvents() {\n    const endpoint = reviewEventEndpoint(activeReviewFlow);\n    eventQueue().filter((item) => item.endpoint === endpoint).forEach((item) => deliverGenerationEvent(item, activeReviewFlow));\n  }\n  function recordGenerationClientEvent(flow, eventName, error) {\n    if (!flow) return false;\n    const endpoint = reviewEventEndpoint(flow);\n    if (!endpoint || !flow.attemptId || !flow.reviewGroupId) return false;\n    flow.clientEvents ||= new Map();\n    flow.deliveredEvents ||= new Set();\n    const phase = diagnosticText(error?.phase || flow.generationPhase || 'client', 40);\n    const displayEvent = eventName === 'preview_seen' || eventName === 'preview_load_slow' || phase === 'image_display';\n    const signature = `${eventName}:${eventName === 'generation_failed' ? `${phase}:${error?.code || error?.status || ''}` : ''}:${displayEvent ? flow.imageDisplayAttemptId || '' : ''}`;\n    let item = flow.clientEvents.get(signature);\n    if (!item) {\n      const traceId = diagnosticText(error?.transportDiagnostics || error?.phase === 'file_read'\n        ? error.traceId : error?.traceId || flow.traceId, 160);\n      const requestId = diagnosticText(error?.requestId, 80);\n      const diagnostics = error ? {\n        code: diagnosticText(error.code, 100), status: Number(error.status) || null,\n        name: diagnosticText(error.name, 60), phase,\n        taskId: diagnosticText(error.taskId || flow.activeTaskId, 160),\n        traceId, ...(requestId ? { requestId } : {}),\n        error: diagnosticText(error.message || 'Browser could not complete this step'),\n        ...(error.displayDiagnostics || {}),\n        ...(error.transportDiagnostics || {}),\n      } : undefined;\n      item = { endpoint, createdAt: Date.now(), payload: {\n        reviewGroupId: flow.reviewGroupId, attemptId: flow.attemptId, event: eventName,\n        eventId: uuid(), telemetryVersion: '2', clientVersion: CLIENT_VERSION,\n        elapsedMs: Math.max(0, Date.now() - (flow.reviewStartedAt || Date.now())),\n        taskId: diagnosticText(flow.activeTaskId, 160), traceId,\n        ...(requestId ? { requestId } : {}),\n        ...(diagnostics ? { diagnostics } : {}),\n      } };\n      // The events API accepts 4 KiB. Preserve both attempt identities and timings\n      // even when a browser supplies long multibyte exception messages.\n      if (diagnostics?.requestAttempts) {\n        for (const length of [160, 120, 80, 40]) {\n          if (new Blob([JSON.stringify(item.payload)]).size <= 4096) break;\n          diagnostics.error = diagnosticText(diagnostics.error, length);\n          diagnostics.requestAttempts.forEach((attempt) => { attempt.error = diagnosticText(attempt.error, length); });\n        }\n      }\n      flow.clientEvents.set(signature, item);\n      updateQueuedEvent(item);\n    }\n    if (!flow.deliveredEvents.has(item.payload.eventId)) deliverGenerationEvent(item, flow);\n    return true;\n  }\n\n  function recordPreviewSeen(flow) {\n    if (!flow || flow.previewSeenRecorded) return;\n    if (document.visibilityState !== 'visible') return;\n    recordGenerationClientEvent(flow, 'preview_seen');\n  }\n\n  document.addEventListener('visibilitychange', () => {\n    const flow = activeReviewFlow;\n    if (document.visibilityState === 'visible') { flushGenerationEvents(); flow?.resumeIfWaiting(); }\n    if (!flow || flow.generationFailed || flow.failureRecorded || flow.previewSeenRecorded) return;\n    if (document.visibilityState === 'hidden') {\n      flow.wasHidden = true;\n      recordGenerationClientEvent(flow, 'wait_hidden');\n    } else if (flow.wasHidden) {\n      recordGenerationClientEvent(flow, 'wait_resumed');\n      if (flow.previewRenderReady) recordPreviewSeen(flow);\n    }\n  });\n  window.addEventListener('online', () => { flushGenerationEvents(); activeReviewFlow?.resumeIfWaiting(); });\n  window.addEventListener('pagehide', () => {\n    const flow = activeReviewFlow;\n    if (!flow || flow.generationFailed || flow.failureRecorded || flow.previewSeenRecorded) return;\n    flow.wasHidden = true;\n    recordGenerationClientEvent(flow, 'wait_hidden');\n  });\n\n  function setSourceImage(image, value) {\n    if (!image) return;\n    const url = safeURL(value);\n    const card = image.closest('.hf-rb-result-card--source, .hf-rb-generation-pair__source');\n    if (url) {\n      image.src = url;\n      card?.style.setProperty('--hf-rb-source-image', `url(${JSON.stringify(url)})`);\n    } else {\n      image.removeAttribute('src');\n      card?.style.removeProperty('--hf-rb-source-image');\n    }\n  }\n\n  function optimizedImageURL(value, width = 900) {\n    if (!safeURL(value) || !/(cdn\\.shopify\\.com|\\/cdn\\/shop\\/)/i.test(value)) return value || '';\n    try {\n      const url = new URL(value, window.location.origin);\n      url.searchParams.set('width', String(width));\n      return url.href;\n    } catch (_) {\n      return value;\n    }\n  }\n\n  function preloadImage(url, priority = 'auto') {\n    if (!safeURL(url)) return Promise.resolve(false);\n    if (imagePreloadCache.has(url)) return imagePreloadCache.get(url);\n    const request = new Promise((resolve) => {\n      const image = new Image();\n      image.decoding = 'async';\n      image.fetchPriority = priority;\n      image.onload = () => resolve(true);\n      image.onerror = () => { imagePreloadCache.delete(url); resolve(false); };\n      image.src = url;\n    });\n    imagePreloadCache.set(url, request);\n    return request;\n  }\n  function fileDataURL(file) {\n    return new Promise((resolve) => {\n      const reader = new FileReader();\n      reader.onload = () => resolve(typeof reader.result === 'string' ? reader.result : '');\n      reader.onerror = () => resolve('');\n      reader.readAsDataURL(file);\n    });\n  }\n  async function historySource(file) {\n    try {\n      const bitmap = await createImageBitmap(file, { imageOrientation: 'from-image' });\n      const maxSide = 900;\n      const scale = Math.min(1, maxSide / Math.max(bitmap.width, bitmap.height));\n      const canvas = document.createElement('canvas');\n      canvas.width = Math.max(1, Math.round(bitmap.width * scale));\n      canvas.height = Math.max(1, Math.round(bitmap.height * scale));\n      canvas.getContext('2d')?.drawImage(bitmap, 0, 0, canvas.width, canvas.height);\n      bitmap.close?.();\n      return canvas.toDataURL('image/jpeg', 0.76);\n    } catch (_) {\n      return file.size <= 1024 * 1024 ? fileDataURL(file) : '';\n    }\n  }\n  function whenIdle(callback) {\n    if ('requestIdleCallback' in window) window.requestIdleCallback(callback, { timeout: 1800 });\n    else window.setTimeout(callback, 350);\n  }\n\n  function canBackgroundPrefetch() {\n    const connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection;\n    if (connection?.saveData) return false;\n    return !/^(slow-)?2g$/i.test(connection?.effectiveType || '');\n  }\n\n  function sameSelection(left = {}, right = {}) {\n    return ['product', 'type', 'style'].every((key) => left[key] === right[key]);\n  }\n\n  function selectionImageSources(configurator, selection) {\n    const product = configurator.products?.[selection.product] || null;\n    const variant = matchingVariants(product, { ...selection, size: selection.size || '6 cm' })[0];\n    return productImageSources(product, variant);\n  }\n\n  function likelySelectionImages(configurator, limit = 3) {\n    const current = configurator.selection;\n    const candidates = [\n      { ...current, style: current.style === 'chibi' ? 'realistic' : 'chibi' },\n      { ...current, product: current.product === 'keychain' ? 'figurine' : 'keychain' },\n      { ...current, type: current.type === 'person' ? 'pet' : 'person' }\n    ];\n    return [...new Set(candidates.map((selection) => selectionImageSources(configurator, selection).low).filter(safeURL))].slice(0, limit);\n  }\n\n  function readStore(key, fallback) {\n    try { return JSON.parse(localStorage.getItem(key) || '') || fallback; } catch (_) { return fallback; }\n  }\n  function writeStore(key, value) {\n    try { localStorage.setItem(key, JSON.stringify(value)); } catch (_) { /* Storage may be disabled. */ }\n  }\n  function freshHistory(limit = 5, days = 7) {\n    const threshold = Date.now() - days * DAY_MS;\n    return readStore(HISTORY_KEY, []).filter((item) => item?.createdAt > threshold && safeURL(item.resultUrl)).slice(0, limit);\n  }\n  function productImageSources(product, variant) {\n    const candidate = variant?.featured_image || product?.featured_image || product?.images?.[0] || null;\n    if (!candidate) return { low: '', high: '' };\n    if (typeof candidate === 'object') {\n      const source = candidate.src || candidate.high || candidate.low || '';\n      return {\n        low: safeURL(candidate.low) ? candidate.low : optimizedImageURL(source, 240),\n        high: safeURL(candidate.high) ? candidate.high : optimizedImageURL(source, 900)\n      };\n    }\n    return { low: optimizedImageURL(candidate, 240), high: optimizedImageURL(candidate, 900) };\n  }\n  function productImage(product, variant) {\n    const sources = productImageSources(product, variant);\n    return sources.high || sources.low;\n  }\n  function optionIndexes(product) {\n    const names = Array.isArray(product?.options) ? product.options.map((option) => normalize(option?.name || option)) : [];\n    const find = (word) => names.findIndex((name) => name.includes(word));\n    return {\n      type: Math.max(find('type'), find('figure')),\n      style: find('style'),\n      size: find('size')\n    };\n  }\n  function valueMatches(group, actual, desired) {\n    const value = normalize(actual);\n    if (group === 'type') {\n      if (desired === 'person') return /^(1|one)? ?person$/.test(value) || value === 'person';\n      if (desired === 'pet') return /^(1|one)? ?pet$/.test(value) || value === 'pet';\n      if (desired === 'person_pet') return value.includes('person') && value.includes('pet');\n      return (value.includes('2') || value.includes('two')) && (value.includes('people') || value.includes('person'));\n    }\n    if (group === 'style') return desired === 'realistic' ? (value.includes('real') || value.includes('detail')) : (value.includes('chibi') || value.includes('q'));\n    if (group === 'size') return normalize(desired).split(' ')[0] === value.split(' ')[0];\n    return false;\n  }\n  function matchingVariants(product, selection, ignoreSize = false) {\n    const variants = Array.isArray(product?.variants) ? product.variants : [];\n    const indexes = optionIndexes(product);\n    return variants.filter((variant) => {\n      const values = Array.isArray(variant.options) ? variant.options : [variant.option1, variant.option2, variant.option3].filter(Boolean);\n      const groupValue = (group) => indexes[group] >= 0 ? values[indexes[group]] : values.find((value) => valueMatches(group, value, selection[group]));\n      const typeOK = valueMatches('type', groupValue('type'), selection.type);\n      const styleOK = valueMatches('style', groupValue('style'), selection.style);\n      const sizeOK = ignoreSize || valueMatches('size', groupValue('size'), selection.size);\n      return typeOK && styleOK && sizeOK;\n    });\n  }\n  function fallbackVariant(selection) {\n    const sizeIndex = Math.max(0, FALLBACK_SIZES.findIndex((size) => valueMatches('size', size, selection.size)));\n    return { id: null, price: FALLBACK[selection.type]?.[selection.style]?.[sizeIndex] || 0, available: false, options: [TYPE_DATA[selection.type].legacy, selection.style, selection.size], draftFallback: true };\n  }\n\n  class RebuildConfigurator extends HTMLElement {\n    connectedCallback() {\n      if (this.initialized) return;\n      this.initialized = true;\n      this.page = this.closest('[data-hf-rebuild-home], [data-hf-custom-flow]');\n      this.products = parseJSON(this.page?.querySelector('[data-hf-products]'), {});\n      this.placeholderImages = parseJSON(this.page?.querySelector('[data-hf-placeholder-images]'), {});\n      this.allowPlaceholders = this.page?.dataset.allowPlaceholders === 'true';\n      this.context = this.dataset.context || 'home';\n      this.imagePriorityEnabled = true;\n      this.imageRequestId = 0;\n      this.previous = {};\n      this.addEventListener('change', (event) => {\n        const input = event.target.closest('[data-hf-option]');\n        if (!input) return;\n        const group = input.dataset.hfOption;\n        const value = input.value;\n        this.imagePriorityEnabled = true;\n        track('config_option_select', { option_group: group, option_value: value, previous_option_value: this.previous[group] || '', is_reselect: this.previous[group] === value });\n        this.previous[group] = value;\n        this.sync();\n        this.dispatchEvent(new CustomEvent('hf:selection-change', { bubbles: true, detail: { group, selection: this.selection } }));\n      });\n      this.applyDefaultSelection();\n      this.applyQuery();\n      this.applyPendingSnapshot();\n      this.sync();\n    }\n    applyDefaultSelection() {\n      const product = this.dataset.defaultProduct;\n      if (!product) return;\n      const input = this.querySelector(`[data-hf-option=\"product\"][value=\"${CSS.escape(product)}\"]`);\n      if (input) input.checked = true;\n    }\n    applyQuery() {\n      const params = new URLSearchParams(window.location.search);\n      ['product', 'type', 'style'].forEach((group) => {\n        const value = params.get(group);\n        const input = value ? this.querySelector(`[data-hf-option=\"${group}\"][value=\"${CSS.escape(value)}\"]`) : null;\n        if (input) input.checked = true;\n      });\n    }\n    get selection() {\n      return { product: selected(this, 'product') || 'keychain', type: selected(this, 'type') || 'person', style: selected(this, 'style') || 'chibi', size: this.currentSize || '6 cm' };\n    }\n    get product() { return this.products?.[this.selection.product] || null; }\n    get variant() { return matchingVariants(this.product, this.selection)[0] || fallbackVariant(this.selection); }\n    sizes() {\n      const indexes = optionIndexes(this.product);\n      const values = matchingVariants(this.product, this.selection, true).map((variant) => {\n        const options = Array.isArray(variant.options) ? variant.options : [];\n        return indexes.size >= 0 ? options[indexes.size] : options.find((value) => /cm|in/.test(normalize(value)));\n      }).filter(Boolean);\n      return [...new Set(values.length ? values : FALLBACK_SIZES)];\n    }\n    setSize(size) { this.currentSize = size; this.sync(); }\n    enableImagePriority() {\n      if (this.imagePriorityEnabled) return;\n      this.imagePriorityEnabled = true;\n      this.sync();\n    }\n    applyPendingSnapshot() {\n      if (this.context === 'home') return;\n      try {\n        const snapshot = JSON.parse(sessionStorage.getItem('hf_rebuild_pending_image') || 'null');\n        if (!snapshot || Date.now() - Number(snapshot.createdAt || 0) > 30 * 60 * 1000) return;\n        const lowURL = snapshot.lowURL || snapshot.imageURL || '';\n        if (!sameSelection(snapshot.selection, this.selection) || !safeURL(lowURL)) return;\n        this.page?.querySelectorAll('[data-hf-product-image]').forEach((element) => {\n          element.loading = 'eager';\n          element.fetchPriority = 'high';\n          element.src = lowURL;\n        });\n      } catch (_) { /* Storage may be disabled. */ }\n    }\n    applySelection(selection = {}) {\n      ['product', 'type', 'style'].forEach((group) => {\n        const value = selection[group];\n        const input = value ? this.querySelector(`[data-hf-option=\"${group}\"][value=\"${CSS.escape(value)}\"]`) : null;\n        if (input) input.checked = true;\n      });\n      this.currentSize = selection.size || this.currentSize || '6 cm';\n      this.sync();\n    }\n    sync() {\n      const selection = this.selection;\n      const variant = this.variant;\n      const productLabel = selection.product === 'keychain' ? 'Keychain' : 'Figurine';\n      const name = `${selection.style === 'chibi' ? 'Chibi' : 'Realistic'} ${TYPE_DATA[selection.type].label} ${productLabel}`;\n      const hasShopifyVariant = Boolean(variant?.id && !variant.draftFallback);\n      let imageSources = productImageSources(null, variant);\n      if (!imageSources.low && hasShopifyVariant) imageSources = productImageSources(this.product, null);\n      if (!imageSources.low && !this.product && this.allowPlaceholders) {\n        const placeholder = this.placeholderImages[selection.type] || '';\n        imageSources = { low: placeholder, high: placeholder };\n      }\n      this.page?.querySelectorAll('[data-hf-product-name]').forEach((element) => { element.textContent = name; });\n      this.page?.querySelectorAll('[data-hf-product-name]').forEach((element) => { element.title = name; });\n      this.page?.querySelectorAll('[data-hf-product-price], [data-hf-order-price]').forEach((element) => { element.textContent = money(variant.price); });\n      this.page?.querySelectorAll('[data-hf-product-size]').forEach((element) => { element.textContent = selection.size; });\n      this.syncProductImage(imageSources);\n      const status = this.querySelector('[data-hf-config-status]');\n      if (status) status.textContent = variant.draftFallback ? 'Draft product data is not available yet. Preview testing is still enabled.' : '';\n      this.dispatchEvent(new CustomEvent('hf:variant-change', { bubbles: true, detail: { selection, variant, product: this.product } }));\n    }\n    async syncProductImage(sources = {}) {\n      const requestId = ++this.imageRequestId;\n      const lowURL = safeURL(sources.low) ? sources.low : safeURL(sources.high) ? sources.high : '';\n      const highURL = safeURL(sources.high) ? sources.high : lowURL;\n      const surfaces = this.page?.querySelectorAll('[data-hf-product-card], [data-hf-selection-summary]') || [];\n      const images = this.page?.querySelectorAll('[data-hf-product-image]') || [];\n      surfaces.forEach((surface) => {\n        surface.classList.add('is-loading');\n        surface.classList.remove('is-unavailable');\n        surface.setAttribute('aria-busy', 'true');\n        const loading = surface.querySelector('[data-hf-product-loading]');\n        if (loading) loading.textContent = 'Loading\u2026';\n      });\n      images.forEach((element) => {\n        if (lowURL) {\n          element.loading = 'eager';\n          element.fetchPriority = this.imagePriorityEnabled ? 'high' : 'auto';\n          element.src = lowURL;\n        }\n        else element.removeAttribute('src');\n      });\n      const loaded = lowURL ? await preloadImage(lowURL, this.imagePriorityEnabled ? 'high' : 'auto') : false;\n      if (requestId !== this.imageRequestId) return;\n      let displayed = loaded;\n      if (!loaded && highURL !== lowURL) {\n        const highLoaded = await preloadImage(highURL, 'auto');\n        if (requestId !== this.imageRequestId) return;\n        displayed = highLoaded;\n        if (highLoaded) images.forEach((element) => { element.src = highURL; });\n      } else if (!loaded) images.forEach((element) => element.removeAttribute('src'));\n      surfaces.forEach((surface) => {\n        surface.classList.remove('is-loading');\n        surface.classList.toggle('is-unavailable', !displayed);\n        surface.setAttribute('aria-busy', 'false');\n        const loading = surface.querySelector('[data-hf-product-loading]');\n        if (loading) loading.textContent = displayed ? '' : 'Product image unavailable';\n      });\n      if (!displayed || !highURL || highURL === lowURL || !loaded) return;\n      const highLoaded = await preloadImage(highURL, 'low');\n      if (requestId !== this.imageRequestId || !highLoaded) return;\n      images.forEach((element) => {\n        element.fetchPriority = 'low';\n        element.src = highURL;\n      });\n    }\n  }\n  if (!customElements.get('hugfig-rebuild-configurator')) customElements.define('hugfig-rebuild-configurator', RebuildConfigurator);\n\n  function syncDialogScrollLock() {\n    const shouldLock = Boolean(document.querySelector('dialog[open]'));\n    if (shouldLock && !dialogScrollLocked) {\n      dialogScrollY = window.scrollY;\n      dialogScrollLocked = true;\n      document.documentElement.classList.add('hf-rb-dialog-open');\n      document.body.classList.add('hf-rb-dialog-open');\n      document.body.style.top = `-${dialogScrollY}px`;\n      return;\n    }\n    if (!shouldLock && dialogScrollLocked) {\n      dialogScrollLocked = false;\n      document.documentElement.classList.remove('hf-rb-dialog-open');\n      document.body.classList.remove('hf-rb-dialog-open');\n      document.body.style.removeProperty('top');\n      window.scrollTo(0, dialogScrollY);\n    }\n  }\n\n  function initDialogs(root) {\n    root.querySelectorAll('[data-hf-dialog-open]').forEach((button) => button.addEventListener('click', () => document.getElementById(button.dataset.hfDialogOpen)?.showModal()));\n    root.querySelectorAll('[data-hf-dialog-close]').forEach((button) => button.addEventListener('click', () => button.closest('dialog')?.close()));\n    root.querySelectorAll('dialog').forEach((dialog) => {\n      if (dialog.dataset.hfDialogReady) return;\n      dialog.dataset.hfDialogReady = 'true';\n      dialog.addEventListener('click', (event) => { if (event.target === dialog) dialog.close(); });\n      new MutationObserver(syncDialogScrollLock).observe(dialog, { attributes: true, attributeFilter: ['open'] });\n    });\n  }\n  function initChat(root) {\n    root.querySelectorAll('[data-hf-chat-open]').forEach((button) => button.addEventListener('click', () => {\n      const selectors = ['[data-testid=\"chat-launcher\"]', '.chat-app--launcher', '#ShopifyChat button', 'iframe[title*=\"chat\" i]'];\n      const launcher = selectors.map((selector) => document.querySelector(selector)).find(Boolean);\n      if (launcher?.tagName === 'IFRAME') launcher.focus();\n      else if (launcher) launcher.click();\n      else window.dispatchEvent(new CustomEvent('hugfig:open-chat'));\n    }));\n  }\n  function initVideo(root) {\n    const video = root.querySelector('[data-hf-hero-video]');\n    if (!video) return;\n    let retryCount = 0;\n    video.addEventListener('error', () => { if (retryCount++ < 1) { video.load(); video.play().catch(() => {}); } });\n    video.addEventListener('click', (event) => event.preventDefault());\n    video.play().catch(() => {});\n  }\n  function initHome(root) {\n    initDialogs(root); initChat(root); initVideo(root);\n    const configurator = root.querySelector('hugfig-rebuild-configurator');\n    const video = root.querySelector('[data-hf-hero-video]');\n    const productCard = root.querySelector('[data-hf-product-card]');\n    const continueLink = root.querySelector('[data-hf-config-continue]');\n    const heroLink = root.querySelector('[data-hf-hero-continue]');\n    const prefetchLinks = new Map();\n    let speculationScript = null;\n    let prefetchTimer = null;\n    let likelyPreloadTimer = null;\n\n    const setDocumentPrefetch = (hrefs) => {\n      if (!canBackgroundPrefetch()) return;\n      const urls = [...new Set(hrefs.filter(Boolean).map((href) => new URL(href, window.location.href).href))];\n      if (!urls.length) return;\n      [...prefetchLinks.entries()].forEach(([url, link]) => {\n        if (urls.includes(url)) return;\n        link.remove();\n        prefetchLinks.delete(url);\n      });\n      urls.forEach((url) => {\n        if (prefetchLinks.has(url)) return;\n        const link = document.createElement('link');\n        link.rel = 'prefetch';\n        link.href = url;\n        link.fetchPriority = 'low';\n        document.head.append(link);\n        prefetchLinks.set(url, link);\n      });\n      if (!HTMLScriptElement.supports?.('speculationrules')) return;\n      speculationScript?.remove();\n      speculationScript = document.createElement('script');\n      speculationScript.type = 'speculationrules';\n      speculationScript.textContent = JSON.stringify({ prefetch: [{ source: 'list', urls, eagerness: 'moderate' }] });\n      document.head.append(speculationScript);\n    };\n\n    const warmSelection = ({ prefetchDocument = false, preloadLikely = false } = {}) => {\n      const selection = configurator.selection;\n      let imageSources = productImageSources(null, configurator.variant);\n      if (!imageSources.low) imageSources = productImageSources(configurator.product, null);\n      const customizeURL = root.dataset.customizeUrl || '/pages/customize';\n      const photoParams = new URLSearchParams({ product: selection.product, type: selection.type, style: selection.style, step: 'photo' });\n      const customizeParams = new URLSearchParams({ product: selection.product, type: selection.type, style: selection.style, step: 'customize' });\n      const photoHref = `${customizeURL}?${photoParams}`;\n      const customizeHref = `${customizeURL}?${customizeParams}`;\n      if (continueLink) continueLink.href = photoHref;\n      if (heroLink) heroLink.href = customizeHref;\n      try {\n        sessionStorage.setItem('hf_rebuild_pending_selection', JSON.stringify(selection));\n        sessionStorage.setItem('hf_rebuild_pending_image', JSON.stringify({ selection, lowURL: imageSources.low, highURL: imageSources.high, createdAt: Date.now() }));\n      } catch (_) { /* Storage may be disabled. */ }\n      if (preloadLikely && canBackgroundPrefetch()) {\n        window.clearTimeout(likelyPreloadTimer);\n        likelyPreloadTimer = window.setTimeout(() => whenIdle(() => {\n          likelySelectionImages(configurator, 3).forEach((url) => preloadImage(url, 'low'));\n        }), 180);\n      }\n      if (prefetchDocument) setDocumentPrefetch([photoHref, customizeHref]);\n    };\n\n    const scheduleDocumentPrefetch = () => {\n      if (!canBackgroundPrefetch()) return;\n      window.clearTimeout(prefetchTimer);\n      prefetchTimer = window.setTimeout(() => warmSelection({ prefetchDocument: true, preloadLikely: true }), 220);\n    };\n\n    root.addEventListener('hf:selection-change', () => {\n      warmSelection();\n      scheduleDocumentPrefetch();\n    });\n    warmSelection();\n\n    const afterHeroStarts = () => whenIdle(scheduleDocumentPrefetch);\n    if (video?.readyState >= 3) afterHeroStarts();\n    else video?.addEventListener('canplay', afterHeroStarts, { once: true });\n    window.addEventListener('load', afterHeroStarts, { once: true });\n    window.setTimeout(scheduleDocumentPrefetch, 1800);\n\n    if ('IntersectionObserver' in window && productCard) {\n      const observer = new IntersectionObserver((entries) => {\n        if (!entries.some((entry) => entry.isIntersecting)) return;\n        scheduleDocumentPrefetch();\n        observer.disconnect();\n      }, { rootMargin: '120vh 0px' });\n      observer.observe(productCard);\n    }\n\n    [continueLink, heroLink].forEach((link) => link?.addEventListener('click', () => {\n      link.setAttribute('aria-busy', 'true');\n      link.classList.add('is-navigating');\n    }));\n  }\n\n  function syncDesktopViewport(root) {\n    const update = () => {\n      const header = document.querySelector('.section-header, .header-wrapper');\n      const previewBar = [...document.querySelectorAll('#preview-bar-iframe, iframe[src*=\"preview_bar\"], iframe[src*=\"preview-bar\"]')]\n        .find((frame) => {\n          const height = frame.getBoundingClientRect().height;\n          return height > 0 && height <= 120;\n        });\n      const headerHeight = Math.ceil(header?.getBoundingClientRect().height || 72);\n      const previewHeight = Math.ceil(previewBar?.getBoundingClientRect().height || 0);\n      root.style.setProperty('--hf-rb-runtime-header-height', `${headerHeight}px`);\n      root.style.setProperty('--hf-rb-runtime-preview-height', `${previewHeight}px`);\n    };\n    update();\n    window.addEventListener('resize', update, { passive: true });\n    window.setTimeout(update, 400);\n    window.setTimeout(update, 1400);\n  }\n\n  class CustomFlow {\n    constructor(root) {\n      this.root = root;\n      this.configurator = root.querySelector('hugfig-rebuild-configurator');\n      this.step = 'customize';\n      this.file = null;\n      this.sourceURL = '';\n      this.result = null;\n      this.attempt = 0;\n      this.progressTimer = null;\n      this.pendingAction = null;\n      this.selectedAddon = null;\n      this.orderSubmitting = false;\n      this.activeTaskId = '';\n      this.lastGenerationStatus = null;\n      this.reviewGroupId = '';\n      this.attemptId = '';\n      this.reviewStartedAt = 0;\n      this.previewSeenRecorded = false;\n      this.failureRecorded = false;\n      this.generationFailed = false;\n      this.waitHiddenRecorded = false;\n      this.waitResumedRecorded = false;\n      this.wasHidden = false;\n      this.previewRenderReady = false;\n      this.reuploadFile = null;\n      this.reuploadSourceURL = '';\n      this.successRevealTimer = null;\n      this.historyLimit = Number(root.dataset.historyLimit) || 5;\n      this.historyDays = Number(root.dataset.historyDays) || 7;\n      this.history = freshHistory(this.historyLimit, this.historyDays);\n      this.bind();\n      this.trackConfiguratorEntered();\n      this.restoreQuery();\n      this.renderSizes();\n      this.renderHistory();\n      activeReviewFlow = this; flushGenerationEvents();\n      this.restorePendingGeneration();\n    }\n    bind() {\n      initDialogs(this.root);\n      this.root.querySelectorAll('[data-hf-to-customize]').forEach((button) => button.addEventListener('click', () => this.showStep('customize')));\n      this.root.querySelector('[data-hf-failure-back]')?.addEventListener('click', () => {\n        if (this.root.dataset.previewFailure === 'limit') window.location.assign('/');\n        else this.showStep('customize');\n      });\n      this.root.querySelector('[data-hf-progress-customize]')?.addEventListener('click', () => {\n        if (this.result && this.step === 'preview') this.showStep('customize');\n      });\n      this.root.querySelector('[data-hf-to-photo]')?.addEventListener('click', () => this.showStep('photo'));\n      this.root.querySelector('[data-hf-generation-resume]')?.addEventListener('click', () => this.resumePendingGeneration());\n      this.root.querySelector('[data-hf-image-retry]')?.addEventListener('click', () => { this.showSuccess(); this.trackImageDisplayed({ recovered: true }); });\n      this.root.querySelector('[data-hf-start-preview]')?.addEventListener('click', () => this.startGeneration(this.file));\n      this.root.querySelectorAll('[data-hf-order-action]').forEach((button) => button.addEventListener('click', () => this.openAddon(button.dataset.hfOrderAction, button)));\n      this.root.querySelectorAll('[data-hf-zoom]').forEach((button) => button.addEventListener('click', () => this.zoom(button.dataset.hfZoom)));\n      this.root.querySelectorAll('[data-hf-reupload-open]').forEach((button) => button.addEventListener('click', () => this.openReupload()));\n      this.root.querySelector('[data-hf-reupload-continue]')?.addEventListener('click', () => this.showReuploadUpload());\n      this.root.querySelector('[data-hf-reupload-previous]')?.addEventListener('click', () => this.showReuploadStep('type'));\n      this.root.querySelector('[data-hf-reupload-generate]')?.addEventListener('click', () => this.generateReupload());\n      this.root.querySelectorAll('[data-hf-reupload-type], [data-hf-reupload-style]').forEach((input) => input.addEventListener('change', () => this.updateReuploadSummary()));\n      this.configurator.addEventListener('hf:selection-change', (event) => {\n        if (event.detail.group === 'type' || event.detail.group === 'style') {\n          if (this.result) { this.result = null; this.file = null; this.releaseSource(); }\n        }\n        this.updateInstruction(); this.renderSizes();\n      });\n      this.configurator.addEventListener('hf:variant-change', () => this.renderSizes());\n      this.bindUpload(this.root.querySelector('[data-hf-photo-input]'), 'photo');\n      this.bindUpload(this.root.querySelector('[data-hf-reupload-input]'), 'reupload');\n      this.root.querySelector('[data-hf-photo-clear]')?.addEventListener('click', () => this.clearPhoto());\n    }\n    analyticsContext(extra = {}) {\n      const selection = this.configurator?.selection || {};\n      const variant = this.configurator?.variant || {};\n      return {\n        journey_type: 'ai_preview',\n        category: selection.type || '',\n        style: selection.style || '',\n        generation_class: TYPE_DATA[selection.type]?.generationClass || '',\n        variant_id: variant.id ? String(variant.id) : '',\n        slot_index: 0,\n        required_slot_count: 1,\n        ...extra\n      };\n    }\n    trackConfiguratorEntered(attempt = 0) {\n      if (this.root.dataset.hfConfiguratorEntered === 'true') return;\n      if (!window.HugfigAnalytics?.track) {\n        if (attempt < 40) window.setTimeout(() => this.trackConfiguratorEntered(attempt + 1), 100);\n        return;\n      }\n      track('configurator_entered', this.analyticsContext());\n      this.root.dataset.hfConfiguratorEntered = 'true';\n    }\n    restoreQuery() {\n      if (new URLSearchParams(window.location.search).get('step') === 'photo') this.showStep('photo', false);\n      else this.showStep('customize', false);\n      this.updateInstruction();\n    }\n    showStep(step, shouldScroll = true) {\n      const previousStep = this.step;\n      this.step = step;\n      this.root.dataset.currentStep = step;\n      this.root.querySelectorAll('[data-hf-step]').forEach((section) => section.classList.toggle('is-active', section.dataset.hfStep === step));\n      const order = ['customize', 'photo', 'preview', 'order'];\n      const activeIndex = order.indexOf(step);\n      this.root.querySelectorAll('[data-hf-progress-item]').forEach((item) => {\n        const index = order.indexOf(item.dataset.hfProgressItem);\n        item.classList.toggle('is-current', item.dataset.hfProgressItem === step);\n        item.classList.toggle('is-complete', index < activeIndex);\n      });\n      const customizeProgress = this.root.querySelector('[data-hf-progress-customize]');\n      if (customizeProgress) customizeProgress.disabled = !(this.result && step === 'preview');\n      if (step === 'photo' && previousStep !== 'photo') track('photo_upload_page_entered', this.analyticsContext());\n      if (shouldScroll) {\n        const header = document.querySelector('.section-header, .header-wrapper');\n        const headerStyle = header && window.getComputedStyle(header);\n        const headerOffset = header && ['sticky', 'fixed'].includes(headerStyle.position)\n          ? header.getBoundingClientRect().height + Math.max(0, parseFloat(headerStyle.top) || 0) : 0;\n        // Keep the flow's existing top padding below the sticky header. offsetTop\n        // is relative to an offset parent, not necessarily to the document.\n        const top = window.scrollY + this.root.getBoundingClientRect().top - headerOffset;\n        window.scrollTo({ top: Math.max(0, top), behavior: 'auto' });\n      }\n    }\n    showPreviewState(state) {\n      this.showStep('preview');\n      this.root.dataset.previewState = state;\n      this.root.querySelectorAll('[data-hf-preview-state]').forEach((element) => { element.hidden = element.dataset.hfPreviewState !== state; });\n    }\n    updateInstruction() {\n      const type = this.configurator.selection.type;\n      const text = TYPE_DATA[type]?.instruction || TYPE_DATA.person.instruction;\n      const title = this.root.querySelector('[data-hf-photo-title]');\n      const instruction = this.root.querySelector('[data-hf-photo-instruction]');\n      const uploadTitle = this.root.querySelector('[data-hf-upload-title]');\n      const cleared = this.root.querySelector('[data-hf-clear-instruction]');\n      if (title) title.textContent = TYPE_DATA[type]?.uploadTitle || TYPE_DATA.person.uploadTitle;\n      if (uploadTitle) uploadTitle.textContent = TYPE_DATA[type]?.uploadTitle || TYPE_DATA.person.uploadTitle;\n      if (instruction) instruction.textContent = text;\n      if (cleared) cleared.textContent = `Upload another ${TYPE_DATA[type]?.label.toLowerCase()} photo to generate a new preview. Your previous previews stay below.`;\n    }\n    bindUpload(input, location) {\n      if (!input) return;\n      input.addEventListener('click', () => track('photo_upload_click', { slot_index: 0, required_slot_count: 1, replacing_existing_photo: Boolean(this.file) }));\n      input.addEventListener('change', () => this.acceptFile(input.files?.[0], location));\n    }\n    acceptFile(file, location) {\n      if (!file) return;\n      const extension = file.name.split('.').pop()?.toLowerCase();\n      const allowed = ['jpg', 'jpeg', 'png', 'webp', 'heic', 'heif'];\n      if (!allowed.includes(extension) && !file.type.startsWith('image/')) return this.toast('Please choose a JPG, PNG, WebP, or HEIC image.');\n      if (file.size > 20 * 1024 * 1024) return this.toast('Please choose an image smaller than 20 MB.');\n      if (location === 'reupload') {\n        if (this.reuploadSourceURL?.startsWith('blob:')) URL.revokeObjectURL(this.reuploadSourceURL);\n        this.reuploadFile = file;\n        this.snapshotPhoto(file).then(snapshot => { if (this.reuploadFile === file) this.reuploadFile = snapshot.file; }).catch(() => {});\n        this.reuploadSourceURL = URL.createObjectURL(file);\n        const preview = this.root.querySelector('[data-hf-reupload-preview]'); if (preview) preview.src = this.reuploadSourceURL;\n        this.root.querySelector('[data-hf-reupload-upload]')?.classList.add('is-filled');\n        const button = this.root.querySelector('[data-hf-reupload-generate]'); if (button) button.disabled = false;\n        track('photo_upload_accepted', this.analyticsContext({ upload_source: 'reupload' }));\n        return;\n      }\n      this.file = file; this.releaseSource(); this.sourceURL = URL.createObjectURL(file);\n      this.snapshotPhoto(file).then(snapshot => { if (this.file === file) this.file = snapshot.file; }).catch(() => {});\n      const desktopSource = this.root.querySelector('[data-hf-desktop-source]'); setSourceImage(desktopSource, this.sourceURL);\n      if (location === 'photo') {\n        const box = this.root.querySelector('[data-hf-upload]');\n        box?.classList.add('is-filled');\n        const preview = this.root.querySelector('[data-hf-photo-preview]'); if (preview) preview.src = this.sourceURL;\n        const button = this.root.querySelector('[data-hf-start-preview]'); if (button) button.disabled = false;\n        const status = this.root.querySelector('[data-hf-photo-status]'); if (status) status.textContent = 'Photo ready.';\n      }\n      track('photo_upload_accepted', this.analyticsContext({ upload_source: location === 'photo' ? 'product_page' : location }));\n    }\n    clearPhoto() {\n      this.file = null; this.releaseSource();\n      const box = this.root.querySelector('[data-hf-upload]'); box?.classList.remove('is-filled');\n      const input = this.root.querySelector('[data-hf-photo-input]'); if (input) input.value = '';\n      const preview = this.root.querySelector('[data-hf-photo-preview]'); if (preview) preview.removeAttribute('src');\n      const desktopSource = this.root.querySelector('[data-hf-desktop-source]'); setSourceImage(desktopSource, '');\n      const button = this.root.querySelector('[data-hf-start-preview]'); if (button) button.disabled = true;\n    }\n    releaseSource() { if (this.sourceURL?.startsWith('blob:')) URL.revokeObjectURL(this.sourceURL); this.sourceURL = ''; }\n    startProgress() {\n      window.clearInterval(this.progressTimer); const started = this.reviewStartedAt || Date.now();\n      const title = this.root.querySelector('[data-hf-generation-title]');\n      const copy = this.root.querySelector('[data-hf-generation-copy]');\n      if (title) title.textContent = 'Creating your preview';\n      if (copy) copy.textContent = 'AI is creating your custom figure.';\n      const update = () => {\n        const elapsed = Date.now() - started;\n        const value = Math.min(99, Math.floor((elapsed / 90000) * 100));\n        const bar = this.root.querySelector('[data-hf-progress-bar]');\n        if (bar) {\n          bar.style.setProperty('--hf-rb-progress-scale', String(value / 100));\n          bar.setAttribute('aria-valuenow', String(value));\n        }\n        const percent = this.root.querySelector('[data-hf-progress-percent]'); if (percent) percent.textContent = `${value}%`;\n        if (value >= 99) {\n          if (title) title.textContent = 'Almost Ready';\n          if (copy) copy.textContent = 'Your preview is still processing. Please keep this page open.';\n        }\n      };\n      requestAnimationFrame(update); this.progressTimer = window.setInterval(update, 500);\n    }\n    stopProgress(complete = false) {\n      window.clearInterval(this.progressTimer);\n      if (complete) {\n        const bar = this.root.querySelector('[data-hf-progress-bar]');\n        if (bar) { bar.style.setProperty('--hf-rb-progress-scale', '1'); bar.setAttribute('aria-valuenow', '100'); }\n        const percent = this.root.querySelector('[data-hf-progress-percent]'); if (percent) percent.textContent = '100%';\n      }\n    }\n    resetAttempt() {\n      this.reviewContextId = uuid();\n      this.reviewGroupId = ''; this.attemptId = ''; this.activeTaskId = ''; this.traceId = '';\n      this.reviewStartedAt = 0; this.lastGenerationStatus = null; this.previewRenderReady = false;\n      this.previewSeenRecorded = false; this.failureRecorded = false; this.waitHiddenRecorded = false; this.waitResumedRecorded = false;\n      this.generationFailed = false;\n      this.clientEvents = new Map(); this.deliveredEvents = new Set();\n      this.wasHidden = document.visibilityState === 'hidden';\n      this.imageDisplayCleanup?.();\n    }\n    savePendingGeneration(pending) {\n      this.pendingGeneration = pending;\n      writeSession(PENDING_KEY, pending);\n    }\n    clearPendingGeneration() {\n      if (this.pendingGeneration?.submissionId) pendingPhoto('delete', this.pendingGeneration.submissionId);\n      const persisted = readSession(PENDING_KEY, null);\n      if (persisted?.submissionId === this.pendingGeneration?.submissionId) writeSession(PENDING_KEY, null);\n      this.pendingGeneration = null;\n    }\n    submissionPollURL(submissionId) {\n      const url = new URL('/submission', this.root.dataset.apiEndpoint);\n      url.searchParams.set('submissionId', submissionId);\n      return url.toString();\n    }\n    safePollURL(value) {\n      try {\n        const url = new URL(value, this.root.dataset.apiEndpoint);\n        const endpoint = new URL(this.root.dataset.apiEndpoint);\n        // The current entry and its two existing provider Workers are the only generation API origins.\n        const providerOrigin = /^https:\\/\\/hugfig-(?:kie|tokenhot)-proxy\\.hello-cd4\\.workers\\.dev$/;\n        return !url.username && !url.password && (url.origin === endpoint.origin || providerOrigin.test(url.origin)) && ['/status', '/submission'].includes(url.pathname) ? url.href : '';\n      } catch (_) { return ''; }\n    }\n    restorePendingGeneration() {\n      const pending = readSession(PENDING_KEY, null);\n      if (!pending || !Number.isFinite(pending.startedAt) || pending.startedAt < Date.now() - DAY_MS || pending.startedAt > Date.now() + 60000 || !pending.submissionId || !pending.reviewGroupId || !TYPE_DATA[pending.selection?.type] || !this.safePollURL(pending.pollUrl)) {\n        if (pending) writeSession(PENDING_KEY, null);\n        return;\n      }\n      this.pendingGeneration = pending;\n      if (pending.preparingUpload === true && pending.uploadToken && pending.photoCached && pending.startedAt > Date.now() - 10 * 60 * 1000) {\n        this.resumePreparedUpload(pending); return;\n      }\n      if (pending.preparingUpload === true) {\n        // The paid-submit boundary was never crossed. A File cannot be restored\n        // from session metadata; ask for it again instead of polling forever.\n        this.attemptId = pending.submissionId; this.reviewGroupId = pending.reviewGroupId;\n        this.reviewStartedAt = pending.startedAt;\n        this.handleGenerationError(Object.assign(new Error('Page closed before photo upload was confirmed'), {\n          code: 'upload_incomplete', phase: 'upload', terminal: true,\n        }));\n        return;\n      }\n      this.resumePendingGeneration();\n    }\n    async resumePreparedUpload(pending) {\n      if (this.generationInFlight) return;\n      this.setGenerationBusy(true); this.resetAttempt(); activeReviewFlow = this;\n      this.attemptId = pending.submissionId; this.reviewGroupId = pending.reviewGroupId;\n      this.reviewStartedAt = pending.startedAt;\n      this.configurator.applySelection(pending.selection);\n      this.showPreviewState('loading'); this.startProgress();\n      try {\n        const file = await pendingPhoto('get', pending.submissionId);\n        if (!file) throw Object.assign(new Error('Please select your photo again to continue.'), {code:'upload_incomplete',phase:'upload',terminal:true});\n        this.file = file; this.releaseSource(); this.sourceURL = URL.createObjectURL(file);\n        this.root.querySelectorAll('[data-hf-loading-source], [data-hf-desktop-source]').forEach(image => setSourceImage(image, this.sourceURL));\n        const generated = await this.generate(file, pending.selection, pending);\n        await this.completeGeneration(generated, pending.selection, '', '', {recovered:true});\n      } catch (error) { this.handleGenerationError(error); }\n      finally { this.setGenerationBusy(false); }\n    }\n    resumeIfWaiting() {\n      if (this.root.dataset.previewState === 'waiting' && this.pendingGeneration && !this.generationInFlight) this.resumePendingGeneration();\n    }\n    generationWaitDeadline(pending) {\n      return pending.startedAt + (pending.taskId ? CLIENT_WAIT_MS : SUBMISSION_CONFIRM_WAIT_MS);\n    }\n    showWaiting(error) {\n      this.stopProgress(); this.showPreviewState('waiting');\n      const copy = this.root.querySelector('[data-hf-wait-copy]');\n      if (copy) copy.textContent = error?.code === 'submission_dispatch_expired'\n        ? 'Your request is saved, but the service has not confirmed it can continue. Automatic queue retries have stopped. Please contact us with your request details.'\n        : error?.code === 'submission_queued'\n        ? 'Your request has been received and is waiting in the queue. It will continue automatically when the service is ready. You can return here to check this preview.'\n        : error?.code === 'submission_unconfirmed'\n        ? 'We have not confirmed your submission yet. Continue checking the original request; no additional preview will be started.'\n        : 'Your preview may still be processing. You can return to this page or continue checking the same preview.';\n    }\n    setGenerationBusy(busy) {\n      this.generationInFlight = busy;\n      this.root.setAttribute('aria-busy', String(busy));\n      const start = this.root.querySelector('[data-hf-start-preview]'); if (start) start.disabled = busy || !this.file;\n      const resume = this.root.querySelector('[data-hf-generation-resume]'); if (resume) resume.disabled = busy;\n    }\n    async resumePendingGeneration() {\n      const pending = this.pendingGeneration;\n      if (!pending || this.generationInFlight) return;\n      this.setGenerationBusy(true);\n      this.resetAttempt(); activeReviewFlow = this;\n      this.attemptId = pending.submissionId; this.reviewGroupId = pending.reviewGroupId;\n      this.activeTaskId = pending.taskId || ''; this.reviewStartedAt = pending.startedAt;\n      this.configurator.applySelection(pending.selection);\n      if (pending.taskId && Date.now() < this.generationWaitDeadline(pending)) {\n        this.showPreviewState('loading'); this.startProgress();\n      } else this.showWaiting({ code: pending.taskId ? 'client_wait_elapsed' : pending.dispatchExpired ? 'submission_dispatch_expired' : pending.accepted ? 'submission_queued' : 'submission_unconfirmed' });\n      flushGenerationEvents();\n      try {\n        let restoredData;\n        this.generationPhase = 'submission_lookup';\n        const remaining = this.generationWaitDeadline(pending) - Date.now();\n        try { ({ data: restoredData } = await this.fetchJSON(this.submissionPollURL(pending.submissionId), { headers: { Accept: 'application/json' } }, remaining > 0 ? Math.min(30000, remaining) : 5000)); }\n        catch (error) {\n          if (error.terminal || (error.status >= 400 && error.status < 500 && ![404, 408, 425, 429].includes(error.status))) throw error;\n        }\n        const generated = await this.pollGeneration(pending, restoredData, true);\n        await this.completeGeneration(generated, pending.selection, '', '', { generation_mode: 'better', recovered: true });\n      } catch (error) { this.handleGenerationError(error); }\n      finally { this.setGenerationBusy(false); }\n    }\n    async completeGeneration(generated, selection, cacheId, sourceSnapshot, analytics = {}) {\n      this.clearPendingGeneration();\n      this.stopProgress(true);\n      this.activeTaskId = generated.taskId || this.activeTaskId;\n      const originalUploadUrl = durableAssetURL(generated.originalUploadUrl);\n      const sourcePreviewUrl = durableAssetURL(generated.sourcePreviewUrl);\n      this.result = { resultUrl: generated.resultUrl, sourceUrl: sourcePreviewUrl || originalUploadUrl || sourceSnapshot || this.sourceURL, originalUploadUrl, sourcePreviewUrl, taskId: this.activeTaskId, attemptId: this.attemptId, reviewGroupId: this.reviewGroupId, cacheId, selection: { ...selection }, createdAt: Date.now() };\n      this.history = [this.result, ...this.history.filter((item) => item.resultUrl !== this.result.resultUrl)].slice(0, this.historyLimit);\n      writeStore(HISTORY_KEY, this.history);\n      track('generation_succeeded', this.analyticsContext(analytics));\n      this.showSuccess(); this.trackImageDisplayed(this.analyticsContext(analytics));\n    }\n    handleGenerationError(error) {\n      if (error?.recoverable) { this.showWaiting(error); return; }\n      // Local completion cannot depend on the diagnostic request succeeding.\n      // Keep retrying its queued event, but do not report a failed flow as waiting.\n      this.generationFailed = true;\n      this.clearPendingGeneration(); this.lastGenerationStatus = error?.status || error?.code || 'failed';\n      this.stopProgress();\n      recordGenerationClientEvent(this, 'generation_failed', error);\n      this.showFailure(error);\n      track('preview_generation_failed', { generation_mode: 'better', attempt_no: this.attempt, error_code: String(error?.code || error?.status || 'generation_failed') });\n    }\n    async snapshotPhoto(file) {\n      let timer;\n      try {\n        if (!file.size || file.size > 20 * 1024 * 1024) throw new Error('Selected photo has an invalid size.');\n        const bytes = await Promise.race([file.arrayBuffer(), new Promise((_, reject) => {\n          timer = window.setTimeout(() => reject(Object.assign(new Error('Selected photo could not be read within 30 seconds.'), { name: 'TimeoutError' })), 30000);\n        })]);\n        if (bytes.byteLength !== file.size) throw new Error('Selected photo could not be read completely.');\n        // A picker File can lose access to its backing file while the page is open.\n        // Hashing and every upload retry must use this one immutable memory snapshot.\n        return { file: new File([bytes], file.name, { type: file.type, lastModified: file.lastModified }), bytes };\n      } catch (cause) {\n        const error = new Error(cause?.message || 'Selected photo could not be read. Please choose it again.', { cause });\n        Object.assign(error, { name: cause?.name || 'Error', code: 'photo_read_failed', phase: 'file_read', traceId: '', terminal: true });\n        throw error;\n      } finally { window.clearTimeout(timer); }\n    }\n    async fingerprint(file, bytes) {\n      if (!window.crypto?.subtle) return `${file.name}_${file.size}_${file.lastModified}`;\n      bytes ||= await file.arrayBuffer();\n      const hash = await crypto.subtle.digest('SHA-256', bytes);\n      return [...new Uint8Array(hash)].map((byte) => byte.toString(16).padStart(2, '0')).join('');\n    }\n    async startGeneration(file) {\n      if (this.generationInFlight) return;\n      if (this.pendingGeneration) { this.resumePendingGeneration(); return; }\n      if (!file) return this.toast('Please upload a photo first.');\n      this.setGenerationBusy(true);\n      this.resetAttempt(); activeReviewFlow = this;\n      this.attempt += 1; const startedAt = Date.now(); this.reviewStartedAt = startedAt;\n      const generationRunId = uuid();\n      const selection = { ...this.configurator.selection };\n      const identity = { submissionId: uuid(), reviewGroupId: uuid() };\n      const sourceUrl = safeURL(this.sourceURL);\n      this.root.querySelectorAll('[data-hf-loading-source], [data-hf-desktop-source]').forEach((source) => setSourceImage(source, sourceUrl));\n      this.showPreviewState('loading'); this.startProgress();\n      track('generation_started', this.analyticsContext({ generation_run_id: generationRunId, generation_mode: 'better', attempt_no: this.attempt, is_retry: this.attempt > 1 }));\n      try {\n        this.generationPhase = 'file_read';\n        const snapshot = await this.snapshotPhoto(file);\n        if (this.file === file) {\n          this.file = snapshot.file;\n          this.releaseSource(); this.sourceURL = URL.createObjectURL(snapshot.file);\n          this.root.querySelectorAll('[data-hf-loading-source], [data-hf-desktop-source]').forEach((source) => setSourceImage(source, this.sourceURL));\n        }\n        const sourceSnapshotPromise = historySource(snapshot.file);\n        this.generationPhase = 'preparing';\n        const fingerprint = await this.fingerprint(snapshot.file, snapshot.bytes);\n        const cacheId = `${fingerprint}:${selection.type}:${selection.style}`;\n        const cache = readStore(CACHE_KEY, {});\n        const cachedGeneration = cache[cacheId];\n        let generated = cachedGeneration?.expiresAt > Date.now() ? cachedGeneration : null;\n        if (!generated) {\n          generated = { ...await this.generate(snapshot.file, selection, identity), attemptId: this.attemptId, reviewGroupId: this.reviewGroupId };\n          cache[cacheId] = { ...generated, expiresAt: Date.now() + this.historyDays * DAY_MS };\n          writeStore(CACHE_KEY, cache);\n        } else {\n          // A cached image belongs to its original submission, not this local read.\n          this.attemptId = ''; this.reviewGroupId = '';\n          await this.restorePreviewIdentity(generated);\n          cache[cacheId] = generated; writeStore(CACHE_KEY, cache);\n        }\n        await this.completeGeneration(generated, selection, cacheId, await sourceSnapshotPromise, { generation_run_id: generationRunId, generation_mode: 'better', attempt_no: this.attempt, is_retry: this.attempt > 1, latency_ms: Date.now() - startedAt, preview_option_count: 1 });\n      } catch (error) {\n        if (error?.code === 'photo_read_failed') {\n          this.attemptId = identity.submissionId; this.reviewGroupId = identity.reviewGroupId;\n        }\n        this.handleGenerationError(error);\n      } finally { this.setGenerationBusy(false); }\n    }\n    async restorePreviewIdentity(preview) {\n      let attemptId = preview.attemptId || preview.submissionId;\n      let reviewGroupId = preview.reviewGroupId;\n      const lookupContext = this.reviewContextId;\n      if ((!attemptId || !reviewGroupId) && preview.taskId) {\n        // Pre-upgrade caches contain a task ID but no review IDs. Resolve the\n        // original binding read-only; a cache hit must never create a new job.\n        const statusURL = new URL('/status', this.root.dataset.apiEndpoint);\n        statusURL.searchParams.set('taskId', preview.taskId); statusURL.searchParams.set('variant', 'primary');\n        this.generationPhase = 'cached_preview_lookup';\n        try {\n          const { data } = await this.fetchJSON(statusURL.toString(), { headers: { Accept: 'application/json' } }, 10000);\n          attemptId = data.submissionId || data.attemptId;\n          reviewGroupId = data.reviewGroupId;\n        } catch (_) { /* A status lookup must not hide an already cached preview. */ }\n      }\n      if (this.reviewContextId !== lookupContext) return;\n      if (attemptId && reviewGroupId) {\n        this.attemptId = String(attemptId); this.reviewGroupId = String(reviewGroupId);\n        preview.attemptId = this.attemptId; preview.reviewGroupId = this.reviewGroupId;\n      }\n      this.activeTaskId = preview.taskId || '';\n    }\n    async fetchJSON(url, options = {}, timeout = 90000, requestId = '') {\n      const requestStartedAt = Date.now();\n      let responseTraceId = ''; let serverRequestId = '';\n      const controller = new AbortController(); const timer = window.setTimeout(() => controller.abort(), timeout);\n      try {\n        const response = await fetch(url, { ...options, credentials: 'omit', signal: controller.signal });\n        const traceId = responseTraceId = response.headers.get('X-HugFig-Trace-Id') || '';\n        serverRequestId = response.headers.get('X-HugFig-Server-Request-Id') || '';\n        if (traceId) this.traceId = traceId;\n        let data;\n        try { data = await response.json(); } catch (_) {\n          const error = new Error('Preview service returned an unreadable response.');\n          Object.assign(error, { status: response.status, code: 'invalid_response', phase: this.generationPhase, traceId, retryable: true }); throw error;\n        }\n        if (!response.ok || data?.rejected === true || data?.outcome === 'rejected' || ['failed', 'failure', 'error', 'cancelled', 'expired'].includes(data?.status)) {\n          const error = new Error(data.message || (typeof data.error === 'string' ? data.error : data.error?.message) || 'Preview service is unavailable.');\n          Object.assign(error, { status: response.status, code: data.code || data.error?.code || '', phase: this.generationPhase, traceId: traceId || data.traceId || '', taskId: data.taskId || '', quota: data.quota, terminal: data.status === 'failed' || data.status === 'failure' || data.status === 'cancelled' || data.status === 'expired' || data.terminal === true || data.retryable === false || data.rejected === true || data.outcome === 'rejected' });\n          throw error;\n        }\n        return { response, data };\n      } catch (cause) {\n        // DOMException.code is getter-only in Safari (and may be frozen).\n        // Keep the original exception untouched and attach diagnostics to our own Error.\n        const error = new Error(cause?.message || 'Preview request failed.', { cause });\n        error.name = cause?.name || 'Error';\n        for (const key of ['status', 'code', 'phase', 'traceId', 'taskId', 'quota', 'terminal', 'retryable']) {\n          if (cause?.[key] !== undefined) error[key] = cause[key];\n        }\n        let requestHost = '';\n        try { requestHost = new URL(url, location.href).hostname; } catch (_) {}\n        error.transportDiagnostics = {\n          requestElapsedMs: Math.max(0, Date.now() - requestStartedAt), requestTimeoutMs: timeout,\n          requestHost, ...(serverRequestId ? { serverRequestId: diagnosticText(serverRequestId, 80) } : {}), online: navigator.onLine,\n          visibility: document.visibilityState,\n          networkType: navigator.connection?.effectiveType || '',\n        };\n        error.phase ||= this.generationPhase;\n        error.traceId ||= responseTraceId;\n        if (requestId) error.requestId = requestId;\n        if (cause?.name === 'AbortError' || cause?.name === 'TimeoutError') error.code = 'request_timeout';\n        else if (!error.status && !error.code) error.code = 'network_error';\n        throw error;\n      } finally { window.clearTimeout(timer); }\n    }\n    extractStyle(data, fallbackOriginalUploadUrl = '', fallbackSourcePreviewUrl = '') {\n      const style = Array.isArray(data?.styles) ? data.styles.find((item) => safeURL(item?.src || item?.url || item?.imageUrl)) : null;\n      const url = safeURL(style?.src || style?.url || style?.imageUrl || data?.resultUrl || data?.imageUrl);\n      const originalUploadUrl = originalAssetURL(data) || durableAssetURL(fallbackOriginalUploadUrl);\n      const sourcePreviewUrl = sourcePreviewAssetURL(data) || durableAssetURL(fallbackSourcePreviewUrl);\n      return url ? { resultUrl: url, taskId: data?.taskId || style?.taskId || '', originalUploadUrl, sourcePreviewUrl } : null;\n    }\n    async generate(file, selection, identity = {}) {\n      const endpoint = this.root.dataset.apiEndpoint;\n      if (!endpoint) throw new Error('Preview generation is temporarily unavailable.');\n      const submissionId = identity.submissionId || uuid(); const reviewGroupId = identity.reviewGroupId || uuid(); const type = TYPE_DATA[selection.type];\n      this.reviewGroupId = reviewGroupId; this.attemptId = submissionId;\n      const pending = { submissionId, reviewGroupId, pollUrl: this.submissionPollURL(submissionId), taskId: '', selection: { ...selection }, startedAt: this.reviewStartedAt, preparingUpload: true };\n      this.savePendingGeneration(pending);\n      const form = new FormData();\n      form.append('quality', 'better'); form.append('style', type.legacy); form.append('productStyle', type.legacy);\n      form.append('slot', '0'); form.append('variants', 'primary'); form.append('reviewGroupId', reviewGroupId);\n      form.append('telemetryVersion', '2'); form.append('clientVersion', CLIENT_VERSION);\n      form.append('apiVersion', '2'); form.append('product', selection.product); form.append('type', selection.type); form.append('renderStyle', selection.style); form.append('generationClass', type.generationClass);\n      const submitURL = new URL(endpoint, window.location.href); submitURL.searchParams.set('submissionId', submissionId);\n      // Upload retries cannot create a paid job. Register metadata before sending\n      // the photo so interrupted uploads remain attributable in the review list.\n      const uploadToken = identity.uploadToken || uuid();\n      pending.uploadToken = uploadToken;\n      pending.photoCached = Boolean(await pendingPhoto('put', submissionId, file));\n      this.savePendingGeneration(pending);\n      const prepareURL = new URL(submitURL); prepareURL.pathname = '/prepare';\n      const uploadURL = new URL(submitURL); uploadURL.pathname = '/upload';\n      const uploadStatusURL = new URL(submitURL); uploadStatusURL.pathname = '/upload-status';\n      const retryPreparation = async (url, options, timeout, acknowledgement) => {\n        const requestAttempts = []; const phase = this.generationPhase;\n        for (let attempt = 0; attempt < 2; attempt++) {\n          const requestId = uuid(); const startedAt = Date.now();\n          const attemptURL = new URL(url); attemptURL.searchParams.set('clientRequestId', requestId);\n          try {\n            const result = await this.fetchJSON(attemptURL.toString(), options, timeout, requestId);\n            if (result.data?.[acknowledgement] !== true) throw Object.assign(new Error('Photo upload was not confirmed. Please try again.'), {\n              code: 'upload_unconfirmed', terminal: true, status: result.response.status, traceId: result.response.headers.get('X-HugFig-Trace-Id') || '',\n              transportDiagnostics: { serverRequestId: diagnosticText(result.response.headers.get('X-HugFig-Server-Request-Id'), 80) },\n            });\n            return result.data;\n          } catch (error) {\n            error.requestId = requestId; error.traceId ||= '';\n            requestAttempts.push({\n              attempt: attempt + 1, phase, requestId, traceId: diagnosticText(error.traceId, 160),\n              serverRequestId: diagnosticText(error.transportDiagnostics?.serverRequestId, 80),\n              startedAt: new Date(startedAt).toISOString(), elapsedMs: Math.max(0, Date.now() - startedAt), timeoutMs: timeout,\n              status: Number(error.status) || null, name: diagnosticText(error.name, 40), code: diagnosticText(error.code, 80), error: diagnosticText(error.message, 160),\n            });\n            error.transportDiagnostics = { ...error.transportDiagnostics, requestAttempts };\n            // A lost ACK does not mean the image was lost. Confirm the original\n            // registration before retransmitting bytes or reporting upload failure.\n            if (phase === 'upload' && !error.terminal && (!error.status || error.status >= 500 || [408, 425].includes(error.status))) {\n              try {\n                const confirmed = await this.fetchJSON(uploadStatusURL.toString(), { method: 'POST',\n                  headers: { 'Content-Type': 'text/plain;charset=UTF-8' },\n                  body: JSON.stringify({ reviewGroupId, uploadToken }) }, 10000);\n                if (confirmed.data?.uploaded === true && confirmed.data.submissionId === submissionId) return confirmed.data;\n              } catch { /* Preserve the original failure; status uncertainty never creates a paid job. */ }\n            }\n            if (attempt || error.terminal || (error.status >= 400 && error.status < 500 && ![408, 425, 429].includes(error.status))) throw error;\n            await delay(1000);\n          }\n        }\n      };\n      try {\n        this.generationPhase = 'registration';\n        // JSON carried as a CORS-safelisted body avoids an extra preflight on\n        // mobile networks. The server still validates the same JSON and IDs.\n        await retryPreparation(prepareURL.toString(), { method: 'POST', headers: { 'Content-Type': 'text/plain;charset=UTF-8' },\n          body: JSON.stringify({ ...Object.fromEntries(form), uploadToken, imageBytes: file.size }) }, 15000, 'registered');\n        this.generationPhase = 'upload';\n        const uploadForm = new FormData(); uploadForm.append('image', file); uploadForm.append('uploadToken', uploadToken);\n        let uploaded;\n        if (identity.uploadToken) {\n          try { const confirmation = await this.fetchJSON(uploadStatusURL.toString(), {method:'POST',headers:{'Content-Type':'text/plain;charset=UTF-8'},body:JSON.stringify({reviewGroupId,uploadToken})},10000);\n            if (confirmation.data?.uploaded === true && confirmation.data.submissionId === submissionId) uploaded = confirmation.data;\n          } catch { /* Normal upload still verifies the original registration. */ }\n        }\n        uploaded ||= await retryPreparation(uploadURL.toString(), { method: 'POST', body: uploadForm }, 60000, 'uploaded');\n        pending.sourceUrls = uploaded.sourceUrls;\n        this.savePendingGeneration(pending);\n        form.append('uploadToken', uploadToken);\n      } catch (error) {\n        error.phase ||= this.generationPhase;\n        error.code = error.phase === 'registration' ? 'registration_incomplete' : 'upload_incomplete';\n        error.terminal = true;\n        throw error;\n      }\n      this.generationPhase = 'submit';\n      const submitRequestId = uuid();\n      submitURL.searchParams.set('clientRequestId', submitRequestId);\n      pending.submitRequestId = submitRequestId;\n      pending.preparingUpload = false;\n      this.savePendingGeneration(pending);\n      const savedBoundary = readSession(PENDING_KEY, null);\n      if (savedBoundary?.submissionId !== submissionId || savedBoundary.preparingUpload !== false) {\n        throw Object.assign(new Error('Browser could not save the submission recovery state'), { code: 'upload_incomplete', phase: 'registration', terminal: true });\n      }\n      pendingPhoto('delete', submissionId);\n      let data;\n      try { ({ data } = await this.fetchJSON(submitURL.toString(), { method: 'POST', body: form }, 120000, submitRequestId)); }\n      catch (error) {\n        if (error.terminal || (error.status >= 400 && error.status < 500 && ![408, 425].includes(error.status))) throw error;\n        recordGenerationClientEvent(this, 'submission_transport_error', error);\n        // A lost response is not evidence of a rejected paid request. Only read its status.\n        return this.pollGeneration(pending);\n      }\n      return this.pollGeneration(pending, data);\n    }\n    async pollGeneration(pending, initialData, alreadyChecked = false) {\n      let data = initialData; let transientFailures = 0; let originalUploadUrl = originalAssetURL(initialData) || originalAssetURL(pending);\n      let sourcePreviewUrl = sourcePreviewAssetURL(initialData) || durableAssetURL(pending.sourcePreviewUrl);\n      let checked = Boolean(initialData) || alreadyChecked;\n      while (true) {\n        if (data) {\n          this.activeTaskId = data.taskId || data.tasks?.[0]?.taskId || this.activeTaskId;\n          originalUploadUrl = originalAssetURL(data) || originalUploadUrl;\n          if (originalUploadUrl) pending.sourceUrls = [originalUploadUrl];\n          sourcePreviewUrl = sourcePreviewAssetURL(data) || sourcePreviewUrl;\n          const displaySourceUrl = sourcePreviewUrl || originalUploadUrl;\n          // Restore a durable source image after refresh, using the compatible\n          // display copy when available without changing the original upload.\n          if (displaySourceUrl) {\n            this.root.querySelectorAll('[data-hf-loading-source], [data-hf-desktop-source]').forEach((image) => {\n              if (image.getAttribute('src') !== displaySourceUrl) setSourceImage(image, displaySourceUrl);\n            });\n          }\n          pending.sourcePreviewUrl = sourcePreviewUrl;\n          const direct = this.extractStyle(data, originalUploadUrl, sourcePreviewUrl);\n          if (direct) return { ...direct, taskId: direct.taskId || this.activeTaskId };\n          const task = data.tasks?.[0] || data;\n          const pollUrl = this.safePollURL(task.pollUrl || data.pollUrl || pending.pollUrl);\n          if (pollUrl) pending.pollUrl = pollUrl;\n          pending.taskId = this.activeTaskId;\n          pending.accepted = data.accepted === true || pending.accepted;\n          pending.dispatchExpired = data.dispatchExpired === true;\n          if (pending.accepted && !pending.taskId) this.showWaiting({ code: pending.dispatchExpired ? 'submission_dispatch_expired' : 'submission_queued' });\n          this.savePendingGeneration(pending);\n          if (pending.taskId && Date.now() < this.generationWaitDeadline(pending) && this.root.dataset.previewState === 'waiting') {\n            this.showPreviewState('loading'); this.startProgress();\n          }\n          const title = this.root.querySelector('[data-hf-generation-title]');\n          if (title) title.textContent = data.status === 'queued' ? 'Your preview is in the queue' : 'Creating your preview';\n          const remaining = this.generationWaitDeadline(pending) - Date.now();\n          if (remaining <= 0) break;\n          await delay(Math.min(remaining, Math.max(500, Math.min(Number(data.retryAfterMs ?? data.initialDelayMs) || 2500, 15000))));\n        }\n        const remaining = this.generationWaitDeadline(pending) - Date.now();\n        if (checked && remaining <= 0) break;\n        this.generationPhase = new URL(pending.pollUrl).pathname === '/submission' ? 'submission_lookup' : 'poll';\n        try {\n          // An expired/manual check gets one bounded GET, never another paid POST.\n          checked = true;\n          ({ data } = await this.fetchJSON(pending.pollUrl, { headers: { Accept: 'application/json' } }, remaining > 0 ? Math.min(30000, remaining) : 5000));\n          transientFailures = 0;\n        } catch (error) {\n          if (error.terminal || (error.status >= 400 && error.status < 500 && ![404, 408, 425, 429].includes(error.status))) throw error;\n          transientFailures += 1; data = null;\n          if (!pending.taskId) this.showWaiting({ code: pending.dispatchExpired ? 'submission_dispatch_expired' : pending.accepted ? 'submission_queued' : 'submission_unconfirmed' });\n          const copy = this.root.querySelector('[data-hf-generation-copy]');\n          if (copy) copy.textContent = 'Waiting for an update. Your original preview request is being checked.';\n          await delay(Math.max(0, Math.min(this.generationWaitDeadline(pending) - Date.now(), 30000, 1500 * (2 ** Math.min(transientFailures, 4)))));\n        }\n      }\n      const error = new Error('Preview status is not confirmed yet.');\n      Object.assign(error, { recoverable: true, phase: this.generationPhase, code: this.activeTaskId ? 'client_wait_elapsed' : pending.dispatchExpired ? 'submission_dispatch_expired' : pending.accepted ? 'submission_queued' : 'submission_unconfirmed' });\n      throw error;\n    }\n    showFailure(error) {\n      this.showPreviewState('failure');\n      const copy = this.root.querySelector('[data-hf-error-copy]');\n      const title = this.root.querySelector('[data-hf-error-title]');\n      const limitReached = error?.status === 429;\n      const contentRejected = error?.code === 'provider_content_rejected';\n      const uploadIncomplete = ['registration_incomplete', 'upload_incomplete'].includes(error?.code);\n      const photoIssue = {\n        photo_read_failed: ['Please choose your photo again', 'Your device could not read the selected photo. Save it to your device and select it again. No preview was started.'],\n        image_dimensions_exceeded: ['Please choose a smaller photo', 'Your photo is larger than 25 megapixels. Resize it or choose a smaller photo, then upload it again. No preview was started.'],\n        image_processing_timeout: ['Your photo took too long to prepare', 'Export your photo as a JPG or PNG and upload it again. No preview was started.'],\n        image_decode_failed: ['We couldn\u2019t read this photo', 'Export your photo as a JPG or PNG and upload it again. No preview was started.'],\n        image_truncated: ['We couldn\u2019t read the complete photo', 'Save or export a complete copy of your photo, then upload it again. No preview was started.'],\n      }[error?.code];\n      const servicePaused = ['bridge_draining', 'bridge_queue_full', 'queue_full'].includes(error?.code);\n      this.root.dataset.previewFailure = limitReached ? 'limit' : 'generation';\n      if (title) title.textContent = photoIssue ? photoIssue[0] : contentRejected ? 'This preview did not pass the safety review' : limitReached ? 'Free preview limit reached' : servicePaused ? 'Preview service is temporarily busy' : 'We Couldn\u2019t Create This Preview';\n      if (copy) {\n        const quota = error?.quota;\n        let reset = '';\n        if (quota?.resetAt && Number.isFinite(Date.parse(quota.resetAt))) reset = ` You can try again after ${new Date(quota.resetAt).toLocaleString(document.documentElement.lang || 'en', { dateStyle: 'medium', timeStyle: 'short' })}.`;\n        copy.textContent = photoIssue ? photoIssue[1] : uploadIncomplete\n          ? 'Your photo upload could not be confirmed. No preview was started. Please check your connection and try again.'\n          : contentRejected\n          ? 'The image service declined the generated preview. This does not necessarily mean your original photo is unsuitable. Your saved previews are still available.'\n          : limitReached\n          ? `${Number.isFinite(quota?.used) && Number.isFinite(quota?.limit) ? `You have used ${quota.used} of ${quota.limit} free previews today.` : 'You have reached today\u2019s free preview limit.'}${reset} Your saved previews are still available.`\n          : servicePaused ? 'Your request was not accepted. Please go back and try again shortly. You can keep using the same photo.'\n          : 'This preview could not be completed. Your previous previews are still available. You can try another clear photo.';\n      }\n      const back = this.root.querySelector('[data-hf-failure-back]');\n      const reupload = this.root.querySelector('[data-hf-failure-reupload]');\n      if (back) back.textContent = limitReached ? 'Back to home' : 'Previous';\n      if (reupload) reupload.hidden = limitReached;\n    }\n    showSuccess() {\n      this.showPreviewState('success');\n      const sources = this.root.querySelectorAll('[data-hf-result-source], [data-hf-desktop-source]');\n      sources.forEach((source) => {\n        const sourceUrl = safeURL(this.result?.sourceUrl) || safeURL(this.sourceURL);\n        setSourceImage(source, sourceUrl);\n      });\n      this.root.querySelectorAll('[data-hf-result-image], [data-hf-desktop-result]').forEach((result) => { result.src = this.result.resultUrl; });\n      this.renderSizes(); this.renderHistory();\n      const reveal = this.root.querySelector('[data-hf-success-reveal]');\n      const finishing = this.root.querySelector('[data-hf-success-finishing]');\n      reveal?.classList.remove('is-visible');\n      if (finishing) finishing.hidden = false;\n      window.clearTimeout(this.successRevealTimer);\n      this.successRevealTimer = window.setTimeout(() => {\n        reveal?.classList.add('is-visible');\n        if (finishing) finishing.hidden = true;\n      }, 200);\n    }\n    trackImageDisplayed(eventData) {\n      this.imageDisplayCleanup?.();\n      this.imageDisplayAttemptId = uuid();\n      this.traceId ||= uuid();\n      const images = [...this.root.querySelectorAll('[data-hf-result-image], [data-hf-desktop-result]')];\n      const reveal = this.root.querySelector('[data-hf-success-reveal]');\n      const resultUrl = this.result?.resultUrl;\n      const reviewContextId = this.reviewContextId;\n      let tracked = false; let diagnosed = false; let slowReported = false;\n      const startedAt = Date.now();\n      let visibleStartedAt = document.visibilityState === 'visible' ? Date.now() : null;\n      let visibleMs = 0; let timeout;\n      const imageError = this.root.querySelector('[data-hf-image-error]');\n      if (imageError) imageError.hidden = true;\n      const displayDiagnostics = trigger => {\n        const timing = performance.getEntriesByName(resultUrl).filter(entry => entry.entryType === 'resource').at(-1);\n        return { trigger, imageLoadMs: Date.now() - startedAt, online: navigator.onLine,\n          visibility: document.visibilityState, resourceDurationMs: timing ? Math.round(timing.duration) : null,\n          resourceStatus: Number(timing?.responseStatus) || null, transferBytes: Number(timing?.transferSize) || null };\n      };\n      const showMessage = message => {\n        if (!imageError) return;\n        const copy = imageError.querySelector('p');\n        if (copy) copy.textContent = message;\n        imageError.hidden = false;\n      };\n      const confirmDisplay = () => {\n        if (tracked || document.visibilityState !== 'visible' || this.reviewContextId !== reviewContextId || this.result?.resultUrl !== resultUrl || (reveal && !reveal.classList.contains('is-visible'))) return;\n        const displayed = images.some((image) => image.complete && image.naturalWidth > 0 && image.getClientRects().length > 0);\n        if (!displayed) return;\n        tracked = true; this.imageDisplayCleanup?.();\n        if (imageError) imageError.hidden = true;\n        this.previewRenderReady = true;\n        recordGenerationClientEvent(this, 'preview_seen'); track('image_displayed', eventData);\n      };\n      const diagnoseDisplay = () => {\n        if (tracked || diagnosed || this.reviewContextId !== reviewContextId || this.result?.resultUrl !== resultUrl) return;\n        if (images.some((image) => image.complete && image.naturalWidth > 0)) { confirmDisplay(); return; }\n        diagnosed = true;\n        window.clearTimeout(timeout);\n        const error = Object.assign(new Error('Browser reported an image load or decode error for the completed preview.'), { code: 'preview_image_load_error', phase: 'image_display', taskId: this.activeTaskId, displayDiagnostics: displayDiagnostics('image_error') });\n        recordGenerationClientEvent(this, 'generation_failed', error);\n        showMessage('Your preview is saved, but the image could not load. Check your connection and reload the image.');\n      };\n      const reportSlow = () => {\n        if (tracked || diagnosed || slowReported || this.reviewContextId !== reviewContextId || this.result?.resultUrl !== resultUrl) return;\n        if (document.visibilityState !== 'visible') return;\n        if (images.some(image => image.complete && image.naturalWidth > 0)) { confirmDisplay(); return; }\n        slowReported = true;\n        showMessage(navigator.onLine ? 'Your preview is ready. The image is taking longer to load. You can keep waiting or reload it.' : 'Your preview is saved. You are offline. Reconnect, then reload the image.');\n        const warning = Object.assign(new Error('Completed preview image is still loading after 30 seconds of visible waiting; generation has not failed.'), { code: 'preview_image_load_slow', phase: 'image_display', taskId: this.activeTaskId, displayDiagnostics: displayDiagnostics('slow_load') });\n        recordGenerationClientEvent(this, 'preview_load_slow', warning);\n      };\n      const onVisibility = () => {\n        window.clearTimeout(timeout);\n        if (visibleStartedAt !== null) visibleMs += Date.now() - visibleStartedAt;\n        visibleStartedAt = document.visibilityState === 'visible' ? Date.now() : null;\n        confirmDisplay();\n        if (!tracked && !diagnosed && !slowReported && visibleStartedAt !== null) timeout = window.setTimeout(reportSlow, Math.max(0, 30000 - visibleMs));\n      };\n      images.forEach((image) => { image.addEventListener('load', confirmDisplay); image.addEventListener('error', diagnoseDisplay); });\n      document.addEventListener('visibilitychange', onVisibility);\n      if (visibleStartedAt !== null) timeout = window.setTimeout(reportSlow, 30000);\n      this.imageDisplayCleanup = () => {\n        window.clearTimeout(timeout);\n        document.removeEventListener('visibilitychange', onVisibility);\n        images.forEach((image) => { image.removeEventListener('load', confirmDisplay); image.removeEventListener('error', diagnoseDisplay); });\n      };\n      // A cached failed image may have completed before listeners were attached.\n      if (images.some(image => image.complete && image.naturalWidth === 0 && image.getAttribute('src'))) window.queueMicrotask(diagnoseDisplay);\n      window.requestAnimationFrame(() => window.requestAnimationFrame(confirmDisplay));\n      window.setTimeout(confirmDisplay, 420);\n    }\n    openReupload() {\n      const dialog = this.root.querySelector('[data-hf-reupload-dialog]');\n      const selection = this.configurator.selection;\n      if (this.reuploadSourceURL?.startsWith('blob:')) URL.revokeObjectURL(this.reuploadSourceURL);\n      this.reuploadSourceURL = '';\n      this.reuploadFile = null;\n      const input = dialog?.querySelector('[data-hf-reupload-input]'); if (input) input.value = '';\n      dialog?.querySelector('[data-hf-reupload-upload]')?.classList.remove('is-filled');\n      const preview = dialog?.querySelector('[data-hf-reupload-preview]'); if (preview) preview.removeAttribute('src');\n      const generate = dialog?.querySelector('[data-hf-reupload-generate]'); if (generate) generate.disabled = true;\n      const type = dialog?.querySelector(`[data-hf-reupload-type][value=\"${CSS.escape(selection.type)}\"]`); if (type) type.checked = true;\n      const style = dialog?.querySelector(`[data-hf-reupload-style][value=\"${CSS.escape(selection.style)}\"]`); if (style) style.checked = true;\n      this.showReuploadStep('type');\n      this.updateReuploadSummary();\n      dialog?.showModal();\n    }\n    showReuploadStep(step) {\n      this.root.querySelectorAll('[data-hf-reupload-step]').forEach((panel) => { panel.hidden = panel.dataset.hfReuploadStep !== step; });\n      const dialog = this.root.querySelector('[data-hf-reupload-dialog]');\n      if (dialog) dialog.dataset.hfReuploadCurrentStep = step;\n      if (step === 'type') {\n        const title = dialog?.querySelector('[data-hf-reupload-title]');\n        const copy = dialog?.querySelector('[data-hf-reupload-copy]');\n        if (title) title.textContent = 'Re-upload a Photo';\n        if (copy) copy.textContent = 'Choose who is in the new photo and select a preview style.';\n      }\n    }\n    reuploadSelection() {\n      const type = this.root.querySelector('[data-hf-reupload-type]:checked')?.value || this.configurator.selection.type;\n      const style = this.root.querySelector('[data-hf-reupload-style]:checked')?.value || this.configurator.selection.style;\n      return { ...this.configurator.selection, type, style };\n    }\n    updateReuploadSummary() {\n      return this.reuploadSelection();\n    }\n    showReuploadUpload() {\n      const selection = this.reuploadSelection();\n      const type = TYPE_DATA[selection.type] || TYPE_DATA.person;\n      const styleLabel = selection.style === 'chibi' ? 'Chibi' : 'Realistic';\n      const productLabel = selection.product === 'keychain' ? 'Keychain' : 'Figurine';\n      const title = this.root.querySelector('[data-hf-reupload-title]');\n      const copy = this.root.querySelector('[data-hf-reupload-copy]');\n      const label = this.root.querySelector('[data-hf-reupload-label]');\n      if (title) title.textContent = type.uploadTitle;\n      if (copy) copy.textContent = `This photo will create a ${styleLabel} ${type.label} ${productLabel} preview.`;\n      if (label) label.textContent = type.uploadTitle;\n      this.showReuploadStep('upload');\n    }\n    generateReupload() {\n      if (!this.reuploadFile || !this.reuploadSourceURL) return;\n      const selection = this.reuploadSelection();\n      this.configurator.applySelection(selection);\n      this.releaseSource();\n      this.file = this.reuploadFile;\n      this.sourceURL = this.reuploadSourceURL;\n      this.reuploadFile = null;\n      this.reuploadSourceURL = '';\n      this.result = null;\n      this.root.querySelector('[data-hf-reupload-dialog]')?.close();\n      this.startGeneration(this.file);\n    }\n    renderSizes() {\n      const container = this.root.querySelector('[data-hf-size-options]'); if (!container || !this.configurator) return;\n      const sizes = this.configurator.sizes();\n      if (!sizes.some((size) => valueMatches('size', size, this.configurator.currentSize))) this.configurator.currentSize = sizes[0] || '6 cm';\n      container.replaceChildren(...sizes.map((size, index) => {\n        const wrap = document.createElement('div'); wrap.className = 'hf-rb-option';\n        const input = document.createElement('input'); input.type = 'radio'; input.name = 'hf-result-size'; input.value = size; input.id = `hf-size-${index}`; input.className = 'hf-rb-option__input'; input.checked = valueMatches('size', size, this.configurator.currentSize);\n        const selection = { ...this.configurator.selection, size };\n        const variant = matchingVariants(this.configurator.product, selection)[0] || fallbackVariant(selection);\n        const label = document.createElement('label'); label.className = 'hf-rb-option__label hf-rb-option__label--priced'; label.htmlFor = input.id;\n        const sizeText = document.createElement('span'); sizeText.className = 'hf-rb-option__size'; sizeText.textContent = displaySize(size);\n        const priceText = document.createElement('span'); priceText.className = 'hf-rb-option__price'; priceText.textContent = money(variant.price);\n        label.append(sizeText, priceText);\n        input.addEventListener('change', () => { const old = this.configurator.currentSize; this.configurator.setSize(size); track('config_option_select', { option_group: 'size', option_value: size, previous_option_value: old, is_reselect: old === size }); });\n        wrap.append(input, label); return wrap;\n      }));\n    }\n    historyButton(item, index) {\n      const button = document.createElement('button'); button.type = 'button'; button.className = `hf-rb-history__item${item.resultUrl === this.result?.resultUrl ? ' is-active' : ''}`; button.setAttribute('aria-label', `Use preview ${index + 1}`);\n      const image = document.createElement('img'); image.src = item.resultUrl; image.alt = ''; button.append(image);\n      button.addEventListener('click', async () => {\n        if (this.generationInFlight || this.pendingGeneration) return;\n        this.resetAttempt(); activeReviewFlow = this; this.reviewStartedAt = Date.now();\n        const reviewContextId = this.reviewContextId;\n        if (item.selection) this.configurator.applySelection(item.selection);\n        this.result = item;\n        this.showSuccess();\n        await this.restorePreviewIdentity(item);\n        if (this.result !== item || this.reviewContextId !== reviewContextId) return;\n        writeStore(HISTORY_KEY, this.history);\n        this.trackImageDisplayed({ restored_from_history: true });\n      });\n      return button;\n    }\n    renderHistory() {\n      const storedHistory = freshHistory(this.historyLimit, this.historyDays);\n      this.history = [...this.history, ...storedHistory].filter((item, index, items) => items.findIndex((candidate) => candidate.resultUrl === item.resultUrl) === index).slice(0, this.historyLimit);\n      [['[data-hf-history]', '[data-hf-history-wrap]'], ['[data-hf-cleared-history]', '[data-hf-cleared-history-wrap]'], ['[data-hf-desktop-history]', '[data-hf-desktop-history-wrap]']].forEach(([railSelector, wrapSelector]) => {\n        const rail = this.root.querySelector(railSelector); const wrap = this.root.querySelector(wrapSelector); if (!rail || !wrap) return;\n        rail.replaceChildren(...this.history.map((item, index) => this.historyButton(item, index))); wrap.hidden = this.history.length === 0;\n      });\n    }\n    zoom(which) {\n      const url = which === 'source' ? (this.result?.sourceUrl || this.sourceURL) : this.result?.resultUrl; if (!url) return;\n      const dialog = this.root.querySelector('[data-hf-zoom-dialog]'); const image = dialog?.querySelector('[data-hf-zoom-image]'); if (image) image.src = url; dialog?.showModal();\n    }\n    addonConfiguration() {\n      return window.HugfigAddonDialog?.configuration(this.configurator.selection.product);\n    }\n    async openAddon(action, trigger) {\n      if (this.orderSubmitting || this.addonOpening) return;\n      const variant = this.configurator.variant;\n      if (!this.result?.resultUrl) return this.toast('Please create or choose a preview first.');\n      if (!variant?.id || variant.available === false) return this.toast('This product option is not available for ordering yet.');\n      this.pendingAction = action; this.selectedAddon = null;\n      track(action === 'cart' ? 'add_to_cart_click' : 'buy_now_click', { journey_type: 'ai', has_generated_preview: true, variant_id: variant.id, quantity: 1, value: variant.price / 100, currency: window.Shopify?.currency?.active || 'USD' });\n      this.addonOpening = true;\n      try {\n        if (!window.HugfigAddonDialog) throw new Error('Add-on options are temporarily unavailable. Please try again.');\n        const choice = await window.HugfigAddonDialog.open({ productType: this.configurator.selection.product, trigger, track });\n        if (choice.outcome === 'cancelled') { this.pendingAction = null; return; }\n        this.selectedAddon = choice.addon;\n        await this.submitOrder(choice.addon);\n      } catch (error) { this.toast(error.message || 'Unable to open add-on options. Please try again.'); }\n      finally { this.addonOpening = false; }\n    }\n    async submitOrder(addon) {\n      const variant = this.configurator.variant; const action = this.pendingAction; if (!variant?.id || !action || this.orderSubmitting) return;\n      this.orderSubmitting = true;\n      const originalUploadUrl = durableAssetURL(this.result?.originalUploadUrl);\n      const selection = this.configurator.selection; const sessionId = window.HugfigAnalytics?.getConfigSessionId?.() || uuid();\n      const properties = {\n        'Product': selection.product === 'keychain' ? 'Keychain' : 'Figurine',\n        'Type': TYPE_DATA[selection.type].label,\n        'Style': selection.style === 'chibi' ? 'Chibi' : 'Realistic',\n        'Size': selection.size,\n        'Generated Preview': this.result.resultUrl,\n        '_Generation Class': TYPE_DATA[selection.type].generationClass,\n        '_Generation Task ID': this.result.taskId || '',\n        '_Preview History ID': String(this.history.findIndex((item) => item.resultUrl === this.result.resultUrl) + 1),\n        '_HugFig Config Session ID': sessionId\n      };\n      if (originalUploadUrl) properties['_Original Uploaded Photo'] = originalUploadUrl;\n      const items = [{ id: variant.id, quantity: 1, properties }];\n      if (addon?.id) items.push({ id: addon.id, quantity: 1, properties: { '_HugFig Add-on Type': addon.type || this.addonConfiguration().type, '_HugFig Parent Session ID': sessionId } });\n      const cart = document.querySelector('cart-drawer') || document.querySelector('cart-notification');\n      const payload = { items };\n      if (action === 'cart' && cart?.getSectionsToRender) { payload.sections = cart.getSectionsToRender().map((section) => section.id); payload.sections_url = window.location.pathname; }\n      try {\n        const response = await fetch(`${window.Shopify?.routes?.root || '/'}cart/add.js`, { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, body: JSON.stringify(payload) });\n        const data = await response.json().catch(() => ({})); if (!response.ok) throw new Error(data.description || data.message || 'Unable to add this item.');\n        track('add_to_cart_context', { journey_type: 'ai', has_generated_preview: true, variant_id: variant.id, quantity: 1, value: variant.price / 100, currency: window.Shopify?.currency?.active || 'USD' });\n        if (action === 'buy') { track('checkout_handoff', { journey_type: 'ai', has_generated_preview: true, variant_id: variant.id, quantity: 1, value: variant.price / 100, currency: window.Shopify?.currency?.active || 'USD' }); window.location.href = `${window.Shopify?.routes?.root || '/'}checkout`; return; }\n        if (cart?.renderContents && data.sections) { if (data.items?.[0]) Object.assign(data, data.items[0]); cart.classList.remove('is-empty'); cart.renderContents(data); }\n        else this.toast('Added to cart.');\n      } catch (error) { console.error('HugFig cart error', error); this.toast(error.message || 'Unable to add this item.'); }\n      finally { this.orderSubmitting = false; }\n    }\n    toast(message, { center = false, hold = 4000, fade = 200 } = {}) {\n      const toast = this.root.querySelector('[data-hf-toast]'); if (!toast) return;\n      window.clearTimeout(this.toastTimer);\n      window.clearTimeout(this.toastCleanupTimer);\n      toast.textContent = '';\n      toast.classList.toggle('hf-rb-toast--center', center);\n      window.requestAnimationFrame(() => {\n        toast.textContent = message;\n        toast.classList.add('is-visible');\n      });\n      this.toastTimer = window.setTimeout(() => {\n        toast.classList.remove('is-visible');\n        this.toastCleanupTimer = window.setTimeout(() => {\n          toast.classList.remove('hf-rb-toast--center');\n          toast.textContent = '';\n        }, fade);\n      }, hold);\n    }\n  }\n\n  function boot() {\n    document.querySelectorAll('[data-hf-rebuild-home]').forEach((root) => { if (!root.dataset.hfReady) { root.dataset.hfReady = 'true'; syncDesktopViewport(root); initHome(root); } });\n    document.querySelectorAll('[data-hf-custom-flow]').forEach((root) => { if (!root.dataset.hfReady) { root.dataset.hfReady = 'true'; syncDesktopViewport(root); new CustomFlow(root); } });\n  }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot, { once: true }); else boot();\n  document.addEventListener('shopify:section:load', boot);\n})();\n"],
  "mappings": "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",
  "names": ["highLoaded", "location", "remaining", "error"]
}
