{
  "version": 3,
  "sources": ["/cdn/shop/t/50/assets/customizer.js?ui=242"],
  "sourcesContent": ["/**\n * Product Customizer - Liquid + CSS + vanilla JS.\n * Data-driven from #customizer-config. Drawer open/close, state, render, add to cart.\n */\n(function () {\n  'use strict';\n\n  /** Bump when drawer UI changes so theme/asset caches can be verified. */\n  var CUSTOMIZER_UI_VERSION = 263;\n  /** Strip chip diameter for the largest disc size (12mm). Smaller sizes scale from this. */\n  var DISC_PREVIEW_STRIP_BASE_PX = 80;\n  /** Picker thumb diameter for the largest disc size (matches 2.75rem at 16px root). */\n  var DISC_PREVIEW_PICKER_BASE_PX = 44;\n  /** Family Birth Flower Bouquet \u2014 max flowers on one main product. */\n  var FAMILY_BOUQUET_MAX_FLOWERS = 10;\n  var FAMILY_BIRTHSTONE_BAR_MAX_BRACELET = 6;\n  var FAMILY_BIRTHSTONE_BAR_MAX_NECKLACE = 8;\n\n  function removeLegacyCustomizerStepper(root) {\n    if (!root || !root.querySelectorAll) return;\n    var stale = root.querySelectorAll('.customizer-steps');\n    for (var i = 0; i < stale.length; i++) stale[i].remove();\n  }\n\n  function getConfig() {\n    var el = document.getElementById('customizer-config');\n    if (!el || !el.textContent) return null;\n    try {\n      return JSON.parse(el.textContent.trim());\n    } catch (e) {\n      return null;\n    }\n  }\n\n  function ensureAddonsConfig(config) {\n    if (!config) return config;\n    if (!config.addons || !Array.isArray(config.addons)) config.addons = [];\n    if (config.main && config.main.customizer && config.main.customizer.customizerTypes) {\n      if (!config.main.customizerTypes || !config.main.customizerTypes.length) {\n        config.main.customizerTypes = config.main.customizer.customizerTypes;\n      }\n    }\n    return config;\n  }\n\n  function getAddons(config) {\n    return (config && config.addons) ? config.addons : [];\n  }\n\n  function getAddonProductFromLine(config, line) {\n    if (!line || !config) return null;\n    if (line.entry && line.entry.addonProduct) return line.entry.addonProduct;\n    var idx = line.addonIndex;\n    if (idx == null || idx < 0) return null;\n    var list = getAddons(config);\n    return list[idx] || null;\n  }\n\n  function mainUsesTypeTabs(config) {\n    return getMainCustomizerTypes(config).length > 0;\n  }\n\n  /** Tab label for a linked add-on: customizer metaobject type (tabTitle), not the Shopify product title. */\n  function addonCustomizerTabLabel(ap) {\n    if (!ap) return 'Add-on';\n    var types = ap.customizerTypes;\n    if (types && types.length > 0) {\n      var first = types[0];\n      var lab = (first.tabTitle && String(first.tabTitle).trim()) || (first.typeLabel && String(first.typeLabel).trim()) || '';\n      if (lab) return lab;\n    }\n    var c = ap.customizer;\n    if (c && c.type && String(c.type).trim()) return String(c.type).trim();\n    if (ap.title && String(ap.title).trim()) return String(ap.title).trim();\n    return 'Add-on';\n  }\n\n  /** Explicit customization group(s) from metaobject reference(s) only (never type labels). */\n  function customizationGroupKeyFromParts(id, handle, title) {\n    if (id != null && String(id).trim() !== '') return 'id:' + String(id).trim();\n    if (handle && String(handle).trim()) return 'handle:' + String(handle).trim().toLowerCase();\n    if (title && String(title).trim()) return 'title:' + String(title).trim().toLowerCase();\n    return null;\n  }\n\n  function getTypeCustomizationGroupEntries(typeEntry) {\n    if (!typeEntry) return [];\n    var out = [];\n    var seen = {};\n    function pushEntry(id, handle, title) {\n      var key = customizationGroupKeyFromParts(id, handle, title);\n      if (!key || seen[key]) return;\n      seen[key] = true;\n      out.push({\n        key: key,\n        id: id != null && String(id).trim() !== '' ? String(id).trim() : '',\n        handle: handle && String(handle).trim() ? String(handle).trim() : '',\n        title: title && String(title).trim() ? String(title).trim() : ''\n      });\n    }\n    var list = typeEntry.customizationGroups;\n    if (list && list.length) {\n      for (var i = 0; i < list.length; i++) {\n        var g = list[i];\n        if (!g) continue;\n        var gid = g.id;\n        var ghandle = g.handle;\n        var gtitle = g.title || g.name;\n        if (\n          (gid == null || String(gid).trim() === '') &&\n          (!ghandle || !String(ghandle).trim()) &&\n          (!gtitle || !String(gtitle).trim())\n        ) {\n          continue;\n        }\n        pushEntry(gid, ghandle, gtitle);\n      }\n    }\n    // Primary mirrors of first group-type entry (from liquid) \u2014 only if list was empty.\n    if (!out.length) {\n      pushEntry(\n        typeEntry.customizationGroupId,\n        typeEntry.customizationGroupHandle,\n        typeEntry.customizationGroupTitle\n      );\n    }\n    return out;\n  }\n\n  function getTypeCustomizationGroupKeys(typeEntry) {\n    var entries = getTypeCustomizationGroupEntries(typeEntry);\n    var keys = [];\n    for (var i = 0; i < entries.length; i++) keys.push(entries[i].key);\n    return keys;\n  }\n\n  function getTypeCustomizationGroupKey(typeEntry) {\n    var keys = getTypeCustomizationGroupKeys(typeEntry);\n    return keys.length ? keys[0] : null;\n  }\n\n  function typeEntryBelongsToCustomizationGroup(typeEntry, groupKey) {\n    if (!typeEntry || !groupKey) return false;\n    var keys = getTypeCustomizationGroupKeys(typeEntry);\n    for (var i = 0; i < keys.length; i++) {\n      if (keys[i] === groupKey) return true;\n    }\n    return false;\n  }\n\n  function toTitleCaseLabel(s) {\n    if (!s) return '';\n    return String(s)\n      .trim()\n      .toLowerCase()\n      .replace(/\\b\\w/g, function (c) {\n        return c.toUpperCase();\n      });\n  }\n\n  function formatCustomizationGroupTitle(raw) {\n    if (!raw || !String(raw).trim()) return '';\n    return toTitleCaseLabel(String(raw).trim());\n  }\n\n  function getTypeCustomizationGroupTitle(typeEntry) {\n    if (!typeEntry) return '';\n    var entries = getTypeCustomizationGroupEntries(typeEntry);\n    if (entries.length && entries[0].title) {\n      return formatCustomizationGroupTitle(entries[0].title);\n    }\n    if (typeEntry.customizationGroupTitle && String(typeEntry.customizationGroupTitle).trim()) {\n      return formatCustomizationGroupTitle(typeEntry.customizationGroupTitle);\n    }\n    return '';\n  }\n\n  function getEffectiveTypeCustomizationGroupKey(typeEntry) {\n    return getTypeCustomizationGroupKey(typeEntry);\n  }\n\n  function getEffectiveTypeCustomizationGroupTitle(typeEntry, groupKey) {\n    if (groupKey && typeEntry) {\n      var entries = getTypeCustomizationGroupEntries(typeEntry);\n      for (var i = 0; i < entries.length; i++) {\n        if (entries[i].key === groupKey && entries[i].title) {\n          return formatCustomizationGroupTitle(entries[i].title);\n        }\n      }\n    }\n    var explicitTitle = getTypeCustomizationGroupTitle(typeEntry);\n    if (explicitTitle) return explicitTitle;\n    if (groupKey && String(groupKey).indexOf('handle:') === 0) {\n      return formatCustomizationGroupTitle(String(groupKey).slice(7).replace(/-/g, ' '));\n    }\n    return '';\n  }\n\n  /** Unique customization groups across all linked add-on products (Disc, Tag, Birthstone, etc.). */\n  function getCustomizationGroupSortRank(titleOrKey) {\n    var t = String(titleOrKey || '').toLowerCase();\n    if (t.indexOf('disc') !== -1 || t.indexOf('disk') !== -1) return 0;\n    if (t.indexOf('tag') !== -1) return 1;\n    if (t.indexOf('birthstone') !== -1 || t.indexOf('birth stone') !== -1) return 2;\n    return 3;\n  }\n\n  function collectAddonCustomizationGroups(config) {\n    var catalog = getAddons(config);\n    var groups = [];\n    var seen = {};\n    for (var pi = 0; pi < catalog.length; pi++) {\n      var ap = catalog[pi];\n      var types = ap.customizerTypes || [];\n      for (var ti = 0; ti < types.length; ti++) {\n        var te = types[ti];\n        var entries = getTypeCustomizationGroupEntries(te);\n        for (var ei = 0; ei < entries.length; ei++) {\n          var key = entries[ei].key;\n          if (!key || seen[key]) continue;\n          // Name Disc may list Tag in group-type \u2014 only surface Tag when a Tag SKU exists.\n          if (!addonProductBelongsToCustomizationGroup(ap, key, config)) continue;\n          seen[key] = true;\n          groups.push({\n            key: key,\n            title:\n              getEffectiveTypeCustomizationGroupTitle(te, key) ||\n              formatCustomizationGroupTitle(entries[ei].title || entries[ei].handle),\n            catalogIndex: findCatalogIndexForGroup(config, key)\n          });\n        }\n      }\n      if (!types.length && ap.customizer) {\n        var pk = 'product:' + String(ap.id);\n        if (!seen[pk]) {\n          seen[pk] = true;\n          groups.push({\n            key: pk,\n            title: toTitleCaseLabel(addonCustomizerTabLabel(ap)),\n            catalogIndex: pi\n          });\n        }\n      }\n    }\n    groups.sort(function (a, b) {\n      var ra = getCustomizationGroupSortRank(a.title || a.key);\n      var rb = getCustomizationGroupSortRank(b.title || b.key);\n      return ra - rb || String(a.title || '').localeCompare(String(b.title || ''));\n    });\n    return groups;\n  }\n\n  function normalizePickerMatchToken(raw) {\n    if (raw == null || String(raw).trim() === '') return '';\n    return String(raw)\n      .trim()\n      .toLowerCase()\n      .replace(/-/g, ' ')\n      .replace(/\\s+/g, ' ');\n  }\n\n  function addonLineUsesSmallerSizePick(entry, addonProduct) {\n    if (!entry) return false;\n    if (entry.pickedSmallerSize) return true;\n    var ap = addonProduct || entry.addonProduct;\n    if (!ap || !hasSizeOption(ap)) return false;\n    var sizeLabel = resolveLineSizeLabelForAddonProduct(entry, ap);\n    if (!sizeLabel) return false;\n    var sizes = collectUniqueSizeLabelsForGroup([{ addonProduct: ap }]);\n    if (sizes.length <= 1) return false;\n    return !sizeLabelsMatch(sizeLabel, getLargestSizeLabel(sizes));\n  }\n\n  function computePickedSmallerSize(addonProduct, variant) {\n    if (!addonProduct || !variant || !hasSizeOption(addonProduct)) return false;\n    var sizes = collectUniqueSizeLabelsForGroup([{ addonProduct: addonProduct }]);\n    if (sizes.length <= 1) return false;\n    var sizeKey = getSizeOptionKeyStrict(addonProduct);\n    var vSize = sizeKey && variant[sizeKey] != null ? String(variant[sizeKey]).trim() : '';\n    if (!vSize) return false;\n    return !sizeLabelsMatch(vSize, getLargestSizeLabel(sizes));\n  }\n\n  /**\n   * Variant custom.customizer_options when set on the resolved line variant.\n   * null = no filter (use product/variant customizerTypes). Non-empty = type/option refs.\n   */\n  function getAddonVariantCustomizerOptions(entry, addonProduct, config, state) {\n    if (!entry || !addonProduct) return null;\n    var variant = resolveAddonVariantRecord(entry, addonProduct, config, state);\n    if (!variant) return null;\n    var opts = variant.customizerOptions;\n    if (!opts || !opts.length) return null;\n    return opts;\n  }\n\n  /**\n   * Variant custom.customizer (same shape as product) when set on the resolved line variant.\n   * null = use product customizerTypes. Non-empty = takes precedence over product.\n   */\n  function getAddonVariantCustomizerTypes(entry, addonProduct, config, state) {\n    if (!entry || !addonProduct) return null;\n    var variant = resolveAddonVariantRecord(entry, addonProduct, config, state);\n    if (!variant) return null;\n    var types = variant.customizerTypes;\n    if (!types || !types.length) return null;\n    return types;\n  }\n\n  /**\n   * Display types for an add-on product: variant custom.customizer wins when set,\n   * else product customizerTypes. Then optional customizer_options filter.\n   */\n  function getAddonDisplayTypesForProduct(entry, addonProduct, groupKey, config, state, applyVariantOptionsFilter) {\n    var variantTypes = getAddonVariantCustomizerTypes(entry, addonProduct, config, state);\n    var types;\n    if (variantTypes && variantTypes.length) {\n      types = [];\n      for (var i = 0; i < variantTypes.length; i++) {\n        types.push({ typeEntry: variantTypes[i], typeIndex: i, addonProduct: addonProduct });\n      }\n    } else {\n      types = getCustomizerTypesForAddonProductDisplay(addonProduct, groupKey, config);\n    }\n    if (!applyVariantOptionsFilter) return types;\n    return filterAddonDisplayTypesByVariantOptions(\n      types,\n      getAddonVariantCustomizerOptions(entry, addonProduct, config, state)\n    );\n  }\n\n  function resolveLineSizeLabelForAddonProduct(entry, addonProduct) {\n    if (!entry) return '';\n    var fromProduct = getAddonLineSizeLabel(entry, addonProduct);\n    if (fromProduct) return fromProduct;\n    if (\n      entry.addonProduct &&\n      addonProduct &&\n      addonProduct.id != null &&\n      entry.addonProduct.id != null &&\n      String(entry.addonProduct.id) !== String(addonProduct.id)\n    ) {\n      var fromPrimary = getAddonLineSizeLabel(entry, entry.addonProduct);\n      if (fromPrimary) return fromPrimary;\n    }\n    if (entry.sizeLabel && String(entry.sizeLabel).trim()) return String(entry.sizeLabel).trim();\n    return '';\n  }\n\n  function typeEntryMatchesVariantCustomizerRef(ref, typeEntry) {\n    if (!ref || !typeEntry) return false;\n    var refTokens = [ref.id, ref.handle, ref.title].map(normalizePickerMatchToken).filter(Boolean);\n    var typeTokens = [\n      typeEntry.id,\n      typeEntry.tabTitle,\n      typeEntry.typeLabel,\n      typeEntry.customizationGroupTitle\n    ]\n      .map(normalizePickerMatchToken)\n      .filter(Boolean);\n    if (typeEntry.customizations && typeEntry.customizations.length) {\n      for (var ci = 0; ci < typeEntry.customizations.length; ci++) {\n        var c = typeEntry.customizations[ci];\n        var ct = normalizePickerMatchToken(c.type);\n        if (ct) typeTokens.push(ct);\n        if (customizationMatchesVariantCustomizerRef(ref, c)) return true;\n      }\n    }\n    for (var r = 0; r < refTokens.length; r++) {\n      for (var t = 0; t < typeTokens.length; t++) {\n        if (refTokens[r] === typeTokens[t]) return true;\n        if (\n          refTokens[r].length > 2 &&\n          typeTokens[t].length > 2 &&\n          (typeTokens[t].indexOf(refTokens[r]) !== -1 || refTokens[r].indexOf(typeTokens[t]) !== -1)\n        ) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  function customizationMatchesVariantCustomizerRef(ref, customization) {\n    if (!ref || !customization) return false;\n    var refTokens = [ref.id, ref.handle, ref.title].map(normalizePickerMatchToken).filter(Boolean);\n    var custTokens = [customization.id, customization.name, customization.type]\n      .map(normalizePickerMatchToken)\n      .filter(Boolean);\n    for (var r = 0; r < refTokens.length; r++) {\n      for (var c = 0; c < custTokens.length; c++) {\n        if (refTokens[r] === custTokens[c]) return true;\n      }\n    }\n    return false;\n  }\n\n  function getAddonLineSizeLabel(entry, addonProduct) {\n    if (!entry || !addonProduct || !hasSizeOption(addonProduct)) return '';\n\n    var sizes = collectUniqueSizeLabelsForGroup([{ addonProduct: addonProduct }]);\n    if (!sizes.length) return '';\n\n    if (entry.sizeLabel && String(entry.sizeLabel).trim()) {\n      var matched = matchSizeLabelOnProduct(addonProduct, entry.sizeLabel);\n      if (matched) return matched;\n    }\n\n    var isPrimary =\n      entry.addonProduct &&\n      addonProduct.id != null &&\n      String(entry.addonProduct.id) === String(addonProduct.id);\n    if (isPrimary && entry.variantId != null) {\n      var variant = findVariantById(addonProduct, entry.variantId);\n      var sizeKey = getSizeOptionKeyStrict(addonProduct);\n      if (variant && sizeKey && variant[sizeKey] != null) return String(variant[sizeKey]).trim();\n    }\n\n    return '';\n  }\n\n  function addonPickerRowUsesCompactBlank(sizeLabel, addonProduct) {\n    if (!sizeLabel || !addonProduct || !hasSizeOption(addonProduct)) return false;\n    var sizes = collectUniqueSizeLabelsForGroup([{ addonProduct: addonProduct }]);\n    if (sizes.length <= 1) return false;\n    return !sizeLabelsMatch(sizeLabel, getLargestSizeLabel(sizes));\n  }\n\n  /** Map a line size token onto a label this product actually offers (exact / word rank / mm). */\n  function matchSizeLabelOnProduct(addonProduct, sizeLabel) {\n    if (!addonProduct || !sizeLabel || !hasSizeOption(addonProduct)) return '';\n    var sizes = collectUniqueSizeLabelsForGroup([{ addonProduct: addonProduct }]);\n    if (!sizes.length) return '';\n    var target = normalizePickerMatchToken(sizeLabel);\n    if (!target) return '';\n    var si;\n    for (si = 0; si < sizes.length; si++) {\n      if (normalizePickerMatchToken(sizes[si]) === target) return sizes[si];\n    }\n    var wantRank = parseSizeWordRank(sizeLabel);\n    if (!isNaN(wantRank)) {\n      for (si = 0; si < sizes.length; si++) {\n        if (parseSizeWordRank(sizes[si]) === wantRank) return sizes[si];\n      }\n      // Title \"Medium \u2026\" vs disc options \"9mm\" / \"12mm\" (no Small/Medium words).\n      var mmFromRank = canonicalDiscMmFromSizeWordRank(wantRank);\n      if (!isNaN(mmFromRank)) {\n        for (si = 0; si < sizes.length; si++) {\n          if (parseSizeMm(sizes[si]) === mmFromRank) return sizes[si];\n        }\n      }\n    }\n    var wantMm = parseSizeMm(sizeLabel);\n    if (!isNaN(wantMm)) {\n      for (si = 0; si < sizes.length; si++) {\n        if (parseSizeMm(sizes[si]) === wantMm) return sizes[si];\n      }\n    }\n    return '';\n  }\n\n  function sizeLabelsMatch(a, b) {\n    if (a == null || b == null) return false;\n    var na = normalizePickerMatchToken(a);\n    var nb = normalizePickerMatchToken(b);\n    if (na && nb && na === nb) return true;\n    var ra = parseSizeWordRank(a);\n    var rb = parseSizeWordRank(b);\n    if (!isNaN(ra) && !isNaN(rb) && ra === rb) return true;\n    var ma = parseSizeMm(a);\n    var mb = parseSizeMm(b);\n    if (!isNaN(ma) && !isNaN(mb) && ma === mb) return true;\n    // Word size vs mm: \"Medium\" \u2261 12mm, \"Small\" \u2261 9mm. Medium vs Large stays unmatched.\n    if (!isNaN(ra) && isNaN(ma) && !isNaN(mb)) {\n      return canonicalDiscMmFromSizeWordRank(ra) === mb;\n    }\n    if (!isNaN(rb) && isNaN(mb) && !isNaN(ma)) {\n      return canonicalDiscMmFromSizeWordRank(rb) === ma;\n    }\n    return false;\n  }\n\n  function resolveAddonProductVariantForLine(entry, ap, config, state) {\n    return applyAddonVariantDrivenSelections(entry, ap, resolveAddonProductBaseVariantForLine(entry, ap, config, state));\n  }\n\n  /** Size / finish / stored variant \u2014 before variant-driven type selections (e.g. Birthstone). */\n  function resolveAddonProductBaseVariantForLine(entry, ap, config, state) {\n    if (!ap) return null;\n    var sizeLabel = '';\n    if (entry) {\n      sizeLabel = getAddonLineSizeLabel(entry, ap);\n      if (!sizeLabel) {\n        var lineSize = resolveLineSizeLabelForAddonProduct(entry, ap);\n        if (lineSize) sizeLabel = matchSizeLabelOnProduct(ap, lineSize);\n      }\n    }\n    if (sizeLabel) {\n      var sized = findVariantMatchingMainFinishPreservingSize(ap, config, state, sizeLabel);\n      if (sized) return sized;\n      // Explicit size pick: never substitute a different size (e.g. Medium \u2192 Small).\n      return null;\n    }\n    var isLineProduct =\n      entry &&\n      entry.addonProduct &&\n      ap.id != null &&\n      String(entry.addonProduct.id) === String(ap.id);\n    if (isLineProduct && entry.variantId != null) {\n      var byId = findVariantById(ap, entry.variantId);\n      if (byId) {\n        if (variantMatchesMainFinish(byId, ap, config, state)) return byId;\n        var sizeKey = getSizeOptionKeyStrict(ap);\n        var fromSize = sizeKey && byId[sizeKey] != null ? String(byId[sizeKey]).trim() : '';\n        if (fromSize) {\n          var remapped = findVariantMatchingMainFinishPreservingSize(ap, config, state, fromSize);\n          if (remapped) return remapped;\n        }\n        return byId;\n      }\n    }\n    return findVariantMatchingMainFinish(ap, config, state) || getDefaultVariant(ap);\n  }\n\n  /** Keep entry.variantId/price/size aligned with the active product tab (Name \u2194 Initial). */\n  function syncAddonEntryVariantForActiveProduct(entry, ap, config, state) {\n    if (!entry || !ap) return;\n    var lineSize =\n      (entry.sizeLabel && String(entry.sizeLabel).trim()) ||\n      (entry.addonProduct ? getAddonLineSizeLabel(entry, entry.addonProduct) : '') ||\n      '';\n    // Don't remount onto a sibling that doesn't offer the picked size (drops Medium \u2192 Small).\n    if (lineSize && hasSizeOption(ap) && !matchSizeLabelOnProduct(ap, lineSize)) return;\n    if (lineSize && !hasSizeOption(ap)) return;\n    var variant = resolveAddonProductVariantForLine(entry, ap, config, state);\n    if (!variant) return;\n    entry.addonProduct = ap;\n    entry.variantId = variant.id;\n    entry.variantPrice = Number(variant.price) || 0;\n    var key = getSizeOptionKeyStrict(ap);\n    if (key && variant[key] != null && String(variant[key]).trim() !== '') {\n      entry.sizeLabel = String(variant[key]).trim();\n      entry.pickedSmallerSize = computePickedSmallerSize(ap, variant);\n    } else if (entry.sizeLabel && hasSizeOption(ap)) {\n      var mapped = matchSizeLabelOnProduct(ap, entry.sizeLabel);\n      if (mapped) entry.sizeLabel = mapped;\n      entry.pickedSmallerSize = computePickedSmallerSize(ap, variant);\n    }\n  }\n\n  function filterAddonDisplayTypesByVariantOptions(displayTypes, variantOptions) {\n    if (variantOptions == null) return displayTypes;\n    if (!variantOptions.length) return [];\n    var filtered = displayTypes.filter(function (item) {\n      for (var i = 0; i < variantOptions.length; i++) {\n        if (typeEntryMatchesVariantCustomizerRef(variantOptions[i], item.typeEntry)) return true;\n        // Variant may only list tiles; keep the type if any tile belongs to it.\n        if (variantRefBelongsToTypeEntry(variantOptions[i], item.typeEntry)) return true;\n      }\n      return false;\n    });\n    if (filtered.length) return filtered;\n    return synthesizeDisplayTypesFromVariantOptions(variantOptions);\n  }\n\n  function variantRefBelongsToTypeEntry(ref, typeEntry) {\n    if (!ref || !typeEntry) return false;\n    if (ref.customizations && ref.customizations.length) {\n      return typeEntryMatchesVariantCustomizerRef(ref, typeEntry);\n    }\n    var teLabel = normalizePickerMatchToken(typeEntry.typeLabel || typeEntry.tabTitle || '');\n    var refType = normalizePickerMatchToken(ref.type || '');\n    if (teLabel && refType && teLabel === refType) return true;\n    return customizationsOnTypeMatchRef(typeEntry, ref);\n  }\n\n  function customizationsOnTypeMatchRef(typeEntry, ref) {\n    if (!typeEntry || !typeEntry.customizations || !ref) return false;\n    for (var i = 0; i < typeEntry.customizations.length; i++) {\n      if (customizationMatchesVariantCustomizerRef(ref, typeEntry.customizations[i])) return true;\n    }\n    return false;\n  }\n\n  function synthesizeDisplayTypesFromVariantOptions(variantOptions) {\n    if (!variantOptions || !variantOptions.length) return [];\n    var out = [];\n    var looseOpts = [];\n    for (var i = 0; i < variantOptions.length; i++) {\n      var ref = variantOptions[i];\n      if (!ref) continue;\n      if (ref.customizations && ref.customizations.length) {\n        var label = ref.title || ref.name || ref.handle || 'Options';\n        var customs = [];\n        for (var ni = 0; ni < ref.customizations.length; ni++) {\n          var cloned = cloneCustomizationOption(ref.customizations[ni]);\n          if (cloned) customs.push(cloned);\n        }\n        out.push({\n          typeEntry: {\n            id: ref.id || '',\n            tabTitle: label,\n            typeLabel: label,\n            customizationGroupTitle: '',\n            customizations: customs\n          },\n          typeIndex: -1 - i\n        });\n      } else if (variantRefLooksLikeCustomizationOption(ref)) {\n        var opt = cloneCustomizationOption(ref);\n        if (opt) looseOpts.push(opt);\n      }\n    }\n    if (!out.length && looseOpts.length) {\n      var typeName = looseOpts[0].type || 'Options';\n      out.push({\n        typeEntry: {\n          id: '',\n          tabTitle: typeName,\n          typeLabel: typeName,\n          customizationGroupTitle: '',\n          customizations: looseOpts\n        },\n        typeIndex: -1\n      });\n    }\n    return out;\n  }\n\n  function filterCustomizationsByVariantOptions(customizations, variantOptions, typeEntry, config) {\n    if (variantOptions == null) return customizations;\n    if (!variantOptions.length) return customizations;\n    // Variant options take precedence whenever they yield a concrete tile list\n    // (tags/discs often store letters/symbols on the size variant).\n    var fromVariant = customizationsFromVariantOptionRefs(variantOptions, typeEntry, config);\n    if (fromVariant.length) return fromVariant;\n    // Type-level allowlist with no nested tiles: keep (or filter) the product catalog.\n    if (typeEntry) {\n      for (var ti = 0; ti < variantOptions.length; ti++) {\n        if (\n          typeEntryMatchesVariantCustomizerRef(variantOptions[ti], typeEntry) ||\n          variantRefBelongsToTypeEntry(variantOptions[ti], typeEntry)\n        ) {\n          return customizations;\n        }\n      }\n    }\n    // Otherwise treat refs as individual customization options filtering the product list.\n    var filtered = (customizations || []).filter(function (c) {\n      for (var i = 0; i < variantOptions.length; i++) {\n        if (customizationMatchesVariantCustomizerRef(variantOptions[i], c)) return true;\n      }\n      return false;\n    });\n    if (filtered.length) return filtered;\n    return customizations || [];\n  }\n\n  /** Variant refs that look like concrete options (letters/glyphs), not bare type labels. */\n  function variantRefLooksLikeCustomizationOption(ref) {\n    if (!ref) return false;\n    if (ref.customizations && ref.customizations.length) return false;\n    if (ref.image && String(ref.image).trim()) return true;\n    if (ref.fontUrl != null && String(ref.fontUrl).trim()) return true;\n    var name = String(ref.name || ref.title || '').trim();\n    if (!name) return false;\n    if (name.length === 1) return true;\n    if (/^[A-Za-z]\\s*[-\u2013\u2014]/.test(name)) return true;\n    return false;\n  }\n\n  function cloneCustomizationOption(src) {\n    if (!src || typeof src !== 'object') return null;\n    return {\n      id: src.id != null ? src.id : '',\n      name: src.name || src.title || '',\n      image: normalizeCustomizerAssetUrl(src.image || '') || src.image || '',\n      type: src.type || '',\n      finish: src.finish != null ? src.finish : null,\n      fontUrl: src.fontUrl != null ? src.fontUrl : null\n    };\n  }\n\n  /**\n   * Build option tiles from variant customizer_options refs.\n   * Type refs contribute their nested `.customizations`; option refs contribute themselves.\n   * If a type ref has no nested list, resolve tiles from any catalog product that defines that type.\n   */\n  function customizationsFromVariantOptionRefs(variantOptions, typeEntry, config) {\n    if (!variantOptions || !variantOptions.length) return [];\n    var out = [];\n    var seen = {};\n    function pushOpt(opt) {\n      if (!opt) return;\n      var key =\n        opt.id != null && String(opt.id) !== ''\n          ? 'id:' + String(opt.id)\n          : 'n:' + String(opt.name || '');\n      if (!key || key === 'id:' || key === 'n:') return;\n      if (seen[key]) return;\n      seen[key] = true;\n      out.push(opt);\n    }\n    for (var i = 0; i < variantOptions.length; i++) {\n      var ref = variantOptions[i];\n      if (!ref) continue;\n      var nested = ref.customizations;\n      if (nested && nested.length) {\n        if (\n          typeEntry &&\n          !typeEntryMatchesVariantCustomizerRef(ref, typeEntry) &&\n          !variantRefBelongsToTypeEntry(ref, typeEntry)\n        ) {\n          continue;\n        }\n        for (var ni = 0; ni < nested.length; ni++) {\n          pushOpt(cloneCustomizationOption(nested[ni]));\n        }\n        continue;\n      }\n      // Type ref with empty nested list \u2014 resolve from catalog product that owns that type.\n      if (ref.title || ref.handle || ref.id) {\n        var looksLikeType =\n          !variantRefLooksLikeCustomizationOption(ref) ||\n          normalizePickerMatchToken(ref.title || ref.name || '') === 'initial' ||\n          normalizePickerMatchToken(ref.handle || '') === 'initial';\n        if (looksLikeType) {\n          if (\n            typeEntry &&\n            !typeEntryMatchesVariantCustomizerRef(ref, typeEntry) &&\n            !variantRefBelongsToTypeEntry(ref, typeEntry)\n          ) {\n            // still allow when editing Initial Tag vs Initial naming\n            var teTok = normalizePickerMatchToken(typeEntry.typeLabel || typeEntry.tabTitle || '');\n            var refTok = normalizePickerMatchToken(ref.title || ref.name || ref.handle || '');\n            if (!(teTok && refTok && (teTok.indexOf(refTok) !== -1 || refTok.indexOf(teTok) !== -1))) {\n              continue;\n            }\n          }\n          var fromCatalog = findCatalogCustomizationsForTypeRef(config, ref);\n          for (var ci = 0; ci < fromCatalog.length; ci++) {\n            pushOpt(cloneCustomizationOption(fromCatalog[ci]));\n          }\n          if (fromCatalog.length) continue;\n        }\n      }\n      if (!variantRefLooksLikeCustomizationOption(ref)) continue;\n      if (typeEntry) {\n        var teLabel = normalizePickerMatchToken(typeEntry.typeLabel || typeEntry.tabTitle || '');\n        var refType = normalizePickerMatchToken(ref.type || '');\n        var ok =\n          typeEntryMatchesVariantCustomizerRef(ref, typeEntry) ||\n          (teLabel && refType && teLabel === refType) ||\n          customizationMatchesVariantCustomizerRef(ref, {\n            id: ref.id,\n            name: ref.name || ref.title,\n            type: ref.type || teLabel\n          });\n        if (!ok && !ref.type) ok = true;\n        if (!ok) continue;\n      }\n      pushOpt(cloneCustomizationOption(ref));\n    }\n    return out;\n  }\n\n  /** Resolve option tiles for a type ref by scanning catalog products' customizerTypes. */\n  function findCatalogCustomizationsForTypeRef(config, ref) {\n    if (!config || !ref) return [];\n    var catalog = getAddons(config) || [];\n    var best = [];\n    for (var pi = 0; pi < catalog.length; pi++) {\n      var ap = catalog[pi];\n      if (!ap || !ap.customizerTypes) continue;\n      for (var ti = 0; ti < ap.customizerTypes.length; ti++) {\n        var te = ap.customizerTypes[ti];\n        if (!typeEntryMatchesVariantCustomizerRef(ref, te)) continue;\n        var custs = te.customizations || [];\n        if (custs.length > best.length) best = custs;\n      }\n    }\n    if (best.length) return best;\n    // Initial Tag type refs have no nested letters \u2014 use Initial type catalog.\n    var refLabel = ref.title || ref.name || ref.handle || '';\n    if (labelMatchesInitialTag(refLabel) || isInitialCustomizerType(refLabel, null)) {\n      return findSharedInitialLetterCustomizations(config, null);\n    }\n    return best;\n  }\n\n  function getFirstTypeEntryForGroup(ap, groupKey) {\n    var grouped = getCustomizerTypesForGroupWithIndex(ap, groupKey);\n    return grouped.length ? grouped[0].typeEntry : null;\n  }\n\n  function findVariantById(addonProduct, variantId) {\n    if (!addonProduct || !addonProduct.variants || variantId == null) return null;\n    for (var i = 0; i < addonProduct.variants.length; i++) {\n      if (String(addonProduct.variants[i].id) === String(variantId)) return addonProduct.variants[i];\n    }\n    return null;\n  }\n\n  /*\n   * Variant-driven types: when a product (main or add-on) has a Shopify option whose name\n   * matches one of its customizer types (option \"Birthstone\" \u2194 type \"Heart Birthstone\"), that\n   * type's tiles come from the variant option values and picking a tile selects that variant.\n   * Products without such an option keep the metaobject catalog unchanged.\n   */\n  function isVariantDrivenReservedOptionName(name) {\n    var n = normalizeProductOptionName(name);\n    if (!n) return true;\n    if (isSizeOptionName(n) || optionNameIsFinishOrColor(n)) return true;\n    return n === 'charm' || n === 'shape' || n === 'form' || n === 'silhouette';\n  }\n\n  function variantOptionNameMatchesType(optionName, typeEntry) {\n    if (!typeEntry || isVariantDrivenReservedOptionName(optionName)) return false;\n    var opt = normalizePickerMatchToken(normalizeProductOptionName(optionName));\n    var labels = [typeEntry.typeLabel, typeEntry.tabTitle];\n    for (var i = 0; i < labels.length; i++) {\n      var lab = normalizePickerMatchToken(labels[i]);\n      if (!lab) continue;\n      if (lab === opt) return true;\n      var optIsMonth = opt === 'month' || opt === 'birth month';\n      if (labelMatchesBirthstone(lab) && (labelMatchesBirthstone(opt) || optIsMonth)) return true;\n      // Birth flower necklaces / charms: option \"Birth Flower\" / \"Flower\" / \"Month\".\n      if (labelMatchesBirthFlower(lab) && !labelMatchesFamilyBirthFlowerBouquet(lab) && (opt.indexOf('flower') !== -1 || optIsMonth)) {\n        return true;\n      }\n      if (opt.length > 3 && (' ' + lab + ' ').indexOf(' ' + opt + ' ') !== -1) return true;\n    }\n    return false;\n  }\n\n  /** Shopify option index (0-based) that drives this type's tiles, or -1. */\n  function getVariantDrivenOptionIndex(product, typeEntry) {\n    if (!product || !typeEntry || !product.variants || !product.variants.length) return -1;\n    var names = product.options || [];\n    for (var i = 0; i < names.length && i < 3; i++) {\n      if (variantOptionNameMatchesType(names[i], typeEntry)) return i;\n    }\n    return -1;\n  }\n\n  function variantOptionValueMatches(value, name) {\n    var a = normalizePickerMatchToken(value);\n    var b = normalizePickerMatchToken(name);\n    if (!a || !b) return false;\n    if (a === b) return true;\n    return (' ' + b + ' ').indexOf(' ' + a + ' ') !== -1 || (' ' + a + ' ').indexOf(' ' + b + ' ') !== -1;\n  }\n\n  function isMainCustomizerTypeEntry(typeEntry, config) {\n    if (!typeEntry || !config || !config.main) return false;\n    return getMainCustomizerTypes(config).indexOf(typeEntry) !== -1;\n  }\n\n  /** Variants whose non-driven options fit the current main finish (add-on) or PDP options (main). */\n  function variantDrivenCandidateVariants(product, optionIndex, config, state, isMain) {\n    var pool = product.variants.filter(function (v) {\n      if (isMain) {\n        for (var k = 0; k < 3; k++) {\n          if (k === optionIndex) continue;\n          var cur = state && state.main ? state.main['option' + (k + 1)] : null;\n          var val = v['option' + (k + 1)];\n          if (cur != null && String(cur).trim() !== '' && val != null && String(val) !== String(cur)) return false;\n        }\n        return true;\n      }\n      return variantMatchesMainFinish(v, product, config, state);\n    });\n    return pool.length ? pool : product.variants.slice();\n  }\n\n  /**\n   * Tiles for a variant-driven type, or null when the type is not variant-driven.\n   * A metaobject with the same name is reused (keeps its id / image / finish for previews);\n   * otherwise the tile is built from the variant (value + variant image).\n   */\n  function variantDrivenCustomizationsForTypeEntry(typeEntry, config, state, addonProduct) {\n    var isMain = !addonProduct && isMainCustomizerTypeEntry(typeEntry, config);\n    // Family Birth Flower Bouquet is multi-select \u2014 never variant-driven.\n    if (isMain && isFamilyBirthFlowerBouquetProduct(config)) return null;\n    if (isMain && isFamilyBirthstoneBarProduct(config)) return null;\n    var product = addonProduct || (isMain ? config.main : null);\n    var optionIndex = getVariantDrivenOptionIndex(product, typeEntry);\n    if (optionIndex < 0) return null;\n    var key = 'option' + (optionIndex + 1);\n    var catalog = getFilteredCustomizationsForTypeEntry(typeEntry, config, state) || [];\n    var typeLabel = typeEntry.typeLabel || typeEntry.tabTitle || '';\n    var candidates = variantDrivenCandidateVariants(product, optionIndex, config, state, isMain);\n    var seen = {};\n    var out = [];\n    for (var i = 0; i < candidates.length; i++) {\n      var v = candidates[i];\n      var value = v[key] != null ? String(v[key]).trim() : '';\n      var token = normalizePickerMatchToken(value);\n      if (!token || seen[token]) continue;\n      seen[token] = true;\n      var variantImage = resolveProductImageUrl(v.image) || null;\n      var match = null;\n      for (var c = 0; c < catalog.length; c++) {\n        if (variantOptionValueMatches(value, catalog[c].name)) {\n          match = catalog[c];\n          break;\n        }\n      }\n      if (match) {\n        // Same-named metaobject supplies the image; the variant image is only a fallback.\n        out.push(match.image || !variantImage ? match : Object.assign({}, match, { image: variantImage }));\n        continue;\n      }\n      out.push({\n        id: 'variant-option:' + String(product.id != null ? product.id : 'main') + ':' + token,\n        handle: token.replace(/\\s+/g, '-'),\n        name: value,\n        image: variantImage,\n        type: typeLabel,\n        finish: null,\n        fontUrl: null\n      });\n    }\n    return out;\n  }\n\n  /**\n   * Preview image for a variant-driven option: same-named metaobject (current finish) first,\n   * else the matching variant's image. null when the type is not variant-driven.\n   */\n  function variantDrivenImageForOption(opt, typeEntry, config, state, addonProduct) {\n    if (!opt || !opt.name || !typeEntry) return null;\n    var isMain = !addonProduct;\n    if (isMain && isFamilyBirthFlowerBouquetProduct(config)) return null;\n    if (isMain && isFamilyBirthstoneBarProduct(config)) return null;\n    var product = addonProduct || (config && config.main);\n    var optionIndex = getVariantDrivenOptionIndex(product, typeEntry);\n    if (optionIndex < 0) return null;\n    var catalog = getFilteredCustomizationsForTypeEntry(typeEntry, config, state) || [];\n    var metaTile = findVariantDrivenTileForValue(catalog, opt.name);\n    if (metaTile && metaTile.image) return metaTile.image;\n    var key = 'option' + (optionIndex + 1);\n    var candidates = variantDrivenCandidateVariants(product, optionIndex, config, state, isMain);\n    for (var i = 0; i < candidates.length; i++) {\n      if (!variantOptionValueMatches(candidates[i][key], opt.name)) continue;\n      var img = resolveProductImageUrl(candidates[i].image);\n      if (img) return img;\n    }\n    return null;\n  }\n\n  /** Pick the variant with `wanted` option values, keeping the other options of `base` when possible. */\n  function findVariantWithOptionValues(product, base, wanted) {\n    return (\n      findVariantWithOptionValuesMatching(product, base, wanted, true) ||\n      findVariantWithOptionValuesMatching(product, base, wanted, false)\n    );\n  }\n\n  /** strict: exact (normalized) option value; else loose word-contains match. */\n  function findVariantWithOptionValuesMatching(product, base, wanted, strict) {\n    if (!product || !product.variants || !product.variants.length) return null;\n    function fitsWanted(v) {\n      for (var k in wanted) {\n        if (!wanted.hasOwnProperty(k)) continue;\n        var val = v['option' + (Number(k) + 1)];\n        var ok = strict\n          ? normalizePickerMatchToken(val) !== '' && normalizePickerMatchToken(val) === normalizePickerMatchToken(wanted[k])\n          : variantOptionValueMatches(val, wanted[k]);\n        if (!ok) return false;\n      }\n      return true;\n    }\n    function fitsBase(v) {\n      if (!base) return true;\n      for (var k = 0; k < 3; k++) {\n        if (wanted.hasOwnProperty(k)) continue;\n        var bv = base['option' + (k + 1)];\n        if (bv != null && String(bv) !== '' && String(v['option' + (k + 1)]) !== String(bv)) return false;\n      }\n      return true;\n    }\n    var exact = null;\n    var loose = null;\n    for (var i = 0; i < product.variants.length; i++) {\n      var v = product.variants[i];\n      if (!fitsWanted(v)) continue;\n      var avail = v.available !== false;\n      if (fitsBase(v)) {\n        if (avail) return v;\n        if (!exact) exact = v;\n      } else if (!loose || (avail && loose.available === false)) {\n        loose = v;\n      }\n    }\n    return exact || loose;\n  }\n\n  /** {optionIndex: selectedName} for the add-on product's variant-driven types on this line. */\n  function getAddonVariantDrivenWanted(entry, ap) {\n    var wanted = {};\n    var any = false;\n    if (!entry || !ap || !entry.selections) return null;\n    var types = ap.customizerTypes || [];\n    for (var i = 0; i < types.length; i++) {\n      var idx = getVariantDrivenOptionIndex(ap, types[i]);\n      if (idx < 0) continue;\n      var sel = getAddonEntrySelection(entry, { typeEntry: types[i], typeIndex: i, addonProduct: ap });\n      if (sel && sel.name) {\n        wanted[idx] = sel.name;\n        any = true;\n      }\n    }\n    if (!types.length && ap.customizer && ap.customizer.type) {\n      var flatIdx = getVariantDrivenOptionIndex(ap, { typeLabel: ap.customizer.type });\n      var flatSel = flatIdx >= 0 ? entry.selections[addonFlatSelectionKey(ap)] : null;\n      if (flatSel && flatSel.name) {\n        wanted[flatIdx] = flatSel.name;\n        any = true;\n      }\n    }\n    return any ? wanted : null;\n  }\n\n  function applyAddonVariantDrivenSelections(entry, ap, base) {\n    if (!base) return base;\n    var wanted = getAddonVariantDrivenWanted(entry, ap);\n    if (!wanted) return base;\n    return findVariantWithOptionValues(ap, base, wanted) || base;\n  }\n\n  /** Tile whose name is the variant option value (exact first, then loose). */\n  function findVariantDrivenTileForValue(tiles, value) {\n    if (!tiles || !tiles.length || value == null || String(value).trim() === '') return null;\n    var want = normalizePickerMatchToken(value);\n    for (var i = 0; i < tiles.length; i++) {\n      if (normalizePickerMatchToken(tiles[i].name) === want) return tiles[i];\n    }\n    for (var j = 0; j < tiles.length; j++) {\n      if (variantOptionValueMatches(value, tiles[j].name)) return tiles[j];\n    }\n    return null;\n  }\n\n  /** Default tile for a main variant-driven type = the PDP variant's value (not the first tile). */\n  function mainVariantDrivenDefaultTile(typeEntry, config, state) {\n    if (isFamilyBirthFlowerBouquetProduct(config)) return null;\n    if (isFamilyBirthstoneBarProduct(config)) return null;\n    var idx = getVariantDrivenOptionIndex(config && config.main, typeEntry);\n    if (idx < 0) return null;\n    var tiles = customizationsForTypeEntry(typeEntry, config, state, null);\n    return findVariantDrivenTileForValue(tiles, state.main['option' + (idx + 1)]);\n  }\n\n  /**\n   * PDP changed a variant-driven option (e.g. Birthstone picker on the product page) \u2192\n   * mirror it into the drawer selection. Unrelated PDP changes (finish) keep the drawer pick.\n   */\n  function adoptMainVariantDrivenValuesFromPage(config, state, prevPageOptions) {\n    if (!config || !config.main || !prevPageOptions) return;\n    if (isFamilyBirthFlowerBouquetProduct(config)) return;\n    if (isFamilyBirthstoneBarProduct(config)) return;\n    var types = getMainCustomizerTypes(config);\n    for (var i = 0; i < types.length; i++) {\n      var idx = getVariantDrivenOptionIndex(config.main, types[i]);\n      if (idx < 0) continue;\n      var key = 'option' + (idx + 1);\n      var now = state.main[key];\n      if (now == null || String(now) === String(prevPageOptions[key] == null ? '' : prevPageOptions[key])) continue;\n      var tile = findVariantDrivenTileForValue(customizationsForTypeEntry(types[i], config, state, null), now);\n      if (!tile) continue;\n      if (!state.main.selections) state.main.selections = {};\n      state.main.selections[typeEntryKey(types[i], i)] = enrichMainOptionFromConfig(cloneStoredOption(tile), config);\n    }\n  }\n\n  /** Main product: switch state.main variant to match variant-driven type selections. */\n  function applyMainVariantDrivenSelections(config, state) {\n    if (!config || !config.main || !state || !state.main) return;\n    if (isFamilyBirthFlowerBouquetProduct(config)) return;\n    if (isFamilyBirthstoneBarProduct(config)) return;\n    var main = config.main;\n    if (!main.variants || !main.variants.length) return;\n    var types = getMainCustomizerTypes(config);\n    var wanted = {};\n    var any = false;\n    for (var i = 0; i < types.length; i++) {\n      var idx = getVariantDrivenOptionIndex(main, types[i]);\n      if (idx < 0) continue;\n      var sel = state.main.selections && state.main.selections[typeEntryKey(types[i], i)];\n      if (sel && sel.name) {\n        wanted[idx] = sel.name;\n        any = true;\n      }\n    }\n    // Empty-main necklaces: the mandatory add-on line (e.g. Heart Birthstone Charm) is the picker,\n    // so its choice drives the necklace's own option (e.g. Month).\n    var lines = state.addonList || [];\n    for (var li = 0; li < lines.length; li++) {\n      var line = lines[li];\n      if (!line || !line.entry || !line.entry.mandatory) continue;\n      var pkgs = getAddonLineGroupedProducts(line, config) || [];\n      if (!pkgs.length && line.entry.addonProduct) pkgs = [{ addonProduct: line.entry.addonProduct }];\n      for (var pi = 0; pi < pkgs.length; pi++) {\n        var ap = pkgs[pi].addonProduct;\n        var apTypes = (ap && ap.customizerTypes) || [];\n        for (var ti = 0; ti < apTypes.length; ti++) {\n          var mIdx = getVariantDrivenOptionIndex(main, apTypes[ti]);\n          if (mIdx < 0 || wanted.hasOwnProperty(mIdx)) continue;\n          var aSel = getAddonEntrySelection(line.entry, { typeEntry: apTypes[ti], typeIndex: ti, addonProduct: ap });\n          if (aSel && aSel.name) {\n            wanted[mIdx] = aSel.name;\n            any = true;\n          }\n        }\n      }\n    }\n    if (!any) return;\n    var base = {\n      option1: state.main.option1,\n      option2: state.main.option2,\n      option3: state.main.option3\n    };\n    var v = findVariantWithOptionValues(main, base, wanted);\n    if (!v || String(v.id) === String(state.main.variantId)) return;\n    state.main.variantId = v.id;\n    if (v.price != null) state.main.price = v.price;\n    state.main.option1 = v.option1 != null ? v.option1 : state.main.option1;\n    state.main.option2 = v.option2 != null ? v.option2 : state.main.option2;\n    state.main.option3 = v.option3 != null ? v.option3 : state.main.option3;\n    var img = resolveProductImageUrl(v.image);\n    if (img) state.main.image = img;\n  }\n\n  function variantMatchesMainFinish(variant, addon, config, state) {\n    if (!variant || !addon) return false;\n    var mainFinish = getMainFinishValue(config, state);\n    var mainMetals = getMainFinishMetals(config, state);\n    if (!mainFinish && !mainMetals.length) return true;\n    var addonOptions = addon.options || [];\n    var finishIndex = getFinishOptionIndexStrict(addonOptions);\n    if (finishIndex < 0) return true;\n    var optionKey = 'option' + (finishIndex + 1);\n    var val = (variant[optionKey] != null ? String(variant[optionKey]) : '').trim().toLowerCase();\n    if (mainFinish && val === mainFinish) return true;\n    if (mainMetals.length) {\n      var variantMetal = normalizeMetalToken(val);\n      for (var m = 0; m < mainMetals.length; m++) {\n        if (variantMetal && variantMetal === mainMetals[m]) return true;\n      }\n    }\n    return false;\n  }\n\n  function optionNameIsFinishOrColor(name) {\n    var n = String(name || '').trim().toLowerCase();\n    return n === 'finish' || n === 'color' || n === 'material';\n  }\n\n  function getFinishOptionIndexStrict(optionNames) {\n    if (!optionNames || !optionNames.length) return -1;\n    for (var i = 0; i < optionNames.length; i++) {\n      if (optionNameIsFinishOrColor(optionNames[i])) return i;\n    }\n    return -1;\n  }\n\n  function getAvailableAddonVariants(ap) {\n    if (!ap || !ap.variants) return [];\n    var available = ap.variants.filter(function (v) {\n      return v.available !== false;\n    });\n    return available.length ? available : ap.variants.slice();\n  }\n\n  function getSizeOptionKeyStrict(ap) {\n    if (!ap || !hasSizeOption(ap)) return null;\n    var sizeIndex = getSizeOptionIndex(ap.options || []);\n    return sizeIndex >= 0 ? 'option' + (sizeIndex + 1) : null;\n  }\n\n  /** Unique Size values for one catalog product (available variants). */\n  function collectUniqueSizeLabelsForProduct(addonProduct) {\n    if (!addonProduct || !hasSizeOption(addonProduct)) return [];\n    return collectUniqueSizeLabelsForGroup([{ addonProduct: addonProduct }]);\n  }\n\n  /** Size labels from the Size option only \u2014 ignores finish/style/other options. */\n  function collectUniqueSizeLabelsForGroup(products) {\n    var byNorm = {};\n    var order = [];\n    for (var pi = 0; pi < products.length; pi++) {\n      var ap = products[pi].addonProduct;\n      var sizeKey = ap ? getSizeOptionKeyStrict(ap) : null;\n      if (!ap || !sizeKey) continue;\n      var variants = ap.variants || [];\n      for (var vi = 0; vi < variants.length; vi++) {\n        var v = variants[vi];\n        if (v.available === false) continue;\n        var label = (v[sizeKey] != null ? String(v[sizeKey]) : '').trim();\n        if (!label) continue;\n        var norm = label.toLowerCase();\n        if (byNorm[norm]) continue;\n        byNorm[norm] = label;\n        order.push(norm);\n      }\n    }\n    return order.map(function (n) {\n      return byNorm[n];\n    });\n  }\n\n  function parseSizeMm(label) {\n    var m = String(label || '').match(/(\\d+(?:\\.\\d+)?)\\s*mm/i);\n    return m ? parseFloat(m[1]) : NaN;\n  }\n\n  /**\n   * Disc preview diameter in px from a Size label (e.g. \"Small - 9mm\").\n   * Scales against the product\u2019s largest mm option so 9mm is 75% of 12mm.\n   * When no size catalog (main PDP), 12mm is the full-size baseline.\n   */\n  function discPreviewPxFromSizeLabel(sizeLabel, addonProduct, basePx) {\n    var base = Number(basePx);\n    if (!(base > 0)) base = DISC_PREVIEW_STRIP_BASE_PX;\n    var sizes = addonProduct\n      ? collectUniqueSizeLabelsForGroup([{ addonProduct: addonProduct }])\n      : [];\n    var mm = parseSizeMm(sizeLabel);\n    if (!isNaN(mm) && mm > 0) {\n      var refMm = NaN;\n      if (sizes.length) refMm = parseSizeMm(getLargestSizeLabel(sizes));\n      // Never use the label\u2019s own mm as ref \u2014 that made 9mm and 12mm both render full size.\n      if (isNaN(refMm) || refMm <= 0) refMm = 12;\n      var px = Math.round(base * (mm / refMm));\n      if (px < 24) px = 24;\n      if (px > base) px = base;\n      return px;\n    }\n    // Word sizes (Tag Small/Medium, or Disc without mm in the label).\n    if (sizes.length >= 2) {\n      var largest = getLargestSizeLabel(sizes);\n      if (!sizeLabel || sizeLabelsMatch(sizeLabel, largest)) return base;\n      return Math.max(24, Math.round(base * 0.75));\n    }\n    // Main PDP: no size value list \u2014 Small \u2192 compact, Medium/Large \u2192 full.\n    var rank = parseSizeWordRank(sizeLabel);\n    if (!isNaN(rank) && rank <= 1) return Math.max(24, Math.round(base * 0.75));\n    if (!isNaN(rank)) return base;\n    return null;\n  }\n\n  /** True when this catalog product has a real Size option with 2+ values. */\n  function addonProductHasSelectableSizes(addonProduct) {\n    if (!addonProduct || !hasSizeOption(addonProduct)) return false;\n    return collectUniqueSizeLabelsForProduct(addonProduct).length >= 2;\n  }\n\n  /** Main PDP has a Size or Disc Size option (may or may not list every value in JSON). */\n  function mainProductHasSizeOption(config) {\n    return !!(config && config.main && getSizeOptionIndex(config.main.options || []) >= 0);\n  }\n\n  /**\n   * Size hint from a product title/handle \u2014 same Small/Medium/Tiny/mm signals as a Size value.\n   * e.g. \"Small Name Disc Charm\" / \"Tiny Tag Necklace\" \u2192 usable size label; \"Gold Necklace\" \u2192 ''.\n   */\n  function sizeLabelFromProductTitle(title) {\n    var s = String(title || '').trim();\n    if (!s) return '';\n    if (!isNaN(parseSizeMm(s)) || !isNaN(parseSizeWordRank(s))) return s;\n    return '';\n  }\n\n  /** Selected Size / Disc Size from the page variant, else Small/Medium/Tiny in title or handle. */\n  function getMainSizeLabel(config, state) {\n    if (mainProductHasSizeOption(config)) {\n      var opts = config.main.options || [];\n      var sizeIdx = getSizeOptionIndex(opts);\n      if (sizeIdx >= 0) {\n        var key = 'option' + (sizeIdx + 1);\n        var fromState = state && state.main && state.main[key];\n        if (fromState != null && String(fromState).trim() !== '') return String(fromState).trim();\n        var fromCfg = config.main[key];\n        if (fromCfg != null && String(fromCfg).trim() !== '') return String(fromCfg).trim();\n      }\n    }\n    var fromTitle = sizeLabelFromProductTitle(config && config.main && config.main.title);\n    if (fromTitle) return fromTitle;\n    return sizeLabelFromProductTitle(config && config.main && config.main.handle);\n  }\n\n  /** Main tag bar uses compact chrome for Tiny / Small / XS (no Size option needed). */\n  function mainPreviewUsesCompactBlank(config, state, shapeMod) {\n    if (!shapeMod) return false;\n    if (\n      shapeMod.indexOf('shape-rect') === -1 &&\n      shapeMod.indexOf('shape-initial-tag') === -1\n    ) {\n      return false;\n    }\n    var sizeLabel = getMainSizeLabel(config, state);\n    if (sizeLabel) {\n      var rank = parseSizeWordRank(sizeLabel);\n      if (!isNaN(rank)) return rank <= 1;\n    }\n    // No Size option / size word \u2014 Toggle + Tag PDPs use the small bar\n    // (e.g. Birthstone and Initial Toggle Necklace). Add-on Size still picks Small/Medium.\n    return mainProductDefaultsToSmallTag(config);\n  }\n\n  /** Toggle necklaces with an included Tag/Initial Tag type ship the small bar. */\n  function mainProductDefaultsToSmallTag(config) {\n    if (!config || !config.main) return false;\n    var blob = String(config.main.title || '') + ' ' + String(config.main.handle || '');\n    if (!/\\btoggle\\b/i.test(blob)) return false;\n    var types = getMainCustomizerTypes(config);\n    for (var i = 0; i < types.length; i++) {\n      var te = types[i];\n      var label = (te && (te.typeLabel || te.tabTitle)) || '';\n      if (isInitialTagType(label, te) || labelMatchesNameTag(label)) return true;\n      if (shapeKindFromCustomizationGroupTitle(te && te.customizationGroupTitle) === 'tag') return true;\n      if (shapeKindFromCustomizationGroupTitle(te && te.customizationGroupHandle) === 'tag') return true;\n      var groups = te && te.customizationGroups;\n      if (groups && groups.length) {\n        for (var gi = 0; gi < groups.length; gi++) {\n          var g = groups[gi];\n          if (!g) continue;\n          if (\n            shapeKindFromCustomizationGroupTitle(g.title || g.name) === 'tag' ||\n            shapeKindFromCustomizationGroupTitle(g.handle) === 'tag'\n          ) {\n            return true;\n          }\n        }\n      }\n    }\n    return false;\n  }\n\n  function normalizeProductOptionName(raw) {\n    if (raw && typeof raw === 'object') {\n      raw = raw.name != null ? raw.name : raw.label != null ? raw.label : '';\n    }\n    return String(raw || '')\n      .trim()\n      .toLowerCase()\n      .replace(/\\s+/g, ' ');\n  }\n\n  /** Charm / Shape option that switches Rectangle Tag \u2194 Round Disc on the PDP. */\n  function getCharmOptionIndex(optionNames) {\n    if (!optionNames || !optionNames.length) return -1;\n    var prefer = ['charm', 'shape', 'form', 'silhouette'];\n    for (var pi = 0; pi < prefer.length; pi++) {\n      for (var i = 0; i < optionNames.length; i++) {\n        if (normalizeProductOptionName(optionNames[i]) === prefer[pi]) return i;\n      }\n    }\n    return -1;\n  }\n\n  function shapeKindFromVariantShapeLabel(label) {\n    var t = String(label || '')\n      .trim()\n      .toLowerCase()\n      .replace(/\\s+/g, ' ');\n    if (!t) return null;\n    if (t.indexOf('disc') !== -1) return 'disc';\n    if (t.indexOf('tag') !== -1 || t.indexOf('rectangle') !== -1) return 'tag';\n    return null;\n  }\n\n  /** Selected Charm (etc.) value from the page variant \u2014 e.g. \"Rectangle Tag\" / \"Round Disc\". */\n  function getMainCharmLabel(config, state) {\n    if (!config || !config.main) return '';\n    var opts = config.main.options || [];\n    var charmIdx = getCharmOptionIndex(opts);\n    if (charmIdx >= 0) {\n      var key = 'option' + (charmIdx + 1);\n      var fromState = state && state.main && state.main[key];\n      if (fromState != null && String(fromState).trim() !== '') return String(fromState).trim();\n      var fromCfg = config.main[key];\n      if (fromCfg != null && String(fromCfg).trim() !== '') return String(fromCfg).trim();\n    }\n    // No named Charm option \u2014 still honor Tag/Disc values on any non-size/finish option.\n    for (var i = 0; i < opts.length; i++) {\n      var name = normalizeProductOptionName(opts[i]);\n      if (!name || name === 'size' || name === 'disc size' || name === 'finish' || name === 'color') {\n        continue;\n      }\n      var optKey = 'option' + (i + 1);\n      var val =\n        (state && state.main && state.main[optKey]) != null && String(state.main[optKey]).trim() !== ''\n          ? String(state.main[optKey]).trim()\n          : config.main[optKey] != null\n            ? String(config.main[optKey]).trim()\n            : '';\n      if (shapeKindFromVariantShapeLabel(val)) return val;\n    }\n    return '';\n  }\n\n  /**\n   * Tag vs disc from the selected PDP Charm variant (same source of truth as Size for scale).\n   * null when the product has no Charm / Tag|Disc option value.\n   */\n  function getMainVariantShapeKind(config, state) {\n    return shapeKindFromVariantShapeLabel(getMainCharmLabel(config, state));\n  }\n\n  function previewShapeModFromVariantShapeKind(shapeKind, typeName, typeEntry) {\n    if (shapeKind === 'disc') return ' customizer-preview-item--shape-disc';\n    if (shapeKind === 'tag') {\n      if (isInitialTagType(typeName, typeEntry) || isInitialCustomizerType(typeName, typeEntry)) {\n        return ' customizer-preview-item--shape-initial-tag';\n      }\n      return ' customizer-preview-item--shape-rect';\n    }\n    return '';\n  }\n\n  /**\n   * Main-product disc chip diameter from variant Size / Disc Size, or Small/Medium in the product title.\n   * null when neither is present (necklace Finish-only, etc.).\n   */\n  function previewDiscPxForMain(state, config) {\n    var sizeLabel = getMainSizeLabel(config, state);\n    if (!sizeLabel) return null;\n    return discPreviewPxFromSizeLabel(sizeLabel, null, DISC_PREVIEW_STRIP_BASE_PX);\n  }\n\n  /**\n   * Preview diameter for an add-on disc chip from the selected Shopify size variant,\n   * or Small/Medium (etc.) in the add-on product title when there is no size option.\n   */\n  function previewDiscPxForAddonEntry(entry, addonProduct) {\n    if (!entry || !addonProduct) return null;\n\n    var sizeLabel = '';\n    var sizes = hasSizeOption(addonProduct) ? collectUniqueSizeLabelsForProduct(addonProduct) : [];\n    var sizeKey = getSizeOptionKeyStrict(addonProduct);\n    // Selected variant is the source of truth for mm when a Size option exists.\n    if (entry.variantId != null && sizeKey) {\n      var byId = findVariantById(addonProduct, entry.variantId);\n      if (byId && byId[sizeKey] != null && String(byId[sizeKey]).trim() !== '') {\n        sizeLabel = String(byId[sizeKey]).trim();\n      }\n    }\n    if (!sizeLabel) sizeLabel = resolveLineSizeLabelForAddonProduct(entry, addonProduct);\n    if (!sizeLabel && entry.sizeLabel) sizeLabel = String(entry.sizeLabel).trim();\n    if (!sizeLabel && sizes.length >= 2) {\n      sizeLabel = getLargestSizeLabel(sizes) || sizes[0] || '';\n    }\n    if (!sizeLabel) sizeLabel = sizeLabelFromProductTitle(addonProduct.title);\n    if (!sizeLabel) return null;\n    return discPreviewPxFromSizeLabel(\n      sizeLabel,\n      sizes.length >= 2 ? addonProduct : null,\n      DISC_PREVIEW_STRIP_BASE_PX\n    );\n  }\n\n  /** Force chip box to the mm size \u2014 inline beats the base .customizer-preview-item { 80px }. */\n  function discPreviewStyleAttr(px) {\n    if (px == null || !(px > 0)) return '';\n    var n = Math.round(px);\n    return (\n      ' style=\"--customizer-disc-px:' +\n      n +\n      'px;width:' +\n      n +\n      'px;height:' +\n      n +\n      'px;min-width:' +\n      n +\n      'px;min-height:' +\n      n +\n      'px\"'\n    );\n  }\n\n  function parseSizeWordRank(label) {\n    var t = String(label || '').toLowerCase();\n    if (/\\bextra\\s*small\\b/.test(t) || /\\bxs\\b/.test(t) || /\\btiny\\b/.test(t) || /\\bmini\\b/.test(t)) {\n      return 0;\n    }\n    if (/\\bsmall\\b/.test(t)) return 1;\n    if (/\\bmedium\\b/.test(t)) return 2;\n    if (/\\blarge\\b/.test(t)) return 3;\n    if (/\\bextra\\s*large\\b/.test(t) || /\\bxl\\b/.test(t)) return 4;\n    return NaN;\n  }\n\n  /** Small/Tiny \u2192 9mm disc; Medium/Large \u2192 12mm disc. */\n  function canonicalDiscMmFromSizeWordRank(rank) {\n    if (isNaN(rank)) return NaN;\n    if (rank <= 1) return 9;\n    return 12;\n  }\n\n  function getLargestSizeLabel(sizeLabels) {\n    if (!sizeLabels || !sizeLabels.length) return '';\n    var best = sizeLabels[0];\n    var bestMm = parseSizeMm(best);\n    var bestWord = parseSizeWordRank(best);\n    for (var i = 1; i < sizeLabels.length; i++) {\n      var lab = sizeLabels[i];\n      var mm = parseSizeMm(lab);\n      if (!isNaN(mm) && (isNaN(bestMm) || mm > bestMm)) {\n        best = lab;\n        bestMm = mm;\n        bestWord = parseSizeWordRank(lab);\n        continue;\n      }\n      var word = parseSizeWordRank(lab);\n      if (!isNaN(word) && (isNaN(bestWord) || word > bestWord)) {\n        best = lab;\n        bestMm = mm;\n        bestWord = word;\n        continue;\n      }\n      if (isNaN(mm) && isNaN(bestMm) && isNaN(word) && isNaN(bestWord) && String(lab).localeCompare(String(best)) > 0) {\n        best = lab;\n      }\n    }\n    return best;\n  }\n\n  /** Default group row + one row per smaller Size value. */\n  function getPickerRowSizesForGroup(products) {\n    var sizeLabels = collectUniqueSizeLabelsForGroup(products);\n    if (sizeLabels.length <= 1) return [{ size: '', resolveSize: '' }];\n    var largest = getLargestSizeLabel(sizeLabels);\n    var rows = [{ size: largest, resolveSize: largest }];\n    for (var i = 0; i < sizeLabels.length; i++) {\n      if (sizeLabels[i] === largest) continue;\n      rows.push({ size: sizeLabels[i], resolveSize: sizeLabels[i] });\n    }\n    return rows;\n  }\n\n  function findVariantForPickerSize(ap, config, state, sizeLabel) {\n    var sizeKey = getSizeOptionKeyStrict(ap);\n    if (!sizeKey) return null;\n    var pool = getAvailableAddonVariants(ap);\n    var candidates = pool.filter(function (v) {\n      var s = v[sizeKey] != null ? String(v[sizeKey]).trim() : '';\n      return s && sizeLabelsMatch(s, sizeLabel);\n    });\n    if (!candidates.length) {\n      candidates = (ap.variants || []).filter(function (v) {\n        var s = v[sizeKey] != null ? String(v[sizeKey]).trim() : '';\n        return s && sizeLabelsMatch(s, sizeLabel);\n      });\n    }\n    for (var i = 0; i < candidates.length; i++) {\n      if (variantMatchesMainFinish(candidates[i], ap, config, state)) return candidates[i];\n    }\n    return candidates[0] || null;\n  }\n\n  function resolveGroupPickerRow(config, state, group, products, resolveSizeLabel) {\n    // Never fall back to a sibling catalog product (e.g. Disc) for an empty Tag group.\n    if (!products || !products.length) return null;\n    if (resolveSizeLabel) {\n      for (var pi = 0; pi < products.length; pi++) {\n        var sizedAp = products[pi].addonProduct;\n        if (!sizedAp || !hasSizeOption(sizedAp)) continue;\n        var sizedVariant = findVariantForPickerSize(sizedAp, config, state, resolveSizeLabel);\n        if (sizedVariant) {\n          return {\n            ap: sizedAp,\n            typeEntry: getFirstTypeEntryForGroup(sizedAp, group.key),\n            variant: sizedVariant,\n            catalogIndex: products[pi].catalogIndex\n          };\n        }\n      }\n    }\n    var catalog = getAddons(config);\n    var ap = products[0].addonProduct || catalog[group.catalogIndex];\n    var catalogIndex = products[0].catalogIndex;\n    if (catalogIndex == null) catalogIndex = group.catalogIndex;\n    if (!ap) return null;\n    var variant = findVariantMatchingMainFinish(ap, config, state) || getDefaultVariant(ap);\n    if (!variant) return null;\n    return {\n      ap: ap,\n      typeEntry: getFirstTypeEntryForGroup(ap, group.key),\n      variant: variant,\n      catalogIndex: catalogIndex\n    };\n  }\n\n  function capitalizeSizeWord(word) {\n    if (!word) return '';\n    var w = String(word).trim();\n    if (!w) return '';\n    return w.charAt(0).toUpperCase() + w.slice(1).toLowerCase();\n  }\n\n  /** Picker label size token \u2014 \"Small - 9mm\" \u2192 \"9mm\"; plain \"Small\"/\"Medium\" kept for tag variants. */\n  function normalizePickerSizeDisplayLabel(sizeLabel) {\n    if (!sizeLabel) return '';\n    var s = String(sizeLabel).trim();\n    var mmMatch = s.match(/(\\d+(?:\\.\\d+)?)\\s*mm/i);\n    if (mmMatch) return mmMatch[1] + 'mm';\n    var sizeWordMatch = s.match(/\\b(small|medium|large|regular|standard)\\b/i);\n    if (sizeWordMatch) return capitalizeSizeWord(sizeWordMatch[1]);\n    return s\n      .replace(/\\s*[-\u2013\u2014]\\s*/g, ' ')\n      .replace(/\\s+/g, ' ')\n      .trim();\n  }\n\n  /** \"Disc - 12mm\" / \"Disc - 9mm\" \u2014 mm only, no Small/Large words. */\n  function formatPickerOptionLabel(groupTitle, sizeLabel) {\n    var gTitle = groupTitle ? String(groupTitle).trim() : '';\n    var size = normalizePickerSizeDisplayLabel(sizeLabel);\n    if (gTitle && size) return gTitle + ' - ' + size;\n    if (gTitle) return gTitle;\n    return size || 'Add-on';\n  }\n\n  /** Picker row label for cart line items (group + size, e.g. \"Disc - 9mm\", \"Birthstone\"). */\n  function getAddonCartGroupLabel(line, entry, addonProduct, config) {\n    if (!entry) return '';\n    var groupTitle = line ? getAddonLineGroupTitle(line, config) : '';\n    if (!groupTitle && addonProduct) {\n      groupTitle = addonCustomizerTabLabel(addonProduct) || addonProduct.title || '';\n    }\n    var apForSize = addonProduct || entry.addonProduct;\n    var sizeLabel = apForSize ? resolveLineSizeLabelForAddonProduct(entry, apForSize) : '';\n    return formatPickerOptionLabel(groupTitle, sizeLabel);\n  }\n\n  function getSizeOptionIndex(optionNames) {\n    if (!optionNames || !optionNames.length) return -1;\n    // Prefer exact Size / Disc Size before any other *size* label.\n    var prefer = ['size', 'disc size', 'sizes', 'taille'];\n    var pi;\n    for (pi = 0; pi < prefer.length; pi++) {\n      for (var i = 0; i < optionNames.length; i++) {\n        var raw = optionNames[i];\n        if (raw && typeof raw === 'object') {\n          raw = raw.name != null ? raw.name : raw.label != null ? raw.label : '';\n        }\n        var n = String(raw || '')\n          .trim()\n          .toLowerCase()\n          .replace(/\\s+/g, ' ');\n        if (n === prefer[pi]) return i;\n      }\n    }\n    for (var j = 0; j < optionNames.length; j++) {\n      if (isSizeOptionName(optionNames[j])) return j;\n    }\n    return -1;\n  }\n\n  /** Groups in a list; size rows for smaller Size values. */\n  function collectAddonPickerOptions(config, state) {\n    var groups = collectAddonCustomizationGroups(config);\n    var options = [];\n    for (var gi = 0; gi < groups.length; gi++) {\n      var g = groups[gi];\n      var products = getAddonProductsForGroup(config, g.key);\n      if (!products.length) continue;\n      var rowSizes = getPickerRowSizesForGroup(products);\n      for (var ri = 0; ri < rowSizes.length; ri++) {\n        var row = rowSizes[ri];\n        var target = resolveGroupPickerRow(config, state, g, products, row.resolveSize);\n        if (!target || !target.variant) continue;\n        var groupKind = shapeKindFromCustomizationGroupTitle(g.title || g.key);\n        var birthstoneGroupImage =\n          groupKind === 'birthstone' &&\n          config.birthstoneBlankImages &&\n          config.birthstoneBlankImages.group\n            ? config.birthstoneBlankImages.group\n            : null;\n        var useProductImage = groupKind === 'birthstone' && !birthstoneGroupImage;\n        var previewDiscPx =\n          groupKind === 'disc'\n            ? discPreviewPxFromSizeLabel(row.size, target.ap, DISC_PREVIEW_PICKER_BASE_PX)\n            : null;\n        options.push({\n          groupKey: g.key,\n          groupTitle: g.title,\n          catalogIndex: target.catalogIndex != null ? target.catalogIndex : g.catalogIndex,\n          variantId: target.variant.id,\n          variantPrice: Number(target.variant.price) || 0,\n          label: formatPickerOptionLabel(g.title, row.size),\n          image: birthstoneGroupImage || (useProductImage ? (target.ap && target.ap.image) || null : null),\n          shapeMod: addonGroupPickerPreviewClasses(config, state, g.key),\n          previewDiscPx: previewDiscPx,\n          previewCompact: !previewDiscPx && addonPickerRowUsesCompactBlank(row.size, target.ap)\n        });\n      }\n    }\n    options.sort(function (a, b) {\n      var ra = getCustomizationGroupSortRank(a.groupTitle || a.groupKey);\n      var rb = getCustomizationGroupSortRank(b.groupTitle || b.groupKey);\n      return ra - rb || String(a.label || '').localeCompare(String(b.label || ''));\n    });\n    return options;\n  }\n\n  function findCatalogIndexForGroup(config, groupKey) {\n    var catalog = getAddons(config);\n    for (var pi = 0; pi < catalog.length; pi++) {\n      if (!addonProductBelongsToCustomizationGroup(catalog[pi], groupKey, config)) continue;\n      return pi;\n    }\n    return 0;\n  }\n\n  function getCustomizerTypesForGroupWithIndex(addonProduct, groupKey, config) {\n    var out = [];\n    if (!addonProduct || !groupKey) return out;\n    var types = addonProduct.customizerTypes || [];\n    for (var i = 0; i < types.length; i++) {\n      if (typeEntryBelongsToCustomizationGroup(types[i], groupKey)) {\n        out.push({ typeEntry: types[i], typeIndex: i, addonProduct: addonProduct });\n      }\n    }\n    return out;\n  }\n\n  /**\n   * Product belongs to a picker/line group when group-type includes that group AND the\n   * product\u2019s physical silhouette matches (Name Disc \u2192 Disc only, Name Tag \u2192 Tag only).\n   *\n   * Tag/Initial Tag groups are strict: only real Tag SKUs. Disc products often list Tag in\n   * group-type on shared Name/Initial types; without a Tag title/handle those SKUs have\n   * null physical shape and used to leak a ghost Tag picker row (same price as Disc).\n   */\n  function addonProductBelongsToCustomizationGroup(addonProduct, groupKey, config) {\n    if (!addonProduct || !groupKey) return false;\n    if (addonProduct.id != null && groupKey === 'product:' + String(addonProduct.id)) return true;\n    if (getCustomizerTypesForGroupWithIndex(addonProduct, groupKey).length === 0) return false;\n    var groupKind = customizationGroupKeyShapeKind(groupKey, config);\n    var productKind = addonProductPhysicalShapeKind(addonProduct);\n    if (groupKind === 'tag' || groupKind === 'initial-tag') {\n      return productKind === 'tag' || productKind === 'initial-tag';\n    }\n    if (groupKind === 'disc') {\n      if (productKind === 'tag' || productKind === 'initial-tag') return false;\n      if (productKind && productKind !== 'disc') return false;\n      return true;\n    }\n    if (productKind && groupKind && productKind !== groupKind) return false;\n    return true;\n  }\n\n  /**\n   * All type tabs on an add-on product for editor/preview/cart.\n   * Group key only decides which products appear as tabs\u2014not which types render per product.\n   */\n  function getCustomizerTypesForAddonProductDisplay(addonProduct, groupKey, config) {\n    var out = [];\n    if (!addonProduct) return out;\n    var types = addonProduct.customizerTypes || [];\n    for (var i = 0; i < types.length; i++) {\n      out.push({ typeEntry: types[i], typeIndex: i, addonProduct: addonProduct });\n    }\n    if (out.length) return out;\n    var flat = addonProduct.customizer && addonProduct.customizer.customizations;\n    if (flat && flat.length) {\n      var typeName =\n        (addonProduct.customizer && addonProduct.customizer.type) ||\n        (flat[0] && flat[0].type) ||\n        addonCustomizerTabLabel(addonProduct) ||\n        '';\n      out.push({\n        typeEntry: {\n          customizations: flat,\n          typeLabel: typeName,\n          tabTitle: typeName\n        },\n        typeIndex: 0,\n        addonProduct: addonProduct\n      });\n    }\n    return out;\n  }\n\n  /** All customizer type entries in a group, across every linked add-on product. */\n  function getCustomizerTypesForGroupAcrossCatalog(config, groupKey) {\n    var out = [];\n    if (!groupKey || !config) return out;\n    var catalog = getAddons(config);\n    for (var pi = 0; pi < catalog.length; pi++) {\n      var ap = catalog[pi];\n      var types = ap.customizerTypes || [];\n      for (var i = 0; i < types.length; i++) {\n        if (typeEntryBelongsToCustomizationGroup(types[i], groupKey)) {\n          out.push({ typeEntry: types[i], typeIndex: i, addonProduct: ap, catalogIndex: pi });\n        }\n      }\n    }\n    return out;\n  }\n\n  /** Stable selection key for a grouped add-on type (unique across catalog products). */\n  function groupedAddonTypeKey(groupedItem) {\n    if (!groupedItem) return '';\n    var base = typeEntryKey(groupedItem.typeEntry, groupedItem.typeIndex);\n    var ap = groupedItem.addonProduct;\n    if (ap && ap.id != null) return String(ap.id) + ':' + base;\n    if (groupedItem.catalogIndex != null) return 'pi-' + groupedItem.catalogIndex + ':' + base;\n    return base;\n  }\n\n  function parseGroupedAddonSelectionKey(typeId) {\n    var s = String(typeId == null ? '' : typeId);\n    var colon = s.indexOf(':');\n    if (colon === -1) return { productId: null, baseKey: s };\n    return { productId: s.slice(0, colon), baseKey: s.slice(colon + 1) };\n  }\n\n  function selectionKeyMatchesTypeEntry(typeId, typeEntry, typeIndex, addonProduct) {\n    if (groupedAddonTypeKey({ typeEntry: typeEntry, typeIndex: typeIndex, addonProduct: addonProduct }) === String(typeId)) {\n      return true;\n    }\n    var parsed = parseGroupedAddonSelectionKey(typeId);\n    if (addonProduct && parsed.productId != null && String(addonProduct.id) !== String(parsed.productId)) {\n      return false;\n    }\n    var base = typeEntryKey(typeEntry, typeIndex);\n    return base === parsed.baseKey || base === String(typeId);\n  }\n\n  function getAddonProductForSelectionKey(state, config, listIndex, typeId) {\n    var line = state && state.addonList && state.addonList[listIndex];\n    if (!line) return null;\n    var products = getAddonLineGroupedProducts(line, config);\n    for (var pi = 0; pi < products.length; pi++) {\n      var types = products[pi].types || [];\n      for (var ti = 0; ti < types.length; ti++) {\n        if (groupedAddonTypeKey(types[ti]) === String(typeId)) {\n          return types[ti].addonProduct || products[pi].addonProduct || (line.entry && line.entry.addonProduct);\n        }\n      }\n    }\n    var parsed = parseGroupedAddonSelectionKey(typeId);\n    if (parsed.productId) {\n      var catalog = getAddons(config);\n      for (var pi = 0; pi < catalog.length; pi++) {\n        if (String(catalog[pi].id) === String(parsed.productId)) return catalog[pi];\n      }\n    }\n    return line.entry && line.entry.addonProduct;\n  }\n\n  function findTypeEntryOnProduct(addonProduct, typeId) {\n    if (!addonProduct || !addonProduct.customizerTypes) return null;\n    for (var i = 0; i < addonProduct.customizerTypes.length; i++) {\n      if (selectionKeyMatchesTypeEntry(typeId, addonProduct.customizerTypes[i], i, addonProduct)) {\n        return { typeEntry: addonProduct.customizerTypes[i], typeIndex: i };\n      }\n    }\n    return null;\n  }\n\n  function addonGroupedProductHasSelection(entry, pkg) {\n    if (!entry || !pkg) return false;\n    var types = pkg.types || [];\n    for (var ti = 0; ti < types.length; ti++) {\n      if (getAddonEntrySelection(entry, types[ti])) return true;\n      if (entry.manualByType) {\n        var tid = groupedAddonTypeKey(types[ti]);\n        var parsed = parseGroupedAddonSelectionKey(tid);\n        if (parsed.productId != null) {\n          if (entry.manualByType[tid] && String(entry.manualByType[tid]).trim()) return true;\n        } else {\n          var base = typeEntryKey(types[ti].typeEntry, types[ti].typeIndex);\n          if (entry.manualByType[tid] || entry.manualByType[base]) {\n            if (String(entry.manualByType[tid] || entry.manualByType[base]).trim()) return true;\n          }\n        }\n      }\n    }\n    return false;\n  }\n\n  /** Grid selection for one grouped add-on product tab (product-scoped keys only). */\n  function getAddonGridSelectionForPackage(entry, pkg) {\n    if (!entry || !pkg) return null;\n    var ap = pkg.addonProduct;\n    var types = pkg.types || [];\n\n    for (var si = 0; si < types.length; si++) {\n      var g = types[si];\n      var te = g.typeEntry;\n      var sel = getAddonEntrySelection(entry, g);\n      if (sel) {\n        return {\n          opt: sel,\n          typeName: te.typeLabel || te.tabTitle || '',\n          groupedItem: g\n        };\n      }\n    }\n\n    if (ap && ap.id != null && entry.selections) {\n      var wantPid = String(ap.id);\n      for (var sk in entry.selections) {\n        if (!entry.selections.hasOwnProperty(sk)) continue;\n        var selStored = entry.selections[sk];\n        if (!selStored) continue;\n        var parsedKey = parseGroupedAddonSelectionKey(sk);\n        if (parsedKey.productId != null && String(parsedKey.productId) !== wantPid) continue;\n        var matchG = null;\n        for (var sx = 0; sx < types.length; sx++) {\n          if (selectionKeyMatchesTypeEntry(sk, types[sx].typeEntry, types[sx].typeIndex, ap)) {\n            matchG = types[sx];\n            break;\n          }\n        }\n        if (!matchG && types.length) matchG = types[0];\n        if (!matchG) continue;\n        var teK = matchG.typeEntry;\n        return {\n          opt: selStored,\n          typeName: teK.typeLabel || teK.tabTitle || '',\n          groupedItem: matchG\n        };\n      }\n    }\n    return null;\n  }\n\n  /**\n   * One product tab on a grouped add-on line \u2014 same logic for Tag, Disc, Birthstone, etc.\n   * Preview display (shape, rotation, letter image) is handled later in renderPreviewChipInnerMarkup.\n   */\n  function pickAddonFlatProductPreview(entry, ap, config, state) {\n    var text = getAddonProductPersonalizationText(entry, ap);\n    var font = getAddonProductFontSelection(entry, ap);\n    var displayOpt = font;\n    if (font && config) {\n      displayOpt = resolveAddonOptionForPreview(font, ap, addonFlatSelectionKey(ap), config) || font;\n    }\n    if (text && font && config && state && ap) {\n      var flatTypeEntry = null;\n      var flatTypes = ap.customizerTypes || [];\n      for (var fi = 0; fi < flatTypes.length; fi++) {\n        var fte = flatTypes[fi];\n        if (isInitialCustomizerType(fte.typeLabel || fte.tabTitle || '', fte)) {\n          flatTypeEntry = fte;\n          break;\n        }\n      }\n      if (!flatTypeEntry && ap.customizer) {\n        var flatLabel = ap.customizer.type || addonCustomizerTabLabel(ap) || '';\n        if (isInitialCustomizerType(flatLabel, null)) {\n          flatTypeEntry = {\n            customizations: ap.customizer.customizations || [],\n            typeLabel: flatLabel,\n            tabTitle: flatLabel\n          };\n        }\n      }\n      if (flatTypeEntry || isInitialTagAddonProduct(ap)) {\n        if (!flatTypeEntry) {\n          flatTypeEntry = {\n            typeLabel: 'Initial',\n            tabTitle: 'Initial',\n            customizations: findSharedInitialLetterCustomizations(config, state)\n          };\n        }\n        var flatLetter = resolveInitialPreviewLetterOption(\n          config,\n          state,\n          ap,\n          flatTypeEntry,\n          null,\n          text,\n          font,\n          displayOpt\n        );\n        if (flatLetter && letterOptionHasImage(flatLetter)) {\n          displayOpt = flatLetter;\n        }\n      }\n    }\n    return {\n      opt: displayOpt,\n      manualText: text,\n      typeName: addonCustomizerTabLabel(ap) || (ap && ap.title) || '',\n      isText: !!String(text).trim(),\n      groupedItem: null\n    };\n  }\n\n  function pickAddonProductPreview(state, config, listIndex, productIndex, productsOverride) {\n    var line = state.addonList[listIndex];\n    if (!line || !line.entry) {\n      return { opt: null, manualText: '', typeName: '', isText: false, groupedItem: null };\n    }\n    var entry = line.entry;\n    var products =\n      productsOverride ||\n      getAddonLinePackages(\n        line,\n        config,\n        state,\n        state.uiPanel === 'addon' && state.uiAddonListIndex === listIndex\n      );\n    var pkg = products[productIndex];\n    if (!pkg) {\n      return { opt: null, manualText: '', typeName: entry.customizationType || '', isText: false, groupedItem: null };\n    }\n    var ap = pkg.addonProduct;\n    var types = pkg.types || [];\n    if (!types.length) {\n      return pickAddonFlatProductPreview(entry, ap, config, state);\n    }\n    var fallbackLabel =\n      addonCustomizerTabLabel(ap) ||\n      (ap && ap.title) ||\n      (types[0] && types[0].typeEntry && (types[0].typeEntry.typeLabel || types[0].typeEntry.tabTitle)) ||\n      '';\n\n    var fontOpt = null;\n    var fontGrouped = null;\n    var textVal = '';\n    var textGrouped = null;\n\n    for (var ti = 0; ti < types.length; ti++) {\n      var g = types[ti];\n      var te = g.typeEntry;\n      var label = te.typeLabel || te.tabTitle || '';\n      if (usesPersonalizationInput(label, te, ap)) {\n        var m = getAddonEntryManualText(entry, g, ap);\n        if (m) {\n          textVal = m;\n          textGrouped = g;\n        }\n      }\n      if (isFontSelectionTab(label, te) || usesFontStylePicker(label, te, ap)) {\n        var selFont = getAddonEntrySelection(entry, g);\n        if (selFont) {\n          fontOpt = selFont;\n          fontGrouped = g;\n        }\n      }\n    }\n\n    for (var mi = 0; mi < types.length; mi++) {\n      var gManual = types[mi];\n      var teM = gManual.typeEntry;\n      var typeLabelM = teM.typeLabel || teM.tabTitle || '';\n      if (!showsNameTextInput(typeLabelM, teM, ap)) continue;\n      var m = getAddonEntryManualText(entry, gManual, ap);\n      if (m && String(m).trim()) {\n        return {\n          opt: getAddonEntrySelection(entry, gManual),\n          manualText: m,\n          typeName: typeLabelM,\n          isText: true,\n          groupedItem: gManual\n        };\n      }\n    }\n\n    if (textVal || fontOpt) {\n      var displayOpt = fontOpt;\n      if (fontOpt) {\n        var fk = fontGrouped ? groupedAddonTypeKey(fontGrouped) : null;\n        displayOpt = resolveAddonOptionForPreview(fontOpt, ap, fk, config) || fontOpt;\n      }\n      if (\n        textVal &&\n        fontOpt &&\n        config &&\n        state\n      ) {\n        var initialTe = null;\n        if (fontGrouped && isInitialCustomizerType(fontGrouped.typeEntry.typeLabel || fontGrouped.typeEntry.tabTitle || '', fontGrouped.typeEntry)) {\n          initialTe = fontGrouped.typeEntry;\n        } else if (textGrouped && isInitialCustomizerType(textGrouped.typeEntry.typeLabel || textGrouped.typeEntry.tabTitle || '', textGrouped.typeEntry)) {\n          initialTe = textGrouped.typeEntry;\n        }\n        // Same remap as disc Initial \u2014 always for Initial Tag products, even if type label is odd.\n        if (initialTe || isInitialTagAddonProduct(ap)) {\n          if (!initialTe) {\n            initialTe = {\n              typeLabel: 'Initial',\n              tabTitle: 'Initial',\n              customizations: findSharedInitialLetterCustomizations(config, state)\n            };\n          }\n          var lineGroupKey = line.customizationGroupKey || ensureAddonLineGroupKey(line, config);\n          var letterOpt = resolveInitialPreviewLetterOption(\n            config,\n            state,\n            ap,\n            initialTe,\n            lineGroupKey,\n            textVal,\n            fontOpt,\n            displayOpt\n          );\n          // Only swap in a typed-letter PNG \u2014 never blank a working font-tile image.\n          if (letterOpt && letterOptionHasImage(letterOpt)) {\n            displayOpt = letterOpt;\n          }\n        }\n      }\n      var typeNameOut =\n        (textGrouped && textGrouped.typeEntry && (textGrouped.typeEntry.typeLabel || textGrouped.typeEntry.tabTitle)) ||\n        (fontGrouped && fontGrouped.typeEntry && (fontGrouped.typeEntry.typeLabel || fontGrouped.typeEntry.tabTitle)) ||\n        fallbackLabel;\n      return {\n        opt: displayOpt,\n        manualText: textVal,\n        typeName: typeNameOut,\n        isText: !!String(textVal).trim(),\n        groupedItem: textGrouped || fontGrouped || types[0] || null\n      };\n    }\n\n    var gridSel = getAddonGridSelectionForPackage(entry, pkg);\n    if (gridSel) {\n      return {\n        opt: gridSel.opt,\n        manualText: '',\n        typeName: gridSel.typeName,\n        isText: false,\n        groupedItem: gridSel.groupedItem\n      };\n    }\n\n    return { opt: null, manualText: '', typeName: fallbackLabel, isText: false, groupedItem: types[0] || null };\n  }\n\n  function getAddonLineBundlePrice(line, config, state) {\n    if (!line || !line.entry) return 0;\n    var products = getAddonProductsForCartLine(line, config, state);\n    var total = 0;\n    var entry = line.entry;\n    for (var i = 0; i < products.length; i++) {\n      var v = resolveAddonProductVariantForLine(entry, products[i], config, state);\n      total += v ? Number(v.price) || 0 : 0;\n    }\n    return total;\n  }\n\n  /** True when an optional add-on line already resolves to this variant (avoid double gift-wrap pricing). */\n  function addonLinesIncludeVariantId(state, config, variantId) {\n    if (!state || !state.addonList || variantId == null || variantId === '') return false;\n    var target = String(variantId);\n    for (var i = 0; i < state.addonList.length; i++) {\n      var line = state.addonList[i];\n      if (!line || !line.entry || line.entry.mandatory) continue;\n      var products = getAddonProductsForCartLine(line, config, state);\n      for (var p = 0; p < products.length; p++) {\n        var v = resolveAddonProductVariantForLine(line.entry, products[p], config, state);\n        if (v && String(v.id) === target) return true;\n      }\n    }\n    return false;\n  }\n\n  function mergeGiftWrapOntoCartItemLine(cartLine, mainTitle) {\n    if (!cartLine) return;\n    cartLine.properties = cartLine.properties || {};\n    cartLine.properties._IsGiftWrap = true;\n    cartLine.properties['Gift Wrap For'] = mainTitle || 'Product';\n  }\n\n  /**\n   * Products to price / add to cart for an optional line.\n   * Prefer configured (active) products; fall back to the line's primary product so a\n   * completed optional add-on is never dropped from the bundle.\n   */\n  function getAddonProductsForCartLine(line, config, state) {\n    if (!line || !line.entry) return [];\n    var entry = line.entry;\n    var products = getConfiguredAddonProductsForLine(line, config, state);\n    if (!products.length && entry.addonProduct) {\n      // Prefer the seeded / size-picked product over an ambient Name|Initial tab.\n      products = [entry.addonProduct];\n    }\n    if (!products.length && addonLineHasExclusiveProductTabs(line, config)) {\n      var activePkg = getActiveAddonPackage(line, config, state);\n      if (activePkg && activePkg.addonProduct) products = [activePkg.addonProduct];\n    }\n    return products;\n  }\n\n  function ensureAddonLineGroupKey(line, config) {\n    if (!line || line.customizationGroupKey) return line ? line.customizationGroupKey : null;\n    var ap = line.entry && line.entry.addonProduct;\n    if (!ap) return null;\n    var types = ap.customizerTypes || [];\n    for (var i = 0; i < types.length; i++) {\n      var key = getEffectiveTypeCustomizationGroupKey(types[i]);\n      if (key) {\n        line.customizationGroupKey = key;\n        return key;\n      }\n    }\n    if (ap.id != null) {\n      line.customizationGroupKey = 'product:' + String(ap.id);\n    }\n    return line.customizationGroupKey;\n  }\n\n  function getAddonLineTypesForProduct(entry, ap, groupKey, config, state, editorContext) {\n    return getAddonDisplayTypesForProduct(\n      entry,\n      ap,\n      groupKey,\n      config,\n      state,\n      !!editorContext\n    );\n  }\n\n  /** When a product\u2019s variant has customizer_options, keep that package if it still has types. */\n  function filterAddonPackagesByVariantOptions(entry, pkgs, groupKey, config, state) {\n    if (!entry || !pkgs.length) return pkgs;\n    var out = [];\n    for (var pi = 0; pi < pkgs.length; pi++) {\n      var ap = pkgs[pi].addonProduct;\n      if (!ap) continue;\n      // Filter each catalog product by ITS OWN variant options \u2014 never use Initial Tag\u2019s\n      // letter catalog to drop the sibling Name Tag (that desynced preview tab indexes).\n      var variantOpts = getAddonVariantCustomizerOptions(entry, ap, config, state);\n      var variantTypes = getAddonVariantCustomizerTypes(entry, ap, config, state);\n      if (variantOpts == null && variantTypes == null) {\n        out.push(pkgs[pi]);\n        continue;\n      }\n      var types = getAddonDisplayTypesForProduct(entry, ap, groupKey, config, state, false);\n      if (variantOpts == null) {\n        if (types.length) out.push(pkgs[pi]);\n        continue;\n      }\n      var allowed = false;\n      for (var ti = 0; ti < types.length; ti++) {\n        for (var vi = 0; vi < variantOpts.length; vi++) {\n          if (\n            typeEntryMatchesVariantCustomizerRef(variantOpts[vi], types[ti].typeEntry) ||\n            variantRefBelongsToTypeEntry(variantOpts[vi], types[ti].typeEntry)\n          ) {\n            allowed = true;\n            break;\n          }\n        }\n        if (allowed) break;\n      }\n      if (!allowed && synthesizeDisplayTypesFromVariantOptions(variantOpts).length) {\n        allowed = true;\n      }\n      if (allowed) out.push(pkgs[pi]);\n    }\n    // Never drop every package \u2014 synthesis / product types still need a host product.\n    return out.length ? out : pkgs;\n  }\n\n  function getAddonProductsForGroup(config, groupKey) {\n    var out = [];\n    if (!groupKey || !config) return out;\n    var seen = {};\n    var catalog = getAddons(config);\n    for (var pi = 0; pi < catalog.length; pi++) {\n      var ap = catalog[pi];\n      if (!addonProductBelongsToCustomizationGroup(ap, groupKey, config)) continue;\n      if (ap.id != null && seen[ap.id]) continue;\n      if (ap.id != null) seen[ap.id] = true;\n      out.push({\n        addonProduct: ap,\n        catalogIndex: pi,\n        types: getCustomizerTypesForAddonProductDisplay(ap, groupKey, config)\n      });\n    }\n    return out;\n  }\n\n  function getAddonLineGroupedProducts(line, config) {\n    if (!line) return [];\n    var groupKey = ensureAddonLineGroupKey(line, config);\n    if (!groupKey) return [];\n    return getAddonProductsForGroup(config, groupKey);\n  }\n\n  /**\n   * Compact sizes can't fit large stamps.\n   * Disc 9mm: hide Birth Flower + Rose / Tulip / Dandelion / Rising Sun / Woman.\n   * Tag Small: hide Birth Flower + Butterfly / Paw / Sun / Tulip.\n   * Tag Medium: hide Birth Flower + Sun.\n   */\n  var COMPACT_DISC_BLOCKED_SYMBOL_NAMES = [\n    'rose',\n    'tulip',\n    'dandelion',\n    'rising sun',\n    'sun',\n    'woman',\n    'women',\n    'feminist'\n  ];\n  var SMALL_TAG_BLOCKED_SYMBOL_NAMES = ['butterfly', 'paw', 'rising sun', 'sun', 'tulip'];\n  var MEDIUM_TAG_BLOCKED_SYMBOL_NAMES = ['rising sun', 'sun'];\n\n  function isBirthFlowerAddonProduct(addonProduct) {\n    if (!addonProduct) return false;\n    if (labelMatchesBirthFlower(addonProduct.title) || labelMatchesBirthFlower(addonProduct.handle)) {\n      return true;\n    }\n    var types = addonProduct.customizerTypes || [];\n    for (var i = 0; i < types.length; i++) {\n      if (isBirthFlowerType(types[i].typeLabel || types[i].tabTitle || '', types[i])) return true;\n    }\n    return false;\n  }\n\n  function isBlockedSymbolNameInList(name, blockedList) {\n    var tok = normalizePickerMatchToken(name);\n    if (!tok || !blockedList || !blockedList.length) return false;\n    for (var i = 0; i < blockedList.length; i++) {\n      var blocked = blockedList[i];\n      if (tok === blocked || tok.indexOf(blocked) !== -1) return true;\n    }\n    return false;\n  }\n\n  function isCompactDiscBlockedSymbolName(name) {\n    return isBlockedSymbolNameInList(name, COMPACT_DISC_BLOCKED_SYMBOL_NAMES);\n  }\n\n  function isSmallTagBlockedSymbolName(name) {\n    return isBlockedSymbolNameInList(name, SMALL_TAG_BLOCKED_SYMBOL_NAMES);\n  }\n\n  function isMediumTagBlockedSymbolName(name) {\n    return isBlockedSymbolNameInList(name, MEDIUM_TAG_BLOCKED_SYMBOL_NAMES);\n  }\n\n  function resolveAddonLineSizeLabel(line, config) {\n    if (!line || !line.entry || !config) return '';\n    var entry = line.entry;\n    var sizeLabel = entry.sizeLabel ? String(entry.sizeLabel).trim() : '';\n    if (sizeLabel) return sizeLabel;\n    var groupKey = line.customizationGroupKey || ensureAddonLineGroupKey(line, config);\n    var pkgs = getAddonProductsForGroup(config, groupKey);\n    for (var pi = 0; pi < pkgs.length; pi++) {\n      var lab = resolveLineSizeLabelForAddonProduct(entry, pkgs[pi].addonProduct);\n      if (lab) return lab;\n    }\n    return '';\n  }\n\n  /** True when this Disc add-on line is the small (9mm) size. */\n  function discLineIsCompactNineMm(line, config, state) {\n    if (!line || !line.entry || !config) return false;\n    var groupKey = line.customizationGroupKey || ensureAddonLineGroupKey(line, config);\n    if (customizationGroupKeyShapeKind(groupKey, config) !== 'disc') return false;\n    var entry = line.entry;\n    var sizeLabel = resolveAddonLineSizeLabel(line, config);\n    if (sizeLabel) {\n      var mm = parseSizeMm(sizeLabel);\n      if (!isNaN(mm) && mm > 0 && mm <= 9) return true;\n      if (/\\b9\\s*mm\\b/i.test(sizeLabel)) return true;\n    }\n    return !!entry.pickedSmallerSize;\n  }\n\n  /** True when this Tag add-on line is Tiny / Small / XS. */\n  function tagLineIsSmall(line, config, state) {\n    if (!line || !line.entry || !config) return false;\n    var groupKey = line.customizationGroupKey || ensureAddonLineGroupKey(line, config);\n    if (customizationGroupKeyShapeKind(groupKey, config) !== 'tag') return false;\n    var sizeLabel = resolveAddonLineSizeLabel(line, config);\n    if (!sizeLabel) return !!line.entry.pickedSmallerSize;\n    if (/\\b(tiny|mini|small|xs)\\b/i.test(sizeLabel)) return true;\n    var rank = parseSizeWordRank(sizeLabel);\n    return !isNaN(rank) && rank <= 1;\n  }\n\n  /** True when this Tag add-on line is Medium (not Large). */\n  function tagLineIsMedium(line, config, state) {\n    if (!line || !line.entry || !config) return false;\n    var groupKey = line.customizationGroupKey || ensureAddonLineGroupKey(line, config);\n    if (customizationGroupKeyShapeKind(groupKey, config) !== 'tag') return false;\n    var sizeLabel = resolveAddonLineSizeLabel(line, config);\n    if (!sizeLabel) return false;\n    if (/\\bmedium\\b/i.test(sizeLabel)) return true;\n    return parseSizeWordRank(sizeLabel) === 2;\n  }\n\n  /** 'disc-compact' | 'tag-small' | 'tag-medium' | null */\n  function addonLineSizeRestriction(line, config, state) {\n    if (discLineIsCompactNineMm(line, config, state)) return 'disc-compact';\n    if (tagLineIsSmall(line, config, state)) return 'tag-small';\n    if (tagLineIsMedium(line, config, state)) return 'tag-medium';\n    return null;\n  }\n\n  function addonLineHidesBirthFlower(line, config, state) {\n    return !!addonLineSizeRestriction(line, config, state);\n  }\n\n  function isSymbolBlockedForLineRestriction(name, restriction) {\n    if (restriction === 'disc-compact') return isCompactDiscBlockedSymbolName(name);\n    if (restriction === 'tag-small') return isSmallTagBlockedSymbolName(name);\n    if (restriction === 'tag-medium') return isMediumTagBlockedSymbolName(name);\n    return false;\n  }\n\n  function filterAddonPackagesForSizeRestrictions(line, pkgs, config, state) {\n    if (!pkgs || !pkgs.length) return pkgs;\n    if (!addonLineHidesBirthFlower(line, config, state)) return pkgs;\n    var out = [];\n    for (var i = 0; i < pkgs.length; i++) {\n      if (isBirthFlowerAddonProduct(pkgs[i].addonProduct)) continue;\n      out.push(pkgs[i]);\n    }\n    return out;\n  }\n\n  function filterCustomizationsForSizeRestrictions(list, typeEntry, config, state, addonProduct, groupKey) {\n    if (!list || !list.length) return list || [];\n    var line = null;\n    if (state && state.addonList && state.uiPanel === 'addon' && state.uiAddonListIndex != null) {\n      line = state.addonList[state.uiAddonListIndex];\n    }\n    if (!line && state && state.addonList && addonProduct) {\n      var matches = [];\n      for (var li = 0; li < state.addonList.length; li++) {\n        var cand = state.addonList[li];\n        if (!cand || !cand.entry) continue;\n        var gk = cand.customizationGroupKey || ensureAddonLineGroupKey(cand, config);\n        if (groupKey && gk && gk !== groupKey) continue;\n        if (addonProductBelongsToCustomizationGroup(addonProduct, gk, config)) {\n          matches.push(cand);\n        }\n      }\n      // Only auto-bind when unambiguous \u2014 mixed sizes must not share one filter.\n      if (matches.length === 1) line = matches[0];\n    }\n    var restriction = addonLineSizeRestriction(line, config, state);\n    if (!restriction) return list;\n    var lab = typeEntry ? typeEntry.typeLabel || typeEntry.tabTitle || '' : '';\n    if (isBirthFlowerType(lab, typeEntry) || isBirthFlowerAddonProduct(addonProduct)) return [];\n    if (!isSymbolType(lab)) return list;\n    return list.filter(function (c) {\n      return !isSymbolBlockedForLineRestriction(c && c.name, restriction);\n    });\n  }\n\n  /** Product title/handle contains \"zodiac\" \u2192 Symbol grid is zodiac metaobject options only. */\n  function labelMatchesZodiacProduct(text) {\n    if (!text) return false;\n    return String(text).toLowerCase().indexOf('zodiac') !== -1;\n  }\n\n  function isZodiacSymbolProduct(config, addonProduct) {\n    if (addonProduct) {\n      return (\n        labelMatchesZodiacProduct(addonProduct.title) || labelMatchesZodiacProduct(addonProduct.handle)\n      );\n    }\n    if (config && config.main) {\n      return (\n        labelMatchesZodiacProduct(config.main.title) || labelMatchesZodiacProduct(config.main.handle)\n      );\n    }\n    return false;\n  }\n\n  function isZodiacSymbolOption(opt) {\n    if (!opt) return false;\n    var handle = String(opt.handle || '').toLowerCase();\n    if (handle.indexOf('zodiac') !== -1) return true;\n    // Fallback when handle wasn't serialized (name often includes Zodiac too).\n    var name = String(opt.name || opt.title || '').toLowerCase();\n    return name.indexOf('zodiac') !== -1;\n  }\n\n  function filterCustomizationsForZodiacProduct(list, typeEntry, config, addonProduct) {\n    if (!list || !list.length) return list || [];\n    if (!isZodiacSymbolProduct(config, addonProduct)) return list;\n    var lab = typeEntry ? typeEntry.typeLabel || typeEntry.tabTitle || '' : '';\n    if (!isSymbolType(lab)) return list;\n    return list.filter(isZodiacSymbolOption);\n  }\n\n  function applyCustomizationListFilters(list, typeEntry, config, state, addonProduct, groupKey) {\n    return filterCustomizationsForZodiacProduct(\n      filterCustomizationsForSizeRestrictions(list, typeEntry, config, state, addonProduct, groupKey),\n      typeEntry,\n      config,\n      addonProduct\n    );\n  }\n\n  /** Drop symbol/flower picks that no longer fit after a size change. */\n  function pruneSelectionsBlockedByLineSize(line, config, state) {\n    if (!line || !line.entry || !line.entry.selections) return;\n    var restriction = addonLineSizeRestriction(line, config, state);\n    if (!restriction) return;\n    var sels = line.entry.selections;\n    for (var key in sels) {\n      if (!sels.hasOwnProperty(key)) continue;\n      var opt = sels[key];\n      if (!opt) continue;\n      var typeName = opt.type || '';\n      if (isBirthFlowerType(typeName, null) || labelMatchesBirthFlower(opt.name)) {\n        delete sels[key];\n        continue;\n      }\n      if (isSymbolType(typeName) && isSymbolBlockedForLineRestriction(opt.name, restriction)) {\n        delete sels[key];\n      }\n    }\n  }\n\n  /** Catalog products for this line (group), or one synthetic package for a lone add-on. */\n  function getAddonLinePackages(line, config, state, editorContext) {\n    var entry = line && line.entry;\n    var groupKey = line ? ensureAddonLineGroupKey(line, config) : null;\n    var pkgs = getAddonLineGroupedProducts(line, config);\n    if (editorContext) {\n      pkgs = filterAddonPackagesByVariantOptions(entry, pkgs, groupKey, config, state);\n    }\n    pkgs = filterAddonPackagesForSizeRestrictions(line, pkgs, config, state);\n    if (pkgs.length) {\n      var filtered = [];\n      for (var pi = 0; pi < pkgs.length; pi++) {\n        filtered.push({\n          addonProduct: pkgs[pi].addonProduct,\n          catalogIndex: pkgs[pi].catalogIndex,\n          types: getAddonLineTypesForProduct(entry, pkgs[pi].addonProduct, groupKey, config, state, editorContext)\n        });\n      }\n      return filtered;\n    }\n    var ap = entry && entry.addonProduct;\n    if (!ap) return [];\n    if (addonLineHidesBirthFlower(line, config, state) && isBirthFlowerAddonProduct(ap)) return [];\n    return [\n      {\n        addonProduct: ap,\n        catalogIndex: line.addonIndex,\n        types: getAddonLineTypesForProduct(entry, ap, groupKey, config, state, editorContext)\n      }\n    ];\n  }\n\n  /** Types for one add-on line \u2014 only products in that line's group (not whole-catalog scan). */\n  function getAddonLineGroupedTypes(line, config) {\n    if (!line) return [];\n    var pkgs = getAddonLineGroupedProducts(line, config);\n    var out = [];\n    for (var pi = 0; pi < pkgs.length; pi++) {\n      var types = pkgs[pi].types || [];\n      for (var ti = 0; ti < types.length; ti++) out.push(types[ti]);\n    }\n    if (out.length) return out;\n    var groupKey = ensureAddonLineGroupKey(line, config);\n    if (!groupKey) return [];\n    var ap = line.entry && line.entry.addonProduct;\n    if (!ap) return [];\n    return getCustomizerTypesForGroupWithIndex(ap, groupKey, config);\n  }\n\n  function shapeKindFromCustomizationGroupTitle(title) {\n    if (!title) return null;\n    var t = String(title).toLowerCase().trim();\n    if (t.indexOf('birthstone bar') !== -1) return 'birthstone-bar';\n    if (t.indexOf('birthstone') !== -1 || t.indexOf('birth stone') !== -1) return 'birthstone';\n    if (t.indexOf('disc') !== -1) return 'disc';\n    if (t.indexOf('initial') !== -1 && t.indexOf('tag') !== -1) return 'initial-tag';\n    if (t.indexOf('tag') !== -1 || (t.indexOf('name') !== -1 && t.indexOf('tag') !== -1)) return 'tag';\n    if (t.indexOf('bloom') !== -1 || (t.indexOf('birth') !== -1 && t.indexOf('flower') !== -1)) return 'bloom';\n    return null;\n  }\n\n  function pickerShapeModFromGroupTitle(title) {\n    var kind = shapeKindFromCustomizationGroupTitle(title);\n    if (kind === 'birthstone-bar') return ' customizer-addon-group-picker-preview--birthstone-bar';\n    if (kind === 'birthstone') return ' customizer-addon-group-picker-preview--birthstone';\n    if (kind === 'initial-tag') return ' customizer-addon-group-picker-preview--shape-initial-tag';\n    if (kind === 'tag') return ' customizer-addon-group-picker-preview--shape-rect';\n    if (kind === 'disc') return ' customizer-addon-group-picker-preview--shape-disc';\n    if (kind === 'bloom') return ' customizer-addon-group-picker-preview--shape-oval';\n    return null;\n  }\n\n  function previewStripShapeModFromPickerMod(pickerMod) {\n    if (pickerMod.indexOf('birthstone-bar') !== -1) return ' customizer-preview-item--birthstone-bar';\n    if (pickerMod.indexOf('birthstone') !== -1) return ' customizer-preview-item--birthstone';\n    if (pickerMod.indexOf('shape-initial-tag') !== -1) return ' customizer-preview-item--shape-initial-tag';\n    if (pickerMod.indexOf('shape-bloom-circle') !== -1) return ' customizer-preview-item--shape-bloom-circle';\n    if (pickerMod.indexOf('shape-oval') !== -1) return ' customizer-preview-item--shape-oval';\n    if (pickerMod.indexOf('shape-rect') !== -1) return ' customizer-preview-item--shape-rect';\n    if (pickerMod.indexOf('shape-disc') !== -1) return ' customizer-preview-item--shape-disc';\n    return '';\n  }\n\n  /**\n   * Preview silhouette from the add-on product.\n   * Disc / tag shape follows the product (title, options, own group) \u2014 Name and Initial\n   * types can live on either silhouette when the metafield says so.\n   */\n  function addonPreviewShapeModForProduct(config, line, addonProduct) {\n    if (addonProduct && isDiscSilhouetteAddonProduct(addonProduct)) {\n      return ' customizer-preview-item--shape-disc';\n    }\n    if (addonProduct && isInitialTagAddonProduct(addonProduct)) {\n      return ' customizer-preview-item--shape-initial-tag';\n    }\n    if (addonProduct && isNameTagAddonProduct(addonProduct)) {\n      return ' customizer-preview-item--shape-rect';\n    }\n    if (!line) return '';\n    var groupKey = ensureAddonLineGroupKey(line, config);\n    var title = getAddonLineGroupTitle(line, config);\n    var apTitle = addonProduct ? addonProduct.title : '';\n    var apHandle = addonProduct ? addonProduct.handle : '';\n    // Prefer product/title detection so Baby Bloom always gets the zoom class\n    var babyShape = previewStripShapeModFromStrings(\n      isMainProductBraceletFromConfig(config),\n      title,\n      apTitle,\n      apHandle\n    );\n    if (babyShape && babyShape.indexOf('baby-bloom') !== -1) return babyShape;\n    if (babyShape && babyShape.indexOf('shape-disc') !== -1) return babyShape;\n    var forced = pickerShapeModFromGroupTitle(title);\n    var shapeMod = forced\n      ? previewStripShapeModFromPickerMod(forced)\n      : previewStripShapeModFromPickerMod(addonGroupPickerBlankShapeMod(config, groupKey));\n    if (\n      shapeMod &&\n      (shapeMod.indexOf('shape-oval') !== -1 || shapeMod.indexOf('shape-bloom-circle') !== -1) &&\n      (isBabyBloomPreviewString(title) ||\n        isBabyBloomPreviewString(apTitle) ||\n        isBabyBloomPreviewString(apHandle))\n    ) {\n      if (shapeMod.indexOf('baby-bloom') === -1) {\n        shapeMod += ' customizer-preview-item--baby-bloom';\n      }\n    }\n    return shapeMod;\n  }\n\n  /** Finish tint on disc and tag bars (birthstone chips stay neutral). */\n  function addonLinePreviewMetalMod(config, state, shapeMod) {\n    if (shapeMod && shapeMod.indexOf('birthstone-bar') !== -1) return '';\n    if (shapeMod && shapeMod.indexOf('birthstone') !== -1) return '';\n    return isMainGold(config, state)\n      ? ' customizer-preview-item--symbol-gold'\n      : ' customizer-preview-item--symbol-silver';\n  }\n\n  /** Selection + group decide overlay styling \u2014 not the add-on product tab title. */\n  function previewOverlayUsesSymbolImg(opt, typeEntry, groupTitle) {\n    if (typeEntry) {\n      var label = typeEntry.typeLabel || typeEntry.tabTitle || '';\n      if (isBirthFlowerType(label, typeEntry)) return false;\n      if (isSymbolType(label)) return true;\n      if (isBirthstoneType(label, typeEntry) || isBirthstoneBarType(label, typeEntry)) return false;\n    }\n    if (opt && opt.type) {\n      if (isBirthFlowerType(opt.type, null)) return false;\n      if (isSymbolType(opt.type)) return true;\n    }\n    if (shapeKindFromCustomizationGroupTitle(groupTitle) === 'disc') return false;\n    return false;\n  }\n\n  function buildAddonLinePreviewResult(prev, productIndex, products, entry) {\n    var pkg = products && products[productIndex];\n    return {\n      opt: prev.opt,\n      manualText: prev.manualText,\n      typeName: prev.typeName,\n      isText: prev.isText,\n      groupedItem: prev.groupedItem,\n      productIndex: productIndex,\n      resolveAp: (pkg && pkg.addonProduct) || (entry && entry.addonProduct)\n    };\n  }\n\n  /** Typed personalization for one product tab (name, initial letter, etc.). */\n  function getAddonProductPersonalizationText(entry, addonProduct) {\n    if (!entry || !addonProduct) return '';\n    var types = addonProduct.customizerTypes || [];\n    for (var ti = 0; ti < types.length; ti++) {\n      var te = types[ti];\n      var lbl = te.typeLabel || te.tabTitle || '';\n      if (!usesPersonalizationInput(lbl, te, addonProduct)) continue;\n      var g = makeAddonGroupedItem(te, ti, addonProduct);\n      var m = getAddonEntryManualText(entry, g, addonProduct);\n      if (m) return m;\n    }\n    if (addonProduct.id != null && entry.manualByType) {\n      var pid = String(addonProduct.id);\n      for (var mk in entry.manualByType) {\n        if (!entry.manualByType.hasOwnProperty(mk)) continue;\n        var parsed = parseGroupedAddonSelectionKey(mk);\n        if (parsed.productId != null && String(parsed.productId) === pid) {\n          var mv = String(entry.manualByType[mk]).trim();\n          if (mv) return mv;\n        }\n      }\n    }\n    return '';\n  }\n\n  function getAddonProductFontSelection(entry, addonProduct) {\n    if (!entry || !addonProduct) return null;\n    var types = addonProduct.customizerTypes || [];\n    for (var ti = 0; ti < types.length; ti++) {\n      var te = types[ti];\n      var lbl = te.typeLabel || te.tabTitle || '';\n      if (!isFontSelectionTab(lbl, te) && !usesFontStylePicker(lbl, te, addonProduct)) continue;\n      var g = makeAddonGroupedItem(te, ti, addonProduct);\n      var sel = getAddonEntrySelection(entry, g);\n      if (sel) return sel;\n    }\n    return null;\n  }\n\n  /**\n   * One preview per add-on line: active tab while editing, else last tab with data.\n   * While editing, use the same filtered package list as the editor tabs \u2014 otherwise\n   * Name|Initial index 0 is Name in the full catalog but Initial-only after variant\n   * filter, and style clicks paint a blank Name chip.\n   */\n  function pickAddonLinePreview(state, config, listIndex) {\n    var line = state.addonList[listIndex];\n    if (!line || !line.entry) {\n      return {\n        opt: null,\n        manualText: '',\n        typeName: '',\n        isText: false,\n        groupedItem: null,\n        productIndex: 0,\n        resolveAp: null\n      };\n    }\n    var entry = line.entry;\n    var editingThisLine = state.uiPanel === 'addon' && state.uiAddonListIndex === listIndex;\n    var products = getAddonLinePackages(line, config, state, editingThisLine);\n    if (!products.length) {\n      return {\n        opt: null,\n        manualText: '',\n        typeName: '',\n        isText: false,\n        groupedItem: null,\n        productIndex: 0,\n        resolveAp: null\n      };\n    }\n\n    var scanOrder = [];\n    if (editingThisLine) {\n      var active = state.activeAddonTypeTabIndex;\n      if (active < 0 || active >= products.length) active = 0;\n      scanOrder.push(active);\n      // If the active tab has nothing to show yet, fall through to a sibling with data\n      // (e.g. clamped onto Name while Initial still holds the letter).\n      for (var piEdit = 0; piEdit < products.length; piEdit++) {\n        if (scanOrder.indexOf(piEdit) === -1) scanOrder.push(piEdit);\n      }\n    } else {\n      if (entry.lastAddonPreviewProductIndex != null && entry.lastAddonPreviewProductIndex < products.length) {\n        scanOrder.push(entry.lastAddonPreviewProductIndex);\n      }\n      for (var pi = products.length - 1; pi >= 0; pi--) {\n        if (scanOrder.indexOf(pi) === -1 && addonGroupedProductHasSelection(entry, products[pi])) {\n          scanOrder.push(pi);\n        }\n      }\n      if (!scanOrder.length) scanOrder.push(0);\n    }\n\n    for (var si = 0; si < scanOrder.length; si++) {\n      var pi2 = scanOrder[si];\n      var prev = pickAddonProductPreview(state, config, listIndex, pi2, products);\n      if (prev.opt || prev.isText) {\n        return buildAddonLinePreviewResult(prev, pi2, products, entry);\n      }\n    }\n\n    var emptyPi = scanOrder[0] || 0;\n    return buildAddonLinePreviewResult(\n      pickAddonProductPreview(state, config, listIndex, emptyPi, products),\n      emptyPi,\n      products,\n      entry\n    );\n  }\n\n  function getAddonLineGroupTitle(line, config) {\n    if (!line) return '';\n    var groupKey = ensureAddonLineGroupKey(line, config);\n    if (!groupKey) return '';\n    var groups = collectAddonCustomizationGroups(config);\n    for (var gi = 0; gi < groups.length; gi++) {\n      if (groups[gi].key === groupKey) return groups[gi].title || '';\n    }\n    var grouped = getCustomizerTypesForGroupAcrossCatalog(config, groupKey);\n    if (!grouped.length && line.entry && line.entry.addonProduct) {\n      grouped = getCustomizerTypesForGroupWithIndex(line.entry.addonProduct, groupKey, config);\n    }\n    if (grouped.length && grouped[0].typeEntry) {\n      var t = getEffectiveTypeCustomizationGroupTitle(grouped[0].typeEntry, groupKey);\n      if (t) return t;\n    }\n    if (line.entry && line.entry.addonProduct) {\n      return addonCustomizerTabLabel(line.entry.addonProduct);\n    }\n    if (String(groupKey).indexOf('handle:') === 0) {\n      return formatCustomizationGroupTitle(String(groupKey).slice(7).replace(/-/g, ' '));\n    }\n    if (String(groupKey).indexOf('title:') === 0) {\n      return formatCustomizationGroupTitle(String(groupKey).slice(6));\n    }\n    return '';\n  }\n\n  function pickMainPreviewDisplay(state, config) {\n    if (!mainUsesTypeTabs(config)) {\n      return {\n        opt: state.main.selectedOption,\n        manualText: state.main.manualText,\n        typeName: state.main.customizationType,\n        isText: !!(isManualTextInputType(state.main.customizationType) && state.main.manualText && String(state.main.manualText).trim())\n      };\n    }\n    var types = getMainCustomizerTypes(config);\n    var manualDisp = pickManualTextPreviewFromTypes(\n      types,\n      function (tid) {\n        return state.main.manualByType && state.main.manualByType[tid];\n      },\n      function (tid) {\n        return state.main.selections && state.main.selections[tid];\n      },\n      null\n    );\n    if (manualDisp) return manualDisp;\n    for (var it = 0; it < types.length; it++) {\n      var ite = types[it];\n      var itLabel = ite.typeLabel || ite.tabTitle || '';\n      if (!isInitialCustomizerType(itLabel, ite)) continue;\n      var itid = typeEntryKey(ite, it);\n      var itSel = state.main.selections && state.main.selections[itid];\n      if (itSel) return { opt: itSel, manualText: '', typeName: itLabel, isText: false };\n    }\n    for (var i = 0; i < types.length; i++) {\n      var te = types[i];\n      var tid = typeEntryKey(te, i);\n      var typeLabel = te.typeLabel || te.tabTitle || '';\n      var sel = state.main.selections && state.main.selections[tid];\n      if (sel) return { opt: sel, manualText: '', typeName: typeLabel, isText: false };\n    }\n    return { opt: null, manualText: '', typeName: state.main.customizationType, isText: false };\n  }\n\n  function pickMainTypePreview(state, config, typeIndex) {\n    var types = getMainCustomizerTypes(config);\n    var te = types[typeIndex];\n    if (!te) {\n      return { opt: null, manualText: '', typeName: '', isText: false };\n    }\n    var tid = typeEntryKey(te, typeIndex);\n    var typeLabel = te.typeLabel || te.tabTitle || '';\n    if (usesPersonalizationInput(typeLabel, te, null)) {\n      var mPers = state.main.manualByType && state.main.manualByType[tid];\n      var selPers = state.main.selections && state.main.selections[tid];\n      if (mPers && String(mPers).trim()) {\n        return { opt: selPers || null, manualText: mPers, typeName: typeLabel, isText: true };\n      }\n    }\n    if (showsNameTextInput(typeLabel, te, null)) {\n      var m = state.main.manualByType && state.main.manualByType[tid];\n      if (m && String(m).trim()) {\n        var selFontRow = state.main.selections && state.main.selections[tid];\n        return { opt: selFontRow || null, manualText: m, typeName: typeLabel, isText: true };\n      }\n    } else {\n      var sel = state.main.selections && state.main.selections[tid];\n      if (sel) return { opt: sel, manualText: '', typeName: typeLabel, isText: false };\n    }\n    return { opt: null, manualText: '', typeName: typeLabel, isText: false };\n  }\n\n  function syncAddonTabIndexForTypeId(state, config, listIndex, typeId) {\n    if (typeId == null || typeId === '') return;\n    var line = state.addonList[listIndex];\n    if (!line) return;\n    // Match editor package order (variant-filtered) so Name|Initial indices stay aligned.\n    var products = getAddonLinePackages(line, config, state, true);\n    if (!products.length) products = getAddonLineGroupedProducts(line, config);\n    for (var pi = 0; pi < products.length; pi++) {\n      var types = products[pi].types || [];\n      for (var ti = 0; ti < types.length; ti++) {\n        if (groupedAddonTypeKey(types[ti]) === String(typeId)) {\n          state.activeAddonTypeTabIndex = pi;\n          state.uiPanel = 'addon';\n          state.uiAddonListIndex = listIndex;\n          return;\n        }\n      }\n    }\n  }\n\n  function getAddonEntrySelection(entry, g) {\n    if (!entry || !entry.selections || !g) return null;\n    var tid = groupedAddonTypeKey(g);\n    if (entry.selections[tid]) return entry.selections[tid];\n    var base = typeEntryKey(g.typeEntry, g.typeIndex);\n    var parsed = parseGroupedAddonSelectionKey(tid);\n    if (parsed.productId != null) {\n      var ap = g.addonProduct;\n      if (\n        ap &&\n        ap.id != null &&\n        String(ap.id) === String(parsed.productId) &&\n        entry.selections[base]\n      ) {\n        return entry.selections[base];\n      }\n      return null;\n    }\n    if (entry.selections[base]) return entry.selections[base];\n    return null;\n  }\n\n  function getAddonEntryManualText(entry, g, apForType) {\n    if (!entry || !g) return '';\n    var tid = groupedAddonTypeKey(g);\n    var parsed = parseGroupedAddonSelectionKey(tid);\n    var base = typeEntryKey(g.typeEntry, g.typeIndex);\n    var m = '';\n    if (entry.manualByType) {\n      m = entry.manualByType[tid] || '';\n      if (!m && parsed.productId == null) m = entry.manualByType[base] || '';\n      if (\n        !m &&\n        parsed.productId != null &&\n        apForType &&\n        apForType.id != null &&\n        String(apForType.id) === String(parsed.productId)\n      ) {\n        m = entry.manualByType[base] || '';\n      }\n    }\n    if (String(m).trim()) return String(m).trim();\n    return '';\n  }\n\n  function personalizationFieldPlaceholder(maxLen, addonProduct, typeLabel, typeEntry) {\n    if (maxLen === 1 || isInitialCustomizerType(typeLabel, typeEntry)) return 'ex. M';\n    if (isNameCustomizerType(typeLabel, typeEntry) || (addonProduct && isNameAddonProduct(addonProduct))) {\n      return 'ex. Beatrice';\n    }\n    return 'ex. Abc';\n  }\n\n  function addonTypeRequiresCompletion(typeLabel, typeEntry, apForType, config, state, groupKey) {\n    if (isInitialCustomizerType(typeLabel, typeEntry)) return true;\n    var custs = customizationsForTypeEntry(typeEntry, config, state, apForType, groupKey);\n    if (showsNameTextInput(typeLabel, typeEntry, apForType)) return true;\n    if (isFontSelectionTab(typeLabel, typeEntry)) return custs.length > 0;\n    return custs.length > 0;\n  }\n\n  function addonTypeEntryComplete(entry, g, config, state, groupKey) {\n    if (!entry || !g) return true;\n    var te = g.typeEntry;\n    var apForType = g.addonProduct || entry.addonProduct;\n    var label = te.typeLabel || te.tabTitle || '';\n    if (!addonTypeRequiresCompletion(label, te, apForType, config, state, groupKey)) return true;\n    if (usesPersonalizationInput(label, te, apForType)) {\n      var pText = getAddonEntryManualText(entry, g, apForType);\n      if (!pText) return false;\n      if (isInitialCustomizerType(label, te) && !initialTagLetterFromManualText(pText)) return false;\n      return !!getAddonEntrySelection(entry, g);\n    }\n    if (showsNameTextInput(label, te, apForType)) {\n      return !!getAddonEntryManualText(entry, g, apForType);\n    }\n    return !!getAddonEntrySelection(entry, g);\n  }\n\n  /** Flat add-on product (no type tabs on package): font + text or grid selection. */\n  function addonFlatProductComplete(entry, ap, config, state) {\n    if (!entry || !ap) return true;\n    var customizations = (ap.customizer && ap.customizer.customizations) || [];\n    if (!customizations.length) return true;\n    if (typeEntryHasFontUrlOptions({ customizations: customizations })) {\n      return !!(getAddonProductFontSelection(entry, ap) && getAddonProductPersonalizationText(entry, ap));\n    }\n    if (isManualTextInputType(entry.customizationType)) {\n      return !!getAddonProductPersonalizationText(entry, ap);\n    }\n    var flatKey = addonFlatSelectionKey(ap);\n    return !!(\n      (entry.selections && entry.selections[flatKey]) ||\n      (entry.selections && entry.selections[ADDON_FLAT_TYPE_KEY])\n    );\n  }\n\n  function mainCustomizationComplete(state, config) {\n    if (isFamilyBirthFlowerBouquetProduct(config)) {\n      return getFamilyFlowerSelections(state).length > 0 && isValidProofEmail(state.proofEmail);\n    }\n    if (isFamilyBirthstoneBarProduct(config)) {\n      return getFamilyBirthstoneBarSelections(state).length > 0;\n    }\n    if (mainUsesTypeTabs(config)) {\n      var types = config.main.customizerTypes;\n      for (var i = 0; i < types.length; i++) {\n        var te = types[i];\n        var tid = typeEntryKey(te, i);\n        var label = te.typeLabel || te.tabTitle || '';\n        var custs =\n          isInitialCustomizerType(label, te) || getVariantDrivenOptionIndex(config.main, te) >= 0\n            ? customizationsForTypeEntry(te, config, state, null)\n            : te.customizations || [];\n        var isNameMain =\n          isNameCustomizerType(label, te) ||\n          isManualTextInputType(label) ||\n          showsNameTextInput(label, te, null);\n        if (!custs.length && !isInitialCustomizerType(label, te) && !isNameMain) continue;\n        if (isInitialCustomizerType(label, te) && !custs.length) return false;\n        if (usesPersonalizationInput(label, te, null)) {\n          var mMain =\n            (state.main.manualByType && state.main.manualByType[tid]) ||\n            state.main.manualText ||\n            '';\n          mMain = String(mMain).trim();\n          if (!mMain) return false;\n          if (isInitialCustomizerType(label, te) && !initialTagLetterFromManualText(mMain)) return false;\n          if (!(state.main.selections && state.main.selections[tid])) return false;\n        } else if (showsNameTextInput(label, te, null)) {\n          var m = state.main.manualByType && state.main.manualByType[tid];\n          if (!(m && String(m).trim())) return false;\n        } else if (isFontSelectionTab(label, te)) {\n          var selFontMain = state.main.selections && state.main.selections[tid];\n          if (!selFontMain) return false;\n        } else if (!showsNameTextInput(label, te, null)) {\n          var sel = state.main.selections && state.main.selections[tid];\n          if (!sel) return false;\n        }\n      }\n      return true;\n    }\n    var mainCustomizer = config.main && config.main.customizer ? config.main.customizer : null;\n    var mainHasOptions = mainCustomizer && mainCustomizer.customizations && mainCustomizer.customizations.length > 0;\n    if (mainHasOptions) {\n      if (!state.main.selectedOption && !isManualTextInputType(state.main.customizationType)) return false;\n      if (isManualTextInputType(state.main.customizationType) && !(state.main.manualText && state.main.manualText.trim())) return false;\n    }\n    return true;\n  }\n\n  function markAddonProductUserEdited(entry, addonProduct) {\n    if (!entry || !addonProduct || addonProduct.id == null) return;\n    if (!entry.userEditedProductIds) entry.userEditedProductIds = {};\n    entry.userEditedProductIds[String(addonProduct.id)] = true;\n  }\n\n  function addonProductUserEngaged(entry, addonProduct) {\n    if (!entry || !addonProduct || addonProduct.id == null) return false;\n    return !!(entry.userEditedProductIds && entry.userEditedProductIds[String(addonProduct.id)]);\n  }\n\n  /** Selection stored on this product tab only (not legacy base keys from another add-on). */\n  function addonSelectionOnProduct(entry, g) {\n    if (!entry || !g || !entry.selections) return false;\n    return !!entry.selections[groupedAddonTypeKey(g)];\n  }\n\n  /** Shoppers \"started\" a type \u2014 not auto-seeded font alone on name/initial tabs. */\n  function addonTypeHasActivity(entry, g, apForType, config, state, groupKey) {\n    if (!entry || !g) return false;\n    var te = g.typeEntry;\n    var label = te.typeLabel || te.tabTitle || '';\n    if (usesPersonalizationInput(label, te, apForType)) {\n      return !!getAddonEntryManualText(entry, g, apForType);\n    }\n    if (showsNameTextInput(label, te, apForType)) {\n      return !!getAddonEntryManualText(entry, g, apForType);\n    }\n    return addonSelectionOnProduct(entry, g) || !!getAddonEntrySelection(entry, g);\n  }\n\n  function clearConflictingGroupedSelections(entry, line, config, chosenG) {\n    if (!entry || !line || !entry.selections || !chosenG) return;\n    var groupKey = line.customizationGroupKey || ensureAddonLineGroupKey(line, config);\n    if (!groupKey) return;\n    var chosenLabel = chosenG.typeEntry.typeLabel || chosenG.typeEntry.tabTitle || '';\n    var chosenPid =\n      chosenG.addonProduct && chosenG.addonProduct.id != null ? String(chosenG.addonProduct.id) : null;\n    var types = getCustomizerTypesForGroupAcrossCatalog(config, groupKey);\n    for (var i = 0; i < types.length; i++) {\n      var g = types[i];\n      var lab = g.typeEntry.typeLabel || g.typeEntry.tabTitle || '';\n      if (!addonTypeLabelsMatch(chosenLabel, chosenG.typeEntry, lab, g.typeEntry)) continue;\n      var pid = g.addonProduct && g.addonProduct.id != null ? String(g.addonProduct.id) : null;\n      if (pid === chosenPid) continue;\n      var tid = groupedAddonTypeKey(g);\n      if (entry.selections[tid]) delete entry.selections[tid];\n      var base = typeEntryKey(g.typeEntry, g.typeIndex);\n      if (entry.selections[base]) delete entry.selections[base];\n    }\n  }\n\n  /** Name vs Initial (or name vs initial type on one product) \u2014 only one per add-on line. */\n  function personalizationModeForGroupedItem(g) {\n    if (!g) return null;\n    var te = g.typeEntry;\n    var label = te.typeLabel || te.tabTitle || '';\n    var ap = g.addonProduct || null;\n    if (isInitialCustomizerType(label, te) || isInitialAddonProduct(ap)) return 'initial';\n    if (isNameCustomizerType(label, te) || isNameAddonProduct(ap) || showsNameTextInput(label, te, ap)) {\n      return 'name';\n    }\n    if (usesPersonalizationInput(label, te, ap)) {\n      if (isInitialAddonProduct(ap)) return 'initial';\n      if (isNameAddonProduct(ap)) return 'name';\n    }\n    return null;\n  }\n\n  /** Prefer this product's custom.customizer types (Name / Initial) over title heuristics. */\n  function personalizationModeFromAddonProduct(ap) {\n    if (!ap) return null;\n    var types = ap.customizerTypes || [];\n    for (var i = 0; i < types.length; i++) {\n      var te = types[i];\n      var label = te.typeLabel || te.tabTitle || '';\n      if (isInitialCustomizerType(label, te)) return 'initial';\n      if (isNameCustomizerType(label, te)) return 'name';\n    }\n    if (isInitialAddonProduct(ap)) return 'initial';\n    if (isNameAddonProduct(ap)) return 'name';\n    return null;\n  }\n\n  function clearExclusivePersonalizationOnLine(entry, line, config, keepMode) {\n    if (!entry || !line || !keepMode) return;\n    var groupKey = line.customizationGroupKey || ensureAddonLineGroupKey(line, config);\n    if (!groupKey) return;\n    var types = getCustomizerTypesForGroupAcrossCatalog(config, groupKey);\n    for (var i = 0; i < types.length; i++) {\n      var mode = personalizationModeForGroupedItem(types[i]);\n      if (!mode || mode === keepMode) continue;\n      var tid = groupedAddonTypeKey(types[i]);\n      var base = typeEntryKey(types[i].typeEntry, types[i].typeIndex);\n      if (entry.selections) {\n        if (entry.selections[tid]) delete entry.selections[tid];\n        if (entry.selections[base]) delete entry.selections[base];\n      }\n      if (entry.manualByType) {\n        if (entry.manualByType[tid] != null) delete entry.manualByType[tid];\n        if (entry.manualByType[base] != null) delete entry.manualByType[base];\n      }\n    }\n    if (entry.selections && keepMode === 'name') {\n      var flatInitial = entry.selections[ADDON_FLAT_TYPE_KEY];\n      if (flatInitial && entry.addonProduct && isInitialAddonProduct(entry.addonProduct)) {\n        delete entry.selections[ADDON_FLAT_TYPE_KEY];\n      }\n    }\n    entry.activePersonalizationMode = keepMode;\n  }\n\n  function addonLineHasExclusiveProductTabs(line, config) {\n    return getAddonLineGroupedProducts(line, config).length > 1;\n  }\n\n  /** Product tab index for this line (not another line\u2019s uiAddonListIndex). */\n  function getActiveAddonProductTabIndex(state, line, config) {\n    var pkgs = getAddonLinePackages(line, config, state);\n    if (!pkgs.length) return 0;\n    var tix = null;\n    if (\n      state &&\n      state.uiPanel === 'addon' &&\n      state.uiAddonListIndex != null &&\n      state.addonList[state.uiAddonListIndex] === line\n    ) {\n      tix = state.activeAddonTypeTabIndex;\n    }\n    if (tix == null || isNaN(tix)) {\n      var ent = line && line.entry;\n      tix = ent && ent.lastAddonPreviewProductIndex != null ? ent.lastAddonPreviewProductIndex : 0;\n    }\n    if (tix < 0 || tix >= pkgs.length) tix = 0;\n    return tix;\n  }\n\n  function getActiveAddonPackage(line, config, state) {\n    var pkgs = getAddonLinePackages(line, config, state);\n    if (!pkgs.length) return null;\n    return pkgs[getActiveAddonProductTabIndex(state, line, config)] || pkgs[0];\n  }\n\n  /**\n   * Which product tab(s) to validate for add-to-cart readiness.\n   * Exclusive product tabs (Name | Initial): the engaged product, else the active tab.\n   * Otherwise: every package on the line (usually one product, many types).\n   */\n  function addonPackagesForLineValidation(line, config, state) {\n    var pkgs = getAddonLinePackages(line, config, state);\n    if (!pkgs.length) return [];\n    if (!addonLineHasExclusiveProductTabs(line, config)) return pkgs;\n    var entry = line.entry;\n    for (var i = 0; i < pkgs.length; i++) {\n      if (addonProductUserEngaged(entry, pkgs[i].addonProduct)) return [pkgs[i]];\n    }\n    var activePkg = getActiveAddonPackage(line, config, state);\n    return activePkg ? [activePkg] : [pkgs[0]];\n  }\n\n  function addonProductById(config, productId) {\n    if (productId == null || !config) return null;\n    var catalog = getAddons(config);\n    for (var i = 0; i < catalog.length; i++) {\n      if (catalog[i].id != null && String(catalog[i].id) === String(productId)) return catalog[i];\n    }\n    return null;\n  }\n\n  /** Switching product tabs \u2014 clear inactive catalog products (Name|Initial, Initial|Symbol|Birth Flower, etc.). */\n  function clearInactiveAddonProductsOnLine(entry, line, config, activeTabIndex, state) {\n    if (!entry || !line) return;\n    var pkgs = getAddonLinePackages(line, config, state);\n    if (pkgs.length <= 1) return;\n    var activeIdx = activeTabIndex >= 0 && activeTabIndex < pkgs.length ? activeTabIndex : 0;\n    var activePkg = pkgs[activeIdx];\n    var activeAp = activePkg && activePkg.addonProduct;\n    var activePid = activeAp && activeAp.id != null ? String(activeAp.id) : null;\n    if (!entry.selections) entry.selections = {};\n    if (!entry.manualByType) entry.manualByType = {};\n    var activeMode = personalizationModeFromAddonProduct(activeAp);\n    if (activeMode) {\n      clearExclusivePersonalizationOnLine(entry, line, config, activeMode);\n      for (var sk in entry.selections) {\n        if (!entry.selections.hasOwnProperty(sk)) continue;\n        var parsed = parseGroupedAddonSelectionKey(sk);\n        if (parsed.productId == null) continue;\n        var otherAp = addonProductById(config, parsed.productId);\n        var otherMode = personalizationModeFromAddonProduct(otherAp);\n        if (otherMode && otherMode !== activeMode) delete entry.selections[sk];\n      }\n      for (var mk in entry.manualByType) {\n        if (!entry.manualByType.hasOwnProperty(mk)) continue;\n        var parsedM = parseGroupedAddonSelectionKey(mk);\n        if (parsedM.productId == null) continue;\n        var otherApM = addonProductById(config, parsedM.productId);\n        var otherModeM = personalizationModeFromAddonProduct(otherApM);\n        if (otherModeM && otherModeM !== activeMode) delete entry.manualByType[mk];\n      }\n      if (entry.userEditedProductIds) {\n        for (var pid in entry.userEditedProductIds) {\n          if (!entry.userEditedProductIds.hasOwnProperty(pid)) continue;\n          var editedAp = addonProductById(config, pid);\n          var editedMode = personalizationModeFromAddonProduct(editedAp);\n          if (editedMode && editedMode !== activeMode) delete entry.userEditedProductIds[pid];\n        }\n      }\n      entry.activePersonalizationMode = activeMode;\n    }\n    if (activePid && addonLineHasExclusiveProductTabs(line, config)) {\n      for (var sk2 in entry.selections) {\n        if (!entry.selections.hasOwnProperty(sk2)) continue;\n        var parsed2 = parseGroupedAddonSelectionKey(sk2);\n        if (parsed2.productId != null && String(parsed2.productId) !== activePid) delete entry.selections[sk2];\n      }\n      for (var mk2 in entry.manualByType) {\n        if (!entry.manualByType.hasOwnProperty(mk2)) continue;\n        var parsedM2 = parseGroupedAddonSelectionKey(mk2);\n        if (parsedM2.productId != null && String(parsedM2.productId) !== activePid) delete entry.manualByType[mk2];\n      }\n      if (entry.userEditedProductIds) {\n        for (var pid2 in entry.userEditedProductIds) {\n          if (!entry.userEditedProductIds.hasOwnProperty(pid2)) continue;\n          if (String(pid2) !== activePid) delete entry.userEditedProductIds[pid2];\n        }\n      }\n    }\n  }\n\n  function addonFlatProductHasActivity(entry, ap) {\n    if (!entry || !ap) return false;\n    var text = getAddonProductPersonalizationText(entry, ap);\n    var custs = (ap.customizer && ap.customizer.customizations) || [];\n    if (typeEntryHasFontUrlOptions({ customizations: custs })) {\n      return !!text;\n    }\n    if (isManualTextInputType(entry.customizationType)) {\n      return !!text;\n    }\n    var flatKey = addonFlatSelectionKey(ap);\n    return !!(\n      (entry.selections && entry.selections[flatKey]) ||\n      (entry.selections && entry.selections[ADDON_FLAT_TYPE_KEY])\n    );\n  }\n\n  function addonProductHasActivity(entry, pkg, config, state, groupKey) {\n    if (!entry || !pkg) return false;\n    var ap = pkg.addonProduct;\n    var types = pkg.types || [];\n    if (!types.length) {\n      return addonFlatProductHasActivity(entry, ap);\n    }\n    for (var i = 0; i < types.length; i++) {\n      var apForType = types[i].addonProduct || ap;\n      if (addonTypeHasActivity(entry, types[i], apForType, config, state, groupKey)) return true;\n    }\n    return false;\n  }\n\n  function addonPackageComplete(entry, pkg, config, state, groupKey) {\n    if (!entry || !pkg) return false;\n    var ap = pkg.addonProduct;\n    var types = pkg.types || [];\n    if (!types.length) {\n      return addonFlatProductComplete(entry, ap, config, state);\n    }\n    var checked = false;\n    for (var ti = 0; ti < types.length; ti++) {\n      var apForType = types[ti].addonProduct || ap;\n      if (!addonTypeHasActivity(entry, types[ti], apForType, config, state, groupKey)) continue;\n      checked = true;\n      if (!addonTypeEntryComplete(entry, types[ti], config, state, groupKey)) return false;\n    }\n    return checked;\n  }\n\n  /** Name-tag vs initial-tag: at most one optional line item from those products. */\n  function skipAddonProductForExclusivePersonalization(entry, ap) {\n    if (!entry || !ap) return false;\n    var mode = entry.activePersonalizationMode;\n    if (!mode) return false;\n    var pMode = personalizationModeFromAddonProduct(ap);\n    if (!pMode) return false;\n    return pMode !== mode;\n  }\n\n  /** Products on this line the shopper actually configured (same set we add to cart). */\n  function getConfiguredAddonProductsForLine(line, config, state) {\n    if (!line || !line.entry) return [];\n    var entry = line.entry;\n    var groupKey = line.customizationGroupKey || ensureAddonLineGroupKey(line, config);\n    var pkgs = addonLineHasExclusiveProductTabs(line, config)\n      ? addonPackagesForLineValidation(line, config, state)\n      : getAddonLinePackages(line, config, state);\n    var out = [];\n    var seenPid = {};\n    for (var i = 0; i < pkgs.length; i++) {\n      var ap = pkgs[i].addonProduct;\n      if (!ap || !addonProductHasActivity(entry, pkgs[i], config, state, groupKey)) continue;\n      if (skipAddonProductForExclusivePersonalization(entry, ap)) continue;\n      if (ap.id != null) {\n        var pid = String(ap.id);\n        if (seenPid[pid]) continue;\n        seenPid[pid] = true;\n      }\n      out.push(ap);\n    }\n    return out;\n  }\n\n  /**\n   * Line is valid when every configured product tab is complete and at least one tab has data.\n   * Matches optional cart lines (configured products only).\n   */\n  function addonLineComplete(line, config, state) {\n    if (!line || !line.entry || !line.entry.addonProduct) return false;\n    var entry = line.entry;\n    var groupKey = line.customizationGroupKey || ensureAddonLineGroupKey(line, config);\n    var checkPkgs = addonPackagesForLineValidation(line, config, state);\n    if (!checkPkgs.length) return false;\n    var anyActive = false;\n    for (var pi = 0; pi < checkPkgs.length; pi++) {\n      if (!addonProductHasActivity(entry, checkPkgs[pi], config, state, groupKey)) continue;\n      anyActive = true;\n      if (!addonPackageComplete(entry, checkPkgs[pi], config, state, groupKey)) return false;\n    }\n    return anyActive;\n  }\n\n  function getSizeOptionKey(variants) {\n    if (!variants || variants.length === 0) return null;\n    var v = variants[0];\n    if (v.option1 !== undefined && v.option1 !== null && String(v.option1).trim() !== '') {\n      if (!v.option2 && !v.option3) return 'option1';\n      if (v.option2 !== undefined && v.option2 !== null && String(v.option2).trim() !== '') {\n        return 'option1';\n      }\n    }\n    return 'option1';\n  }\n\n  /**\n   * Shopify variant option name is **Size** or **Disc Size** (also Sizes / Taille).\n   * Accepts a string or { name: \"Disc Size\" } from product JSON.\n   */\n  function isSizeOptionName(name) {\n    var raw = name;\n    if (raw && typeof raw === 'object') {\n      raw = raw.name != null ? raw.name : raw.label != null ? raw.label : '';\n    }\n    var n = String(raw || '')\n      .trim()\n      .toLowerCase()\n      .replace(/\\s+/g, ' ');\n    if (!n) return false;\n    // Exact labels used on disc / tag products.\n    if (n === 'size' || n === 'disc size' || n === 'sizes' || n === 'taille') return true;\n    if (/\\bdisc\\s+size\\b/.test(n)) return true;\n    // Plain \"Size\" with optional fluff \u2014 never Font / Finish / Color.\n    if (/\\bsizes?\\b/.test(n) && !/\\bfont\\b/.test(n) && !/\\bfinish\\b/.test(n) && !/\\bcolor\\b/.test(n)) {\n      return true;\n    }\n    return false;\n  }\n\n  function hasSizeOption(addon) {\n    return getSizeOptionIndex((addon && addon.options) || []) >= 0;\n  }\n\n  function isInitialOrNameType(type) {\n    if (!type) return false;\n    var t = String(type).toLowerCase();\n    return t.indexOf('initial') !== -1 || t === 'name' || t.indexOf('initials') !== -1;\n  }\n\n  function getMainCustomizerTypes(config) {\n    if (!config || !config.main) return [];\n    if (config.main.customizerTypes && config.main.customizerTypes.length) {\n      return config.main.customizerTypes;\n    }\n    var c = config.main.customizer;\n    if (c && c.customizerTypes && c.customizerTypes.length) return c.customizerTypes;\n    return [];\n  }\n\n  /**\n   * Included add-on lines (no +$). Only when main has no customizer types \u2014 the first\n   * catalog add-on is the options grid. Included choices otherwise come from\n   * custom.customizer on the main product (type tabs), not a 2-product toggle.\n   */\n  function resolveMandatoryAddonCount(config) {\n    if (!config || isFamilyBirthFlowerBouquetProduct(config)) return 0;\n    if (isFamilyBirthstoneBarProduct(config)) return 0;\n    if (mainUsesTypeTabs(config)) return 0;\n    var catalog = getAddons(config);\n    if (!catalog.length) return 0;\n    var ap0 = catalog[0];\n    if (\n      ap0 &&\n      ((ap0.customizerTypes && ap0.customizerTypes.length) ||\n        (ap0.customizer && ap0.customizer.customizations && ap0.customizer.customizations.length))\n    ) {\n      return 1;\n    }\n    return 0;\n  }\n\n  /** Product metafield custom.max_addons \u2014 null means unlimited. */\n  function resolveMaxAddons(config) {\n    if (!config) return null;\n    var raw = config.maxAddons;\n    if (raw == null || raw === '') return null;\n    var n = typeof raw === 'number' ? raw : parseInt(String(raw).trim(), 10);\n    if (isNaN(n) || n < 0) return null;\n    return n;\n  }\n\n  /** Whether the shopper can still add another optional (+) addon line. */\n  function canAddMoreAddonLines(state, config) {\n    var max = resolveMaxAddons(config || (state && state.config));\n    if (max == null) return true;\n    var count = state && state.addonList ? state.addonList.length : 0;\n    return count < max;\n  }\n\n  /** Seed the empty-main included add-on line when needed. */\n  function ensureMandatoryAddonLines(state, config) {\n    if (!state || !config) return;\n    if (isFamilyBirthFlowerBouquetProduct(config)) {\n      state.mandatoryCount = 0;\n      state.addonList = [];\n      return;\n    }\n    if (isFamilyBirthstoneBarProduct(config)) {\n      state.mandatoryCount = 0;\n      state.addonList = [];\n      return;\n    }\n    var need = resolveMandatoryAddonCount(config);\n    state.mandatoryCount = need;\n    if (!need) return;\n    var groups = collectAddonCustomizationGroups(config);\n    while (state.addonList.length < need) {\n      var i = state.addonList.length;\n      if (groups.length && groups[i]) {\n        state.addAddonLine(groups[i].key, null, groups[i].catalogIndex);\n      } else {\n        state.addAddonLine(null, null, i);\n      }\n    }\n  }\n\n  /** Name-tag product titles/handles \u2014 not initial-tag rectangle letter picks. */\n  function labelMatchesNameTag(label) {\n    if (!label) return false;\n    var t = String(label).toLowerCase().trim();\n    if (t.indexOf('name tag') !== -1 || t.indexOf('nametag') !== -1 || t.indexOf('name-tag') !== -1) {\n      return true;\n    }\n    return t.indexOf('name') !== -1 && t.indexOf('tag') !== -1;\n  }\n\n  /** Initial Tag tab / product \u2014 used for shape + Name\u2194Initial exclusivity only. */\n  function labelMatchesInitialTag(label) {\n    if (!label || labelMatchesNameTag(label)) return false;\n    var t = String(label).toLowerCase().trim();\n    if (t.indexOf('initial') !== -1 && t.indexOf('tag') !== -1) return true;\n    if (t.indexOf('rectangle') !== -1 && t.indexOf('tag') !== -1) return true;\n    return false;\n  }\n\n  function isInitialTagType(typeLabel, typeEntry) {\n    if (labelMatchesInitialTag(typeLabel)) return true;\n    if (typeEntry && labelMatchesInitialTag(typeEntry.tabTitle)) return true;\n    if (typeEntry && typeEntry.typeLabel && typeEntry.typeLabel !== typeLabel) {\n      if (labelMatchesInitialTag(typeEntry.typeLabel)) return true;\n    }\n    return false;\n  }\n\n  /** Any Initial customizer tab (disc charm, Initial Tag, main) \u2014 not Name / name-tag. */\n  function labelMatchesInitialCustomizer(label) {\n    if (!label || labelMatchesNameTag(label)) return false;\n    var t = String(label).toLowerCase().trim();\n    if (t === 'name') return false;\n    if (t.indexOf('initial') !== -1 || t === 'initials') return true;\n    // Rectangle / Initial Tag product type labels \u2014 same Initial path as disc\n    if (labelMatchesInitialTag(label)) return true;\n    return false;\n  }\n\n  function isInitialCustomizerType(typeLabel, typeEntry) {\n    if (labelMatchesInitialCustomizer(typeLabel)) return true;\n    if (typeEntry && labelMatchesInitialCustomizer(typeEntry.tabTitle)) return true;\n    if (typeEntry && typeEntry.typeLabel && labelMatchesInitialCustomizer(typeEntry.typeLabel)) return true;\n    return false;\n  }\n\n  function typeEntryOptionCount(typeEntry) {\n    return typeEntry && typeEntry.customizations ? typeEntry.customizations.length : 0;\n  }\n\n  /** Resolve the add-on variant currently in play for this line (size / variantId). */\n  function resolveAddonVariantRecord(entry, addonProduct, config, state) {\n    if (!entry || !addonProduct) return null;\n    var variant = resolveAddonProductVariantForLine(entry, addonProduct, config, state);\n    if (!variant && entry.variantId != null) {\n      variant = findVariantById(addonProduct, entry.variantId);\n    }\n    if (!variant) {\n      var sizeLabel = resolveLineSizeLabelForAddonProduct(entry, addonProduct);\n      if (sizeLabel && hasSizeOption(addonProduct)) {\n        variant = findVariantForPickerSize(addonProduct, config, state, sizeLabel);\n      }\n    }\n    return variant || null;\n  }\n\n  /** Letter/font tiles from a product or variant custom.customizer payload. */\n  function getInitialLetterCustomizationsFromSource(source, config, state, fallbackTabLabel) {\n    if (!source) return [];\n    if (source.customizerTypes) {\n      for (var i = 0; i < source.customizerTypes.length; i++) {\n        var ownTe = source.customizerTypes[i];\n        var lab = ownTe.typeLabel || ownTe.tabTitle || '';\n        if (!isInitialCustomizerType(lab, ownTe)) continue;\n        if (typeEntryOptionCount(ownTe) > 0) {\n          return getFilteredCustomizationsForTypeEntry(ownTe, config, state);\n        }\n      }\n    }\n    if (source.customizer && source.customizer.customizations && source.customizer.customizations.length) {\n      return getFilteredCustomizationsForTypeEntry(\n        {\n          customizations: source.customizer.customizations,\n          typeLabel: source.customizer.type || '',\n          tabTitle: fallbackTabLabel || ''\n        },\n        config,\n        state\n      );\n    }\n    return [];\n  }\n\n  /**\n   * Letter catalog from the Initial type metaobject (disc path) \u2014 not Initial Tag stubs.\n   * Used when an Initial Tag type has no nested customizations of its own.\n   */\n  function findSharedInitialLetterCustomizations(config, state) {\n    var best = [];\n    function considerTypes(types) {\n      if (!types || !types.length) return;\n      for (var i = 0; i < types.length; i++) {\n        var te = types[i];\n        var lab = te.typeLabel || te.tabTitle || '';\n        if (labelMatchesInitialTag(lab)) continue;\n        if (!isInitialCustomizerType(lab, te)) continue;\n        var custs = getFilteredCustomizationsForTypeEntry(te, config, state) || [];\n        if (custs.length > best.length) best = custs;\n      }\n    }\n    if (config && config.main) {\n      considerTypes(getMainCustomizerTypes(config));\n      if (config.main.customizer && config.main.customizer.customizerTypes) {\n        considerTypes(config.main.customizer.customizerTypes);\n      }\n    }\n    var addons = getAddons(config) || [];\n    for (var a = 0; a < addons.length; a++) {\n      var ap = addons[a];\n      if (!ap) continue;\n      considerTypes(ap.customizerTypes);\n      var variants = ap.variants || [];\n      for (var v = 0; v < variants.length; v++) {\n        considerTypes(variants[v].customizerTypes);\n      }\n    }\n    return best;\n  }\n\n  /**\n   * Font rows from the Name type metaobject \u2014 Name Tag reuses these (no fonts of its own).\n   */\n  function findSharedNameFontCustomizations(config, state) {\n    var best = [];\n    var bestFontCount = 0;\n    function fontUrlCount(custs) {\n      var n = 0;\n      if (!custs) return 0;\n      for (var i = 0; i < custs.length; i++) {\n        if (customizationHasFontUrl(custs[i])) n++;\n      }\n      return n;\n    }\n    function isStrictNameType(lab, te) {\n      if (labelMatchesNameTag(lab)) return false;\n      if (isInitialCustomizerType(lab, te)) return false;\n      var t = String(lab || '')\n        .toLowerCase()\n        .trim();\n      if (t === 'name') return true;\n      // e.g. Name Disc \u2014 name without tag / initial\n      if (t.indexOf('name') !== -1 && t.indexOf('tag') === -1 && t.indexOf('initial') === -1) {\n        return typeEntryHasFontUrlOptions(te);\n      }\n      return false;\n    }\n    function considerTypes(types) {\n      if (!types || !types.length) return;\n      for (var i = 0; i < types.length; i++) {\n        var te = types[i];\n        var lab = te.typeLabel || te.tabTitle || '';\n        if (!isStrictNameType(lab, te)) continue;\n        var custs = getFilteredCustomizationsForTypeEntry(te, config, state) || [];\n        var fc = fontUrlCount(custs);\n        if (!fc && !custs.length) continue;\n        if (fc > bestFontCount || (fc === bestFontCount && custs.length > best.length)) {\n          best = custs;\n          bestFontCount = fc;\n        }\n      }\n    }\n    if (config && config.main) {\n      considerTypes(getMainCustomizerTypes(config));\n      if (config.main.customizer && config.main.customizer.customizerTypes) {\n        considerTypes(config.main.customizer.customizerTypes);\n      }\n    }\n    var addons = getAddons(config) || [];\n    for (var a = 0; a < addons.length; a++) {\n      var ap = addons[a];\n      if (!ap) continue;\n      considerTypes(ap.customizerTypes);\n      var variants = ap.variants || [];\n      for (var v = 0; v < variants.length; v++) {\n        considerTypes(variants[v].customizerTypes);\n      }\n    }\n    return best;\n  }\n\n  /**\n   * Letter/font tiles for Initial \u2014 variant custom.customizer first when set,\n   * then product custom.customizer, then the shared Initial type catalog\n   * (Initial Tag metaobject has no letters of its own \u2014 they live on Initial).\n   */\n  function getInitialLetterCustomizations(config, state, addonProduct) {\n    if (!addonProduct) {\n      return findSharedInitialLetterCustomizations(config, state);\n    }\n    var entry = findAddonEntryForProduct(state, addonProduct);\n    if (entry) {\n      var variant = resolveAddonVariantRecord(entry, addonProduct, config, state);\n      var fromVariant = getInitialLetterCustomizationsFromSource(\n        variant,\n        config,\n        state,\n        addonCustomizerTabLabel(addonProduct)\n      );\n      if (fromVariant.length) return fromVariant;\n      // Variant customizer_options may list letters when custom.customizer is empty.\n      var variantOpts = getAddonVariantCustomizerOptions(entry, addonProduct, config, state);\n      if (variantOpts && variantOpts.length) {\n        var fromOpts = customizationsFromVariantOptionRefs(\n          variantOpts,\n          { typeLabel: 'Initial', tabTitle: 'Initial' },\n          config\n        );\n        if (fromOpts.length) return fromOpts;\n      }\n    }\n    var fromProduct = getInitialLetterCustomizationsFromSource(\n      addonProduct,\n      config,\n      state,\n      addonCustomizerTabLabel(addonProduct)\n    );\n    if (fromProduct.length) return fromProduct;\n    return findSharedInitialLetterCustomizations(config, state);\n  }\n\n  /** Find the line entry currently using this add-on product (for variant-scoped letter catalogs). */\n  function findAddonEntryForProduct(state, addonProduct) {\n    if (!state || !state.addonList || !addonProduct) return null;\n    if (state.uiPanel === 'addon' && state.uiAddonListIndex != null) {\n      var activeLine = state.addonList[state.uiAddonListIndex];\n      if (activeLine && activeLine.entry) return activeLine.entry;\n    }\n    for (var i = 0; i < state.addonList.length; i++) {\n      var line = state.addonList[i];\n      if (!line || !line.entry || !line.entry.addonProduct) continue;\n      if (String(line.entry.addonProduct.id) === String(addonProduct.id)) return line.entry;\n    }\n    return null;\n  }\n\n  /**\n   * Letter tiles for Initial preview \u2014 product catalog first (Font N X rows), then shared Initial.\n   */\n  function initialLetterCustomizationsForPreview(config, state, addonProduct, typeEntry, groupKey) {\n    if (addonProduct) {\n      var own = getInitialLetterCustomizations(config, state, addonProduct) || [];\n      if (own.length && initialCustomizationsHaveImages(own)) return own;\n    }\n    if (typeEntry) {\n      var fromType = customizationsForTypeEntry(typeEntry, config, state, addonProduct, groupKey) || [];\n      if (fromType.length && initialCustomizationsHaveImages(fromType)) return fromType;\n    }\n    var shared = findSharedInitialLetterCustomizations(config, state);\n    if (shared.length) return shared;\n    if (addonProduct) return allAddonCustomizationOptions(addonProduct) || [];\n    return [];\n  }\n\n  /** Resolve an option id/name on this product's catalog, then any catalog product with that letter. */\n  function findLetterCatalogOption(config, addonProduct, optionId, optionName) {\n    function searchProduct(ap) {\n      if (!ap) return null;\n      if (ap.customizerTypes && ap.customizerTypes.length) {\n        for (var ti = 0; ti < ap.customizerTypes.length; ti++) {\n          var custs = ap.customizerTypes[ti].customizations || [];\n          if (optionId != null && String(optionId).trim() !== '') {\n            var wantId = String(optionId);\n            for (var ci = 0; ci < custs.length; ci++) {\n              if (String(custs[ci].id) === wantId) return custs[ci];\n            }\n          }\n          if (optionName != null && String(optionName).trim() !== '') {\n            var wantName = String(optionName).trim();\n            for (var cj = 0; cj < custs.length; cj++) {\n              if (String(custs[cj].name).trim() === wantName) return custs[cj];\n            }\n          }\n        }\n      }\n      if (ap.customizer && ap.customizer.customizations) {\n        var flat = ap.customizer.customizations;\n        if (optionId != null && String(optionId).trim() !== '') {\n          var wantId2 = String(optionId);\n          for (var fi = 0; fi < flat.length; fi++) {\n            if (String(flat[fi].id) === wantId2) return flat[fi];\n          }\n        }\n        if (optionName != null && String(optionName).trim() !== '') {\n          var wantName2 = String(optionName).trim();\n          for (var fj = 0; fj < flat.length; fj++) {\n            if (String(flat[fj].name).trim() === wantName2) return flat[fj];\n          }\n        }\n      }\n      return null;\n    }\n    var found = searchProduct(addonProduct);\n    if (found) return found;\n    if (!config) return null;\n    var catalog = getAddons(config) || [];\n    for (var pi = 0; pi < catalog.length; pi++) {\n      if (addonProduct && catalog[pi] && String(catalog[pi].id) === String(addonProduct.id)) continue;\n      found = searchProduct(catalog[pi]);\n      if (found) return found;\n    }\n    return null;\n  }\n\n  function addonTypeLabelsMatch(wantLabel, wantEntry, gotLabel, gotEntry) {\n    if (wantLabel && gotLabel && String(wantLabel).trim().toLowerCase() === String(gotLabel).trim().toLowerCase()) {\n      return true;\n    }\n    if (isBirthFlowerType(wantLabel, wantEntry) && isBirthFlowerType(gotLabel, gotEntry)) return true;\n    if (isSymbolType(wantLabel) && isSymbolType(gotLabel)) return true;\n    return false;\n  }\n\n  /**\n   * Options for a type tab.\n   * Initials = this product's Font N X letter PNGs (never Name fontUrl rows).\n   * Only fall back to the shared Initial (disc) letter catalog when this product has none.\n   * Name Tag = shared Name fontUrl rows (Name Tag has no fonts of its own).\n   */\n  function customizationsForTypeEntry(typeEntry, config, state, addonProduct, groupKey) {\n    if (!typeEntry) return [];\n    var variantDriven = variantDrivenCustomizationsForTypeEntry(typeEntry, config, state, addonProduct);\n    if (variantDriven) return applyCustomizationListFilters(variantDriven, typeEntry, config, state, addonProduct, groupKey);\n    var list = getFilteredCustomizationsForTypeEntry(typeEntry, config, state) || [];\n    var lab = typeEntry.typeLabel || typeEntry.tabTitle || '';\n    if (labelMatchesNameTag(lab)) {\n      var nameFonts = findSharedNameFontCustomizations(config, state);\n      if (nameFonts.length) {\n        return applyCustomizationListFilters(\n          nameFonts,\n          typeEntry,\n          config,\n          state,\n          addonProduct,\n          groupKey\n        );\n      }\n    }\n    if (!isInitialCustomizerType(lab, typeEntry)) {\n      return applyCustomizationListFilters(list, typeEntry, config, state, addonProduct, groupKey);\n    }\n    if (list.length && initialCustomizationsHaveImages(list)) {\n      return applyCustomizationListFilters(list, typeEntry, config, state, addonProduct, groupKey);\n    }\n    if (addonProduct) {\n      var fromAp = getInitialLetterCustomizations(config, state, addonProduct);\n      if (fromAp.length && initialCustomizationsHaveImages(fromAp)) {\n        return applyCustomizationListFilters(fromAp, typeEntry, config, state, addonProduct, groupKey);\n      }\n    }\n    var shared = findSharedInitialLetterCustomizations(config, state);\n    if (shared.length && initialCustomizationsHaveImages(shared)) {\n      return applyCustomizationListFilters(shared, typeEntry, config, state, addonProduct, groupKey);\n    }\n    return applyCustomizationListFilters(list, typeEntry, config, state, addonProduct, groupKey);\n  }\n\n  function findAddonCatalogOptionInGroup(config, groupKey, optionId, optionName, typeId) {\n    if (!config || !groupKey) return null;\n    var products = getAddonProductsForGroup(config, groupKey);\n    var lookingForInitialLetter =\n      optionName != null && /^Font\\s*\\d+\\s+[A-Za-z]\\b/i.test(String(optionName).trim());\n    for (var pi = 0; pi < products.length; pi++) {\n      var ap = products[pi].addonProduct;\n      if (!ap) continue;\n      // Name fonts and Initial letter PNGs share groups \u2014 never cross-resolve.\n      if (lookingForInitialLetter && isNameAddonProduct(ap)) continue;\n      if (!lookingForInitialLetter && isInitialAddonProduct(ap) && isNameTagOptionName(optionName)) {\n        continue;\n      }\n      if (optionId != null && String(optionId).trim() !== '') {\n        var byId = findAddonCatalogOption(ap, optionId, typeId);\n        if (byId) return byId;\n      }\n      if (optionName != null && String(optionName).trim() !== '') {\n        var byName = findAddonCatalogOptionByName(ap, optionName, typeId);\n        if (byName) return byName;\n      }\n    }\n    return null;\n  }\n\n  /** Name-tag font rows (Baskerville, \u2026) \u2014 not Initial \"Font N X\" letter stamps. */\n  function isNameTagOptionName(name) {\n    if (name == null || String(name).trim() === '') return false;\n    if (/^Font\\s*\\d+\\s+[A-Za-z]\\b/i.test(String(name).trim())) return false;\n    return true;\n  }\n\n  var ADDON_FLAT_TYPE_KEY = 'customization';\n\n  /** Flat add-ons: scope by product id when a line can hold more than one catalog product. */\n  function addonFlatSelectionKey(addonProduct) {\n    if (addonProduct && addonProduct.id != null) {\n      return String(addonProduct.id) + ':' + ADDON_FLAT_TYPE_KEY;\n    }\n    return ADDON_FLAT_TYPE_KEY;\n  }\n\n  function addonLineEntryHasStoredChoices(entry) {\n    if (!entry) return false;\n    if (entry.manualByType) {\n      for (var mk in entry.manualByType) {\n        if (!entry.manualByType.hasOwnProperty(mk)) continue;\n        if (String(entry.manualByType[mk]).trim()) return true;\n      }\n    }\n    if (entry.selections) {\n      for (var sk in entry.selections) {\n        if (!entry.selections.hasOwnProperty(sk)) continue;\n        if (entry.selections[sk]) return true;\n      }\n    }\n    return false;\n  }\n\n  function cloneStoredOption(opt) {\n    if (!opt || typeof opt !== 'object') return opt || null;\n    var copy = {};\n    for (var ck in opt) {\n      if (opt.hasOwnProperty(ck)) copy[ck] = opt[ck];\n    }\n    return copy;\n  }\n\n  function cloneSelectionsMap(map) {\n    if (!map) return {};\n    var out = {};\n    for (var sk in map) {\n      if (!map.hasOwnProperty(sk)) continue;\n      out[sk] = cloneStoredOption(map[sk]);\n    }\n    return out;\n  }\n\n  function snapshotAddonLineEntry(entry) {\n    if (!entry) return null;\n    return {\n      addonProduct: entry.addonProduct,\n      variantId: entry.variantId,\n      variantPrice: entry.variantPrice,\n      sizeLabel: entry.sizeLabel,\n      customizationType: entry.customizationType,\n      selections: cloneSelectionsMap(entry.selections),\n      manualByType: entry.manualByType ? Object.assign({}, entry.manualByType) : {},\n      mandatory: entry.mandatory,\n      lastAddonPreviewProductIndex: entry.lastAddonPreviewProductIndex,\n      pickedSmallerSize: !!entry.pickedSmallerSize,\n      userEditedProductIds: entry.userEditedProductIds ? Object.assign({}, entry.userEditedProductIds) : {},\n      activePersonalizationMode: entry.activePersonalizationMode || null\n    };\n  }\n\n  function restoreAddonLineEntry(entry, snap) {\n    if (!entry || !snap) return;\n    entry.variantId = snap.variantId;\n    entry.variantPrice = snap.variantPrice;\n    entry.sizeLabel = snap.sizeLabel;\n    entry.customizationType = snap.customizationType;\n    entry.selections = cloneSelectionsMap(snap.selections);\n    entry.manualByType = snap.manualByType ? Object.assign({}, snap.manualByType) : {};\n    entry.mandatory = snap.mandatory;\n    entry.lastAddonPreviewProductIndex = snap.lastAddonPreviewProductIndex;\n    entry.pickedSmallerSize = !!snap.pickedSmallerSize;\n    entry.userEditedProductIds = snap.userEditedProductIds ? Object.assign({}, snap.userEditedProductIds) : {};\n    entry.activePersonalizationMode = snap.activePersonalizationMode || null;\n  }\n\n  function typeEntryKey(typeEntry, index) {\n    if (typeEntry && typeEntry.id != null && String(typeEntry.id).trim() !== '') {\n      return String(typeEntry.id);\n    }\n    return 'type-' + String(index);\n  }\n\n  function optionMatchesSelection(option, selectedOpt) {\n    if (!option || !selectedOpt) return false;\n    var oid = option.id;\n    var sid = selectedOpt.id;\n    if (\n      oid != null &&\n      sid != null &&\n      String(oid).trim() !== '' &&\n      String(sid).trim() !== '' &&\n      String(oid) === String(sid)\n    ) {\n      return true;\n    }\n    var on = option.name != null ? String(option.name).trim() : '';\n    var sn = selectedOpt.name != null ? String(selectedOpt.name).trim() : '';\n    return !!(on && sn && on === sn);\n  }\n\n  function allAddonCustomizationOptions(addonProduct) {\n    var out = [];\n    if (!addonProduct) return out;\n    var types = addonProduct.customizerTypes;\n    if (types && types.length) {\n      for (var i = 0; i < types.length; i++) {\n        var custs = types[i].customizations || [];\n        for (var c = 0; c < custs.length; c++) out.push(custs[c]);\n      }\n      return out;\n    }\n    var flat =\n      addonProduct.customizer && addonProduct.customizer.customizations\n        ? addonProduct.customizer.customizations\n        : [];\n    return flat.slice();\n  }\n\n  function customizationHasFontUrl(c) {\n    return c && c.fontUrl != null && String(c.fontUrl).trim() !== '';\n  }\n\n  /** Resolve a grid click to the full option object from embedded addon JSON (stable id + fontUrl). */\n  function findAddonCatalogOption(addonProduct, optionId, typeId) {\n    if (!addonProduct || optionId == null || String(optionId).trim() === '') return null;\n    var wantId = String(optionId);\n    var types = addonProduct.customizerTypes;\n    if (types && types.length) {\n      for (var i = 0; i < types.length; i++) {\n        var te = types[i];\n        if (typeId != null && String(typeId).trim() !== '' && !selectionKeyMatchesTypeEntry(typeId, te, i, addonProduct)) continue;\n        var custs = te.customizations || [];\n        for (var c = 0; c < custs.length; c++) {\n          if (String(custs[c].id) === wantId) return custs[c];\n        }\n      }\n    }\n    var flat =\n      addonProduct.customizer && addonProduct.customizer.customizations\n        ? addonProduct.customizer.customizations\n        : [];\n    for (var f = 0; f < flat.length; f++) {\n      if (String(flat[f].id) === wantId) return flat[f];\n    }\n    return null;\n  }\n\n  function findAddonCatalogOptionByName(addonProduct, optionName, typeId) {\n    if (!addonProduct || optionName == null || String(optionName).trim() === '') return null;\n    var wantName = String(optionName).trim();\n    var types = addonProduct.customizerTypes;\n    if (types && types.length) {\n      for (var i = 0; i < types.length; i++) {\n        var te = types[i];\n        if (typeId != null && String(typeId).trim() !== '' && !selectionKeyMatchesTypeEntry(typeId, te, i, addonProduct)) continue;\n        var custs = te.customizations || [];\n        for (var c = 0; c < custs.length; c++) {\n          if (String(custs[c].name).trim() === wantName) return custs[c];\n        }\n      }\n    }\n    var flat =\n      addonProduct.customizer && addonProduct.customizer.customizations\n        ? addonProduct.customizer.customizations\n        : [];\n    for (var f = 0; f < flat.length; f++) {\n      if (String(flat[f].name).trim() === wantName) return flat[f];\n    }\n    return null;\n  }\n\n  /** fontUrl from this metaobject entry, or the matching font-style row in the same catalog group. */\n  function fontUrlFromAddonCatalogEntry(option, addonProduct) {\n    if (!option || !addonProduct) return '';\n    if (customizationHasFontUrl(option)) return String(option.fontUrl).trim();\n    var byId = findAddonCatalogOption(addonProduct, option.id, null);\n    if (customizationHasFontUrl(byId)) return String(byId.fontUrl).trim();\n    var byName = findAddonCatalogOptionByName(addonProduct, option.name, null);\n    if (customizationHasFontUrl(byName)) return String(byName.fontUrl).trim();\n    var group = parseInitialOptionFontGroup(option.name);\n    if (!group) return '';\n    var all = allAddonCustomizationOptions(addonProduct);\n    for (var i = 0; i < all.length; i++) {\n      if (parseInitialOptionFontGroup(all[i].name) !== group) continue;\n      if (customizationHasFontUrl(all[i])) return String(all[i].fontUrl).trim();\n    }\n    return '';\n  }\n\n  function resolveAddonOptionForPreview(option, addonProduct, typeId, config, groupKey) {\n    if (!option || !addonProduct) return null;\n    var isInitialLetterRow =\n      isInitialTagAddonProduct(addonProduct) ||\n      (option.name != null && /^Font\\s*\\d+\\s+[A-Za-z]\\b/i.test(String(option.name).trim()));\n    // Keep letter PNGs we already resolved \u2014 Name stubs in the Tag group must never wipe them.\n    var keptImage = letterOptionHasImage(option) ? option.image : null;\n    var keptFontUrl =\n      !isInitialLetterRow && customizationHasFontUrl(option) ? option.fontUrl : null;\n    var catalog =\n      findAddonCatalogOption(addonProduct, option.id, typeId) ||\n      findAddonCatalogOption(addonProduct, option.id, null) ||\n      findAddonCatalogOptionByName(addonProduct, option.name, typeId) ||\n      findAddonCatalogOptionByName(addonProduct, option.name, null);\n    if (!catalog && config && groupKey) {\n      catalog = findAddonCatalogOptionInGroup(config, groupKey, option.id, option.name, typeId);\n    }\n    if (!catalog && config && isInitialLetterRow) {\n      catalog = findLetterCatalogOption(config, addonProduct, option.id, option.name);\n    }\n    var merged = Object.assign({}, option, catalog || {});\n    if (keptImage) merged.image = keptImage;\n    // Initials are letter PNGs only \u2014 never attach Name fontUrl.\n    if (isInitialLetterRow) {\n      if (merged.fontUrl) delete merged.fontUrl;\n      if (keptImage) merged.image = keptImage;\n      else if (!letterOptionHasImage(merged) && catalog && letterOptionHasImage(catalog)) {\n        merged.image = catalog.image;\n      }\n      return merged;\n    }\n    if (keptFontUrl) merged.fontUrl = keptFontUrl;\n    else if (!customizationHasFontUrl(merged) && customizationHasFontUrl(option)) merged.fontUrl = option.fontUrl;\n    var fu = fontUrlFromAddonCatalogEntry(merged, addonProduct);\n    if (fu && !keptFontUrl) merged.fontUrl = fu;\n    if (config) {\n      var letterRow = findLetterCatalogOption(config, addonProduct, merged.id, merged.name);\n      if (!customizationHasFontUrl(merged) && letterRow && customizationHasFontUrl(letterRow)) merged.fontUrl = letterRow.fontUrl;\n      if (!letterOptionHasImage(merged) && letterRow && letterOptionHasImage(letterRow)) merged.image = letterRow.image;\n    }\n    return merged;\n  }\n\n  function isManualTextInputType(type) {\n    if (!type) return false;\n    var t = String(type).toLowerCase().trim();\n    if (t === 'name') return true;\n    if (t.indexOf('name tag') !== -1 || t.indexOf('nametag') !== -1) return true;\n    if (t.indexOf('name') !== -1 && t.indexOf('tag') !== -1) return true;\n    return false;\n  }\n\n  /** Metafield type is Name (works on Tag or Disc products). */\n  function isNameCustomizerType(typeLabel, typeEntry) {\n    if (isManualTextInputType(typeLabel)) return true;\n    if (typeEntry && isManualTextInputType(typeEntry.tabTitle)) return true;\n    if (typeEntry && typeEntry.typeLabel && isManualTextInputType(typeEntry.typeLabel)) return true;\n    return false;\n  }\n\n  function isNameTagAddonProduct(addonProduct) {\n    if (!addonProduct) return false;\n    var title = String(addonProduct.title || '').toLowerCase();\n    var handle = String(addonProduct.handle || '').toLowerCase();\n    return (\n      title.indexOf('name tag') !== -1 ||\n      title.indexOf('nametag') !== -1 ||\n      handle.indexOf('name-tag') !== -1 ||\n      handle.indexOf('nametag') !== -1\n    );\n  }\n\n  /** Product carries a Name customizer type \u2014 Tag bar or Disc. */\n  function isNameAddonProduct(addonProduct) {\n    if (!addonProduct) return false;\n    if (isNameTagAddonProduct(addonProduct)) return true;\n    var types = addonProduct.customizerTypes;\n    if (types && types.length) {\n      for (var ni = 0; ni < types.length; ni++) {\n        var nte = types[ni];\n        if (isNameCustomizerType(nte.typeLabel || nte.tabTitle || '', nte)) return true;\n      }\n    }\n    var title = String(addonProduct.title || '').toLowerCase();\n    var handle = String(addonProduct.handle || '').toLowerCase();\n    if (/\\bname\\b/.test(title) || handle.indexOf('name') !== -1) {\n      if (isInitialTagAddonProduct(addonProduct)) return false;\n      if (/\\binitial\\b/.test(title) || handle.indexOf('initial') !== -1) return false;\n      return true;\n    }\n    return false;\n  }\n\n  function isInitialTagAddonProduct(addonProduct) {\n    if (!addonProduct) return false;\n    if (labelMatchesInitialTag(addonCustomizerTabLabel(addonProduct))) return true;\n    if (labelMatchesInitialTag(addonProduct.title)) return true;\n    if (addonProduct.handle && labelMatchesInitialTag(String(addonProduct.handle))) return true;\n    var types = addonProduct.customizerTypes;\n    if (types && types.length) {\n      for (var iti = 0; iti < types.length; iti++) {\n        var ite = types[iti];\n        if (isInitialTagType(ite.typeLabel || ite.tabTitle || '', ite)) return true;\n      }\n    }\n    return false;\n  }\n\n  /** Product carries an Initial / Initial Tag customizer type \u2014 Tag bar or Disc. */\n  function isInitialAddonProduct(addonProduct) {\n    if (!addonProduct) return false;\n    if (isInitialTagAddonProduct(addonProduct)) return true;\n    var types = addonProduct.customizerTypes;\n    if (types && types.length) {\n      for (var ii = 0; ii < types.length; ii++) {\n        var ite = types[ii];\n        if (isInitialCustomizerType(ite.typeLabel || ite.tabTitle || '', ite)) return true;\n      }\n    }\n    return false;\n  }\n\n  /** Disc/Tag from Charm (etc.) option values on variants \u2014 not from group-type. */\n  function addonProductPhysicalShapeKindFromVariants(addonProduct) {\n    var variants = addonProduct && addonProduct.variants;\n    if (!variants || !variants.length) return null;\n    var sawDisc = false;\n    var sawTag = false;\n    for (var vi = 0; vi < variants.length; vi++) {\n      var v = variants[vi];\n      if (!v) continue;\n      var vals = [v.option1, v.option2, v.option3, v.title];\n      for (var i = 0; i < vals.length; i++) {\n        var kind = shapeKindFromVariantShapeLabel(vals[i]);\n        if (kind === 'disc') sawDisc = true;\n        if (kind === 'tag') sawTag = true;\n      }\n    }\n    if (sawDisc && !sawTag) return 'disc';\n    if (sawTag && !sawDisc) return 'tag';\n    return null;\n  }\n\n  /**\n   * Physical form from the Shopify product (title / handle / options / variants) \u2014 not group-type.\n   * group-type may list Disc+Tag on a shared Name type; each SKU still has one silhouette.\n   */\n  function addonProductPhysicalShapeKind(addonProduct) {\n    if (!addonProduct) return null;\n    var title = String(addonProduct.title || '').toLowerCase();\n    var handle = String(addonProduct.handle || '').toLowerCase();\n    if (title.indexOf('disc') !== -1 || handle.indexOf('disc') !== -1) return 'disc';\n    var opts = addonProduct.options || [];\n    for (var oi = 0; oi < opts.length; oi++) {\n      if (String(opts[oi] || '').toLowerCase().indexOf('disc') !== -1) return 'disc';\n    }\n    var fromVariants = addonProductPhysicalShapeKindFromVariants(addonProduct);\n    if (fromVariants === 'disc') return 'disc';\n    if (isNameTagAddonProduct(addonProduct) || isInitialTagAddonProduct(addonProduct)) return 'tag';\n    if (\n      (title.indexOf('tag') !== -1 || handle.indexOf('tag') !== -1) &&\n      title.indexOf('disc') === -1\n    ) {\n      return 'tag';\n    }\n    if (fromVariants === 'tag') return 'tag';\n    if (title.indexOf('birthstone') !== -1 || handle.indexOf('birthstone') !== -1) {\n      return 'birthstone';\n    }\n    return null;\n  }\n\n  function customizationGroupKeyShapeKind(groupKey, config) {\n    if (!groupKey) return null;\n    var s = String(groupKey);\n    if (s.indexOf('handle:') === 0) {\n      return shapeKindFromCustomizationGroupTitle(s.slice(7));\n    }\n    if (s.indexOf('title:') === 0) {\n      return shapeKindFromCustomizationGroupTitle(s.slice(6));\n    }\n    if (s.indexOf('id:') === 0 && config) {\n      var catalog = getAddons(config);\n      for (var pi = 0; pi < catalog.length; pi++) {\n        var types = catalog[pi].customizerTypes || [];\n        for (var ti = 0; ti < types.length; ti++) {\n          var entries = getTypeCustomizationGroupEntries(types[ti]);\n          for (var ei = 0; ei < entries.length; ei++) {\n            if (entries[ei].key !== groupKey) continue;\n            return (\n              shapeKindFromCustomizationGroupTitle(entries[ei].handle) ||\n              shapeKindFromCustomizationGroupTitle(entries[ei].title)\n            );\n          }\n        }\n      }\n    }\n    return shapeKindFromCustomizationGroupTitle(s);\n  }\n\n  /**\n   * Round disc silhouette from the product itself (title / Disc Size) \u2014 never from group-type\n   * (a Name type may list Disc+Tag while this SKU is still a tag bar).\n   */\n  function isDiscSilhouetteAddonProduct(addonProduct) {\n    if (!addonProduct) return false;\n    return addonProductPhysicalShapeKind(addonProduct) === 'disc';\n  }\n\n  /** Disc add-ons inherit Medium \u2192 12mm (and Small \u2192 9mm) from the main product title/PDP size. */\n  function addonProductShouldInheritMainSize(addonProduct) {\n    if (!addonProduct || !hasSizeOption(addonProduct)) return false;\n    if (isDiscSilhouetteAddonProduct(addonProduct)) return true;\n    var sizeIdx = getSizeOptionIndex(addonProduct.options || []);\n    if (sizeIdx >= 0 && normalizeProductOptionName(addonProduct.options[sizeIdx]) === 'disc size') {\n      return true;\n    }\n    var sizes = collectUniqueSizeLabelsForProduct(addonProduct);\n    for (var i = 0; i < sizes.length; i++) {\n      if (!isNaN(parseSizeMm(sizes[i]))) return true;\n    }\n    return false;\n  }\n\n  /** Main PDP silhouette from title/handle (Tag / Disc), ignoring Charm variant. */\n  function mainProductTitleShapeKind(config) {\n    if (!config || !config.main) return null;\n    return addonProductPhysicalShapeKind(config.main);\n  }\n\n  function usesPersonalizationInput(typeLabel, typeEntry, addonProduct) {\n    if (isInitialCustomizerType(typeLabel, typeEntry)) return true;\n    // Font-style tabs (name tag fonts, etc.) need a text field beside style tiles\n    if (usesFontStylePicker(typeLabel, typeEntry, addonProduct)) return true;\n    return false;\n  }\n\n  function personalizationMaxLength(typeLabel, typeEntry, addonProduct) {\n    if (isInitialCustomizerType(typeLabel, typeEntry)) return 1;\n    return 10;\n  }\n\n  /** One tile per font style. Initials = letter PNG sample; Names = fontUrl sample. Never mix. */\n  function fontStylePickerOptions(customizations, typeLabel, typeEntry) {\n    if (!customizations || !customizations.length) return [];\n    var initialPicker = isInitialCustomizerType(typeLabel, typeEntry);\n    var groups = groupInitialCustomizationsByFont(customizations);\n    if (groups.length > 1) {\n      var grouped = [];\n      for (var i = 0; i < groups.length; i++) {\n        var opts = groups[i].options || [];\n        var pick = null;\n        if (initialPicker) {\n          // Initial style tile = any letter PNG in that Font N group (usually Font N A).\n          for (var jImg = 0; jImg < opts.length; jImg++) {\n            if (letterOptionHasImage(opts[jImg])) {\n              pick = opts[jImg];\n              break;\n            }\n          }\n        } else {\n          // Name fonts: prefer rows with fontUrl.\n          for (var j = 0; j < opts.length; j++) {\n            if (customizationHasFontUrl(opts[j])) {\n              pick = opts[j];\n              break;\n            }\n          }\n          if (!pick) {\n            for (var jImg2 = 0; jImg2 < opts.length; jImg2++) {\n              if (letterOptionHasImage(opts[jImg2])) {\n                pick = opts[jImg2];\n                break;\n              }\n            }\n          }\n        }\n        if (!pick && opts.length) pick = opts[0];\n        if (!pick) continue;\n        var lbl;\n        if (initialPicker) {\n          lbl =\n            groups[i].label ||\n            parseInitialOptionFontGroup(pick.name) ||\n            getOptionGridDisplayName(pick, typeLabel, typeEntry) ||\n            'Style ' + (i + 1);\n        } else {\n          lbl =\n            nameFontStyleLabelFromName(pick.name) ||\n            nameFontStyleLabelFromName(groups[i].label) ||\n            getOptionGridDisplayName(pick, typeLabel, typeEntry) ||\n            'Style ' + (i + 1);\n        }\n        grouped.push({ option: pick, label: toTitleCaseLabel(String(lbl).trim()) });\n      }\n      if (grouped.length) return grouped;\n    }\n    var flat = [];\n    for (var k = 0; k < customizations.length; k++) {\n      var o = customizations[k];\n      flat.push({\n        option: o,\n        label: initialPicker\n          ? getOptionGridDisplayName(o, typeLabel, typeEntry) ||\n            toTitleCaseLabel(String(o.name || '').trim())\n          : nameFontStyleLabelFromName(o.name) ||\n            getOptionGridDisplayName(o, typeLabel, typeEntry) ||\n            toTitleCaseLabel(String(o.name || '').trim())\n      });\n    }\n    return flat;\n  }\n\n  function usesFontStylePicker(typeLabel, typeEntry, addonProduct) {\n    if (isInitialCustomizerType(typeLabel, typeEntry)) return true;\n    return isFontSelectionTab(typeLabel, typeEntry);\n  }\n\n  function typeEntryHasFontUrlOptions(typeEntry) {\n    if (!typeEntry || !typeEntry.customizations) return false;\n    var custs = typeEntry.customizations;\n    for (var i = 0; i < custs.length; i++) {\n      var fu = custs[i].fontUrl;\n      if (fu != null && String(fu).trim() !== '') return true;\n    }\n    return false;\n  }\n\n  /** Tabs where the customer picks a font style (including name tag font grids). */\n  function isFontSelectionTab(typeLabel, typeEntry) {\n    return isFontCustomizerTabLabel(typeLabel) || typeEntryHasFontUrlOptions(typeEntry);\n  }\n\n  /** Tabs that include the free-text name field (personalize field covers font-style tabs). */\n  function showsNameTextInput(typeLabel, typeEntry, addonProduct) {\n    if (isInitialCustomizerType(typeLabel, typeEntry)) return false;\n    if (usesPersonalizationInput(typeLabel, typeEntry, addonProduct)) return false;\n    var lab = String(typeLabel || '').toLowerCase().trim();\n    if (lab === 'name') return true;\n    if (lab.indexOf('name tag') !== -1 || lab.indexOf('nametag') !== -1) return true;\n    if (lab.indexOf('name') !== -1 && lab.indexOf('tag') !== -1 && !isFontSelectionTab(typeLabel, typeEntry)) return true;\n    return false;\n  }\n\n  /** Text-only tab with no option grid (skip auto-picking a grid option). */\n  function isNameOnlyTextTab(typeLabel, typeEntry, addonProduct) {\n    if (usesPersonalizationInput(typeLabel, typeEntry, addonProduct)) return false;\n    if (!showsNameTextInput(typeLabel, typeEntry, addonProduct)) return false;\n    var custs = typeEntry && typeEntry.customizations ? typeEntry.customizations : [];\n    return custs.length === 0;\n  }\n\n  function pickManualTextPreviewFromTypes(types, getManualForTypeId, getSelectionForTypeId, addonProduct) {\n    if (!types || !types.length) return null;\n    for (var i = 0; i < types.length; i++) {\n      var te = types[i];\n      var tid = typeEntryKey(te, i);\n      var typeLabel = te.typeLabel || te.tabTitle || '';\n      if (\n        !showsNameTextInput(typeLabel, te, addonProduct) &&\n        !usesPersonalizationInput(typeLabel, te, addonProduct)\n      ) {\n        continue;\n      }\n      var m = getManualForTypeId(tid);\n      if (m && String(m).trim()) {\n        return {\n          opt: getSelectionForTypeId(tid) || null,\n          manualText: m,\n          typeName: typeLabel,\n          isText: true\n        };\n      }\n    }\n    return null;\n  }\n\n  function cleanInitialOptionName(name) {\n    if (name == null || name === '') return '';\n    var n = String(name).trim();\n    if (n.length === 1) return n.toUpperCase();\n    // \"Font 3 A\" / \"Font3A\" / \"Font 3 A - Gold\" \u2014 letter after Font N, allow trailing finish text\n    var m = n.match(/^(?:Font\\s+\\d+|Font\\d+|Style\\s+\\d+|Style\\d+)\\s*([A-Za-z])\\b/i);\n    if (m) return m[1].toUpperCase();\n    m = n.match(/^.+?\\s*[-\u2013\u2014]\\s*([A-Za-z])(?:\\s|$)/);\n    if (m) return m[1].toUpperCase();\n    m = n.match(/^(.+)\\s+([A-Za-z])$/);\n    if (m && m[2].length === 1) return m[2].toUpperCase();\n    return n;\n  }\n\n  /** Cart \"Font\" value \u2014 style group label, never the sample letter from \"Font N A\". */\n  function fontStyleCartLabel(option) {\n    if (!option) return '';\n    var group = parseInitialOptionFontGroup(option.name);\n    if (group) return group;\n    var raw = option.name != null ? String(option.name).trim() : '';\n    if (!raw) return '';\n    // Strip trailing sample letter so Font tiles don't become \"A\" in cart.\n    var stripped = raw.replace(/\\s+[A-Za-z]\\s*$/, '').trim();\n    return stripped || raw;\n  }\n\n  /**\n   * Name fonts only \u2014 \"Font 1 - Baskerville\" \u2192 \"Font 1\".\n   * Does not handle Initial letter rows (\"Font 3 A\" / \"Font 3 A - Gold\").\n   */\n  function nameFontStyleLabelFromName(name) {\n    if (name == null || name === '') return '';\n    var n = String(name).trim();\n    if (!n) return '';\n    // Initial letter stamps \u2014 leave alone.\n    if (/^Font\\s*\\d+\\s+[A-Za-z]\\b/i.test(n)) return '';\n    var bare = n.match(/^(Font\\s*\\d+)$/i);\n    if (bare) {\n      var bareNum = bare[1].match(/\\d+/);\n      return bareNum ? 'Font ' + bareNum[0] : bare[1].replace(/\\s+/g, ' ').trim();\n    }\n    var m = n.match(/^(Font\\s*\\d+)\\s*[-\u2013\u2014]\\s*\\S+/i);\n    if (!m) return '';\n    var num = m[1].match(/\\d+/);\n    return num ? 'Font ' + num[0] : m[1].replace(/\\s+/g, ' ').trim();\n  }\n\n  /** Cart / UI label for Name font styles (never used for Initials). */\n  function nameFontStyleCartLabel(option) {\n    if (!option) return '';\n    return nameFontStyleLabelFromName(option.name) || '';\n  }\n\n  /** Typed Initial letter for cart \u2014 never the default font-tile letter (usually A). */\n  function cartInitialLetterFromManual(manualText) {\n    return initialTagLetterFromManualText(manualText);\n  }\n\n  function isSymbolType(type) {\n    if (!type) return false;\n    return String(type).toLowerCase().indexOf('symbol') !== -1;\n  }\n\n  function labelMatchesBirthstoneBar(label) {\n    if (label == null || label === '') return false;\n    return String(label).toLowerCase().indexOf('birthstone bar') !== -1;\n  }\n\n  function isBirthstoneBarType(typeLabel, typeEntry) {\n    if (labelMatchesBirthstoneBar(typeLabel)) return true;\n    if (typeEntry && labelMatchesBirthstoneBar(typeEntry.tabTitle)) return true;\n    if (typeEntry && labelMatchesBirthstoneBar(typeEntry.typeLabel)) return true;\n    if (typeEntry && labelMatchesBirthstoneBar(typeEntry.customizationGroupTitle)) return true;\n    return false;\n  }\n\n  function birthstoneBarColorFromOption(opt) {\n    if (!opt || opt.color == null) return null;\n    var c = String(opt.color).trim();\n    if (!c) return null;\n    if (/^#[0-9A-Fa-f]{3,8}$/.test(c)) return c;\n    if (/^[0-9A-Fa-f]{6}$/.test(c)) return '#' + c;\n    return null;\n  }\n\n  function renderBirthstoneBarGemTripleMarkup(color, sizeContext, opts) {\n    opts = opts || {};\n    var safe = birthstoneBarColorFromOption({ color: color });\n    if (!safe) safe = '#888888';\n    var dot =\n      '<span class=\"customizer-birthstone-bar-dot\" style=\"background-color:' + escapeHtml(safe) + '\"></span>';\n    var sizeClass = sizeContext === 'preview' ? ' customizer-birthstone-bar-dots--preview' : '';\n    var roleAttr = opts.omitImgRole ? '' : ' role=\"img\" aria-hidden=\"true\"';\n    return (\n      '<span class=\"customizer-birthstone-bar-dots' +\n      sizeClass +\n      '\"' +\n      roleAttr +\n      '>' +\n      dot +\n      dot +\n      dot +\n      '</span>'\n    );\n  }\n\n  function renderBirthstoneBarDotsMarkup(color, sizeContext) {\n    return renderBirthstoneBarGemTripleMarkup(color, sizeContext, {});\n  }\n\n  /** Finish / Color from the active main variant (PDP picker), then state.main options. */\n  function getMainVariantFinishLabel(config, state) {\n    if (!config || !config.main || !state || !state.main) return null;\n    var vid = state.main.variantId;\n    if (vid == null || !config.main.variants || !config.main.variants.length) return null;\n    var variant = null;\n    for (var vi = 0; vi < config.main.variants.length; vi++) {\n      if (String(config.main.variants[vi].id) === String(vid)) {\n        variant = config.main.variants[vi];\n        break;\n      }\n    }\n    if (!variant) return null;\n    var optionNames = config.main.options || [];\n    for (var oi = 0; oi < optionNames.length; oi++) {\n      var optName = String(optionNames[oi]).toLowerCase().trim();\n      if (optName === 'finish' || optName === 'color') {\n        var key = 'option' + (oi + 1);\n        var val = variant[key];\n        if (val != null && String(val).trim() !== '') return String(val).trim();\n      }\n    }\n    return null;\n  }\n\n  function birthstoneBarFinishIsGold(config, state) {\n    var finishRaw = getMainFinishValue(config, state) || getMainVariantFinishLabel(config, state);\n    if (finishRaw) {\n      var metal = normalizeMetalToken(finishRaw);\n      if (metal === 'silver') return false;\n      if (metal === 'gold') return true;\n      var f = String(finishRaw).toLowerCase();\n      if (f.indexOf('silver') !== -1 || f.indexOf('sterling') !== -1) return false;\n      if (f.indexOf('gold') !== -1) return true;\n    }\n    return isMainGold(config, state);\n  }\n\n  function birthstoneBarMetalDotColor(config, state) {\n    return birthstoneBarFinishIsGold(config, state) ? '#f4dda5' : '#d4d4d4';\n  }\n\n  function renderBirthstoneBarMetalSeparatorMarkup(config, state, sizeContext) {\n    var gold = birthstoneBarFinishIsGold(config, state);\n    var toneClass = gold\n      ? ' customizer-birthstone-bar-dot--metal-gold'\n      : ' customizer-birthstone-bar-dot--metal-silver';\n    var previewMetal =\n      sizeContext === 'preview'\n        ? ' customizer-birthstone-bar-dot--preview customizer-birthstone-bar-dot--metal'\n        : ' customizer-birthstone-bar-dot--metal';\n    var color = birthstoneBarMetalDotColor(config, state);\n    return (\n      '<span class=\"customizer-birthstone-bar-metal-sep\" aria-hidden=\"true\">' +\n      '<span class=\"customizer-birthstone-bar-dot' +\n      previewMetal +\n      toneClass +\n      '\" style=\"background-color:' +\n      escapeHtml(color) +\n      '\"></span></span>'\n    );\n  }\n\n  function birthstoneBarFlatDotMarkup(color, sizeContext, extraClasses) {\n    var safe = birthstoneBarColorFromOption({ color: color });\n    if (!safe) safe = '#888888';\n    var cls = 'customizer-birthstone-bar-dot';\n    if (sizeContext === 'preview') cls += ' customizer-birthstone-bar-dot--preview';\n    if (extraClasses) cls += extraClasses;\n    return (\n      '<span class=\"' +\n      cls +\n      '\" style=\"background-color:' +\n      escapeHtml(safe) +\n      '\"></span>'\n    );\n  }\n\n  function birthstoneBarFlatMetalDotMarkup(config, state, sizeContext) {\n    var gold = birthstoneBarFinishIsGold(config, state);\n    var toneClass = gold\n      ? ' customizer-birthstone-bar-dot--metal-gold'\n      : ' customizer-birthstone-bar-dot--metal-silver';\n    var cls = 'customizer-birthstone-bar-dot customizer-birthstone-bar-dot--metal' + toneClass;\n    if (sizeContext === 'preview') cls += ' customizer-birthstone-bar-dot--preview';\n    var color = birthstoneBarMetalDotColor(config, state);\n    return (\n      '<span class=\"' +\n      cls +\n      '\" style=\"background-color:' +\n      escapeHtml(color) +\n      '\"></span>'\n    );\n  }\n\n  /** One flex row \u2014 uniform gap between every gem and metal dot. */\n  function renderBirthstoneBarCombinedPreviewMarkup(segmentColors, config, state, sizeContext) {\n    if (!segmentColors || !segmentColors.length) return '';\n    var combinedClass =\n      'customizer-birthstone-bar-combined' +\n      (sizeContext === 'preview' ? ' customizer-birthstone-bar-combined--preview' : '');\n    var html = '<span class=\"' + combinedClass + '\" role=\"img\" aria-hidden=\"true\">';\n    for (var si = 0; si < segmentColors.length; si++) {\n      if (si > 0) html += birthstoneBarFlatMetalDotMarkup(config, state, sizeContext);\n      var segColor = segmentColors[si];\n      html += birthstoneBarFlatDotMarkup(segColor, sizeContext, '');\n      html += birthstoneBarFlatDotMarkup(segColor, sizeContext, '');\n      html += birthstoneBarFlatDotMarkup(segColor, sizeContext, '');\n    }\n    html += '</span>';\n    return html;\n  }\n\n  /** Family bar preview \u2014 one hover target per pick (triple + remove), metal between segments. */\n  function renderFamilyBirthstoneBarSegmentedPreviewMarkup(picks, config, state) {\n    if (!picks || !picks.length) return '';\n    var combinedClass =\n      'customizer-birthstone-bar-combined customizer-birthstone-bar-combined--preview customizer-family-birthstone-bar-combined';\n    var html = '<div class=\"' + combinedClass + '\" role=\"img\" aria-hidden=\"true\">';\n    for (var si = 0; si < picks.length; si++) {\n      if (si > 0) html += birthstoneBarFlatMetalDotMarkup(config, state, 'preview');\n      var segColor = birthstoneBarColorFromOption(picks[si]);\n      html += '<div class=\"customizer-family-birthstone-bar-segment\">';\n      html += '<span class=\"customizer-family-birthstone-bar-segment-dots\">';\n      html += birthstoneBarFlatDotMarkup(segColor, 'preview', '');\n      html += birthstoneBarFlatDotMarkup(segColor, 'preview', '');\n      html += birthstoneBarFlatDotMarkup(segColor, 'preview', '');\n      html += '</span>';\n      html +=\n        '<button type=\"button\" class=\"customizer-family-birthstone-bar-segment-remove\" data-family-birthstone-bar-remove=\"' +\n        si +\n        '\" aria-label=\"Remove birthstone\">&times;</button>';\n      html += '</div>';\n    }\n    html += '</div>';\n    return html;\n  }\n\n  function isBirthstoneBarPreviewType(typeName, typeEntry, groupTitle) {\n    if (isBirthstoneBarType(typeName, typeEntry)) return true;\n    if (typeEntry && labelMatchesBirthstoneBar(typeEntry.customizationGroupTitle)) return true;\n    if (groupTitle && shapeKindFromCustomizationGroupTitle(groupTitle) === 'birthstone-bar') return true;\n    if (groupTitle && labelMatchesBirthstoneBar(groupTitle)) return true;\n    if (labelMatchesBirthstoneBar(typeName)) return true;\n    return false;\n  }\n\n  /**\n   * Fixed birthstone bar (single pick): preview shows three gem triples on one bar\n   * separated by gold/silver dots (finish from main variant). Family bar is multi-pick.\n   */\n  function isFixedTripleBirthstoneBarProduct(config, typeEntry, typeName, groupTitle) {\n    if (isFamilyBirthstoneBarProduct(config)) return false;\n    return isBirthstoneBarPreviewType(typeName, typeEntry, groupTitle);\n  }\n\n  var FIXED_BIRTHSTONE_BAR_SEGMENT_COUNT = 3;\n\n  function fixedBirthstoneBarSegmentColors(barColor) {\n    var segments = [];\n    for (var i = 0; i < FIXED_BIRTHSTONE_BAR_SEGMENT_COUNT; i++) segments.push(barColor);\n    return segments;\n  }\n\n  function renderBirthstoneBarPreviewInnerMarkup(config, state, typeEntry, typeName, groupTitle, opt) {\n    var barColor = birthstoneBarColorFromOption(opt);\n    if (isFixedTripleBirthstoneBarProduct(config, typeEntry, typeName, groupTitle)) {\n      return renderBirthstoneBarCombinedPreviewMarkup(\n        fixedBirthstoneBarSegmentColors(barColor),\n        config,\n        state,\n        'preview'\n      );\n    }\n    return renderBirthstoneBarDotsMarkup(barColor, 'preview');\n  }\n\n  function addonLineIsBirthstoneBarLine(state, config, listIndex) {\n    var line = state.addonList[listIndex];\n    if (!line || !line.entry || !line.entry.addonProduct) return false;\n    var groupTitle = getAddonLineGroupTitle(line, config);\n    if (labelMatchesBirthstoneBar(groupTitle) || shapeKindFromCustomizationGroupTitle(groupTitle) === 'birthstone-bar') {\n      return true;\n    }\n    var linePreview = pickAddonLinePreview(state, config, listIndex);\n    var te = linePreview.groupedItem && linePreview.groupedItem.typeEntry;\n    return isBirthstoneBarType(linePreview.typeName, te);\n  }\n\n  function resolveAddonPreviewOptForLine(state, config, listIndex) {\n    var line = state.addonList[listIndex];\n    var entry = line.entry;\n    var linePreview = pickAddonLinePreview(state, config, listIndex);\n    var typeAp = linePreview.resolveAp || entry.addonProduct;\n    var g = linePreview.groupedItem;\n    var lineGroupKey = line.customizationGroupKey || ensureAddonLineGroupKey(line, config);\n    var opt = null;\n    if (linePreview.opt) {\n      if (\n        letterOptionHasImage(linePreview.opt) &&\n        (isInitialTagAddonProduct(typeAp) ||\n          isInitialCustomizerType(linePreview.typeName, g && g.typeEntry))\n      ) {\n        opt = linePreview.opt;\n        if (opt.fontUrl) {\n          opt = cloneStoredOption(opt);\n          delete opt.fontUrl;\n        }\n      } else {\n        opt = g\n          ? resolveAddonOptionForPreview(linePreview.opt, typeAp, groupedAddonTypeKey(g), config, lineGroupKey)\n          : mergeFontUrlFromAddonCatalog(linePreview.opt, typeAp, config);\n        if (!opt) opt = linePreview.opt;\n      }\n    }\n    return { line: line, entry: entry, linePreview: linePreview, opt: opt };\n  }\n\n  function labelMatchesBirthstone(label) {\n    if (!label) return false;\n    if (labelMatchesBirthstoneBar(label)) return false;\n    var t = String(label).toLowerCase().trim();\n    return t.indexOf('birthstone') !== -1 || t.indexOf('birth stone') !== -1;\n  }\n\n  function isBirthstoneType(typeLabel, typeEntry) {\n    if (labelMatchesBirthstone(typeLabel)) return true;\n    if (typeEntry && labelMatchesBirthstone(typeEntry.tabTitle)) return true;\n    if (typeEntry && labelMatchesBirthstone(typeEntry.typeLabel)) return true;\n    if (typeEntry && labelMatchesBirthstone(typeEntry.customizationGroupTitle)) return true;\n    return false;\n  }\n\n  function getTypeEntryBlankImage(typeEntry) {\n    if (!typeEntry) return null;\n    var u = typeEntry.blankImage;\n    if (u != null && String(u).trim() !== '') return String(u).trim();\n    return null;\n  }\n\n  /**\n   * Map customizer type names to blank shape:\n   * \"Birthstone\" / \"Birthstone charm\" \u2192 charm\n   * \"Birthstone pendant\" \u2192 pendant\n   * \"Birthstone heart\" \u2192 heart\n   */\n  function classifyBirthstoneShapeFromLabel(label) {\n    if (label == null || String(label).trim() === '') return null;\n    var t = String(label).toLowerCase().trim().replace(/\\s+/g, ' ');\n    var hasBs = t.indexOf('birthstone') !== -1 || t.indexOf('birth stone') !== -1;\n    if (!hasBs) return null;\n    if (t.indexOf('heart') !== -1) return 'heart';\n    if (t.indexOf('pendant') !== -1 || t.indexOf('necklace') !== -1) return 'pendant';\n    if (t.indexOf('charm') !== -1) return 'charm';\n    return 'charm';\n  }\n\n  /** heart | charm | pendant \u2014 prefer customizer type name over product title. */\n  function getBirthstoneBlankShape(addonProduct, config, typeEntry, typeName, groupTitle) {\n    var typeLabels = [\n      typeName,\n      typeEntry && typeEntry.typeLabel,\n      typeEntry && typeEntry.tabTitle\n    ];\n    for (var ti = 0; ti < typeLabels.length; ti++) {\n      var fromType = classifyBirthstoneShapeFromLabel(typeLabels[ti]);\n      if (fromType) return fromType;\n    }\n\n    var fromGroup = classifyBirthstoneShapeFromLabel(groupTitle);\n    if (fromGroup && fromGroup !== 'charm') return fromGroup;\n    if (typeEntry) {\n      var fromCg = classifyBirthstoneShapeFromLabel(typeEntry.customizationGroupTitle);\n      if (fromCg && fromCg !== 'charm') return fromCg;\n    }\n\n    var productParts = [];\n    if (addonProduct) {\n      productParts.push(\n        addonProduct.title,\n        addonProduct.handle,\n        addonProduct.productType,\n        addonCustomizerTabLabel(addonProduct)\n      );\n    } else if (config && config.main) {\n      productParts.push(config.main.title, config.main.handle, config.main.productType);\n    }\n    var productHay = productParts\n      .filter(function (p) {\n        return p != null && String(p).trim() !== '';\n      })\n      .join(' ');\n    var fromProduct = classifyBirthstoneShapeFromLabel(productHay);\n    if (fromProduct) return fromProduct;\n\n    if (fromGroup) return fromGroup;\n    return 'charm';\n  }\n\n  /** Theme asset blank images in assets/, keyed by finish + heart/charm/pendant. */\n  function getBirthstoneBlankImage(config, state, typeEntry, addonProduct, typeName, groupTitle) {\n    var fromMeta = getTypeEntryBlankImage(typeEntry);\n    if (fromMeta) return fromMeta;\n    var assets = config && config.birthstoneBlankImages;\n    if (!assets) return null;\n    var gold = isMainGold(config, state);\n    var shape = getBirthstoneBlankShape(addonProduct, config, typeEntry, typeName, groupTitle);\n    if (shape === 'heart') return gold ? assets.heartGold : assets.heartSilver;\n    if (shape === 'charm') return gold ? assets.charmGold : assets.charmSilver;\n    return gold ? assets.pendantGold : assets.pendantSilver;\n  }\n\n  function getBirthstoneCatalogForTypeEntry(typeEntry, addonProduct) {\n    if (typeEntry && typeEntry.customizations && typeEntry.customizations.length) {\n      return typeEntry.customizations;\n    }\n    if (addonProduct && addonProduct.customizer && addonProduct.customizer.customizations) {\n      return addonProduct.customizer.customizations;\n    }\n    return [];\n  }\n\n  function normalizeMetalToken(s) {\n    if (s == null || String(s).trim() === '') return null;\n    var t = String(s).trim().toLowerCase();\n    if (t.indexOf('sterling') !== -1 || t.indexOf('silver') !== -1) return 'silver';\n    if (t.indexOf('gold') !== -1) return 'gold';\n    return null;\n  }\n\n  function getMainFinishMetals(config, state) {\n    var metals = [];\n    var seen = {};\n    function addMetal(raw) {\n      var m = normalizeMetalToken(raw);\n      if (m && !seen[m]) {\n        seen[m] = true;\n        metals.push(m);\n      }\n    }\n    addMetal(getMainOptionValue(config, state, 'finish'));\n    addMetal(getMainOptionValue(config, state, 'color'));\n    if (!metals.length) {\n      var allOpts = getAllMainOptionValues(config, state);\n      for (var i = 0; i < allOpts.length; i++) addMetal(allOpts[i]);\n    }\n    return metals;\n  }\n\n  function getOptionFinishMetal(opt) {\n    if (!opt) return null;\n    return normalizeMetalToken(opt.finish) || null;\n  }\n\n  function optionMatchesFinishFilter(opt, filterValues) {\n    if (!opt || !filterValues || !filterValues.length) return true;\n    var name = (opt.name != null ? String(opt.name) : '').trim().toLowerCase();\n    var finish = (opt.finish != null ? String(opt.finish) : '').trim().toLowerCase();\n    var optMetal = getOptionFinishMetal(opt);\n    var anyMetalFilter = false;\n    for (var i = 0; i < filterValues.length; i++) {\n      var fv = filterValues[i];\n      if (name === fv || finish === fv) return true;\n      var fvMetal = normalizeMetalToken(fv);\n      if (fvMetal) {\n        anyMetalFilter = true;\n        if (optMetal && optMetal === fvMetal) return true;\n      }\n    }\n    // Filter values had metal tokens but option had none \u2014 don't exclude (let other options decide).\n    if (anyMetalFilter && !optMetal) return true;\n    return false;\n  }\n\n  function customizationMatchesMainFinish(o, config, state) {\n    if (!o) return false;\n    var filterValues = getMainColorFinishValues(config, state);\n    if (!filterValues.length) return true;\n    return optionMatchesFinishFilter(o, filterValues);\n  }\n\n  /** Whether this option matches the current main finish (exact or gold/silver). */\n  function isOptionInFinishFilteredCatalog(opt, typeEntry, addonProduct, config, state) {\n    if (!opt) return false;\n    var filterValues = getMainColorFinishValues(config, state);\n    if (!filterValues.length) return true;\n    return optionMatchesFinishFilter(opt, filterValues);\n  }\n\n  /** Blank or finish-matched gem thumbnail for birthstone preview chips. */\n  function resolveBirthstonePreviewImage(opt, config, state, typeEntry, addonProduct, isText, typeName, groupTitle) {\n    var blank = getBirthstoneBlankImage(config, state, typeEntry, addonProduct, typeName, groupTitle);\n    if (!opt || isText) return blank;\n    var variantImg = variantDrivenImageForOption(opt, typeEntry, config, state, addonProduct);\n    if (variantImg) return variantImg;\n    var filterValues = getMainColorFinishValues(config, state);\n    var catalog = getBirthstoneCatalogForTypeEntry(typeEntry, addonProduct);\n\n    if (opt.image && isOptionInFinishFilteredCatalog(opt, typeEntry, addonProduct, config, state)) {\n      return opt.image;\n    }\n\n    if (catalog.length && filterValues.length) {\n      var mapped = findSameOptionInNewFinish(catalog, filterValues, opt, config, state);\n      if (mapped && mapped.image) return mapped.image;\n    } else if (opt.image) {\n      return opt.image;\n    }\n    return blank;\n  }\n\n  /** Remap a finish-sensitive add-on option for preview when main finish changed. */\n  function resolveFinishSensitivePreviewOption(opt, config, state, typeEntry, addonProduct) {\n    if (!opt) return null;\n    var typeLabel = (typeEntry && (typeEntry.typeLabel || typeEntry.tabTitle)) || (opt.type || '');\n    if (usesFullCustomizationListForTypeLabel(typeLabel, typeEntry)) return opt;\n    var filterValues = getMainColorFinishValues(config, state);\n    var catalog = getBirthstoneCatalogForTypeEntry(typeEntry, addonProduct);\n    if (!filterValues.length || !catalog.length) return opt;\n    if (optionMatchesFinishFilter(opt, filterValues)) return opt;\n    return findSameOptionInNewFinish(catalog, filterValues, opt, config, state);\n  }\n\n  /** Birth flower uses option artwork on the group blank \u2014 never birthstone pendant blanks. */\n  function isBirthFlowerPreviewContext(typeName, typeEntry, groupTitle, opt) {\n    var gk = shapeKindFromCustomizationGroupTitle(groupTitle);\n    if (gk === 'tag' || gk === 'initial-tag') return false;\n    if (isBirthFlowerType(typeName, typeEntry)) return true;\n    if (opt && opt.type && isBirthFlowerType(opt.type, null)) return true;\n    if (typeEntry && opt) {\n      var teLabel = typeEntry.typeLabel || typeEntry.tabTitle || '';\n      if (isBirthFlowerType(teLabel, typeEntry)) return true;\n    }\n    return false;\n  }\n\n  function isBirthstonePreviewContext(typeName, typeEntry, groupTitle, shapeMod, previewAssets) {\n    // Never treat Initial / Name as birthstone \u2014 product titles like\n    // \"Initial and Birthstone Necklace\" must not force every chip onto the birthstone path.\n    if (isInitialCustomizerType(typeName, typeEntry) || isNameCustomizerType(typeName, typeEntry)) {\n      return false;\n    }\n    if (isBirthFlowerType(typeName, typeEntry)) return false;\n    if (isBirthstoneBarType(typeName, typeEntry)) return false;\n    if (shapeMod && String(shapeMod).indexOf('birthstone-bar') !== -1) return false;\n    if (isBirthstoneType(typeName, typeEntry)) return true;\n    if (labelMatchesBirthstone(groupTitle)) return true;\n    if (shapeMod && String(shapeMod).indexOf('birthstone') !== -1) return true;\n    var ap = previewAssets && previewAssets.addonProduct;\n    if (ap && labelMatchesBirthstone(String(ap.title || '') + ' ' + String(ap.handle || ''))) return true;\n    return false;\n  }\n\n  /** Option image for preview overlay (flowers/symbols skip finish remapping that hides artwork). */\n  function resolveOptionOverlayImage(opt, typeEntry, addonProduct, config, state) {\n    if (!opt) return null;\n    if (config && state) {\n      var variantImg = variantDrivenImageForOption(opt, typeEntry, config, state, addonProduct);\n      if (variantImg) return variantImg;\n    }\n    var typeLabel = (typeEntry && (typeEntry.typeLabel || typeEntry.tabTitle)) || opt.type || '';\n    if (usesFullCustomizationListForTypeLabel(typeLabel, typeEntry) || isBirthFlowerType(typeLabel, typeEntry)) {\n      var direct = opt.image != null ? String(opt.image).trim() : '';\n      return direct || null;\n    }\n    if (!config || !state) {\n      return opt.image != null ? String(opt.image).trim() || null : null;\n    }\n    var mapped = resolveFinishSensitivePreviewOption(opt, config, state, typeEntry, addonProduct);\n    if (mapped && mapped.image) return String(mapped.image).trim() || null;\n    return opt.image != null ? String(opt.image).trim() || null : null;\n  }\n\n  function isBirthstoneAddonPreview(typeName, typeEntry, groupTitle, addonProduct) {\n    if (isBirthstonePreviewContext(typeName, typeEntry, groupTitle, null, { addonProduct: addonProduct })) {\n      return true;\n    }\n    if (!addonProduct) return false;\n    var hay = String(addonProduct.title || '') + ' ' + String(addonProduct.handle || '');\n    return labelMatchesBirthstone(hay);\n  }\n\n  function birthstonePreviewShapeMod(typeName, typeEntry, groupTitle, addonProduct) {\n    if (isBirthstoneBarType(typeName, typeEntry)) return ' customizer-preview-item--birthstone-bar';\n    if (labelMatchesBirthstoneBar(groupTitle)) return ' customizer-preview-item--birthstone-bar';\n    return isBirthstoneAddonPreview(typeName, typeEntry, groupTitle, addonProduct)\n      ? ' customizer-preview-item--birthstone'\n      : '';\n  }\n\n  function labelMatchesBirthFlower(label) {\n    if (label == null || label === '') return false;\n    var t = String(label).toLowerCase();\n    if (t.indexOf('birth') !== -1 && t.indexOf('flower') !== -1) return true;\n    if (labelMatchesFamilyBirthFlowerBouquet(label)) return true;\n    return isBloomBirthFlowerPreviewString(label) || isBabyBloomPreviewString(label);\n  }\n\n  function isBirthFlowerType(typeLabel, typeEntry) {\n    if (labelMatchesBirthFlower(typeLabel)) return true;\n    if (typeEntry && labelMatchesBirthFlower(typeEntry.tabTitle)) return true;\n    if (typeEntry && labelMatchesBirthFlower(typeEntry.typeLabel)) return true;\n    if (typeEntry && labelMatchesBirthFlower(typeEntry.customizationGroupTitle)) return true;\n    return false;\n  }\n\n  function isBloomBirthFlowerPreviewString(s) {\n    if (s == null || s === '') return false;\n    var t = String(s).toLowerCase();\n    return t.indexOf('bloom') !== -1 && t.indexOf('flower') !== -1;\n  }\n\n  function isBabyBloomPreviewString(s) {\n    if (s == null || s === '') return false;\n    var t = String(s).toLowerCase();\n    return t.indexOf('bloom') !== -1 && t.indexOf('baby') !== -1;\n  }\n\n  /** Family Birth Flower Bouquet (EN/FR) \u2014 multi-select main product, no add-ons. */\n  function labelMatchesFamilyBirthFlowerBouquet(text) {\n    if (!text) return false;\n    var t = String(text).toLowerCase();\n    if (\n      t.indexOf('family birth flower bouquet') !== -1 ||\n      t.indexOf('family-birth-flower-bouquet') !== -1\n    ) {\n      return true;\n    }\n    if (\n      t.indexOf('bouquet de fleurs de naissance familial') !== -1 ||\n      t.indexOf('bouquet-de-fleurs-de-naissance-familial') !== -1\n    ) {\n      return true;\n    }\n    return (\n      t.indexOf('bouquet') !== -1 &&\n      t.indexOf('fleurs') !== -1 &&\n      t.indexOf('naissance') !== -1 &&\n      t.indexOf('familial') !== -1\n    );\n  }\n\n  function isFamilyBirthFlowerBouquetProduct(config) {\n    if (!config || !config.main) return false;\n    if (labelMatchesFamilyBirthFlowerBouquet(config.main.title)) return true;\n    if (labelMatchesFamilyBirthFlowerBouquet(config.main.handle)) return true;\n    if (labelMatchesFamilyBirthFlowerBouquet(config.main.productType)) return true;\n    var types = getMainCustomizerTypes(config);\n    for (var i = 0; i < types.length; i++) {\n      var te = types[i];\n      if (!te) continue;\n      if (labelMatchesFamilyBirthFlowerBouquet(te.typeLabel)) return true;\n      if (labelMatchesFamilyBirthFlowerBouquet(te.tabTitle)) return true;\n      if (labelMatchesFamilyBirthFlowerBouquet(te.customizationGroupTitle)) return true;\n    }\n    var cust = config.main.customizer;\n    if (cust && labelMatchesFamilyBirthFlowerBouquet(cust.type)) return true;\n    return false;\n  }\n\n  function getFamilyFlowerSelections(state) {\n    if (!state || !state.main) return [];\n    return Array.isArray(state.main.flowerSelections) ? state.main.flowerSelections : [];\n  }\n\n  /** Family Birthstone Bar \u2014 multi-select main product, one combined preview bar (max by product type). */\n  function labelMatchesFamilyBirthstoneBar(text) {\n    if (!text) return false;\n    var t = String(text).toLowerCase();\n    if (t.indexOf('family birthstone bar') !== -1 || t.indexOf('family-birthstone-bar') !== -1) {\n      return true;\n    }\n    return t.indexOf('family') !== -1 && t.indexOf('birthstone bar') !== -1;\n  }\n\n  function mainProductHasBirthstoneBarCustomizer(config) {\n    if (!config || !config.main) return false;\n    var types = getMainCustomizerTypes(config);\n    for (var i = 0; i < types.length; i++) {\n      var te = types[i];\n      if (!te) continue;\n      if (isBirthstoneBarType(te.typeLabel || te.tabTitle, te)) return true;\n    }\n    var cust = config.main.customizer;\n    if (cust) {\n      if (labelMatchesBirthstoneBar(cust.type)) return true;\n      if (cust.customizations) {\n        for (var j = 0; j < cust.customizations.length; j++) {\n          if (isBirthstoneBarType(cust.customizations[j].type, null)) return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  function productTextLooksLikeFamily(text) {\n    if (text == null || text === '') return false;\n    return /\\bfamily\\b/i.test(String(text));\n  }\n\n  function isFamilyBirthstoneBarProduct(config) {\n    if (!config || !config.main) return false;\n    if (labelMatchesFamilyBirthstoneBar(config.main.title)) return true;\n    if (labelMatchesFamilyBirthstoneBar(config.main.handle)) return true;\n    if (labelMatchesFamilyBirthstoneBar(config.main.productType)) return true;\n    var types = getMainCustomizerTypes(config);\n    for (var i = 0; i < types.length; i++) {\n      var te = types[i];\n      if (!te) continue;\n      if (labelMatchesFamilyBirthstoneBar(te.typeLabel)) return true;\n      if (labelMatchesFamilyBirthstoneBar(te.tabTitle)) return true;\n      if (labelMatchesFamilyBirthstoneBar(te.customizationGroupTitle)) return true;\n    }\n    var cust = config.main.customizer;\n    if (cust && labelMatchesFamilyBirthstoneBar(cust.type)) return true;\n    if (mainProductHasBirthstoneBarCustomizer(config)) {\n      if (productTextLooksLikeFamily(config.main.title)) return true;\n      if (productTextLooksLikeFamily(config.main.handle)) return true;\n      if (productTextLooksLikeFamily(config.main.productType)) return true;\n    }\n    return false;\n  }\n\n  function getFamilyBirthstoneBarSelections(state) {\n    if (!state || !state.main) return [];\n    return Array.isArray(state.main.birthstoneBarSelections) ? state.main.birthstoneBarSelections : [];\n  }\n\n  function countFamilyBirthstoneBarSelectionsForOption(state, option) {\n    if (!option) return 0;\n    var picks = getFamilyBirthstoneBarSelections(state);\n    var count = 0;\n    for (var i = 0; i < picks.length; i++) {\n      if (optionMatchesSelection(option, picks[i])) count++;\n    }\n    return count;\n  }\n\n  function getFamilyBirthstoneBarOptions(config, state) {\n    var types = getMainCustomizerTypes(config);\n    var out = [];\n    var seen = {};\n    function pushOpt(o) {\n      if (!o) return;\n      var key = String(o.id != null ? o.id : '') + '|' + String(o.name || '');\n      if (seen[key]) return;\n      seen[key] = true;\n      out.push(o);\n    }\n    for (var i = 0; i < types.length; i++) {\n      var te = types[i];\n      var label = te.typeLabel || te.tabTitle || '';\n      if (isBirthstoneBarType(label, te) || labelMatchesFamilyBirthstoneBar(label)) {\n        var raw = te.customizations || [];\n        for (var ri = 0; ri < raw.length; ri++) pushOpt(raw[ri]);\n      }\n    }\n    if (\n      !out.length &&\n      config.main &&\n      config.main.customizer &&\n      config.main.customizer.customizations\n    ) {\n      var flat = config.main.customizer.customizations;\n      for (var k = 0; k < flat.length; k++) {\n        var row = flat[k];\n        if (isBirthstoneBarType(row.type, null) || labelMatchesBirthstoneBar(row.type)) pushOpt(row);\n      }\n    }\n    if (!out.length && config && Array.isArray(config.birthstoneBarOptions)) {\n      for (var g = 0; g < config.birthstoneBarOptions.length; g++) {\n        pushOpt(config.birthstoneBarOptions[g]);\n      }\n    }\n    return sortCustomizationsByMonth(out);\n  }\n\n  function isValidProofEmail(email) {\n    var s = email != null ? String(email).trim() : '';\n    if (!s) return false;\n    return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(s);\n  }\n\n  /**\n   * Flower grid for Family Bouquet \u2014 this product's metafield first.\n   * Prefer Family type list; if empty, Bloom Birth Flower on the same product;\n   * then global Bloom Birth Flower catalog (legacy store setup leaves product metafield empty).\n   */\n  function getFamilyBouquetFlowerOptions(config, state) {\n    var types = getMainCustomizerTypes(config);\n    var out = [];\n    var seen = {};\n    function pushOpt(o) {\n      if (!o) return;\n      var key = String(o.id != null ? o.id : '') + '|' + String(o.name || '');\n      if (seen[key]) return;\n      seen[key] = true;\n      out.push(o);\n    }\n    var familyRaw = [];\n    var bloomRaw = [];\n    for (var i = 0; i < types.length; i++) {\n      var te = types[i];\n      var label = te.typeLabel || te.tabTitle || '';\n      var raw = te.customizations || [];\n      if (labelMatchesFamilyBirthFlowerBouquet(label)) {\n        for (var fi = 0; fi < raw.length; fi++) familyRaw.push(raw[fi]);\n      }\n      if (isBloomBirthFlowerPreviewString(label) || isBirthFlowerType(label, te)) {\n        for (var bi = 0; bi < raw.length; bi++) bloomRaw.push(raw[bi]);\n      }\n      for (var oi = 0; oi < raw.length; oi++) {\n        if (isBloomBirthFlowerPreviewString(raw[oi].type)) bloomRaw.push(raw[oi]);\n      }\n    }\n    for (var f = 0; f < familyRaw.length; f++) pushOpt(familyRaw[f]);\n    if (!out.length) {\n      for (var b = 0; b < bloomRaw.length; b++) pushOpt(bloomRaw[b]);\n    }\n    if (\n      !out.length &&\n      config.main &&\n      config.main.customizer &&\n      config.main.customizer.customizations\n    ) {\n      var flat = config.main.customizer.customizations;\n      for (var k = 0; k < flat.length; k++) pushOpt(flat[k]);\n    }\n    if (!out.length && config && Array.isArray(config.bloomBirthFlowerOptions)) {\n      for (var g = 0; g < config.bloomBirthFlowerOptions.length; g++) {\n        pushOpt(config.bloomBirthFlowerOptions[g]);\n      }\n    }\n    return sortCustomizationsByMonth(out);\n  }\n\n  /** Bloom Birth Flower or Baby Bloom \u2014 imagery list behavior (oval chip only when strip logic adds shape-oval). */\n  function isOvalBloomPreviewString(s) {\n    return isBloomBirthFlowerPreviewString(s) || isBabyBloomPreviewString(s);\n  }\n\n  /** True when Shopify `product.type` indicates a bracelet (substring match, case-insensitive). */\n  function isMainProductBraceletFromConfig(config) {\n    if (!config || !config.main) return false;\n    var pt = config.main.productType;\n    if (pt == null || String(pt).trim() === '') return false;\n    return String(pt).toLowerCase().indexOf('bracelet') !== -1;\n  }\n\n  function getFamilyBirthstoneBarMax(config) {\n    if (isMainProductBraceletFromConfig(config)) return FAMILY_BIRTHSTONE_BAR_MAX_BRACELET;\n    return FAMILY_BIRTHSTONE_BAR_MAX_NECKLACE;\n  }\n\n  /** Which type tab\u2019s grid selection supplies `fontUrl` for tag text preview (finish filtering unchanged). */\n  function isFontCustomizerTabLabel(label) {\n    if (!label) return false;\n    if (isInitialCustomizerType(label)) return false;\n    var s = String(label).toLowerCase().trim();\n    if (s.indexOf('font') !== -1) return true;\n    if (s.indexOf('typeface') !== -1) return true;\n    if (s.indexOf('style') !== -1) return true;\n    if (s.indexOf('tag') !== -1) return true;\n    if (s === 'tag') return true;\n    if (s.indexOf('tag ') === 0) return true;\n    return false;\n  }\n\n  /** Birth flowers / Baby Bloom / symbols use per-item imagery \u2014 don't strip via finish filter. Birthstones keep finish filtering. */\n  function usesFullCustomizationListForTypeLabel(typeLabel, typeEntry) {\n    if (typeEntry && typeEntryHasFontUrlOptions(typeEntry)) return true;\n    if (isBirthstoneBarType(typeLabel, typeEntry)) return true;\n    if (isBirthstoneType(typeLabel, typeEntry)) return false;\n    return (\n      isSymbolType(typeLabel) ||\n      isInitialOrNameType(typeLabel) ||\n      isInitialCustomizerType(typeLabel, typeEntry) ||\n      isFontCustomizerTabLabel(typeLabel) ||\n      isOvalBloomPreviewString(typeLabel) ||\n      isBirthFlowerType(typeLabel, typeEntry)\n    );\n  }\n\n  /**\n   * Preview strip shape from type labels / product strings.\n   * Check Baby Bloom before Bloom Birth Flower \u2014 names like \"Baby Bloom Flower\" must get --baby-bloom.\n   * Baby Bloom \u2192 round chip only when main `product.type` contains \"bracelet\"; otherwise oval.\n   */\n  function previewStripShapeModFromStrings(isBraceletFromMain) {\n    var args = Array.prototype.slice.call(arguments, 1);\n    var baby = false;\n    var bloomFlower = false;\n    for (var i = 0; i < args.length; i++) {\n      if (isBabyBloomPreviewString(args[i])) baby = true;\n      if (isBloomBirthFlowerPreviewString(args[i])) bloomFlower = true;\n    }\n    if (baby) {\n      if (isBraceletFromMain) {\n        return ' customizer-preview-item--shape-bloom-circle customizer-preview-item--baby-bloom';\n      }\n      return ' customizer-preview-item--shape-oval customizer-preview-item--baby-bloom';\n    }\n    if (bloomFlower) return ' customizer-preview-item--shape-oval';\n    for (var it = 0; it < args.length; it++) {\n      if (labelMatchesInitialTag(args[it])) return ' customizer-preview-item--shape-initial-tag';\n    }\n    for (var bb = 0; bb < args.length; bb++) {\n      if (labelMatchesBirthstoneBar(args[bb])) return ' customizer-preview-item--birthstone-bar';\n    }\n    for (var bs = 0; bs < args.length; bs++) {\n      if (labelMatchesBirthstone(args[bs])) return ' customizer-preview-item--birthstone';\n    }\n    // Initial charm (not Initial Tag bar) \u2192 metal disc with letter stamp.\n    for (var ini = 0; ini < args.length; ini++) {\n      if (labelMatchesInitialCustomizer(args[ini]) && !labelMatchesInitialTag(args[ini])) {\n        return ' customizer-preview-item--shape-disc';\n      }\n    }\n    for (var d = 0; d < args.length; d++) {\n      if (args[d] == null || args[d] === '') continue;\n      var discTok = String(args[d]).toLowerCase();\n      if (shapeKindFromCustomizationGroupTitle(args[d]) === 'disc' || discTok.indexOf('disc') !== -1) {\n        return ' customizer-preview-item--shape-disc';\n      }\n    }\n    for (var sym = 0; sym < args.length; sym++) {\n      if (isSymbolType(args[sym])) return ' customizer-preview-item--shape-disc';\n    }\n    for (var j = 0; j < args.length; j++) {\n      var s2 = args[j];\n      if (s2 == null || s2 === '') continue;\n      if (labelMatchesInitialTag(s2)) continue;\n      var t2 = String(s2).toLowerCase();\n      if (t2.indexOf('disc') !== -1) continue;\n      if (t2.indexOf('tag') !== -1) return ' customizer-preview-item--shape-rect';\n      // Name Tag bars \u2014 not Name Disc (handled above)\n      if (t2.indexOf('name') !== -1 && t2.indexOf('disc') === -1) {\n        return ' customizer-preview-item--shape-rect';\n      }\n    }\n    return '';\n  }\n\n  function isMainGold(config, state) {\n    var finish = getMainFinishValue(config, state);\n    if (finish) {\n      var f = finish.toLowerCase();\n      if (f.indexOf('silver') !== -1 || f.indexOf('sterling') !== -1) return false;\n      if (f.indexOf('gold') !== -1) return true;\n    }\n    var allOpts = getAllMainOptionValues(config, state);\n    for (var i = 0; i < allOpts.length; i++) {\n      if (allOpts[i].indexOf('silver') !== -1 || allOpts[i].indexOf('sterling') !== -1) return false;\n    }\n    for (var j = 0; j < allOpts.length; j++) {\n      if (allOpts[j].indexOf('gold') !== -1) return true;\n    }\n    return true;\n  }\n\n  /**\n   * Finish tint for preview chips.\n   * Disc-style mains (symbol, birth flower) and shaped tags/blooms get gold/silver \u2014\n   * matching addonLinePreviewMetalMod. Birthstone stays neutral.\n   */\n  function previewMetalModifier(mainGold, shapeMod, wantsMetal) {\n    if (shapeMod && shapeMod.indexOf('birthstone') !== -1) return '';\n    var isShaped =\n      shapeMod &&\n      (shapeMod.indexOf('shape-rect') !== -1 ||\n        shapeMod.indexOf('shape-initial-tag') !== -1 ||\n        shapeMod.indexOf('shape-oval') !== -1 ||\n        shapeMod.indexOf('shape-bloom-circle') !== -1 ||\n        shapeMod.indexOf('shape-disc') !== -1);\n    if (!wantsMetal && !isShaped) return '';\n    return mainGold ? ' customizer-preview-item--symbol-gold' : ' customizer-preview-item--symbol-silver';\n  }\n\n  /** Main strip: symbols, initials/names, birth flowers, and disc-group types need the metal disc. */\n  function mainPreviewWantsMetal(typeName, typeEntry, opt) {\n    if (isSymbolType(typeName) || isInitialOrNameType(typeName)) return true;\n    if (isBirthFlowerType(typeName, typeEntry)) return true;\n    if (opt && opt.type && isBirthFlowerType(opt.type, null)) return true;\n    if (typeEntry && shapeKindFromCustomizationGroupTitle(typeEntry.customizationGroupTitle) === 'disc') {\n      return true;\n    }\n    return false;\n  }\n\n  function previewManualTextForChipShape(manualText, shapeMod) {\n    var s = String(manualText || '').trim();\n    if (!s) return s;\n    // Initial tag bars are single-letter engravings. Disc Name keeps the full string \u2014\n    // initials on discs use letter PNGs (or an already-single-char fallback).\n    if (shapeMod && shapeMod.indexOf('shape-initial-tag') !== -1) {\n      return s.charAt(0).toUpperCase();\n    }\n    return s;\n  }\n\n  function previewShapeUsesTagFont(shapeMod) {\n    if (!shapeMod) return false;\n    return shapeMod.indexOf('shape-rect') !== -1 || shapeMod.indexOf('shape-initial-tag') !== -1;\n  }\n\n  function isInitialTagShapeMod(shapeMod) {\n    return !!(shapeMod && shapeMod.indexOf('shape-initial-tag') !== -1);\n  }\n\n  function normalizeCustomizerAssetUrl(url) {\n    if (url == null || typeof url !== 'string') return '';\n    var u = url.trim();\n    if (!u) return '';\n    if (u.indexOf('//') === 0) return 'https:' + u;\n    return u;\n  }\n\n  /** fam \u2192 { url, promise, ready } \u2014 ready only after FontFace (or CSS fallback) is usable. */\n  var _previewFontLoads = {};\n\n  /** @returns {'woff2'|'woff'|'truetype'|'opentype'|null} null = omit format() so the browser sniffs (needed when CDN paths lack an extension). */\n  function guessFontFormat(url) {\n    if (!url || typeof url !== 'string') return null;\n    var u = url.split('?')[0].toLowerCase();\n    if (u.endsWith('.woff2')) return 'woff2';\n    if (u.endsWith('.woff')) return 'woff';\n    if (u.endsWith('.otf')) return 'opentype';\n    if (u.endsWith('.ttf')) return 'truetype';\n    return null;\n  }\n\n  function normalizeCustomizerFontUrl(url) {\n    if (url == null || typeof url !== 'string') return '';\n    var u = url.trim();\n    if (!u) return '';\n    if (u.indexOf('//') === 0) return 'https:' + u;\n    if (u.indexOf('http://') === 0 || u.indexOf('https://') === 0) return u;\n    if (u.charAt(0) === '/' && typeof window !== 'undefined' && window.location && window.location.origin) {\n      return window.location.origin + u;\n    }\n    return u;\n  }\n\n  function hashStringForFontFamily(s) {\n    var h = 0;\n    for (var i = 0; i < s.length; i++) h = ((h << 5) - h + s.charCodeAt(i)) | 0;\n    return Math.abs(h);\n  }\n\n  /** Stable @font-face family from the font file URL so one download is shared across options. */\n  function previewFontFamilyName(option) {\n    if (!option) return '';\n    if (option.fontUrl != null && String(option.fontUrl).trim() !== '') {\n      return 'CustomizerPreviewFont_u' + hashStringForFontFamily(normalizeCustomizerFontUrl(String(option.fontUrl)));\n    }\n    if (option.id != null && String(option.id).trim() !== '') {\n      return 'CustomizerPreviewFont_' + String(option.id).replace(/[^a-zA-Z0-9_-]/g, '_');\n    }\n    return '';\n  }\n\n  function escapeCssFontUrl(url) {\n    return String(url || '')\n      .replace(/\\\\/g, '\\\\\\\\')\n      .replace(/'/g, \"\\\\'\");\n  }\n\n  function injectPreviewFontFace(fam, url) {\n    if (document.querySelector('style[data-customizer-preview-font=\"' + fam + '\"]')) return;\n    var fmt = guessFontFormat(url);\n    var styleEl = document.createElement('style');\n    styleEl.setAttribute('data-customizer-preview-font', fam);\n    var urlEsc = escapeCssFontUrl(url);\n    var famEsc = fam.replace(/'/g, \"\\\\'\");\n    var src = \"url('\" + urlEsc + \"')\" + (fmt ? \" format('\" + fmt + \"')\" : '');\n    styleEl.textContent =\n      \"@font-face{font-family:'\" +\n      famEsc +\n      \"';src:\" +\n      src +\n      \";font-display:swap;font-weight:100 900;font-style:normal;}\";\n    document.head.appendChild(styleEl);\n  }\n\n  /**\n   * Load one preview font once. Prefer FontFace API (single download + display:swap);\n   * CSS @font-face is only a fallback when FontFace is unavailable or fails.\n   * @returns {Promise<boolean>}\n   */\n  function loadPreviewFont(option) {\n    if (!option || !customizationHasFontUrl(option)) return Promise.resolve(false);\n    var url = normalizeCustomizerFontUrl(String(option.fontUrl));\n    var fam = previewFontFamilyName(option);\n    if (!fam || !url) return Promise.resolve(false);\n\n    var existing = _previewFontLoads[fam];\n    if (existing && existing.url === url && existing.promise) return existing.promise;\n\n    var entry = { url: url, ready: false, promise: null };\n    _previewFontLoads[fam] = entry;\n\n    var promise;\n    if (typeof FontFace !== 'undefined' && document.fonts && document.fonts.add) {\n      try {\n        var src = \"url('\" + escapeCssFontUrl(url) + \"')\";\n        var fmt = guessFontFormat(url);\n        if (fmt) src += \" format('\" + fmt + \"')\";\n        var ff = new FontFace(fam, src, {\n          display: 'swap',\n          weight: '100 900',\n          style: 'normal'\n        });\n        promise = ff\n          .load()\n          .then(function (loaded) {\n            document.fonts.add(loaded);\n            entry.ready = true;\n            return true;\n          })\n          .catch(function () {\n            injectPreviewFontFace(fam, url);\n            entry.ready = true;\n            if (document.fonts && document.fonts.load) {\n              return document.fonts.load(\"700 16px '\" + fam + \"'\").then(\n                function () {\n                  return true;\n                },\n                function () {\n                  return true;\n                }\n              );\n            }\n            return true;\n          });\n      } catch (e) {\n        injectPreviewFontFace(fam, url);\n        entry.ready = true;\n        promise = Promise.resolve(true);\n      }\n    } else {\n      injectPreviewFontFace(fam, url);\n      entry.ready = true;\n      promise = Promise.resolve(true);\n    }\n\n    entry.promise = promise;\n    return promise;\n  }\n\n  function ensurePreviewFontLoaded(option) {\n    loadPreviewFont(option);\n  }\n\n  function pushUniqueFontOption(list, seen, option) {\n    if (!option || !customizationHasFontUrl(option)) return;\n    var url = normalizeCustomizerFontUrl(String(option.fontUrl));\n    if (!url || seen[url]) return;\n    seen[url] = true;\n    list.push(option);\n  }\n\n  function collectFontOptionsFromTypes(types, list, seen) {\n    if (!types || !types.length) return;\n    for (var i = 0; i < types.length; i++) {\n      var te = types[i];\n      var label = (te && (te.typeLabel || te.tabTitle)) || '';\n      if (!isFontSelectionTab(label, te) && !usesFontStylePicker(label, te, null)) continue;\n      var custs = (te && te.customizations) || [];\n      for (var c = 0; c < custs.length; c++) pushUniqueFontOption(list, seen, custs[c]);\n    }\n  }\n\n  /** All catalog fonts (main + addon products) plus currently selected line fonts. */\n  function collectFontsToPreload(state, config) {\n    var list = [];\n    var seen = {};\n    if (config && config.main) {\n      collectFontOptionsFromTypes(getMainCustomizerTypes(config), list, seen);\n    }\n    var addons = getAddons(config);\n    for (var a = 0; a < addons.length; a++) {\n      collectFontOptionsFromTypes(addons[a] && addons[a].customizerTypes, list, seen);\n    }\n    if (state && state.addonList) {\n      for (var i = 0; i < state.addonList.length; i++) {\n        var entry = state.addonList[i].entry;\n        if (!entry || !entry.addonProduct) continue;\n        collectFontOptionsFromTypes(entry.addonProduct.customizerTypes, list, seen);\n        var sel = getSelectedAddonFontOption(entry, entry.addonProduct, config, state);\n        pushUniqueFontOption(list, seen, sel);\n      }\n    }\n    if (state && config) {\n      pushUniqueFontOption(list, seen, getSelectedMainFontOption(state, config));\n    }\n    return list;\n  }\n\n  function fontsUsedForPreviewFit(state, config) {\n    var list = [];\n    var seen = {};\n    if (state && config) {\n      pushUniqueFontOption(list, seen, getSelectedMainFontOption(state, config));\n    }\n    if (state && state.addonList) {\n      for (var i = 0; i < state.addonList.length; i++) {\n        var entry = state.addonList[i].entry;\n        if (!entry || !entry.addonProduct) continue;\n        pushUniqueFontOption(\n          list,\n          seen,\n          getSelectedAddonFontOption(entry, entry.addonProduct, config, state)\n        );\n      }\n    }\n    return list;\n  }\n\n  function preloadCustomizerFonts(state, config, callback) {\n    var opts = collectFontsToPreload(state, config);\n    if (!opts.length) {\n      if (callback) callback(false);\n      return;\n    }\n    var jobs = [];\n    for (var i = 0; i < opts.length; i++) jobs.push(loadPreviewFont(opts[i]));\n    Promise.all(jobs)\n      .then(function () {\n        if (callback) callback(true);\n      })\n      .catch(function () {\n        if (callback) callback(false);\n      });\n  }\n\n  /** @deprecated Prefer preloadCustomizerFonts \u2014 kept for call-site clarity. */\n  function preloadPreviewFontsForAddonEntries(state, config, callback) {\n    preloadCustomizerFonts(state, config, callback);\n  }\n\n  function findMainCatalogOptionById(sel, config) {\n    if (!sel || sel.id == null || !config || !config.main) return null;\n    var types = config.main.customizerTypes || [];\n    for (var i = 0; i < types.length; i++) {\n      var custs = types[i].customizations || [];\n      for (var c = 0; c < custs.length; c++) {\n        if (String(custs[c].id) === String(sel.id)) return custs[c];\n      }\n    }\n    var flat = config.main.customizer && config.main.customizer.customizations;\n    if (flat && flat.length) {\n      for (var k = 0; k < flat.length; k++) {\n        if (String(flat[k].id) === String(sel.id)) return flat[k];\n      }\n    }\n    if (Array.isArray(config.birthstoneBarOptions)) {\n      for (var b = 0; b < config.birthstoneBarOptions.length; b++) {\n        if (String(config.birthstoneBarOptions[b].id) === String(sel.id)) return config.birthstoneBarOptions[b];\n      }\n    }\n    return null;\n  }\n\n  /** Attach fontUrl from embedded customizer JSON when DOM/data attrs omitted it (matches option id in any type tab). */\n  function mergeFontUrlFromMainCatalog(sel, config) {\n    if (!sel || !config || !config.main) return sel;\n    if (sel.fontUrl != null && String(sel.fontUrl).trim() !== '') return sel;\n    var cat = findMainCatalogOptionById(sel, config);\n    if (!cat) return sel;\n    var fu = cat.fontUrl;\n    if (fu != null && String(fu).trim() !== '') return Object.assign({}, sel, { fontUrl: fu });\n    return sel;\n  }\n\n  function mergeMainCatalogFields(sel, config) {\n    if (!sel || !config || !config.main) return sel;\n    var cat = findMainCatalogOptionById(sel, config);\n    if (!cat) return mergeFontUrlFromMainCatalog(sel, config);\n    var out = Object.assign({}, sel);\n    if ((out.fontUrl == null || String(out.fontUrl).trim() === '') && cat.fontUrl != null && String(cat.fontUrl).trim() !== '') {\n      out.fontUrl = cat.fontUrl;\n    }\n    if (out.color == null && cat.color != null && String(cat.color).trim() !== '') {\n      out.color = cat.color;\n    }\n    if ((!out.image || String(out.image).trim() === '') && cat.image != null && String(cat.image).trim() !== '') {\n      out.image = cat.image;\n    }\n    return out;\n  }\n\n  function mergeFontUrlFromAddonCatalog(sel, addonProduct, config) {\n    return resolveAddonOptionForPreview(sel, addonProduct, null, config) || sel;\n  }\n\n  function addonTypeLabelForTypeId(addonProduct, typeId) {\n    if (!addonProduct || typeId == null) return '';\n    var found = findTypeEntryOnProduct(addonProduct, typeId);\n    if (found && found.typeEntry) {\n      return found.typeEntry.typeLabel || found.typeEntry.tabTitle || '';\n    }\n    return '';\n  }\n\n  function resolveAddonOptionForSelection(option, addonProduct, typeId, config, groupKey) {\n    if (!option || !addonProduct) return option;\n    return resolveAddonOptionForPreview(option, addonProduct, typeId, config, groupKey) || option;\n  }\n\n  function enrichMainOptionFromConfig(option, config) {\n    if (!option || !config || !config.main) return option;\n    return mergeMainCatalogFields(option, config);\n  }\n\n  function enrichAddonOptionFromConfig(option, addonProduct, config) {\n    if (!option || !addonProduct) return option;\n    return resolveAddonOptionForPreview(option, addonProduct, null, config) || option;\n  }\n\n  function getSelectedMainFontOption(state, config) {\n    if (!config || !config.main || !config.main.customizerTypes || !config.main.customizerTypes.length) return null;\n    var types = config.main.customizerTypes;\n    var i;\n    for (i = 0; i < types.length; i++) {\n      var te = types[i];\n      var label = te.typeLabel || te.tabTitle || '';\n      if (!isFontSelectionTab(label, te) && !usesFontStylePicker(label, te, null)) continue;\n      var tid = typeEntryKey(te, i);\n      var sel = state.main.selections && state.main.selections[tid];\n      if (sel) {\n        var m = mergeFontUrlFromMainCatalog(sel, config);\n        if (m && m.fontUrl && String(m.fontUrl).trim() !== '') return m;\n      }\n    }\n    for (i = 0; i < types.length; i++) {\n      var tid2 = typeEntryKey(types[i], i);\n      var sel2 = state.main.selections && state.main.selections[tid2];\n      if (sel2) {\n        var m2 = mergeFontUrlFromMainCatalog(sel2, config);\n        if (m2 && m2.fontUrl && String(m2.fontUrl).trim() !== '') return m2;\n      }\n    }\n    return null;\n  }\n\n  function getSelectedAddonFontOption(entry, addonProduct, config, state) {\n    if (!entry || !addonProduct) return null;\n    var scopedFont = getAddonProductFontSelection(entry, addonProduct);\n    if (scopedFont) {\n      var types = addonProduct.customizerTypes || [];\n      var resolveKey = addonFlatSelectionKey(addonProduct);\n      for (var si = 0; si < types.length; si++) {\n        var ste = types[si];\n        var sl = ste.typeLabel || ste.tabTitle || '';\n        if (!isFontSelectionTab(sl, ste) && !usesFontStylePicker(sl, ste, addonProduct)) continue;\n        resolveKey = groupedAddonTypeKey(makeAddonGroupedItem(ste, si, addonProduct));\n        break;\n      }\n      var resolved = resolveAddonOptionForPreview(scopedFont, addonProduct, resolveKey, config);\n      if (resolved) return resolved;\n      return scopedFont;\n    }\n    return null;\n  }\n\n  /**\n   * Name-tag text is rotated 90\u00B0 \u2014 pre-rotate width must fit bar length, height the bar width.\n   * Leave edge padding so names never run to the metal edges (large ~40\u00D772, compact ~36\u00D765).\n   */\n  var TAG_PREVIEW_EDGE_PAD_PX = 8;\n  var TAG_PREVIEW_FIT_ALONG_PX = 56;\n  var TAG_PREVIEW_FIT_ACROSS_PX = 24;\n  var TAG_PREVIEW_FIT_FONT_MIN = 8;\n  var TAG_PREVIEW_FIT_FONT_MAX = 20;\n\n  /** Initial tag: font fallback, bottom of ~40\u00D772px chip (not rotated). Fixed size \u2014 bar chrome may shrink. */\n  var INITIAL_TAG_PREVIEW_FIT_MAX = 38;\n  var INITIAL_TAG_PREVIEW_FIT_MIN = 20;\n  var INITIAL_TAG_PREVIEW_FIT_WIDTH_PX = 34;\n  var INITIAL_TAG_PREVIEW_FIT_HEIGHT_PX = 40;\n\n  function estimateTagPreviewFontSizePx(charCount, alongPx) {\n    if (!charCount) return TAG_PREVIEW_FIT_FONT_MAX;\n    var along = alongPx > 0 ? alongPx : TAG_PREVIEW_FIT_ALONG_PX;\n    return Math.min(\n      TAG_PREVIEW_FIT_FONT_MAX,\n      Math.max(TAG_PREVIEW_FIT_FONT_MIN, along / (charCount * 0.58))\n    );\n  }\n\n  /** Usable name-fit box inside a tag chip (padding from each edge). */\n  function tagPreviewNameFitBounds(chip) {\n    var along = TAG_PREVIEW_FIT_ALONG_PX;\n    var across = TAG_PREVIEW_FIT_ACROSS_PX;\n    if (chip) {\n      var h = chip.clientHeight || 0;\n      var w = chip.clientWidth || 0;\n      if (h > 0) along = Math.max(TAG_PREVIEW_FIT_FONT_MIN * 2, h - TAG_PREVIEW_EDGE_PAD_PX * 2);\n      if (w > 0) across = Math.max(TAG_PREVIEW_FIT_FONT_MIN, w - TAG_PREVIEW_EDGE_PAD_PX * 2);\n    }\n    return { along: along, across: across };\n  }\n\n  /** Name on disc \u2014 scale to letter count with padding inside the circle. */\n  var DISC_PREVIEW_NAME_EDGE_PAD_PX = 10;\n  var DISC_PREVIEW_NAME_FIT_MIN = 8;\n  var DISC_PREVIEW_NAME_FIT_MAX = 22;\n\n  function estimateDiscPreviewNameFontSizePx(charCount, maxPx) {\n    if (!charCount) return DISC_PREVIEW_NAME_FIT_MAX;\n    var box = maxPx > 0 ? maxPx : DISC_PREVIEW_STRIP_BASE_PX - DISC_PREVIEW_NAME_EDGE_PAD_PX * 2;\n    return Math.min(\n      DISC_PREVIEW_NAME_FIT_MAX,\n      Math.max(DISC_PREVIEW_NAME_FIT_MIN, box / (charCount * 0.62))\n    );\n  }\n\n  function discPreviewNameFitBounds(chip) {\n    var d = DISC_PREVIEW_STRIP_BASE_PX;\n    if (chip) {\n      var w = chip.clientWidth || 0;\n      var h = chip.clientHeight || 0;\n      if (w > 0 || h > 0) d = Math.min(w || d, h || d);\n    }\n    var max = Math.max(DISC_PREVIEW_NAME_FIT_MIN * 2, d - DISC_PREVIEW_NAME_EDGE_PAD_PX * 2);\n    return { max: max };\n  }\n\n  function fitInitialTagPreviewTextElement(textEl) {\n    if (!textEl) return;\n    var text = (textEl.textContent || '').trim();\n    if (!text) {\n      textEl.style.fontSize = '';\n      return;\n    }\n    var size = INITIAL_TAG_PREVIEW_FIT_MAX;\n    textEl.style.fontSize = size + 'px';\n    while (\n      size > INITIAL_TAG_PREVIEW_FIT_MIN &&\n      (textEl.offsetWidth > INITIAL_TAG_PREVIEW_FIT_WIDTH_PX ||\n        textEl.offsetHeight > INITIAL_TAG_PREVIEW_FIT_HEIGHT_PX)\n    ) {\n      size -= 1;\n      textEl.style.fontSize = size + 'px';\n    }\n    while (size < INITIAL_TAG_PREVIEW_FIT_MAX) {\n      textEl.style.fontSize = size + 1 + 'px';\n      if (\n        textEl.offsetWidth > INITIAL_TAG_PREVIEW_FIT_WIDTH_PX ||\n        textEl.offsetHeight > INITIAL_TAG_PREVIEW_FIT_HEIGHT_PX\n      ) {\n        textEl.style.fontSize = size + 'px';\n        break;\n      }\n      size += 1;\n    }\n  }\n\n  function fitTagPreviewTextElement(textEl) {\n    if (!textEl) return;\n    if (textEl.closest('.customizer-preview-item--shape-initial-tag')) {\n      fitInitialTagPreviewTextElement(textEl);\n      return;\n    }\n    if (textEl.closest('.customizer-preview-item--shape-disc')) {\n      fitDiscPreviewNameTextElement(textEl);\n      return;\n    }\n    var text = (textEl.textContent || '').trim();\n    if (!text) {\n      textEl.style.fontSize = '';\n      return;\n    }\n    var chip = textEl.closest('.customizer-preview-item--shape-rect');\n    if (!chip) return;\n    var bounds = tagPreviewNameFitBounds(chip);\n    var alongMax = bounds.along;\n    var acrossMax = bounds.across;\n    var len = text.length;\n    var size = estimateTagPreviewFontSizePx(len, alongMax);\n    textEl.style.fontSize = size + 'px';\n    while (size > TAG_PREVIEW_FIT_FONT_MIN && textEl.offsetWidth > alongMax) {\n      size -= 1;\n      textEl.style.fontSize = size + 'px';\n    }\n    while (size > TAG_PREVIEW_FIT_FONT_MIN && textEl.offsetHeight > acrossMax) {\n      size -= 1;\n      textEl.style.fontSize = size + 'px';\n    }\n    while (size < TAG_PREVIEW_FIT_FONT_MAX) {\n      textEl.style.fontSize = size + 1 + 'px';\n      if (textEl.offsetWidth > alongMax || textEl.offsetHeight > acrossMax) {\n        textEl.style.fontSize = size + 'px';\n        break;\n      }\n      size += 1;\n    }\n  }\n\n  function fitDiscPreviewNameTextElement(textEl) {\n    if (!textEl) return;\n    var text = (textEl.textContent || '').trim();\n    if (!text || text.length <= 1) {\n      // Single glyph = initial fallback; leave CSS stamp size alone.\n      textEl.style.fontSize = '';\n      return;\n    }\n    var chip = textEl.closest('.customizer-preview-item--shape-disc');\n    if (!chip) return;\n    var max = discPreviewNameFitBounds(chip).max;\n    var size = estimateDiscPreviewNameFontSizePx(text.length, max);\n    textEl.style.fontSize = size + 'px';\n    while (size > DISC_PREVIEW_NAME_FIT_MIN && textEl.offsetWidth > max) {\n      size -= 1;\n      textEl.style.fontSize = size + 'px';\n    }\n    while (size > DISC_PREVIEW_NAME_FIT_MIN && textEl.offsetHeight > max) {\n      size -= 1;\n      textEl.style.fontSize = size + 'px';\n    }\n    while (size < DISC_PREVIEW_NAME_FIT_MAX) {\n      textEl.style.fontSize = size + 1 + 'px';\n      if (textEl.offsetWidth > max || textEl.offsetHeight > max) {\n        textEl.style.fontSize = size + 'px';\n        break;\n      }\n      size += 1;\n    }\n  }\n\n  function fitTagPreviewTextInRoot(root) {\n    if (!root || !root.querySelectorAll) return;\n    var els = root.querySelectorAll(\n      '.customizer-preview-item--shape-rect .customizer-preview-text, .customizer-preview-item--shape-initial-tag .customizer-preview-text, .customizer-preview-item--shape-disc .customizer-preview-text--fit-disc-name'\n    );\n    for (var i = 0; i < els.length; i++) fitTagPreviewTextElement(els[i]);\n  }\n\n  var _fitTagPreviewTimer = null;\n\n  function scheduleFitTagPreviewText(root, fontOptions) {\n    if (!root) return;\n    if (_fitTagPreviewTimer) clearTimeout(_fitTagPreviewTimer);\n    _fitTagPreviewTimer = setTimeout(function () {\n      _fitTagPreviewTimer = null;\n      function run() {\n        fitTagPreviewTextInRoot(root);\n      }\n      function afterPaint() {\n        requestAnimationFrame(function () {\n          requestAnimationFrame(run);\n        });\n      }\n      var opts = fontOptions || [];\n      if (opts.length) {\n        var jobs = [];\n        for (var i = 0; i < opts.length; i++) jobs.push(loadPreviewFont(opts[i]));\n        Promise.all(jobs).then(afterPaint).catch(afterPaint);\n        return;\n      }\n      afterPaint();\n    }, 16);\n  }\n\n  function renderPreviewTextSpan(rawText, shapeMod, fontOpt) {\n    var text = previewManualTextForChipShape(rawText, shapeMod);\n    var isRectTag = shapeMod && shapeMod.indexOf('shape-rect') !== -1;\n    var isInitialTagShape = shapeMod && shapeMod.indexOf('shape-initial-tag') !== -1;\n    var isDiscShape = shapeMod && shapeMod.indexOf('shape-disc') !== -1;\n    var fitTag = isRectTag && text.length > 0;\n    var fitInitialTag = isInitialTagShape && text.length > 0;\n    var fitDiscName = isDiscShape && text.length > 1;\n    var styleParts = [];\n    if (fitTag) {\n      styleParts.push('font-size: ' + estimateTagPreviewFontSizePx(text.length) + 'px');\n    } else if (fitInitialTag) {\n      styleParts.push('font-size: ' + INITIAL_TAG_PREVIEW_FIT_MAX + 'px');\n    } else if (fitDiscName) {\n      styleParts.push(\n        'font-size: ' + estimateDiscPreviewNameFontSizePx(text.length) + 'px'\n      );\n    }\n    var resolved = fontOpt && customizationHasFontUrl(fontOpt) ? fontOpt : null;\n    if (resolved && resolved.fontUrl) {\n      ensurePreviewFontLoaded(resolved);\n      var fam = previewFontFamilyName(resolved);\n      if (fam) {\n        styleParts.push(\n          \"font-family: '\" + fam + \"', ui-serif, Georgia, serif\",\n          'font-weight: 700',\n          'color: var(--customizer-ink)'\n        );\n      }\n    }\n    var className =\n      'customizer-preview-text' +\n      (fitTag ? ' customizer-preview-text--fit-tag' : '') +\n      (fitInitialTag ? ' customizer-preview-text--fit-initial-tag' : '') +\n      (fitDiscName ? ' customizer-preview-text--fit-disc-name' : '');\n    var styleAttr = styleParts.length ? ' style=\"' + styleParts.join('; ') + '\"' : '';\n    return '<span class=\"' + className + '\"' + styleAttr + '>' + escapeHtml(text) + '</span>';\n  }\n\n  function optionFontDataAttr(o) {\n    if (!o || o.fontUrl == null || String(o.fontUrl).trim() === '') return '';\n    return ' data-option-font-url=\"' + escapeHtml(String(o.fontUrl)) + '\"';\n  }\n\n  function optionColorDataAttr(o) {\n    if (!o || o.color == null || String(o.color).trim() === '') return '';\n    return ' data-option-color=\"' + escapeHtml(String(o.color)) + '\"';\n  }\n\n  function optionFromDataset(btn) {\n    var opt = {\n      id: btn.getAttribute('data-option-id'),\n      name: btn.getAttribute('data-option-name'),\n      image: btn.getAttribute('data-option-image'),\n      type: btn.getAttribute('data-option-type')\n    };\n    var fu = btn.getAttribute('data-option-font-url');\n    if (fu) opt.fontUrl = fu;\n    var col = btn.getAttribute('data-option-color');\n    if (col) opt.color = col;\n    return opt;\n  }\n\n  function getDefaultVariant(addon) {\n    var variants = addon.variants || [];\n    var available = variants.filter(function (v) { return v.available !== false; });\n    return (available.length ? available[0] : variants[0]) || null;\n  }\n\n  function getMainFinishValue(config, state) {\n    var color = getMainOptionValue(config, state, 'color');\n    var finish = getMainOptionValue(config, state, 'finish');\n    if (finish) return String(finish).trim().toLowerCase();\n    if (color) return String(color).trim().toLowerCase();\n    return null;\n  }\n\n  function getFinishOptionIndex(optionNames) {\n    if (!optionNames || !optionNames.length) return 0;\n    for (var i = 0; i < optionNames.length; i++) {\n      var name = String(optionNames[i]).trim().toLowerCase();\n      if (name === 'finish' || name === 'color') return i;\n    }\n    return 0;\n  }\n\n  function findVariantMatchingMainFinishPreservingSize(addon, config, state, sizeLabel) {\n    if (!addon || !addon.variants || !addon.variants.length) return getDefaultVariant(addon);\n    if (!sizeLabel || String(sizeLabel).trim() === '') {\n      return findVariantMatchingMainFinish(addon, config, state) || getDefaultVariant(addon);\n    }\n    var sizeKey = getSizeOptionKeyStrict(addon);\n    if (!sizeKey) {\n      return findVariantMatchingMainFinish(addon, config, state) || getDefaultVariant(addon);\n    }\n    var mapped = matchSizeLabelOnProduct(addon, sizeLabel) || String(sizeLabel).trim();\n    var variants = addon.variants.filter(function (v) {\n      return v.available !== false;\n    });\n    if (!variants.length) variants = addon.variants.slice();\n    for (var i = 0; i < variants.length; i++) {\n      var variant = variants[i];\n      var sizeVal = variant[sizeKey] != null ? String(variant[sizeKey]).trim() : '';\n      if (!sizeVal || !sizeLabelsMatch(sizeVal, mapped)) continue;\n      if (variantMatchesMainFinish(variant, addon, config, state)) return variant;\n    }\n    for (var j = 0; j < variants.length; j++) {\n      var v2 = variants[j];\n      var sizeVal2 = v2[sizeKey] != null ? String(v2[sizeKey]).trim() : '';\n      if (sizeVal2 && sizeLabelsMatch(sizeVal2, mapped)) return v2;\n    }\n    // Size was requested but not found \u2014 do not fall back to a different size.\n    return null;\n  }\n\n  function findVariantMatchingMainFinish(addon, config, state) {\n    if (!addon || !addon.variants || addon.variants.length === 0) return getDefaultVariant(addon);\n    // Product title/PDP \"Medium\" should land on the 12mm disc, not the first 9mm variant.\n    if (addonProductShouldInheritMainSize(addon) && hasSizeOption(addon)) {\n      var inheritSize = getMainSizeLabel(config, state);\n      if (inheritSize) {\n        var sized = findVariantMatchingMainFinishPreservingSize(addon, config, state, inheritSize);\n        if (sized) return sized;\n      }\n    }\n    var mainMetals = getMainFinishMetals(config, state);\n    var mainFinish = getMainFinishValue(config, state);\n    if (!mainFinish && !mainMetals.length) return getDefaultVariant(addon);\n    var addonOptions = addon.options || [];\n    var finishIndex = getFinishOptionIndex(addonOptions);\n    var optionKey = 'option' + (finishIndex + 1);\n    var variants = addon.variants;\n    var available = variants.filter(function (v) { return v.available !== false; });\n    var pool = available.length ? available : variants;\n    for (var v = 0; v < pool.length; v++) {\n      var variant = pool[v];\n      var val = (variant[optionKey] != null ? String(variant[optionKey]) : '').trim().toLowerCase();\n      if (mainFinish && val === mainFinish) return variant;\n      if (mainMetals.length) {\n        var variantMetal = normalizeMetalToken(val);\n        for (var m = 0; m < mainMetals.length; m++) {\n          if (variantMetal && variantMetal === mainMetals[m]) return variant;\n        }\n      }\n    }\n    return getDefaultVariant(addon);\n  }\n\n  function getMainOptionValue(config, state, optionNameLower) {\n    if (!config || !config.main || !state || !state.main) return null;\n    var optionNames = config.main.options || [];\n    for (var i = 0; i < optionNames.length; i++) {\n      if (String(optionNames[i]).toLowerCase() === optionNameLower) {\n        var val = state.main['option' + (i + 1)];\n        return val != null && String(val).trim() !== '' ? String(val).trim() : null;\n      }\n    }\n    return null;\n  }\n\n  function getMainColorFinishValues(config, state) {\n    var values = [];\n    var seen = {};\n    function pushValue(raw) {\n      if (raw == null || String(raw).trim() === '') return;\n      var lower = String(raw).trim().toLowerCase();\n      if (seen[lower]) return;\n      seen[lower] = true;\n      values.push(lower);\n    }\n    var color = getMainOptionValue(config, state, 'color');\n    var finish = getMainOptionValue(config, state, 'finish');\n    pushValue(color);\n    if (finish && finish.toLowerCase() !== (color && color.toLowerCase())) pushValue(finish);\n    if (!values.length) {\n      var allOpts = getAllMainOptionValues(config, state);\n      for (var i = 0; i < allOpts.length; i++) {\n        var v = allOpts[i];\n        if (v.indexOf('gold') !== -1 || v.indexOf('silver') !== -1 || v.indexOf('sterling') !== -1) {\n          pushValue(v);\n        }\n      }\n    }\n    return values;\n  }\n\n  function getAllMainOptionValues(config, state) {\n    var values = [];\n    if (!state || !state.main) return values;\n    var seen = {};\n    for (var i = 1; i <= 3; i++) {\n      var val = state.main['option' + i];\n      if (val != null && String(val).trim() !== '') {\n        var lower = String(val).trim().toLowerCase();\n        if (!seen[lower]) {\n          seen[lower] = true;\n          values.push(lower);\n        }\n      }\n    }\n    return values;\n  }\n\n  function stripFinishFromName(name, finishValue) {\n    if (!name || !finishValue) return (name || '').trim().toLowerCase();\n    var n = String(name).trim().toLowerCase();\n    var f = String(finishValue).trim().toLowerCase();\n    var suffix = ' - ' + f;\n    if (n.slice(-suffix.length) === suffix) return n.slice(0, -suffix.length).trim();\n    if (n.indexOf(suffix) !== -1) return n.replace(suffix, '').trim();\n    return n;\n  }\n\n  function findSameOptionInNewFinish(customizations, filterValues, currentOption, config, state) {\n    if (!customizations || customizations.length === 0 || !currentOption) return null;\n    var currentType = (currentOption.type != null ? String(currentOption.type) : '').trim();\n    var currentName = (currentOption.name != null ? String(currentOption.name) : '').trim().toLowerCase();\n    var currentBaseName = stripFinishFromName(currentOption.name, currentOption.finish);\n    if (!currentBaseName && currentName) {\n      currentBaseName = currentName.replace(/\\s*-\\s*(silver|gold|rose\\s*gold|yellow|white|black|bronze|brass|gunmetal|chrome|matte|polished)$/i, '').trim();\n    }\n    var optionsInNewFinish = [];\n    for (var i = 0; i < customizations.length; i++) {\n      var o = customizations[i];\n      var matchesNewFinish = false;\n      if (config && state) {\n        matchesNewFinish = customizationMatchesMainFinish(o, config, state);\n      } else if (filterValues && filterValues.length) {\n        matchesNewFinish = optionMatchesFinishFilter(o, filterValues);\n      } else {\n        matchesNewFinish = true;\n      }\n      if (!matchesNewFinish) continue;\n      var name = (o.name != null ? String(o.name) : '').trim().toLowerCase();\n      var finish = (o.finish != null ? String(o.finish) : '').trim().toLowerCase();\n      var type = (o.type != null ? String(o.type) : '').trim();\n      var baseName = stripFinishFromName(o.name, o.finish) || name.replace(/\\s*-\\s*(silver|gold|rose\\s*gold|yellow|white|black|bronze|brass|gunmetal|chrome|matte|polished)$/i, '').trim();\n      optionsInNewFinish.push({ o: o, name: name, finish: finish, type: type, baseName: baseName });\n    }\n    if (currentOption.id != null && String(currentOption.id).trim() !== '') {\n      var wantId = String(currentOption.id);\n      for (var idk = 0; idk < optionsInNewFinish.length; idk++) {\n        if (String(optionsInNewFinish[idk].o.id) === wantId) return optionsInNewFinish[idk].o;\n      }\n    }\n    var currentMonth = getMonthIndex(currentOption.name);\n    if (currentMonth > 0) {\n      for (var mk = 0; mk < optionsInNewFinish.length; mk++) {\n        if (getMonthIndex(optionsInNewFinish[mk].o.name) === currentMonth) return optionsInNewFinish[mk].o;\n      }\n    }\n    for (var k = 0; k < optionsInNewFinish.length; k++) {\n      var t = optionsInNewFinish[k];\n      if (currentBaseName && t.baseName && t.baseName === currentBaseName) return t.o;\n    }\n    for (var k2 = 0; k2 < optionsInNewFinish.length; k2++) {\n      var t2 = optionsInNewFinish[k2];\n      if (currentName && t2.name === currentName) return t2.o;\n    }\n    if (currentType) {\n      var typeMatches = [];\n      for (var tk = 0; tk < optionsInNewFinish.length; tk++) {\n        if (optionsInNewFinish[tk].type === currentType) typeMatches.push(optionsInNewFinish[tk].o);\n      }\n      if (typeMatches.length === 1) return typeMatches[0];\n    }\n    return null;\n  }\n\n  function remapSelectionOptionForFinish(config, state, typeEntry, currentOpt, enrichFn, addonProduct) {\n    if (!currentOpt) return currentOpt;\n    var typeLabel = (typeEntry && (typeEntry.typeLabel || typeEntry.tabTitle)) || '';\n    if (usesFullCustomizationListForTypeLabel(typeLabel, typeEntry)) return currentOpt;\n    var filterValues = getMainColorFinishValues(config, state);\n    if (!filterValues.length) return currentOpt;\n    if (optionMatchesFinishFilter(currentOpt, filterValues)) return currentOpt;\n    var catalog = getBirthstoneCatalogForTypeEntry(typeEntry, addonProduct);\n    if (!catalog.length) return null;\n    var mapped = findSameOptionInNewFinish(catalog, filterValues, currentOpt, config, state);\n    if (!mapped) return null;\n    return enrichFn ? enrichFn(mapped) : mapped;\n  }\n\n  function makeAddonGroupedItem(typeEntry, typeIndex, addonProduct) {\n    return { typeEntry: typeEntry, typeIndex: typeIndex, addonProduct: addonProduct || null };\n  }\n\n  /** Migrate legacy base selection keys to product-scoped grouped keys. */\n  function normalizeAddonSelectionKeys(line, config) {\n    if (!line || !line.entry || !line.entry.selections) return;\n    var entry = line.entry;\n    var grouped = getAddonLineGroupedTypes(line, config);\n    for (var i = 0; i < grouped.length; i++) {\n      var g = grouped[i];\n      var groupedKey = groupedAddonTypeKey(g);\n      var baseKey = typeEntryKey(g.typeEntry, g.typeIndex);\n      if (entry.selections[baseKey] && !entry.selections[groupedKey]) {\n        entry.selections[groupedKey] = entry.selections[baseKey];\n        delete entry.selections[baseKey];\n      } else if (entry.selections[baseKey] && entry.selections[groupedKey]) {\n        delete entry.selections[baseKey];\n      }\n      if (entry.manualByType && entry.manualByType[baseKey] != null && entry.manualByType[groupedKey] == null) {\n        entry.manualByType[groupedKey] = entry.manualByType[baseKey];\n        delete entry.manualByType[baseKey];\n      }\n    }\n    var flatPkgs = getAddonLineGroupedProducts(line, config);\n    var flatOnlyAp = null;\n    var flatOnlyCount = 0;\n    for (var fpi = 0; fpi < flatPkgs.length; fpi++) {\n      var fap = flatPkgs[fpi].addonProduct;\n      if (!fap || (fap.customizerTypes && fap.customizerTypes.length)) continue;\n      flatOnlyCount++;\n      flatOnlyAp = fap;\n    }\n    if (entry.selections[ADDON_FLAT_TYPE_KEY] && flatOnlyCount === 1 && flatOnlyAp) {\n      var scopedFlat = addonFlatSelectionKey(flatOnlyAp);\n      if (!entry.selections[scopedFlat]) {\n        entry.selections[scopedFlat] = entry.selections[ADDON_FLAT_TYPE_KEY];\n      }\n      delete entry.selections[ADDON_FLAT_TYPE_KEY];\n    }\n    if (entry.manualByType && entry.manualByType[ADDON_FLAT_TYPE_KEY] != null && flatOnlyCount === 1 && flatOnlyAp) {\n      var scopedFlatManual = addonFlatSelectionKey(flatOnlyAp);\n      if (entry.manualByType[scopedFlatManual] == null) {\n        entry.manualByType[scopedFlatManual] = entry.manualByType[ADDON_FLAT_TYPE_KEY];\n      }\n      delete entry.manualByType[ADDON_FLAT_TYPE_KEY];\n    }\n  }\n\n  function lineNeedsSelectionKeyNormalize(line, config) {\n    if (!line || !line.entry || !line.entry.selections) return false;\n    var entry = line.entry;\n    var grouped = getAddonLineGroupedTypes(line, config);\n    for (var i = 0; i < grouped.length; i++) {\n      var g = grouped[i];\n      var groupedKey = groupedAddonTypeKey(g);\n      var baseKey = typeEntryKey(g.typeEntry, g.typeIndex);\n      if (entry.selections[baseKey] && !entry.selections[groupedKey]) return true;\n      if (\n        entry.manualByType &&\n        entry.manualByType[baseKey] != null &&\n        entry.manualByType[groupedKey] == null\n      ) {\n        return true;\n      }\n    }\n    var flatPkgsCheck = getAddonLineGroupedProducts(line, config);\n    var flatOnlyCheck = 0;\n    for (var fci = 0; fci < flatPkgsCheck.length; fci++) {\n      var fapCheck = flatPkgsCheck[fci].addonProduct;\n      if (fapCheck && !(fapCheck.customizerTypes && fapCheck.customizerTypes.length)) flatOnlyCheck++;\n    }\n    if (flatOnlyCheck === 1) {\n      if (entry.selections[ADDON_FLAT_TYPE_KEY]) return true;\n      if (entry.manualByType && entry.manualByType[ADDON_FLAT_TYPE_KEY] != null) return true;\n    }\n    return false;\n  }\n\n  function normalizeAddonLinesIfNeeded(state, config) {\n    if (!state || !state.addonList) return;\n    for (var ni = 0; ni < state.addonList.length; ni++) {\n      if (lineNeedsSelectionKeyNormalize(state.addonList[ni], config)) {\n        normalizeAddonSelectionKeys(state.addonList[ni], config);\n      }\n    }\n  }\n\n  function remapFinishSensitiveSelections(config, state) {\n    if (!config || !state) return;\n    normalizeAddonLinesIfNeeded(state, config);\n    if (mainUsesTypeTabs(config)) {\n      var mainTypes = getMainCustomizerTypes(config);\n      for (var mi = 0; mi < mainTypes.length; mi++) {\n        var mte = mainTypes[mi];\n        var mtid = typeEntryKey(mte, mi);\n        var msel = state.main.selections && state.main.selections[mtid];\n        if (!msel) continue;\n        var mremapped = remapSelectionOptionForFinish(config, state, mte, msel, function (o) {\n          return enrichMainOptionFromConfig(o, config);\n        }, null);\n        if (mremapped) state.main.selections[mtid] = mremapped;\n        else delete state.main.selections[mtid];\n      }\n      syncMainSelectedOptionFromActiveTab(state, config);\n    } else if (state.main.selectedOption) {\n      var flatMainTe = {\n        typeLabel: state.main.customizationType,\n        tabTitle: state.main.customizationType,\n        customizations: (config.main.customizer && config.main.customizer.customizations) || []\n      };\n      var mainRemapped = remapSelectionOptionForFinish(config, state, flatMainTe, state.main.selectedOption, function (o) {\n        return enrichMainOptionFromConfig(o, config);\n      }, null);\n      if (mainRemapped) state.main.selectedOption = mainRemapped;\n      else state.main.selectedOption = null;\n    }\n\n    for (var li = 0; li < state.addonList.length; li++) {\n      var line = state.addonList[li];\n      var entry = line.entry;\n      var ap = entry && entry.addonProduct;\n      if (!entry || !entry.selections || !ap) continue;\n      var grouped = getAddonLineGroupedTypes(line, config);\n      if (grouped.length) {\n        for (var gi = 0; gi < grouped.length; gi++) {\n          var g = grouped[gi];\n          var te = g.typeEntry;\n          if (!te) continue;\n          var tid = groupedAddonTypeKey(g);\n          var baseKey = typeEntryKey(te, g.typeIndex);\n          var sel = getAddonEntrySelection(entry, g);\n          if (!sel) continue;\n          var typeAp = g.addonProduct || ap;\n          if (typeAp && (isNameAddonProduct(typeAp) || isInitialAddonProduct(typeAp))) continue;\n          var remapped = remapSelectionOptionForFinish(config, state, te, sel, function (o) {\n            return enrichAddonOptionFromConfig(o, typeAp, config);\n          }, typeAp);\n          if (remapped) entry.selections[tid] = cloneStoredOption(remapped);\n          else delete entry.selections[tid];\n          if (entry.selections[baseKey]) delete entry.selections[baseKey];\n        }\n      } else {\n        var flatKeyRemap = addonFlatSelectionKey(ap);\n        var flatSel =\n          (entry.selections && entry.selections[flatKeyRemap]) ||\n          (entry.selections && entry.selections[ADDON_FLAT_TYPE_KEY]);\n        if (flatSel) {\n          var flatTe = {\n            typeLabel: entry.customizationType,\n            tabTitle: entry.customizationType,\n            customizations: (ap.customizer && ap.customizer.customizations) || []\n          };\n          var flatRemapped = remapSelectionOptionForFinish(config, state, flatTe, flatSel, function (o) {\n            return enrichAddonOptionFromConfig(o, ap, config);\n          }, ap);\n          if (flatRemapped) entry.selections[flatKeyRemap] = flatRemapped;\n          else {\n            delete entry.selections[flatKeyRemap];\n            if (entry.selections[ADDON_FLAT_TYPE_KEY]) delete entry.selections[ADDON_FLAT_TYPE_KEY];\n          }\n        }\n      }\n    }\n  }\n\n  function filterCustomizationsByMainColorFinish(customizations, config, state) {\n    if (!customizations || customizations.length === 0) return [];\n    var filterValues = getMainColorFinishValues(config, state);\n    if (filterValues.length === 0) return customizations;\n    return customizations.filter(function (o) {\n      return customizationMatchesMainFinish(o, config, state);\n    });\n  }\n\n  var MONTH_NAMES = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];\n  var MONTH_ABBREV = { jan: 1, feb: 2, mar: 3, apr: 4, may: 5, jun: 6, jul: 7, aug: 8, sep: 9, sept: 9, oct: 10, nov: 11, dec: 12 };\n\n  function getMonthIndex(name) {\n    if (!name || typeof name !== 'string') return 0;\n    var n = String(name).trim().toLowerCase();\n    if (!n) return 0;\n    var i;\n    for (i = 0; i < MONTH_NAMES.length; i++) {\n      if (n === MONTH_NAMES[i] || n.indexOf(MONTH_NAMES[i]) === 0) return i + 1;\n    }\n    for (var abbr in MONTH_ABBREV) {\n      if (n === abbr || n.indexOf(abbr + ' ') === 0 || n.indexOf(abbr + '-') === 0 || n.indexOf(abbr + '\\u2014') === 0) return MONTH_ABBREV[abbr];\n    }\n    return 0;\n  }\n\n  function sortCustomizationsByMonth(customizations) {\n    if (!customizations || customizations.length === 0) return customizations;\n    var copy = customizations.slice();\n    var monthCount = 0;\n    for (var j = 0; j < copy.length; j++) {\n      if (getMonthIndex(copy[j].name)) monthCount++;\n    }\n    if (monthCount === 0) return customizations;\n    copy.sort(function (a, b) {\n      var ma = getMonthIndex(a.name);\n      var mb = getMonthIndex(b.name);\n      if (ma && mb) return ma - mb;\n      if (ma) return -1;\n      if (mb) return 1;\n      return 0;\n    });\n    return copy;\n  }\n\n  /** Extract font family label from an initial letter option name (e.g. \"Font 1 A\" \u2192 \"Font 1\"). */\n  function parseInitialOptionFontGroup(name) {\n    if (name == null || name === '') return null;\n    var n = String(name).trim();\n    if (!n) return null;\n    // Bare group label from a style tile / cart prop\n    var bare = n.match(/^(Font\\s*\\d+)$/i);\n    if (bare) {\n      var bareNum = bare[1].match(/\\d+/);\n      return bareNum ? 'Font ' + bareNum[0] : bare[1].replace(/\\s+/g, ' ').trim();\n    }\n    // \"Font 3 A\" or \"Font 3 A - Gold\"\n    var m = n.match(/^(Font\\s+\\d+)\\s+([A-Za-z])\\b/i);\n    if (m) return m[1].replace(/\\s+/g, ' ').trim();\n    m = n.match(/^(Font\\d+)\\s*([A-Za-z])\\b/i);\n    if (m) {\n      var num = m[1].match(/\\d+/);\n      return num ? 'Font ' + num[0] : m[1];\n    }\n    m = n.match(/^(.+?)\\s*[-\u2013\u2014]\\s*([A-Za-z])(?:\\s|$)/);\n    if (m && m[1].length > 0) {\n      var dashGroup = parseInitialOptionFontGroup(m[1].trim());\n      return dashGroup || m[1].trim();\n    }\n    m = n.match(/^(.+)\\s+([A-Za-z])$/);\n    if (m && m[1].length > 0 && m[2].length === 1 && m[1].length < 40) return m[1].trim();\n    return null;\n  }\n\n  function fontGroupSortKey(label) {\n    var s = String(label || '').trim();\n    var fm = s.match(/^Font\\s*(\\d+)$/i);\n    if (fm) return parseInt(fm[1], 10);\n    var fromName = parseInitialOptionFontGroup(s);\n    if (fromName) {\n      var fm2 = String(fromName).match(/^Font\\s*(\\d+)$/i);\n      if (fm2) return parseInt(fm2[1], 10);\n    }\n    return Number.MAX_SAFE_INTEGER;\n  }\n\n  function fontGroupLabelsMatch(a, b) {\n    if (a == null || b == null) return false;\n    var sa = String(a).trim();\n    var sb = String(b).trim();\n    if (!sa || !sb) return false;\n    if (sa.toLowerCase() === sb.toLowerCase()) return true;\n    var pa = parseInitialOptionFontGroup(sa) || sa;\n    var pb = parseInitialOptionFontGroup(sb) || sb;\n    if (String(pa).toLowerCase() === String(pb).toLowerCase()) return true;\n    var ka = fontGroupSortKey(pa);\n    var kb = fontGroupSortKey(pb);\n    return ka !== Number.MAX_SAFE_INTEGER && ka === kb;\n  }\n\n  function sortInitialFontGroupLabels(labels) {\n    return labels.slice().sort(function (a, b) {\n      var ka = fontGroupSortKey(a);\n      var kb = fontGroupSortKey(b);\n      if (ka !== kb) return ka - kb;\n      return String(a).localeCompare(String(b));\n    });\n  }\n\n  function groupInitialCustomizationsByFont(customizations) {\n    if (!customizations || !customizations.length) return [];\n    var byName = {};\n    var nameHits = 0;\n    for (var i = 0; i < customizations.length; i++) {\n      var o = customizations[i];\n      var g = parseInitialOptionFontGroup(o.name);\n      if (g) {\n        nameHits++;\n        if (!byName[g]) byName[g] = [];\n        byName[g].push(o);\n      }\n    }\n    if (nameHits > 0 && nameHits >= customizations.length * 0.5) {\n      var nameLabels = sortInitialFontGroupLabels(Object.keys(byName));\n      return nameLabels.map(function (label) {\n        return { label: label, options: byName[label] };\n      });\n    }\n    var byFontUrl = {};\n    var urlHits = 0;\n    for (var j = 0; j < customizations.length; j++) {\n      var o2 = customizations[j];\n      var fu = o2.fontUrl != null ? String(o2.fontUrl).trim() : '';\n      if (!fu) continue;\n      urlHits++;\n      if (!byFontUrl[fu]) byFontUrl[fu] = [];\n      byFontUrl[fu].push(o2);\n    }\n    if (urlHits > 0 && Object.keys(byFontUrl).length > 1) {\n      var urlGroups = [];\n      var urlKeys = Object.keys(byFontUrl);\n      for (var k = 0; k < urlKeys.length; k++) {\n        var opts = byFontUrl[urlKeys[k]];\n        var inferred = parseInitialOptionFontGroup(opts[0] && opts[0].name);\n        urlGroups.push({\n          label: inferred || ('Style ' + (k + 1)),\n          options: opts\n        });\n      }\n      urlGroups.sort(function (a, b) {\n        var ka = fontGroupSortKey(a.label);\n        var kb = fontGroupSortKey(b.label);\n        if (ka !== kb) return ka - kb;\n        return String(a.label).localeCompare(String(b.label));\n      });\n      return urlGroups;\n    }\n    return [{ label: '', options: customizations.slice() }];\n  }\n\n  function shouldGroupInitialsByFont(typeLabel, customizations, typeEntry) {\n    if (!customizations || customizations.length <= 26) return false;\n    if (!isInitialOrNameType(typeLabel) && !isFontSelectionTab(typeLabel, typeEntry || { customizations: customizations })) return false;\n    var groups = groupInitialCustomizationsByFont(customizations);\n    return groups.length > 1;\n  }\n\n  function fontGroupIndexForOption(selectedOpt, groups) {\n    if (!selectedOpt || !groups || !groups.length) return -1;\n    for (var i = 0; i < groups.length; i++) {\n      var opts = groups[i].options || [];\n      for (var j = 0; j < opts.length; j++) {\n        if (optionMatchesSelection(opts[j], selectedOpt)) return i;\n      }\n    }\n    return -1;\n  }\n\n  function getActiveFontGroupIndex(state, typeKey, groupCount, selectedOpt, groups) {\n    var key = String(typeKey);\n    var idx = state.activeFontGroupByType[key];\n    var selGroup = fontGroupIndexForOption(selectedOpt, groups);\n    if (idx != null && idx >= 0 && idx < groupCount) {\n      return idx;\n    }\n    if (selGroup >= 0) {\n      state.activeFontGroupByType[key] = selGroup;\n      return selGroup;\n    }\n    state.activeFontGroupByType[key] = 0;\n    return 0;\n  }\n\n  function selectedLetterFromOption(opt) {\n    if (!opt || opt.name == null) return '';\n    return cleanInitialOptionName(opt.name);\n  }\n\n  /** Font number from a style tile / option name \u2014 \"Font 2 A\" / \"Font 2\" \u2192 \"2\". */\n  function fontNumberFromOption(opt) {\n    if (!opt) return '';\n    var g = parseInitialOptionFontGroup(opt.name);\n    var m = String(g || opt.name || '').match(/Font\\s*(\\d+)/i);\n    return m ? m[1] : '';\n  }\n\n  /**\n   * Letter stamps are named \"Font 3 G\". Look up by font number + typed letter.\n   */\n  function findLetterOptionByFontAndLetter(customizations, fontNum, letter) {\n    if (!customizations || !customizations.length || !fontNum || !letter) return null;\n    var want = ('Font ' + fontNum + ' ' + letter).toUpperCase();\n    var wantCompact = ('FONT' + fontNum + letter).toUpperCase();\n    var fallback = null;\n    for (var i = 0; i < customizations.length; i++) {\n      var o = customizations[i];\n      var raw = String(o.name || '').trim();\n      if (!raw) continue;\n      var norm = raw.replace(/\\s+/g, ' ').toUpperCase();\n      var compact = norm.replace(/\\s+/g, '');\n      var nameHit =\n        norm === want ||\n        norm.indexOf(want + ' ') === 0 ||\n        norm.indexOf(want + '-') === 0 ||\n        compact === wantCompact ||\n        compact.indexOf(wantCompact) === 0;\n      if (!nameHit) {\n        // Same font + letter via parsers (handles odd spacing).\n        if (fontNumberFromOption(o) !== String(fontNum)) continue;\n        if (selectedLetterFromOption(o) !== letter) continue;\n      }\n      if (letterOptionHasImage(o)) return o;\n      if (!fallback) fallback = o;\n    }\n    return fallback;\n  }\n\n  function findOptionInFontGroup(groups, groupIndex, letter) {\n    if (!letter || !groups || groupIndex < 0 || groupIndex >= groups.length) return null;\n    var opts = groups[groupIndex].options || [];\n    var fallback = null;\n    for (var i = 0; i < opts.length; i++) {\n      if (selectedLetterFromOption(opts[i]) !== letter) continue;\n      if (letterOptionHasImage(opts[i])) return opts[i];\n      if (!fallback) fallback = opts[i];\n    }\n    return fallback;\n  }\n\n  /** Find letter PNG: typed letter + selected Font N \u2192 option named \"Font N X\". */\n  function findLetterPngOption(customizations, manualText, fontStyleOption) {\n    var letter = initialTagLetterFromManualText(manualText);\n    if (!letter || !customizations || !customizations.length) return null;\n\n    var fontNum = fontNumberFromOption(fontStyleOption);\n    if (fontNum) {\n      var byName = findLetterOptionByFontAndLetter(customizations, fontNum, letter);\n      if (byName && letterOptionHasImage(byName)) return byName;\n    }\n\n    // Fallback: group index path if font number wasn't parseable from the style tile.\n    var groups = groupInitialCustomizationsByFont(customizations);\n    var gi = fontStyleOption ? fontGroupIndexForStyleOption(fontStyleOption, groups) : -1;\n    if (gi >= 0) {\n      var inGroup = findOptionInFontGroup(groups, gi, letter);\n      if (inGroup && letterOptionHasImage(inGroup)) return inGroup;\n    } else if (!fontStyleOption && groups.length === 1) {\n      var only = findOptionInFontGroup(groups, 0, letter);\n      if (only && letterOptionHasImage(only)) return only;\n    }\n\n    if (\n      fontStyleOption &&\n      letterOptionHasImage(fontStyleOption) &&\n      letterOptionMatchesTypedLetter(fontStyleOption, manualText)\n    ) {\n      return fontStyleOption;\n    }\n\n    var anyLetterPng = null;\n    for (var i = 0; i < customizations.length; i++) {\n      var o = customizations[i];\n      if (!letterOptionHasImage(o)) continue;\n      if (selectedLetterFromOption(o) !== letter) continue;\n      if (!anyLetterPng) anyLetterPng = o;\n    }\n    if (anyLetterPng) return anyLetterPng;\n    if (fontStyleOption && letterOptionHasImage(fontStyleOption)) return fontStyleOption;\n    return null;\n  }\n\n  function initialTagLetterFromManualText(manualText) {\n    var s = manualText != null ? String(manualText).trim() : '';\n    if (!s) return '';\n    var m = s.match(/[A-Za-z]/);\n    return m ? m[0].toUpperCase() : '';\n  }\n\n  function fontGroupIndexForStyleOption(fontStyleOption, groups) {\n    if (!fontStyleOption || !groups || !groups.length) return -1;\n    var idx = fontGroupIndexForOption(fontStyleOption, groups);\n    if (idx >= 0) return idx;\n    var fromName = parseInitialOptionFontGroup(fontStyleOption.name);\n    var label = fromName || String(fontStyleOption.name || '').trim();\n    for (var i = 0; i < groups.length; i++) {\n      if (fontGroupLabelsMatch(groups[i].label, label)) return i;\n    }\n    // Image-based style tiles: selected row is often \"Font 3 A\"; match any option id/name in a group\n    for (var gi2 = 0; gi2 < groups.length; gi2++) {\n      var opts2 = groups[gi2].options || [];\n      for (var k2 = 0; k2 < opts2.length; k2++) {\n        if (optionMatchesSelection(opts2[k2], fontStyleOption)) return gi2;\n      }\n    }\n    var fu = fontStyleOption.fontUrl != null ? String(fontStyleOption.fontUrl).trim() : '';\n    if (fu) {\n      for (var j = 0; j < groups.length; j++) {\n        var opts = groups[j].options || [];\n        for (var k = 0; k < opts.length; k++) {\n          var ofu = opts[k].fontUrl != null ? String(opts[k].fontUrl).trim() : '';\n          if (ofu === fu) return j;\n        }\n      }\n    }\n    // Thumbnail match: style tile image is often the group's sample letter PNG\n    var styleImg = normalizeCustomizerAssetUrl(fontStyleOption.image);\n    if (styleImg) {\n      for (var gi3 = 0; gi3 < groups.length; gi3++) {\n        var opts3 = groups[gi3].options || [];\n        for (var k3 = 0; k3 < opts3.length; k3++) {\n          if (normalizeCustomizerAssetUrl(opts3[k3].image) === styleImg) return gi3;\n        }\n      }\n    }\n    return -1;\n  }\n\n  /** Typed initial + font style tile \u2192 catalog row with letter thumbnail image. */\n  function letterOptionHasImage(o) {\n    return !!(o && o.image != null && String(o.image).trim() !== '');\n  }\n\n  /** True when opt's letter glyph matches the typed initial (avoids style-tile \"Font N A\" fallback). */\n  function letterOptionMatchesTypedLetter(opt, manualText) {\n    var want = initialTagLetterFromManualText(manualText);\n    if (!want || !opt) return false;\n    var got = selectedLetterFromOption(opt);\n    return !!(got && String(got).toUpperCase() === want);\n  }\n\n  function resolveInitialLetterPreviewOptionFromCustomizations(customizations, manualText, fontStyleOption, addonProduct, config) {\n    if (!customizations || !customizations.length) return null;\n    var letter = initialTagLetterFromManualText(manualText);\n    if (!letter) return null;\n    // Typed letter + Font N \u2192 option named \"Font N X\" (e.g. Font 3 G).\n    var match = findLetterPngOption(customizations, manualText, fontStyleOption);\n    if (!match) return null;\n    // Return the catalog row as-is \u2014 Initials are PNGs only (never Name fontUrl).\n    var out = cloneStoredOption(match);\n    if (out && out.fontUrl) delete out.fontUrl;\n    return out;\n  }\n\n  /** Any option in the list carries a letter thumbnail PNG. */\n  function initialCustomizationsHaveImages(custs) {\n    if (!custs || !custs.length) return false;\n    for (var i = 0; i < custs.length; i++) {\n      if (letterOptionHasImage(custs[i])) return true;\n    }\n    return false;\n  }\n\n  function initialOptionsShareFontGroup(a, b) {\n    if (!a || !b) return false;\n    if (optionMatchesSelection(a, b)) return true;\n    var ga = parseInitialOptionFontGroup(a.name);\n    var gb = parseInitialOptionFontGroup(b.name);\n    if (ga && gb) return fontGroupLabelsMatch(ga, gb);\n    return false;\n  }\n\n  /**\n   * Canonical Initial letter-preview resolver (disc + Initial Tag).\n   * Typed letter + selected font style \u2192 letter PNG. Never blank the chip on font change.\n   */\n  function resolveInitialPreviewLetterOption(config, state, addonProduct, typeEntry, groupKey, manualText, fontStyleOption, fallbackOpt) {\n    if (!initialTagLetterFromManualText(manualText)) return fallbackOpt || null;\n    var custs = initialLetterCustomizationsForPreview(config, state, addonProduct, typeEntry, groupKey);\n    if ((!custs || !custs.length) && addonProduct) {\n      custs = allAddonCustomizationOptions(addonProduct) || [];\n    }\n    function tryResolve(list) {\n      return resolveInitialLetterPreviewOptionFromCustomizations(\n        list,\n        manualText,\n        fontStyleOption,\n        addonProduct,\n        config\n      );\n    }\n    var resolved = tryResolve(custs);\n    if (!(resolved && letterOptionHasImage(resolved))) {\n      var shared = findSharedInitialLetterCustomizations(config, state);\n      if (shared.length) {\n        var fromShared = tryResolve(shared);\n        if (fromShared && letterOptionHasImage(fromShared)) resolved = fromShared;\n      }\n    }\n    if (resolved && letterOptionHasImage(resolved)) return resolved;\n    if (\n      letterOptionHasImage(fontStyleOption) &&\n      letterOptionMatchesTypedLetter(fontStyleOption, manualText)\n    ) {\n      return fontStyleOption;\n    }\n    if (\n      letterOptionHasImage(fallbackOpt) &&\n      letterOptionMatchesTypedLetter(fallbackOpt, manualText) &&\n      (!fontStyleOption || initialOptionsShareFontGroup(fallbackOpt, fontStyleOption))\n    ) {\n      return fallbackOpt;\n    }\n    // Keep a visible PNG when font style changes and letter remap missed.\n    if (letterOptionHasImage(fontStyleOption)) return fontStyleOption;\n    if (letterOptionHasImage(fallbackOpt)) return fallbackOpt;\n    return null;\n  }\n\n  function getOptionGridDisplayName(option, typeLabel, typeEntry) {\n    if (!option || option.name == null) return '';\n    var raw = String(option.name).trim();\n    if (!raw) return '';\n    if (isInitialCustomizerType(typeLabel, typeEntry)) {\n      return cleanInitialOptionName(raw) || raw;\n    }\n    // Name fonts: \"Font 1 - Baskerville\" \u2192 \"Font 1\" (Initials handled above).\n    if (isFontSelectionTab(typeLabel, typeEntry) || typeEntryHasFontUrlOptions(typeEntry)) {\n      var nameFontLbl = nameFontStyleLabelFromName(raw);\n      if (nameFontLbl) return nameFontLbl;\n    }\n    var base = stripFinishFromName(raw, option.finish);\n    if (!base) base = raw;\n    base = base\n      .replace(/\\s*[-\u2013\u2014]\\s*(sterling\\s+silver|sterling|silver|gold|rose\\s*gold|yellow\\s*gold|white\\s*gold)(\\s|$)/i, '')\n      .trim();\n    return toTitleCaseLabel(base || raw);\n  }\n\n  function optionGridShowsLabel(typeLabel, typeEntry) {\n    if (isInitialCustomizerType(typeLabel, typeEntry)) return false;\n    return true;\n  }\n\n  function renderFontOptionVisual(option) {\n    var styleParts = [];\n    if (option && customizationHasFontUrl(option)) {\n      ensurePreviewFontLoaded(option);\n      var fam = previewFontFamilyName(option);\n      if (fam) {\n        styleParts.push(\"font-family:'\" + fam + \"', ui-serif, Georgia, serif\");\n        styleParts.push('font-weight:700');\n      }\n    }\n    var styleAttr = styleParts.length ? ' style=\"' + styleParts.join(';') + '\"' : '';\n    return (\n      '<span class=\"customizer-option-btn-visual customizer-option-btn-visual--font\"' +\n      styleAttr +\n      ' aria-hidden=\"true\">Abc</span>'\n    );\n  }\n\n  function renderPersonalizationField(state, config, opts) {\n    if (!opts) return '';\n    var maxLen = opts.maxLength != null ? opts.maxLength : 10;\n    var val = (opts.value != null ? String(opts.value) : '').substring(0, maxLen);\n    var placeholder =\n      opts.placeholder ||\n      personalizationFieldPlaceholder(maxLen, opts.addonProduct, opts.typeLabel, opts.typeEntry);\n    var html = '<div class=\"customizer-personalize-block\" data-personalize-field=\"true\">';\n    html +=\n      '<p class=\"customizer-field-label\">' +\n      escapeHtml(getCustomizerNameFieldLabel(config)) +\n      '</p>';\n    html += '<div class=\"customizer-personalize-input-row\">';\n    html += '<input type=\"text\" class=\"customizer-personalize-input customizer-manual-text-input\"';\n    if (opts.isMain) {\n      html += ' data-main-manual-text=\"true\"';\n    }\n    if (opts.typeId) {\n      html += ' data-type-id=\"' + escapeHtml(String(opts.typeId)) + '\"';\n    }\n    if (opts.listIndex != null) {\n      html += ' data-list-index=\"' + opts.listIndex + '\"';\n    }\n    html +=\n      ' value=\"' +\n      escapeHtml(val) +\n      '\" maxlength=\"' +\n      maxLen +\n      '\" placeholder=\"' +\n      escapeHtml(placeholder) +\n      '\">';\n    html += '<span class=\"customizer-personalize-counter\">' + val.length + '/' + maxLen + '</span>';\n    html += '</div></div>';\n    return html;\n  }\n\n  function renderCustomizerOptionsGrid(state, config, customizations, typeLabel, typeKey, selectedOpt, isMain, listIndex, typeEntry, addonProduct) {\n    var html = '';\n    var apForGrid = addonProduct;\n    if (!apForGrid && listIndex != null && !isMain) {\n      var lineForGrid = state.addonList[listIndex];\n      apForGrid = lineForGrid && lineForGrid.entry && lineForGrid.entry.addonProduct;\n    }\n    var hideSectionLabel = usesPersonalizationInput(typeLabel, typeEntry, apForGrid);\n    var sectionLabel = isInitialCustomizerType(typeLabel, typeEntry) ? 'Initial' : typeLabel;\n    if (sectionLabel && String(sectionLabel).trim() && !hideSectionLabel) {\n      html += '<p class=\"customizer-field-label\">' + escapeHtml(toTitleCaseLabel(String(sectionLabel).trim())) + '</p>';\n    }\n    var isFontTab = isFontSelectionTab(typeLabel, typeEntry);\n    var fontStylePicker = usesFontStylePicker(typeLabel, typeEntry, apForGrid);\n    var pickerItems = fontStylePicker ? fontStylePickerOptions(customizations, typeLabel, typeEntry) : null;\n    var showLabel = optionGridShowsLabel(typeLabel, typeEntry);\n    var isLetterGrid = isInitialCustomizerType(typeLabel, typeEntry);\n    var isBirthstoneBarGrid = isBirthstoneBarType(typeLabel, typeEntry);\n\n    html +=\n      '<div class=\"customizer-options-grid' +\n      (fontStylePicker || isFontTab ? ' customizer-options-grid--font-select' : '') +\n      (isLetterGrid ? ' customizer-options-grid--letters' : '') +\n      '\">';\n\n    function renderOptionButton(o, displayName, isFontTile) {\n      var skipSelected =\n        isMain &&\n        (isFamilyBirthFlowerBouquetProduct(config) || isFamilyBirthstoneBarProduct(config));\n      var isSelected = false;\n      if (!skipSelected && selectedOpt) {\n        if (isLetterGrid && isFontTile) {\n          // Initial style tiles: match Font N, not the sample letter (Font 2 A vs Font 2 G).\n          var selNum = fontNumberFromOption(selectedOpt);\n          var tileNum = fontNumberFromOption(o);\n          isSelected = !!(selNum && tileNum && selNum === tileNum);\n        } else {\n          isSelected = optionMatchesSelection(o, selectedOpt);\n        }\n      }\n      var btnClass = 'customizer-option-btn' + (isSelected ? ' selected' : '');\n      var btnAttrs =\n        ' data-option-id=\"' +\n        escapeHtml(o.id) +\n        '\" data-option-name=\"' +\n        escapeHtml(o.name) +\n        '\" data-option-image=\"' +\n        escapeHtml(o.image || '') +\n        '\" data-option-type=\"' +\n        escapeHtml(o.type || '') +\n        '\"';\n      if (typeKey != null && (isMain || listIndex != null)) {\n        btnAttrs += ' data-type-id=\"' + escapeHtml(String(typeKey)) + '\"';\n      }\n      btnAttrs += optionFontDataAttr(o);\n      btnAttrs += optionColorDataAttr(o);\n      var tileLabel = displayName || getOptionGridDisplayName(o, typeLabel, typeEntry) || toTitleCaseLabel(o.name || '');\n      var familyBarPickCount =\n        isMain && isFamilyBirthstoneBarProduct(config)\n          ? countFamilyBirthstoneBarSelectionsForOption(state, o)\n          : 0;\n      html +=\n        '<div class=\"customizer-option-item' +\n        (isFontTile ? ' customizer-option-item--font' : '') +\n        (familyBarPickCount > 0 ? ' customizer-option-item--has-bar-count' : '') +\n        '\">';\n      html += '<button type=\"button\" class=\"' + btnClass + '\"';\n      if (isMain) {\n        html += ' data-main-option=\"true\"';\n      } else if (listIndex != null) {\n        html += ' data-addon-list-index=\"' + listIndex + '\"';\n      }\n      html += btnAttrs + '>';\n      // Live Abc for Name fonts only \u2014 Initial style tiles keep letter PNG thumbnails.\n      var useLiveFontSample = isFontTile && !isInitialCustomizerType(typeLabel, typeEntry);\n      if (useLiveFontSample) {\n        html += renderFontOptionVisual(o);\n      } else if (o.image && String(o.image).trim()) {\n        html += '<span class=\"customizer-option-btn-visual\"><img src=\"' + escapeHtml(o.image) + '\" alt=\"\"></span>';\n      } else if (isBirthstoneBarGrid && birthstoneBarColorFromOption(o)) {\n        html +=\n          '<span class=\"customizer-option-btn-visual customizer-option-btn-visual--birthstone-bar\">' +\n          renderBirthstoneBarDotsMarkup(birthstoneBarColorFromOption(o), 'grid') +\n          '</span>';\n      } else if (isFontTile) {\n        html += renderFontOptionVisual(o);\n      } else {\n        var gridLabel = getOptionGridDisplayName(o, typeLabel, typeEntry) || o.name;\n        html += '<span class=\"customizer-option-btn-visual\">' + escapeHtml(gridLabel) + '</span>';\n      }\n      html += '</button>';\n      if (familyBarPickCount > 0) {\n        html +=\n          '<span class=\"customizer-family-birthstone-bar-option-count\" aria-hidden=\"true\">' +\n          escapeHtml(String(familyBarPickCount)) +\n          '</span>';\n      }\n      if (tileLabel) {\n        html +=\n          '<span class=\"customizer-option-btn-label' +\n          (isFontTile ? ' customizer-option-btn-label--font' : '') +\n          '\">' +\n          escapeHtml(tileLabel) +\n          '</span>';\n      }\n      html += '</div>';\n    }\n\n    if (pickerItems && pickerItems.length) {\n      for (var pi = 0; pi < pickerItems.length; pi++) {\n        renderOptionButton(pickerItems[pi].option, pickerItems[pi].label, true);\n      }\n    } else {\n      var gridTypeLabel = isInitialCustomizerType(typeLabel, typeEntry) ? 'Initial' : typeLabel;\n      var useFontTabs = shouldGroupInitialsByFont(gridTypeLabel, customizations, typeEntry);\n      var visibleOptions = customizations;\n      if (useFontTabs) {\n        var groups = groupInitialCustomizationsByFont(customizations);\n        var activeGi = getActiveFontGroupIndex(state, typeKey, groups.length, selectedOpt, groups);\n        visibleOptions = (groups[activeGi] && groups[activeGi].options) ? groups[activeGi].options : customizations;\n      }\n      var selectedLetter = selectedLetterFromOption(selectedOpt);\n      var skipFamilySelected =\n        isMain &&\n        (isFamilyBirthFlowerBouquetProduct(config) || isFamilyBirthstoneBarProduct(config));\n      for (var c = 0; c < visibleOptions.length; c++) {\n        var o = visibleOptions[c];\n        var isSelected =\n          !skipFamilySelected &&\n          (optionMatchesSelection(o, selectedOpt) ||\n            !!(selectedLetter && selectedLetterFromOption(o) === selectedLetter));\n        if (showLabel && (o.image || isFontTab)) {\n          renderOptionButton(\n            o,\n            getOptionGridDisplayName(o, typeLabel, typeEntry) || toTitleCaseLabel(o.name || ''),\n            isFontTab\n          );\n          continue;\n        }\n        var btnClass = 'customizer-option-btn' + (isSelected ? ' selected' : '');\n        var btnAttrs =\n          ' data-option-id=\"' +\n          escapeHtml(o.id) +\n          '\" data-option-name=\"' +\n          escapeHtml(o.name) +\n          '\" data-option-image=\"' +\n          escapeHtml(o.image || '') +\n          '\" data-option-type=\"' +\n          escapeHtml(o.type || '') +\n          '\"';\n        if (typeKey != null && (isMain || listIndex != null)) {\n          btnAttrs += ' data-type-id=\"' + escapeHtml(String(typeKey)) + '\"';\n        }\n        btnAttrs += optionFontDataAttr(o);\n        btnAttrs += optionColorDataAttr(o);\n        html += '<button type=\"button\" class=\"' + btnClass + '\"';\n        if (isMain) {\n          html += ' data-main-option=\"true\"';\n        } else if (listIndex != null) {\n          html += ' data-addon-list-index=\"' + listIndex + '\"';\n        }\n        html += btnAttrs + '>';\n        if (o.image && String(o.image).trim()) {\n          html += '<span class=\"customizer-option-btn-visual\"><img src=\"' + escapeHtml(o.image) + '\" alt=\"\"></span>';\n        } else if (isBirthstoneBarGrid && birthstoneBarColorFromOption(o)) {\n          html +=\n            '<span class=\"customizer-option-btn-visual customizer-option-btn-visual--birthstone-bar\">' +\n            renderBirthstoneBarDotsMarkup(birthstoneBarColorFromOption(o), 'grid') +\n            '</span>';\n        } else {\n          var gridLabel = getOptionGridDisplayName(o, typeLabel, typeEntry) || o.name;\n          html += '<span class=\"customizer-option-btn-visual\">' + escapeHtml(gridLabel) + '</span>';\n        }\n        html += '</button>';\n      }\n    }\n\n    html += '</div>';\n    return html;\n  }\n\n  function CustomizerState(config) {\n    var mainCustomizer = config.main && config.main.customizer ? config.main.customizer : null;\n    var mainCustomizations = (mainCustomizer && mainCustomizer.customizations) ? mainCustomizer.customizations : [];\n    var mainType = (mainCustomizer && mainCustomizer.type) ? mainCustomizer.type : (mainCustomizations[0] && mainCustomizations[0].type) || '';\n    this.config = config;\n    this.main = {\n      variantId: config.main.variantId,\n      price: config.main.price,\n      title: config.main.title,\n      image: resolveProductImageUrl(config.main.image) || config.main.image || '',\n      customizationType: mainType,\n      selectedOption: null,\n      manualText: '',\n      selections: {},\n      manualByType: {},\n      flowerSelections: [],\n      birthstoneBarSelections: [],\n      option1: config.main.option1 != null ? config.main.option1 : '',\n      option2: config.main.option2 != null ? config.main.option2 : '',\n      option3: config.main.option3 != null ? config.main.option3 : ''\n    };\n    this.main.pageOptions = { option1: this.main.option1, option2: this.main.option2, option3: this.main.option3 };\n    this.mandatoryCount = resolveMandatoryAddonCount(config);\n    this.addonList = [];\n    this.activeAddonCatalogIndex = 0;\n    this.uiPanel = 'main';\n    this.uiAddonListIndex = null;\n    this.activeTypeTabIndex = 0;\n    this.activeAddonTypeTabIndex = 0;\n    this.activeFontGroupByType = {};\n    this.specialRequestEnabled = false;\n    this.specialRequestMessage = '';\n    this.proofEmail = '';\n    this.giftWrapEnabled = false;\n    this._giftWrapPrice = 0;\n    this._giftWrapAvailable = true;\n    this._giftWrapPriceReady = false;\n  }\n\n  CustomizerState.prototype.addAddonLine = function (groupKey, variantIdOverride, catalogIndexOverride) {\n    var catalog = getAddons(this.config);\n    if (!catalog.length) return -1;\n    // Only the first N list slots are mandatory \u2014 not every line that reuses catalog index 0.\n    var mandatory = this.addonList.length < this.mandatoryCount;\n    // Enforce custom.max_addons for optional (+) lines; still allow mandatory seeding.\n    if (!mandatory && !canAddMoreAddonLines(this, this.config)) return -1;\n    var savedPrior = [];\n    for (var si = 0; si < this.addonList.length; si++) {\n      savedPrior.push(snapshotAddonLineEntry(this.addonList[si].entry));\n    }\n    var idx =\n      catalogIndexOverride != null && !isNaN(catalogIndexOverride)\n        ? catalogIndexOverride\n        : this.activeAddonCatalogIndex;\n    if (idx < 0 || idx >= catalog.length) idx = 0;\n    if (groupKey && catalogIndexOverride == null) idx = findCatalogIndexForGroup(this.config, groupKey);\n    var addonProduct = catalog[idx];\n    if (!addonProduct) {\n      this.addonList.push({\n        addonIndex: idx,\n        customizationGroupKey: groupKey || null,\n        entry: {\n          addonProduct: null,\n          variantId: null,\n          variantPrice: 0,\n          sizeLabel: '',\n          customizationType: '',\n          selections: {},\n          manualByType: {},\n          mandatory: mandatory,\n          userEditedProductIds: {},\n          activePersonalizationMode: null\n        }\n      });\n      return this.addonList.length - 1;\n    }\n    var customizations = (addonProduct.customizer && addonProduct.customizer.customizations) ? addonProduct.customizer.customizations : [];\n    var variant =\n      (variantIdOverride != null ? findVariantById(addonProduct, variantIdOverride) : null) ||\n      findVariantMatchingMainFinish(addonProduct, this.config, this) ||\n      getDefaultVariant(addonProduct);\n    var typeName = (addonProduct.customizer && addonProduct.customizer.type) ? addonProduct.customizer.type : (customizations[0] && customizations[0].type) || '';\n    var key = getSizeOptionKeyStrict(addonProduct);\n    var sizeLabel = variant && key ? (variant[key] || '') : '';\n    var pickedSmallerSize = computePickedSmallerSize(addonProduct, variant);\n    this.addonList.push({\n      addonIndex: idx,\n      customizationGroupKey: groupKey || null,\n      entry: {\n        addonProduct: addonProduct,\n        variantId: variant ? variant.id : null,\n        variantPrice: variant ? variant.price : 0,\n        sizeLabel: sizeLabel,\n        pickedSmallerSize: pickedSmallerSize,\n        customizationType: typeName,\n        selections: {},\n        manualByType: {},\n        mandatory: mandatory,\n        userEditedProductIds: {},\n        activePersonalizationMode: personalizationModeFromAddonProduct(addonProduct) || null\n      }\n    });\n    for (var ri = 0; ri < savedPrior.length; ri++) {\n      if (this.addonList[ri] && this.addonList[ri].entry) {\n        restoreAddonLineEntry(this.addonList[ri].entry, savedPrior[ri]);\n      }\n    }\n    return this.addonList.length - 1;\n  };\n\n  CustomizerState.prototype.removeAddonLine = function (listIndex) {\n    if (listIndex < 0 || listIndex >= this.addonList.length) return;\n    this.addonList.splice(listIndex, 1);\n  };\n\n  CustomizerState.prototype.assignAddonLineToCatalogProduct = function (listIndex, catalogIndex) {\n    var catalog = getAddons(this.config);\n    if (listIndex < 0 || listIndex >= this.addonList.length) return;\n    if (catalogIndex < 0 || catalogIndex >= catalog.length) return;\n    var line = this.addonList[listIndex];\n    if (line.addonIndex === catalogIndex) return;\n    var addonProduct = catalog[catalogIndex];\n    var mandatory = listIndex < this.mandatoryCount;\n    if (!addonProduct) {\n      line.addonIndex = catalogIndex;\n      line.entry.addonProduct = null;\n      line.entry.variantId = null;\n      line.entry.variantPrice = 0;\n      line.entry.sizeLabel = '';\n      line.entry.customizationType = '';\n      line.entry.selections = {};\n      line.entry.manualByType = {};\n      line.entry.mandatory = mandatory;\n      return;\n    }\n    var customizations = (addonProduct.customizer && addonProduct.customizer.customizations) ? addonProduct.customizer.customizations : [];\n    var variant = findVariantMatchingMainFinish(addonProduct, this.config, this) || getDefaultVariant(addonProduct);\n    var typeName = (addonProduct.customizer && addonProduct.customizer.type) ? addonProduct.customizer.type : (customizations[0] && customizations[0].type) || '';\n    var key = getSizeOptionKeyStrict(addonProduct);\n    var sizeLabel = variant && key ? (variant[key] || '') : '';\n    line.addonIndex = catalogIndex;\n    line.entry.addonProduct = addonProduct;\n    line.entry.variantId = variant ? variant.id : null;\n    line.entry.variantPrice = variant ? variant.price : 0;\n    line.entry.sizeLabel = sizeLabel;\n    line.entry.customizationType = typeName;\n    line.entry.selections = {};\n    line.entry.manualByType = {};\n    line.entry.mandatory = mandatory;\n  };\n\n  CustomizerState.prototype.setUiMain = function () {\n    this.uiPanel = 'main';\n    this.uiAddonListIndex = null;\n    this.activeTypeTabIndex = 0;\n    this.activeAddonTypeTabIndex = 0;\n  };\n\n  CustomizerState.prototype.setUiAddonPick = function () {\n    this.uiPanel = 'addonPick';\n    this.uiAddonListIndex = null;\n  };\n\n  function applyDefaultsForAddonProductTab(state, listIndex, productTabIndex) {\n    if (!state || listIndex < 0 || listIndex >= state.addonList.length) return;\n    var line = state.addonList[listIndex];\n    var entry = line && line.entry;\n    if (!entry) return;\n    var pkgs = getAddonLinePackages(line, state.config, state);\n    var ap = null;\n    if (pkgs.length && productTabIndex >= 0 && productTabIndex < pkgs.length) {\n      ap = pkgs[productTabIndex].addonProduct;\n    }\n    if (!ap) ap = entry.addonProduct;\n    if (!ap) return;\n    var groupKey = line.customizationGroupKey || ensureAddonLineGroupKey(line, state.config);\n    applyDefaultAddonEntrySelections(entry, ap, state.config, state, groupKey);\n  }\n\n  CustomizerState.prototype.setUiAddon = function (listIndex, typeTabIndex) {\n    this.uiPanel = 'addon';\n    var prevList = this.uiAddonListIndex;\n    var prevTab = this.activeAddonTypeTabIndex;\n    this.uiAddonListIndex = listIndex;\n    if (typeof typeTabIndex === 'number' && !isNaN(typeTabIndex)) {\n      if (listIndex >= 0 && listIndex < this.addonList.length) {\n        var clampLn = this.addonList[listIndex];\n        var clampPkgs = getAddonLinePackages(clampLn, this.config, this);\n        if (clampPkgs.length && typeTabIndex >= clampPkgs.length) {\n          typeTabIndex = 0;\n        }\n      }\n      this.activeAddonTypeTabIndex = typeTabIndex;\n      // Font-style clicks also call setUiAddon \u2014 only clear/default when the product tab changes.\n      var tabChanged = prevList !== listIndex || prevTab !== typeTabIndex;\n      if (listIndex >= 0 && listIndex < this.addonList.length) {\n        var ent = this.addonList[listIndex].entry;\n        var ln = this.addonList[listIndex];\n        if (ent && ln) {\n          ent.lastAddonPreviewProductIndex = typeTabIndex;\n          if (tabChanged) {\n            clearInactiveAddonProductsOnLine(ent, ln, this.config, typeTabIndex, this);\n            var pkgs = getAddonLinePackages(ln, this.config, this);\n            var activeAp =\n              pkgs.length && typeTabIndex >= 0 && typeTabIndex < pkgs.length\n                ? pkgs[typeTabIndex].addonProduct\n                : ent.addonProduct;\n            if (activeAp) syncAddonEntryVariantForActiveProduct(ent, activeAp, this.config, this);\n            applyDefaultsForAddonProductTab(this, listIndex, typeTabIndex);\n          }\n        }\n      } else if (tabChanged) {\n        applyDefaultsForAddonProductTab(this, listIndex, typeTabIndex);\n      }\n    } else if (listIndex >= 0 && listIndex < this.addonList.length) {\n      var entRestore = this.addonList[listIndex].entry;\n      if (\n        entRestore &&\n        entRestore.lastAddonPreviewProductIndex != null &&\n        !isNaN(entRestore.lastAddonPreviewProductIndex)\n      ) {\n        var restorePkgs = getAddonLinePackages(this.addonList[listIndex], this.config, this);\n        var restoreTab = entRestore.lastAddonPreviewProductIndex;\n        if (restorePkgs.length && restoreTab >= restorePkgs.length) restoreTab = 0;\n        this.activeAddonTypeTabIndex = restoreTab;\n      }\n    }\n  };\n\n  CustomizerState.prototype.getAddonsList = function () {\n    return this.addonList.slice();\n  };\n\n  CustomizerState.prototype.getMainPrice = function () {\n    return Number(this.main.price) || 0;\n  };\n\n  CustomizerState.prototype.getExtraAddonsPrice = function () {\n    var sum = 0;\n    for (var i = 0; i < this.addonList.length; i++) {\n      var entry = this.addonList[i] && this.addonList[i].entry;\n      if (entry && entry.mandatory) continue;\n      sum += getAddonLineBundlePrice(this.addonList[i], this.config, this);\n    }\n    return sum;\n  };\n\n  CustomizerState.prototype.getTotalPrice = function () {\n    var total = this.getMainPrice() + this.getExtraAddonsPrice();\n    var gw = this.config && this.config.giftWrap;\n    if (\n      gw &&\n      gw.enable &&\n      this.giftWrapEnabled &&\n      gw.variantId &&\n      String(gw.variantId).trim() !== '' &&\n      this._giftWrapPriceReady &&\n      this._giftWrapAvailable !== false\n    ) {\n      var gwVid = parseGiftWrapVariantId(gw.variantId);\n      if (!gwVid || isNaN(gwVid) || !addonLinesIncludeVariantId(this, this.config, gwVid)) {\n        total += Number(this._giftWrapPrice) || 0;\n      }\n    }\n    return total;\n  };\n\n  function readVariantOptionFromPayload(variant, index) {\n    if (!variant) return null;\n    var key = 'option' + index;\n    if (variant[key] != null && String(variant[key]).trim() !== '') {\n      var direct = variant[key];\n      if (typeof direct === 'object' && direct !== null) {\n        if (direct.value != null) return String(direct.value);\n        if (direct.name != null) return String(direct.name);\n      }\n      return String(direct);\n    }\n    var opts = variant.options;\n    if (opts && opts[index - 1] != null && String(opts[index - 1]).trim() !== '') {\n      var item = opts[index - 1];\n      if (typeof item === 'object' && item !== null) {\n        if (item.value != null) return String(item.value);\n        if (item.name != null) return String(item.name);\n      }\n      return String(item);\n    }\n    return null;\n  }\n\n  /**\n   * Shopify variant JSON often has featured_image as an object `{ src }`, not a URL string.\n   * Coerce to a usable img src; reject empty / \"[object Object]\".\n   */\n  function resolveProductImageUrl(image) {\n    if (!image) return '';\n    if (typeof image === 'string') {\n      var s = String(image).trim();\n      if (!s || s === '[object Object]') return '';\n      return s;\n    }\n    if (typeof image === 'object') {\n      if (image.src != null && String(image.src).trim()) return String(image.src).trim();\n      if (image.url != null && String(image.url).trim()) return String(image.url).trim();\n    }\n    return '';\n  }\n\n  /** Header thumb: variant photo when available, else main product image from config. */\n  function getMainProductHeaderImage(state, config) {\n    return (\n      resolveProductImageUrl(state && state.main && state.main.image) ||\n      resolveProductImageUrl(config && config.main && config.main.image) ||\n      ''\n    );\n  }\n\n  function normalizeVariantPayload(v) {\n    if (!v) return v;\n    return {\n      id: v.id,\n      price: v.price,\n      available: v.available,\n      featured_image: resolveProductImageUrl(v.featured_image) || resolveProductImageUrl(v.image) || null,\n      image: resolveProductImageUrl(v.image) || resolveProductImageUrl(v.featured_image) || null,\n      option1: readVariantOptionFromPayload(v, 1) || '',\n      option2: readVariantOptionFromPayload(v, 2) || '',\n      option3: readVariantOptionFromPayload(v, 3) || ''\n    };\n  }\n\n  /** Clear all shopper choices; keep PDP variant/price on main. Re-seed metafield defaults. */\n  function resetCustomizerState(state, config) {\n    if (!state || !config) return;\n    state.main.selectedOption = null;\n    state.main.manualText = '';\n    state.main.selections = {};\n    state.main.manualByType = {};\n    state.main.flowerSelections = [];\n    state.main.birthstoneBarSelections = [];\n    state.addonList = [];\n    state.activeAddonCatalogIndex = 0;\n    state.uiPanel = 'main';\n    state.uiAddonListIndex = null;\n    state.activeTypeTabIndex = 0;\n    state.activeAddonTypeTabIndex = 0;\n    state.activeFontGroupByType = {};\n    state.giftWrapEnabled = false;\n    state._giftWrapPrice = 0;\n    state._giftWrapAvailable = true;\n    state._giftWrapPriceReady = false;\n    state.specialRequestEnabled = false;\n    state.specialRequestMessage = '';\n    state.proofEmail = '';\n    if (typeof window.detectCustomizerVariant === 'function') {\n      var v = window.detectCustomizerVariant();\n      if (v) state.setMainVariant(normalizeVariantPayload(v));\n    }\n    normalizeAddonLinesIfNeeded(state, config);\n    ensureMandatoryAddonLines(state, config);\n    ensureDefaultFontStyleSelectionsForState(state, config);\n  }\n\n  CustomizerState.prototype.setMainVariant = function (variant) {\n    if (!variant) return;\n    var prevPageOptions = this.main.pageOptions;\n    if (variant.id != null) this.main.variantId = variant.id;\n    if (variant.price != null) this.main.price = variant.price;\n    var o1 = readVariantOptionFromPayload(variant, 1);\n    var o2 = readVariantOptionFromPayload(variant, 2);\n    var o3 = readVariantOptionFromPayload(variant, 3);\n    if (o1 != null) this.main.option1 = o1;\n    if (o2 != null) this.main.option2 = o2;\n    if (o3 != null) this.main.option3 = o3;\n    this.main.pageOptions = { option1: this.main.option1, option2: this.main.option2, option3: this.main.option3 };\n    adoptMainVariantDrivenValuesFromPage(this.config, this, prevPageOptions);\n    var nextImage =\n      resolveProductImageUrl(variant.featured_image) || resolveProductImageUrl(variant.image);\n    if (nextImage) {\n      this.main.image = nextImage;\n    } else if (this.config && this.config.main && this.config.main.image) {\n      // Keep the main product image \u2014 never leave a broken/[object Object] src.\n      this.main.image = resolveProductImageUrl(this.config.main.image) || this.config.main.image;\n    }\n    remapFinishSensitiveSelections(this.config, this);\n    for (var i = 0; i < this.addonList.length; i++) {\n      var line = this.addonList[i];\n      var entry = line.entry;\n      var addon = entry.addonProduct;\n      if (!addon) continue;\n      var sizeLabel = getAddonLineSizeLabel(entry, addon) || (entry.sizeLabel && String(entry.sizeLabel).trim()) || '';\n      var matchingVariant =\n        sizeLabel && hasSizeOption(addon)\n          ? findVariantMatchingMainFinishPreservingSize(addon, this.config, this, sizeLabel)\n          : findVariantMatchingMainFinish(addon, this.config, this) || getDefaultVariant(addon);\n      if (matchingVariant) {\n        entry.variantId = matchingVariant.id;\n        if (sizeLabel && hasSizeOption(addon)) {\n          var key = getSizeOptionKeyStrict(addon);\n          entry.sizeLabel = key ? (matchingVariant[key] || '') : '';\n        }\n      }\n      entry.variantPrice = getAddonLineBundlePrice(line, this.config, this);\n    }\n    applyMainVariantDrivenSelections(this.config, this);\n  };\n\n  CustomizerState.prototype.setAddonVariant = function (listIndex, variant) {\n    if (listIndex < 0 || listIndex >= this.addonList.length) return;\n    var e = this.addonList[listIndex].entry;\n    if (!e.addonProduct) return;\n    e.variantId = variant.id;\n    e.variantPrice = variant.price;\n    var key = getSizeOptionKeyStrict(e.addonProduct);\n    e.sizeLabel = key ? (variant[key] || '') : '';\n  };\n\n  CustomizerState.prototype.setAddonOption = function (listIndex, option) {\n    if (listIndex < 0 || listIndex >= this.addonList.length) return;\n    var ap = this.addonList[listIndex].entry && this.addonList[listIndex].entry.addonProduct;\n    if (!ap) return;\n    this.setAddonSelection(listIndex, addonFlatSelectionKey(ap), option);\n  };\n\n  CustomizerState.prototype.setAddonManualText = function (listIndex, text) {\n    if (listIndex < 0 || listIndex >= this.addonList.length) return;\n    var ap = this.addonList[listIndex].entry && this.addonList[listIndex].entry.addonProduct;\n    if (!ap) return;\n    this.setAddonManualForType(listIndex, addonFlatSelectionKey(ap), text);\n  };\n\n  CustomizerState.prototype.setMainOption = function (option) {\n    this.main.selectedOption = option || null;\n  };\n\n  CustomizerState.prototype.setMainSelection = function (typeId, option) {\n    if (!this.main.selections) this.main.selections = {};\n    this.main.selections[String(typeId)] = option || null;\n    this.main.selectedOption = option || null;\n    applyMainVariantDrivenSelections(this.config, this);\n  };\n\n  CustomizerState.prototype.addFamilyFlower = function (option) {\n    if (!this.main.flowerSelections) this.main.flowerSelections = [];\n    if (!option) return;\n    if (this.main.flowerSelections.length >= FAMILY_BOUQUET_MAX_FLOWERS) return;\n    this.main.flowerSelections.push(cloneStoredOption(option));\n  };\n\n  CustomizerState.prototype.removeFamilyFlower = function (index) {\n    if (!this.main.flowerSelections || !this.main.flowerSelections.length) return;\n    var i = parseInt(index, 10);\n    if (isNaN(i) || i < 0 || i >= this.main.flowerSelections.length) return;\n    this.main.flowerSelections.splice(i, 1);\n  };\n\n  CustomizerState.prototype.addFamilyBirthstoneBar = function (option, maxPicks) {\n    if (!this.main.birthstoneBarSelections) this.main.birthstoneBarSelections = [];\n    if (!option) return;\n    var max =\n      maxPicks != null && !isNaN(maxPicks) ? maxPicks : FAMILY_BIRTHSTONE_BAR_MAX_NECKLACE;\n    if (this.main.birthstoneBarSelections.length >= max) return;\n    this.main.birthstoneBarSelections.push(cloneStoredOption(option));\n  };\n\n  CustomizerState.prototype.removeFamilyBirthstoneBar = function (index) {\n    if (!this.main.birthstoneBarSelections || !this.main.birthstoneBarSelections.length) return;\n    var i = parseInt(index, 10);\n    if (isNaN(i) || i < 0 || i >= this.main.birthstoneBarSelections.length) return;\n    this.main.birthstoneBarSelections.splice(i, 1);\n  };\n\n  CustomizerState.prototype.setMainManualText = function (text) {\n    this.main.manualText = text || '';\n  };\n\n  CustomizerState.prototype.setMainManualForType = function (typeId, text) {\n    if (!this.main.manualByType) this.main.manualByType = {};\n    this.main.manualByType[String(typeId)] = text || '';\n    this.main.manualText = text || '';\n  };\n\n  CustomizerState.prototype.setAddonSelection = function (listIndex, typeId, option) {\n    if (listIndex < 0 || listIndex >= this.addonList.length) return;\n    var line = this.addonList[listIndex];\n    var e = line.entry;\n    if (!e.selections) e.selections = {};\n    var key = String(typeId);\n    var apMark = getAddonProductForSelectionKey(this, this.config, listIndex, key);\n    var found = findTypeEntryOnProduct(apMark || e.addonProduct, key);\n    var storeOpt = cloneStoredOption(option);\n    // Font-style tile click: store \"Font N {typedLetter}\" so preview is always that PNG.\n    if (found && option && apMark) {\n      var teLab = found.typeEntry.typeLabel || found.typeEntry.tabTitle || '';\n      if (isInitialCustomizerType(teLab, found.typeEntry)) {\n        var gItemRemap = makeAddonGroupedItem(found.typeEntry, found.typeIndex, apMark);\n        var typed = getAddonEntryManualText(e, gItemRemap, apMark);\n        if (initialTagLetterFromManualText(typed)) {\n          var letterRow = resolveInitialPreviewLetterOption(\n            this.config,\n            this,\n            apMark,\n            found.typeEntry,\n            line.customizationGroupKey || ensureAddonLineGroupKey(line, this.config),\n            typed,\n            option,\n            option\n          );\n          if (letterRow && letterOptionHasImage(letterRow)) {\n            storeOpt = cloneStoredOption(letterRow);\n          }\n        }\n      }\n    }\n    e.selections[key] = storeOpt;\n    var parsed = parseGroupedAddonSelectionKey(key);\n    if (parsed.productId && parsed.baseKey && e.selections[parsed.baseKey]) {\n      delete e.selections[parsed.baseKey];\n    }\n    if (apMark) markAddonProductUserEdited(e, apMark);\n    if (e.mandatory) applyMainVariantDrivenSelections(this.config, this);\n    if (apMark && e.addonProduct && String(apMark.id) === String(e.addonProduct.id)) {\n      var drivenVariant = resolveAddonProductVariantForLine(e, apMark, this.config, this);\n      if (drivenVariant) {\n        e.variantId = drivenVariant.id;\n        e.variantPrice = Number(drivenVariant.price) || 0;\n      }\n    }\n    if (found) {\n      var gItem = makeAddonGroupedItem(found.typeEntry, found.typeIndex, apMark || e.addonProduct);\n      var pMode = personalizationModeForGroupedItem(gItem);\n      if (pMode) clearExclusivePersonalizationOnLine(e, line, this.config, pMode);\n      clearConflictingGroupedSelections(e, line, this.config, gItem);\n    }\n    if (parsed.productId) {\n      var products = getAddonLineGroupedProducts(line, this.config);\n      for (var pi = 0; pi < products.length; pi++) {\n        var pap = products[pi].addonProduct;\n        if (pap && String(pap.id) === String(parsed.productId)) {\n          e.lastAddonPreviewProductIndex = pi;\n          break;\n        }\n      }\n    }\n  };\n\n  CustomizerState.prototype.setAddonManualForType = function (listIndex, typeId, text) {\n    if (listIndex < 0 || listIndex >= this.addonList.length) return;\n    var line = this.addonList[listIndex];\n    var e = line.entry;\n    if (!e.manualByType) e.manualByType = {};\n    e.manualByType[String(typeId)] = text || '';\n    var apMark = getAddonProductForSelectionKey(this, this.config, listIndex, typeId);\n    if (apMark) markAddonProductUserEdited(e, apMark);\n    else if (e.addonProduct) markAddonProductUserEdited(e, e.addonProduct);\n    var foundM = findTypeEntryOnProduct(apMark || e.addonProduct, typeId);\n    if (foundM) {\n      var gItemM = makeAddonGroupedItem(foundM.typeEntry, foundM.typeIndex, apMark || e.addonProduct);\n      var pModeM = personalizationModeForGroupedItem(gItemM);\n      if (pModeM) clearExclusivePersonalizationOnLine(e, line, this.config, pModeM);\n    }\n  };\n\n  function escapeHtml(s) {\n    if (s == null) return '';\n    var div = document.createElement('div');\n    div.textContent = s;\n    return div.innerHTML;\n  }\n\n  function formatPriceCents(cents) {\n    return (Number(cents) / 100).toFixed(2);\n  }\n\n  function renderAddonPreviewPriceMarkup(line, config, state) {\n    var cents = getAddonLineBundlePrice(line, config, state);\n    return '<span class=\"customizer-preview-addon-price\">+ $' + formatPriceCents(cents) + '</span>';\n  }\n\n  function getShopifyRoot() {\n    var root = (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) != null ? String(window.Shopify.routes.root) : '';\n    if (!root) root = '/';\n    else if (root.slice(-1) !== '/') root += '/';\n    return root;\n  }\n\n  function parseGiftWrapVariantId(raw) {\n    if (raw == null || raw === '') return NaN;\n    return parseInt(String(raw).trim(), 10);\n  }\n\n  function fetchGiftWrapVariant(state, callback) {\n    function markReady() {\n      state._giftWrapPriceReady = true;\n      if (callback) callback();\n    }\n    var gw = state.config && state.config.giftWrap;\n    if (!gw || !gw.enable || !gw.variantId || String(gw.variantId).trim() === '') {\n      state._giftWrapPrice = 0;\n      state._giftWrapAvailable = true;\n      markReady();\n      return;\n    }\n    var vid = parseGiftWrapVariantId(gw.variantId);\n    if (!vid || isNaN(vid)) {\n      state._giftWrapPrice = 0;\n      state._giftWrapAvailable = false;\n      markReady();\n      return;\n    }\n    state._giftWrapPriceReady = false;\n    fetch(getShopifyRoot() + 'variants/' + vid + '.js', { credentials: 'same-origin' })\n      .then(function (res) {\n        if (!res.ok) throw new Error('fetch variant');\n        return res.json();\n      })\n      .then(function (variant) {\n        state._giftWrapPrice = variant.price || 0;\n        state._giftWrapAvailable = variant.available !== false;\n      })\n      .catch(function () {\n        state._giftWrapPrice = 0;\n        state._giftWrapAvailable = false;\n      })\n      .then(markReady);\n  }\n\n  /** Footer checkbox labels \u2014 short, no trailing punctuation. */\n  function formatExtraCheckLabel(raw) {\n    var s = String(raw || '').trim();\n    s = s.replace(/^(add\\s+)/i, '');\n    s = s.replace(/[?:!.\\s]+$/g, '').trim();\n    if (!s) return '';\n    return s.charAt(0).toUpperCase() + s.slice(1);\n  }\n\n  /** Bold price beside gift wrap label (no parentheses). */\n  function giftWrapPriceLabelHtml(state) {\n    if (!state._giftWrapPriceReady || state._giftWrapAvailable === false) return '';\n    var cents = Number(state._giftWrapPrice);\n    if (isNaN(cents)) return '';\n    return (\n      ' <strong class=\"customizer-toggle-price\">+$' + escapeHtml(formatPriceCents(cents)) + '</strong>'\n    );\n  }\n\n  function renderGiftWrapCheckLabelHtml(config, state) {\n    var gw = (config && config.giftWrap) || {};\n    return escapeHtml(formatExtraCheckLabel(gw.label || 'Gift wrap')) + giftWrapPriceLabelHtml(state);\n  }\n\n  function updateGiftWrapLabelInDrawer(drawer, state, config) {\n    if (!drawer) return;\n    var el = drawer.querySelector('[data-customizer-gift-wrap-label]');\n    if (!el) return;\n    el.innerHTML = renderGiftWrapCheckLabelHtml(config, state);\n  }\n\n  function getMainOptionsLabel(state, config) {\n    var optionNames = (config.main && config.main.options) ? config.main.options : [];\n    var parts = [];\n    for (var i = 0; i < optionNames.length; i++) {\n      var val = state.main['option' + (i + 1)];\n      if (val != null && String(val).trim() !== '') {\n        parts.push(escapeHtml(String(optionNames[i]).trim()) + ': ' + escapeHtml(String(val).trim()));\n      }\n    }\n    return parts.length ? parts.join(', ') : '';\n  }\n\n  function renderPreviewChipInnerMarkup(disp, opt, isText, shapeMod, fontOpt, typeEntry, groupTitle, previewAssets) {\n    var typeName = (disp && disp.typeName) ? disp.typeName : '';\n    var previewConfig = previewAssets && previewAssets.config;\n    var previewState = previewAssets && previewAssets.state;\n    var previewAp = previewAssets && previewAssets.addonProduct;\n\n    if (isBirthFlowerPreviewContext(typeName, typeEntry, groupTitle, opt)) {\n      var flowerImg = resolveOptionOverlayImage(opt, typeEntry, previewAp, previewConfig, previewState);\n      if (flowerImg) {\n        return '<img src=\"' + escapeHtml(flowerImg) + '\" alt=\"\" class=\"customizer-preview-option-img\">';\n      }\n      return '';\n    }\n\n    if (\n      isBirthstoneBarType(typeName, typeEntry) ||\n      shapeKindFromCustomizationGroupTitle(groupTitle) === 'birthstone-bar'\n    ) {\n      return renderBirthstoneBarPreviewInnerMarkup(\n        previewConfig,\n        previewState,\n        typeEntry,\n        typeName,\n        groupTitle,\n        opt\n      );\n    }\n\n    if (\n      isBirthstonePreviewContext(typeName, typeEntry, groupTitle, shapeMod, previewAssets) ||\n      shapeKindFromCustomizationGroupTitle(groupTitle) === 'birthstone'\n    ) {\n      var birthstoneImg = resolveBirthstonePreviewImage(\n        opt,\n        previewConfig,\n        previewState,\n        typeEntry,\n        previewAp,\n        isText,\n        typeName,\n        groupTitle\n      );\n      if (birthstoneImg) {\n        return '<img src=\"' + escapeHtml(birthstoneImg) + '\" alt=\"\" class=\"customizer-preview-birthstone-img\">';\n      }\n      return '';\n    }\n\n    // Disc Initial + Initial Tag: typed letter + Font N \u2192 \"Font N X\" PNG.\n    // Never use Name fontUrl / live-text here \u2014 initials are images only.\n    if (\n      isInitialCustomizerType(typeName, typeEntry) ||\n      isInitialTagShapeMod(shapeMod) ||\n      (previewAp && isInitialAddonProduct(previewAp))\n    ) {\n      var charmText = disp && String(disp.manualText || '').trim();\n      if (!charmText) return '';\n      var charmFont = fontOpt || opt;\n      if (charmFont && customizationHasFontUrl(charmFont) && !letterOptionHasImage(charmFont)) {\n        // Name font accidentally passed in \u2014 ignore it; use letter PNG catalog only.\n        charmFont = letterOptionHasImage(opt) ? opt : null;\n      }\n      var charmLetterOpt = resolveInitialPreviewLetterOption(\n        previewConfig,\n        previewState,\n        previewAp,\n        typeEntry,\n        previewAssets && previewAssets.groupKey,\n        charmText,\n        charmFont || opt,\n        opt\n      );\n      if (!(charmLetterOpt && letterOptionHasImage(charmLetterOpt)) && letterOptionHasImage(charmFont)) {\n        charmLetterOpt = charmFont;\n      }\n      if (!(charmLetterOpt && letterOptionHasImage(charmLetterOpt)) && letterOptionHasImage(opt)) {\n        charmLetterOpt = opt;\n      }\n      if (charmLetterOpt && letterOptionHasImage(charmLetterOpt)) {\n        var stampClass =\n          isInitialTagShapeMod(shapeMod) || (previewAp && isInitialTagAddonProduct(previewAp))\n            ? 'customizer-preview-option-img customizer-preview-initial-tag-letter-img'\n            : 'customizer-preview-option-img';\n        return (\n          '<img src=\"' +\n          escapeHtml(normalizeCustomizerAssetUrl(charmLetterOpt.image)) +\n          '\" alt=\"\" class=\"' +\n          stampClass +\n          '\">'\n        );\n      }\n      // No PNG found \u2014 plain letter glyph (never a Name webfont).\n      var charmFallback = String(charmText).charAt(0).toUpperCase();\n      return renderPreviewTextSpan(\n        charmFallback,\n        shapeMod || ' customizer-preview-item--shape-initial-tag',\n        null\n      );\n    }\n\n    // Name (Tag or Disc): live text + fontUrl only \u2014 never Initial letter PNGs.\n    // Driven by custom.customizer type Name, not product title alone.\n    if (\n      isNameCustomizerType(typeName, typeEntry) ||\n      (previewAp && isNameAddonProduct(previewAp) && !isInitialCustomizerType(typeName, typeEntry))\n    ) {\n      var nameShape =\n        shapeMod ||\n        (previewAp && isDiscSilhouetteAddonProduct(previewAp)\n          ? ' customizer-preview-item--shape-disc'\n          : ' customizer-preview-item--shape-rect');\n      var nameText = disp && String(disp.manualText || '').trim();\n      if (!nameText) return '';\n      var nameFont = fontOpt || opt;\n      if (nameFont && letterOptionHasImage(nameFont) && !customizationHasFontUrl(nameFont)) {\n        nameFont = customizationHasFontUrl(opt) ? opt : null;\n      }\n      return renderPreviewTextSpan(nameText, nameShape, nameFont);\n    }\n    var finishOpt =\n      previewConfig && previewState\n        ? resolveFinishSensitivePreviewOption(opt, previewConfig, previewState, typeEntry, previewAp)\n        : opt;\n    if (previewOverlayUsesSymbolImg(finishOpt, typeEntry, groupTitle) && finishOpt && finishOpt.image) {\n      return '<img src=\"' + escapeHtml(finishOpt.image) + '\" alt=\"\" class=\"customizer-preview-symbol-img\">';\n    }\n    var overlayImg = resolveOptionOverlayImage(finishOpt || opt, typeEntry, previewAp, previewConfig, previewState);\n    if (overlayImg && !isText && !previewShapeUsesTagFont(shapeMod)) {\n      return '<img src=\"' + escapeHtml(overlayImg) + '\" alt=\"\" class=\"customizer-preview-option-img\">';\n    }\n    if (\n      previewShapeUsesTagFont(shapeMod) &&\n      finishOpt &&\n      finishOpt.fontUrl &&\n      finishOpt.name &&\n      !isText &&\n      !(previewAp && (isNameAddonProduct(previewAp) || isInitialAddonProduct(previewAp))) &&\n      !isInitialTagShapeMod(shapeMod)\n    ) {\n      var tagDisplayName = isInitialOrNameType(typeName) ? cleanInitialOptionName(finishOpt.name) : finishOpt.name;\n      return renderPreviewTextSpan(tagDisplayName, shapeMod, finishOpt);\n    }\n    if (\n      isText &&\n      !(previewAp && (isNameAddonProduct(previewAp) || isInitialAddonProduct(previewAp))) &&\n      !isInitialTagShapeMod(shapeMod) &&\n      !isNameCustomizerType(typeName, typeEntry)\n    ) {\n      return renderPreviewTextSpan(disp.manualText, shapeMod, fontOpt || null);\n    }\n    if (opt && opt.name) {\n      var displayName = isInitialOrNameType(typeName) ? cleanInitialOptionName(opt.name) : opt.name;\n      if (previewShapeUsesTagFont(shapeMod) && opt.fontUrl) {\n        return renderPreviewTextSpan(displayName, shapeMod, opt);\n      }\n      return '<span class=\"customizer-preview-text\">' + escapeHtml(displayName) + '</span>';\n    }\n    return '';\n  }\n\n  function renderMainPreviewChipInner(disp, opt, isText, shapeMod, fontOpt, typeEntry, previewAssets) {\n    var mainGroupTitle = (typeEntry && typeEntry.customizationGroupTitle) || null;\n    return (\n      '<div class=\"customizer-preview-item-inner\">' +\n      renderPreviewChipInnerMarkup(disp, opt, isText, shapeMod, fontOpt, typeEntry, mainGroupTitle, previewAssets) +\n      '</div>'\n    );\n  }\n\n  function renderFamilyBirthstoneBarPreview(state, config) {\n    var t = getCustomizerTranslations(config);\n    var picks = getFamilyBirthstoneBarSelections(state);\n    var isEmpty = !picks.length;\n    var html = '<div class=\"customizer-family-birthstone-bar-preview\" data-family-birthstone-bar-preview>';\n    html += '<div class=\"customizer-family-birthstone-bar-preview-bar-wrap\">';\n    html +=\n      '<div class=\"customizer-preview-item customizer-preview-item--birthstone-bar customizer-preview-item--main' +\n      (isEmpty ? ' customizer-family-birthstone-bar-preview-item--empty' : '') +\n      '\">';\n    html += '<div class=\"customizer-preview-item-inner\">';\n    if (isEmpty) {\n      html +=\n        '<span class=\"customizer-family-birthstone-bar-empty\">' +\n        escapeHtml(t.select_birthstone_bar_below || 'Select birthstones below') +\n        '</span>';\n    } else {\n      html += renderFamilyBirthstoneBarSegmentedPreviewMarkup(picks, config, state);\n    }\n    html += '</div></div></div>';\n    html += '</div>';\n    return html;\n  }\n\n  function renderFamilyBouquetPreview(state, config) {\n    var t = getCustomizerTranslations(config);\n    var flowers = getFamilyFlowerSelections(state);\n    var mainGold = isMainGold(config, state);\n    var metal = mainGold\n      ? ' customizer-preview-item--symbol-gold'\n      : ' customizer-preview-item--symbol-silver';\n    var html = '<div class=\"customizer-family-bouquet-preview\" data-family-bouquet-preview>';\n    if (!flowers.length) {\n      html +=\n        '<div class=\"customizer-family-bouquet-empty\">' +\n        escapeHtml(t.select_flowers_below || 'Select flowers below') +\n        '</div>';\n    } else {\n      for (var i = 0; i < flowers.length; i++) {\n        var sel = flowers[i];\n        html +=\n          '<div class=\"customizer-family-bouquet-flower customizer-preview-item--shape-bloom-circle' +\n          metal +\n          '\">';\n        html += '<div class=\"customizer-family-bouquet-flower-image customizer-preview-item-inner\">';\n        if (sel && sel.image) {\n          html +=\n            '<img src=\"' +\n            escapeHtml(sel.image) +\n            '\" alt=\"\" class=\"customizer-preview-option-img\">';\n        }\n        html += '</div>';\n        html +=\n          '<button type=\"button\" class=\"customizer-family-bouquet-flower-remove\" data-family-flower-remove=\"' +\n          i +\n          '\" aria-label=\"Remove flower\">&times;</button>';\n        html += '</div>';\n      }\n    }\n    html += '</div>';\n    return html;\n  }\n\n  /**\n   * Preview silhouette for one main customizer type.\n   * Uses only that type\u2019s labels \u2014 never the product title (e.g. \u201CInitial and Birthstone\n   * Necklace\u201D would otherwise mark the Initial chip as birthstone).\n   * Charm variant (Rectangle Tag / Round Disc) overrides type defaults \u2014 same source as Size.\n   * Product title/handle with Tag or Disc sets silhouette the same way (Tag \u2192 bar, Disc \u2192 disc).\n   */\n  function mainTypePreviewShapeMod(config, typeEntry, typeName, state) {\n    var isBracelet = isMainProductBraceletFromConfig(config);\n    var shapeMod = previewStripShapeModFromStrings(\n      isBracelet,\n      typeName,\n      typeEntry && typeEntry.tabTitle,\n      typeEntry && typeEntry.typeLabel,\n      typeEntry && typeEntry.customizationGroupTitle\n    );\n    var birthstoneMod = birthstonePreviewShapeMod(\n      typeName,\n      typeEntry,\n      typeEntry && typeEntry.customizationGroupTitle,\n      null\n    );\n    if (birthstoneMod) return birthstoneMod;\n    var variantShape = getMainVariantShapeKind(config, state);\n    var fromCharm = previewShapeModFromVariantShapeKind(variantShape, typeName, typeEntry);\n    if (fromCharm) return fromCharm;\n    // Product name/handle contains Tag or Disc \u2192 same silhouette as Charm / disc PDP logic.\n    var titleShape = mainProductTitleShapeKind(config);\n    var fromTitle = previewShapeModFromVariantShapeKind(titleShape, typeName, typeEntry);\n    if (fromTitle) return fromTitle;\n    if (isInitialTagType(typeName, typeEntry)) {\n      return ' customizer-preview-item--shape-initial-tag';\n    }\n    if (isInitialCustomizerType(typeName, typeEntry) || isSymbolType(typeName)) {\n      return ' customizer-preview-item--shape-disc';\n    }\n    // Name on a Disc PDP (title/handle / Disc Size option) \u2192 disc silhouette.\n    if (\n      isNameCustomizerType(typeName, typeEntry) &&\n      (mainProductHasSizeOption(config) ||\n        isDiscSilhouetteAddonProduct(config && config.main) ||\n        (config &&\n          config.main &&\n          (String(config.main.title || '').toLowerCase().indexOf('disc') !== -1 ||\n            String(config.main.handle || '').toLowerCase().indexOf('disc') !== -1)))\n    ) {\n      return ' customizer-preview-item--shape-disc';\n    }\n    if (shapeMod) return shapeMod;\n    // Baby bloom / product-level shapes only when the type itself did not decide.\n    return previewStripShapeModFromStrings(\n      isBracelet,\n      config && config.main && config.main.title,\n      config && config.main && config.main.handle\n    );\n  }\n\n  function renderMainPreviewChips(state, config) {\n    if (isFamilyBirthFlowerBouquetProduct(config)) {\n      return renderFamilyBouquetPreview(state, config);\n    }\n    if (isFamilyBirthstoneBarProduct(config)) {\n      return renderFamilyBirthstoneBarPreview(state, config);\n    }\n    // Empty main + mandatory charm: strip comes from the mandatory add-on line only.\n    if (!mainUsesTypeTabs(config) && (state.mandatoryCount || 0) > 0) return '';\n    var mainGold = isMainGold(config, state);\n    var mainDiscPx = previewDiscPxForMain(state, config);\n    var html = '';\n    var mainPreviewAssets = { config: config, state: state, addonProduct: null };\n    if (mainUsesTypeTabs(config)) {\n      var types = getMainCustomizerTypes(config);\n      for (var ti = 0; ti < types.length; ti++) {\n        var disp = pickMainTypePreview(state, config, ti);\n        var opt = disp.opt ? mergeMainCatalogFields(disp.opt, config) : null;\n        var typeName = disp.typeName || '';\n        var isText = disp.isText;\n        var shapeMod = mainTypePreviewShapeMod(config, types[ti], typeName, state);\n        var symbolMod = previewMetalModifier(mainGold, shapeMod, mainPreviewWantsMetal(typeName, types[ti], opt));\n        var focusClass = state.uiPanel === 'main' && state.activeTypeTabIndex === ti ? ' is-focus' : '';\n        var aria = types[ti].tabTitle || types[ti].typeLabel || ('Customization ' + (ti + 1));\n        var isDiscChip = shapeMod.indexOf('shape-disc') !== -1;\n        var chipDiscPx = isDiscChip ? mainDiscPx : null;\n        var blankCompact = !isDiscChip && mainPreviewUsesCompactBlank(config, state, shapeMod);\n        html +=\n          '<button type=\"button\" class=\"customizer-preview-item customizer-preview-item--main customizer-preview-chip' +\n          symbolMod +\n          shapeMod +\n          (blankCompact ? ' customizer-preview-item--addon-blank-compact' : '') +\n          focusClass +\n          '\"' +\n          discPreviewStyleAttr(chipDiscPx) +\n          ' data-focus-main-type=\"' +\n          ti +\n          '\" aria-label=\"Edit ' +\n          escapeHtml(aria) +\n          '\">';\n        var fontOptTab = null;\n        if (isInitialCustomizerType(typeName, types[ti])) {\n          // Initials: font style tile for letter PNG lookup \u2014 never Name webfont on the disc.\n          fontOptTab = (state.main.selections && state.main.selections[typeEntryKey(types[ti], ti)]) || opt;\n        } else if (isText) {\n          fontOptTab = getSelectedMainFontOption(state, config);\n          if ((!fontOptTab || !fontOptTab.fontUrl) && opt) {\n            var mergedFontRow = mergeFontUrlFromMainCatalog(opt, config);\n            if (mergedFontRow && mergedFontRow.fontUrl) fontOptTab = mergedFontRow;\n          }\n        }\n        html += renderMainPreviewChipInner(disp, opt, isText, shapeMod, fontOptTab, types[ti], mainPreviewAssets);\n        html += '</button>';\n      }\n      return html;\n    }\n    var disp = pickMainPreviewDisplay(state, config);\n    var opt = disp.opt ? mergeMainCatalogFields(disp.opt, config) : null;\n    var isText = disp.isText;\n    var typeName = disp.typeName || '';\n    var mainTypesFlat = getMainCustomizerTypes(config);\n    var mainTypeEntryFlat = null;\n    for (var mtf = 0; mtf < mainTypesFlat.length; mtf++) {\n      var mte = mainTypesFlat[mtf];\n      if (isBirthstoneType(typeName, mte) || mte.typeLabel === typeName || mte.tabTitle === typeName) {\n        mainTypeEntryFlat = mte;\n        break;\n      }\n    }\n    if (!mainTypeEntryFlat && mainTypesFlat.length === 1) mainTypeEntryFlat = mainTypesFlat[0];\n    var shapeMod = mainTypePreviewShapeMod(config, mainTypeEntryFlat, typeName, state);\n    // Standalone Disc/Tag PDP with no type tabs \u2014 silhouette from Size/title when Charm didn't decide.\n    if (!shapeMod) {\n      var flatTitleShape = mainProductTitleShapeKind(config);\n      if (flatTitleShape === 'tag' || getMainVariantShapeKind(config, state) === 'tag') {\n        shapeMod = previewShapeModFromVariantShapeKind('tag', typeName, mainTypeEntryFlat);\n      } else if (\n        getMainVariantShapeKind(config, state) !== 'tag' &&\n        (flatTitleShape === 'disc' ||\n          (mainProductHasSizeOption(config) &&\n            (isDiscSilhouetteAddonProduct(config.main) ||\n              String((config.main && config.main.title) || '')\n                .toLowerCase()\n                .indexOf('disc') !== -1)))\n      ) {\n        shapeMod = ' customizer-preview-item--shape-disc';\n      }\n    }\n    var symbolMod = previewMetalModifier(mainGold, shapeMod, mainPreviewWantsMetal(typeName, mainTypeEntryFlat, opt));\n    var focusClass = state.uiPanel === 'main' ? ' is-focus' : '';\n    var isDiscChipFlat = shapeMod.indexOf('shape-disc') !== -1;\n    var chipDiscPxFlat = isDiscChipFlat ? mainDiscPx : null;\n    var blankCompactFlat = !isDiscChipFlat && mainPreviewUsesCompactBlank(config, state, shapeMod);\n    html +=\n      '<button type=\"button\" class=\"customizer-preview-item customizer-preview-item--main customizer-preview-chip' +\n      symbolMod +\n      shapeMod +\n      (blankCompactFlat ? ' customizer-preview-item--addon-blank-compact' : '') +\n      focusClass +\n      '\"' +\n      discPreviewStyleAttr(chipDiscPxFlat) +\n      ' data-focus-main=\"true\" aria-label=\"Edit main customization\">';\n    var fontOptSingle = null;\n    if (isInitialCustomizerType(typeName, mainTypeEntryFlat)) {\n      fontOptSingle = opt;\n    } else if (isText) {\n      fontOptSingle = getSelectedMainFontOption(state, config);\n      if (!fontOptSingle && opt && opt.fontUrl) fontOptSingle = opt;\n    }\n    html += renderMainPreviewChipInner(disp, opt, isText, shapeMod, fontOptSingle, mainTypeEntryFlat, mainPreviewAssets);\n    html += '</button>';\n    return html;\n  }\n\n  function renderMergedBirthstoneBarPreviewChip(state, config, startIdx, endIdx) {\n    var segmentColors = [];\n    var focusIdx = startIdx;\n    if (state.uiPanel === 'addon' && state.uiAddonListIndex >= startIdx && state.uiAddonListIndex <= endIdx) {\n      focusIdx = state.uiAddonListIndex;\n    }\n    for (var li = startIdx; li <= endIdx; li++) {\n      var resolved = resolveAddonPreviewOptForLine(state, config, li);\n      segmentColors.push(birthstoneBarColorFromOption(resolved.opt));\n    }\n    var shapeMod = ' customizer-preview-item--birthstone-bar';\n    var focusClass =\n      state.uiPanel === 'addon' && state.uiAddonListIndex >= startIdx && state.uiAddonListIndex <= endIdx\n        ? ' is-focus'\n        : '';\n    var html =\n      '<div class=\"customizer-preview-item-wrap customizer-preview-item-wrap--addon customizer-preview-item-wrap--birthstone-bar-combined\">';\n    html +=\n      '<button type=\"button\" class=\"customizer-preview-item customizer-preview-item--addon customizer-preview-chip' +\n      shapeMod +\n      focusClass +\n      '\" data-focus-addon=\"' +\n      focusIdx +\n      '\" aria-label=\"Edit birthstone bar\">';\n    html += '<div class=\"customizer-preview-item-inner\">';\n    html += renderBirthstoneBarCombinedPreviewMarkup(segmentColors, config, state, 'preview');\n    html += '</div></button>';\n    for (var ri = startIdx; ri <= endIdx; ri++) {\n      var rEntry = state.addonList[ri].entry;\n      if (!(rEntry && rEntry.mandatory)) {\n        html +=\n          '<button type=\"button\" class=\"customizer-preview-remove\" data-remove-addon=\"' +\n          ri +\n          '\" aria-label=\"Remove add-on\">\\u00d7</button>';\n        html += renderAddonPreviewPriceMarkup(state.addonList[ri], config, state);\n      }\n    }\n    html += '</div>';\n    return html;\n  }\n\n  function renderAddonPreviewChipForLine(state, config, listIndex) {\n    var line = state.addonList[listIndex];\n    var entry = line.entry;\n    if (!entry.addonProduct) return '';\n    ensureAddonLineGroupKey(line, config);\n    var resolved = resolveAddonPreviewOptForLine(state, config, listIndex);\n    var linePreview = resolved.linePreview;\n    var opt = resolved.opt;\n    var previewTabIndex = linePreview.productIndex != null ? linePreview.productIndex : 0;\n    var typeAp = linePreview.resolveAp || entry.addonProduct;\n    var g = linePreview.groupedItem;\n    var lineGroupKey = line.customizationGroupKey || ensureAddonLineGroupKey(line, config);\n    var te = g && g.typeEntry;\n    var groupTitle = getAddonLineGroupTitle(line, config);\n    var shapeMod = addonPreviewShapeModForProduct(config, line, typeAp);\n    if (\n      !shapeMod &&\n      shapeKindFromCustomizationGroupTitle(groupTitle) === 'disc'\n    ) {\n      shapeMod = ' customizer-preview-item--shape-disc';\n    }\n    var symbolMod = addonLinePreviewMetalMod(config, state, shapeMod);\n    var isDiscChip = shapeMod.indexOf('shape-disc') !== -1;\n    // Size-scaled preview only when THIS product has Shopify Size / Disc Size (2+ values).\n    var sizeAp =\n      typeAp && addonProductHasSelectableSizes(typeAp)\n        ? typeAp\n        : entry.addonProduct && addonProductHasSelectableSizes(entry.addonProduct)\n          ? entry.addonProduct\n          : typeAp;\n    var discPx = isDiscChip ? previewDiscPxForAddonEntry(entry, sizeAp) : null;\n    var blankCompact =\n      !isDiscChip &&\n      addonProductHasSelectableSizes(sizeAp) &&\n      addonLineUsesSmallerSizePick(entry, sizeAp);\n    var focusClass = state.uiPanel === 'addon' && state.uiAddonListIndex === listIndex ? ' is-focus' : '';\n    var isMulti = getAddonLineGroupedProducts(line, config).length > 0;\n    var aria = (isMulti && groupTitle) ? groupTitle : (typeAp.title || 'Add-on ' + (listIndex + 1));\n    var fontOptAd = null;\n    var isInitialPreview =\n      (typeAp && isInitialAddonProduct(typeAp)) ||\n      isInitialCustomizerType(linePreview.typeName, te) ||\n      isInitialTagShapeMod(shapeMod);\n    if (isInitialPreview) {\n      // Initials: style selection is a Font N letter row \u2014 never Name fontUrl merge.\n      fontOptAd = getAddonProductFontSelection(entry, typeAp) || opt;\n    } else if (linePreview.isText || (opt && customizationHasFontUrl(opt))) {\n      fontOptAd = getSelectedAddonFontOption(entry, typeAp, config, state);\n      if (!customizationHasFontUrl(fontOptAd) && customizationHasFontUrl(opt)) fontOptAd = opt;\n    }\n    var wrapClass = isMulti ? ' customizer-preview-item-wrap--addon-group' : '';\n    var tabAttr = isMulti ? ' data-focus-addon-type=\"' + previewTabIndex + '\"' : '';\n    var html = '<div class=\"customizer-preview-item-wrap customizer-preview-item-wrap--addon' + wrapClass + '\">';\n    html +=\n      '<button type=\"button\" class=\"customizer-preview-item customizer-preview-item--addon customizer-preview-chip' +\n      symbolMod +\n      shapeMod +\n      (blankCompact ? ' customizer-preview-item--addon-blank-compact' : '') +\n      focusClass +\n      '\"' +\n      discPreviewStyleAttr(discPx) +\n      ' data-focus-addon=\"' +\n      listIndex +\n      '\"' +\n      tabAttr +\n      ' aria-label=\"Edit ' +\n      escapeHtml(aria) +\n      '\">';\n    html += '<div class=\"customizer-preview-item-inner\">';\n    html += renderPreviewChipInnerMarkup(\n      linePreview,\n      opt,\n      linePreview.isText,\n      shapeMod,\n      fontOptAd,\n      te,\n      groupTitle,\n      { config: config, state: state, addonProduct: typeAp, groupKey: lineGroupKey }\n    );\n    html += '</div></button>';\n    if (!(entry && entry.mandatory)) {\n      html +=\n        '<button type=\"button\" class=\"customizer-preview-remove\" data-remove-addon=\"' +\n        listIndex +\n        '\" aria-label=\"Remove add-on\">\\u00d7</button>';\n      html += renderAddonPreviewPriceMarkup(line, config, state);\n    }\n    html += '</div>';\n    return html;\n  }\n\n  function renderAddonPreviewChips(state, config) {\n    var html = '';\n    var i = 0;\n    while (i < state.addonList.length) {\n      if (\n        !isMainProductBraceletFromConfig(config) &&\n        addonLineIsBirthstoneBarLine(state, config, i)\n      ) {\n        var runEnd = i;\n        while (\n          runEnd + 1 < state.addonList.length &&\n          addonLineIsBirthstoneBarLine(state, config, runEnd + 1)\n        ) {\n          runEnd++;\n        }\n        if (runEnd > i) {\n          html += renderMergedBirthstoneBarPreviewChip(state, config, i, runEnd);\n          i = runEnd + 1;\n          continue;\n        }\n      }\n      html += renderAddonPreviewChipForLine(state, config, i);\n      i++;\n    }\n    return html;\n  }\n\n  function getCustomizerTranslations(config) {\n    return (config && config.translations) || {};\n  }\n\n  function getCustomizerNameFieldLabel(config) {\n    var t = getCustomizerTranslations(config);\n    return t.name_field_label || 'Enter your personalization';\n  }\n\n  function hasAddonCatalog(config, state) {\n    if (isFamilyBirthFlowerBouquetProduct(config)) return false;\n    if (isFamilyBirthstoneBarProduct(config)) return false;\n    return collectAddonPickerOptions(config, state || null).length > 0;\n  }\n\n  /** When the picker has exactly one row (one group, one size), skip \"Choose your addon\". */\n  function getSoleAddonPickerOption(config, state) {\n    var options = collectAddonPickerOptions(config, state || null);\n    if (options.length !== 1) return null;\n    return options[0];\n  }\n\n  function addAddonFromPickerOption(state, opt) {\n    if (!state || !opt || !opt.groupKey) return -1;\n    var catIdx = opt.catalogIndex != null ? opt.catalogIndex : findCatalogIndexForGroup(state.config, opt.groupKey);\n    state.activeAddonCatalogIndex = catIdx;\n    return state.addAddonLine(opt.groupKey, opt.variantId, catIdx);\n  }\n\n  function openAddonEditorForNewLine(state, newIdx) {\n    if (newIdx < 0) return false;\n    var newLine = state.addonList[newIdx];\n    var tab = 0;\n    if (newLine && newLine.entry && newLine.entry.addonProduct) {\n      var pkgs = getAddonLinePackages(newLine, state.config, state);\n      var seededId = newLine.entry.addonProduct.id;\n      for (var i = 0; i < pkgs.length; i++) {\n        var pap = pkgs[i].addonProduct;\n        if (pap && seededId != null && String(pap.id) === String(seededId)) {\n          tab = i;\n          break;\n        }\n      }\n    }\n    state.setUiAddon(newIdx, tab);\n    return true;\n  }\n\n  function renderCustomizerSectionTitle(state, config) {\n    if (state.uiPanel === 'addonPick') return '';\n    var t = getCustomizerTranslations(config);\n    var title =\n      state.uiPanel === 'addon'\n        ? t.addon_personalize_title || 'Customize your add-on'\n        : t.personalize_section_title || 'Add your personalization';\n    return '<h2 class=\"customizer-section-title\">' + escapeHtml(title) + '</h2>';\n  }\n\n  function renderPreviewStrip(state, config) {\n    var t = getCustomizerTranslations(config);\n    var html = '<div class=\"customizer-preview-area\">';\n    html += '<div class=\"customizer-preview-strip\" data-customizer-preview-strip>';\n    html += renderMainPreviewChips(state, config);\n    html += renderAddonPreviewChips(state, config);\n    if (hasAddonCatalog(config, state) && canAddMoreAddonLines(state, config)) {\n      var addLabel = t.add_addon_label || 'Add-on';\n      var addAria = t.add_addon_aria || 'Add an optional add-on';\n      html +=\n        '<button type=\"button\" class=\"customizer-preview-add\" data-add-one-addon=\"true\" aria-label=\"' +\n        escapeHtml(addAria) +\n        '\">';\n      html += '<span class=\"customizer-preview-add-btn\" aria-hidden=\"true\">+</span>';\n      html += '<span class=\"customizer-preview-add-label\">' + escapeHtml(addLabel) + '</span>';\n      html += '</button>';\n    }\n    html += '</div></div>';\n    return html;\n  }\n\n  /** Blank preview silhouette for add-on category picker (matches preview-strip shape rules). */\n  function addonGroupPickerBlankShapeMod(config, groupKey) {\n    var grouped = getCustomizerTypesForGroupAcrossCatalog(config, groupKey);\n    var title = '';\n    var te = null;\n    var typeAp = null;\n    var args = [];\n\n    if (grouped.length) {\n      te = grouped[0].typeEntry;\n      typeAp = grouped[0].addonProduct;\n      title = getEffectiveTypeCustomizationGroupTitle(te, groupKey);\n      var fromTitle = pickerShapeModFromGroupTitle(title);\n      if (fromTitle) return fromTitle;\n      for (var gi = 0; gi < grouped.length; gi++) {\n        var gte = grouped[gi].typeEntry;\n        args.push(gte.typeLabel, gte.tabTitle, gte.customizationGroupTitle);\n        if (!typeAp && grouped[gi].addonProduct) typeAp = grouped[gi].addonProduct;\n      }\n    } else {\n      var catalog = getAddons(config);\n      var pi = findCatalogIndexForGroup(config, groupKey);\n      if (catalog[pi]) {\n        typeAp = catalog[pi];\n        title = addonCustomizerTabLabel(typeAp) || typeAp.title || '';\n        var c0 = typeAp.customizer;\n        if (c0 && c0.type) args.push(c0.type);\n        args.push(typeAp.title, typeAp.handle);\n      } else if (String(groupKey).indexOf('title:') === 0) {\n        title = formatCustomizationGroupTitle(String(groupKey).slice(6));\n        var fromTitleKey = pickerShapeModFromGroupTitle(title);\n        if (fromTitleKey) return fromTitleKey;\n      }\n    }\n\n    args.unshift(title);\n    if (typeAp) {\n      args.push(typeAp.title, typeAp.handle);\n    }\n\n    var stripMod =\n      birthstonePreviewShapeMod(null, te, title, typeAp) ||\n      previewStripShapeModFromStrings.apply(null, [isMainProductBraceletFromConfig(config)].concat(args));\n\n    if (stripMod.indexOf('birthstone') !== -1) return ' customizer-addon-group-picker-preview--birthstone';\n    if (stripMod.indexOf('shape-initial-tag') !== -1) {\n      return ' customizer-addon-group-picker-preview--shape-initial-tag';\n    }\n    if (stripMod.indexOf('shape-bloom-circle') !== -1) {\n      return ' customizer-addon-group-picker-preview--shape-bloom-circle';\n    }\n    if (stripMod.indexOf('shape-oval') !== -1) return ' customizer-addon-group-picker-preview--shape-oval';\n    if (stripMod.indexOf('shape-rect') !== -1) return ' customizer-addon-group-picker-preview--shape-rect';\n    return ' customizer-addon-group-picker-preview--shape-disc';\n  }\n\n  function addonGroupPickerPreviewClasses(config, state, groupKey) {\n    var shapeMod = addonGroupPickerBlankShapeMod(config, groupKey);\n    if (shapeMod.indexOf('birthstone') !== -1) return shapeMod;\n    var metal = isMainGold(config, state)\n      ? ' customizer-addon-group-picker-preview--symbol-gold'\n      : ' customizer-addon-group-picker-preview--symbol-silver';\n    return shapeMod + metal;\n  }\n\n  /** Picker shown after \"+\" \u2014 same customization groups as before, list layout, size split when Size option has 2+ values. */\n  function renderAddonGroupPicker(state, config) {\n    if (state.uiPanel !== 'addonPick') return '';\n    var options = collectAddonPickerOptions(config, state);\n    if (!options.length) return '';\n    var t = getCustomizerTranslations(config);\n    var pickerTitle =\n      state.addonList.length > 0\n        ? t.addon_picker_title_repeat || 'Add another'\n        : t.addon_picker_title || 'Choose your addon';\n    var html = '<div class=\"customizer-body customizer-body--picker\" data-addon-group-picker>';\n    html += '<p class=\"customizer-field-label\">' + escapeHtml(pickerTitle) + '</p>';\n    html += '<div class=\"customizer-addon-picker-list\" role=\"list\">';\n    for (var oi = 0; oi < options.length; oi++) {\n      var opt = options[oi];\n      var blankCompact = !!opt.previewCompact;\n      var discPx = opt.previewDiscPx != null ? opt.previewDiscPx : null;\n      html +=\n        '<button type=\"button\" class=\"customizer-addon-picker-row' +\n        (blankCompact ? ' customizer-addon-picker-row--compact' : '') +\n        '\" role=\"listitem\"' +\n        ' data-addon-group-pick=\"' +\n        escapeHtml(opt.groupKey) +\n        '\" data-addon-catalog-index=\"' +\n        opt.catalogIndex +\n        '\" data-addon-variant-id=\"' +\n        escapeHtml(String(opt.variantId)) +\n        '\">';\n      html +=\n        '<span class=\"customizer-addon-picker-row-thumb' +\n        (blankCompact ? ' customizer-addon-picker-row-thumb--compact' : '') +\n        '\"' +\n        discPreviewStyleAttr(discPx) +\n        ' aria-hidden=\"true\">';\n      if (opt.image) {\n        html += '<img src=\"' + escapeHtml(opt.image) + '\" alt=\"\" class=\"customizer-addon-picker-row-img\">';\n      } else {\n        html +=\n          '<span class=\"customizer-addon-group-picker-preview' +\n          (opt.shapeMod || '') +\n          '\"><span class=\"customizer-addon-group-picker-preview-inner\"></span></span>';\n      }\n      html += '</span>';\n      html += '<span class=\"customizer-addon-picker-row-label\">' + escapeHtml(opt.label) + '</span>';\n      html += '<span class=\"customizer-addon-picker-row-price\">+ $' + escapeHtml(formatPriceCents(opt.variantPrice)) + '</span>';\n      html += '</button>';\n    }\n    html += '</div></div>';\n    return html;\n  }\n\n  function renderCustomizerTabOrSeparator(config) {\n    var t = getCustomizerTranslations(config);\n    var word = (t.tabs_or && String(t.tabs_or).trim()) || 'or';\n    return '<span class=\"customizer-tabs__or\" aria-hidden=\"true\">' + escapeHtml(word) + '</span>';\n  }\n\n  /** One tab per linked add-on product in the selected group (Disc, Tag, Birthstone, etc.). */\n  function renderAddonTypeTabs(state, config) {\n    if (state.uiPanel !== 'addon' || state.uiAddonListIndex == null) return '';\n    var line = state.addonList[state.uiAddonListIndex];\n    if (!line) return '';\n    var products = getAddonLinePackages(line, config, state, true);\n    if (products.length <= 1) return '';\n    var html = '<div class=\"customizer-tabs customizer-tabs--addon-types\" role=\"tablist\" aria-label=\"Add-on products\">';\n    for (var ti = 0; ti < products.length; ti++) {\n      if (ti > 0) html += renderCustomizerTabOrSeparator(config);\n      var ap = products[ti].addonProduct;\n      var tabLabel = toTitleCaseLabel(addonCustomizerTabLabel(ap) || (ap && ap.title) || 'Add-on ' + (ti + 1));\n      if (tabLabel.length > 48) tabLabel = tabLabel.slice(0, 45) + '\\u2026';\n      var tabIsActive = state.activeAddonTypeTabIndex === ti;\n      html +=\n        '<button type=\"button\" class=\"customizer-tab' +\n        (tabIsActive ? ' is-active' : '') +\n        '\" role=\"tab\" aria-selected=\"' +\n        tabIsActive +\n        '\" data-addon-type-tab=\"' +\n        ti +\n        '\">' +\n        escapeHtml(tabLabel) +\n        '</button>';\n    }\n    html += '</div>';\n    return html;\n  }\n\n  function getMainCustomizerOptions(state, config) {\n    if (isFamilyBirthFlowerBouquetProduct(config)) {\n      var familyType =\n        (config.main && config.main.customizer && config.main.customizer.type) ||\n        'Family Birth Flower Bouquet';\n      return {\n        typeName: familyType,\n        customizations: getFamilyBouquetFlowerOptions(config, state)\n      };\n    }\n    if (isFamilyBirthstoneBarProduct(config)) {\n      var barType =\n        (config.main && config.main.customizer && config.main.customizer.type) || 'Family Birthstone Bar';\n      return {\n        typeName: barType,\n        customizations: getFamilyBirthstoneBarOptions(config, state)\n      };\n    }\n    var customizer = config.main && config.main.customizer ? config.main.customizer : null;\n    var allCustomizations = customizer && customizer.customizations ? customizer.customizations : [];\n    var typeName = (customizer && customizer.type) ? customizer.type : (allCustomizations[0] && allCustomizations[0].type) || '';\n    var customizations = usesFullCustomizationListForTypeLabel(typeName)\n      ? allCustomizations.slice()\n      : filterCustomizationsByMainColorFinish(allCustomizations, config, state);\n    return {\n      typeName: typeName,\n      customizations: sortCustomizationsByMonth(customizations)\n    };\n  }\n\n  function getFilteredCustomizationsForTypeEntry(typeEntry, config, state) {\n    if (!typeEntry) return [];\n    if (isFamilyBirthFlowerBouquetProduct(config)) {\n      return getFamilyBouquetFlowerOptions(config, state);\n    }\n    if (isFamilyBirthstoneBarProduct(config)) {\n      return getFamilyBirthstoneBarOptions(config, state);\n    }\n    var typeLabel = typeEntry.typeLabel || typeEntry.tabTitle || '';\n    var allCustomizations = typeEntry.customizations || [];\n    var customizations = usesFullCustomizationListForTypeLabel(typeLabel, typeEntry)\n      ? allCustomizations.slice()\n      : filterCustomizationsByMainColorFinish(allCustomizations, config, state);\n    // Birthstones must keep finish filtering \u2014 if token match fails, fall back to gold/silver metal only.\n    if (\n      !customizations.length &&\n      allCustomizations.length &&\n      isBirthstoneType(typeLabel, typeEntry)\n    ) {\n      var wantGold = isMainGold(config, state);\n      customizations = allCustomizations.filter(function (o) {\n        var metal = getOptionFinishMetal(o);\n        if (!metal) return true;\n        return wantGold ? metal === 'gold' : metal === 'silver';\n      });\n    }\n    return sortCustomizationsByMonth(customizations);\n  }\n\n  function firstCustomizationWithFontUrl(customizations) {\n    if (!customizations || !customizations.length) return null;\n    for (var i = 0; i < customizations.length; i++) {\n      var fu = customizations[i].fontUrl;\n      if (fu != null && String(fu).trim() !== '') return customizations[i];\n    }\n    return null;\n  }\n\n  /** First font-style tile (name / initial tag) or first grid option for a type tab. */\n  function firstDefaultOptionForTypeEntry(typeEntry, config, state, enrichOption, addonProduct, groupKey) {\n    if (!typeEntry || !enrichOption) return null;\n    var typeLabel = typeEntry.typeLabel || typeEntry.tabTitle || '';\n    var custs = customizationsForTypeEntry(typeEntry, config, state, addonProduct, groupKey);\n    if (!custs.length) return null;\n    var pick = custs[0];\n    if (usesFontStylePicker(typeLabel, typeEntry, addonProduct)) {\n      var pickerItems = fontStylePickerOptions(custs, typeLabel, typeEntry);\n      if (pickerItems.length && pickerItems[0].option) pick = pickerItems[0].option;\n    } else if (shouldGroupInitialsByFont(typeLabel, custs)) {\n      var groups = groupInitialCustomizationsByFont(custs);\n      var g0 = groups[0];\n      if (g0 && g0.options && g0.options.length) pick = g0.options[0];\n    } else if (isFontSelectionTab(typeLabel, typeEntry)) {\n      pick = firstCustomizationWithFontUrl(custs) || pick;\n    }\n    return enrichOption(pick);\n  }\n\n  function ensureDefaultFontSelectionsForMain(state, config) {\n    ensureAddonsConfig(config);\n    var types = getMainCustomizerTypes(config);\n    if (!types.length) return;\n    for (var i = 0; i < types.length; i++) {\n      var te = types[i];\n      var label = te.typeLabel || te.tabTitle || '';\n      if (!usesFontStylePicker(label, te, null) && !isFontSelectionTab(label, te)) continue;\n      var tid = typeEntryKey(te, i);\n      var sel = state.main.selections && state.main.selections[tid];\n      if (sel) continue;\n      var opt = firstDefaultOptionForTypeEntry(te, config, state, function (o) {\n        return enrichMainOptionFromConfig(o, config);\n      });\n      if (opt) state.setMainSelection(tid, opt);\n    }\n    syncMainSelectedOptionFromActiveTab(state, config);\n  }\n\n  function ensureDefaultFontSelectionsForAddonEntry(entry, addonProduct, config, state, groupKey) {\n    if (!entry || !addonProduct) return;\n    if (groupKey && !addonProductBelongsToCustomizationGroup(addonProduct, groupKey, config)) return;\n    var variantTypes = getAddonVariantCustomizerTypes(entry, addonProduct, config, state);\n    if (\n      !(variantTypes && variantTypes.length) &&\n      !(addonProduct.customizerTypes && addonProduct.customizerTypes.length)\n    ) {\n      ensureDefaultFontSelectionsForFlatAddon(entry, addonProduct, config, state);\n      return;\n    }\n    var typesToRun = getAddonDisplayTypesForProduct(\n      entry,\n      addonProduct,\n      groupKey,\n      config,\n      state,\n      true\n    );\n    if (!entry.selections) entry.selections = {};\n    for (var j = 0; j < typesToRun.length; j++) {\n      var ate = typesToRun[j].typeEntry;\n      var typeIdx = typesToRun[j].typeIndex;\n      var label = ate.typeLabel || ate.tabTitle || '';\n      if (!usesFontStylePicker(label, ate, addonProduct) && !isFontSelectionTab(label, ate)) continue;\n      var gItem = makeAddonGroupedItem(ate, typeIdx, addonProduct);\n      var atid = groupedAddonTypeKey(gItem);\n      if (getAddonEntrySelection(entry, gItem)) continue;\n      if (entry.selections && entry.selections[atid]) continue;\n      var aopt = firstDefaultOptionForTypeEntry(ate, config, state, function (o) {\n        return enrichAddonOptionFromConfig(o, addonProduct, config);\n      }, addonProduct);\n      if (aopt) entry.selections[atid] = cloneStoredOption(aopt);\n    }\n  }\n\n  function ensureDefaultFontSelectionsForFlatAddon(entry, addonProduct, config, state) {\n    if (!entry || !addonProduct) return;\n    var customizations = (addonProduct.customizer && addonProduct.customizer.customizations) || [];\n    if (!customizations.length) return;\n    var flatKey = addonFlatSelectionKey(addonProduct);\n    var existing =\n      (entry.selections && entry.selections[flatKey]) ||\n      (entry.selections && entry.selections[ADDON_FLAT_TYPE_KEY]);\n    if (existing) return;\n    var moTypeName =\n      (addonProduct.customizer && addonProduct.customizer.type) ||\n      (customizations[0] && customizations[0].type) ||\n      '';\n    var flatTypeEntry = { customizations: customizations, typeLabel: moTypeName, tabTitle: moTypeName };\n    var isInitialFlat = isInitialCustomizerType(moTypeName, flatTypeEntry);\n    var list;\n    if (isInitialFlat) {\n      list = getInitialLetterCustomizations(config, state, addonProduct);\n    } else {\n      list = usesFullCustomizationListForTypeLabel(moTypeName, flatTypeEntry)\n        ? customizations.slice()\n        : filterCustomizationsByMainColorFinish(customizations, config, state);\n      list = sortCustomizationsByMonth(list);\n    }\n    if (!list.length) return;\n    var pick;\n    if (usesFontStylePicker(moTypeName, flatTypeEntry, addonProduct) || isInitialFlat) {\n      var pickerItems = fontStylePickerOptions(list, moTypeName, flatTypeEntry);\n      pick = pickerItems.length && pickerItems[0].option ? pickerItems[0].option : null;\n    }\n    if (!pick) pick = firstCustomizationWithFontUrl(list) || list[0];\n    var opt = enrichAddonOptionFromConfig(pick, addonProduct, config);\n    if (!entry.selections) entry.selections = {};\n    entry.selections[flatKey] = cloneStoredOption(opt);\n    if (entry.selections[ADDON_FLAT_TYPE_KEY] && flatKey !== ADDON_FLAT_TYPE_KEY) {\n      delete entry.selections[ADDON_FLAT_TYPE_KEY];\n    }\n  }\n\n  function ensureDefaultFontStyleSelectionsForState(state, config) {\n    if (!state || !config) return;\n    ensureMandatoryAddonLines(state, config);\n    applyDefaultMainSelections(state, config);\n    for (var i = 0; i < state.addonList.length; i++) {\n      var line = state.addonList[i];\n      var entry = line && line.entry;\n      if (!entry) continue;\n      if (addonLineEntryHasStoredChoices(entry)) continue;\n      var tabIx = state.activeAddonTypeTabIndex;\n      if (tabIx < 0) tabIx = 0;\n      applyDefaultsForAddonProductTab(state, i, tabIx);\n    }\n    applyMainVariantDrivenSelections(config, state);\n  }\n\n  function syncMainSelectedOptionFromActiveTab(state, config) {\n    ensureAddonsConfig(config);\n    var types = getMainCustomizerTypes(config);\n    if (!mainUsesTypeTabs(config) || !types.length) return;\n    var ti = state.activeTypeTabIndex;\n    if (ti < 0 || ti >= types.length) ti = 0;\n    var te = types[ti];\n    var tid = typeEntryKey(te, ti);\n    var label = te.typeLabel || te.tabTitle || '';\n    var sel = state.main.selections && state.main.selections[tid];\n    if (sel) {\n      state.main.selectedOption = sel;\n    } else if (isManualTextInputType(label) || isInitialOrNameType(label)) {\n      state.main.selectedOption = null;\n    }\n  }\n\n  function applyDefaultMainSelections(state, config) {\n    if (!config || !config.main) return;\n    if (isFamilyBirthFlowerBouquetProduct(config)) return;\n    if (isFamilyBirthstoneBarProduct(config)) return;\n    ensureAddonsConfig(config);\n    var types = getMainCustomizerTypes(config);\n    if (mainUsesTypeTabs(config) && types.length) {\n      for (var i = 0; i < types.length; i++) {\n        var te = types[i];\n        var tid = typeEntryKey(te, i);\n        var label = te.typeLabel || te.tabTitle || '';\n        if (isNameOnlyTextTab(label, te, null)) continue;\n        if (isInitialCustomizerType(label, te)) continue;\n        var sel = state.main.selections && state.main.selections[tid];\n        if (sel) continue;\n        var drivenDefault = mainVariantDrivenDefaultTile(te, config, state);\n        var opt = drivenDefault\n          ? enrichMainOptionFromConfig(cloneStoredOption(drivenDefault), config)\n          : firstDefaultOptionForTypeEntry(te, config, state, function (o) {\n              return enrichMainOptionFromConfig(o, config);\n            }, null);\n        if (opt) state.setMainSelection(tid, opt);\n      }\n      ensureDefaultFontSelectionsForMain(state, config);\n      syncMainSelectedOptionFromActiveTab(state, config);\n      return;\n    }\n    var mainData = getMainCustomizerOptions(state, config);\n    var customizations = mainData.customizations;\n    var typeName = mainData.typeName;\n    if (!customizations.length || isManualTextInputType(typeName) || isInitialOrNameType(typeName)) return;\n    if (state.main.selectedOption) return;\n    state.setMainOption(enrichMainOptionFromConfig(customizations[0], config));\n  }\n\n  function applyDefaultSelectionsForAddonProductTypes(entry, addonProduct, config, state, groupKey) {\n    if (!entry || !addonProduct) return;\n    var typesToRun = getAddonDisplayTypesForProduct(\n      entry,\n      addonProduct,\n      null,\n      config,\n      state,\n      true\n    );\n    var variantOpts = getAddonVariantCustomizerOptions(entry, addonProduct, config, state);\n    for (var j = 0; j < typesToRun.length; j++) {\n      var ate = typesToRun[j].typeEntry;\n      var typeAp = addonProduct;\n      var typeIdx = typesToRun[j].typeIndex;\n      var gItem = makeAddonGroupedItem(ate, typeIdx, typeAp);\n      var atid = groupedAddonTypeKey(gItem);\n      var alabel = ate.typeLabel || ate.tabTitle || '';\n      if (isNameOnlyTextTab(alabel, ate, typeAp)) continue;\n      if (isInitialCustomizerType(alabel, ate)) continue;\n      var allowedCusts = customizationsForTypeEntry(ate, config, state, typeAp, groupKey);\n      if (variantOpts != null) {\n        allowedCusts = filterCustomizationsByVariantOptions(\n          allowedCusts,\n          variantOpts,\n          ate,\n          config\n        );\n      }\n      var existingSel = getAddonEntrySelection(entry, gItem) || (entry.selections && entry.selections[atid]);\n      if (existingSel) {\n        var stillAllowed = false;\n        for (var ai = 0; ai < allowedCusts.length; ai++) {\n          var ac = allowedCusts[ai];\n          if (!ac) continue;\n          if (existingSel.id != null && ac.id != null && String(existingSel.id) === String(ac.id)) {\n            stillAllowed = true;\n            break;\n          }\n          if (\n            existingSel.name &&\n            ac.name &&\n            normalizePickerMatchToken(existingSel.name) === normalizePickerMatchToken(ac.name)\n          ) {\n            stillAllowed = true;\n            break;\n          }\n        }\n        if (stillAllowed) continue;\n        if (entry.selections) {\n          if (entry.selections[atid]) delete entry.selections[atid];\n          var baseKey = typeEntryKey(ate, typeIdx);\n          if (entry.selections[baseKey]) delete entry.selections[baseKey];\n        }\n      }\n      if (!allowedCusts.length) continue;\n      var ateForDefault = {\n        id: ate.id,\n        tabTitle: ate.tabTitle,\n        typeLabel: ate.typeLabel,\n        customizationGroupTitle: ate.customizationGroupTitle,\n        customizations: allowedCusts\n      };\n      var afirst = firstDefaultOptionForTypeEntry(ateForDefault, config, state, function (o) {\n        return enrichAddonOptionFromConfig(o, typeAp, config);\n      }, typeAp, groupKey);\n      if (!afirst) continue;\n      if (!entry.selections) entry.selections = {};\n      entry.selections[atid] = cloneStoredOption(afirst);\n    }\n    ensureDefaultFontSelectionsForAddonEntry(entry, addonProduct, config, state, null);\n  }\n\n  function applyDefaultAddonEntrySelections(entry, addonProduct, config, state, groupKey) {\n    if (!entry || !config || !state) return;\n    if (groupKey && addonProduct && !addonProductBelongsToCustomizationGroup(addonProduct, groupKey, config)) {\n      return;\n    }\n    if (!addonProduct) return;\n    var variantTypes = getAddonVariantCustomizerTypes(entry, addonProduct, config, state);\n    if (\n      (variantTypes && variantTypes.length) ||\n      (addonProduct.customizerTypes && addonProduct.customizerTypes.length)\n    ) {\n      applyDefaultSelectionsForAddonProductTypes(entry, addonProduct, config, state, groupKey);\n      return;\n    }\n    ensureDefaultFontSelectionsForFlatAddon(entry, addonProduct, config, state);\n  }\n\n  function renderTypeSlot(state, config, listIndex, typeEntry, isMain, showAddonProductTitle, slotOpts) {\n    if (showAddonProductTitle === undefined) showAddonProductTitle = true;\n    var skipNameField = slotOpts && slotOpts.skipNameField;\n    var noSlotWrapper = slotOpts && slotOpts.noSlotWrapper;\n    var sectionSpaced = slotOpts && slotOpts.sectionSpaced;\n    var sectionIndex = slotOpts && slotOpts.sectionIndex != null ? slotOpts.sectionIndex : null;\n    var typeIndex = slotOpts && slotOpts.typeIndex != null ? slotOpts.typeIndex : 0;\n    if (!typeEntry) return '';\n    var typeId =\n      !isMain && slotOpts && slotOpts.selectionTypeKey\n        ? String(slotOpts.selectionTypeKey)\n        : typeEntryKey(typeEntry, typeIndex);\n    var typeLabel = typeEntry.typeLabel || typeEntry.tabTitle || '';\n    var addonProduct = null;\n    var selections;\n    var manualByType;\n    if (isMain) {\n      selections = state.main.selections || {};\n      manualByType = state.main.manualByType || {};\n    } else {\n      var line = state.addonList[listIndex];\n      if (!line) return '';\n      selections = line.entry.selections || {};\n      manualByType = line.entry.manualByType || {};\n      addonProduct =\n        (slotOpts && slotOpts.addonProductOverride) ||\n        (line.entry && line.entry.addonProduct);\n    }\n    var addonGroupKey = !isMain && line ? ensureAddonLineGroupKey(line, config) : null;\n    // Main + add-on share one path so Name Tag can pull Name fonts (and Initial Tag \u2192 Initial).\n    var customizations = customizationsForTypeEntry(\n      typeEntry,\n      config,\n      state,\n      isMain ? null : addonProduct,\n      isMain ? null : addonGroupKey\n    );\n    var isInitialType = isInitialCustomizerType(typeLabel, typeEntry);\n    var variantCustomizerOptions =\n      !isMain && slotOpts && slotOpts.variantCustomizerOptions != null ? slotOpts.variantCustomizerOptions : null;\n    if (variantCustomizerOptions != null) {\n      customizations = filterCustomizationsByVariantOptions(\n        customizations,\n        variantCustomizerOptions,\n        typeEntry,\n        config\n      );\n    }\n    // Product metafield recovery (disc); variant recovery below when product is empty (tags).\n    if (!customizations.length && !isMain && addonProduct && isInitialType) {\n      customizations = getInitialLetterCustomizations(config, state, addonProduct);\n    }\n    if (!customizations.length && variantCustomizerOptions != null) {\n      var fromVariant = customizationsFromVariantOptionRefs(\n        variantCustomizerOptions,\n        typeEntry,\n        config\n      );\n      if (fromVariant.length) customizations = sortCustomizationsByMonth(fromVariant);\n    }\n    var selectedOpt = selections[typeId];\n    if (!selectedOpt && !isMain && addonProduct) {\n      selectedOpt = getAddonEntrySelection(\n        { selections: selections, manualByType: manualByType },\n        makeAddonGroupedItem(typeEntry, typeIndex, addonProduct)\n      );\n    }\n    if (\n      isMain &&\n      !selectedOpt &&\n      customizations.length &&\n      !isFamilyBirthFlowerBouquetProduct(config) &&\n      !isFamilyBirthstoneBarProduct(config)\n    ) {\n      selectedOpt = customizations[0];\n      if (!state.main.selections) state.main.selections = {};\n      if (!state.main.selections[typeId]) {\n        state.setMainSelection(typeId, enrichMainOptionFromConfig(selectedOpt, config));\n        selectedOpt = state.main.selections[typeId] || selectedOpt;\n      }\n    }\n    var isTextType = !skipNameField && showsNameTextInput(typeLabel, typeEntry, addonProduct);\n    var showPersonalize = !skipNameField && usesPersonalizationInput(typeLabel, typeEntry, addonProduct);\n    var personalizeMax = personalizationMaxLength(typeLabel, typeEntry, addonProduct);\n    var slotClass = isMain ? 'customizer-addon-slot customizer-addon-slot--main' : 'customizer-addon-slot';\n    if (noSlotWrapper && sectionSpaced) slotClass = 'customizer-name-tag-section customizer-name-tag-section--spaced';\n    else if (noSlotWrapper) slotClass = 'customizer-name-tag-section';\n    var slotAttrs = isMain ? ' data-main-slot=\"true\"' : ' data-addon-list-root=\"' + listIndex + '\"';\n    var sectionAttr =\n      !isMain && sectionIndex != null ? ' data-addon-type-section=\"' + sectionIndex + '\"' : '';\n    var html = noSlotWrapper\n      ? '<div class=\"' + slotClass + '\"' + sectionAttr + '>'\n      : '<div class=\"' + slotClass + '\"' + slotAttrs + sectionAttr + '>';\n\n    if (showPersonalize) {\n      var pVal = '';\n      if (isMain) {\n        pVal = manualByType[typeId] != null ? String(manualByType[typeId]) : '';\n      } else {\n        pVal = manualByType[typeId] != null ? String(manualByType[typeId]) : '';\n        if (!pVal && line && line.entry && addonProduct) {\n          pVal = getAddonEntryManualText(\n            line.entry,\n            makeAddonGroupedItem(typeEntry, typeIndex, addonProduct),\n            addonProduct\n          );\n        }\n      }\n      html += renderPersonalizationField(state, config, {\n        value: pVal,\n        maxLength: personalizeMax,\n        isMain: isMain,\n        typeId: typeId,\n        listIndex: isMain ? null : listIndex,\n        addonProduct: addonProduct,\n        typeLabel: typeLabel,\n        typeEntry: typeEntry\n      });\n    }\n\n    if (customizations.length) {\n      html += renderCustomizerOptionsGrid(\n        state,\n        config,\n        customizations,\n        typeLabel,\n        typeId,\n        selectedOpt,\n        isMain,\n        isMain ? null : listIndex,\n        typeEntry,\n        addonProduct\n      );\n    } else if (isInitialCustomizerType(typeLabel, typeEntry)) {\n      html += '<p class=\"customizer-addon-missing\">No letter options are linked on this add-on (product or variant customizer).</p>';\n    } else if (\n      isBirthFlowerType(typeLabel, typeEntry) ||\n      isBirthstoneType(typeLabel, typeEntry) ||\n      isSymbolType(typeLabel)\n    ) {\n      html +=\n        '<p class=\"customizer-addon-missing\">No options are available for this selection. Check that options are linked to this product in the customizer.</p>';\n    }\n\n    if (isTextType) {\n      var manualVal = (manualByType[typeId] != null ? String(manualByType[typeId]) : '').substring(0, 10);\n      html += '<div class=\"customizer-manual-text-wrap\">';\n      html += '<p class=\"customizer-field-label\">' + escapeHtml(getCustomizerNameFieldLabel(config)) + '</p>';\n      if (isMain) {\n        html += '<input type=\"text\" class=\"customizer-manual-text-input\" data-main-manual-text=\"true\" data-type-id=\"' + escapeHtml(typeId) + '\" value=\"' + escapeHtml(manualVal) + '\" maxlength=\"10\" placeholder=\"Enter name\">';\n      } else {\n        html += '<input type=\"text\" class=\"customizer-manual-text-input\" data-list-index=\"' + listIndex + '\" data-type-id=\"' + escapeHtml(typeId) + '\" value=\"' + escapeHtml(manualVal) + '\" maxlength=\"10\" placeholder=\"Enter name\">';\n      }\n      html += '<span class=\"customizer-manual-text-counter\">' + manualVal.length + '/10</span>';\n      html += '</div>';\n    }\n\n    html += '</div>';\n    return html;\n  }\n\n  function renderMainCustomizerSlot(state, config) {\n    var mainData = getMainCustomizerOptions(state, config);\n    var customizations = mainData.customizations;\n    var typeName = mainData.typeName;\n    var isTextType = showsNameTextInput(typeName, { customizations: customizations }, null);\n    var html = '<div class=\"customizer-addon-slot customizer-addon-slot--main\" data-main-slot=\"true\">';\n    if (isFamilyBirthstoneBarProduct(config)) {\n      var barMax = getFamilyBirthstoneBarMax(config);\n      var pickCount = getFamilyBirthstoneBarSelections(state).length;\n      html +=\n        '<p class=\"customizer-family-birthstone-bar-hint\">' +\n        escapeHtml('Add up to ' + barMax + ' birthstones (' + pickCount + '/' + barMax + ')') +\n        '</p>';\n    }\n    if (customizations.length) {\n      html += renderCustomizerOptionsGrid(\n        state,\n        config,\n        customizations,\n        typeName,\n        '__main__',\n        state.main.selectedOption,\n        true,\n        null,\n        { customizations: customizations }\n      );\n    }\n    if (isTextType) {\n      var manualVal = (state.main.manualText != null ? String(state.main.manualText) : '').substring(0, 10);\n      html += '<div class=\"customizer-manual-text-wrap\">';\n      html += '<p class=\"customizer-field-label\">' + escapeHtml(getCustomizerNameFieldLabel(config)) + '</p>';\n      html += '<input type=\"text\" class=\"customizer-manual-text-input\" data-main-manual-text=\"true\" value=\"' + escapeHtml(manualVal) + '\" maxlength=\"10\" placeholder=\"Enter name\">';\n      html += '<span class=\"customizer-manual-text-counter\">' + manualVal.length + '/10</span>';\n      html += '</div>';\n    }\n    html += '</div>';\n    return html;\n  }\n\n  function renderAddonSlotForListIndex(state, listIndex, config, addonProductOverride) {\n    if (listIndex < 0 || listIndex >= state.addonList.length) return '';\n    var line = state.addonList[listIndex];\n    var addon = addonProductOverride || getAddonProductFromLine(config, line);\n    if (!addon) return '';\n    var entry = line.entry;\n    var allCustomizations = (addon.customizer && addon.customizer.customizations) ? addon.customizer.customizations : [];\n    var typeName = (addon.customizer && addon.customizer.type) ? addon.customizer.type : (allCustomizations[0] && allCustomizations[0].type) || '';\n    var flatTypeEntry = { customizations: allCustomizations, typeLabel: typeName, tabTitle: typeName };\n    var variantOpts = getAddonVariantCustomizerOptions(entry, addon, config, state);\n    var customizations;\n    if (variantOpts != null) {\n      var flatMatchedAsType = false;\n      for (var vfi = 0; vfi < variantOpts.length; vfi++) {\n        if (typeEntryMatchesVariantCustomizerRef(variantOpts[vfi], flatTypeEntry)) {\n          flatMatchedAsType = true;\n          break;\n        }\n      }\n      if (flatMatchedAsType) {\n        customizations = customizationsForTypeEntry(flatTypeEntry, config, state, addon, null);\n        if (!customizations.length) {\n          customizations = usesFullCustomizationListForTypeLabel(typeName, flatTypeEntry)\n            ? allCustomizations.slice()\n            : filterCustomizationsByMainColorFinish(allCustomizations, config, state);\n          customizations = sortCustomizationsByMonth(customizations);\n        }\n      } else {\n        customizations = filterCustomizationsByVariantOptions(\n          allCustomizations,\n          variantOpts,\n          flatTypeEntry,\n          config\n        );\n        customizations = sortCustomizationsByMonth(customizations);\n      }\n    } else {\n      customizations = customizationsForTypeEntry(flatTypeEntry, config, state, addon, null);\n      if (!customizations.length) {\n        customizations = usesFullCustomizationListForTypeLabel(typeName, flatTypeEntry)\n          ? allCustomizations.slice()\n          : filterCustomizationsByMainColorFinish(allCustomizations, config, state);\n        customizations = sortCustomizationsByMonth(customizations);\n      }\n    }\n    flatTypeEntry = { customizations: customizations, typeLabel: typeName, tabTitle: typeName };\n    var showPersonalizeFlat = usesPersonalizationInput(typeName, flatTypeEntry, addon);\n    var isTextType = showsNameTextInput(typeName, flatTypeEntry, addon);\n    var flatKeySlot = addonFlatSelectionKey(addon);\n    var flatSelected =\n      (entry.selections && entry.selections[flatKeySlot]) ||\n      (entry.selections && entry.selections[ADDON_FLAT_TYPE_KEY]);\n\n    var html = '<div class=\"customizer-addon-slot\" data-addon-list-root=\"' + listIndex + '\">';\n\n    if (showPersonalizeFlat) {\n      var flatMax = personalizationMaxLength(typeName, flatTypeEntry, addon);\n      var flatG = makeAddonGroupedItem(flatTypeEntry, 0, addon);\n      var flatVal = getAddonEntryManualText(entry, flatG, addon).substring(0, flatMax);\n      if (!flatVal && entry.manualByType) {\n        if (entry.manualByType[flatKeySlot]) {\n          flatVal = String(entry.manualByType[flatKeySlot]).substring(0, flatMax);\n        } else if (entry.manualByType[ADDON_FLAT_TYPE_KEY]) {\n          flatVal = String(entry.manualByType[ADDON_FLAT_TYPE_KEY]).substring(0, flatMax);\n        }\n      }\n      html += renderPersonalizationField(state, config, {\n        value: flatVal,\n        maxLength: flatMax,\n        listIndex: listIndex,\n        typeId: flatKeySlot,\n        addonProduct: addon,\n        typeLabel: typeName,\n        typeEntry: flatTypeEntry\n      });\n    }\n\n    if (customizations.length) {\n      html += renderCustomizerOptionsGrid(\n        state,\n        config,\n        customizations,\n        typeName,\n        flatKeySlot,\n        flatSelected,\n        false,\n        listIndex,\n        flatTypeEntry,\n        addon\n      );\n    }\n\n    if (isTextType) {\n      var manualVal = (\n        (entry.manualByType && entry.manualByType[flatKeySlot]) ||\n        (entry.manualByType && entry.manualByType[ADDON_FLAT_TYPE_KEY]) ||\n        ''\n      );\n      manualVal = String(manualVal).substring(0, 10);\n      html += '<div class=\"customizer-manual-text-wrap\">';\n      html += '<p class=\"customizer-field-label\">' + escapeHtml(getCustomizerNameFieldLabel(config)) + '</p>';\n      html += '<input type=\"text\" class=\"customizer-manual-text-input\" data-list-index=\"' + listIndex + '\" data-type-id=\"' + escapeHtml(flatKeySlot) + '\" value=\"' + escapeHtml(manualVal) + '\" maxlength=\"10\" placeholder=\"Enter name\">';\n      html += '<span class=\"customizer-manual-text-counter\">' + manualVal.length + '/10</span>';\n      html += '</div>';\n    }\n\n    html += '</div>';\n    return html;\n  }\n\n  function renderMainEditorBody(state, config) {\n    if (mainUsesTypeTabs(config)) {\n      var mtypes = getMainCustomizerTypes(config);\n      var tix = state.activeTypeTabIndex;\n      if (tix < 0 || tix >= mtypes.length) tix = 0;\n      var te = mtypes[tix] || mtypes[0];\n      return renderTypeSlot(state, config, 0, te, true, undefined, { typeIndex: tix });\n    }\n    // Two-product / empty-main: first mandatory catalog add-on is the main options grid.\n    if (state.mandatoryCount > 0 && state.addonList[0] && state.addonList[0].entry && state.addonList[0].entry.mandatory) {\n      return renderAddonEditorBody(state, config, 0);\n    }\n    return renderMainCustomizerSlot(state, config);\n  }\n\n  function renderAddonEditorBody(state, config, listIndex) {\n    if (listIndex < 0 || listIndex >= state.addonList.length) return '';\n    var line = state.addonList[listIndex];\n    var ap = line && line.entry && line.entry.addonProduct;\n    if (!ap) return '<p class=\"customizer-addon-missing\">This add-on could not be loaded.</p>';\n\n    var products = getAddonLinePackages(line, config, state, true);\n    if (!products.length) {\n      return '<p class=\"customizer-addon-missing\">No add-on options found for this group.</p>';\n    }\n    var tix = state.activeAddonTypeTabIndex;\n    if (tix < 0 || tix >= products.length) tix = 0;\n    var activePkg = products[tix] || products[0];\n    var typeAp = activePkg.addonProduct || ap;\n    var variantOpts = getAddonVariantCustomizerOptions(line.entry, typeAp, config, state);\n    var types = activePkg.types || [];\n    if (!types.length) {\n      // Variant custom.customizer, then product metafield, then customizer_options filter.\n      types = getAddonDisplayTypesForProduct(\n        line.entry,\n        typeAp,\n        ensureAddonLineGroupKey(line, config),\n        config,\n        state,\n        true\n      );\n    }\n    if (!types.length) {\n      return '<p class=\"customizer-addon-missing\">No customization options are linked on this add-on.</p>';\n    }\n    var html = '<div class=\"customizer-addon-slot\" data-addon-list-root=\"' + listIndex + '\">';\n    for (var ai = 0; ai < types.length; ai++) {\n      var activeType = types[ai];\n      html += renderTypeSlot(state, config, listIndex, activeType.typeEntry, false, false, {\n        typeIndex: activeType.typeIndex,\n        addonProductOverride: typeAp,\n        selectionTypeKey: groupedAddonTypeKey(activeType),\n        skipNameField: false,\n        noSlotWrapper: types.length > 1,\n        sectionSpaced: ai > 0,\n        variantCustomizerOptions: variantOpts\n      });\n    }\n    html += '</div>';\n    return html;\n  }\n\n  function renderEditorPanel(state, config) {\n    var html = '<div class=\"customizer-editor-panel\" data-customizer-editor>';\n    if (state.uiPanel === 'addonPick') {\n      html += '</div>';\n      return html;\n    }\n    if (state.uiPanel === 'addon' && state.uiAddonListIndex != null) {\n      var li = state.uiAddonListIndex;\n      if (li >= 0 && li < state.addonList.length) {\n        html += renderAddonEditorBody(state, config, li);\n      } else {\n        html += renderMainEditorBody(state, config);\n      }\n    } else {\n      html += renderMainEditorBody(state, config);\n    }\n    html += '</div>';\n    return html;\n  }\n\n  function getMainVariantOptionsSummary(state, config) {\n    var optionNames = (config.main && config.main.options) ? config.main.options : [];\n    var parts = [];\n    for (var i = 0; i < optionNames.length; i++) {\n      var val = state.main['option' + (i + 1)];\n      if (val != null && String(val).trim() !== '') {\n        parts.push(escapeHtml(String(optionNames[i]).trim()) + ': ' + escapeHtml(String(val).trim()));\n      }\n    }\n    return parts.join(' \\u2022 ');\n  }\n\n  function collectMainCustomizerSummaryLines(state, config) {\n    var lines = [];\n    if (isFamilyBirthFlowerBouquetProduct(config)) {\n      var flowers = getFamilyFlowerSelections(state);\n      for (var fi = 0; fi < flowers.length; fi++) {\n        var fname = flowers[fi] && flowers[fi].name != null ? String(flowers[fi].name).trim() : '';\n        if (!fname) continue;\n        lines.push(escapeHtml('Flower ' + (fi + 1) + ': ' + fname));\n      }\n      return lines;\n    }\n    if (isFamilyBirthstoneBarProduct(config)) {\n      var barPicks = getFamilyBirthstoneBarSelections(state);\n      for (var bi = 0; bi < barPicks.length; bi++) {\n        var bname = barPicks[bi] && barPicks[bi].name != null ? String(barPicks[bi].name).trim() : '';\n        if (!bname) continue;\n        lines.push(escapeHtml('Birthstone Bar ' + (bi + 1) + ': ' + bname));\n      }\n      return lines;\n    }\n    if (!mainUsesTypeTabs(config)) {\n      if (isInitialCustomizerType(state.main.customizationType, null)) {\n        var flatLetterSum = cartInitialLetterFromManual(state.main.manualText);\n        if (flatLetterSum) {\n          lines.push(escapeHtml('Initial: ' + flatLetterSum));\n        }\n      } else if (\n        (isNameCustomizerType(state.main.customizationType, null) ||\n          isManualTextInputType(state.main.customizationType)) &&\n        state.main.manualText &&\n        String(state.main.manualText).trim()\n      ) {\n        lines.push(escapeHtml('Name: ' + String(state.main.manualText).trim()));\n      } else if (state.main.selectedOption && state.main.selectedOption.name) {\n        lines.push(\n          escapeHtml(\n            (state.main.selectedOption.type || state.main.customizationType || 'Customization') +\n              ': ' +\n              cleanInitialOptionName(state.main.selectedOption.name)\n          )\n        );\n      }\n      return lines;\n    }\n    var types = getMainCustomizerTypes(config);\n    for (var i = 0; i < types.length; i++) {\n      var te = types[i];\n      var tid = typeEntryKey(te, i);\n      var label = te.typeLabel || te.tabTitle || 'Customization';\n      if (isInitialCustomizerType(label, te)) {\n        var initManual = state.main.manualByType && state.main.manualByType[tid];\n        var initLetterSum = cartInitialLetterFromManual(initManual || state.main.manualText);\n        if (initLetterSum) lines.push(escapeHtml('Initial: ' + initLetterSum));\n      } else if (\n        usesPersonalizationInput(label, te, null) ||\n        showsNameTextInput(label, te, null) ||\n        isNameCustomizerType(label, te)\n      ) {\n        var manual = state.main.manualByType && state.main.manualByType[tid];\n        if (manual && String(manual).trim()) {\n          var nameLabel = isNameCustomizerType(label, te) ? 'Name' : label;\n          lines.push(escapeHtml(nameLabel + ': ' + String(manual).trim()));\n        }\n      } else {\n        var sel = state.main.selections && state.main.selections[tid];\n        if (sel && sel.name) {\n          lines.push(escapeHtml((sel.type || label) + ': ' + cleanInitialOptionName(sel.name)));\n        }\n      }\n    }\n    return lines;\n  }\n\n  function collectAddonLineSummaryParts(line, config, state) {\n    var entry = line.entry;\n    if (!entry) return [];\n    var groupKey = line.customizationGroupKey || ensureAddonLineGroupKey(line, config);\n    var parts = [];\n    var packages = getAddonLinePackages(line, config, state);\n    var forceShow = !!(entry.mandatory);\n    for (var pi = 0; pi < packages.length; pi++) {\n      var pkg = packages[pi];\n      var apForType = pkg.addonProduct || entry.addonProduct;\n      var types = pkg.types || [];\n      for (var ti = 0; ti < types.length; ti++) {\n        var g = types[ti];\n        var te = g.typeEntry;\n        var label = te.typeLabel || te.tabTitle || 'Customization';\n        if (!forceShow && !addonTypeHasActivity(entry, g, apForType, config, state, groupKey)) continue;\n        if (usesPersonalizationInput(label, te, apForType) || showsNameTextInput(label, te, apForType)) {\n          var manual = getAddonEntryManualText(entry, g, apForType);\n          if (manual && String(manual).trim()) {\n            var partLabel =\n              isInitialCustomizerType(label, te) || isInitialAddonProduct(apForType)\n                ? 'Initial'\n                : isNameCustomizerType(label, te) || isNameAddonProduct(apForType)\n                  ? 'Name'\n                  : label;\n            var partValue =\n              partLabel === 'Initial'\n                ? cartInitialLetterFromManual(manual) || String(manual).trim()\n                : String(manual).trim();\n            if (partValue) parts.push(partLabel + ': ' + partValue);\n          }\n        } else {\n          var sel = getAddonEntrySelection(entry, g);\n          if (sel && sel.name) parts.push((sel.type || label) + ': ' + cleanInitialOptionName(sel.name));\n        }\n      }\n    }\n    return parts;\n  }\n\n  function renderProductHeader(state, config) {\n    var configImage = resolveProductImageUrl(config && config.main && config.main.image);\n    var image = getMainProductHeaderImage(state, config);\n    var title = (state.main && state.main.title) || (config.main && config.main.title) || '';\n    var optionsLine = getMainVariantOptionsSummary(state, config);\n    var mainExtras = collectMainCustomizerSummaryLines(state, config);\n    var html = '<div class=\"customizer-product-header\">';\n    if (image) {\n      html += '<div class=\"customizer-product-header__media\">';\n      var fallbackAttr =\n        configImage && configImage !== image\n          ? ' data-fallback=\"' + escapeHtml(configImage) + '\"'\n          : '';\n      html +=\n        '<img class=\"customizer-product-header__img\" src=\"' +\n        escapeHtml(image) +\n        '\" alt=\"\" data-customizer-header-img' +\n        fallbackAttr +\n        ' onerror=\"var f=this.getAttribute(\\'data-fallback\\');if(f){this.removeAttribute(\\'data-fallback\\');this.src=f;}else{this.removeAttribute(\\'src\\');this.onerror=null;this.classList.add(\\'is-broken\\');}\">';\n      html += '</div>';\n    }\n    html += '<div class=\"customizer-product-header__body\">';\n    html += '<h2 class=\"customizer-product-header__title\" data-customizer-header-title>' + escapeHtml(title) + '</h2>';\n    if (optionsLine) {\n      html += '<p class=\"customizer-product-header__options\" data-customizer-header-options>' + optionsLine + '</p>';\n    }\n    for (var mi = 0; mi < mainExtras.length; mi++) {\n      html += '<p class=\"customizer-product-header__extra\">' + mainExtras[mi] + '</p>';\n    }\n    for (var ai = 0; ai < state.addonList.length; ai++) {\n      var addonLine = state.addonList[ai];\n      var addonEntry = addonLine && addonLine.entry;\n      var addonParts = collectAddonLineSummaryParts(addonLine, config, state);\n      var isMandatoryMain = !!(addonEntry && addonEntry.mandatory);\n      // Mandatory line is main personalization \u2014 show the selection, never a +price.\n      if (isMandatoryMain && !addonParts.length) continue;\n      var addonTitle =\n        getAddonCartGroupLabel(\n          addonLine,\n          addonEntry,\n          addonEntry && addonEntry.addonProduct,\n          config\n        ) || 'Add-on';\n      var addonText = addonParts.length ? addonTitle + ' \\u2014 ' + addonParts.join(', ') : addonTitle;\n      html += '<p class=\"customizer-product-header__extra\">';\n      html += escapeHtml(addonText);\n      if (!isMandatoryMain) {\n        var addonPrice = getAddonLineBundlePrice(addonLine, config, state);\n        if (addonPrice > 0) {\n          html += ' <span class=\"customizer-product-header__extra-price\">+ $' + formatPriceCents(addonPrice) + '</span>';\n        }\n      }\n      html += '</p>';\n    }\n    var gw = (config && config.giftWrap) || {};\n    if (gw.enable && state.giftWrapEnabled && state._giftWrapPriceReady && state._giftWrapAvailable !== false) {\n      var gwVidHdr = parseGiftWrapVariantId(gw.variantId);\n      var giftPriceSeparate =\n        (Number(state._giftWrapPrice) || 0) > 0 &&\n        (!gwVidHdr || isNaN(gwVidHdr) || !addonLinesIncludeVariantId(state, config, gwVidHdr));\n      html += '<p class=\"customizer-product-header__extra\">';\n      html += escapeHtml(gw.label || 'Gift wrap');\n      if (giftPriceSeparate) {\n        html += ' <span class=\"customizer-product-header__extra-price\">+ $' + formatPriceCents(state._giftWrapPrice) + '</span>';\n      }\n      html += '</p>';\n    }\n    html += '</div></div>';\n    return html;\n  }\n\n  function renderContent(state, config) {\n    var html = '<div class=\"customizer-flow\">';\n    html += '<div class=\"customizer-flow__pinned\">';\n    html += renderPreviewStrip(state, config);\n    html += '</div>';\n    html += '<div class=\"customizer-flow__scroll\">';\n    if (state.uiPanel === 'addonPick') {\n      html += renderAddonGroupPicker(state, config);\n    } else {\n      html += '<div class=\"customizer-body\">';\n      // Main types: click preview chips \u2014 no BIRTHSTONE|INITIAL tab row.\n      html += renderAddonTypeTabs(state, config);\n      html += renderEditorPanel(state, config);\n      html += '</div>';\n    }\n    html += '</div></div>';\n    return html;\n  }\n\n  /** Special request \u2014 rendered in drawer footer alongside gift wrap. */\n  function renderSpecialRequest(state, config) {\n    var t = (config && config.translations) || {};\n    var label = t.special_request || 'Special request';\n    var placeholder = t.special_request_placeholder || '';\n    var enabled = !!state.specialRequestEnabled;\n    var msg = state.specialRequestMessage || '';\n    var html = '<div class=\"customizer-special-request\" data-special-request>';\n    html += '<label class=\"customizer-toggle\">';\n    html +=\n      '<input type=\"checkbox\" class=\"customizer-toggle-input\" data-special-request-toggle' +\n      (enabled ? ' checked' : '') +\n      '>';\n    html += '<span class=\"customizer-toggle-switch\" aria-hidden=\"true\"><span class=\"customizer-toggle-slider\"></span></span>';\n    html += '<span class=\"customizer-toggle-label\">' + escapeHtml(label) + '</span>';\n    html += '</label>';\n    html +=\n      '<div class=\"customizer-special-request-field' +\n      (enabled ? ' is-visible' : '') +\n      '\" data-special-request-field' +\n      (enabled ? '' : ' hidden') +\n      '>';\n    html +=\n      '<textarea class=\"customizer-special-request-textarea\" data-special-request-textarea rows=\"3\" placeholder=\"' +\n      escapeHtml(placeholder) +\n      '\">' +\n      escapeHtml(msg) +\n      '</textarea>';\n    html += '</div>';\n    html += '</div>';\n    return html;\n  }\n\n  /** Gift wrap + special request \u2014 rendered in drawer footer. */\n  function renderOrderExtras(state, config) {\n    var gw = (config && config.giftWrap) || {};\n    var showGiftWrap = !!(gw.enable && gw.variantId && String(gw.variantId).trim() !== '');\n    var t = (config && config.translations) || {};\n    var html = '<div class=\"customizer-footer-extras-inner\">';\n    if (isFamilyBirthFlowerBouquetProduct(config)) {\n      var emailLabel = t.proof_email_label || 'Email for proof';\n      var emailPlaceholder = t.proof_email_placeholder || 'Enter your email address';\n      var emailVal = state.proofEmail != null ? String(state.proofEmail) : '';\n      var emailOk = isValidProofEmail(emailVal);\n      var emailTouched = emailVal.trim() !== '';\n      html += '<div class=\"customizer-proof-email\" data-proof-email>';\n      html +=\n        '<label class=\"customizer-field-label\" for=\"customizer-proof-email-input\">' +\n        escapeHtml(emailLabel) +\n        ' <span class=\"customizer-proof-email-required\" aria-hidden=\"true\">*</span></label>';\n      html +=\n        '<input type=\"email\" id=\"customizer-proof-email-input\" class=\"customizer-proof-email-input\" data-proof-email-input placeholder=\"' +\n        escapeHtml(emailPlaceholder) +\n        '\" value=\"' +\n        escapeHtml(emailVal) +\n        '\" autocomplete=\"email\">';\n      if (emailTouched && !emailOk) {\n        html +=\n          '<p class=\"customizer-proof-email-error\" data-proof-email-error>' +\n          escapeHtml(t.proof_email_invalid || 'Please enter a valid email address') +\n          '</p>';\n      } else if (!emailTouched && getFamilyFlowerSelections(state).length > 0) {\n        html +=\n          '<p class=\"customizer-proof-email-error\" data-proof-email-error style=\"display:none\"></p>';\n      }\n      html += '</div>';\n    }\n    if (showGiftWrap) {\n      var gwDisabled = state._giftWrapAvailable === false ? ' disabled' : '';\n      html += '<label class=\"customizer-toggle\">';\n      html +=\n        '<input type=\"checkbox\" class=\"customizer-toggle-input\" data-gift-wrap-toggle' +\n        (state.giftWrapEnabled ? ' checked' : '') +\n        gwDisabled +\n        '>';\n      html += '<span class=\"customizer-toggle-switch\" aria-hidden=\"true\"><span class=\"customizer-toggle-slider\"></span></span>';\n      html +=\n        '<span class=\"customizer-toggle-label\" data-customizer-gift-wrap-label>' +\n        renderGiftWrapCheckLabelHtml(config, state) +\n        '</span>';\n      html += '</label>';\n      if (state._giftWrapAvailable === false) {\n        html += '<p class=\"customizer-extra-hint\">Gift wrap is currently unavailable.</p>';\n      }\n    }\n    html += renderSpecialRequest(state, config);\n    html += '</div>';\n    return html;\n  }\n\n  /** One cart property per logical customization (Symbol, Birth Flower, etc.) per line item. */\n  function cartCustomizationSemanticKey(label, typeEntry, addonProduct) {\n    var primary = label != null ? String(label).trim() : '';\n    // Explicit cart labels win \u2014 \"Font\" must not become \"initial\" via typeEntry/addonProduct.\n    if (primary) {\n      var p = primary.toLowerCase();\n      if (p === 'font' || p === 'fonts') return 'font';\n      if (p === 'initial' || p === 'initials') return 'initial';\n      if (p === 'name') return 'name';\n    }\n    var labels = [];\n    if (primary) labels.push(primary);\n    if (typeEntry) {\n      if (typeEntry.typeLabel) labels.push(typeEntry.typeLabel);\n      if (typeEntry.tabTitle) labels.push(typeEntry.tabTitle);\n      if (typeEntry.customizationGroupTitle) labels.push(typeEntry.customizationGroupTitle);\n    }\n    if (addonProduct) {\n      labels.push(addonProduct.title, addonProduct.handle, addonCustomizerTabLabel(addonProduct));\n    }\n    for (var i = 0; i < labels.length; i++) {\n      var lab = labels[i];\n      if (isSymbolType(lab)) return 'symbol';\n      if (isBirthFlowerType(lab, typeEntry)) return 'birth-flower';\n      if (isBirthstoneBarType(lab, typeEntry)) return 'birthstone-bar';\n      if (isBirthstoneType(lab, typeEntry)) return 'birthstone';\n      if (isInitialCustomizerType(lab, typeEntry) || isInitialAddonProduct(addonProduct)) return 'initial';\n      if (isNameCustomizerType(lab, typeEntry) || isNameAddonProduct(addonProduct)) return 'name';\n      if (isFontSelectionTab(lab, typeEntry)) return 'font';\n    }\n    return 'type:' + String(label || 'customization').toLowerCase().trim();\n  }\n\n  function cartCustomizationSeen(customizations) {\n    if (!customizations._cartTypeSeen) customizations._cartTypeSeen = {};\n    return customizations._cartTypeSeen;\n  }\n\n  function pushCartCustomization(customizations, displayLabel, typeEntry, addonProduct, value, skipKeys) {\n    if (!value || !customizations) return;\n    var key = cartCustomizationSemanticKey(displayLabel, typeEntry, addonProduct);\n    if (skipKeys && skipKeys[key]) return;\n    var seen = cartCustomizationSeen(customizations);\n    if (seen[key]) return;\n    seen[key] = true;\n    customizations.push(displayLabel + ': ' + value);\n  }\n\n  /** Group types once per logical tab (Symbol, Birth Flower, \u2026) for cart output. */\n  function getCartGroupedTypesForLine(line, config, state) {\n    var groupKey = line ? line.customizationGroupKey || ensureAddonLineGroupKey(line, config) : null;\n    if (!groupKey || !config || !line) return [];\n    var entry = line.entry;\n    var pkgs = getAddonLinePackages(line, config, state);\n    var out = [];\n\n    function pushGroupedType(g) {\n      var te = g.typeEntry;\n      var label = te.typeLabel || te.tabTitle || '';\n      var matchIdx = -1;\n      for (var j = 0; j < out.length; j++) {\n        var ote = out[j].typeEntry;\n        var olabel = ote.typeLabel || ote.tabTitle || '';\n        if (addonTypeLabelsMatch(label, te, olabel, ote)) {\n          matchIdx = j;\n          break;\n        }\n      }\n      if (matchIdx === -1) {\n        out.push(g);\n        return;\n      }\n      if (!entry || !state) return;\n      var existing = out[matchIdx];\n      var apNew = g.addonProduct;\n      var apOld = existing.addonProduct;\n      var activeNew = addonTypeHasActivity(entry, g, apNew, config, state, groupKey);\n      var activeOld = addonTypeHasActivity(entry, existing, apOld, config, state, groupKey);\n      if (activeNew && !activeOld) out[matchIdx] = g;\n    }\n\n    for (var pi = 0; pi < pkgs.length; pi++) {\n      var types = pkgs[pi].types || [];\n      for (var ti = 0; ti < types.length; ti++) pushGroupedType(types[ti]);\n    }\n    if (out.length) return out;\n\n    var catalogTypes = getCustomizerTypesForGroupAcrossCatalog(config, groupKey);\n    for (var ci = 0; ci < catalogTypes.length; ci++) pushGroupedType(catalogTypes[ci]);\n    return out;\n  }\n\n  function joinCartCustomizationProps(customizations) {\n    if (!customizations || !customizations.length) return '';\n    var seen = {};\n    var out = [];\n    for (var i = 0; i < customizations.length; i++) {\n      var line = String(customizations[i]);\n      var colon = line.indexOf(':');\n      if (colon === -1) continue;\n      var propLabel = line.slice(0, colon).trim();\n      var propValue = line.slice(colon + 1).trim();\n      if (!propValue) continue;\n      var key = cartCustomizationSemanticKey(propLabel, null, null);\n      if (seen[key]) continue;\n      seen[key] = true;\n      out.push(propLabel + ': ' + propValue);\n    }\n    return out.join('; ');\n  }\n\n  function appendMainProductCustomizationProps(state, config, customizations, textValues) {\n    if (mainUsesTypeTabs(config)) {\n      var types = config.main.customizerTypes;\n      for (var i = 0; i < types.length; i++) {\n        var te = types[i];\n        var tid = typeEntryKey(te, i);\n        var label = te.typeLabel || te.tabTitle || 'Customization';\n        var isInitial = isInitialCustomizerType(label, te);\n        var isName = isNameCustomizerType(label, te) || isManualTextInputType(label);\n        var hasGrid =\n          isInitial || getVariantDrivenOptionIndex(config.main, te) >= 0\n            ? customizationsForTypeEntry(te, config, state, null).length > 0\n            : (te.customizations || []).length > 0;\n        // Initial/Name can be complete from typed text even if catalog grid is empty.\n        if (!hasGrid && !isInitial && !isName) continue;\n        if (isInitial) {\n          var mInit =\n            (state.main.manualByType && state.main.manualByType[tid]) ||\n            state.main.manualText ||\n            '';\n          var letter = cartInitialLetterFromManual(mInit);\n          if (letter) {\n            pushCartCustomization(customizations, 'Initial', te, null, letter);\n          }\n          if (usesFontStylePicker(label, te, null)) {\n            var fontSelMain = state.main.selections && state.main.selections[tid];\n            var fontLblMain = fontStyleCartLabel(fontSelMain);\n            if (fontLblMain) {\n              // null typeEntry/addon \u2014 avoid semantic-key collision with Initial\n              pushCartCustomization(customizations, 'Font', null, null, fontLblMain);\n            }\n          }\n          continue;\n        }\n        if (isName) {\n          var mName =\n            (state.main.manualByType && state.main.manualByType[tid]) ||\n            state.main.manualText ||\n            '';\n          mName = String(mName).trim();\n          if (mName) {\n            pushCartCustomization(customizations, 'Name', te, null, mName);\n          }\n          if (usesFontStylePicker(label, te, null)) {\n            var fontSelName = state.main.selections && state.main.selections[tid];\n            var fontLblName = nameFontStyleCartLabel(fontSelName);\n            if (fontLblName) {\n              pushCartCustomization(customizations, 'Font', null, null, fontLblName);\n            }\n          }\n          continue;\n        }\n        var sel = state.main.selections && state.main.selections[tid];\n        if (sel && sel.name) {\n          pushCartCustomization(\n            customizations,\n            sel.type || label,\n            te,\n            null,\n            cleanInitialOptionName(sel.name)\n          );\n        }\n      }\n      return;\n    }\n    if (isInitialCustomizerType(state.main.customizationType, null)) {\n      var flatInitLetter = cartInitialLetterFromManual(state.main.manualText);\n      if (flatInitLetter) {\n        pushCartCustomization(customizations, 'Initial', null, null, flatInitLetter);\n      }\n      var flatFontLbl = fontStyleCartLabel(state.main.selectedOption);\n      if (flatFontLbl) {\n        pushCartCustomization(customizations, 'Font', null, null, flatFontLbl);\n      }\n    } else if (\n      isNameCustomizerType(state.main.customizationType, null) ||\n      isManualTextInputType(state.main.customizationType)\n    ) {\n      if (state.main.manualText && String(state.main.manualText).trim()) {\n        pushCartCustomization(customizations, 'Name', null, null, String(state.main.manualText).trim());\n      }\n      var flatNameFont = nameFontStyleCartLabel(state.main.selectedOption);\n      if (flatNameFont) {\n        pushCartCustomization(customizations, 'Font', null, null, flatNameFont);\n      }\n    } else if (state.main.selectedOption) {\n      pushCartCustomization(\n        customizations,\n        state.main.selectedOption.type || state.main.customizationType || 'Customization',\n        null,\n        null,\n        cleanInitialOptionName(state.main.selectedOption.name)\n      );\n    }\n  }\n\n  function appendAddonTypeCartProps(entry, g, config, state, groupKey, customizations, textValues, skipKeys) {\n    if (!entry || !g) return;\n    var te = g.typeEntry;\n    var apForType = g.addonProduct || null;\n    var label = te.typeLabel || te.tabTitle || 'Customization';\n    var pMode = personalizationModeForGroupedItem(g);\n    if (pMode && entry.activePersonalizationMode && entry.activePersonalizationMode !== pMode) return;\n    if (!addonTypeHasActivity(entry, g, apForType, config, state, groupKey)) return;\n    var isName =\n      isNameCustomizerType(label, te) ||\n      isNameAddonProduct(apForType) ||\n      showsNameTextInput(label, te, apForType);\n    var hasGrid = customizationsForTypeEntry(te, config, state, apForType, groupKey).length > 0;\n    if (!hasGrid && !usesPersonalizationInput(label, te, apForType) && !isName) return;\n    if (usesPersonalizationInput(label, te, apForType)) {\n      var p = getAddonEntryManualText(entry, g, apForType);\n      if (p) {\n        if (isNameCustomizerType(label, te) || isNameAddonProduct(apForType)) {\n          pushCartCustomization(customizations, 'Name', te, apForType, p, skipKeys);\n        } else if (isInitialCustomizerType(label, te) || isInitialAddonProduct(apForType)) {\n          var initLetter = cartInitialLetterFromManual(p) || String(p).trim();\n          pushCartCustomization(customizations, 'Initial', te, apForType, initLetter, skipKeys);\n        } else {\n          pushCartCustomization(customizations, label, te, apForType, p, skipKeys);\n        }\n      }\n      if (usesFontStylePicker(label, te, apForType)) {\n        var fontSelPers = getAddonEntrySelection(entry, g);\n        var fontLblPers =\n          isInitialCustomizerType(label, te) || isInitialAddonProduct(apForType)\n            ? fontStyleCartLabel(fontSelPers)\n            : nameFontStyleCartLabel(fontSelPers) || fontStyleCartLabel(fontSelPers);\n        if (fontLblPers) {\n          // null typeEntry/addon \u2014 Font must not steal the Initial semantic key\n          pushCartCustomization(customizations, 'Font', null, null, fontLblPers, skipKeys);\n        }\n      }\n    } else if (isName) {\n      var nameText = getAddonEntryManualText(entry, g, apForType);\n      if (nameText) {\n        pushCartCustomization(customizations, 'Name', te, apForType, nameText, skipKeys);\n      }\n    } else if (isFontSelectionTab(label, te)) {\n      var sel = getAddonEntrySelection(entry, g);\n      if (sel && sel.name) {\n        var fontTabVal = isInitialCustomizerType(label, te)\n          ? cleanInitialOptionName(sel.name)\n          : nameFontStyleLabelFromName(sel.name) || String(sel.name).trim();\n        pushCartCustomization(\n          customizations,\n          sel.type || label,\n          te,\n          apForType,\n          fontTabVal,\n          skipKeys\n        );\n      }\n    } else {\n      var sel2 = getAddonEntrySelection(entry, g);\n      if (sel2 && sel2.name) {\n        pushCartCustomization(\n          customizations,\n          sel2.type || label,\n          te,\n          apForType,\n          cleanInitialOptionName(sel2.name),\n          skipKeys\n        );\n      }\n    }\n  }\n\n  function appendFlatAddonPropsForProduct(entry, customizations, textValues, config, state, addonProduct, skipKeys) {\n    if (!entry || !addonProduct) return;\n    var flatMode = personalizationModeFromAddonProduct(addonProduct);\n    if (flatMode && entry.activePersonalizationMode && entry.activePersonalizationMode !== flatMode) return;\n    var flatText = getAddonProductPersonalizationText(entry, addonProduct);\n    // Typed Initial/Name first \u2014 before Font \u2014 so Initial cannot be overwritten by style-tile \"A\".\n    if (flatText) {\n      if (isNameAddonProduct(addonProduct)) {\n        pushCartCustomization(customizations, 'Name', null, addonProduct, flatText, skipKeys);\n      } else if (isInitialAddonProduct(addonProduct)) {\n        var flatInit = cartInitialLetterFromManual(flatText) || String(flatText).trim();\n        pushCartCustomization(customizations, 'Initial', null, addonProduct, flatInit, skipKeys);\n      } else {\n        var flatType =\n          (addonProduct.customizer && addonProduct.customizer.type) ||\n          entry.customizationType ||\n          'Customization';\n        pushCartCustomization(customizations, flatType, null, addonProduct, flatText, skipKeys);\n      }\n    }\n    var fontSel = getAddonProductFontSelection(entry, addonProduct);\n    var fontLblFlat = isInitialAddonProduct(addonProduct)\n      ? fontStyleCartLabel(fontSel)\n      : nameFontStyleCartLabel(fontSel) ||\n        (isNameAddonProduct(addonProduct) ? '' : fontStyleCartLabel(fontSel));\n    if (fontLblFlat) {\n      pushCartCustomization(customizations, 'Font', null, null, fontLblFlat, skipKeys);\n    }\n    var flatKey = addonFlatSelectionKey(addonProduct);\n    var flatSel =\n      (entry.selections && entry.selections[flatKey]) ||\n      (entry.selections && entry.selections[ADDON_FLAT_TYPE_KEY]);\n    // Never use font-tile / letter-PNG selection as Initial when the shopper typed a letter.\n    if (flatSel && flatSel.name && !fontSel && !isInitialAddonProduct(addonProduct)) {\n      pushCartCustomization(\n        customizations,\n        flatSel.type || entry.customizationType || 'Customization',\n        null,\n        addonProduct,\n        cleanInitialOptionName(flatSel.name),\n        skipKeys\n      );\n    }\n  }\n\n  function appendGroupedAddonPropsForProduct(entry, customizations, textValues, config, state, groupKey, addonProduct, skipKeys) {\n    if (!entry || !groupKey || !addonProduct) return;\n    var typesOnProduct = getAddonDisplayTypesForProduct(\n      entry,\n      addonProduct,\n      groupKey,\n      config,\n      state,\n      true\n    );\n    if (!typesOnProduct.length) {\n      typesOnProduct = getCustomizerTypesForGroupWithIndex(addonProduct, groupKey, config);\n    }\n    if (!typesOnProduct.length) {\n      typesOnProduct = getCustomizerTypesForAddonProductDisplay(addonProduct, groupKey, config);\n    }\n    for (var gi = 0; gi < typesOnProduct.length; gi++) {\n      appendAddonTypeCartProps(entry, typesOnProduct[gi], config, state, groupKey, customizations, textValues, skipKeys);\n    }\n  }\n\n  function appendAddonProductCartProps(entry, line, ap, config, state, customizations, textValues, skipKeys) {\n    if (!entry || !ap) return;\n    var groupKey = line ? line.customizationGroupKey || ensureAddonLineGroupKey(line, config) : null;\n    var types = [];\n    if (line) {\n      var pkgs = getAddonLinePackages(line, config, state);\n      for (var i = 0; i < pkgs.length; i++) {\n        if (\n          pkgs[i].addonProduct &&\n          ap.id != null &&\n          String(pkgs[i].addonProduct.id) === String(ap.id)\n        ) {\n          types = pkgs[i].types || [];\n          break;\n        }\n      }\n    }\n    if (types.length && groupKey) {\n      appendGroupedAddonPropsForProduct(entry, customizations, textValues, config, state, groupKey, ap, skipKeys);\n    } else {\n      appendFlatAddonPropsForProduct(entry, customizations, textValues, config, state, ap, skipKeys);\n    }\n  }\n\n  /** Cart / main-line properties for one add-on line (each logical type once per line). */\n  function appendAddonLineCustomizationProps(entry, line, config, state, customizations, textValues, skipKeys) {\n    if (!entry) return;\n    var groupKey = line ? line.customizationGroupKey || ensureAddonLineGroupKey(line, config) : null;\n    var groupedTypes = line ? getCartGroupedTypesForLine(line, config, state) : [];\n    if (groupedTypes.length) {\n      for (var gi = 0; gi < groupedTypes.length; gi++) {\n        var g = groupedTypes[gi];\n        var gAp = g.addonProduct;\n        if (gAp && skipAddonProductForExclusivePersonalization(entry, gAp)) continue;\n        appendAddonTypeCartProps(entry, g, config, state, groupKey, customizations, textValues, skipKeys);\n      }\n      return;\n    }\n    var ap = line && line.entry && line.entry.addonProduct;\n    if (ap && !skipAddonProductForExclusivePersonalization(entry, ap)) {\n      appendAddonProductCartProps(entry, line, ap, config, state, customizations, textValues, skipKeys);\n    }\n  }\n\n  /**\n   * After a full re-render, find the same logical manual-text field so we can restore focus + caret.\n   * Re-rendering on every input destroys the input node; without this, the caret jumps.\n   */\n  function findManualTextInputAfterRender(contentEl, snap) {\n    if (!contentEl || !snap) return null;\n    var all = contentEl.querySelectorAll('.customizer-manual-text-input');\n    for (var i = 0; i < all.length; i++) {\n      var inp = all[i];\n      if (snap.isMain) {\n        if (inp.getAttribute('data-main-manual-text') !== 'true') continue;\n        var mtid = inp.getAttribute('data-type-id');\n        if (snap.typeId != null && String(snap.typeId) !== '') {\n          if (mtid !== String(snap.typeId)) continue;\n        } else if (mtid) {\n          continue;\n        }\n      } else {\n        if (inp.getAttribute('data-list-index') !== String(snap.listIndex)) continue;\n        var atid = inp.getAttribute('data-type-id');\n        if (snap.typeId != null && String(snap.typeId) !== '') {\n          if (atid !== String(snap.typeId)) continue;\n        } else if (atid) {\n          continue;\n        }\n      }\n      return inp;\n    }\n    return null;\n  }\n\n  function runCustomizer() {\n    var config = ensureAddonsConfig(getConfig());\n    if (!config) return;\n\n    var sectionId = config.sectionId || '';\n    var trigger = document.querySelector('[data-customizer-trigger]') ||\n      (document.getElementById('customizer-trigger-wrap-' + sectionId) && document.getElementById('customizer-trigger-wrap-' + sectionId).querySelector('[data-customizer-trigger]'));\n    var drawer = document.getElementById('customizer-drawer-' + sectionId);\n    if (!drawer) return;\n    if (drawer.dataset.customizerReady === 'true') return;\n    drawer.dataset.customizerUiVersion = String(CUSTOMIZER_UI_VERSION);\n    var contentEl = drawer.querySelector('[data-customizer-content]');\n    var addCartBtn = drawer.querySelector('[data-customizer-add-cart]');\n    var activeTrigger = null;\n\n    var state = new CustomizerState(config);\n    resetCustomizerState(state, config);\n    // Warm catalog fonts while the drawer is still closed.\n    preloadCustomizerFonts(state, config);\n\n    function onVariantChange(e) {\n      if (e.detail && e.detail.variant && window.customizerSyncVariant) window.customizerSyncVariant(e.detail.variant);\n    }\n    var variantEventName = 'variant:change:' + (config.sectionId || '') + ':' + (config.productId || '');\n    document.addEventListener(variantEventName, onVariantChange);\n\n    function formatMoney(cents) {\n      return (Number(cents) / 100).toFixed(2);\n    }\n\n    var extrasEl = drawer.querySelector('[data-customizer-extras]');\n    var headerEl = drawer.querySelector('[data-customizer-product-header]');\n\n    function resetSpecialRequest() {\n      state.specialRequestEnabled = false;\n      state.specialRequestMessage = '';\n      state.proofEmail = '';\n    }\n\n    function updateDrawerChrome() {\n      if (headerEl) headerEl.innerHTML = renderProductHeader(state, config);\n      if (extrasEl) extrasEl.innerHTML = renderOrderExtras(state, config);\n      if (addCartBtn) {\n        var cartLabel = (config.translations && config.translations.add_to_cart) || 'Add to cart';\n        addCartBtn.textContent = cartLabel + ' \u00B7 $' + formatMoney(state.getTotalPrice());\n      }\n    }\n\n    function updateManualTextCounter(contentEl, snap) {\n      if (!contentEl || !snap) return;\n      var inp = findManualTextInputAfterRender(contentEl, snap);\n      if (!inp) return;\n      var wrap = inp.closest('.customizer-personalize-block, .customizer-manual-text-wrap');\n      var counter =\n        wrap &&\n        (wrap.querySelector('.customizer-personalize-counter') ||\n          wrap.querySelector('.customizer-manual-text-counter'));\n      if (counter) {\n        var maxLen = parseInt(inp.getAttribute('maxlength'), 10);\n        if (isNaN(maxLen) || maxLen < 1) maxLen = 10;\n        counter.textContent = (inp.value || '').length + '/' + maxLen;\n      }\n    }\n\n    /** Typing in name fields \u2014 update preview + counter only (avoid full drawer re-render). */\n    function updateManualTextLive(contentEl, snap) {\n      if (!contentEl) return;\n      updateManualTextCounter(contentEl, snap);\n      var pinned = contentEl.querySelector('.customizer-flow__pinned');\n      if (pinned) pinned.innerHTML = renderPreviewStrip(state, config);\n      scheduleFitTagPreviewText(contentEl);\n      updateDrawerChrome();\n      updateAddCartButton();\n    }\n\n    /** Family bouquet: update preview + footer only \u2014 keep option grid mounted (avoids click/glitch). */\n    function updateFamilyBouquetLive() {\n      if (!contentEl) return;\n      var pinned = contentEl.querySelector('.customizer-flow__pinned');\n      if (pinned) pinned.innerHTML = renderPreviewStrip(state, config);\n      updateDrawerChrome();\n      updateAddCartButton();\n    }\n\n    function updateFamilyBirthstoneBarOptionCounts() {\n      if (!contentEl || !isFamilyBirthstoneBarProduct(config)) return;\n      var grid = contentEl.querySelector('.customizer-addon-slot--main .customizer-options-grid');\n      if (!grid) return;\n      var items = grid.querySelectorAll('.customizer-option-item');\n      for (var ii = 0; ii < items.length; ii++) {\n        var item = items[ii];\n        var btn = item.querySelector('.customizer-option-btn');\n        if (!btn) continue;\n        var opt = optionFromDataset(btn);\n        var count = countFamilyBirthstoneBarSelectionsForOption(state, opt);\n        var badge = item.querySelector('.customizer-family-birthstone-bar-option-count');\n        if (count > 0) {\n          item.classList.add('customizer-option-item--has-bar-count');\n          if (!badge) {\n            badge = document.createElement('span');\n            badge.className = 'customizer-family-birthstone-bar-option-count';\n            badge.setAttribute('aria-hidden', 'true');\n            var labelEl = item.querySelector('.customizer-option-btn-label');\n            if (labelEl) item.insertBefore(badge, labelEl);\n            else item.appendChild(badge);\n          }\n          badge.textContent = String(count);\n        } else {\n          item.classList.remove('customizer-option-item--has-bar-count');\n          if (badge) badge.remove();\n        }\n      }\n    }\n\n    function updateFamilyBirthstoneBarLive() {\n      if (!contentEl) return;\n      var pinned = contentEl.querySelector('.customizer-flow__pinned');\n      if (pinned) pinned.innerHTML = renderPreviewStrip(state, config);\n      var hint = contentEl.querySelector('.customizer-family-birthstone-bar-hint');\n      if (hint) {\n        var barMaxLive = getFamilyBirthstoneBarMax(config);\n        var pickCount = getFamilyBirthstoneBarSelections(state).length;\n        hint.textContent =\n          'Add up to ' + barMaxLive + ' birthstones (' + pickCount + '/' + barMaxLive + ')';\n      }\n      updateFamilyBirthstoneBarOptionCounts();\n      updateDrawerChrome();\n      updateAddCartButton();\n    }\n\n    var closeDurationMs = 450;\n    function closeDrawer() {\n      drawer.classList.remove('is-open');\n      drawer.setAttribute('aria-hidden', 'true');\n      setTimeout(function () {\n        document.body.style.overflow = '';\n        if (drawer._customizerOriginalParent && drawer.parentNode === document.body) {\n          drawer._customizerOriginalParent.appendChild(drawer);\n        }\n      }, closeDurationMs);\n    }\n\n    function render() {\n      if (!contentEl) return;\n      if (state.uiPanel === 'addon' && state.uiAddonListIndex != null && state.uiAddonListIndex >= state.addonList.length) {\n        state.setUiMain();\n      }\n      if (state.uiPanel === 'addonPick') {\n        if (!canAddMoreAddonLines(state, config)) {\n          state.setUiMain();\n        } else {\n          var pickOpts = collectAddonPickerOptions(config, state);\n          if (!pickOpts.length) {\n            state.setUiMain();\n          } else if (pickOpts.length === 1) {\n            var autoIdx = addAddonFromPickerOption(state, pickOpts[0]);\n            if (!openAddonEditorForNewLine(state, autoIdx)) state.setUiMain();\n          }\n        }\n      }\n      // Always seed main metafield defaults before paint (same as birth flower / symbol open state).\n      if (\n        state.uiPanel === 'main' &&\n        !isFamilyBirthFlowerBouquetProduct(config) &&\n        !isFamilyBirthstoneBarProduct(config)\n      ) {\n        ensureDefaultFontStyleSelectionsForState(state, config);\n      }\n      if (state.uiPanel === 'main' && mainUsesTypeTabs(config)) {\n        var mtClamp = getMainCustomizerTypes(config);\n        if (state.activeTypeTabIndex < 0 || state.activeTypeTabIndex >= mtClamp.length) state.activeTypeTabIndex = 0;\n      }\n      if (state.uiPanel === 'addon' && state.uiAddonListIndex != null) {\n        var addonLine = state.addonList[state.uiAddonListIndex];\n        if (addonLine) {\n          var prevTabIx = state.activeAddonTypeTabIndex;\n          var prevPkgs = getAddonLinePackages(addonLine, config, state, true);\n          var prevAp =\n            prevPkgs.length && prevTabIx >= 0 && prevTabIx < prevPkgs.length\n              ? prevPkgs[prevTabIx].addonProduct\n              : addonLine.entry && addonLine.entry.addonProduct;\n          var productsClamp = getAddonLinePackages(addonLine, config, state, true);\n          if (productsClamp.length) {\n            var mappedIx = -1;\n            if (prevAp && prevAp.id != null) {\n              for (var cpi = 0; cpi < productsClamp.length; cpi++) {\n                var cap = productsClamp[cpi].addonProduct;\n                if (cap && String(cap.id) === String(prevAp.id)) {\n                  mappedIx = cpi;\n                  break;\n                }\n              }\n            }\n            if (mappedIx >= 0) {\n              state.activeAddonTypeTabIndex = mappedIx;\n            } else if (\n              state.activeAddonTypeTabIndex < 0 ||\n              state.activeAddonTypeTabIndex >= productsClamp.length\n            ) {\n              state.activeAddonTypeTabIndex = 0;\n            }\n          }\n        }\n      }\n      contentEl.innerHTML = renderContent(state, config);\n      removeLegacyCustomizerStepper(contentEl);\n      updateDrawerChrome();\n      updateAddCartButton();\n      bindAddToCart();\n      preloadCustomizerFonts(state, config, function () {\n        if (!contentEl) return;\n        scheduleFitTagPreviewText(contentEl, fontsUsedForPreviewFit(state, config));\n      });\n      scheduleFitTagPreviewText(contentEl, fontsUsedForPreviewFit(state, config));\n    }\n\n    function syncMainVariantFromPage() {\n      if (typeof window.detectCustomizerVariant !== 'function') return;\n      var v = window.detectCustomizerVariant();\n      if (v) state.setMainVariant(normalizeVariantPayload(v));\n      normalizeAddonLinesIfNeeded(state, config);\n    }\n\n    function openDrawer(triggerBtn) {\n      if (drawer.classList.contains('is-open')) return;\n      state.setUiMain();\n      syncMainVariantFromPage();\n      ensureDefaultFontStyleSelectionsForState(state, config);\n      preloadCustomizerFonts(state, config);\n      if (drawer.parentNode !== document.body) {\n        drawer._customizerOriginalParent = drawer.parentNode;\n        document.body.appendChild(drawer);\n      }\n      drawer.style.visibility = '';\n      drawer.style.opacity = '';\n      drawer.setAttribute('aria-hidden', 'false');\n      document.body.style.overflow = 'hidden';\n      requestAnimationFrame(function () {\n        requestAnimationFrame(function () {\n          drawer.classList.add('is-open');\n          render();\n          fetchGiftWrapVariant(state, function () {\n            updateDrawerChrome();\n            updateGiftWrapLabelInDrawer(drawer, state, config);\n          });\n        });\n      });\n    }\n\n    function handleContentClick(e) {\n      if (!contentEl) return;\n      var target = e.target;\n\n      var removeBtn = target.closest('[data-remove-addon]');\n      if (removeBtn && contentEl.contains(removeBtn)) {\n        e.preventDefault();\n        e.stopPropagation();\n        var listIndex = parseInt(removeBtn.getAttribute('data-remove-addon'), 10);\n        if (isNaN(listIndex)) return;\n        var wasFocus = state.uiPanel === 'addon' && state.uiAddonListIndex === listIndex;\n        var wasPick = state.uiPanel === 'addonPick';\n        var focusIdx = state.uiAddonListIndex;\n        state.removeAddonLine(listIndex);\n        if (wasFocus || wasPick) {\n          state.setUiMain();\n        } else if (state.uiPanel === 'addon' && focusIdx != null && focusIdx > listIndex) {\n          state.setUiAddon(focusIdx - 1);\n        }\n        render();\n        return;\n      }\n\n      var typeTab = target.closest('.customizer-tabs--types [data-type-tab]');\n      if (typeTab && contentEl.contains(typeTab)) {\n        e.preventDefault();\n        e.stopPropagation();\n        var t = parseInt(typeTab.getAttribute('data-type-tab'), 10);\n        if (!isNaN(t)) {\n          state.activeTypeTabIndex = t;\n          render();\n        }\n        return;\n      }\n\n      var addonTypeTab = target.closest('.customizer-tabs--addon-types [data-addon-type-tab]');\n      if (addonTypeTab && contentEl.contains(addonTypeTab)) {\n        e.preventDefault();\n        e.stopPropagation();\n        var t2 = parseInt(addonTypeTab.getAttribute('data-addon-type-tab'), 10);\n        if (!isNaN(t2) && state.uiAddonListIndex != null) {\n          state.setUiAddon(state.uiAddonListIndex, t2);\n          render();\n        }\n        return;\n      }\n\n      var groupPickBtn = target.closest('[data-addon-group-pick]');\n      if (groupPickBtn && contentEl.contains(groupPickBtn)) {\n        if (!canAddMoreAddonLines(state, config)) {\n          state.setUiMain();\n          render();\n          return;\n        }\n        var groupKey = groupPickBtn.getAttribute('data-addon-group-pick');\n        if (!groupKey) return;\n        var catIdx = parseInt(groupPickBtn.getAttribute('data-addon-catalog-index'), 10);\n        if (isNaN(catIdx)) catIdx = findCatalogIndexForGroup(config, groupKey);\n        var pickVariantId = groupPickBtn.getAttribute('data-addon-variant-id');\n        openAddonEditorForNewLine(\n          state,\n          addAddonFromPickerOption(state, {\n            groupKey: groupKey,\n            catalogIndex: catIdx,\n            variantId: pickVariantId\n          })\n        );\n        render();\n        return;\n      }\n\n      var addOneBtn = target.closest('[data-add-one-addon]');\n      if (addOneBtn && contentEl.contains(addOneBtn)) {\n        if (!canAddMoreAddonLines(state, config)) {\n          render();\n          return;\n        }\n        var sole = getSoleAddonPickerOption(config, state);\n        if (sole) {\n          openAddonEditorForNewLine(state, addAddonFromPickerOption(state, sole));\n        } else {\n          state.setUiAddonPick();\n        }\n        render();\n        return;\n      }\n\n      var focusMainTypeBtn = target.closest('[data-focus-main-type]');\n      if (focusMainTypeBtn && contentEl.contains(focusMainTypeBtn)) {\n        var ti = parseInt(focusMainTypeBtn.getAttribute('data-focus-main-type'), 10);\n        if (isNaN(ti)) return;\n        state.uiPanel = 'main';\n        state.uiAddonListIndex = null;\n        state.activeTypeTabIndex = ti;\n        render();\n        return;\n      }\n\n      var familyRemoveBtn = target.closest('[data-family-flower-remove]');\n      if (familyRemoveBtn && contentEl.contains(familyRemoveBtn)) {\n        e.preventDefault();\n        e.stopPropagation();\n        var flowerIdx = familyRemoveBtn.getAttribute('data-family-flower-remove');\n        state.removeFamilyFlower(flowerIdx);\n        updateFamilyBouquetLive();\n        return;\n      }\n\n      var familyBarRemoveBtn = target.closest('[data-family-birthstone-bar-remove]');\n      if (familyBarRemoveBtn && contentEl.contains(familyBarRemoveBtn)) {\n        e.preventDefault();\n        e.stopPropagation();\n        var barIdx = familyBarRemoveBtn.getAttribute('data-family-birthstone-bar-remove');\n        state.removeFamilyBirthstoneBar(barIdx);\n        updateFamilyBirthstoneBarLive();\n        return;\n      }\n\n      if (target.closest('[data-family-bouquet-preview]') && contentEl.contains(target.closest('[data-family-bouquet-preview]'))) {\n        return;\n      }\n\n      if (\n        target.closest('[data-family-birthstone-bar-preview]') &&\n        contentEl.contains(target.closest('[data-family-birthstone-bar-preview]'))\n      ) {\n        return;\n      }\n\n      var focusMainBtn = target.closest('[data-focus-main]');\n      if (focusMainBtn && contentEl.contains(focusMainBtn)) {\n        state.setUiMain();\n        render();\n        return;\n      }\n\n      var focusAddonBtn = target.closest('[data-focus-addon]');\n      if (focusAddonBtn && contentEl.contains(focusAddonBtn)) {\n        var i = parseInt(focusAddonBtn.getAttribute('data-focus-addon'), 10);\n        if (isNaN(i) || i < 0 || i >= state.addonList.length) return;\n        var line = state.addonList[i];\n        if (line) {\n          ensureAddonLineGroupKey(line, config);\n          state.activeAddonCatalogIndex = line.addonIndex;\n        }\n        var tiAttr = focusAddonBtn.getAttribute('data-focus-addon-type');\n        var ti2 = tiAttr != null && tiAttr !== '' ? parseInt(tiAttr, 10) : 0;\n        if (isNaN(ti2)) ti2 = 0;\n        state.setUiAddon(i, ti2);\n        render();\n        return;\n      }\n\n      var btn = target.closest('.customizer-option-btn');\n      if (btn && contentEl.contains(btn)) {\n        if (btn.getAttribute('data-main-option') === 'true') {\n          var mainOption = optionFromDataset(btn);\n          var mtid = btn.getAttribute('data-type-id');\n          if (isFamilyBirthFlowerBouquetProduct(config)) {\n            e.preventDefault();\n            if (getFamilyFlowerSelections(state).length >= FAMILY_BOUQUET_MAX_FLOWERS) return;\n            state.addFamilyFlower(enrichMainOptionFromConfig(mainOption, config));\n            updateFamilyBouquetLive();\n            return;\n          }\n          if (isFamilyBirthstoneBarProduct(config)) {\n            e.preventDefault();\n            var familyBarMax = getFamilyBirthstoneBarMax(config);\n            if (getFamilyBirthstoneBarSelections(state).length >= familyBarMax) return;\n            state.addFamilyBirthstoneBar(enrichMainOptionFromConfig(mainOption, config), familyBarMax);\n            updateFamilyBirthstoneBarLive();\n            return;\n          } else if (mtid && mainUsesTypeTabs(config)) {\n            state.setMainSelection(mtid, enrichMainOptionFromConfig(mainOption, config));\n          } else {\n            state.setMainOption(enrichMainOptionFromConfig(mainOption, config));\n          }\n          render();\n          return;\n        }\n        var listIdxAttr2 = btn.getAttribute('data-addon-list-index');\n        var atid = btn.getAttribute('data-type-id');\n        if (listIdxAttr2 != null && listIdxAttr2 !== '') {\n          var listIndex2 = parseInt(listIdxAttr2, 10);\n          var option = optionFromDataset(btn);\n          if (!isNaN(listIndex2) && listIndex2 >= 0 && listIndex2 < state.addonList.length) {\n            var line2 = state.addonList[listIndex2];\n            var apEnrich =\n              getAddonProductForSelectionKey(state, config, listIndex2, atid) ||\n              (line2 && line2.entry && line2.entry.addonProduct);\n            var lineGroupKey = line2 ? ensureAddonLineGroupKey(line2, config) : null;\n            var optEn = apEnrich\n              ? resolveAddonOptionForSelection(option, apEnrich, atid, config, lineGroupKey)\n              : option;\n            var selKey = atid || (apEnrich ? addonFlatSelectionKey(apEnrich) : '');\n            if (selKey) state.setAddonSelection(listIndex2, selKey, optEn);\n            syncAddonTabIndexForTypeId(state, config, listIndex2, selKey);\n            state.setUiAddon(listIndex2, state.activeAddonTypeTabIndex);\n            render();\n          }\n        }\n      }\n    }\n\n    function handleContentInput(e) {\n      if (!contentEl) return;\n      var target = e.target;\n      var input = target.closest('.customizer-manual-text-input');\n      if (!input || !contentEl.contains(input)) return;\n      var tid = input.getAttribute('data-type-id');\n      var maxLen = parseInt(input.getAttribute('maxlength'), 10);\n      if (isNaN(maxLen) || maxLen < 1) maxLen = 10;\n      var val = (input.value || '').substring(0, maxLen);\n      if (maxLen === 1) val = val.replace(/[^A-Za-z]/g, '').substring(0, 1);\n      if (input.value !== val) input.value = val;\n      var selStart = input.selectionStart;\n      var selEnd = input.selectionEnd;\n      var snap = {\n        isMain: input.getAttribute('data-main-manual-text') === 'true',\n        typeId: tid != null && tid !== '' ? tid : null,\n        listIndex: null\n      };\n      if (input.getAttribute('data-main-manual-text') === 'true') {\n        if (tid && mainUsesTypeTabs(config)) {\n          state.setMainManualForType(tid, val);\n        } else {\n          state.setMainManualText(val);\n        }\n        updateManualTextLive(contentEl, snap);\n        return;\n      }\n      var listIndex = parseInt(input.getAttribute('data-list-index'), 10);\n      if (isNaN(listIndex) || listIndex < 0) return;\n      snap.listIndex = listIndex;\n      var entry = state.addonList[listIndex] && state.addonList[listIndex].entry;\n      if (tid && entry) {\n        state.setAddonManualForType(listIndex, tid, val);\n        syncAddonTabIndexForTypeId(state, config, listIndex, tid);\n      } else {\n        state.setAddonManualText(listIndex, val);\n      }\n      updateManualTextLive(contentEl, snap);\n    }\n\n    function handleExtrasChange(e) {\n      if (!extrasEl || !extrasEl.contains(e.target)) return;\n      var target = e.target;\n      if (target.matches('[data-gift-wrap-toggle]') && !target.disabled) {\n        state.giftWrapEnabled = !!target.checked;\n        updateDrawerChrome();\n      } else if (target.matches('[data-special-request-toggle]')) {\n        state.specialRequestEnabled = !!target.checked;\n        if (!state.specialRequestEnabled) state.specialRequestMessage = '';\n        updateDrawerChrome();\n        if (state.specialRequestEnabled) {\n          var textarea = extrasEl.querySelector('[data-special-request-textarea]');\n          if (textarea) textarea.focus();\n        }\n      }\n    }\n\n    function handleExtrasInput(e) {\n      if (!extrasEl || !extrasEl.contains(e.target)) return;\n      if (e.target.matches('[data-special-request-textarea]')) {\n        state.specialRequestMessage = e.target.value;\n      } else if (e.target.matches('[data-proof-email-input]')) {\n        state.proofEmail = e.target.value || '';\n        updateAddCartButton();\n        var err = extrasEl.querySelector('[data-proof-email-error]');\n        var t = getCustomizerTranslations(config);\n        if (err) {\n          var val = String(state.proofEmail || '').trim();\n          if (val && !isValidProofEmail(val)) {\n            err.textContent = t.proof_email_invalid || 'Please enter a valid email address';\n            err.style.display = 'block';\n          } else if (!val) {\n            err.textContent = t.proof_email_required || 'Email is required';\n            err.style.display = getFamilyFlowerSelections(state).length ? 'block' : 'none';\n          } else {\n            err.style.display = 'none';\n          }\n        }\n      }\n    }\n\n    function setupExtrasEventDelegation() {\n      if (!extrasEl || extrasEl._customizerExtrasBound) return;\n      extrasEl._customizerExtrasBound = true;\n      extrasEl.addEventListener('change', handleExtrasChange);\n      extrasEl.addEventListener('input', handleExtrasInput);\n    }\n\n    function setupContentEventDelegation() {\n      if (!contentEl || contentEl._customizerEventsBound) return;\n      contentEl._customizerEventsBound = true;\n      contentEl.addEventListener('click', handleContentClick);\n      contentEl.addEventListener('input', handleContentInput);\n    }\n\n    setupContentEventDelegation();\n    setupExtrasEventDelegation();\n\n    function canAddToCart() {\n      if (isFamilyBirthFlowerBouquetProduct(config) || isFamilyBirthstoneBarProduct(config)) {\n        return mainCustomizationComplete(state, config);\n      }\n      if (!mainCustomizationComplete(state, config)) return false;\n      for (var i = 0; i < state.addonList.length; i++) {\n        ensureAddonLineGroupKey(state.addonList[i], config);\n        if (!addonLineComplete(state.addonList[i], config, state)) return false;\n      }\n      return true;\n    }\n\n    function updateAddCartButton() {\n      if (addCartBtn) {\n        addCartBtn.disabled = !canAddToCart();\n      }\n    }\n\n    function doAddToCart() {\n      if (!canAddToCart()) return;\n      applyMainVariantDrivenSelections(config, state);\n      var mainId = state.main.variantId != null ? parseInt(state.main.variantId, 10) : NaN;\n      if (!mainId || isNaN(mainId)) return;\n      addCartBtn.disabled = true;\n\n      var isFamilyBouquet = isFamilyBirthFlowerBouquetProduct(config);\n      var isFamilyBar = isFamilyBirthstoneBarProduct(config);\n      var customizations = [];\n      var textValues = [];\n      if (!isFamilyBouquet && !isFamilyBar) {\n        appendMainProductCustomizationProps(state, config, customizations, textValues);\n      }\n      var mandatoryAddonGroupLabels = [];\n      if (!isFamilyBouquet && !isFamilyBar) {\n        for (var i = 0; i < state.addonList.length; i++) {\n          if (!state.addonList[i].entry.mandatory) continue;\n          ensureAddonLineGroupKey(state.addonList[i], config);\n          if (!addonLineComplete(state.addonList[i], config, state)) continue;\n          var mandatoryLine = state.addonList[i];\n          var mandatoryLabel = getAddonCartGroupLabel(\n            mandatoryLine,\n            mandatoryLine.entry,\n            mandatoryLine.entry.addonProduct,\n            config\n          );\n          if (mandatoryLabel && mandatoryAddonGroupLabels.indexOf(mandatoryLabel) === -1) {\n            mandatoryAddonGroupLabels.push(mandatoryLabel);\n          }\n          appendAddonLineCustomizationProps(\n            mandatoryLine.entry,\n            mandatoryLine,\n            config,\n            state,\n            customizations,\n            textValues,\n            null\n          );\n        }\n      }\n      var mandatoryAddonGroupLabel = mandatoryAddonGroupLabels.join(' + ');\n      var addonsList = isFamilyBouquet || isFamilyBar ? [] : state.addonList;\n      var bundleId = String(Date.now());\n      var productGroupId = 'PG-' + bundleId;\n      var gw = config.giftWrap || {};\n      var giftWrapVid = parseGiftWrapVariantId(gw.variantId);\n      var hasGiftWrap = !!(\n        state.giftWrapEnabled &&\n        gw.enable &&\n        giftWrapVid &&\n        !isNaN(giftWrapVid) &&\n        state._giftWrapAvailable !== false\n      );\n      var needsBundle = addonsList.length > 0 || hasGiftWrap;\n\n      var mainProps = {};\n      if (isFamilyBouquet) {\n        var flowers = getFamilyFlowerSelections(state);\n        for (var fi = 0; fi < flowers.length; fi++) {\n          mainProps['Flower ' + (fi + 1)] = flowers[fi].name || '';\n        }\n        if (flowers[0] && flowers[0].type) {\n          mainProps['Customization Type'] = flowers[0].type;\n        }\n        if (state.proofEmail && String(state.proofEmail).trim()) {\n          mainProps['Proof Email'] = String(state.proofEmail).trim();\n        }\n      } else if (isFamilyBar) {\n        var barStones = getFamilyBirthstoneBarSelections(state);\n        for (var fbi = 0; fbi < barStones.length; fbi++) {\n          mainProps['Birthstone Bar ' + (fbi + 1)] = barStones[fbi].name || '';\n        }\n        if (barStones[0] && barStones[0].type) {\n          mainProps['Customization Type'] = barStones[0].type;\n        }\n      } else {\n        if (customizations.length) mainProps['Customization'] = joinCartCustomizationProps(customizations);\n        if (textValues.length) mainProps['Customization Text'] = textValues.join('; ');\n        if (mandatoryAddonGroupLabel) mainProps['Add-on'] = mandatoryAddonGroupLabel;\n      }\n      if (state.specialRequestEnabled && state.specialRequestMessage && String(state.specialRequestMessage).trim()) {\n        mainProps['Special Request'] = String(state.specialRequestMessage).trim();\n      }\n      if (needsBundle) {\n        mainProps['_BundleId'] = bundleId;\n        mainProps['_IsMain'] = true;\n        mainProps['Product Group ID'] = productGroupId;\n      }\n\n      var items = [];\n      var mainVariantKey = String(mainId);\n      items.push({\n        id: mainId,\n        quantity: 1,\n        properties: mainProps\n      });\n\n      var extraPosition = 0;\n      for (var k = 0; k < addonsList.length; k++) {\n        var addonLine = addonsList[k];\n        var entry = addonLine.entry;\n        if (entry.mandatory) continue;\n        ensureAddonLineGroupKey(addonLine, config);\n        if (!addonLineComplete(addonLine, config, state)) continue;\n        var bundleProducts = getAddonProductsForCartLine(addonLine, config, state);\n        if (!bundleProducts.length) continue;\n\n        for (var bp = 0; bp < bundleProducts.length; bp++) {\n          var bpAp = bundleProducts[bp];\n          var bpVariant = resolveAddonProductVariantForLine(entry, bpAp, config, state);\n          var bpAddonId = bpVariant ? parseInt(bpVariant.id, 10) : NaN;\n          if (!bpAddonId || isNaN(bpAddonId)) continue;\n          var bpKey = String(bpAddonId);\n          // Never re-add the main necklace variant as an add-on line.\n          // Same addon variant may appear on multiple lines (e.g. 3 discs) \u2014 always push each.\n          if (bpKey === mainVariantKey) continue;\n          extraPosition++;\n          var bpProps = {\n            _BundleId: bundleId,\n            _IsAddon: true,\n            'Product Group ID': productGroupId,\n            'Addon Position': String(extraPosition)\n          };\n          var bpCust = [];\n          var bpText = [];\n          appendAddonProductCartProps(entry, addonLine, bpAp, config, state, bpCust, bpText, null);\n          var addonGroupLabel = getAddonCartGroupLabel(addonLine, entry, bpAp, config);\n          if (addonGroupLabel) bpProps['Add-on'] = addonGroupLabel;\n          if (bpCust.length) bpProps['Customization'] = joinCartCustomizationProps(bpCust);\n          if (bpText.length) bpProps['Customization Text'] = bpText.join('; ');\n          items.push({ id: bpAddonId, quantity: 1, properties: bpProps });\n        }\n      }\n\n      if (hasGiftWrap) {\n        var gwKey = String(giftWrapVid);\n        if (gwKey === mainVariantKey) {\n          hasGiftWrap = false;\n        } else {\n          for (var gwi = 0; gwi < items.length; gwi++) {\n            if (String(items[gwi].id) === gwKey) {\n              mergeGiftWrapOntoCartItemLine(items[gwi], state.main.title);\n              hasGiftWrap = false;\n              break;\n            }\n          }\n        }\n      }\n      if (hasGiftWrap) {\n        items.push({\n          id: giftWrapVid,\n          quantity: 1,\n          properties: {\n            _BundleId: bundleId,\n            'Product Group ID': productGroupId,\n            _IsGiftWrap: 'true',\n            _IsAddon: 'true',\n            'Gift Wrap For': state.main.title || 'Product'\n          }\n        });\n      }\n\n      var root = (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) != null ? String(window.Shopify.routes.root) : '';\n      if (!root) root = '/';\n      else if (root.slice(-1) !== '/') root += '/';\n      var url = root + 'cart/add.js';\n\n      function parseCartAddResponse(res, text) {\n        var data = {};\n        if (text && text.trim()) {\n          try {\n            if (text.trim().indexOf('{') === 0) data = JSON.parse(text);\n          } catch (e) { /* response was HTML or invalid JSON */ }\n        }\n        return { ok: res.ok, status: res.status, data: data };\n      }\n\n      function postCartItems(payloadItems, withSections) {\n        var body = { items: payloadItems };\n        if (withSections) body.sections = 'cart-ajax';\n        return fetch(url, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' },\n          credentials: 'same-origin',\n          body: JSON.stringify(body)\n        }).then(function (res) {\n          return res.text().then(function (text) {\n            return parseCartAddResponse(res, text);\n          });\n        });\n      }\n\n      /**\n       * Shopify Ajax cart can drop or merge same-variant rows in one multi-item POST.\n       * When any variant id repeats, add one line at a time so every configured add-on lands.\n       */\n      function cartItemsHaveDuplicateVariantIds(list) {\n        var seen = {};\n        for (var i = 0; i < list.length; i++) {\n          var key = String(list[i].id);\n          if (seen[key]) return true;\n          seen[key] = true;\n        }\n        return false;\n      }\n\n      function addAllCartItems(list) {\n        if (!list.length) {\n          return Promise.resolve({ ok: true, status: 200, data: {} });\n        }\n        if (!cartItemsHaveDuplicateVariantIds(list)) {\n          return postCartItems(list, true);\n        }\n        var chain = Promise.resolve({ ok: true, status: 200, data: {} });\n        for (var i = 0; i < list.length; i++) {\n          (function (idx) {\n            chain = chain.then(function (prev) {\n              var prevData = (prev && prev.data) || {};\n              var prevErr =\n                !prev.ok ||\n                prevData.status === 422 ||\n                prevData.status === 'bad_request' ||\n                prevData.message ||\n                prevData.description;\n              if (prevErr && idx > 0) return prev;\n              var isLast = idx === list.length - 1;\n              return postCartItems([list[idx]], isLast).then(function (result) {\n                if (isLast && prev && prev.data && prev.data.sections && !(result.data && result.data.sections)) {\n                  result.data = result.data || {};\n                  result.data.sections = prev.data.sections;\n                }\n                return result;\n              });\n            });\n          })(i);\n        }\n        return chain;\n      }\n\n      addAllCartItems(items).then(function (result) {\n        var ok = result.ok;\n        var data = result.data || {};\n        var isError = (data.status === 422 || data.status === 'bad_request') || (data.message || data.description);\n        if (ok && !isError) {\n          closeDrawer();\n          resetCustomizerState(state, config);\n          if (contentEl) contentEl.innerHTML = '';\n          updateDrawerChrome();\n          updateAddCartButton();\n          updateGiftWrapLabelInDrawer(drawer, state, config);\n          try {\n            var payload = { bubbles: true };\n            if (data.sections && data.sections['cart-ajax']) {\n              payload.detail = { product: { sections: data.sections } };\n            }\n            document.dispatchEvent(new CustomEvent('ajaxProduct:added', payload));\n          } catch (e) {}\n          if (typeof window.theme !== 'undefined' && window.theme.refreshCart) window.theme.refreshCart();\n        } else if (data.description && typeof alert !== 'undefined') {\n          alert(data.description);\n        }\n        if (addCartBtn) addCartBtn.disabled = false;\n      }).catch(function (err) {\n        if (addCartBtn) addCartBtn.disabled = false;\n      });\n    }\n\n    function bindAddToCart() {\n      if (!addCartBtn) return;\n      if (addCartBtn._customizerAddBound) return;\n      addCartBtn._customizerAddBound = true;\n      addCartBtn.addEventListener('click', function (e) {\n        e.preventDefault();\n        e.stopPropagation();\n        doAddToCart();\n      });\n    }\n\n    if (!drawer._customizerCloseBound) {\n      drawer._customizerCloseBound = true;\n      drawer.querySelectorAll('[data-customizer-close]').forEach(function (el) {\n        el.addEventListener('click', closeDrawer);\n      });\n    }\n    document.addEventListener('keydown', function (e) {\n      if (e.key === 'Escape' && drawer.classList.contains('is-open')) closeDrawer();\n    });\n\n    window.openCustomizer = function (triggerBtn) {\n      activeTrigger = triggerBtn || document.querySelector('[data-customizer-trigger]');\n      openDrawer(activeTrigger);\n    };\n\n    if (!window.__customizerClickBound) {\n      window.__customizerClickBound = true;\n      document.addEventListener('click', function (e) {\n        var t = e.target && e.target.closest && e.target.closest('[data-customizer-trigger]');\n        if (t) {\n          e.preventDefault();\n          e.stopPropagation();\n          activeTrigger = t;\n          openDrawer(t);\n        }\n      }, true);\n    }\n\n    window.customizerSyncVariant = function (variant) {\n      if (!variant) return;\n      variant = normalizeVariantPayload(variant);\n      state.setMainVariant(variant);\n      ensureDefaultFontStyleSelectionsForState(state, config);\n      updateDrawerChrome();\n      updateAddCartButton();\n      if (drawer && drawer.classList.contains('is-open') && contentEl) render();\n    };\n\n    window.__customizerReset = function () {\n      resetCustomizerState(state, config);\n      resetSpecialRequest();\n      if (contentEl) contentEl.innerHTML = '';\n      updateDrawerChrome();\n      updateAddCartButton();\n      updateGiftWrapLabelInDrawer(drawer, state, config);\n    };\n\n    if (!window.__customizerPageShowBound) {\n      window.__customizerPageShowBound = true;\n      window.addEventListener('pageshow', function (evt) {\n        if (evt.persisted && typeof window.__customizerReset === 'function') window.__customizerReset();\n      });\n    }\n\n    drawer.dataset.customizerReady = 'true';\n  }\n\n  function init() {\n    runCustomizer();\n    if (!document.getElementById('customizer-config')) {\n      setTimeout(runCustomizer, 150);\n      setTimeout(runCustomizer, 500);\n    }\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n"],
  "mappings": "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",
  "names": ["v", "tid", "o", "isSelected", "btnClass", "btnAttrs", "gridLabel", "contentEl", "i"]
}
