{
  "version": 3,
  "sources": ["/cdn/shop/t/67/assets/personalization.js?hbn_build=20260908-03"],
  "sourcesContent": ["// ==================== SHOPIFY PERSONALIZATION SCRIPT (NO COVER TYPE) ====================\n\nconst DEBUG = false;\nconst HBN_PERSONALIZATION_BUILD = '2026-09-20.13';\n\nwindow.HBN_PERSONALIZATION_BUILD = HBN_PERSONALIZATION_BUILD;\nconsole.info(`[HBN] Personalization build ${HBN_PERSONALIZATION_BUILD} loaded`);\n\n\nfunction t(key, fallback = '') {\n  return window.hbnI18n?.[key] || fallback;\n}\n\n\n// \u2705 GLOBAL VARIABLES (Updated for simplified Step 2)\nlet currentStep = 1;\n//let selectedIllustrationStyle = '3d';\nlet previewImages = [];\nlet currentPreviewIndex = 0;\nlet tracking_id = null;\nlet hbn_token = null;\nlet isGeneratingPreview = false;\nlet setupLocked = false;\nlet workflowPhase = 'draft';\nlet selectedVariant = null;\nlet generationStartedAt = null;\nlet generationDeadlineAt = null;\nlet previewPollPromise = null;\nlet previewPollCancelled = false;\nlet previewExperienceStarted = false;\nlet previewRevealTimer = null;\nlet cartSubmissionInProgress = false;\n\nconst GENERATION_ESTIMATE_MS = 5.5 * 60 * 1000;\nconst FIRST_PREVIEW_POLL_DELAY_MS = 3 * 60 * 1000;\nconst PREVIEW_POLL_INTERVAL_MS = 15 * 1000;\nconst LATE_PREVIEW_POLL_INTERVAL_MS = 30 * 1000;\nconst MAX_PREVIEW_WAIT_MS = 20 * 60 * 1000;\nconst REFUND_CONSENT_INTENTION = 'consent_update';\n\nconst EDITION_VALUES = {\n    pdf: 'PDF',\n    hardcover: 'Hardcover + PDF',\n    padded: 'Padded Hardcover + PDF'\n};\n\n// \uD83D\uDC18 Elephant text spinner (1 line at a time)\nconst ELEPHANT_SPINNER_LINES_FALLBACK = [\n  'Sometimes AI gets playful \u2014 we take care of the final details.',\n  'Want a fresh start? Refresh the page and try again.',\n  'Your complete PDF book is sent within 24 hours.',\n  \"All stories are translated by professionals to preserve their atmosphere\",\n  \"Your child\u2019s character is kept consistent across the story.\",\n  \"No time to wait? Order now and get the full PDF by email within 24 hours.\"\n];\nconst ELEPHANT_DONE_LINE_FALLBACK = 'Hooray! Your magical preview is here!';\n\nlet spinnerIdx = 0;\nlet spinnerInterval = null;\n\nfunction getSpinnerLinesForCurrentLanguage() {\n  const lines = [\n    t('spinnerLine1', ELEPHANT_SPINNER_LINES_FALLBACK[0]),\n    t('spinnerLine2', ELEPHANT_SPINNER_LINES_FALLBACK[1]),\n    t('spinnerLine3', ELEPHANT_SPINNER_LINES_FALLBACK[2]),\n    t('spinnerLine4', ELEPHANT_SPINNER_LINES_FALLBACK[3]),\n    t('spinnerLine5', ELEPHANT_SPINNER_LINES_FALLBACK[4]),\n    t('spinnerLine6', ELEPHANT_SPINNER_LINES_FALLBACK[5])\n  ].filter(Boolean);\n\n  return lines.length ? lines : ELEPHANT_SPINNER_LINES_FALLBACK;\n}\n\nfunction renderSpinnerLine() {\n  const target = document.getElementById('previewAnimatedLines');\n  if (!target) return;\n\n  const lines = getSpinnerLinesForCurrentLanguage();\n  if (!Array.isArray(lines) || lines.length === 0) return;\n\n  target.innerHTML = '';\n\n  const p = document.createElement('p');\n  p.className = 'line';\n  p.textContent = lines[spinnerIdx];\n  target.appendChild(p);\n\n  spinnerIdx = (spinnerIdx + 1) % lines.length;\n}\n\nfunction startLottieTextSpinner() {\n  stopLottieTextSpinner();\n  spinnerIdx = 0;\n  renderSpinnerLine();\n\n  // \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u043C \u0434\u043E\u043B\u044C\u0448\u0435, \u0447\u0442\u043E\u0431\u044B \u0442\u0435\u043A\u0441\u0442 \u0443\u0441\u043F\u0435\u0432\u0430\u043B\u0438 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0442\u044C\n  spinnerInterval = setInterval(renderSpinnerLine, 6000);\n}\n\nfunction stopLottieTextSpinner() {\n  if (spinnerInterval) clearInterval(spinnerInterval);\n  spinnerInterval = null;\n}\n\nfunction showDoneLine() {\n  stopLottieTextSpinner();\n\n  const target = document.getElementById('previewAnimatedLines');\n  if (!target) return;\n\n  target.innerHTML = '';\n\n  const p = document.createElement('p');\n  p.className = 'line';\n  p.textContent = t('doneLine', ELEPHANT_DONE_LINE_FALLBACK);\n  target.appendChild(p);\n}\n\nfunction showSupportInterventionModal(childName) {\n  const modal = document.getElementById('supportInterventionModal');\n  const message = document.getElementById('supportInterventionMessage');\n  const emailButton = document.getElementById('supportEmailBtn');\n\n  if (!modal || !message) return;\n\n  const normalizedName = String(childName || '').trim();\n\n  const fallbackMessage =\n    'It looks like it would be best for us to help you personally. Please contact us, and we will help you get the right result.';\n\n  const messageTemplate = t(\n    'supportInterventionMessage',\n    fallbackMessage\n  );\n\n  message.style.display = 'block';\n\n  message.textContent = messageTemplate.replace(\n    '___NAME___',\n    normalizedName\n  );\n\n  modal.style.display = 'flex';\n  document.body.style.overflow = 'hidden';\n\n  setTimeout(() => {\n    emailButton?.focus();\n  }, 0);\n}\n\nfunction showHelpContactModal() {\n  const modal = document.getElementById('supportInterventionModal');\n  const message = document.getElementById('supportInterventionMessage');\n  const emailButton = document.getElementById('supportEmailBtn');\n\n  if (!modal) return;\n\n  // \u0414\u043B\u044F \u043E\u0431\u044B\u0447\u043D\u043E\u0433\u043E Help \u043D\u0435 \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u043C \u043F\u0435\u0440\u0441\u043E\u043D\u0430\u043B\u044C\u043D\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435\n  if (message) {\n    message.textContent = '';\n    message.style.display = 'none';\n  }\n\n  modal.style.display = 'flex';\n  document.body.style.overflow = 'hidden';\n\n  setTimeout(() => {\n    emailButton?.focus();\n  }, 0);\n}\n\nfunction closeSupportInterventionModal() {\n  const modal = document.getElementById('supportInterventionModal');\n\n  if (!modal) return;\n\n  modal.style.display = 'none';\n  document.body.style.overflow = '';\n}\ndocument.addEventListener('DOMContentLoaded', function () {\n  const modal = document.getElementById('supportInterventionModal');\n  const helpTrigger = document.getElementById('helpContactTrigger');\n  const closeButton = document.getElementById('supportInterventionClose');\n\n  helpTrigger?.addEventListener('click', showHelpContactModal);\n\n  closeButton?.addEventListener(\n    'click',\n    closeSupportInterventionModal\n  );\n\n  // \u0417\u0430\u043A\u0440\u044B\u0442\u0438\u0435 \u043A\u043B\u0438\u043A\u043E\u043C \u043F\u043E \u0437\u0430\u0442\u0435\u043C\u043D\u0451\u043D\u043D\u043E\u043C\u0443 \u0444\u043E\u043D\u0443\n  modal?.addEventListener('click', function (event) {\n    if (event.target === modal) {\n      closeSupportInterventionModal();\n    }\n  });\n\n  // \u0417\u0430\u043A\u0440\u044B\u0442\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448\u0435\u0439 Escape\n  document.addEventListener('keydown', function (event) {\n    if (\n      event.key === 'Escape' &&\n      modal?.style.display === 'flex'\n    ) {\n      closeSupportInterventionModal();\n    }\n  });\n});\n\n\n// ==================== CONFIGURATION ====================\n\nconst WEBHOOK_URL = 'https://automation.herobyname.com/webhook/366e362b-a69c-4cbc-b018-b2cc5c7d6158';\nconst MAX_IMAGE_FILE_SIZE = 10 * 1024 * 1024;\nif (DEBUG) console.log('[HBN] WEBHOOK_URL =', WEBHOOK_URL);\n\n// ==================== ID GENERATION ====================\n\nfunction generateTrackingId() {\n    return crypto.randomUUID();\n}\n\nfunction generateHbnToken() {\n    const randDigit = () => Math.floor(Math.random() * 10);\n    const randChar = () => String.fromCharCode(97 + Math.floor(Math.random() * 26));\n\n    const part1 = `a${randDigit()}0${randChar()}${randDigit()}c${randDigit()}9`;\n    const part2 = `${randChar()}5${randChar()}${randDigit()}`;\n    const part3 = `4${randChar()}${randChar()}${randDigit()}`;\n    const part4 = `${randDigit()}b${randDigit()}7`;\n    const part5 = Array.from({ length: 12 }, randDigit).join('');\n\n    return `${part1}-${part2}-${part3}-${part4}-${part5}`;\n}\n\n// ==================== WEBHOOK FUNCTION ====================\n\nasync function sendToWebhook(formData, intention) {\n    if (DEBUG) console.log(`Sending ${intention} to webhook...`);\n\n    formData.set('intention', intention);\n    formData.set('timestamp', Date.now().toString());\n\n    if (DEBUG) {\n        console.log('Request data:');\n        for (const [key, value] of formData.entries()) {\n            if (value instanceof File) {\n                console.log(`${key}: [File] ${value.name} (${value.size} bytes)`);\n            } else {\n                console.log(`${key}: ${value}`);\n            }\n        }\n    }\n\n    let response;\n\n    try {\n        response = await fetch(WEBHOOK_URL, {\n            method: 'POST',\n            body: formData\n        });\n    } catch (error) {\n        console.error(`Webhook network error for ${intention}:`, error);\n        throw error;\n    }\n\n    const responseText = await response.text();\n    let responseData;\n    let parsedAsJson = false;\n\n    if (!responseText) {\n        responseData = {};\n    } else {\n        try {\n            responseData = JSON.parse(responseText);\n            parsedAsJson = true;\n        } catch {\n            responseData = { message: responseText };\n        }\n    }\n\n    if (DEBUG) {\n        console.log('Webhook response:', {\n            intention,\n            status: response.status,\n            ok: response.ok,\n            data: responseData\n        });\n    }\n\n    if (!response.ok) {\n        const errorMessage =\n            typeof responseData?.message === 'string'\n                ? responseData.message\n                : typeof responseData?.error === 'string'\n                    ? responseData.error\n                    : typeof responseData?.error?.message === 'string'\n                        ? responseData.error.message\n                        : `Webhook request failed with status ${response.status}`;\n\n        const error = new Error(errorMessage);\n        error.status = response.status;\n        error.response = responseData;\n\n        console.error(`Webhook HTTP error for ${intention}:`, {\n            status: response.status,\n            data: responseData\n        });\n\n        throw error;\n    }\n\n    if (!responseText || parsedAsJson) {\n        return responseData;\n    }\n\n    return {\n        message: responseText,\n        success: true\n    };\n}\n\n// Same as sendToWebhook but returns headers + status too (for Retry-After)\nasync function postWebhookWithHeaders(formData) {\n  try {\n    const res = await fetch(WEBHOOK_URL, { method: 'POST', body: formData });\n\n    const raw = await res.text();\n    let json;\n    try { json = JSON.parse(raw); } catch { json = { message: raw }; }\n\n    return {\n      ok: res.ok,\n      status: res.status,\n      headers: res.headers,\n      json\n    };\n  } catch (err) {\n    console.error('\u274C postWebhookWithHeaders error:', err);\n    throw err;\n  }\n}\n\n// ==================== INITIALIZATION ====================\n\nfunction getProductHandleFromPage() {\n    const configuredHandle = window.personalizationConfig?.productHandle;\n    if (configuredHandle) return configuredHandle;\n\n    const productUrl = document.querySelector('variant-picker[data-product-url]')?.dataset.productUrl || '';\n    const match = productUrl.match(/\\/products\\/([^/?#]+)/);\n    return match?.[1] || '';\n}\n\nfunction normalizeAjaxVariant(variant, productHandle) {\n    const optionValues = Array.isArray(variant?.options) && variant.options.length\n        ? variant.options\n        : [variant?.option1, variant?.option2, variant?.option3].filter(value => value != null);\n\n    return {\n        id: Number(variant?.id),\n        title: String(variant?.title || ''),\n        sku: String(variant?.sku || ''),\n        handle: productHandle,\n        price: Number(variant?.price || 0),\n        options: optionValues,\n        available: variant?.available !== false\n    };\n}\n\nasync function hydrateShopifyVariantData() {\n    const config = window.personalizationConfig || {};\n    const productHandle = getProductHandleFromPage();\n\n    if (!productHandle) {\n        console.warn('[HBN] Product handle was not found. Falling back to Liquid variant data.');\n        return false;\n    }\n\n    const shopRoot = window.Shopify?.routes?.root || '/';\n    const normalizedRoot = shopRoot.endsWith('/') ? shopRoot : `${shopRoot}/`;\n    const productEndpoint = `${normalizedRoot}products/${encodeURIComponent(productHandle)}.js`;\n\n    try {\n        const response = await fetch(productEndpoint, {\n            method: 'GET',\n            headers: { Accept: 'application/json' },\n            credentials: 'same-origin',\n            cache: 'no-store'\n        });\n\n        if (!response.ok) {\n            throw new Error(`Shopify Product API returned ${response.status}`);\n        }\n\n        const productData = await response.json();\n        const ajaxVariants = Array.isArray(productData?.variants)\n            ? productData.variants.map(variant => normalizeAjaxVariant(variant, productHandle))\n            : [];\n\n        if (!ajaxVariants.length) {\n            throw new Error('Shopify Product API returned no variants');\n        }\n\n        const ajaxOptionNames = Array.isArray(productData?.options)\n            ? productData.options\n                .map(option => typeof option === 'string' ? option : option?.name)\n                .filter(Boolean)\n            : [];\n\n        // Keep Liquid variants as a fallback if Shopify's Ajax response is\n        // incomplete. Ajax values win because they reflect the active market.\n        const mergedVariantMap = new Map();\n        (Array.isArray(config.variants) ? config.variants : []).forEach(variant => {\n            const variantId = Number(variant?.id);\n            if (variantId) mergedVariantMap.set(variantId, variant);\n        });\n        ajaxVariants.forEach(variant => {\n            if (variant.id) mergedVariantMap.set(variant.id, variant);\n        });\n        const mergedVariants = Array.from(mergedVariantMap.values());\n\n        window.personalizationConfig = {\n            ...config,\n            productId: Number(productData.id || config.productId || 0),\n            productHandle,\n            productTitle: productData.title || config.productTitle || '',\n            optionNames: ajaxOptionNames.length ? ajaxOptionNames : config.optionNames || [],\n            variants: mergedVariants,\n            variantSource: 'shopify-product-api'\n        };\n\n        window.HBN_VARIANT_DIAGNOSTICS = {\n            build: HBN_PERSONALIZATION_BUILD,\n            source: window.personalizationConfig.variantSource,\n            endpoint: productEndpoint,\n            optionNames: window.personalizationConfig.optionNames,\n            ajaxVariantCount: ajaxVariants.length,\n            liquidVariantCount: Array.isArray(config.variants) ? config.variants.length : 0,\n            resolutionMatrix: [\n                [EDITION_VALUES.pdf, 'No'],\n                [EDITION_VALUES.pdf, 'Yes'],\n                [EDITION_VALUES.hardcover, 'No'],\n                [EDITION_VALUES.hardcover, 'Yes'],\n                [EDITION_VALUES.padded, 'No'],\n                [EDITION_VALUES.padded, 'Yes']\n            ].map(([edition, extras]) => {\n                const resolved = resolveVariant(edition, extras);\n                return {\n                    edition,\n                    extras,\n                    id: resolved?.id || null,\n                    price: resolved?.price ?? null,\n                    available: resolved?.available ?? false\n                };\n            }),\n            variants: mergedVariants.map(variant => ({\n                id: variant.id,\n                title: variant.title,\n                price: variant.price,\n                available: variant.available,\n                options: variant.options,\n                selection: getVariantSelection(variant)\n            }))\n        };\n\n        console.info('[HBN] Shopify variants loaded', window.HBN_VARIANT_DIAGNOSTICS);\n        return true;\n    } catch (error) {\n        window.personalizationConfig = {\n            ...config,\n            variantSource: 'liquid-fallback'\n        };\n\n        window.HBN_VARIANT_DIAGNOSTICS = {\n            build: HBN_PERSONALIZATION_BUILD,\n            source: window.personalizationConfig.variantSource,\n            error: error.message,\n            optionNames: config.optionNames || [],\n            variants: config.variants || []\n        };\n\n        console.warn('[HBN] Could not refresh variants from Shopify. Using Liquid data.', error);\n        return false;\n    }\n}\n\nfunction applyDefaultProductConfiguration() {\n    const hardcover = document.querySelector('input[name=\"book_format\"][value=\"hardcover\"]');\n    const standardCover = document.querySelector('input[name=\"cover_type\"][value=\"standard\"]');\n    const noExtras = document.querySelector('input[name=\"extras_enabled\"][value=\"no\"]');\n\n    if (hardcover) hardcover.checked = true;\n    if (standardCover) standardCover.checked = true;\n    if (noExtras) noExtras.checked = true;\n}\n\ndocument.addEventListener('DOMContentLoaded', function() {\n    if (DEBUG) console.log('\uD83D\uDE80 HBN personalization system initializing...');\n\n    tracking_id = generateTrackingId();\n    hbn_token   = generateHbnToken();\n    if (DEBUG) console.log('\uD83C\uDD94 Generated tracking_id:', tracking_id);\n\n    // \u2705 \u0411\u0410\u0413 \u0424\u0418\u041A\u0421 4: \u0423\u0431\u0438\u0440\u0430\u0435\u043C \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0443 \u0441\u043A\u0440\u043E\u043B\u043B\u0430 \u043F\u0440\u0438 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438\n    document.body.style.overflow = '';\n\n    setTimeout(() => {\n        if (window.personalizationConfigReady) {\n            initializePersonalization();\n        } else {\n            const checkConfig = setInterval(() => {\n                if (window.personalizationConfigReady) {\n                    clearInterval(checkConfig);\n                    initializePersonalization();\n                }\n            }, 100);\n        }\n    }, 100);\n});\n\nasync function initializePersonalization() {\n    if (DEBUG) console.log('\u2705 Initializing personalization...');\n\n    const section = document.getElementById('hbn-personalization');\n    if (section) section.dataset.hbnScriptBuild = HBN_PERSONALIZATION_BUILD;\n\n    await hydrateShopifyVariantData();\n    applyDefaultProductConfiguration();\n\n    // \u2705 \u0422\u041E\u041B\u042C\u041A\u041E \u0418\u041D\u0418\u0426\u0418\u0410\u041B\u0418\u0417\u0410\u0426\u0418\u042F UI - \u0411\u0415\u0417 \u0417\u0410\u041F\u0420\u041E\u0421\u041E\u0412!\n    initializeStep1();\n    initializeGlobalNavigation();\n    updatePhotoButtonsVisibility();\n    setupDragAndDrop();\n    initializePhotoHandlers();\n    setupProductConfigurator();\n    setupRefundPolicyConsent();\n    showStep(1);\n\n    //setTimeout(initializeDefaultStyle, 200);  //for Illustration style\n\n    //console.log('\u2705 HBN personalization system ready - NO AUTO REQUESTS!');\n}\n\n// ==================== STEP 1: BASIC DATA ====================\n\nfunction initializeStep1() {\n    // \u2705 \u0422\u041E\u041B\u042C\u041A\u041E UI \u0418\u041D\u0418\u0426\u0418\u0410\u041B\u0418\u0417\u0410\u0426\u0418\u042F - \u0411\u0415\u0417 WEBHOOK \u0417\u0410\u041F\u0420\u041E\u0421\u041E\u0412!\n    updateStepIndicator();\n    setupGenderSelection();\n    setupFormValidation();\n    setupLanguageSelection();\n    setupEyeColorField();\n    setupStep1Extras();\n\n    // \u2705 \u041D\u0415 \u041E\u0422\u041F\u0420\u0410\u0412\u041B\u042F\u0415\u041C \u0417\u0410\u041F\u0420\u041E\u0421\u042B \u041F\u0420\u0418 \u0418\u041D\u0418\u0426\u0418\u0410\u041B\u0418\u0417\u0410\u0426\u0418\u0418\n    setTimeout(initializePhotoHandlers, 100);\n\n    if (DEBUG) console.log('1\uFE0F\u20E3 Step 1 initialized - UI ONLY, no requests');\n}\n\nfunction setupGenderSelection() {\n    const group = document.querySelector('#personalizationFormWrapper .gender-selection');\n    if (!group) return;\n\n    // Liquid keeps both choices visible and sets availability from custom.gender.\n    const radios = Array.from(group.querySelectorAll('input[name=\"gender\"]'));\n    const syncSelection = () => {\n        radios.forEach(radio => {\n            radio.closest('.gender-option')?.classList.toggle('selected', radio.checked && !radio.disabled);\n        });\n    };\n\n    radios.forEach(radio => {\n        // Discard a restored checked state if this book does not support it.\n        if (radio.disabled) radio.checked = false;\n        radio.setAttribute('aria-disabled', String(radio.disabled));\n        radio.closest('.gender-option')?.classList.toggle('is-disabled', radio.disabled);\n        radio.onchange = () => {\n            if (radio.disabled) radio.checked = false;\n            syncSelection();\n            if (DEBUG && radio.checked) console.log('Gender selected:', radio.value);\n        };\n    });\n\n    const availableRadios = radios.filter(radio => !radio.disabled);\n    if (availableRadios.length === 1) availableRadios[0].checked = true;\n    syncSelection();\n}\n\nfunction setupLanguageSelection() {\n    const languageSelect = document.getElementById('bookLanguage');\n    if (languageSelect) {\n        languageSelect.addEventListener('change', function() {\n            this.style.borderColor = this.value ? '#28a745' : '#e9ecef';\n            updateConfiguratorSummary();\n            if (DEBUG) console.log('\uD83C\uDF0D Language selected:', this.value);\n        });\n    }\n}\n\nfunction normalizeOptionValue(value) {\n    return String(value || '').trim().toLowerCase();\n}\n\nfunction canonicalEditionValue(value) {\n    const normalized = normalizeOptionValue(value);\n\n    if (normalized.includes('padded') && normalized.includes('hardcover')) return 'padded';\n    if (normalized.includes('hardcover')) return 'hardcover';\n    if (\n        normalized === 'pdf' ||\n        normalized.includes('pdf only') ||\n        normalized.includes('only pdf')\n    ) {\n        return 'pdf';\n    }\n\n    return normalized;\n}\n\nfunction canonicalExtrasValue(value) {\n    const normalized = normalizeOptionValue(value);\n\n    if (\n        normalized === 'yes' ||\n        normalized === 'add extras' ||\n        normalized === 'w extras' ||\n        normalized === 'with extras' ||\n        normalized.includes('add extra') ||\n        normalized.includes('with extra')\n    ) {\n        return 'yes';\n    }\n\n    if (\n        normalized === 'no' ||\n        normalized === 'no extras' ||\n        normalized === 'without extras' ||\n        normalized.includes('without extra')\n    ) {\n        return 'no';\n    }\n\n    return normalized;\n}\n\nfunction getSelectedEditionValue() {\n    const format = document.querySelector('input[name=\"book_format\"]:checked')?.value || 'pdf';\n\n    if (format === 'pdf') return EDITION_VALUES.pdf;\n\n    const cover = document.querySelector('input[name=\"cover_type\"]:checked')?.value || 'standard';\n    return cover === 'padded' ? EDITION_VALUES.padded : EDITION_VALUES.hardcover;\n}\n\nfunction isExtrasEnabled() {\n    return document.querySelector('input[name=\"extras_enabled\"]:checked')?.value === 'yes';\n}\n\nfunction getSelectedExtrasValue() {\n    return isExtrasEnabled() ? 'Yes' : 'No';\n}\n\nfunction findProductOptionIndex(optionName, fallbackIndex) {\n    const names = window.personalizationConfig?.optionNames || [];\n    const index = names.findIndex(name => normalizeOptionValue(name) === normalizeOptionValue(optionName));\n    return index >= 0 ? index : fallbackIndex;\n}\n\nfunction parseCombinedVariantValue(value) {\n    const parts = String(value || '')\n        .split('|')\n        .map(part => part.trim())\n        .filter(Boolean);\n\n    if (parts.length < 2) return null;\n\n    return {\n        edition: parts.slice(0, -1).join(' | '),\n        extras: parts[parts.length - 1]\n    };\n}\n\nfunction getCombinedSelectionFromValue(value) {\n    const parsed = parseCombinedVariantValue(value);\n    if (!parsed) return null;\n\n    return {\n        edition: canonicalEditionValue(parsed.edition),\n        extras: canonicalExtrasValue(parsed.extras)\n    };\n}\n\nfunction getVariantSelectionFromSku(sku) {\n    const normalizedSku = String(sku || '')\n        .trim()\n        .toLowerCase()\n        .replace(/[_\\s]+/g, '-');\n    const match = normalizedSku.match(\n        /(?:^|-)(padded-hardcover|padded-hc|phc|hardcover|hc|pdf)-(no|yes)(?:-extras)?$/\n    );\n\n    if (!match) return null;\n\n    const editionToken = match[1];\n    const edition = editionToken === 'pdf'\n        ? 'pdf'\n        : ['phc', 'padded-hc', 'padded-hardcover'].includes(editionToken)\n            ? 'padded'\n            : 'hardcover';\n\n    return {\n        edition,\n        extras: match[2]\n    };\n}\n\nfunction getVariantSelection(variant) {\n    // SKU is not translated by Shopify, so it is the stable primary key for\n    // Edition + Extras on every storefront language.\n    const skuSelection = getVariantSelectionFromSku(variant?.sku);\n    if (skuSelection) return skuSelection;\n\n    // Keep text matching only as a fallback for legacy products without the\n    // expected SKU suffix.\n    const options = Array.isArray(variant?.options) ? variant.options : [];\n    const optionNames = window.personalizationConfig?.optionNames || [];\n    const combinedOptionIndex = optionNames.findIndex(name => {\n        const normalized = normalizeOptionValue(name);\n        return normalized.includes('edition') && normalized.includes('extras');\n    });\n\n    if (combinedOptionIndex >= 0 || options.length === 1) {\n        const combinedCandidates = [\n            options[combinedOptionIndex >= 0 ? combinedOptionIndex : 0],\n            variant?.title\n        ];\n\n        for (const candidate of combinedCandidates) {\n            const selection = getCombinedSelectionFromValue(candidate);\n            if (selection) return selection;\n        }\n    }\n\n    const editionIndex = findProductOptionIndex('Edition', 0);\n    const extrasIndex = findProductOptionIndex('Extras', 1);\n\n    return {\n        edition: canonicalEditionValue(options[editionIndex]),\n        extras: canonicalExtrasValue(options[extrasIndex])\n    };\n}\n\nfunction findThemePickerVariantId(requestedEdition, requestedExtras) {\n    const productId = String(window.personalizationConfig?.productId || '');\n    const selector = productId\n        ? `variant-picker[data-product-id=\"${productId}\"] option[data-variant-id]`\n        : 'variant-picker option[data-variant-id]';\n\n    for (const option of document.querySelectorAll(selector)) {\n        const selection = getCombinedSelectionFromValue(option.value || option.textContent);\n        if (!selection) continue;\n\n        if (\n            selection.edition === requestedEdition &&\n            selection.extras === requestedExtras\n        ) {\n            const variantId = Number(option.dataset.variantId || 0);\n            if (variantId) return variantId;\n        }\n    }\n\n    return null;\n}\n\nfunction resolveVariant(edition = getSelectedEditionValue(), extras = getSelectedExtrasValue()) {\n    const variants = window.personalizationConfig?.variants || [];\n    const requestedEdition = canonicalEditionValue(edition);\n    const requestedExtras = canonicalExtrasValue(extras);\n\n    const matchedByOptions = variants.find(variant => {\n        const selection = getVariantSelection(variant);\n        return selection.edition === requestedEdition && selection.extras === requestedExtras;\n    });\n\n    if (matchedByOptions) return matchedByOptions;\n\n    // Horizon exposes the exact selected-value \u2192 variant-ID mapping in its\n    // variant picker. This also covers unusual option labels or stale titles.\n    const themePickerVariantId = findThemePickerVariantId(requestedEdition, requestedExtras);\n    if (themePickerVariantId) {\n        const matchedByThemePicker = variants.find(\n            variant => Number(variant?.id) === themePickerVariantId\n        );\n        if (matchedByThemePicker) return matchedByThemePicker;\n    }\n\n    return null;\n}\n\nfunction getAvailableVariantSelections() {\n    const variants = window.personalizationConfig?.variants || [];\n    const supportedEditions = new Set(['pdf', 'hardcover', 'padded']);\n    const supportedExtras = new Set(['no', 'yes']);\n    const selections = new Map();\n\n    variants.forEach(variant => {\n        if (!variant || variant.available === false) return;\n\n        const selection = getVariantSelection(variant);\n        if (\n            !supportedEditions.has(selection.edition) ||\n            !supportedExtras.has(selection.extras)\n        ) {\n            return;\n        }\n\n        const key = `${selection.edition}|${selection.extras}`;\n        if (!selections.has(key)) selections.set(key, selection);\n    });\n\n    return Array.from(selections.values());\n}\n\nfunction findAvailableSelection(availableSelections, edition, extras) {\n    const requestedEdition = canonicalEditionValue(edition);\n    const requestedExtras = canonicalExtrasValue(extras);\n\n    return availableSelections.find(selection => (\n        selection.edition === requestedEdition &&\n        selection.extras === requestedExtras\n    )) || null;\n}\n\nfunction chooseAvailableSelection(availableSelections, edition, extras) {\n    if (!availableSelections.length) return null;\n\n    const requestedEdition = canonicalEditionValue(edition);\n    const requestedExtras = canonicalExtrasValue(extras);\n    const otherPrintEdition = requestedEdition === 'hardcover'\n        ? 'padded'\n        : requestedEdition === 'padded'\n            ? 'hardcover'\n            : null;\n\n    // Never change Extras while choosing a fallback edition. Otherwise a cover\n    // change on Step 1 could silently turn No extras into Add extras.\n    const priorities = [[requestedEdition, requestedExtras]];\n\n    if (otherPrintEdition) {\n        priorities.push([otherPrintEdition, requestedExtras]);\n    }\n\n    priorities.push(\n        ['hardcover', requestedExtras],\n        ['padded', requestedExtras],\n        ['pdf', requestedExtras]\n    );\n\n    for (const [candidateEdition, candidateExtras] of priorities) {\n        const match = findAvailableSelection(\n            availableSelections,\n            candidateEdition,\n            candidateExtras\n        );\n        if (match) return match;\n    }\n\n    return null;\n}\n\nfunction selectConfiguratorVariant(selection) {\n    if (!selection) return;\n\n    const formatValue = selection.edition === 'pdf' ? 'pdf' : 'hardcover';\n    const coverValue = selection.edition === 'padded' ? 'padded' : 'standard';\n    const extrasValue = selection.extras === 'yes' ? 'yes' : 'no';\n\n    const formatInput = document.querySelector(\n        `input[name=\"book_format\"][value=\"${formatValue}\"]`\n    );\n    const coverInput = document.querySelector(\n        `input[name=\"cover_type\"][value=\"${coverValue}\"]`\n    );\n    const extrasInput = document.querySelector(\n        `input[name=\"extras_enabled\"][value=\"${extrasValue}\"]`\n    );\n\n    if (formatInput) formatInput.checked = true;\n    if (coverInput) coverInput.checked = true;\n    if (extrasInput) extrasInput.checked = true;\n}\n\nfunction setConfiguratorChoiceAvailability(input, available) {\n    if (!input) return;\n\n    const choice = input.closest('.hbn-config-choice');\n    input.disabled = !available;\n    input.setAttribute('aria-disabled', available ? 'false' : 'true');\n\n    if (choice) {\n        choice.hidden = !available;\n        choice.classList.toggle('hbn-variant-choice-unavailable', !available);\n        choice.setAttribute('aria-hidden', available ? 'false' : 'true');\n    }\n}\n\nfunction applyAvailableVariantConfiguration() {\n    const availableSelections = getAvailableVariantSelections();\n\n    // If Shopify reports no available variants at all, keep the controls\n    // visible so validation can show the normal unavailable message.\n    if (!availableSelections.length) return;\n\n    const requestedEdition = canonicalEditionValue(getSelectedEditionValue());\n    const requestedExtras = canonicalExtrasValue(getSelectedExtrasValue());\n    const selectedAvailable = findAvailableSelection(\n        availableSelections,\n        requestedEdition,\n        requestedExtras\n    );\n\n    selectConfiguratorVariant(\n        selectedAvailable || chooseAvailableSelection(\n            availableSelections,\n            requestedEdition,\n            requestedExtras\n        )\n    );\n\n    const hasSelection = (edition, extras) => Boolean(\n        findAvailableSelection(availableSelections, edition, extras)\n    );\n    const hasEdition = edition => (\n        hasSelection(edition, 'no') || hasSelection(edition, 'yes')\n    );\n\n    setConfiguratorChoiceAvailability(\n        document.querySelector('input[name=\"book_format\"][value=\"pdf\"]'),\n        hasEdition('pdf')\n    );\n    setConfiguratorChoiceAvailability(\n        document.querySelector('input[name=\"book_format\"][value=\"hardcover\"]'),\n        hasEdition('hardcover') || hasEdition('padded')\n    );\n    setConfiguratorChoiceAvailability(\n        document.querySelector('input[name=\"cover_type\"][value=\"standard\"]'),\n        hasEdition('hardcover')\n    );\n    setConfiguratorChoiceAvailability(\n        document.querySelector('input[name=\"cover_type\"][value=\"padded\"]'),\n        hasEdition('padded')\n    );\n\n    const activeEdition = canonicalEditionValue(getSelectedEditionValue());\n    setConfiguratorChoiceAvailability(\n        document.querySelector('input[name=\"extras_enabled\"][value=\"no\"]'),\n        hasSelection(activeEdition, 'no')\n    );\n    setConfiguratorChoiceAvailability(\n        document.querySelector('input[name=\"extras_enabled\"][value=\"yes\"]'),\n        hasSelection(activeEdition, 'yes')\n    );\n}\n\nfunction formatMoney(cents) {\n    const amount = Number(cents || 0) / 100;\n    const currency = window.personalizationConfig?.currency || 'EUR';\n\n    try {\n        return new Intl.NumberFormat(document.documentElement.lang || undefined, {\n            style: 'currency',\n            currency\n        }).format(amount);\n    } catch {\n        return `${amount.toFixed(2)} ${currency}`;\n    }\n}\n\nfunction formatSurcharge(cents) {\n    const value = Number(cents || 0);\n    return value > 0 ? `+${formatMoney(value)}` : t('included', 'free');\n}\n\nfunction getStartingPriceText(cents) {\n    const formattedPrice = formatMoney(cents);\n    const template = t('priceFromTemplate', 'From __HBN_PRICE__');\n\n    if (!template.includes('__HBN_PRICE__') || normalizeOptionValue(template).includes('translation missing')) {\n        return `From ${formattedPrice}`;\n    }\n\n    return template.replace('__HBN_PRICE__', formattedPrice);\n}\n\nfunction lockProductInformationStartingPrice() {\n    const baseVariant = resolveVariant(EDITION_VALUES.hardcover, 'No');\n    const personalizationSection = document.getElementById('hbn-personalization');\n    const productId = String(window.personalizationConfig?.productId || '');\n\n    if (!baseVariant || !personalizationSection || !productId) return;\n\n    const expectedText = getStartingPriceText(baseVariant.price);\n    const expectedComparableText = expectedText.replace(/\\s+/g, ' ').trim();\n    const priceBlocks = Array.from(\n        document.querySelectorAll(`product-price[data-product-id=\"${productId}\"]`)\n    ).filter(block => {\n        if (block.closest('#hbn-personalization')) return false;\n        return Boolean(block.compareDocumentPosition(personalizationSection) & Node.DOCUMENT_POSITION_FOLLOWING);\n    });\n\n    priceBlocks.forEach(priceBlock => {\n        const renderStartingPrice = () => {\n            const priceContainer = priceBlock.querySelector('[ref=\"priceContainer\"]');\n            if (!priceContainer) return;\n\n            const currentText = priceContainer.textContent.replace(/\\s+/g, ' ').trim();\n            if (currentText === expectedComparableText && priceContainer.dataset.hbnStartingPrice === 'true') return;\n\n            const price = document.createElement('span');\n            price.className = 'price';\n            price.textContent = expectedText;\n\n            priceContainer.replaceChildren(price);\n            priceContainer.dataset.hbnStartingPrice = 'true';\n        };\n\n        renderStartingPrice();\n\n        if (priceBlock.dataset.hbnStartingPriceObserver === 'true') return;\n\n        const observer = new MutationObserver(renderStartingPrice);\n        observer.observe(priceBlock, { childList: true, subtree: true, characterData: true });\n        priceBlock.dataset.hbnStartingPriceObserver = 'true';\n    });\n}\n\nfunction renderConfiguratorChoiceState(groupName) {\n    document.querySelectorAll(`input[name=\"${groupName}\"]`).forEach(input => {\n        input.closest('.hbn-config-choice')?.classList.toggle('selected', input.checked);\n    });\n}\n\nfunction getDetailedExtrasSummaryLabel(extras) {\n    if (extras !== 'Yes') {\n        return t('summaryNoExtras', t('extrasNo', 'No extras'));\n    }\n\n    const animalType = getSelectedExtraType('animal_type');\n    const objectType = getSelectedExtraType('object_type');\n    const hasObject = objectType !== 'none';\n\n    if (animalType === 'pet' && hasObject) {\n        return t('summaryPetObject', 'Pet and object');\n    }\n\n    if (animalType === 'favorite_animal' && hasObject) {\n        return t('summaryAnimalObject', 'Animal and object');\n    }\n\n    if (animalType === 'pet') {\n        return t('summaryPet', 'Pet');\n    }\n\n    if (animalType === 'favorite_animal') {\n        return t('summaryFavoriteAnimal', 'Favorite animal');\n    }\n\n    if (hasObject) {\n        return t('summaryObject', 'Object');\n    }\n\n    return t('extrasYes', 'Add special details');\n}\n\nfunction updateConfiguratorSummary() {\n    const edition = getSelectedEditionValue();\n    const extras = getSelectedExtrasValue();\n    const variant = resolveVariant(edition, extras);\n    const languageSelect = document.getElementById('bookLanguage');\n\n    const pdfNo = resolveVariant(EDITION_VALUES.pdf, 'No');\n    const hardcoverNo = resolveVariant(EDITION_VALUES.hardcover, 'No');\n    const paddedNo = resolveVariant(EDITION_VALUES.padded, 'No');\n    const sameEditionNo = resolveVariant(edition, 'No');\n    const sameEditionYes = resolveVariant(edition, 'Yes');\n\n    const editionLabels = {\n        [EDITION_VALUES.pdf]: t('editionPdf', 'PDF'),\n        [EDITION_VALUES.hardcover]: t('editionHardcover', 'Hardcover + PDF'),\n        [EDITION_VALUES.padded]: t('editionPadded', 'Padded Hardcover + PDF')\n    };\n\n    const summaryEditionLabel = document.getElementById('summaryEditionLabel');\n    const summaryEditionPrice = document.getElementById('summaryEditionPrice');\n    const summaryLanguage = document.getElementById('summaryLanguage');\n    const summaryExtrasLabel = document.getElementById('summaryExtrasLabel');\n    const summaryExtrasPrice = document.getElementById('summaryExtrasPrice');\n    const summaryTotal = document.getElementById('summaryTotal');\n\n    if (summaryEditionLabel) summaryEditionLabel.textContent = editionLabels[edition] || edition;\n    if (summaryEditionPrice) {\n        summaryEditionPrice.textContent = sameEditionNo\n            ? formatMoney(sameEditionNo.price)\n            : '\u2014';\n    }\n    if (summaryLanguage) {\n        summaryLanguage.textContent = languageSelect?.value\n            ? languageSelect.options[languageSelect.selectedIndex]?.text || languageSelect.value\n            : '\u2014';\n    }\n    if (summaryExtrasLabel) {\n        summaryExtrasLabel.textContent = getDetailedExtrasSummaryLabel(extras);\n    }\n    if (summaryExtrasPrice) {\n        summaryExtrasPrice.textContent = extras === 'Yes' && sameEditionYes && sameEditionNo\n            ? formatMoney(sameEditionYes.price - sameEditionNo.price)\n            : formatMoney(0);\n    }\n    if (summaryTotal) summaryTotal.textContent = variant ? formatMoney(variant.price) : '\u2014';\n\n    const pdfPrice = document.getElementById('pdfEditionPrice');\n    const hardcoverPrice = document.getElementById('hardcoverEditionPrice');\n    const paddedSurcharge = document.getElementById('paddedCoverSurcharge');\n    const extrasSurcharge = document.getElementById('extrasSurcharge');\n\n    if (pdfPrice) pdfPrice.textContent = pdfNo ? formatMoney(pdfNo.price) : '';\n    if (hardcoverPrice) hardcoverPrice.textContent = hardcoverNo ? formatMoney(hardcoverNo.price) : '';\n    if (paddedSurcharge) {\n        paddedSurcharge.textContent = paddedNo && hardcoverNo\n            ? formatSurcharge(paddedNo.price - hardcoverNo.price)\n            : '';\n    }\n    if (extrasSurcharge) {\n        extrasSurcharge.textContent = sameEditionYes && sameEditionNo\n            ? formatSurcharge(sameEditionYes.price - sameEditionNo.price)\n            : '';\n    }\n}\n\nfunction renderBookConfiguration() {\n    applyAvailableVariantConfiguration();\n    renderConfiguratorChoiceState('book_format');\n    renderConfiguratorChoiceState('cover_type');\n    renderConfiguratorChoiceState('extras_enabled');\n\n    const isHardcover = document.querySelector('input[name=\"book_format\"]:checked')?.value === 'hardcover';\n    const coverSection = document.getElementById('coverTypeSection');\n\n    if (coverSection) {\n        coverSection.hidden = !isHardcover;\n        coverSection.classList.toggle('hidden', !isHardcover);\n    }\n\n    updateConfiguratorSummary();\n    refreshRefundPolicyConsentUI();\n}\n\nfunction renderExtrasPackage() {\n    applyAvailableVariantConfiguration();\n    renderConfiguratorChoiceState('extras_enabled');\n    renderConfiguratorChoiceState('book_format');\n    renderConfiguratorChoiceState('cover_type');\n\n    const panel = document.getElementById('step1ExtrasPanel');\n    const enabled = isExtrasEnabled();\n\n    if (panel) {\n        panel.hidden = !enabled;\n        panel.classList.toggle('hidden', !enabled);\n        panel.classList.toggle('active', enabled);\n        panel.setAttribute('aria-hidden', enabled ? 'false' : 'true');\n    }\n\n    if (enabled) renderStep1ExtraFields();\n    updateConfiguratorSummary();\n}\n\nfunction setupProductConfigurator() {\n    ['book_format', 'cover_type'].forEach(groupName => {\n        document.querySelectorAll(`input[name=\"${groupName}\"]`).forEach(input => {\n            input.onchange = renderBookConfiguration;\n        });\n    });\n\n    document.querySelectorAll('input[name=\"extras_enabled\"]').forEach(input => {\n        input.onchange = renderExtrasPackage;\n    });\n\n    renderBookConfiguration();\n    renderExtrasPackage();\n    lockProductInformationStartingPrice();\n}\n\nfunction validateBookStep() {\n    const variant = resolveVariant();\n    const errors = [];\n\n    if (!variant || !variant.available) {\n        errors.push(t('errorVariantUnavailable', 'This combination is currently unavailable.'));\n    }\n\n    if (errors.length) {\n        showError(errors.map(error => `\u2022 ${error}`).join('\\n'));\n        return false;\n    }\n\n    selectedVariant = variant;\n    return true;\n}\n\nfunction setupEyeColorField() {\n    const eyeColorSelect = document.getElementById('eyeColorSelect');\n    const eyeColorManualGroup = document.getElementById('eyeColorManualGroup');\n    const eyeColorManual = document.getElementById('eyeColorManual');\n\n    if (!eyeColorSelect || !eyeColorManualGroup || !eyeColorManual) return;\n\n    const toggleManualField = () => {\n        const isManual = eyeColorSelect.value === 'manual';\n\n        eyeColorManualGroup.classList.toggle('hidden', !isManual);\n        eyeColorManualGroup.style.display = isManual ? 'block' : 'none';\n\n        // Manual input is required only when \"Enter manually\" is selected\n        eyeColorManual.required = isManual;\n        eyeColorManual.setAttribute(\n            'aria-required',\n            isManual ? 'true' : 'false'\n        );\n\n        if (!isManual) {\n            eyeColorManual.value = '';\n            eyeColorManual.style.borderColor = '';\n        }\n    };\n\n    // Using onchange instead of addEventListener prevents duplicate\n    // handlers when the user returns to Step 1\n    eyeColorSelect.onchange = function () {\n        this.style.borderColor = this.value\n            ? '#28a745'\n            : '#e9ecef';\n\n        toggleManualField();\n    };\n\n    eyeColorManual.oninput = function () {\n        // Allows letters from all supported languages, spaces and hyphens\n        const cleaned = this.value.replace(/[^\\p{L}\\s-]/gu, '');\n\n        if (cleaned !== this.value) {\n            this.value = cleaned;\n        }\n\n        this.style.borderColor = this.value.trim()\n            ? '#28a745'\n            : '#e9ecef';\n    };\n\n    toggleManualField();\n}\n\nfunction getEyeColorValue() {\n    const eyeColorSelect = document.getElementById('eyeColorSelect');\n    const eyeColorManual = document.getElementById('eyeColorManual');\n\n    if (!eyeColorSelect?.value) return '';\n\n    if (eyeColorSelect.value === 'manual') {\n        return eyeColorManual?.value?.trim() || '';\n    }\n\n    const map = {\n        blue: 'Blue',\n        gray: 'Gray',\n        green: 'Green',\n        hazel: 'Hazel',\n        brown: 'Brown',\n        dark_brown: 'Dark brown'\n    };\n\n    return map[eyeColorSelect.value] || '';\n}\n\nfunction setupFormValidation() {\n  const childNameInput = document.getElementById('childName');\n  if (!childNameInput) return;\n\n  // 1. \u041D\u0430 \u0432\u0432\u043E\u0434\u0435 \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u0444\u0438\u043B\u044C\u0442\u0440\u0443\u0435\u043C \u0441\u0438\u043C\u0432\u043E\u043B\u044B, \u041D\u0415 trim()\n  childNameInput.addEventListener('input', function () {\n    const start = this.selectionStart;\n    const end = this.selectionEnd;\n\n    const raw = this.value; // \u0431\u0435\u0437 trim()\n    const cleaned = raw.replace(/[^a-zA-Z\u0430-\u044F\u0410-\u042F\u0451\u0401\\s-]/g, '');\n\n    if (cleaned !== raw) {\n      // \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u043A\u0430\u0440\u0435\u0442\u043A\u0443 (\u0438\u043D\u0430\u0447\u0435 \u043C\u043E\u0436\u0435\u0442 \u043F\u0440\u044B\u0433\u0430\u0442\u044C)\n      const delta = raw.length - cleaned.length;\n      this.value = cleaned;\n      const newPos = Math.max(0, start - delta);\n      this.setSelectionRange(newPos, newPos);\n    }\n\n    this.style.borderColor = this.value.length > 0 ? '#28a745' : '#e9ecef';\n  });\n\n  // 2. \u041D\u0430 \u0432\u044B\u0445\u043E\u0434\u0435 \u0438\u0437 \u043F\u043E\u043B\u044F \u2014 trim \u043A\u0440\u0430\u0451\u0432 (\u043A\u0430\u043A \u0438 \u0445\u043E\u0442\u0435\u043B)\n  childNameInput.addEventListener('blur', function () {\n    const trimmed = this.value.trim();\n    if (trimmed !== this.value) this.value = trimmed;\n  });\n}\n\nfunction validateStep1() {\n    const childName = document.getElementById('childName');\n    const gender = document.querySelector('input[name=\"gender\"]:checked');\n    const eyeColorSelect = document.getElementById('eyeColorSelect');\n    const eyeColorManual = document.getElementById('eyeColorManual');\n    const photoInput = document.getElementById('childPhoto');\n    const language = document.getElementById('bookLanguage');\n\n    let isValid = true;\n    const errors = [];\n\n    // Child name\n    if (!childName?.value?.trim()) {\n        errors.push(\n            t(\n                'errorNameRequired',\n                \"Please enter the child's name\"\n            )\n        );\n\n        if (childName) {\n            childName.style.borderColor = '#dc3545';\n        }\n\n        isValid = false;\n\n    } else if (childName.value.trim().length < 2) {\n        errors.push(\n            t(\n                'errorNameShort',\n                'Name must contain at least 2 characters'\n            )\n        );\n\n        childName.style.borderColor = '#dc3545';\n        isValid = false;\n\n    } else {\n        childName.style.borderColor = '#28a745';\n    }\n\n    // Gender\n    if (!gender || gender.disabled) {\n        errors.push(\n            t(\n                'errorGenderRequired',\n                'Please select gender'\n            )\n        );\n\n        isValid = false;\n    }\n\n    // Book language is selected alongside the child's details on Step 2.\n    if (!language?.value) {\n        errors.push(t('errorLanguageRequired', 'Please select language'));\n        if (language) language.style.borderColor = '#dc3545';\n        isValid = false;\n    } else {\n        language.style.borderColor = '#28a745';\n    }\n\n    // Eye color\n    if (!eyeColorSelect?.value) {\n        errors.push(\n            t(\n                'errorEyeColorRequired',\n                'Please select the eye color'\n            )\n        );\n\n        if (eyeColorSelect) {\n            eyeColorSelect.style.borderColor = '#dc3545';\n        }\n\n        isValid = false;\n\n    } else if (\n        eyeColorSelect.value === 'manual' &&\n        !eyeColorManual?.value?.trim()\n    ) {\n        errors.push(\n            t(\n                'errorEyeColorManualRequired',\n                'Please enter the eye color'\n            )\n        );\n\n        eyeColorSelect.style.borderColor = '#28a745';\n\n        if (eyeColorManual) {\n            eyeColorManual.style.borderColor = '#dc3545';\n        }\n\n        isValid = false;\n\n    } else {\n        eyeColorSelect.style.borderColor = '#28a745';\n\n        if (eyeColorManual) {\n            eyeColorManual.style.borderColor =\n                eyeColorSelect.value === 'manual'\n                    ? '#28a745'\n                    : '';\n        }\n    }\n\n    // Photo\n    if (!photoInput || !photoInput.files.length) {\n        errors.push(\n            t(\n                'errorPhotoRequired',\n                'Please upload a photo before continuing.'\n            )\n        );\n\n        isValid = false;\n    }\n\n    if (!isValid) {\n        showError(\n            errors\n                .map(error => `\u2022 ${error}`)\n                .join('\\n')\n        );\n    }\n\n    return isValid;\n}\n\n// ==================== STEP 1B: OPTIONAL ANIMAL AND OBJECT ====================\n\nfunction getSelectedExtraType(groupName) {\n    return document.querySelector(`input[name=\"${groupName}\"]:checked`)?.value || 'none';\n}\n\nfunction setStep1Panel(panelName, shouldScroll = true) {\n    const childPanel = document.getElementById('step1ChildPanel');\n    const extrasPanel = document.getElementById('step1ExtrasPanel');\n    const mainPreviewArea = document.getElementById('mainPreviewArea');\n\n    if (!childPanel || !extrasPanel) return false;\n\n    const showExtras = panelName === 'extras';\n\n    childPanel.hidden = showExtras;\n    childPanel.classList.toggle('hidden', showExtras);\n    childPanel.classList.toggle('active', !showExtras);\n    childPanel.setAttribute('aria-hidden', showExtras ? 'true' : 'false');\n\n    extrasPanel.hidden = !showExtras;\n    extrasPanel.classList.toggle('hidden', !showExtras);\n    extrasPanel.classList.toggle('active', showExtras);\n    extrasPanel.setAttribute('aria-hidden', showExtras ? 'false' : 'true');\n\n    if (mainPreviewArea) {\n        mainPreviewArea.style.display = showExtras ? 'none' : 'block';\n    }\n\n    if (shouldScroll) {\n        const scrollTarget = showExtras ? extrasPanel : (mainPreviewArea || childPanel);\n        setTimeout(() => {\n            scrollTarget?.scrollIntoView({\n                behavior: 'smooth',\n                block: 'start'\n            });\n        }, 50);\n    }\n\n    return true;\n}\n\nfunction openStep1Extras() {\n    if (!validateStep1()) return false;\n\n    renderStep1ExtraFields();\n    return setStep1Panel('extras');\n}\n\nfunction returnToStep1Child(options = {}) {\n    const shouldScroll = options.scroll !== false;\n    return setStep1Panel('child', shouldScroll);\n}\n\nfunction toggleExtraFields(groupId, shouldShow, requiredElementIds) {\n    const group = document.getElementById(groupId);\n    const requiredIds = Array.isArray(requiredElementIds)\n        ? requiredElementIds\n        : [requiredElementIds].filter(Boolean);\n\n    if (group) {\n        group.hidden = !shouldShow;\n        group.classList.toggle('hidden', !shouldShow);\n        group.setAttribute('aria-hidden', shouldShow ? 'false' : 'true');\n    }\n\n    requiredIds.forEach(requiredElementId => {\n        const requiredElement = document.getElementById(requiredElementId);\n        if (!requiredElement) return;\n\n        requiredElement.required = shouldShow;\n        requiredElement.setAttribute('aria-required', shouldShow ? 'true' : 'false');\n\n        if (!shouldShow) {\n            requiredElement.style.borderColor = '';\n        }\n    });\n}\n\nfunction renderExtraChoiceState(groupName) {\n    document.querySelectorAll(`input[name=\"${groupName}\"]`).forEach(input => {\n        input.closest('.hbn-extra-choice')?.classList.toggle('selected', input.checked);\n    });\n}\n\nfunction renderStep1ExtraFields() {\n    const animalType = getSelectedExtraType('animal_type');\n    const objectType = getSelectedExtraType('object_type');\n\n    renderExtraChoiceState('animal_type');\n    renderExtraChoiceState('object_type');\n\n    toggleExtraFields('animalPetFields', animalType === 'pet', 'animalPhoto');\n    toggleExtraFields(\n        'favoriteAnimalFields',\n        animalType === 'favorite_animal',\n        'animalDescription'\n    );\n\n    toggleExtraFields(\n        'objectToyFields',\n        objectType === 'toy',\n        ['objectPhoto', 'objectPhotoDescription']\n    );\n    toggleExtraFields(\n        'favoriteObjectFields',\n        objectType === 'favorite_object',\n        'objectDescription'\n    );\n\n    if (animalType !== 'pet') {\n        document.getElementById('animalPhotoUploadZone')?.classList.remove('invalid');\n    }\n\n    if (objectType !== 'toy') {\n        document.getElementById('objectPhotoUploadZone')?.classList.remove('invalid');\n    }\n\n    updateConfiguratorSummary();\n}\n\nfunction getExtraPhotoElements(kind) {\n    const prefix = kind === 'animal' ? 'animal' : 'object';\n\n    return {\n        input: document.getElementById(`${prefix}Photo`),\n        image: document.getElementById(`${prefix}PhotoPreview`),\n        container: document.getElementById(`${prefix}PhotoPreviewContainer`),\n        uploadZone: document.getElementById(`${prefix}PhotoUploadZone`),\n        placeholder: document.getElementById(`${prefix}PhotoUploadPlaceholder`)\n    };\n}\n\nfunction isImageFile(file) {\n    return file instanceof File && file.type.startsWith('image/');\n}\n\nfunction clearExtraPhoto(kind, clearInput = true) {\n    const { input, image, container, uploadZone, placeholder } = getExtraPhotoElements(kind);\n\n    if (image?.dataset.previewUrl) {\n        URL.revokeObjectURL(image.dataset.previewUrl);\n        delete image.dataset.previewUrl;\n    }\n\n    if (image) {\n        image.removeAttribute('src');\n        image.hidden = true;\n        image.classList.add('hidden');\n    }\n\n    if (placeholder) {\n        placeholder.hidden = false;\n        placeholder.classList.remove('hidden');\n    }\n\n    if (container) {\n        container.hidden = true;\n        container.classList.add('hidden');\n    }\n\n    if (uploadZone) {\n        uploadZone.classList.remove('has-file', 'valid', 'invalid', 'is-dragover');\n    }\n\n    if (clearInput && input) {\n        input.value = '';\n    }\n}\n\nfunction showExtraPhotoPreview(kind, file) {\n    const { image, container, uploadZone, placeholder } = getExtraPhotoElements(kind);\n    if (!image || !container) return;\n\n    if (image.dataset.previewUrl) {\n        URL.revokeObjectURL(image.dataset.previewUrl);\n    }\n\n    const previewUrl = URL.createObjectURL(file);\n    image.dataset.previewUrl = previewUrl;\n    image.src = previewUrl;\n    image.hidden = false;\n    image.classList.remove('hidden');\n\n    if (placeholder) {\n        placeholder.hidden = true;\n        placeholder.classList.add('hidden');\n    }\n\n    container.hidden = false;\n    container.classList.remove('hidden');\n\n    uploadZone?.classList.remove('invalid');\n    uploadZone?.classList.remove('is-dragover');\n    uploadZone?.classList.add('has-file', 'valid');\n}\n\nfunction handleExtraPhotoChange(kind, event) {\n    const file = event.target.files?.[0];\n    const { uploadZone } = getExtraPhotoElements(kind);\n\n    if (!file) {\n        clearExtraPhoto(kind, false);\n        return false;\n    }\n\n    if (file.size > MAX_IMAGE_FILE_SIZE) {\n        clearExtraPhoto(kind);\n        uploadZone?.classList.add('invalid');\n        showError(t('errorFileTooLarge', 'File too large. Maximum size: 10MB'));\n        return false;\n    }\n\n    if (!isImageFile(file)) {\n        clearExtraPhoto(kind);\n        uploadZone?.classList.add('invalid');\n        showError(t('errorUploadImage', 'Please upload an image file'));\n        return false;\n    }\n\n    showExtraPhotoPreview(kind, file);\n    return true;\n}\n\nfunction setupExtraPhotoDropZone(kind) {\n    const { input, uploadZone } = getExtraPhotoElements(kind);\n    if (!input || !uploadZone || uploadZone.dataset.dropReady === 'true') return;\n\n    uploadZone.dataset.dropReady = 'true';\n\n    ['dragenter', 'dragover'].forEach(eventName => {\n        uploadZone.addEventListener(eventName, event => {\n            event.preventDefault();\n            event.stopPropagation();\n            uploadZone.classList.add('is-dragover');\n        });\n    });\n\n    uploadZone.addEventListener('dragleave', event => {\n        event.preventDefault();\n        event.stopPropagation();\n\n        if (!event.relatedTarget || !uploadZone.contains(event.relatedTarget)) {\n            uploadZone.classList.remove('is-dragover');\n        }\n    });\n\n    uploadZone.addEventListener('drop', event => {\n        event.preventDefault();\n        event.stopPropagation();\n        uploadZone.classList.remove('is-dragover');\n\n        const file = event.dataTransfer?.files?.[0];\n        if (!file) return;\n\n        if (!isImageFile(file)) {\n            clearExtraPhoto(kind);\n            uploadZone.classList.add('invalid');\n            showError(t('errorDragImage', 'Please drag an image file'));\n            return;\n        }\n\n        try {\n            const transfer = new DataTransfer();\n            transfer.items.add(file);\n            input.files = transfer.files;\n        } catch (error) {\n            console.error('Could not attach dropped photo:', error);\n            showError(t('errorUploadImage', 'Please upload an image file'));\n            return;\n        }\n\n        handleExtraPhotoChange(kind, { target: input });\n    });\n}\n\nfunction setupStep1Extras() {\n    const animalRadios = document.querySelectorAll('input[name=\"animal_type\"]');\n    const objectRadios = document.querySelectorAll('input[name=\"object_type\"]');\n\n    if (!animalRadios.length && !objectRadios.length) return;\n\n    [...animalRadios, ...objectRadios].forEach(radio => {\n        radio.onchange = renderStep1ExtraFields;\n    });\n\n    const animalPhoto = document.getElementById('animalPhoto');\n    const objectPhoto = document.getElementById('objectPhoto');\n    const removeAnimalPhotoBtn = document.getElementById('removeAnimalPhotoBtn');\n    const removeObjectPhotoBtn = document.getElementById('removeObjectPhotoBtn');\n\n    if (animalPhoto) {\n        animalPhoto.onchange = event => handleExtraPhotoChange('animal', event);\n    }\n\n    if (objectPhoto) {\n        objectPhoto.onchange = event => handleExtraPhotoChange('object', event);\n    }\n\n    setupExtraPhotoDropZone('animal');\n    setupExtraPhotoDropZone('object');\n\n    if (removeAnimalPhotoBtn) {\n        removeAnimalPhotoBtn.onclick = () => clearExtraPhoto('animal');\n    }\n\n    if (removeObjectPhotoBtn) {\n        removeObjectPhotoBtn.onclick = () => clearExtraPhoto('object');\n    }\n\n    ['animalDescription', 'objectPhotoDescription', 'objectDescription'].forEach(id => {\n        const input = document.getElementById(id);\n        if (!input) return;\n\n        input.oninput = function () {\n            this.style.borderColor = this.value.trim() ? '#28a745' : '';\n        };\n    });\n\n    renderStep1ExtraFields();\n}\n\nfunction validateStep1Extras() {\n    if (!isExtrasEnabled()) return true;\n\n    const hasExtrasMarkup =\n        document.querySelector('input[name=\"animal_type\"]') ||\n        document.querySelector('input[name=\"object_type\"]');\n\n    if (!hasExtrasMarkup) return true;\n\n    const animalType = getSelectedExtraType('animal_type');\n    const objectType = getSelectedExtraType('object_type');\n    const animalPhoto = document.getElementById('animalPhoto');\n    const animalDescription = document.getElementById('animalDescription');\n    const objectPhoto = document.getElementById('objectPhoto');\n    const objectPhotoDescription = document.getElementById('objectPhotoDescription');\n    const objectDescription = document.getElementById('objectDescription');\n    const animalPhotoZone = document.getElementById('animalPhotoUploadZone');\n    const objectPhotoZone = document.getElementById('objectPhotoUploadZone');\n\n    const errors = [];\n    let firstInvalidElement = null;\n\n    if (animalType === 'none' && objectType === 'none') {\n        errors.push(\n            t(\n                'errorExtrasEmpty',\n                'Add at least one animal or object, or choose No extras.'\n            )\n        );\n        firstInvalidElement = document.getElementById('step1ExtrasPanel');\n    }\n\n    if (animalType === 'pet' && !animalPhoto?.files?.[0]) {\n        errors.push(\n            t('errorAnimalPhotoRequired', 'Please upload a pet photo.')\n        );\n        animalPhotoZone?.classList.add('invalid');\n        if (!firstInvalidElement) firstInvalidElement = animalPhotoZone;\n    } else {\n        animalPhotoZone?.classList.remove('invalid');\n    }\n\n    if (\n        animalType === 'favorite_animal' &&\n        !animalDescription?.value?.trim()\n    ) {\n        errors.push(\n            t('errorAnimalDescriptionRequired', 'Please describe the animal.')\n        );\n        if (animalDescription) animalDescription.style.borderColor = '#dc3545';\n        if (!firstInvalidElement) firstInvalidElement = animalDescription;\n    }\n\n    if (objectType === 'toy' && !objectPhoto?.files?.[0]) {\n        errors.push(\n            t('errorObjectPhotoRequired', 'Please upload a toy photo.')\n        );\n        objectPhotoZone?.classList.add('invalid');\n        if (!firstInvalidElement) firstInvalidElement = objectPhotoZone;\n    } else {\n        objectPhotoZone?.classList.remove('invalid');\n    }\n\n    if (\n        objectType === 'toy' &&\n        !objectPhotoDescription?.value?.trim()\n    ) {\n        errors.push(\n            t(\n                'errorObjectPhotoDescriptionRequired',\n                'Please briefly describe the object in the photo.'\n            )\n        );\n        if (objectPhotoDescription) {\n            objectPhotoDescription.style.borderColor = '#dc3545';\n        }\n        if (!firstInvalidElement) firstInvalidElement = objectPhotoDescription;\n    }\n\n    if (\n        objectType === 'favorite_object' &&\n        !objectDescription?.value?.trim()\n    ) {\n        errors.push(\n            t('errorObjectDescriptionRequired', 'Please describe the object.')\n        );\n        if (objectDescription) objectDescription.style.borderColor = '#dc3545';\n        if (!firstInvalidElement) firstInvalidElement = objectDescription;\n    }\n\n    if (errors.length) {\n        showError(errors.map(error => `\u2022 ${error}`).join('\\n'));\n        firstInvalidElement?.scrollIntoView({ behavior: 'smooth', block: 'center' });\n        return false;\n    }\n\n    return true;\n}\n\nfunction getAnimalPersonalizationData() {\n    if (!isExtrasEnabled()) return null;\n\n    const type = getSelectedExtraType('animal_type');\n\n    if (type === 'pet') {\n        return {\n            type,\n            name: document.getElementById('animalName')?.value?.trim() || '',\n            hasPhoto: true\n        };\n    }\n\n    if (type === 'favorite_animal') {\n        return {\n            type,\n            description: document.getElementById('animalDescription')?.value?.trim() || ''\n        };\n    }\n\n    return null;\n}\n\nfunction getObjectPersonalizationData() {\n    if (!isExtrasEnabled()) return null;\n\n    const type = getSelectedExtraType('object_type');\n\n    if (type === 'toy') {\n        return {\n            type,\n            hasPhoto: true,\n            description: document.getElementById('objectPhotoDescription')?.value?.trim() || ''\n        };\n    }\n\n    if (type === 'favorite_object') {\n        return {\n            type,\n            description: document.getElementById('objectDescription')?.value?.trim() || ''\n        };\n    }\n\n    return null;\n}\n\nasync function nextStepFromStep1() {\n    if (DEBUG) console.log('Step 3 \u2192 Webhook: book_step1');\n\n    if (!validateBookStep()) {\n        // The user is already on Extras. Keep the filled form intact so a\n        // temporary variant mismatch cannot trap them on Step 1.\n        scrollToPersonalizationTop();\n        return false;\n    }\n\n    if (!validateStep1()) {\n        showStep(2, true);\n        return false;\n    }\n\n    if (!validateStep1Extras()) return false;\n\n    if (workflowPhase === 'submitting' || setupLocked) return false;\n    workflowPhase = 'submitting';\n\n    showStepTransitionLoading(t('loadingSaveBasic', 'Saving basic information...'));\n\n    try {\n        const formData = collectStep1Data();\n\n        // \u2705 \u0411\u0410\u0413 \u0424\u0418\u041A\u0421 6: \u0416\u0414\u0415\u041C RESPONSE \u0438 \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u043C dedication text\n        if (DEBUG) console.log('\uD83D\uDCE1 Sending Step 1 data and WAITING for response...');\n        const response = await sendToWebhook(formData, 'book_step1');\n\n        if (response?.status === 'contact_support') {\n            hideStepTransitionLoading();\n\n            const childName =\n                document.getElementById('childName')?.value?.trim() || '';\n\n            showSupportInterventionModal(childName);\n\n            return false;\n        }\n\n        if (DEBUG) console.log('\u2705 Step 1 response received:', response);\n\n        // \u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0434\u0430\u043D\u043D\u044B\u0435\n        window.personalizationData = {\n            ...window.personalizationData,\n            tracking_id: tracking_id,\n            childName: document.getElementById('childName').value.trim(),\n            gender: document.querySelector('input[name=\"gender\"]:checked').value,\n            language: document.getElementById('bookLanguage').value,\n            eyeColor: getEyeColorValue(),\n            edition: getSelectedEditionValue(),\n            extras: getSelectedExtrasValue(),\n            selectedVariantId: selectedVariant.id,\n            animal: getAnimalPersonalizationData(),\n            object: getObjectPersonalizationData()\n        //    illustrationStyle: selectedIllustrationStyle\n        };\n\n        const responseStartedAt = parseGenerationStartedAt(\n            response?.generation_started_at || response?.started_at || response?.created_at\n        );\n        generationStartedAt = responseStartedAt || Date.now();\n        generationDeadlineAt = generationStartedAt + GENERATION_ESTIMATE_MS;\n        const configurationLockedAt = Date.now();\n        window.personalizationData = {\n            ...window.personalizationData,\n            generationStartedAt: new Date(generationStartedAt).toISOString(),\n            generationStatus: response?.generation_status || response?.status || 'in_process',\n            configurationLockedAt: new Date(configurationLockedAt).toISOString()\n        };\n        setupLocked = true;\n        workflowPhase = 'generating';\n        lockSetupSteps();\n        startPreviewTracking();\n\n        currentStep = 4;\n        showStep(currentStep, true);\n\n        // \u2705 \u0411\u0410\u0413 \u0424\u0418\u041A\u0421 6: \u0418\u0437\u0432\u043B\u0435\u043A\u0430\u0435\u043C \u0438 \u0437\u0430\u043F\u043E\u043B\u043D\u044F\u0435\u043C dedication text \u0438\u0437 webhook response\n        let dedicationText = '';\n\n        if (response.dedication) {\n            dedicationText = response.dedication;\n            if (DEBUG) console.log('\uD83D\uDCDD Got dedication from response.dedication:', dedicationText);\n        } else if (response.dedicationText) {\n            dedicationText = response.dedicationText;\n            if (DEBUG) console.log('\uD83D\uDCDD Got dedication from response.dedicationText:', dedicationText);\n        } else if (response.message) {\n            dedicationText = response.message;\n            if (DEBUG) console.log('\uD83D\uDCDD Got dedication from response.message:', dedicationText);\n        } else {\n            dedicationText = `Dear ${window.personalizationData.childName}, your amazing adventure begins here! You are special and loved.`;\n            if (DEBUG) console.log('\uD83D\uDCDD Using fallback dedication text');\n        }\n\n        // \u2705 \u0411\u0410\u0413 \u0424\u0418\u041A\u0421 6: \u0417\u0430\u043F\u043E\u043B\u043D\u044F\u0435\u043C \u043F\u043E\u043B\u0435 dedication \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043D\u044B\u043C \u0442\u0435\u043A\u0441\u0442\u043E\u043C\n        fillDedicationField(dedicationText);\n\n        // \u2705 \u0411\u0410\u0413 \u0424\u0418\u041A\u0421 1: \u0422\u041E\u041B\u042C\u041A\u041E UI setup, \u0411\u0415\u0417 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432\n        setupStep2Elements();\n\n        hideStepTransitionLoading();\n\n        return true;\n\n    } catch (error) {\n        console.error('\u274C Step 1 error:', error);\n        workflowPhase = 'draft';\n        hideStepTransitionLoading();\n        showError(t('errorSaveBasic', 'Failed to save basic information'));\n        return false;\n    }\n}\n\nfunction getProductHandle() {\n    return window.personalizationConfig.productHandle;\n}\n\nfunction collectStep1Data() {\n    if (DEBUG) console.log('\uD83D\uDCCB Collecting Step 1 data...');\n\n    const formData = new FormData();\n    formData.append('tracking_id', tracking_id);\n    formData.append('hbn_token', hbn_token);\n    formData.append('product_handle', getProductHandle());\n    formData.append('edition', getSelectedEditionValue());\n    formData.append('extras_enabled', getSelectedExtrasValue());\n    formData.append('selected_variant_id', String(selectedVariant?.id || ''));\n    formData.append('selected_variant_price', String(selectedVariant?.price || ''));\n    formData.append('child_photo', '');\n    formData.append('child_name', document.getElementById('childName').value.trim());\n    formData.append('gender', document.querySelector('input[name=\"gender\"]:checked').value);\n    formData.append('book_language', document.getElementById('bookLanguage').value);\n    formData.append('eye_color', getEyeColorValue());\n    //formData.append('illustration_style', selectedIllustrationStyle);\n\n\n    const photoInput = document.getElementById('childPhoto');\n    if (photoInput?.files[0]) {\n        formData.set('child_photo', photoInput.files[0]);\n    }\n\n    const extrasEnabled = isExtrasEnabled();\n    const animalType = extrasEnabled ? getSelectedExtraType('animal_type') : 'none';\n    const objectType = extrasEnabled ? getSelectedExtraType('object_type') : 'none';\n\n    formData.append('animal_type', animalType);\n    formData.append('object_type', objectType);\n\n    if (animalType === 'pet') {\n        const animalPhoto = document.getElementById('animalPhoto');\n        const animalName = document.getElementById('animalName');\n\n        if (animalPhoto?.files[0]) {\n            formData.append('animal_photo', animalPhoto.files[0]);\n        }\n\n        formData.append('animal_name', animalName?.value?.trim() || '');\n    } else if (animalType === 'favorite_animal') {\n        formData.append(\n            'animal_description',\n            document.getElementById('animalDescription')?.value?.trim() || ''\n        );\n    }\n\n    if (objectType === 'toy') {\n        const objectPhoto = document.getElementById('objectPhoto');\n        const objectPhotoDescription = document.getElementById('objectPhotoDescription');\n\n        if (objectPhoto?.files[0]) {\n            formData.append('object_photo', objectPhoto.files[0]);\n        }\n\n        formData.append(\n            'object_photo_description',\n            objectPhotoDescription?.value?.trim() || ''\n        );\n    } else if (objectType === 'favorite_object') {\n        formData.append(\n            'object_description',\n            document.getElementById('objectDescription')?.value?.trim() || ''\n        );\n    }\n\n    if (DEBUG) console.log('\u2705 Step 1 data collected');\n    return formData;\n}\n\n// ==================== STEP 2: CHARACTER DATA ====================\n\n// \u2705 \u0411\u0410\u0413 \u0424\u0418\u041A\u0421 8: \u0423\u043F\u0440\u043E\u0449\u0435\u043D\u043D\u0430\u044F \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F Step 2 - \u0442\u043E\u043B\u044C\u043A\u043E \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0435 \u043F\u043E\u043B\u044F\nfunction setupStep2Elements() {\n    // \u2705 \u0422\u041E\u041B\u042C\u041A\u041E \u041D\u0410\u0421\u0422\u0420\u041E\u0419\u041A\u0410 UI \u042D\u041B\u0415\u041C\u0415\u041D\u0422\u041E\u0412 \u0414\u041B\u042F \u0422\u0415\u041A\u0421\u0422\u041E\u0412\u042B\u0425 \u041F\u041E\u041B\u0415\u0419 - \u0411\u0415\u0417 \u0417\u0410\u041F\u0420\u041E\u0421\u041E\u0412!\n    setupCharacterInputs();\n\n    if (DEBUG) console.log('2\uFE0F\u20E3 Step 2 elements initialized - simplified UI only, no auto requests');\n}\n\n// \u0423\u0431\u0440\u0430\u043B\u0438 \u0444\u0443\u043D\u043A\u0446\u0438\u0438 \u0434\u043B\u044F \u044D\u043C\u043E\u0434\u0437\u0438 \u0438 \u0432\u044B\u043F\u0430\u0434\u0430\u044E\u0449\u0438\u0445 \u0441\u043F\u0438\u0441\u043A\u043E\u0432\n// setupInterestSelection() - REMOVED\n// setupCatchphraseSelection() - REMOVED\n// toggleInterest() - REMOVED\n// handleCatchphraseSelect() - REMOVED\n\nfunction setupCharacterInputs() {\n    // \u2705 \u0411\u0410\u0413 \u0424\u0418\u041A\u0421 8: \u0422\u043E\u043B\u044C\u043A\u043E \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0435 \u043F\u043E\u043B\u044F - traits, superpower, interests, catchphrase\n    const inputs = ['traits', 'superpower', 'interests', 'catchphrase'].map(id => document.getElementById(id));\n\n    inputs.forEach(input => {\n        if (input) {\n            input.addEventListener('input', function() {\n                this.style.borderColor = this.value.trim() ? '#28a745' : '#e9ecef';\n            });\n        }\n    });\n}\n\nfunction validateStep2() {\n    // Step 2 \u043F\u043E\u043B\u044F \u043D\u0435 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u044B\n    return true;\n}\n\nasync function nextStepFromStep2() {\n    if (DEBUG) console.log('Step 4 \u2192 Step 5: Saving dedication...');\n\n    if (!validateStep2()) return false;\n\n    showStepTransitionLoading(t('loadingSaveCharacter', 'Saving character data...'));\n\n    try {\n        const formData = collectAllCharacterData();\n        const response = await sendToWebhook(formData, 'book_step2');\n\n        if (DEBUG) console.log('\u2705 Step 2 response:', response);\n\n        currentStep = 5;\n        showStep(currentStep, true);\n        initializeStep3();\n\n        hideStepTransitionLoading();\n        showSuccess(t('successCharacterSaved', '\u2705 Character data saved!'));\n\n        return true;\n\n    } catch (error) {\n        console.error('\u274C Step 2 error:', error);\n        hideStepTransitionLoading();\n        showError(t('errorSaveCharacter', 'Failed to save character data'));\n        return false;\n    }\n}\n\nfunction collectAllCharacterData() {\n    const formData = new FormData();\n\n    formData.append('tracking_id', tracking_id);\n    formData.append('hbn_token', hbn_token);\n    formData.append('product_handle', getProductHandle());\n\n    //formData.append('extra_pet', document.getElementById('superpower')?.value.trim() || '');\n    //formData.append('extra_human', document.getElementById('catchphrase')?.value.trim() || '');\n    //formData.append('hobby', document.getElementById('interests')?.value.trim() || '');\n    //formData.append('traits', document.getElementById('traits')?.value.trim() || '');\n    formData.append('dedication', document.getElementById('dedication')?.value.trim() || '');\n\n    return formData;\n}\n\n// ==================== STEP 3: PREVIEW GENERATION ====================\n\nfunction initializeStep3() {\n  if (DEBUG) console.log('Step 5 initialized');\n\n  refreshRefundPolicyConsentUI();\n\n  const actions = document.getElementById('finalizeActions');\n  if (actions) actions.style.display = 'flex';\n\n  hidePreviewError();\n\n  if (previewImages.length) {\n    previewExperienceStarted = true;\n    hideGenerationProgress();\n    showPreviewSlider();\n    loadPreviewImages();\n  } else {\n    // Generation already starts after Step 3. Step 5 immediately connects to\n    // the same tracking promise and shows progress without an extra click.\n    startStep5PreviewExperience();\n  }\n\n  setupPreviewNavigation();\n\n  // \u2705 Disable right-click inside the preview slider\n  const slider = document.getElementById('previewSliderSection');\n  if (slider) {\n    slider.addEventListener('contextmenu', e => {\n      e.preventDefault();\n      return false;\n    });\n  }\n}\n\n\n\n\n\nasync function generatePreview() {\n    return startStep5PreviewExperience();\n}\n\nfunction startStep5PreviewExperience() {\n    previewExperienceStarted = true;\n    hidePreviewError();\n\n    if (previewImages.length) {\n        hideGenerationProgress();\n        showPreviewSlider();\n        loadPreviewImages();\n        return Promise.resolve(previewImages);\n    }\n\n    hidePreviewSlider();\n    showGenerationProgress();\n    return startPreviewTracking({ showProgress: true });\n}\n\nfunction parseGenerationStartedAt(value) {\n  if (!value) return null;\n\n  if (typeof value === 'number') {\n    return value < 1e12 ? value * 1000 : value;\n  }\n\n  const numericValue = Number(value);\n  if (Number.isFinite(numericValue) && numericValue > 0) {\n    return numericValue < 1e12 ? numericValue * 1000 : numericValue;\n  }\n\n  const parsed = Date.parse(value);\n  return Number.isNaN(parsed) ? null : parsed;\n}\n\nfunction wait(ms) {\n  return new Promise(resolve => setTimeout(resolve, Math.max(0, ms)));\n}\n\nfunction lockSetupSteps() {\n  const wrapper = document.getElementById('personalizationFormWrapper');\n  if (wrapper) wrapper.dataset.setupLocked = 'true';\n\n  document.querySelectorAll('.step-content[data-step=\"1\"] input, .step-content[data-step=\"1\"] select, .step-content[data-step=\"1\"] button, .step-content[data-step=\"2\"] input, .step-content[data-step=\"2\"] select, .step-content[data-step=\"2\"] button, .step-content[data-step=\"3\"] input, .step-content[data-step=\"3\"] select, .step-content[data-step=\"3\"] button').forEach(element => {\n    element.disabled = true;\n  });\n\n  updateStepIndicator();\n}\n\nfunction startPreviewTracking(options = {}) {\n  const shouldShowProgress = options.showProgress === true;\n\n  if (previewImages.length) return Promise.resolve(previewImages);\n  if (previewPollPromise) {\n    if (shouldShowProgress) showGenerationProgress();\n    return previewPollPromise;\n  }\n\n  if (!generationStartedAt) generationStartedAt = Date.now();\n  if (!generationDeadlineAt) generationDeadlineAt = generationStartedAt + GENERATION_ESTIMATE_MS;\n\n  previewPollCancelled = false;\n  isGeneratingPreview = true;\n  resetStep3FinalActionButton();\n\n  if (shouldShowProgress) {\n    hidePreviewError();\n    hidePreviewSlider();\n    showGenerationProgress();\n  }\n\n  previewPollPromise = requestPreviewGeneration()\n    .then(images => {\n      handlePreviewSuccess(images);\n      return images;\n    })\n    .catch(error => {\n      handlePreviewError(error);\n      return null;\n    })\n    .finally(() => {\n      isGeneratingPreview = false;\n      previewPollPromise = null;\n    });\n\n  return previewPollPromise;\n}\n\n// Timestamp-based 5:30 countdown. It never restarts when the step is reopened.\nfunction hbnShowPreviewCountdown() {\n  if (window._hbnPreviewCountdownTimer) {\n    clearInterval(window._hbnPreviewCountdownTimer);\n    window._hbnPreviewCountdownTimer = null;\n  }\n\n  const wrap = document.getElementById('previewCountdownWrap');\n  const elTime = document.getElementById('previewCountdown');\n  const elSlow = document.getElementById('previewSlowNotice');\n\n  if (!wrap || !elTime) return;\n\n  const render = () => {\n    const remaining = Math.max(0, Math.ceil(((generationDeadlineAt || Date.now()) - Date.now()) / 1000));\n    const mm = String(Math.floor(remaining / 60)).padStart(2, '0');\n    const ss = String(remaining % 60).padStart(2, '0');\n    elTime.textContent = `${mm}:${ss}`;\n    if (elSlow) elSlow.style.display = remaining === 0 ? 'block' : 'none';\n  };\n\n  wrap.style.display = 'block';\n\n  render();\n\n  window._hbnPreviewCountdownTimer = setInterval(render, 1000);\n}\n\nfunction hbnHidePreviewCountdown() {\n  if (window._hbnPreviewCountdownTimer) {\n    clearInterval(window._hbnPreviewCountdownTimer);\n    window._hbnPreviewCountdownTimer = null;\n  }\n  const wrap = document.getElementById('previewCountdownWrap');\n  if (wrap) wrap.style.display = 'none';\n\n  const elSlow = document.getElementById('previewSlowNotice');\n  if (elSlow) elSlow.style.display = 'none';\n}\n\n\n\n// First status check is delayed until three minutes after generation started.\nasync function requestPreviewGeneration() {\n  const startedAt = generationStartedAt || Date.now();\n  const firstPollAt = startedAt + FIRST_PREVIEW_POLL_DELAY_MS;\n  const stopPollingAt = startedAt + MAX_PREVIEW_WAIT_MS;\n\n  if (Date.now() < firstPollAt) {\n    await wait(firstPollAt - Date.now());\n  }\n\n  while (!previewPollCancelled && Date.now() < stopPollingAt) {\n\n    // Build request with intention=preview_status\n    const formData = new FormData();\n    formData.append('tracking_id', tracking_id);\n    formData.append('hbn_token', hbn_token);\n    formData.append('intention', 'book_preview');\n\n    const { ok, headers, json } = await postWebhookWithHeaders(formData);\n\n    if (!ok) {\n      console.warn('Preview status request failed; it will be retried.', json);\n      await wait(PREVIEW_POLL_INTERVAL_MS);\n      continue;\n    }\n\n    const status = (json.status || '').toLowerCase();\n    if (DEBUG) console.log(`\uD83D\uDCE1 preview_status:`, status, json);\n\n    if (['done', 'ready', 'completed', 'success'].includes(status)) {\n      // normalize image array from various field names\n      const urls =\n        json.preview_urls ||\n        json.image_urls ||\n        json.images ||\n        json.previews ||\n        json.urls ||\n        json.previewImages ||\n        [];\n      const normalized = Array.isArray(urls)\n        ? urls.filter(u => typeof u === 'string' && u.startsWith('http'))\n        : [];\n\n      if (normalized.length === 0 && typeof json.url === 'string') normalized.push(json.url);\n      if (normalized.length === 0 && typeof json.preview_url === 'string') normalized.push(json.preview_url);\n      if (normalized.length === 0 && typeof json.image_url === 'string') normalized.push(json.image_url);\n\n      if (normalized.length === 0) throw new Error(t('errorPreviewNoUrls', 'Preview ready but no URLs returned'));\n      return normalized;\n    }\n\n    if (status === 'error') {\n        const msg = t(\n            'previewErrorMessage',\n            'We\u2019ve been notified and are already checking it. Please keep this page open and try again in a moment.'\n    );\n\n    throw new Error(msg);\n    }\n\n    let waitMs = Date.now() >= generationDeadlineAt\n      ? LATE_PREVIEW_POLL_INTERVAL_MS\n      : PREVIEW_POLL_INTERVAL_MS;\n\n    // Allow n8n to override with Retry-After header\n    const retryAfterHeader = parseInt(headers.get('Retry-After') || '0', 10);\n    if (retryAfterHeader > 0) waitMs = retryAfterHeader * 1000;\n\n    if (DEBUG) console.log(`\u23F3 Waiting ${Math.round(waitMs / 1000)}s before next poll (status=${status})\u2026`);\n    await wait(waitMs);\n  }\n\n  throw new Error(t('errorPreviewTimeout', 'Timed out waiting for preview. Please try again later.'));\n}\n\nfunction handlePreviewSuccess(images) {\n  if (DEBUG) console.log('\uD83C\uDF89 Preview generation successful!');\n  if (DEBUG) console.log('\uD83D\uDCF8 Received images:', images);\n\n  // Validate payload\n  if (!Array.isArray(images) || images.length === 0) {\n    console.error('\u274C No images received from webhook');\n    handlePreviewError(\n      new Error(t('errorGenerationFixing', 'Generation failed. Our team is already fixing the error. Please try again later \uD83D\uDE4F'))\n    );\n    return;\n  }\n\n  // Save images + reset slider index\n  previewImages = images;\n  currentPreviewIndex = 0;\n  workflowPhase = 'ready';\n\n  if (!previewExperienceStarted) {\n    hideGenerationProgress();\n    hidePreviewSlider();\n    return;\n  }\n\n  // Show the final celebration line before switching UI.\n  if (typeof showDoneLine === 'function') showDoneLine();\n\n  // If the game is open, keep it paused under a clear \"View preview\" action.\n  // Otherwise preserve the existing short celebration before showing results.\n  const gameOwnsReadyState = window.HBNWaitGame?.notifyPreviewReady?.() === true;\n  if (gameOwnsReadyState) {\n    hbnHidePreviewCountdown();\n    return;\n  }\n\n  if (previewRevealTimer) clearTimeout(previewRevealTimer);\n  previewRevealTimer = setTimeout(() => revealReadyPreview(images), 2000);\n}\n\nfunction revealReadyPreview(images = previewImages) {\n  if (!Array.isArray(images) || images.length === 0) return;\n\n  if (previewRevealTimer) {\n    clearTimeout(previewRevealTimer);\n    previewRevealTimer = null;\n  }\n\n  hideGenerationProgress();\n  showPreviewSlider();\n  loadPreviewImages();\n  showSuccess(t('successPreviewGenerated', 'Preview generated!'));\n\n  if (DEBUG) {\n    console.log('Preview images loaded:');\n    images.forEach((url, index) => console.log(`  ${index + 1}: ${url}`));\n  }\n}\n\ndocument.addEventListener('hbn:wait-game:view-preview', () => {\n  revealReadyPreview(previewImages);\n});\n\n\n\nfunction handlePreviewError(error) {\n    console.error('Preview generation failed:', error);\n    workflowPhase = 'preview_error';\n    window.HBNWaitGame?.notifyError?.();\n\n    const errorMessage = error?.message || t(\n      'previewErrorMessage',\n      'Preview generation failed. Please try again later.'\n    );\n\n    if (previewExperienceStarted) {\n      showPreviewInlineError(errorMessage);\n    } else {\n      hideGenerationProgress();\n      hidePreviewSlider();\n    }\n\n    if (DEBUG) {\n      console.log('Preview error details:', {\n        message: error?.message,\n        stack: error?.stack,\n        trackingId: tracking_id,\n        currentStep: currentStep\n      });\n    }\n}\n\n// ==================== REFUND POLICY CONSENT ====================\n\nfunction getRefundPolicyConsentType() {\n    return canonicalEditionValue(getSelectedEditionValue()) === 'pdf'\n        ? 'pdf_only'\n        : 'physical_with_pdf';\n}\n\nfunction getRefundPolicyConsentContext() {\n    const block = document.getElementById('refundPolicyConsentBlock');\n    const type = getRefundPolicyConsentType();\n    const copyKey = type === 'pdf_only' ? 'pdf' : 'physical';\n    const activeCopy = block?.querySelector(`[data-refund-consent-copy=\"${copyKey}\"]`);\n    const policyLink = activeCopy?.querySelector('a');\n    const configuredLocale = window.personalizationConfig?.storefrontLocale;\n    const documentLocale = document.documentElement.lang;\n    const locale = String(configuredLocale || documentLocale || 'en')\n        .trim()\n        .toLowerCase()\n        .split('-')[0];\n    const version = String(\n        window.personalizationConfig?.refundPolicyVersion || 'refund-2026-09-08-v1'\n    ).trim();\n    const text = String(activeCopy?.textContent || '')\n        .replace(/\\s+/g, ' ')\n        .trim();\n    const url = String(\n        policyLink?.href || window.personalizationConfig?.refundPolicyUrl || ''\n    ).trim();\n\n    return {\n        type,\n        locale,\n        version,\n        text,\n        url\n    };\n}\n\nfunction clearRefundPolicyConsentError() {\n    const block = document.getElementById('refundPolicyConsentBlock');\n    const error = document.getElementById('refundPolicyConsentError');\n\n    block?.classList.remove('has-error');\n    if (error) error.hidden = true;\n}\n\nfunction showRefundPolicyConsentError(message, focusCheckbox = false) {\n    const block = document.getElementById('refundPolicyConsentBlock');\n    const checkbox = document.getElementById('refundPolicyConsent');\n    const error = document.getElementById('refundPolicyConsentError');\n\n    block?.classList.add('has-error');\n\n    if (error) {\n        error.textContent = message;\n        error.hidden = false;\n    }\n\n    if (block) {\n        const prefersReducedMotion = window.matchMedia?.('(prefers-reduced-motion: reduce)').matches;\n        block.scrollIntoView({\n            behavior: prefersReducedMotion ? 'auto' : 'smooth',\n            block: 'center'\n        });\n    }\n\n    if (focusCheckbox) {\n        window.setTimeout(() => checkbox?.focus({ preventScroll: true }), 250);\n    }\n}\n\nfunction syncRefundPolicyConsentButtonState() {\n    const checkbox = document.getElementById('refundPolicyConsent');\n    const button = document.getElementById('step3FinalActionBtn');\n\n    if (!checkbox || !button || cartSubmissionInProgress) return;\n\n    const confirmed = checkbox.checked;\n    button.classList.toggle('is-consent-locked', !confirmed);\n    button.setAttribute('aria-disabled', confirmed ? 'false' : 'true');\n}\n\nfunction refreshRefundPolicyConsentUI() {\n    const block = document.getElementById('refundPolicyConsentBlock');\n    const checkbox = document.getElementById('refundPolicyConsent');\n\n    if (!block || !checkbox) return;\n\n    const activeType = getRefundPolicyConsentType();\n    const previousType = block.dataset.refundConsentType;\n\n    block.querySelectorAll('[data-refund-consent-copy]').forEach(copy => {\n        const shouldShow = copy.dataset.refundConsentCopy === (\n            activeType === 'pdf_only' ? 'pdf' : 'physical'\n        );\n        copy.hidden = !shouldShow;\n    });\n\n    // A confirmation must never carry over to a materially different text.\n    if (previousType && previousType !== activeType) {\n        checkbox.checked = false;\n        clearRefundPolicyConsentError();\n    }\n\n    block.dataset.refundConsentType = activeType;\n    syncRefundPolicyConsentButtonState();\n}\n\nfunction setupRefundPolicyConsent() {\n    const checkbox = document.getElementById('refundPolicyConsent');\n    if (!checkbox || checkbox.dataset.hbnConsentReady === 'true') return;\n\n    checkbox.dataset.hbnConsentReady = 'true';\n    checkbox.addEventListener('change', () => {\n        if (checkbox.checked) clearRefundPolicyConsentError();\n        syncRefundPolicyConsentButtonState();\n    });\n\n    refreshRefundPolicyConsentUI();\n}\n\nfunction validateRefundPolicyConsent() {\n    const checkbox = document.getElementById('refundPolicyConsent');\n    if (checkbox?.checked) return true;\n\n    showRefundPolicyConsentError(\n        t(\n            'refundConsentRequired',\n            'Please confirm the cancellation and refund terms before adding your book to the cart.'\n        ),\n        true\n    );\n    syncRefundPolicyConsentButtonState();\n    return false;\n}\n\nfunction setCartSubmissionState(isBusy) {\n    const button = document.getElementById('step3FinalActionBtn');\n    if (!button) return;\n\n    button.classList.toggle('is-submitting', isBusy);\n    button.setAttribute('aria-busy', isBusy ? 'true' : 'false');\n\n    if (isBusy) {\n        button.textContent = t('refundConsentSaving', 'Saving your confirmation...');\n        button.setAttribute('aria-disabled', 'true');\n        return;\n    }\n\n    button.textContent = t('addToCart', 'Add to cart');\n    syncRefundPolicyConsentButtonState();\n}\n\nasync function saveRefundPolicyConsent() {\n    const context = getRefundPolicyConsentContext();\n\n    if (!tracking_id || !hbn_token || !context.text || !context.version || !context.url) {\n        throw new Error('Refund policy consent payload is incomplete.');\n    }\n\n    const formData = new FormData();\n    formData.append('tracking_id', tracking_id);\n    formData.append('hbn_token', hbn_token);\n    formData.append('product_handle', getProductHandle());\n    formData.append('edition', getSelectedEditionValue());\n    formData.append('refund_policy_consent', 'true');\n    formData.append('refund_policy_consent_text', context.text);\n    formData.append('refund_policy_consent_type', context.type);\n    formData.append('refund_policy_version', context.version);\n    formData.append('refund_policy_locale', context.locale);\n    formData.append('refund_policy_url', context.url);\n\n    const response = await sendToWebhook(formData, REFUND_CONSENT_INTENTION);\n\n    if (response?.success !== true || response?.consent_saved !== true) {\n        throw new Error('n8n did not confirm that refund policy consent was saved.');\n    }\n\n    window.personalizationData = {\n        ...window.personalizationData,\n        refundPolicyConsent: true,\n        refundPolicyConsentText: context.text,\n        refundPolicyConsentType: context.type,\n        refundPolicyVersion: context.version,\n        refundPolicyLocale: context.locale,\n        refundPolicyUrl: context.url,\n        refundPolicyConsentAt: response.refund_policy_consent_at || ''\n    };\n\n    return context;\n}\n\n// ==================== ORDER PLACEMENT ====================\n\nasync function addToShopifyCart() {\n    if (DEBUG) console.log('\uD83D\uDED2 Adding to Shopify cart...');\n\n    if (cartSubmissionInProgress) return;\n    if (!validateRefundPolicyConsent()) return;\n\n    cartSubmissionInProgress = true;\n    clearRefundPolicyConsentError();\n    setCartSubmissionState(true);\n    let consentSaved = false;\n\n    try {\n        // Consent must be committed before Shopify receives the cart request.\n        await saveRefundPolicyConsent();\n        consentSaved = true;\n\n        // 1) build the line-item properties (collectCartProperties must return { tracking_id, \u2026 })\n        const properties = collectCartProperties();\n\n        // 2) assemble your payload\n        const variantId = getSelectedVariantId();\n        if (!variantId) throw new Error(t('errorVariantUnavailable', 'This combination is currently unavailable.'));\n\n        const cartData = {\n            id: variantId,\n            quantity: 1,\n            properties: properties\n        };\n\n        // Request the real Horizon cart sections with the add operation.\n        const sectionIds = [...new Set(\n            Array.from(document.querySelectorAll('cart-items-component'))\n                .map(component => component.dataset.sectionId)\n                .filter(Boolean)\n        )].slice(0, 5);\n        if (sectionIds.length) {\n            cartData.sections = sectionIds;\n            cartData.sections_url = window.location.pathname + window.location.search;\n        }\n\n        // 3) send it to Shopify\n        const shopRoot = window.Shopify?.routes?.root || '/';\n        const cartResponse = await fetch(`${shopRoot}cart/add.js`, {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify(cartData)\n        });\n\n        if (!cartResponse.ok) {\n            throw new Error(`Cart error: ${cartResponse.status}`);\n        }\n\n        const cartResult = await cartResponse.json();\n        if (DEBUG) console.log('\u2705 Added to cart:', cartResult);\n\n        // \u2705 \u0411\u0410\u0413 \u0424\u0418\u041A\u0421 10: \u041F\u0435\u0440\u0435\u0445\u043E\u0434\u0438\u043C \u043D\u0430 Step 4 \u0432\u043C\u0435\u0441\u0442\u043E popup\n        currentStep = 5;\n        showStep(currentStep);\n        workflowPhase = 'added_to_cart';\n\n        const previewState = document.getElementById('step5PreviewState');\n        const successState = document.getElementById('step5SuccessState');\n        if (previewState) previewState.hidden = true;\n        if (successState) successState.hidden = false;\n        await updateCartUI(cartResult);\n\n    } catch (error) {\n        console.error('\u274C Cart error:', error);\n\n        if (!consentSaved) {\n            showRefundPolicyConsentError(\n                t(\n                    'refundConsentSaveError',\n                    'We could not save your confirmation. Please try again.'\n                )\n            );\n        } else {\n            showError(t('errorAddToCart', 'Error adding to cart'));\n        }\n    } finally {\n        cartSubmissionInProgress = false;\n        setCartSubmissionState(false);\n    }\n}\n\n/*\nasync function sendFinalOrderData() {\n    const formData = new FormData();\n\n    formData.append('tracking_id', tracking_id);\n    formData.append('hbn_token', generateHbnToken());\n    formData.append('order_id', 'shopify_' + Date.now());\n    formData.append('timestamp', new Date().toISOString());\n    formData.append('client_email', '');\n    formData.append('client_fullname', '');\n    formData.append('client_phonenumber', '');\n    formData.append('client_address', '');\n\n    const response = await sendToWebhook(formData, 'order_paid');\n    return response;\n}\n*/\n\nfunction collectCartProperties() {\n    const data = window.personalizationData || {};\n\n    // \u2705 \u0422\u041E\u041B\u042C\u041A\u041E \u0418\u041C\u042F \u0418 \u042F\u0417\u042B\u041A \u0432 \u043A\u043E\u0440\u0437\u0438\u043D\u0435 \u0434\u043B\u044F \u043F\u0440\u043E\u0441\u0442\u043E\u0442\u044B\n    return {\n        '_hbn_token': hbn_token,        // \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043E\u043B\u0436\u043D\u0430 \u0441\u0442\u043E\u044F\u0442\u044C \u043D\u0430 \u044D\u0442\u043E\u0439 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \"0\", \u0442.\u043A. \u043D8\u043D \u0438\u0449\u0435\u0442 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u0443\u044E \u043F\u043E \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u0432 properties\n        '_tracking_id': tracking_id,    // \u0441\u043A\u0440\u044B\u0442\u044B\u0435 properties \u043D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E \u043E\u0431\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u044E\u0442\u0441\u044F \u0440\u043E\u0434\u043D\u044B\u043C\u0438 webhooks by Shopify, \u043D\u043E \u043D\u0435 \u0432\u0438\u0434\u043D\u044B \u0434\u043B\u044F Webhooks App. \u0415\u0441\u043B\u0438 \u043D\u0435 \u0432\u0438\u0434\u0438\u0442 \u044D\u0442\u0443 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u0443\u044E = \u043D\u0435 \u043F\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0432 \u043D8\u043D \u0438 \u0442\u043E\u0433\u0434\u0430 \u043C\u044B \u043D\u0435 \u043C\u043E\u0436\u0435\u043C \u0441\u0432\u044F\u0437\u0430\u0442\u044C \u2116 \u0437\u0430\u043A\u0430\u0437\u0430 \u0441 tracking_id\n        '_refund_policy_consent': data.refundPolicyConsent === true ? 'true' : 'false',\n        '_refund_policy_consent_type': data.refundPolicyConsentType || '',\n        '_refund_policy_version': data.refundPolicyVersion || '',\n        '_refund_policy_locale': data.refundPolicyLocale || '',\n\n        'Child Name': data.childName || '',\n        'Language': data.language || 'en',\n        'Edition': data.edition || getSelectedEditionValue(),\n        'Extras': data.extras || getSelectedExtrasValue(),\n        'Other fields': data.extras === 'Yes' ? 'Yes' : 'No',\n        'Gender': data.gender === 'girl' ? 'Girl' : 'Boy',\n        'Eye color': data.eyeColor || '',\n        '_selected_variant_id': String(data.selectedVariantId || getSelectedVariantId() || ''),\n        '_generation_started_at': data.generationStartedAt || '',\n        '_configuration_locked_at': data.configurationLockedAt || '',\n\n\n\n        // \u2705 \u0421\u041A\u0420\u042B\u0422\u042B\u0415 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0434\u043B\u044F \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u0433\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F (\u043D\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u043A\u043E\u0440\u0437\u0438\u043D\u0435) \u0421\u043A\u0440\u044B\u0442\u044B\u0435 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u043D\u0435 \u043F\u0435\u0440\u0435\u0434\u0430\u044E\u0442\u0441\u044F \u043F\u043E Shopify Webhooks\n        /*\n\n        '_illustration_style': selectedIllustrationStyle,\n        '_traits': document.getElementById('traits')?.value.trim() || '',\n        '_interests': document.getElementById('interests')?.value.trim() || '',\n        '_superpower': document.getElementById('superpower')?.value.trim() || '',\n        '_catchphrase': document.getElementById('catchphrase')?.value.trim() || '',\n        '_dedication': document.getElementById('dedication')?.value.trim() || '',\n        '_selected_preview': currentPreviewIndex + 1,\n        */\n        '_creation_date': new Date().toLocaleDateString('en-US')\n    };\n}\n\nfunction getSelectedVariantId() {\n  if (selectedVariant?.id) return Number(selectedVariant.id);\n\n  const resolved = resolveVariant();\n  return resolved?.available ? Number(resolved.id) : null;\n}\n\n// ==================== PREVIEW SLIDER FUNCTIONS ====================\n\n// Gallery controls belong to the personalization component.\nfunction getPreviewGalleryLabels() {\n  const language = (document.documentElement.lang || 'en').toLowerCase().split('-')[0];\n  const labels = {\n    en: { image: 'Preview', of: 'of', previous: 'Previous preview', next: 'Next preview', expand: 'Open a larger preview', upload: 'Choose a photo of your child' },\n    ru: { image: '\u041F\u0440\u0435\u0432\u044C\u044E', of: '\u0438\u0437', previous: '\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u043F\u0440\u0435\u0432\u044C\u044E', next: '\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u043F\u0440\u0435\u0432\u044C\u044E', expand: '\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u043D\u043E\u0435 \u043F\u0440\u0435\u0432\u044C\u044E', upload: '\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0444\u043E\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u044E \u0440\u0435\u0431\u0451\u043D\u043A\u0430' },\n    lv: { image: 'Priek\u0161skat\u012Bjums', of: 'no', previous: 'Iepriek\u0161\u0113jais priek\u0161skat\u012Bjums', next: 'N\u0101kamais priek\u0161skat\u012Bjums', expand: 'Atv\u0113rt liel\u0101ku priek\u0161skat\u012Bjumu', upload: 'Izv\u0113l\u0113ties b\u0113rna fotoatt\u0113lu' }\n  };\n  return labels[language] || labels.en;\n}\n\nfunction initPreviewGallery() {\n  const root = document.getElementById('personalizationFormWrapper');\n  const gallery = root?.querySelector('#previewSliderSection');\n  const thumbnails = gallery?.querySelector('.preview-thumbnails');\n  if (!gallery || !thumbnails || gallery.dataset.hbnGalleryBound) return;\n  gallery.dataset.hbnGalleryBound = 'true';\n  const labels = getPreviewGalleryLabels();\n  root.querySelector('#prevPreviewBtn')?.setAttribute('aria-label', labels.previous);\n  root.querySelector('#nextPreviewBtn')?.setAttribute('aria-label', labels.next);\n\n  thumbnails.addEventListener('keydown', event => {\n    const item = event.target.closest('.thumbnail-item');\n    if (!item || !thumbnails.contains(item)) return;\n    const items = [...thumbnails.querySelectorAll('.thumbnail-item')];\n    const index = items.indexOf(item);\n    const next = { ArrowDown: index + 1, ArrowRight: index + 1, ArrowUp: index - 1, ArrowLeft: index - 1, Home: 0, End: items.length - 1 }[event.key];\n    if (next === undefined) return;\n    event.preventDefault();\n    const target = items[Math.max(0, Math.min(items.length - 1, next))];\n    target?.click();\n    target?.focus();\n  });\n\n  const image = root.querySelector('#mainPreviewImage');\n  const upload = root.querySelector('#mainPreviewContainer');\n  [[image, labels.expand], [upload, labels.upload]].forEach(([element, label]) => {\n    if (!element) return;\n    element.setAttribute('role', 'button');\n    element.setAttribute('aria-label', label);\n    element.tabIndex = 0;\n    element.addEventListener('keydown', event => {\n      if (event.target !== element) return;\n      if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); element.click(); }\n      if (element === image && event.key === 'ArrowLeft') { event.preventDefault(); previousPreview(); }\n      if (element === image && event.key === 'ArrowRight') { event.preventDefault(); nextPreview(); }\n    });\n  });\n  image?.setAttribute('aria-haspopup', 'dialog');\n  const counter = gallery.querySelector('.preview-page-indicator');\n  counter?.setAttribute('aria-live', 'polite');\n  counter?.setAttribute('aria-atomic', 'true');\n}\n\n\n\nfunction showPreviewSlider() {\n  const sliderSection = document.getElementById('previewSliderSection');\n  if (sliderSection) sliderSection.style.display = 'block';\n\n  const actions = document.getElementById('finalizeActions');\n  if (actions) actions.style.display = 'flex';\n\n  // \u2705 \u0447\u0442\u043E\u0431\u044B \u0441\u0440\u0430\u0437\u0443 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E \u043F\u043E\u0434\u0441\u0432\u0435\u0442\u0438\u043B\u043E\u0441\u044C\n  updatePreviewNavigation();\n}\n\n\nfunction hidePreviewSlider() {\n  const sliderSection = document.getElementById('previewSliderSection');\n  if (sliderSection) sliderSection.style.display = 'none';\n\n  const actions = document.getElementById('finalizeActions');\n  if (actions) actions.style.display = 'flex';\n\n}\n\n\n\n\n\nfunction loadPreviewImages() {\n    if (!previewImages || previewImages.length === 0) {\n        console.error('\u274C No preview images to load');\n        return;\n    }\n\n    if (DEBUG) console.log(`\uD83D\uDDBC\uFE0F Loading ${previewImages.length} preview images...`);\n\n    updateMainPreviewImage();\n    updatePreviewThumbnails();\n    updatePreviewNavigation();\n\n    // \u041F\u0440\u0435\u0434\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043C \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u043B\u0443\u0447\u0448\u0435\u0439 \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438\n    previewImages.forEach((imageUrl, index) => {\n        const img = new Image();\n        img.onload = () => {\n            if (DEBUG) console.log(`\u2705 Image ${index + 1} preloaded successfully`);\n        };\n        img.onerror = () => {\n            console.error(`\u274C Failed to load image ${index + 1}:`, imageUrl);\n        };\n        img.src = imageUrl;\n    });\n}\n\nfunction updateMainPreviewImage() {\n    const mainImg = document.getElementById('mainPreviewImage');\n    const currentPage = document.getElementById('currentPreviewPage');\n    const totalPages = document.getElementById('totalPreviewPages');\n\n    if (mainImg && previewImages[currentPreviewIndex]) {\n        const imageUrl = previewImages[currentPreviewIndex];\n        if (DEBUG) console.log(`\uD83D\uDDBC\uFE0F Displaying image ${currentPreviewIndex + 1}:`, imageUrl);\n\n        mainImg.src = imageUrl;\n\n        // inside updateMainPreviewImage(), after mainImg.src = imageUrl;\n\nmainImg.style.cursor = 'zoom-in';\n\nmainImg.onclick = (e) => {\n  // \u0442\u043E\u043B\u044C\u043A\u043E \u041B\u041A\u041C\n  if (e.button !== 0) return;\n  openPreviewLightbox(imageUrl);\n};\n\n        // \u0414\u043E\u0431\u0430\u0432\u043B\u044F\u0435\u043C \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 \u0434\u043B\u044F \u043E\u0442\u043B\u0430\u0434\u043A\u0438\n        if (DEBUG) {\n            mainImg.onload = () => {\n            console.log(`\u2705 Main image ${currentPreviewIndex + 1} loaded successfully`);\n            }\n        };\n\n        mainImg.onerror = () => {\n            console.error(`\u274C Failed to load main image ${currentPreviewIndex + 1}:`, imageUrl);\n            // \u041C\u043E\u0436\u043D\u043E \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C fallback \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435\n            mainImg.src = 'https://via.placeholder.com/400x500/cccccc/666666?text=Image+Not+Found';\n        };\n    }\n\n    if (currentPage) currentPage.textContent = currentPreviewIndex + 1;\n    if (totalPages) totalPages.textContent = previewImages.length;\n}\n\nfunction updatePreviewThumbnails() {\n    const thumbnailsContainer = document.querySelector('#previewSliderSection .preview-thumbnails');\n    if (!thumbnailsContainer) return;\n    const labels = getPreviewGalleryLabels();\n    thumbnailsContainer.replaceChildren();\n\n    previewImages.forEach((imageUrl, index) => {\n        const thumbnail = document.createElement('button');\n        thumbnail.type = 'button';\n        thumbnail.className = 'thumbnail-item';\n        thumbnail.classList.toggle('active', index === currentPreviewIndex);\n        thumbnail.setAttribute('aria-label', labels.image + ' ' + (index + 1) + ' ' + labels.of + ' ' + previewImages.length);\n        thumbnail.setAttribute('aria-controls', 'mainPreviewImage');\n        thumbnail.setAttribute('aria-pressed', String(index === currentPreviewIndex));\n        thumbnail.addEventListener('click', () => selectPreview(index));\n\n        const image = document.createElement('img');\n        image.src = imageUrl;\n        image.alt = '';\n        image.draggable = false;\n        const number = document.createElement('span');\n        number.className = 'thumbnail-number';\n        number.textContent = index + 1;\n        number.setAttribute('aria-hidden', 'true');\n        thumbnail.append(image, number);\n        thumbnailsContainer.appendChild(thumbnail);\n    });\n}\n\nfunction selectPreview(index) {\n    if (index < 0 || index >= previewImages.length) return;\n    currentPreviewIndex = index;\n    updateMainPreviewImage();\n\n    document.querySelectorAll('#previewSliderSection .thumbnail-item').forEach((thumb, i) => {\n        thumb.classList.toggle('active', i === index);\n        thumb.setAttribute('aria-pressed', String(i === index));\n    });\n    updatePreviewNavigation();\n}\n\nfunction previousPreview() {\n    if (currentPreviewIndex > 0) {\n        selectPreview(currentPreviewIndex - 1);\n    }\n}\n\nfunction nextPreview() {\n    if (currentPreviewIndex < previewImages.length - 1) {\n        selectPreview(currentPreviewIndex + 1);\n    }\n}\n\nfunction setArrowState(btn, enabled) {\n  if (!btn) return;\n\n  btn.classList.toggle('is-disabled', !enabled);\n  btn.setAttribute('aria-disabled', enabled ? 'false' : 'true');\n  btn.tabIndex = enabled ? 0 : -1;\n\n  // \u041D\u0430 \u0432\u0441\u044F\u043A\u0438\u0439 \u0441\u043B\u0443\u0447\u0430\u0439: \u0435\u0441\u043B\u0438 \u0442\u0435\u043C\u0430/\u0441\u0442\u0438\u043B\u0438 \u0433\u0434\u0435-\u0442\u043E \u0436\u0451\u0441\u0442\u043A\u043E \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u044E\u0442 opacity\n  btn.style.opacity = enabled ? '1' : '.22';\n  btn.style.pointerEvents = enabled ? 'auto' : 'none';\n}\n\nfunction updatePreviewNavigation() {\n  const gallery = document.getElementById('previewSliderSection');\n  if (gallery) gallery.dataset.hbnPreviewCount = String(previewImages?.length || 0);\n\n  const prevBtn = document.getElementById('prevPreviewBtn');\n  const nextBtn = document.getElementById('nextPreviewBtn');\n\n  const total = Array.isArray(previewImages) ? previewImages.length : 0;\n\n  // \u0435\u0441\u043B\u0438 \u0434\u0430\u043D\u043D\u044B\u0445 \u0435\u0449\u0451 \u043D\u0435\u0442 \u2014 \u043E\u0431\u0435 \u201C\u0432\u044B\u043A\u043B\u201D\n  if (total <= 1) {\n    setArrowState(prevBtn, false);\n    setArrowState(nextBtn, false);\n    return;\n  }\n\n  const canGoPrev = currentPreviewIndex > 0;\n  const canGoNext = currentPreviewIndex < total - 1;\n\n  setArrowState(prevBtn, canGoPrev);\n  setArrowState(nextBtn, canGoNext);\n}\n\n\nfunction setupPreviewNavigation() {\n    const prevBtn = document.getElementById('prevPreviewBtn');\n    const nextBtn = document.getElementById('nextPreviewBtn');\n\n    if (prevBtn) prevBtn.onclick = previousPreview;\n    if (nextBtn) nextBtn.onclick = nextPreview;\n}\n\nfunction generateNewPreviews() {\n    generatePreview();\n}\n\n/*\n// ==================== ILLUSTRATION STYLE FUNCTIONS ====================\n\nfunction selectIllustrationStyle(element) {\n    if (!element?.dataset?.style) return;\n\n    const style = element.dataset.style;\n\n    document.querySelectorAll('.style-btn').forEach(btn => {\n        btn.classList.remove('selected');\n    });\n\n    element.classList.add('selected');\n    selectedIllustrationStyle = style;\n\n    updateIllustrationStyleDisplay(style);\n\n    if (DEBUG) console.log('\u2705 Illustration style selected:', selectedIllustrationStyle);\n}\n\nfunction updateIllustrationStyleDisplay(style) {\n    const styleLabel = document.getElementById('illustrationStyleLabel');\n    if (styleLabel) {\n        const styleNames = {\n            '3d': '3D Style',\n            'anime': 'Anime Style',\n            'classic': 'Classic Style',\n            'comic': 'Comic Style',\n            'kawaii': 'Kawaii Style',\n            'pixel-block': 'Pixel Block Style'\n        };\n\n        const displayName = styleNames[style] || style.toUpperCase();\n        styleLabel.textContent = displayName;\n        styleLabel.style.color = '#667eea';\n        styleLabel.style.fontWeight = 'bold';\n    }\n}\n\nfunction initializeDefaultStyle() {\n    const defaultStyleBtn = document.querySelector('.style-btn[data-style=\"3d\"]');\n    if (defaultStyleBtn) {\n        selectIllustrationStyle(defaultStyleBtn);\n    } else {\n        const firstStyleBtn = document.querySelector('.style-btn');\n        if (firstStyleBtn) {\n            selectIllustrationStyle(firstStyleBtn);\n        }\n    }\n}\n*/\n\n// ==================== PHOTO FUNCTIONS (SIMPLE - NO CROP) ====================\n\nfunction initializePhotoHandlers() {\n    const fileInput = document.getElementById('childPhoto');\n    if (fileInput) {\n        fileInput.onchange = handlePhotoUpload;\n    }\n\n    const previewContainer = document.getElementById('mainPreviewContainer');\n    if (previewContainer) {\n        previewContainer.onclick = function(e) {\n            if (getCurrentStep() === 2) {\n                e.preventDefault();\n                e.stopPropagation();\n                triggerFileUpload();\n            }\n        };\n    }\n}\n\nfunction triggerFileUpload() {\n    const fileInput = document.getElementById('childPhoto');\n    if (fileInput) fileInput.click();\n}\n\nfunction handlePhotoUpload(event) {\n    const file = event.target.files[0];\n    if (!file) return;\n\n    if (DEBUG) console.log('\uD83D\uDCF8 Processing photo upload...');\n\n    // \u2705 \u0411\u0410\u0413 \u0424\u0418\u041A\u0421 4: \u0423\u0431\u0438\u0440\u0430\u0435\u043C \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0443 \u0441\u043A\u0440\u043E\u043B\u043B\u0430\n    document.body.style.overflow = '';\n\n    if (file.size > MAX_IMAGE_FILE_SIZE) {\n        showError(t('errorFileTooLarge', 'File too large. Maximum size: 10MB'));\n        event.target.value = '';\n        return;\n    }\n\n    if (!file.type.startsWith('image/')) {\n        showError(t('errorUploadImage', 'Please upload an image file'));\n        event.target.value = '';\n        return;\n    }\n\n    const reader = new FileReader();\n    reader.onload = function(e) {\n        const imageSrc = e.target.result;\n        if (DEBUG) console.log('\uD83D\uDCF8 Image loaded, showing photo preview...');\n        showPhotoPreview(imageSrc);\n    };\n\n    reader.readAsDataURL(file);\n}\n\nfunction showPhotoPreview(imageSrc) {\n    if (DEBUG) console.log('\uD83D\uDCF8 Showing photo preview...');\n\n    const miniPhotoPreview = document.getElementById('miniPhotoPreview');\n    const miniPhotoImg = document.getElementById('miniPhotoImg');\n\n    if (miniPhotoImg && miniPhotoPreview) {\n        miniPhotoImg.src = imageSrc;\n\n        if (getCurrentStep() === 2) {\n            miniPhotoPreview.style.display = 'block';\n            miniPhotoPreview.style.opacity = '1';\n            miniPhotoPreview.style.visibility = 'visible';\n            miniPhotoPreview.classList.add('visible');\n        }\n\n        const previewContainer = document.getElementById('mainPreviewContainer');\n        if (previewContainer) {\n            previewContainer.style.backgroundImage = `url(${imageSrc})`;\n            previewContainer.style.backgroundSize = 'cover';\n            previewContainer.style.backgroundPosition = 'center';\n\n            const coverText = previewContainer.querySelector('.cover-text');\n            if (coverText) {\n                coverText.style.opacity = '0.7';\n                coverText.style.backgroundColor = 'rgba(255,255,255,0.8)';\n                coverText.style.borderRadius = '10px';\n                coverText.style.padding = '10px';\n            }\n        }\n\n        window.photoUploaded = true;\n        if (DEBUG) console.log('\u2705 Photo preview shown successfully!');\n    }\n}\n\n// ==================== NAVIGATION FUNCTIONS ====================\n\nfunction nextStep() {\n    switch(currentStep) {\n        case 1:\n            if (!validateBookStep()) return false;\n            showStep(2, true);\n            return true;\n        case 2:\n            if (!validateStep1()) return false;\n            showStep(3, true);\n            return true;\n        case 3: return nextStepFromStep1();\n        case 4: return nextStepFromStep2();\n        default: console.log('No next step available');\n    }\n}\n\nfunction previousStep() {\n    if (setupLocked) {\n        if (currentStep === 5) showStep(4, true);\n        return;\n    }\n\n    if (currentStep === 2 || currentStep === 3) {\n        showStep(currentStep - 1, true);\n    }\n}\n\nfunction getPersonalizationHeaderOffset() {\n    const candidates = document.querySelectorAll(\n        'header-component, .shopify-section-group-header-group, .header-section, .shopify-section--header, #shopify-section-header, header'\n    );\n    let visibleBottom = 0;\n\n    candidates.forEach(candidate => {\n        const rect = candidate.getBoundingClientRect();\n\n        if (\n            rect.height > 0 &&\n            rect.height < 220 &&\n            rect.top <= 8 &&\n            rect.bottom > 0\n        ) {\n            visibleBottom = Math.max(visibleBottom, rect.bottom);\n        }\n    });\n\n    return Math.max(0, visibleBottom);\n}\n\nfunction scrollToPersonalizationTop() {\n    const personalizationSection = document.getElementById('hbn-personalization');\n    if (!personalizationSection) return;\n\n    // Wait until the newly selected step has changed the section height.\n    requestAnimationFrame(() => {\n        requestAnimationFrame(() => {\n            const headerOffset = getPersonalizationHeaderOffset();\n            const sectionTop = window.scrollY + personalizationSection.getBoundingClientRect().top;\n            const prefersReducedMotion = window.matchMedia?.('(prefers-reduced-motion: reduce)').matches;\n\n            window.scrollTo({\n                top: Math.max(0, sectionTop - headerOffset - 16),\n                behavior: prefersReducedMotion ? 'auto' : 'smooth'\n            });\n        });\n    });\n}\n\nfunction showStep(step, shouldScrollToForm = false) {\n    if (DEBUG) console.log(`\uD83D\uDC41\uFE0F Showing step ${step}`);\n\n    if (setupLocked && step <= 3) return false;\n\n    // \u2705 \u0411\u0410\u0413 \u0424\u0418\u041A\u0421 1: \u0421\u043A\u0440\u044B\u0432\u0430\u0435\u043C \u0432\u0441\u0435 step content \u0411\u0415\u0417 \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432\n    document.querySelectorAll('.step-content').forEach(content => {\n        content.style.display = 'none';\n        content.classList.remove('active');\n    });\n\n    const stepContent = document.querySelector(`.step-content[data-step=\"${step}\"]`);\n    if (stepContent) {\n        stepContent.style.display = 'block';\n        stepContent.classList.add('active');\n        if (DEBUG) console.log(`\u2705 Step ${step} content activated`);\n    }\n\n    currentStep = step;\n    window.HBNWaitGame?.setStepActive?.(step === 5);\n    if (step === 5) refreshRefundPolicyConsentUI();\n    updateStepIndicator();\n\n    // \u2705 \u0411\u0410\u0413 \u0424\u0418\u041A\u0421 2: \u041E\u0431\u043D\u043E\u0432\u043B\u044F\u0435\u043C \u0432\u0438\u0434\u0438\u043C\u043E\u0441\u0442\u044C \u0444\u043E\u0442\u043E \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u043E\u0439\n    setTimeout(() => {\n        updatePhotoButtonsVisibility();\n    }, 50);\n\n    if (shouldScrollToForm) {\n        scrollToPersonalizationTop();\n    }\n\n    // \u2705 \u0411\u0410\u0413 \u0424\u0418\u041A\u0421 1: \u041D\u0415 \u041E\u0422\u041F\u0420\u0410\u0412\u041B\u042F\u0415\u041C \u041D\u0418\u041A\u0410\u041A\u0418\u0425 \u0417\u0410\u041F\u0420\u041E\u0421\u041E\u0412 \u043F\u0440\u0438 \u0441\u043C\u0435\u043D\u0435 step\n    if (DEBUG) console.log(`\uD83D\uDEAB No automatic requests sent for step ${step}`);\n    return true;\n}\n\nfunction updateStepIndicator() {\n    document.querySelectorAll('.step').forEach((step, index) => {\n        const stepNumber = index + 1;\n\n        step.classList.remove('active', 'completed', 'locked');\n\n        if (stepNumber < currentStep) {\n            step.classList.add('completed');\n        } else if (stepNumber === currentStep) {\n            step.classList.add('active');\n        }\n\n        if (setupLocked && stepNumber <= 3) step.classList.add('locked', 'completed');\n        step.style.display = 'flex';\n    });\n\n    const mobileCurrent = document.getElementById('hbnMobileStepCurrent');\n    const mobileLabel = document.getElementById('hbnMobileStepLabel');\n    const labels = [\n        t('stepBook', 'Book'),\n        t('stepChild', 'Child'),\n        t('stepExtras', 'Extras'),\n        t('stepDedication', 'Dedication'),\n        t('stepPreview', 'Preview')\n    ];\n\n    if (mobileCurrent) mobileCurrent.textContent = String(currentStep);\n    if (mobileLabel) mobileLabel.textContent = labels[currentStep - 1] || '';\n}\n\nfunction initializeGlobalNavigation() {\n    const navButtons = document.querySelectorAll('.navigation-buttons-step');\n    navButtons.forEach(nav => {\n        nav.style.display = 'flex';\n    });\n}\n\n// ==================== UTILITY FUNCTIONS ====================\n\nfunction getCurrentStep() {\n    const activeStep = document.querySelector('.step-content.active');\n    return activeStep ? parseInt(activeStep.dataset.step) : 1;\n}\n\nfunction updatePhotoButtonsVisibility() {\n    const currentStepNum = getCurrentStep();\n    const previewContainer = document.getElementById('mainPreviewContainer');\n    const miniPhotoPreview = document.getElementById('miniPhotoPreview');\n    const mainPreviewArea = document.getElementById('mainPreviewArea');\n\n    if (DEBUG) console.log(`\uD83D\uDD04 Updating photo visibility for step ${currentStepNum}`);\n\n    if (currentStepNum === 2) {\n        if (mainPreviewArea) {\n            mainPreviewArea.style.display = 'block';\n        }\n\n        if (previewContainer) {\n            previewContainer.classList.add('clickable');\n            previewContainer.style.display = 'flex';\n            if (DEBUG) console.log('\uD83D\uDCF8 Preview container made clickable and visible');\n        }\n\n        // \u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u043C \u043C\u0438\u043D\u0438 \u043F\u0440\u0435\u0432\u044C\u044E \u0435\u0441\u043B\u0438 \u0444\u043E\u0442\u043E \u0431\u044B\u043B\u043E \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u043E\n        if (window.photoUploaded && miniPhotoPreview) {\n            miniPhotoPreview.style.display = 'block';\n            miniPhotoPreview.classList.add('visible');\n            if (DEBUG) console.log('\uD83D\uDCF8 Mini photo preview shown (photo was uploaded)');\n        }\n    } else {\n        // Step 3+ \u0438 Step 4: \u0441\u043A\u0440\u044B\u0432\u0430\u0435\u043C \u0432\u0441\u0435 \u0444\u043E\u0442\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B\n        if (mainPreviewArea) {\n            mainPreviewArea.style.display = 'none';\n        }\n\n        if (previewContainer) {\n            previewContainer.style.display = 'none';\n            previewContainer.classList.remove('clickable');\n            previewContainer.style.backgroundImage = '';\n        }\n\n        if (miniPhotoPreview) {\n            miniPhotoPreview.style.display = 'none';\n            miniPhotoPreview.classList.remove('visible');\n        }\n    }\n}\n\nfunction setupDragAndDrop() {\n    const previewContainer = document.getElementById('mainPreviewContainer');\n\n    if (previewContainer) {\n        previewContainer.addEventListener('dragover', function(e) {\n            e.preventDefault();\n            previewContainer.style.borderColor = '#667eea';\n        });\n\n        previewContainer.addEventListener('dragleave', function(e) {\n            e.preventDefault();\n            previewContainer.style.borderColor = '';\n        });\n\n        previewContainer.addEventListener('drop', function(e) {\n            e.preventDefault();\n            previewContainer.style.borderColor = '';\n\n            const files = e.dataTransfer.files;\n            if (files.length > 0) {\n                const file = files[0];\n                if (file.type.startsWith('image/')) {\n                    const fileInput = document.getElementById('childPhoto');\n                    if (fileInput) {\n                        const dataTransfer = new DataTransfer();\n                        dataTransfer.items.add(file);\n                        fileInput.files = dataTransfer.files;\n\n                        handlePhotoUpload({ target: { files: [file] } });\n                    }\n                } else {\n                    showError(t('errorDragImage', 'Please drag an image file'));\n                }\n            }\n        });\n    }\n}\n\n//Dedication limit\nfunction updateDedicationCharacterCount() {\n    const textarea = document.getElementById('dedication');\n    const charCount = document.getElementById('charCountDedication');\n\n    if (textarea && charCount) {\n        const count = textarea.value.length;\n        charCount.textContent = count;\n\n        if (count > 349) {\n            charCount.style.color = '#dc3545';\n            textarea.value = textarea.value.substring(0, 350);\n            charCount.textContent = '350';\n        } else if (count > 330) {\n            charCount.style.color = '#fd7e14';\n        } else {\n            charCount.style.color = '#6c757d';\n        }\n    }\n}\n\nfunction fillDedicationField(dedicationText) {\n    if (DEBUG) console.log('\uD83D\uDCDD Filling dedication field with:', dedicationText);\n\n    const dedicationTextarea = document.getElementById('dedication');\n\n    if (dedicationTextarea) {\n        // \u2705 \u0411\u0410\u0413 \u0424\u0418\u041A\u0421 6: \u0417\u0430\u043F\u043E\u043B\u043D\u044F\u0435\u043C \u043F\u043E\u043B\u0435 \u0442\u0435\u043A\u0441\u0442\u043E\u043C \u0438\u0437 webhook response\n        dedicationTextarea.value = dedicationText || '';\n        updateDedicationCharacterCount();\n\n        // \u2705 \u0411\u0410\u0413 \u0424\u0418\u041A\u0421 6: \u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044E \u0447\u0442\u043E \u0442\u0435\u043A\u0441\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D\n        if (DEBUG) {\n            if (dedicationText && dedicationText.length > 10) {\n                showSuccess(t('successDedicationLoaded', '\uD83D\uDCDD Dedication text loaded automatically!'));\n            }\n        }\n    } else {\n        console.error('\u274C Dedication textarea not found!');\n    }\n}\n\n// ==================== UI HELPER FUNCTIONS ====================\n\n// \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u043A\u043D\u043E\u043F\u043A\u0438 Step 3\nfunction resetStep3FinalActionButton() {\n  const btn = document.getElementById('step3FinalActionBtn');\n  if (!btn) return;\n\n  btn.textContent = t('addToCart', 'Add to cart');\n  btn.className = 'nav-step-btn nav-next add-to-cart-btn';\n  btn.onclick = addToShopifyCart;\n  syncRefundPolicyConsentButtonState();\n}\n\nfunction setStep3FinalActionToRestart() {\n  const actions = document.getElementById('finalizeActions');\n  const btn = document.getElementById('step3FinalActionBtn');\n\n  if (actions) actions.style.display = 'flex';\n  if (!btn) return;\n\n  btn.textContent = t('startOver', 'Start over');\n  btn.className = 'finalize-btn hbn-step4-btn hbn-step4-btn-secondary';\n  btn.onclick = function () {\n    window.location.reload();\n  };\n}\n\n// Controls visibility of the \"What happens next\" button via a .show class\nfunction setWhatNextVisible(isVisible) {\n  const btn = document.getElementById('whatNextBtn');\n  if (!btn) return;\n  btn.classList.toggle('show', !!isVisible);\n}\n\n// Sync button with current slider visibility (useful on step re-entry)\nfunction syncWhatNextToSlider() {\n  const slider = document.getElementById('previewSliderSection');\n  const visible = !!(slider && getComputedStyle(slider).display !== 'none');\n  setWhatNextVisible(visible);\n}\n\n\nfunction showGenerationProgress() {\n  setWhatNextVisible(false);\n\n  const lottieWrap = document.getElementById('previewLottieSection');\n  if (lottieWrap) lottieWrap.style.display = 'block';\n\n  window.HBNWaitGame?.setGenerationActive?.(true);\n\n  hbnShowPreviewCountdown();\n\n  if (window.HBNWaitGame?.isGameOpen?.()) {\n    window.HBNWaitGame.pauseLottie?.();\n  } else {\n    startLottieTextSpinner();\n  }\n}\n\n\n// Show preview error message\nfunction setPreviewErrorVisible(isVisible, message = '') {\n  const wrap = document.getElementById('previewErrorSection');\n  const text = document.getElementById('previewErrorMessage');\n\n  if (!wrap) return;\n\n  if (text && message) {\n    text.textContent = decodeHtmlEntities(message);\n  }\n\n  wrap.style.display = isVisible ? 'block' : 'none';\n}\n\nfunction hidePreviewError() {\n  setPreviewErrorVisible(false);\n}\n\nfunction showPreviewInlineError(message) {\n  hideGenerationProgress();\n  hidePreviewSlider();\n  setWhatNextVisible(false);\n\n  const fallbackMessage = t(\n    'previewErrorMessage',\n    'We\u2019ve been notified and are already checking it. Please keep this page open and try again in a moment.'\n  );\n\n  setPreviewErrorVisible(true, message || fallbackMessage);\n}\n\nfunction retryPreviewAfterError() {\n  hidePreviewError();\n  previewExperienceStarted = true;\n  window.HBNWaitGame?.notifyError?.();\n  showGenerationProgress();\n  startPreviewTracking({ showProgress: true });\n}\n\n\n\n\n\nfunction hideGenerationProgress() {\n  // Hide dotLottie + stop spinner\n  stopLottieTextSpinner();\n\n  window.HBNWaitGame?.setGenerationActive?.(false);\n\n  // \u2705 \u0421\u041A\u0420\u042B\u0412\u0410\u0415\u041C \u0422\u0410\u0419\u041C\u0415\u0420\n  hbnHidePreviewCountdown();\n\n  const lottieWrap = document.getElementById('previewLottieSection');\n  if (lottieWrap) lottieWrap.style.display = 'none';\n\n  if (window.currentProgressInterval) {\n    clearInterval(window.currentProgressInterval);\n    window.currentProgressInterval = null;\n  }\n}\n\n\n\n// ==================== NOTIFICATION FUNCTIONS ====================\n\nfunction showError(message) {\n    console.error('\u274C Error:', message);\n    showNotification(message, 'error');\n}\n\nfunction showSuccess(message) {\n    if (DEBUG) console.log('\u2705 Success:', message);\n    showNotification(message, 'success');\n}\n\nfunction showNotification(message, type = 'info') {\n    const existing = document.getElementById('notification');\n    if (existing) existing.remove();\n\n    const colors = {\n        error: '#dc3545',\n        success: '#28a745',\n        info: '#17a2b8'\n    };\n\n    const notification = document.createElement('div');\n    notification.id = 'notification';\n    notification.style.cssText = `\n        position: fixed; top: 20px; right: 20px; background: ${colors[type]};\n        color: white; padding: 15px 20px; border-radius: 8px; z-index: 9999;\n        font-family: 'Sour Gummy'; font-size: 0.9rem;\n        box-shadow: 0 4px 12px rgba(0,0,0,0.3); max-width: 300px;\n        opacity: 0; transform: translateX(100%); transition: all 0.3s ease;\n        white-space: pre-line; line-height: 1.5;\n    `;\n\n    notification.textContent = decodeHtmlEntities(message);\n    document.body.appendChild(notification);\n\n    requestAnimationFrame(() => {\n        notification.style.opacity = '1';\n        notification.style.transform = 'translateX(0)';\n    });\n\n    setTimeout(() => {\n        if (document.body.contains(notification)) {\n            notification.style.opacity = '0';\n            notification.style.transform = 'translateX(100%)';\n            setTimeout(() => notification.remove(), 300);\n        }\n    }, type === 'error' ? 5000 : 3000);\n}\n\nfunction showStepTransitionLoading(message) {\n    const loadingDiv = document.createElement('div');\n    loadingDiv.id = 'stepTransitionLoading';\n    loadingDiv.style.cssText = `\n        position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%);\n        background: rgba(0, 0, 0, 0.8); color: white; padding: 20px 30px;\n        border-radius: 10px; z-index: 9999; font-family: 'Sour Gummy';\n        text-align: center; display: flex; align-items: center; gap: 15px;\n    `;\n\n    loadingDiv.innerHTML = `\n        <div style=\"width: 20px; height: 20px; border: 2px solid #f3f3f3;\n            border-top: 2px solid #667eea; border-radius: 50%;\n            animation: spin 1s linear infinite;\"></div>\n        <span>${message}</span>\n    `;\n\n    document.body.appendChild(loadingDiv);\n}\n\nfunction hideStepTransitionLoading() {\n    const loadingDiv = document.getElementById('stepTransitionLoading');\n    if (loadingDiv) loadingDiv.remove();\n}\n\nasync function updateCartUI(cartResult = null) {\n    const shopRoot = window.Shopify?.routes?.root || '/';\n    let cart = null;\n\n    try {\n        const response = await fetch(`${shopRoot}cart.js`, {\n            credentials: 'same-origin',\n            cache: 'no-store',\n            headers: { Accept: 'application/json' }\n        });\n        if (!response.ok) throw new Error(`Cart refresh error: ${response.status}`);\n\n        const updatedCart = await response.json();\n        if (!Number.isInteger(updatedCart.item_count) || updatedCart.item_count < 0) {\n            throw new Error('Cart response is missing a valid item_count.');\n        }\n        cart = updatedCart;\n    } catch (error) {\n        // The add already succeeded. Do not ask the customer to add it again.\n        console.warn('Cart count refresh failed; using the confirmed addition.', error);\n    }\n\n    if (!cart && !cartResult) return;\n\n    // Horizon sets the absolute count for our source. Its product-form source\n    // instead INCREMENTS the badge: use that only as the one-item fallback.\n    // Never use cartResult.quantity here; Shopify may return a cumulative value.\n    document.dispatchEvent(new CustomEvent('cart:update', {\n        bubbles: true,\n        detail: {\n            resource: cart || {},\n            sourceId: 'hbn-personalization',\n            data: {\n                source: cart ? 'hbn-personalization' : 'product-form-component',\n                itemCount: cart ? cart.item_count : 1,\n                // Missing/null sections are re-fetched by Horizon itself.\n                sections: cartResult?.sections || {}\n            }\n        }\n    }));\n}\n\nfunction openHbnModal(modal, focusTarget) {\n  if (!modal) return;\n  modal.style.display = 'flex';\n  modal.setAttribute('aria-hidden', 'false');\n  document.body.style.overflow = 'hidden';\n  requestAnimationFrame(() => focusTarget?.focus());\n}\n\nfunction closeHbnModal(modal) {\n  if (!modal) return;\n  modal.style.display = 'none';\n  modal.setAttribute('aria-hidden', 'true');\n  document.body.style.overflow = '';\n}\n\n// photo guidelines popup\nconst photoBtn = document.getElementById('photoReqBtn');\nconst photoModal = document.getElementById('photoReqModal');\nconst photoClose = document.getElementById('photoReqClose');\n\nif (photoBtn && photoModal && photoClose) {\n  photoBtn.addEventListener('click', () => {\n    openHbnModal(\n      photoModal,\n      photoModal.querySelector('.hbn-tab-btn.active') || photoClose\n    );\n  });\n  photoClose.addEventListener('click', () => {\n    closeHbnModal(photoModal);\n  });\n  // close when clicking outside content\n  photoModal.addEventListener('click', e => {\n    if (e.target === photoModal) closeHbnModal(photoModal);\n  });\n};\n\n// Photo Guidelines modal tabs\nfunction initPhotoModalTabs() {\n  const modal = document.getElementById('photoReqModal');\n  if (!modal) return;\n\n  const tabButtons = modal.querySelectorAll('.hbn-tab-btn[data-tab]');\n  const panels = modal.querySelectorAll('.hbn-tab-panel');\n\n  function activateTab(tabId) {\n    // buttons\n    tabButtons.forEach(btn => {\n      const isActive = btn.dataset.tab === tabId;\n      btn.classList.toggle('active', isActive);\n      btn.setAttribute('aria-selected', isActive ? 'true' : 'false');\n    });\n\n    // panels\n    panels.forEach(p => {\n      p.classList.toggle('active', p.id === tabId);\n    });\n  }\n\n  tabButtons.forEach(btn => {\n    btn.addEventListener('click', () => activateTab(btn.dataset.tab));\n  });\n\n  // When modal opens, always start from tab 1\n  const photoBtn = document.getElementById('photoReqBtn');\n  if (photoBtn) {\n    photoBtn.addEventListener('click', () => activateTab('photoTab1'));\n  }\n}\n\ninitPhotoModalTabs();\n\n\ndocument.addEventListener('keydown', event => {\n  if (event.key !== 'Escape') return;\n\n  if (photoModal?.style.display === 'flex') {\n    closeHbnModal(photoModal);\n  }\n});\n\n// ==================== PREVIEW LIGHTBOX (square + nav) ====================\n\nlet _hbnLightboxIndex = 0;\nlet _hbnLightboxOpener = null;\nlet _hbnLightboxBodyOverflow = \"\";\n\nfunction _hbnSetArrowState(btn, enabled) {\n  if (!btn) return;\n  btn.classList.toggle('is-disabled', !enabled);\n  btn.setAttribute('aria-disabled', enabled ? 'false' : 'true');\n  btn.tabIndex = enabled ? 0 : -1;\n}\n\nfunction _hbnRenderLightbox() {\n  const img = document.getElementById('previewLightboxImg');\n  const indicator = document.getElementById('previewLightboxIndicator');\n  const prevBtn = document.getElementById('previewLightboxPrev');\n  const nextBtn = document.getElementById('previewLightboxNext');\n\n  const total = Array.isArray(previewImages) ? previewImages.length : 0;\n  if (!img || total === 0) return;\n\n  const url = previewImages[_hbnLightboxIndex];\n  img.src = url;\n\n  if (indicator) indicator.textContent = `${_hbnLightboxIndex + 1} / ${total}`;\n\n  _hbnSetArrowState(prevBtn, _hbnLightboxIndex > 0);\n  _hbnSetArrowState(nextBtn, _hbnLightboxIndex < total - 1);\n}\n\nfunction openPreviewLightbox(indexOrUrl) {\n  const modal = document.getElementById('previewLightbox');\n  const img = document.getElementById('previewLightboxImg');\n  const square = document.getElementById('previewLightboxSquare');\n  if (!modal || !img || !square || !previewImages.length) return;\n\n  if (typeof indexOrUrl === 'number') {\n    _hbnLightboxIndex = Math.max(0, Math.min(indexOrUrl, previewImages.length - 1));\n  } else if (typeof indexOrUrl === 'string') {\n    const index = previewImages.indexOf(indexOrUrl);\n    _hbnLightboxIndex = index >= 0 ? index : currentPreviewIndex || 0;\n  } else {\n    _hbnLightboxIndex = currentPreviewIndex || 0;\n  }\n\n  if (modal.style.display !== 'flex') {\n    _hbnLightboxOpener = document.activeElement;\n    _hbnLightboxBodyOverflow = document.body.style.overflow;\n  }\n  modal.style.display = 'flex';\n  modal.setAttribute('aria-hidden', 'false');\n  document.body.style.overflow = 'hidden';\n  _hbnRenderLightbox();\n  document.getElementById('previewLightboxClose')?.focus();\n}\n\nfunction closePreviewLightbox() {\n  const modal = document.getElementById('previewLightbox');\n  const img = document.getElementById('previewLightboxImg');\n  if (!modal || !img || modal.style.display !== 'flex') return;\n\n  modal.style.display = 'none';\n  modal.setAttribute('aria-hidden', 'true');\n  img.src = '';\n  document.body.style.overflow = _hbnLightboxBodyOverflow;\n  const opener = _hbnLightboxOpener;\n  _hbnLightboxOpener = null;\n  if (opener?.isConnected) opener.focus({ preventScroll: true });\n}\n\nfunction lightboxPrev() {\n  if (_hbnLightboxIndex > 0) {\n    _hbnLightboxIndex -= 1;\n    _hbnRenderLightbox();\n  }\n}\n\nfunction lightboxNext() {\n  const total = Array.isArray(previewImages) ? previewImages.length : 0;\n  if (_hbnLightboxIndex < total - 1) {\n    _hbnLightboxIndex += 1;\n    _hbnRenderLightbox();\n  }\n}\n\nfunction initPreviewLightbox() {\n  const modal = document.getElementById('previewLightbox');\n  const closeBtn = document.getElementById('previewLightboxClose');\n  const prevBtn = document.getElementById('previewLightboxPrev');\n  const nextBtn = document.getElementById('previewLightboxNext');\n  const img = document.getElementById('previewLightboxImg');\n  if (!modal || !closeBtn || !prevBtn || !nextBtn || modal.dataset.hbnLightboxBound) return;\n  modal.dataset.hbnLightboxBound = 'true';\n  modal.setAttribute('aria-hidden', String(modal.style.display !== 'flex'));\n\n  closeBtn.addEventListener('click', closePreviewLightbox);\n  prevBtn.addEventListener('click', lightboxPrev);\n  nextBtn.addEventListener('click', lightboxNext);\n  modal.addEventListener('click', event => {\n    if (event.target === modal) closePreviewLightbox();\n  });\n  modal.addEventListener('contextmenu', event => event.preventDefault());\n  img?.addEventListener('dragstart', event => event.preventDefault());\n\n  // Focus stays inside the dialog; returning focus is handled when it closes.\n  modal.addEventListener('keydown', event => {\n    if (modal.style.display !== 'flex' || event.key !== 'Tab') return;\n    const buttons = [...modal.querySelectorAll('button')].filter(button => !button.disabled && button.tabIndex !== -1 && button.getAttribute('aria-disabled') !== 'true');\n    if (!buttons.length) return;\n    const index = buttons.indexOf(document.activeElement);\n    if (event.shiftKey && index <= 0) {\n      event.preventDefault();\n      buttons.at(-1).focus();\n    } else if (!event.shiftKey && (index === buttons.length - 1 || index < 0)) {\n      event.preventDefault();\n      buttons[0].focus();\n    }\n  });\n  document.addEventListener('keydown', event => {\n    if (modal.style.display !== 'flex') return;\n    if (event.key === 'Escape') { event.preventDefault(); closePreviewLightbox(); }\n    if (event.key === 'ArrowLeft') { event.preventDefault(); lightboxPrev(); }\n    if (event.key === 'ArrowRight') { event.preventDefault(); lightboxNext(); }\n  });\n}\n\ninitPreviewGallery();\ninitPreviewLightbox();\n\n\n// ==================== GLOBAL FUNCTIONS ====================\n\n// Make functions globally available (Updated for simplified Step 2)\nwindow.nextStep = nextStep;\nwindow.previousStep = previousStep;\n// window.selectIllustrationStyle = selectIllustrationStyle;\t//for Illustration style\nwindow.updateDedicationCharacterCount = updateDedicationCharacterCount;\nwindow.generatePreview = generatePreview;\nwindow.generateNewPreviews = generateNewPreviews;\nwindow.selectPreview = selectPreview;\nwindow.previousPreview = previousPreview;\nwindow.nextPreview = nextPreview;\nwindow.addToShopifyCart = addToShopifyCart;\nwindow.triggerFileUpload = triggerFileUpload;\nwindow.handlePhotoUpload = handlePhotoUpload;\nwindow.openStep1Extras = openStep1Extras;\nwindow.returnToStep1Child = returnToStep1Child;\n\n// Initialize global personalization data\nwindow.personalizationData = window.personalizationData || {};\n\n// ==================== DEBUG ====================\n\nwindow.debugPersonalization = function() {\n    return {\n        tracking_id,\n        //selectedIllustrationStyle,\n        personalizationData: window.personalizationData,\n        currentStep,\n        previewImages: previewImages.length,\n        hbnToken: hbn_token,\n        workflowPhase,\n        setupLocked,\n        selectedVariant,\n        generationStartedAt,\n        photoUploaded: window.photoUploaded,\n        // Updated for simplified Step 2\n        traits: document.getElementById('traits')?.value || '',\n        interests: document.getElementById('interests')?.value || '',\n        superpower: document.getElementById('superpower')?.value || '',\n        catchphrase: document.getElementById('catchphrase')?.value || '',\n        dedication: document.getElementById('dedication')?.value || ''\n    };\n};\n\n// Add CSS for animations\nconst style = document.createElement('style');\nstyle.textContent = `\n    @keyframes spin {\n        0% { transform: rotate(0deg); }\n        100% { transform: rotate(360deg); }\n    }\n`;\ndocument.head.appendChild(style);\n\n\nfunction decodeHtmlEntities(str = '') {\n  const textarea = document.createElement('textarea');\n  textarea.innerHTML = str;\n  return textarea.value;\n}\n"],
  "mappings": "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",
  "names": ["photoBtn"]
}
